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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.02.2005, 18:57   #1  
TriFF is offline
TriFF
Участник
Аватар для TriFF
 
26 / 10 (1) +
Регистрация: 14.10.2004
Поможитте, плиз, разобраться!

В триггере onBeforeInput получаю значение поля, и вытаскиваю с его помощью данные с другой таблицы. На основании того, что получено, ставится TRUE/False для переменной.
Потом, после смены значения этого поля, в триггере onAfterValidate на основании значения этой булевской переменной выполняется код.

Проблема в следующем: при первом изменении все корректно, а потом все работает только если переоткрывать форму. Т.е. продолжает считать, что ничего не изменилось и новое значение из другой таблицы не вытаскивает.

P.S. GET везде стоит.
Старый 28.02.2005, 11:32   #2  
johndoe is offline
johndoe
Участник
 
88 / 10 (1) +
Регистрация: 15.10.2004
Адрес: Москва
->
Насколько я понял проблему, все дело в механизме xRec. При первом обращении к записи xRec действительно содержит ее before image, а Rec начинает заполняться новыми данными. Дальнейшие многократные изменения полей записи, пока они не зафиксированы в БД, не меняют xRec, отчего и возникает этот эффект.

Закрытие формы завершает модификацию записи, и при последующей обработке новым xRec становится Rec, обновленный за время работы формы.

Если задача требует только такой логики, то можно воспользоваться глобальной переменной на форме (как SourceExpr элемента TextBox), в которую вводить новое значение поля и сравнивать его в xRec.SomeField. Все будет работать

Best regards & good luck!
Старый 28.02.2005, 12:38   #3  
TriFF is offline
TriFF
Участник
Аватар для TriFF
 
26 / 10 (1) +
Регистрация: 14.10.2004
:(
Сенкс! Смысл ошибки мне понятен, но вот решение неясно.
Для меня, плиз, как для тупых- вот кусок кода, как это правильно написать?

<div class='CALtop'>C/AL</div><div class='CAL'>Field-onBeforeInput:

//предыдущее значение поля
PreviousValue:=Field;// имеется ввиду SourceExport
чего там делаем....
......

Field-onAfterValidate:

//текущее
CurrentValue:=Field;

IF CurrentValue<>PreviousValue THEN ......// вот оно и не срабатывает</div>
Старый 28.02.2005, 13:18   #4  
johndoe is offline
johndoe
Участник
 
88 / 10 (1) +
Регистрация: 15.10.2004
Адрес: Москва
1. Создаем глоб. переменную нужного типа (напр., VAR GlobVar: Text60).
2. Меняем SourceExpr элемента TextBox с поля таблицы SomeField на GlobVar.
3. Кодируем триггеры:
<div class='CALtop'>C/AL</div><div class='CAL'>
Form - OnAfterGetRecord
GlobVar := SomeField;
CurrValue := GlobVar;
// ...

TextBox - OnAfterValidate
IF CurrValue <> GlobVar THEN // поменяли
...
</div>
Старый 28.02.2005, 16:27   #5  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от TriFF
Поможитте, плиз, разобраться!

В триггере onBeforeInput получаю значение поля, и вытаскиваю с его помощью данные с другой таблицы. На основании того, что получено, ставится TRUE/False  для переменной.
Потом, после смены значения этого поля, в триггере onAfterValidate на основании  значения этой булевской переменной выполняется код.

Проблема в следующем: при первом изменении все корректно, а потом все работает только если переоткрывать форму. Т.е. продолжает считать, что ничего не изменилось и новое значение из другой таблицы не вытаскивает.
 
P.S. GET везде стоит.
а если почитать хелп:

OnBeforeInput
Use this trigger to specify whether the user can edit the control.

Applies to
Text boxes

Comments
This trigger only determines whether the control is editable.

по логике он и не должен 2-й раз срабатывать

а вот если так:
OnInputChange
The C/AL code in this trigger is executed while the user makes entries into a text box. You can use this trigger to check the entries the user is making as he or she enters information.

Applies to
Text boxes

Comments
The system executes this trigger after it executes OnBeforeInput. It will continue to execute this trigger, after each keystroke, until the user finishes input. The system then executes the OnAfterInput trigger.
Старый 01.03.2005, 16:47   #6  
TriFF is offline
TriFF
Участник
Аватар для TriFF
 
26 / 10 (1) +
Регистрация: 14.10.2004
Post
На самом деле, вдруг кому будет интересно...
Проблема была и правда в Rec и xRec, но все решилось простым переносом из двух триггеров в onValidate.
Теперь мной усвоен урок- логику надо писать именно в validate..
 


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

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

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