AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2010, 10:45   #1  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
А пусть он пишет "Серг" и нажимает Enter, тогда всё просто. Я недавно делал нечто похожее, только с КЛАДРом: юзер вводит часть названия улицы, скажем, "Лен", затем - Ввод, после чего ему выдаётся список улиц, начинающихся на "Лен". С Сергеичем это будет проще.
Старый 22.01.2010, 12:14   #2  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
через стандартные тексты пусть пишет
?Серг
Старый 22.01.2010, 12:15   #3  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Цитата:
Сообщение от jopagames
Добрый день всем!

Но столкнулся со следующей проблемой: пока не вызвана ф-ция OnValidate() значение поля никак нельзя получить.
Т.е. никак не получается как-то выделить ТОЛЬКО ТУ часть текста, которую пользователь уже успел набрать, пока не нажал Enter.
Пытался вешать обработчики на всякие клавиатурные триггеры типа OnInputChange и OnAfterInput, но всё бесполезно.

Может, я чего не так делаю?
Кто знает как сделать - подскажите, плиз!
Попробуйте следующее:

В триггере OnInputChange нужного поля:

CurrForm.SAVERECORD;
Далее получения значения из поля;

Тестировал с Message("Значение поля"), все работает. Значение получает после каждого ввода символа.
__________________
MBS Certified Master in Navision Developer
Старый 25.01.2010, 13:16   #4  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Идея понятна. В приложения MS это, вроде как, называется автоподстановка.
Тогда, сорри... Триггер не обойдешь. Значение поля, пока не запишешь, не получишь...

Как один из вариантов в табличном триггере можно использовать условие по CurrFieldNo.
Только, возможно, что в вашем случае это не будет работать, как нужно.
__________________
MBS Certified Master in Navision Developer
Старый 25.01.2010, 14:43   #5  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Если смущает только OnValidate таблицы, то заведите буферную переменную и поле для нее. И делайте, то что посоветовал Роман уже с этой переменной. А после того как пользователь покинет поле, залейте его содержимое в соответствующее поле таблицы и отвалидэйти.

P.S. ИМХО, это баловство. Однако в 2009 такое уже есть. Предложите перейти
Старый 25.01.2010, 15:48   #6  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от jopagames


Ага. И так тоже уже пробовал делать (через буферную переменную и отдельное поле для неё)
Только пользователь может попытаться "покинуть" поле иначе, чем нажатием клавиши Enter. Стрелкой или табуляцией, например.
В этом случае никакого Validate не происходит и значение доп.поля тоже неясное

Я бы на вашем месте не ждал нажатия Enter, а обработал бы OnDeactivate (странно, форум переводит здесь O и D в нижний регистр)
Старый 25.01.2010, 17:08   #7  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Насчет CurrFieldNo идея следующая.
Переписать триггер OnValidate таблицы следующим образом:

IF CurrFieldNo = "Поле с автоподстановкой" THEN
EXIT
ELSE
ОбработкаТриггера;

В этом случае, если в форме на OnInputChange написать код:

CurrForm.SAVERECORD;
Далее получения значения из поля;

То, по идее код в таблице на OnValidate не должен отрабатываться, а значение поля будет меняться по мере ввода цифр/букв. Таким образом, удастся избежать обработки триггера в таблице, при вводе данных в поле на форме. Но при этом код в таблице на OnValidate никогда не будет обрабатываться, если мы вводим значение в любой форме в поле "Поле с автоподстановкой".

Т.е. в этом случае OnValidate в поле таблицы будет обрабатываться по конструкции типа VALIDATE("Поле с автоподстановкой", НовоеЗначение);
а при вводе данных в поле OnValidate таблицы работать не будет.
__________________
MBS Certified Master in Navision Developer
Старый 26.01.2010, 15:09   #8  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва

Если в вашем случае не поможет подобная схема, то может при решении других задач пригодится.
__________________
MBS Certified Master in Navision Developer
Старый 26.01.2010, 15:37   #9  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
ClearOnLookup в конторле поменять не помогает?
при лукапе помогает... при валидейте не уверен
Старый 27.01.2010, 17:12   #10  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Сделал некое подобие автоподстановки. На примере формы карточка клиента (21) и соотв. таблицы (18), автоподстановка по полю Name (Название клиента). Если находит похожее среди клиентов название, то оно подставляется в текущую карточку. Это для примера...

В таблице 18 на триггере OnValidate поля Name исправить на код
Код:
IF CurrFieldNo = FIELDNO(Name) THEN
  EXIT
ELSE BEGIN
  IF ("Search Name" = UPPERCASE(xRec.Name)) OR ("Search Name" = '') THEN
    "Search Name" := Name;
END;
В форме 21 следующие изменения. На триггерах контрола Name.
Name - OnInputChange()
Код:
CurrForm.SAVERECORD;
Name - OnAfterInput(VAR Text : Text[1024]

Код:
IF (Text = '') OR (Name = '') THEN
  EXIT;

IF EVALUATE(l_char,Text) THEN BEGIN
  IF l_char = 32 THEN
    Text := '#';
END;

IF (STRLEN(Text) = 1) THEN BEGIN
  IF (Text <> COPYSTR(Name,1,STRLEN(Name) - 1)) THEN
    Text := Name + Text
  ELSE
    IF (STRLEN(Text) = 1) AND (STRLEN(Name) = 2) THEN
      Text := Name + Text;
END;
Name - OnAfterValidate()

Код:
l_int := 100;
Name := CONVERTSTR(Name,'#',' ');
IF STRLEN(Name) > 2 THEN BEGIN
  l_recCustomer.SETFILTER(Name,'%1',Name + '*');
  l_recCustomer.SETFILTER("No.",'<>%1',"No.");
  { 
  // Автоподстановка без запуска формы >
  IF l_recCustomer.FINDFIRST THEN BEGIN
    Name := l_recCustomer.Name;
    CurrForm.Name.UPDATE;
  END;
  // <
  }
  IF l_recCustomer.FINDFIRST THEN BEGIN
    REPEAT
      l_int += 1;
      lt_recStandardText.Code := FORMAT(l_int);
      lt_recStandardText.Description := l_recCustomer.Name;
      lt_recStandardText.INSERT;
    UNTIL l_recCustomer.NEXT = 0;

    IF FORM.RUNMODAL(FORM::"Standard Text Codes", lt_recStandardText,lt_recStandardText.Description) = ACTION::LookupOK THEN
      VALIDATE(Name,lt_recStandardText.Description);

  END;
END;

После тестирования нашел несколько неудобств и пока один глюк (алгоритмически не удалось обойти). Глюк такой - при удалении Бэкспэйсом, когда 2 символа всего набрано, работает неправильно.
Неудобство главное - поле всегда выделено, но это не мешает последовательно вводить в него символы. Все вводится.
__________________
MBS Certified Master in Navision Developer
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:58.