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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.12.2010, 15:43   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
[Теперь при попытке покинуть измененную карточку клиента выдается сообщение об ошибке. НО! тем не менее изменения сохраняются и если мы еще раз выйдем из карточки клиента, то уже система не "мявкает",т.к. по ее логике уже ничего и не поменялось. В рез-те имеем: измененное поле в карточке клиента, которое на самом деле менять было нельзя. ;-/
Что делать?
Переносить-такии код в др.место или ...? Какие есть варианты? Где я опять накосячила?
Может тогда имеет смысл оставить CU 423 по-старому, а всю процедуру проверки перенести в триггер OnModify() Таблицы 18? (т.е. прописываем код для проверки только в одном месте и OnValidate по каждому полю трогать не будем)
Старый 16.12.2010, 20:30   #2  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Теперь при попытке покинуть измененную карточку клиента выдается сообщение об ошибке. НО! тем не менее изменения сохраняются и если мы еще раз выйдем из карточки клиента, то уже система не "мявкает",т.к. по ее логике уже ничего и не поменялось. В рез-те имеем: измененное поле в карточке клиента, которое на самом деле менять было нельзя. ;-/
Что делать?
Переносить-такии код в др.место или ...? Какие есть варианты? Где я опять накосячила?

1. Косяк в коде один есть:
надо писать не

xFldRef := xRecRef.FIELDINDEX(65); //65 - Index vom Feld "Resposibility Center"

а

xFldRef := xRecRef.FIELD(65); //65 - Index vom Feld "Resposibility Center"


2. Я на вскидку вставил в моей БД в CU 423 ваш код (с корректировкой в П 1.):
После подтверждения ошибки система возвращает в поле прежнее значение (до изменения), как и должно быть после ERROR, всё работает.
Ошибка вылетает после изменения в поле при попытке перейти к другому customer или закрыть карточку.

Важное примечание: после любых изменений в коде (т. е. в программном коде, имеющем отношение к CU 423):
---- в открывайте навижен сновa, чтобы CU 423 заметил эти изменения: CU423 это SingleInstanece-Codeunit.
Старый 16.12.2010, 23:23   #3  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
1. Косяк в коде один есть:
надо писать не

xFldRef := xRecRef.FIELDINDEX(65); //65 - Index vom Feld "Resposibility Center"

а

xFldRef := xRecRef.FIELD(65); //65 - Index vom Feld "Resposibility Center"
У меня с FieldIndex(65) работает. 65 - это действительно индекс поля в таблице, а не номер его.

Цитата:
2. Я на вскидку вставил в моей БД в CU 423 ваш код (с корректировкой в П 1.):
После подтверждения ошибки система возвращает в поле прежнее значение (до изменения), как и должно быть после ERROR, всё работает.
Ошибка вылетает после изменения в поле при попытке перейти к другому customer или закрыть карточку.
Я выясниснила почему у меня не работает...точнее работает не для всех полей.
Собака порылась в коде триггера OnModify() таблицы 18:
На домашнем компе Навижн нет, потому по памяти напишу что там примерно было:
OnModify()
IF Name <> xRec.Name OR
Address <> xRec.Address OR
Contakt <> xRec.Contakt
и т.д. ...перечислины куча полей с контактными данными клиента
THEN BEGIN
MODIFY;
вызывается процедура, которая записывает контактные данные в какую-то доп.таблицу


Вот это самое MODIFY и портит всю малину. Если меняется какое-то поле из приведенного выше IF'а, тогда сообщение об ошибке появляется, но новое значение тем не менее сохраняется. Если меняю любое другое поле (кроме Information или Note), тогда появляется сообщение об ошибке и введенное новое значение сбрасывается (т.е. работает так, как Вы и описывали)

Цитата:
Важное примечание: после любых изменений в коде (т. е. в программном коде, имеющем отношение к CU 423):
---- в открывайте навижен сновa, чтобы CU 423 заметил эти изменения: CU423 это SingleInstanece-Codeunit.
Спасибо за подсказку. Я это "правило" уже эмпирическим путем выяснила, когда сегодня с дебагером отлаживала и не могла понять, почему CU сохраняю, а ошибка старая лезет и дебагер старый текст показывает
Теперь буду знать, что это не мое предположение, а действительно так и есть
Старый 17.12.2010, 13:14   #4  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Вот это самое MODIFY и портит всю малину. Если меняется какое-то поле из приведенного выше IF'а, тогда сообщение об ошибке появляется, но новое значение тем не менее сохраняется. Если меняю любое другое поле (кроме Information или Note), тогда появляется сообщение об ошибке и введенное новое значение сбрасывается (т.е. работает так, как Вы и описывали)
В моей таблице 18 в ОnModify() тот же код что и у вас с тем же MODIFY. Меняю значение в Name на новое: после ошибки в Name стоит опять старое значение.
Посмитрите, может у вас в OnModifyRecord() в форме что-нибудь прописано, может где-нибудь у вас ещё и COMMIT затесался?
Старый 19.12.2010, 15:47   #5  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
В моей таблице 18 в ОnModify() тот же код что и у вас с тем же MODIFY. Меняю значение в Name на новое: после ошибки в Name стоит опять старое значение.
Посмитрите, может у вас в OnModifyRecord() в форме что-нибудь прописано, может где-нибудь у вас ещё и COMMIT затесался?
Нашла COMMIT!
В таблице 18 в модуле:

ValidateShortcutDimCode(FieldNumber : Integer;VAR ShortcutDimCode : Code[20])
DimMgt.ValidateDimValueCode(FieldNumber,ShortcutDimCode);
DimMgt.SaveDefaultDim(DATABASE::Customer,"No.",FieldNumber,ShortcutDimCode);
//Logging of field modifications: commit instead of modify (modify purges parts of log)
//MODIFY;
COMMIT;


Комментарий и исправление сделано программистом, работавшим до меня (должна сказать, что в фирме, где я работаю, вообще очень много изменений в Навижн в отличие от типовой конфигурации)
В данном случае мне не совсем понятен смысл исправления, сделанного программистом ;-/
С какой целью!? (где тут смайлик, пожимающий плечами?
Старый 19.12.2010, 16:02   #6  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Вот триггер OnModifyRecord() формы 50191 (через которую мы редактируем карточку клиента):


Form - OnModifyRecord() : Boolean
BenutzerEinrRec.GET(USERID);

IF (BenutzerEinrRec."Sales Resp. Ctr. Filter" <> '') THEN

IF (STRPOS(BenutzerEinrRec."Sales Resp. Ctr. Filter",COPYSTR("Responsibility Center",1,4)) = 0) OR
(Rec."Responsibility Center" <> xRec."Responsibility Center")
THEN
// ERROR('Änderung nicht möglich: Dieser Debitor ist einer anderen Zuständigkeitseinheit zugeordnet!');


Последняя строка с ERROR закомментарена мной в связи с изменениями в CU 423.
Старый 20.12.2010, 12:01   #7  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Моё личное мнение:
программист, заменивший в функции ValidateShortcutDimCode() MODIFY на COMMIT, просто ловил какую-то ошибку связанную с dimensions и забыл просто-напросто вернуть программный код в первоначальное состояние. В стандартной Т.18 имеется COMMIT в одном единственном месте, в функции ShоwContact(), но там он нужен и с вашей проблемой это никак не сваязано.
Попробуйте убрать COMMIT и протестировать (не забыть открыть навижен заново).

Код из OnModifyRecord() уберите полностью, там уж действительно ничего прописывать не надо.
Старый 20.12.2010, 15:48   #8  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
Моё личное мнение:
программист, заменивший в функции ValidateShortcutDimCode() MODIFY на COMMIT, просто ловил какую-то ошибку связанную с dimensions и забыл просто-напросто вернуть программный код в первоначальное состояние. В стандартной Т.18 имеется COMMIT в одном единственном месте, в функции ShоwContact(), но там он нужен и с вашей проблемой это никак не сваязано.
Не похоже, что он что-то тестировал, т.к. это изменение описано в триггере Documentation() и ему приписана новая версия. К тому же шеф сказал, чтобы я лучше исправления в T18.OnModify внесла, и не трогала CU и COMMIT.
Я так и сделала. Теперь всё работает даже с коммит

Цитата:
Попробуйте убрать COMMIT и протестировать (не забыть открыть навижен заново).
Пробовала, работает. Но ...см. выше

Цитата:
Код из OnModifyRecord() уберите полностью, там уж действительно ничего прописывать не надо.
Код уже убрала. Он там сейчас действительно ни к чему.

Спасибо Вам огромное за помощь и поддержку
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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