25.02.2005, 18:57 | #1 |
Участник
|
Поможитте, плиз, разобраться!
В триггере onBeforeInput получаю значение поля, и вытаскиваю с его помощью данные с другой таблицы. На основании того, что получено, ставится TRUE/False для переменной. Потом, после смены значения этого поля, в триггере onAfterValidate на основании значения этой булевской переменной выполняется код. Проблема в следующем: при первом изменении все корректно, а потом все работает только если переоткрывать форму. Т.е. продолжает считать, что ничего не изменилось и новое значение из другой таблицы не вытаскивает. P.S. GET везде стоит. |
|
28.02.2005, 11:32 | #2 |
Участник
|
Насколько я понял проблему, все дело в механизме xRec. При первом обращении к записи xRec действительно содержит ее before image, а Rec начинает заполняться новыми данными. Дальнейшие многократные изменения полей записи, пока они не зафиксированы в БД, не меняют xRec, отчего и возникает этот эффект.
Закрытие формы завершает модификацию записи, и при последующей обработке новым xRec становится Rec, обновленный за время работы формы. Если задача требует только такой логики, то можно воспользоваться глобальной переменной на форме (как SourceExpr элемента TextBox), в которую вводить новое значение поля и сравнивать его в xRec.SomeField. Все будет работать Best regards & good luck! |
|
28.02.2005, 12:38 | #3 |
Участник
|
Сенкс! Смысл ошибки мне понятен, но вот решение неясно.
Для меня, плиз, как для тупых- вот кусок кода, как это правильно написать? <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 |
Участник
|
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 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
На самом деле, вдруг кому будет интересно...
Проблема была и правда в Rec и xRec, но все решилось простым переносом из двух триггеров в onValidate. Теперь мной усвоен урок- логику надо писать именно в validate.. |
|