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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.11.2011, 16:36   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Вопрос вроде банальный и простой. Но у меня проблема.
Есть таблица 50000, в ней поле Field1.
Когда в таблице T37 меняем поле No., то в Т50000 поле Field1 тоже меняется.
В триггере OnValidate для поля No. таблицы 37 есть строки:
Код:
IF ("No." <> xRec."No.") AND (xRec."No." <> '') THEN BEGIN
   T50000.Field1 := "No.";
   T50000.MODIFY;
END;
Вот скажите мне плиз, когда выполняется этот самый MODIFY разве не должен вызываться триггер OnModify таблицы 50000?
Старый 02.11.2011, 16:51   #2  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
Чтобы вызвался триггер, надо передать параметр в процедуру Modify. Вот так:

Код:
T50000.MODIFY(TRUE);
Старый 02.11.2011, 17:20   #3  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Fly Посмотреть сообщение
Чтобы вызвался триггер, надо передать параметр в процедуру Modify. Вот так:

Код:
T50000.MODIFY(TRUE);
Благодарю
Старый 16.11.2011, 12:56   #4  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
ПОдскажите, плиз, как обойти след. проблему:
Имеем таблицу 37. Когда в Заказе меняем поле "No", срабатывает триггер OnValidate(), в которорм есть след. строки:
Код:
T50022.TechNo := "No.";
T50022.Modify(TRUE);
После этого Modify попадаем в триггер OnModify() таблицы 50022.
В нем прописано следующее:
Код:
IF Rec.TechNo <> xRec.TechNo THEN
   выполнить какие-то действия
Но проблема в том что на этом этапе Rec и xRec абсолютно одинаковые, в результате чего IF дает FALSE и действия не выполняются.
Как с этим бороться?
Старый 16.11.2011, 18:44   #5  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
ПОдскажите, плиз, как обойти след. проблему:
Имеем таблицу 37. Когда в Заказе меняем поле "No", срабатывает триггер OnValidate(), в которорм есть след. строки:
Код:
T50022.TechNo := "No.";
T50022.Modify(TRUE);
После этого Modify попадаем в триггер OnModify() таблицы 50022.
В нем прописано следующее:
Код:
IF Rec.TechNo <> xRec.TechNo THEN
   выполнить какие-то действия
Но проблема в том что на этом этапе Rec и xRec абсолютно одинаковые, в результате чего IF дает FALSE и действия не выполняются.
Как с этим бороться?
Эээм, а почему логику обработки поля надо вешать на MODIFY? Почему нельзя повесить на VALIDATE TechNo?

Тогда код будет такой:

Код:
T50022.VALIDATE(TechNo,"No.");
T50022.Modify(TRUE);
Старый 17.11.2011, 12:54   #6  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Fly Посмотреть сообщение
Эээм, а почему логику обработки поля надо вешать на MODIFY? Почему нельзя повесить на VALIDATE TechNo?
Дело в том, что в Т50022 таких полей штук 10, при изменении которых нужно выполнять эту последовательность действий. Менять для каждого поля его OnValidate() было влом. И еще одно...
Цитата:
Тогда код будет такой:
Код:
T50022.VALIDATE(TechNo,"No.");
T50022.Modify(TRUE);
Изменение значений полей в Т50022 происходит в нескольких местах программы (в совершенно разных модулях), причем не через T50022.VALIDATE(...), а через простое присваивание T50022.Поле := ххх
Честно говоря, ну ооочень не хотелось бы всё это сейчас переделывать.
Если длугих, менее трудозатратныых вариантов нет, то придется делать так, как Вы предлагаете.
Старый 17.11.2011, 13:33   #7  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Попробуйте в табличке написать ф-цию, в которую будете передавать булево значение и вызывать перед modify, а в modify сделайте
Код:
IF (Rec.TechNo <> xRec.TechNo) or (переданная переменная) THEN
   выполнить какие-то действия
или напишите код, который заменит стандартный Modify.
Старый 17.11.2011, 16:22   #8  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Код:
T50022.TechNo := "No.";
T50022.Modify(TRUE);
Код:
IF Rec.TechNo <> xRec.TechNo THEN
   выполнить какие-то действия
Но проблема в том что на этом этапе Rec и xRec абсолютно одинаковые, в результате чего IF дает FALSE и действия не выполняются.
А не стоит ли задуматься, почему Rec равен xRec?
Если вы в T50022.TechNo присваиваете "No.", который ничем не отличается TechNo то зачем делать MODIFY?
Старый 17.11.2011, 17:34   #9  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
А не стоит ли задуматься, почему Rec равен xRec?
Если вы в T50022.TechNo присваиваете "No.", который ничем не отличается TechNo то зачем делать MODIFY?
В том-то и дело, что ДО присвоения эти значения разные (к примеру, до выполнения команды T50022.TechNo := "No." , поля содержали след. значения: T50022.TechNo = RI265,а "No." равнялось AM378
Старый 17.11.2011, 18:20   #10  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
Цитата:
В том-то и дело, что ДО присвоения эти значения разные (к примеру, до выполнения команды T50022.TechNo := "No." , поля содержали след. значения: T50022.TechNo = RI265,а "No." равнялось AM378
Ну и как тогда могло получиться, что xRec.TechNo и Rec.TechNo одинаковые? Они же менялись. Условие должно быть выполниться. Что-то Вы не договариваете
Старый 22.11.2011, 17:48   #11  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Fly Посмотреть сообщение
Ну и как тогда могло получиться, что xRec.TechNo и Rec.TechNo одинаковые? Они же менялись. Условие должно быть выполниться. Что-то Вы не договариваете
Расскажу как на духу, что я делаю. Итак, имеем 2 строки кода:
Код:
T50022.TechNo := "No.";   //строка 1
T50022.Modify(TRUE);      //строка 2
Прохожу еще раз с дебагером, в окошке Watch которого выведены для контроля след. переменные:
T50022.Zoom.TechNo
Rec.Zoom.TechNo
xRec.Zoom.TechNo

Курсор стоит на стороке 1 (т.е. как я понимаю строка эта еще не выполнилась), переменные имеют след. значения:
T50022.Zoom.TechNo - старое значение
Rec.Zoom.TechNo - Error: Symbol Rec was not found
xRec.Zoom.TechNo - Error: Symbol xRec was not found

Нажимаем F8. Курсор переходит в строку 2. Наши переменные:
T50022.Zoom.TechNo - НОВОЕ значение
Rec.Zoom.TechNo - Error: Symbol Rec was not found
xRec.Zoom.TechNo - Error: Symbol xRec was not found

Еще раз F8 - попадаем в триггер OnModify таблицы 50022. Переменные становятся:
T50022.Zoom.TechNo - Error: Symbol TechNo was not found
Rec.Zoom.TechNo - НОВОЕ значение
xRec.Zoom.TechNo - НОВОЕ значение

ПАЧИМУУУУ!?!?!?
Это какой-то глюк в программе или у меня уже в голове глючит и я за деревьями не вижу леса?
Старый 22.11.2011, 19:26   #12  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Все верно. Вот если вы будете делать T50022.VALIDATE(TechNo, "No."), тогда в триггере OnValidate увидите разное значение Rec и xRec. Эта информация даже есть во встроенном хелпе Статья "xRec and FIELDNO".
 


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

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

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