![]() |
#1 |
Участник
|
Добрый день всем. Подскажите, в чём моя ошибка. Мне необходимо открыть форму с определённым фильтром. Если есть записи по результатам фильтра то форма без проблем открывается. Но если по результатам фильтрации нет записей, то программа прерывается и ругается, что такие значения не найдены, хотя по логике вещей должна открыться пустая форма с возможностью создать данную запись. Что я не так делаю?(посмотрел как это реализовано в других места и всё именно так как я это делаю)
Код: 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); |
|
![]() |
#2 |
Administrator
|
на форме в коле на OnOpen стоит переопределение фильтров
![]() |
|
![]() |
#3 |
Участник
|
Я что то ничего такого не увидел. Нету переопределения... Может я что-то не то смотрю...я пока новичёк.
|
|
![]() |
#4 |
Administrator
|
ну может там просто RESET стоит и снимает все заранее наложенные фильтры.
он может стоять на: OnOpen OnAfterGetRecord OnAfterGetCurrRecord |
|
![]() |
#5 |
Administrator
|
погоди, я туплю, фильтры в порядке.
как она у тебя ругается? "вы хотите переименовать запись"? |
|
![]() |
#6 |
Участник
|
Ругается она бессовестно
![]() Цитата:
Произв.Заказ Строка не существует.
Идентифицирующие поля и значения: Статус='Утверждён',Произв.Заказ Но.='42781', Строка Но.='10000' Статус:'Утверждён',Произв.Заказ Но.:'42781', Строка Но.:'10000' |
|
![]() |
#7 |
Administrator
|
надо дебаггером пройти с галочкой "Актив", но без галочки "Остановка на триггерах".
код, который ругается - в студию |
|
![]() |
#8 |
Участник
|
Цитата:
Ошибка в несуществующем номере документа. Даже если просто запустить форму (5407) и поставить фильтр на несуществующий док-но, то вылезет эта ошибка. Рецепт "как вылечить?" в процессе. |
|
![]() |
#9 |
Участник
|
Именно так. Просто вылетает "Break On Error" и всё
|
|
![]() |
#10 |
Administrator
|
заказ 42781 есть?
если нет, то надо зайти в табличку и ручками грохнуть строки, на него ссылающиеся |
|
![]() |
#11 |
MCTS
|
Как сказали умные люди - если фильтр поставить по ключевым полям, то система сразу же пытается их валидейтить.
Т.е. если фильтр по номеру заказа, то проверяет, чтоб заказ был. Если и по номеру строки, то проверяет, чтоб номер строки существовал. А их похоже нету, вот и валится. |
|
![]() |
#12 |
Участник
|
Скорее все всего на форме "Prod. Order Comp. Line List" на AfterGetRecord написан код, из-за которого ругается.
Такая же фигня есть в складском функционала с таблицей Bin Content - в ней "шайтан" код сидит в самой таблице на OnInsert. |
|
![]() |
#13 |
Administrator
|
а если свойство формы DelayedInsert выставить в yes, вставки не будет, проблем со вставкой тоже...
|
|
![]() |
#14 |
Участник
|
Цитата:
Вызывается валидейт прямо из таблицы при наложении фильтра. Век живи - век учись. Вопрос, как это ПРАВИЛЬНО обходится, к примеру, в форме 53 (список заказов покупок) Там ставь любые ключи и любую фигню - не вылетает. А вот уже в строках заказа покупки (форма 54) - опять "вылетает" как и в нашем случае с 5407. В некоторых местах у Nav шаманят с кодом на триггере OnFindRecord и пишут что-то типа: IF FIND (Which) THEN EXIT(TRUE) ELSE BEGIN SETRANGE("No."); EXIT(FIND(Which)); END; Тогда тоже форма не вылетает при наложении неправильных фильтров. Но общий "рецепт" - что-то написать в триггере OnValidate ключевого поля таблицы. Вопрос, что именно? ![]() ЗЫ: А. Нет. Нифига! Удалил из таблицы 38 весь код с триггера OnValidate, а оно всё равно работает и не вылетает, хотя на форме 53 нет вообще никакого кода на триггерах, или всяких там св-в типа DelayedInsert. Значит, дело в чём-то другом. Разбираюсь... |
|
![]() |
#15 |
Участник
|
А-ааа... Понял, короче, в чём дело.
Как уже и сказал Apanko, при наложении фильтра вызывается onValidate поля таблицы. В нашем случае это "Prod. Order No." в таблице 5407. Но это не просто поле, а ССЫЛКА на другую таблицу (посмотри в св-вах поля TableRelation) "Production Order".No. WHERE (Status=FIELD(Status)) И, если номер заказа неправильный, то Nav не находит его в таблице 5405 и вываливается, поскольку нельзя сделать Validate. Исправить можно просто ![]() Сделай из этого поля "обычное" поле, которое никуда не ссылается. Тогда фильтр на него будет накладываться без ошибок. Собственно, вот. ЗЫ: Я понимаю, что всё это звучит по-идиотски, но так уж устроен Nav. Как оказалось ![]() Спасибо за интересный вопрос! ЗЗЫ: Поправка: Такой "глюк" наблюдается ТОЛЬКО для ключевых полей. Поэтому, как вариант можно просто исключить поле из ключа. Тоже начнёт работать и не вылетать. |
|
![]() |
#16 |
Участник
|
Форма 53 не редактируемая, там никаких валидейтов в принципе быть не может. Для редактируемых форм, как отметил Sancho помогает DelayedInsert.
|
|
![]() |
#17 |
Участник
|
|
|
![]() |
#18 |
Участник
|
Цитата:
Хочу добавить по поводу фильтра по не ключевым полям. Поведение формы будет зависить от значения свойства PopulateAllFields. Если оно равно yes, то ошибка будет вываливаться и для не ключевых полей. |
|
![]() |
#19 |
Участник
|
Решение напросилось само собой. Ставьте фильтр вот так:
ProdOrderComponent.SETFILTER("Prod. Order No.",'%1|%2', Переменная Prod. Order No., Переменная Prod. Order No.); и будет вам счастье. ProdOrderComponent.SETRANGE("Prod. Order No.",Переменная Prod. Order No., Переменная Prod. Order No.); тоже наверно должен работать - не проверял. |
|
![]() |
#20 |
Участник
|
Цитата:
![]() Хотя, честно говоря, я так и понял в чём же КАРДИНАЛЬНОЕ отличие кода? ProdOrderComponent.SETRANGE("Prod. Order No.", '256') который НЕ РАБОТАЕТ от ProdOrderComponent.SETRANGE("Prod. Order No.", '256', '256') который РАБОТАЕТ ?! Фантастика ![]() |
|