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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.07.2011, 16:39   #1  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Добрый день всем. Подскажите, в чём моя ошибка. Мне необходимо открыть форму с определённым фильтром. Если есть записи по результатам фильтра то форма без проблем открывается. Но если по результатам фильтрации нет записей, то программа прерывается и ругается, что такие значения не найдены, хотя по логике вещей должна открыться пустая форма с возможностью создать данную запись. Что я не так делаю?(посмотрел как это реализовано в других места и всё именно так как я это делаю)
Код:
ProdOrderComponent.RESET;
ProdOrderComponent.SETRANGE(Status,перемення статус);
ProdOrderComponent.SETRANGE("Prod. Order No.",Переменная Prod. Order No.);
ProdOrderComponent.SETRANGE("Prod. Order Line No.",10000);
FORM.RUN(FORM::"Prod. Order Comp. Line List",ProdOrderComponent);
Заранее всем спасибо.
Старый 25.07.2011, 16:44   #2  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
на форме в коле на OnOpen стоит переопределение фильтров
Старый 25.07.2011, 17:06   #3  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Я что то ничего такого не увидел. Нету переопределения... Может я что-то не то смотрю...я пока новичёк.
Старый 25.07.2011, 17:12   #4  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
ну может там просто RESET стоит и снимает все заранее наложенные фильтры.
он может стоять на:
OnOpen
OnAfterGetRecord
OnAfterGetCurrRecord
Старый 25.07.2011, 17:14   #5  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
погоди, я туплю, фильтры в порядке.
как она у тебя ругается? "вы хотите переименовать запись"?
Старый 25.07.2011, 17:25   #6  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Ругается она бессовестно
Цитата:
Произв.Заказ Строка не существует.
Идентифицирующие поля и значения:
Статус='Утверждён',Произв.Заказ Но.='42781', Строка Но.='10000'
Статус:'Утверждён',Произв.Заказ Но.:'42781', Строка Но.:'10000'
Старый 25.07.2011, 17:42   #7  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
надо дебаггером пройти с галочкой "Актив", но без галочки "Остановка на триггерах".
код, который ругается - в студию
Старый 25.07.2011, 17:50   #8  
jopagames2 is offline
jopagames2
Участник
 
151 / 11 (1) +
Регистрация: 11.02.2010
Цитата:
Сообщение от Sancho Посмотреть сообщение
надо дебаггером пройти с галочкой "Актив", но без галочки "Остановка на триггерах".
код, который ругается - в студию
Не. Дебаггер это не ловит. Он тупо зависает на FORM.RUN
Ошибка в несуществующем номере документа.
Даже если просто запустить форму (5407) и поставить фильтр на несуществующий док-но, то вылезет эта ошибка.

Рецепт "как вылечить?" в процессе.
Старый 25.07.2011, 18:09   #9  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Именно так. Просто вылетает "Break On Error" и всё
Старый 25.07.2011, 18:33   #10  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
заказ 42781 есть?
если нет, то надо зайти в табличку и ручками грохнуть строки, на него ссылающиеся
Старый 25.07.2011, 21:57   #11  
apanko is offline
apanko
MCTS
MCBMSS
Лучший по профессии 2009
 
1,164 / 139 (7) +++++
Регистрация: 24.02.2005
Как сказали умные люди - если фильтр поставить по ключевым полям, то система сразу же пытается их валидейтить.

Т.е. если фильтр по номеру заказа, то проверяет, чтоб заказ был. Если и по номеру строки, то проверяет, чтоб номер строки существовал.

А их похоже нету, вот и валится.
Старый 25.07.2011, 22:00   #12  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
Скорее все всего на форме "Prod. Order Comp. Line List" на AfterGetRecord написан код, из-за которого ругается.
Такая же фигня есть в складском функционала с таблицей Bin Content - в ней "шайтан" код сидит в самой таблице на OnInsert.
Старый 26.07.2011, 00:04   #13  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
а если свойство формы DelayedInsert выставить в yes, вставки не будет, проблем со вставкой тоже...
Старый 26.07.2011, 09:47   #14  
jopagames2 is offline
jopagames2
Участник
 
151 / 11 (1) +
Регистрация: 11.02.2010
Цитата:
Сообщение от apanko Посмотреть сообщение
Как сказали умные люди - если фильтр поставить по ключевым полям, то система сразу же пытается их валидейтить.
...
А их похоже нету, вот и валится.
Блин, точно!
Вызывается валидейт прямо из таблицы при наложении фильтра. Век живи - век учись.

Вопрос, как это ПРАВИЛЬНО обходится, к примеру, в форме 53 (список заказов покупок)
Там ставь любые ключи и любую фигню - не вылетает.
А вот уже в строках заказа покупки (форма 54) - опять "вылетает" как и в нашем случае с 5407.

В некоторых местах у Nav шаманят с кодом на триггере OnFindRecord и пишут что-то типа:

