![]() |
#1 |
Участник
|
![]()
Привет всем!
В Navision и программировании на C/AL я новичок: работаю всего три дня. Столкнулся с такой ситуацией. Есть таблица на SQL Server, которая отображается на форме. При удалении строки в таблице на форме сначала физически удаляется эта строка из таблицы на SQL Server, а только потом срабатывает триггер. Вопрос следующий: есть ли в Navision средства по обработке (перехвату) событий? Поясню, что именно нужно. Например. Удаляем строку. Затем должно вывести сообщение "Нельзя это делать" и отменить эту операцию, при этом чтобы строка физически не удалялась с SQL Server. А происходит следующим образом. Удаляет физически строку на SQL Server и только потом выдает сообщение "Нельзя это делать". Это нужно сделать БЕЗ ИСПОЛЬЗОВАНИЯ КНОПОК. |
|
![]() |
#2 |
Участник
|
В триггер OnDelete строка ERROR('') например. Тогда ничего не удалится.
Но лучше почитать Application Designer’s Guide. |
|
![]() |
#3 |
Участник
|
вообщето насколько я понимаю можно просто откатить транзакцию как было уже сказано выше и все действия отменятся
|
|
![]() |
#4 |
Участник
|
Дело в том, что триггер срабатывает после физического удаления.
Или я что-то делаю неправильно. Я открываю форму с таблицей в Design и затем открываю C/AL Code формы и в триггере OnDelete пишу ERROR("") и т.д. Для таблицы этого триггера я не увидел. Увидел только Documentation() и белое поле для кода и все. |
|
![]() |
#5 |
Участник
|
как это для таблицы нету
|
|
![]() |
#6 |
Участник
|
Если выделяешь всю таблицу, то видно только Documentation(). Если один столбец, то есть следующие триггеры: OnActivate, OnDeactivate, OnFormat, OnBeforeInput, OnInputChange, OnAfterInput, OnValidate, OnAfterValidate, OnLookup, OnDrillDown, OnAssistEdit и больше нет.
|
|
![]() |
#7 |
Участник
|
ты не там смотришь - заходишь в Object Designer и выбираешь тип объектов Table - затем выбираешь нужную тебе табицу и заходишь в Design. Заходишь в код и в самом верху непосредственно для строк таблицы есть триггера - OnInsert, onModify, onDelete, onRename
|
|
![]() |
#8 |
Участник
|
Спасибо за подсказку. Но триггер OnDelete срабатывает после физического удаления из таблицы.
|
|
![]() |
#9 |
Участник
|
ну не знаю, не знаю - когда в триггере onDelete таблицы прописываешь ERROR('') он вообще не дает удалять строки!
|
|
![]() |
#10 |
NavAx
|
Цитата:
Почитайте доки, в конце концов ![]()
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
![]() |
#11 |
Участник
|
Есть такое понятие - транзакция. Да, триггер на форме срабатывает перед триггером в таблице. Но физически запись удалится из таблицы тогда, когда завершится транзакция. Если на каком-либо из этапов возникнет ошибка - транзакция откатится.
ПС. Вас не удивляет юнит учета? Там много делитов и инсертов, но если в самом конце при учете возникнет ругань, то все волшебным образом откатится на круги своя .. |
|
![]() |
#12 |
Участник
|
Обратите внимание ERROR('')!
В скобках одинарные кавычки. А Вы пишите ERROR("") |
|
![]() |
#13 |
Участник
|
![]()
Огромное спасибо за помощь и предложения, с этим я справился с вашей помощью.
Но события развиваются... Теперь нужно с использованием внешнего модуля удалить всё таки эту запись. Как это сделать с Navision я представления не имею. Но план будет такой. Записать в переменную значение ключевого поля таблицы (Столбец с названием Номер). Передать это значение в модуль, а модуль сам удалит эту запись. Как проще и лучше или другие идеи как это можно будет сделать я буду рад принять. Заранее огромное спасибо. |
|
![]() |
#14 |
Участник
|
А почему именно с помощью внешнего модуля?
|
|
![]() |
#15 |
Участник
|
Так хочет начальство.
|
|
![]() |
#16 |
Участник
|
|
|
![]() |
#17 |
Участник
|
Начальство - ведущий программист, а я всеволишь его начинающий помошник.
|
|
![]() |
#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. Удачи! |
|
![]() |
#19 |
NavAx
|
Цитата:
Rec1.DELETE(TRUE); //Если хотим, чтобы отработал триггер OnValidate() таблицы Rec1
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
![]() |
#20 |
Участник
|
|
|