09.09.2006, 21:19 | #1 |
Участник
|
Привет всем!
В Navision и программировании на C/AL я новичок: работаю всего три дня. Столкнулся с такой ситуацией. Есть таблица на SQL Server, которая отображается на форме. При удалении строки в таблице на форме сначала физически удаляется эта строка из таблицы на SQL Server, а только потом срабатывает триггер. Вопрос следующий: есть ли в Navision средства по обработке (перехвату) событий? Поясню, что именно нужно. Например. Удаляем строку. Затем должно вывести сообщение "Нельзя это делать" и отменить эту операцию, при этом чтобы строка физически не удалялась с SQL Server. А происходит следующим образом. Удаляет физически строку на SQL Server и только потом выдает сообщение "Нельзя это делать". Это нужно сделать БЕЗ ИСПОЛЬЗОВАНИЯ КНОПОК. |
|
10.09.2006, 14:23 | #2 |
Участник
|
В триггер OnDelete строка ERROR('') например. Тогда ничего не удалится.
Но лучше почитать Application Designer’s Guide. |
|
11.09.2006, 07:20 | #3 |
Участник
|
вообщето насколько я понимаю можно просто откатить транзакцию как было уже сказано выше и все действия отменятся
|
|
11.09.2006, 07:42 | #4 |
Участник
|
Дело в том, что триггер срабатывает после физического удаления.
Или я что-то делаю неправильно. Я открываю форму с таблицей в Design и затем открываю C/AL Code формы и в триггере OnDelete пишу ERROR("") и т.д. Для таблицы этого триггера я не увидел. Увидел только Documentation() и белое поле для кода и все. |
|
11.09.2006, 07:47 | #5 |
Участник
|
как это для таблицы нету
|
|
11.09.2006, 07:58 | #6 |
Участник
|
Если выделяешь всю таблицу, то видно только Documentation(). Если один столбец, то есть следующие триггеры: OnActivate, OnDeactivate, OnFormat, OnBeforeInput, OnInputChange, OnAfterInput, OnValidate, OnAfterValidate, OnLookup, OnDrillDown, OnAssistEdit и больше нет.
|
|
11.09.2006, 08:09 | #7 |
Участник
|
ты не там смотришь - заходишь в Object Designer и выбираешь тип объектов Table - затем выбираешь нужную тебе табицу и заходишь в Design. Заходишь в код и в самом верху непосредственно для строк таблицы есть триггера - OnInsert, onModify, onDelete, onRename
|
|
11.09.2006, 08:35 | #8 |
Участник
|
Спасибо за подсказку. Но триггер OnDelete срабатывает после физического удаления из таблицы.
|
|
11.09.2006, 09:40 | #9 |
Участник
|
ну не знаю, не знаю - когда в триггере onDelete таблицы прописываешь ERROR('') он вообще не дает удалять строки!
|
|
11.09.2006, 09:53 | #10 |
NavAx
|
Цитата:
Почитайте доки, в конце концов
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
11.09.2006, 11:03 | #11 |
Участник
|
Есть такое понятие - транзакция. Да, триггер на форме срабатывает перед триггером в таблице. Но физически запись удалится из таблицы тогда, когда завершится транзакция. Если на каком-либо из этапов возникнет ошибка - транзакция откатится.
ПС. Вас не удивляет юнит учета? Там много делитов и инсертов, но если в самом конце при учете возникнет ругань, то все волшебным образом откатится на круги своя .. |
|
11.09.2006, 17:38 | #12 |
Участник
|
Обратите внимание ERROR('')!
В скобках одинарные кавычки. А Вы пишите ERROR("") |
|
11.09.2006, 22:35 | #13 |
Участник
|
Огромное спасибо за помощь и предложения, с этим я справился с вашей помощью.
Но события развиваются... Теперь нужно с использованием внешнего модуля удалить всё таки эту запись. Как это сделать с Navision я представления не имею. Но план будет такой. Записать в переменную значение ключевого поля таблицы (Столбец с названием Номер). Передать это значение в модуль, а модуль сам удалит эту запись. Как проще и лучше или другие идеи как это можно будет сделать я буду рад принять. Заранее огромное спасибо. |
|
12.09.2006, 08:31 | #14 |
Участник
|
А почему именно с помощью внешнего модуля?
|
|
12.09.2006, 08:45 | #15 |
Участник
|
Так хочет начальство.
|
|
12.09.2006, 11:14 | #16 |
Участник
|
|
|
12.09.2006, 11:31 | #17 |
Участник
|
Начальство - ведущий программист, а я всеволишь его начинающий помошник.
|
|
13.09.2006, 09:49 | #18 |
Участник
|
Цитата:
Сообщение от Programmer
Огромное спасибо за помощь и предложения, с этим я справился с вашей помощью.
Но события развиваются... Теперь нужно с использованием внешнего модуля удалить всё таки эту запись. Как это сделать с Navision я представления не имею. Но план будет такой. Записать в переменную значение ключевого поля таблицы (Столбец с названием Номер). Передать это значение в модуль, а модуль сам удалит эту запись. Как проще и лучше или другие идеи как это можно будет сделать я буду рад принять. Заранее огромное спасибо. //Codeunit DeleteRec //C/Al Globals: Rec1 переменная типа Rec Rec1.GET(ЗначениеКлюча1,ЗначениеКлюча2,...); Rec1.DELETE(TRUE); //Если хотим, чтобы отработал триггер OnValidate() таблицы Rec1 либо Rec1.DELETE; //Если не хотим, чтобы отработал триггер OnValidate() таблицы Rec1 Ну а в таблице Rec1 нужно написать все тот же ERROR на триггер OnDelete(), если хочется, чтобы запись не удалилась :-) Обратите внимание, что в случае Rec1.DELETE запись удалится, даже если в триггере OnDelete() будет прописан ERROR. Удачи! |
|
13.09.2006, 10:45 | #19 |
NavAx
|
Цитата:
Rec1.DELETE(TRUE); //Если хотим, чтобы отработал триггер OnValidate() таблицы Rec1
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
13.09.2006, 17:03 | #20 |
Участник
|
|
|