IF FIND (Which) THEN
EXIT(TRUE)
ELSE BEGIN
SETRANGE("No.");
EXIT(FIND(Which));
END;

Тогда тоже форма не вылетает при наложении неправильных фильтров.

Но общий "рецепт" - что-то написать в триггере OnValidate ключевого поля таблицы.

Вопрос, что именно?

ЗЫ: А. Нет. Нифига!
Удалил из таблицы 38 весь код с триггера OnValidate, а оно всё равно работает и не вылетает, хотя на форме 53 нет вообще никакого кода на триггерах, или всяких там св-в типа DelayedInsert.

Значит, дело в чём-то другом.
Разбираюсь...
Старый 26.07.2011, 10:13   #15  
jopagames2 is offline
jopagames2
Участник
 
151 / 11 (1) +
Регистрация: 11.02.2010
Цитата:
Сообщение от Shaitan-Babay Посмотреть сообщение
Добрый день всем. Подскажите, в чём моя ошибка.
А-ааа... Понял, короче, в чём дело.
Как уже и сказал Apanko, при наложении фильтра вызывается onValidate поля таблицы.

В нашем случае это "Prod. Order No." в таблице 5407.
Но это не просто поле, а ССЫЛКА на другую таблицу
(посмотри в св-вах поля TableRelation)
"Production Order".No. WHERE (Status=FIELD(Status))

И, если номер заказа неправильный, то Nav не находит его в таблице 5405 и вываливается, поскольку нельзя сделать Validate.

Исправить можно просто
Сделай из этого поля "обычное" поле, которое никуда не ссылается.
Тогда фильтр на него будет накладываться без ошибок.

Собственно, вот.

ЗЫ: Я понимаю, что всё это звучит по-идиотски, но так уж устроен Nav. Как оказалось

Спасибо за интересный вопрос!

ЗЗЫ: Поправка: Такой "глюк" наблюдается ТОЛЬКО для ключевых полей. Поэтому, как вариант можно просто исключить поле из ключа. Тоже начнёт работать и не вылетать.
Старый 26.07.2011, 12:09   #16  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от jopagames2 Посмотреть сообщение
Удалил из таблицы 38 весь код с триггера OnValidate, а оно всё равно работает и не вылетает, хотя на форме 53 нет вообще никакого кода на триггерах, или всяких там св-в типа DelayedInsert.
Форма 53 не редактируемая, там никаких валидейтов в принципе быть не может. Для редактируемых форм, как отметил Sancho помогает DelayedInsert.
Старый 26.07.2011, 12:22   #17  
jopagames2 is offline
jopagames2
Участник
 
151 / 11 (1) +
Регистрация: 11.02.2010
Цитата:
Сообщение от Alterant Посмотреть сообщение
Форма 53 не редактируемая, там никаких валидейтов в принципе быть не может.
Ага. Это вы Мелкософту расскажите.
Форма 5407 (Prod. Order Comp. Line List) тоже, кстати, не редактируемая.
Сами посмотрите.
DelayedInsert не при чём.
Старый 26.07.2011, 12:35   #18  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от jopagames2 Посмотреть сообщение
Ага. Это вы Мелкософту расскажите.
Форма 5407 (Prod. Order Comp. Line List) тоже, кстати, не редактируемая.
Сами посмотрите.
DelayedInsert не при чём.
Да, был не прав.

Хочу добавить по поводу фильтра по не ключевым полям. Поведение формы будет зависить от значения свойства PopulateAllFields. Если оно равно yes, то ошибка будет вываливаться и для не ключевых полей.
Старый 26.07.2011, 12:40   #19  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Решение напросилось само собой. Ставьте фильтр вот так:
ProdOrderComponent.SETFILTER("Prod. Order No.",'%1|%2', Переменная Prod. Order No., Переменная Prod. Order No.);
и будет вам счастье.

ProdOrderComponent.SETRANGE("Prod. Order No.",Переменная Prod. Order No., Переменная Prod. Order No.); тоже наверно должен работать - не проверял.
Старый 26.07.2011, 15:46   #20  
jopagames2 is offline
jopagames2
Участник
 
151 / 11 (1) +
Регистрация: 11.02.2010
Цитата:
Сообщение от Alterant Посмотреть сообщение
ProdOrderComponent.SETRANGE("Prod. Order No.",Переменная Prod. Order No., Переменная Prod. Order No.); тоже наверно должен работать - не проверял.
О! Круто! Тоже работает
Хотя, честно говоря, я так и понял в чём же КАРДИНАЛЬНОЕ отличие кода?

ProdOrderComponent.SETRANGE("Prod. Order No.", '256') который НЕ РАБОТАЕТ

от ProdOrderComponent.SETRANGE("Prod. Order No.", '256', '256') который РАБОТАЕТ ?!

Фантастика
 


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

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

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