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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.09.2006, 21:19   #1  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
:(
Привет всем!

В Navision и программировании на C/AL я новичок: работаю всего три дня. Столкнулся с такой ситуацией.

Есть таблица на SQL Server, которая отображается на форме. При удалении строки в таблице на форме сначала физически удаляется эта строка из таблицы на SQL Server, а только потом срабатывает триггер. Вопрос следующий: есть ли в Navision средства по обработке (перехвату) событий?

Поясню, что именно нужно. Например. Удаляем строку. Затем должно вывести сообщение "Нельзя это делать" и отменить эту операцию, при этом чтобы строка физически не удалялась с SQL Server. А происходит следующим образом. Удаляет физически строку на SQL Server и только потом выдает сообщение "Нельзя это делать". Это нужно сделать БЕЗ ИСПОЛЬЗОВАНИЯ КНОПОК.
Старый 10.09.2006, 14:23   #2  
prefreitor is offline
prefreitor
Участник
 
214 / 11 (1) +
Регистрация: 03.10.2006
В триггер OnDelete строка ERROR('') например. Тогда ничего не удалится.
Но лучше почитать Application Designer’s Guide.
Старый 11.09.2006, 07:20   #3  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
вообщето насколько я понимаю можно просто откатить транзакцию как было уже сказано выше и все действия отменятся
Старый 11.09.2006, 07:42   #4  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
Дело в том, что триггер срабатывает после физического удаления.

Или я что-то делаю неправильно. Я открываю форму с таблицей в Design и затем открываю C/AL Code формы и в триггере OnDelete пишу ERROR("") и т.д. Для таблицы этого триггера я не увидел. Увидел только Documentation() и белое поле для кода и все.
Старый 11.09.2006, 07:47   #5  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
как это для таблицы нету
Старый 11.09.2006, 07:58   #6  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
Если выделяешь всю таблицу, то видно только Documentation(). Если один столбец, то есть следующие триггеры: OnActivate, OnDeactivate, OnFormat, OnBeforeInput, OnInputChange, OnAfterInput, OnValidate, OnAfterValidate, OnLookup, OnDrillDown, OnAssistEdit и больше нет.
Старый 11.09.2006, 08:09   #7  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
ты не там смотришь - заходишь в Object Designer и выбираешь тип объектов Table - затем выбираешь нужную тебе табицу и заходишь в Design. Заходишь в код и в самом верху непосредственно для строк таблицы есть триггера - OnInsert, onModify, onDelete, onRename
Старый 11.09.2006, 08:35   #8  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
Спасибо за подсказку. Но триггер OnDelete срабатывает после физического удаления из таблицы.
Старый 11.09.2006, 09:40   #9  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
ну не знаю, не знаю - когда в триггере onDelete таблицы прописываешь ERROR('') он вообще не дает удалять строки!
Старый 11.09.2006, 09:53   #10  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Цитата:
Сообщение от Programmer Посмотреть сообщение
Спасибо за подсказку. Но триггер OnDelete срабатывает после физического удаления из таблицы.
Да откуда Вы это взяли?
Почитайте доки, в конце концов
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 11.09.2006, 11:03   #11  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Есть такое понятие - транзакция. Да, триггер на форме срабатывает перед триггером в таблице. Но физически запись удалится из таблицы тогда, когда завершится транзакция. Если на каком-либо из этапов возникнет ошибка - транзакция откатится.
ПС. Вас не удивляет юнит учета? Там много делитов и инсертов, но если в самом конце при учете возникнет ругань, то все волшебным образом откатится на круги своя ..
Старый 11.09.2006, 17:38   #12  
prefreitor is offline
prefreitor
Участник
 
214 / 11 (1) +
Регистрация: 03.10.2006
Обратите внимание ERROR('')!
В скобках одинарные кавычки.
А Вы пишите ERROR("")
Старый 11.09.2006, 22:35   #13  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
!
Огромное спасибо за помощь и предложения, с этим я справился с вашей помощью.

Но события развиваются... Теперь нужно с использованием внешнего модуля удалить всё таки эту запись. Как это сделать с Navision я представления не имею. Но план будет такой. Записать в переменную значение ключевого поля таблицы (Столбец с названием Номер). Передать это значение в модуль, а модуль сам удалит эту запись. Как проще и лучше или другие идеи как это можно будет сделать я буду рад принять.

Заранее огромное спасибо.
Старый 12.09.2006, 08:31   #14  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
А почему именно с помощью внешнего модуля?
Старый 12.09.2006, 08:45   #15  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
Так хочет начальство.
Старый 12.09.2006, 11:14   #16  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Programmer Посмотреть сообщение
Так хочет начальство.
Плохо когда начальство выбирает варианты реализации ...
Оно должно хотеть ЧТО, а не КАК.
Старый 12.09.2006, 11:31   #17  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
Начальство - ведущий программист, а я всеволишь его начинающий помошник.
Старый 13.09.2006, 09:49   #18  
EDVard_imported is offline
EDVard_imported
Участник
 
49 / 10 (1) +
Регистрация: 22.07.2004
Цитата:
Сообщение от 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  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Цитата:
Rec1.DELETE(TRUE); //Если хотим, чтобы отработал триггер OnValidate() таблицы Rec1
Триггер OnDelete(), наверное...
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 13.09.2006, 17:03   #20  
EDVard_imported is offline
EDVard_imported
Участник
 
49 / 10 (1) +
Регистрация: 22.07.2004
Цитата:
Сообщение от Дуд Посмотреть сообщение
Цитата:
Rec1.DELETE(TRUE); //Если хотим, чтобы отработал триггер OnValidate() таблицы Rec1
Триггер OnDelete(), наверное...
Ну да, конечно :-) OnDelete()
 


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

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

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