25.07.2011, 16:39 | #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); |
|
25.07.2011, 16:44 | #2 |
Administrator
|
на форме в коле на OnOpen стоит переопределение фильтров
|
|
25.07.2011, 17:06 | #3 |
Участник
|
Я что то ничего такого не увидел. Нету переопределения... Может я что-то не то смотрю...я пока новичёк.
|
|
25.07.2011, 17:12 | #4 |
Administrator
|
ну может там просто RESET стоит и снимает все заранее наложенные фильтры.
он может стоять на: OnOpen OnAfterGetRecord OnAfterGetCurrRecord |
|
25.07.2011, 17:14 | #5 |
Administrator
|
погоди, я туплю, фильтры в порядке.
как она у тебя ругается? "вы хотите переименовать запись"? |
|
25.07.2011, 17:25 | #6 |
Участник
|
Ругается она бессовестно
Цитата:
Произв.Заказ Строка не существует.
Идентифицирующие поля и значения: Статус='Утверждён',Произв.Заказ Но.='42781', Строка Но.='10000' Статус:'Утверждён',Произв.Заказ Но.:'42781', Строка Но.:'10000' |
|
25.07.2011, 17:42 | #7 |
Administrator
|
надо дебаггером пройти с галочкой "Актив", но без галочки "Остановка на триггерах".
код, который ругается - в студию |
|
25.07.2011, 17:50 | #8 |
Участник
|
Цитата:
Ошибка в несуществующем номере документа. Даже если просто запустить форму (5407) и поставить фильтр на несуществующий док-но, то вылезет эта ошибка. Рецепт "как вылечить?" в процессе. |
|
25.07.2011, 18:09 | #9 |
Участник
|
Именно так. Просто вылетает "Break On Error" и всё
|
|
25.07.2011, 18:33 | #10 |
Administrator
|
заказ 42781 есть?
если нет, то надо зайти в табличку и ручками грохнуть строки, на него ссылающиеся |
|
25.07.2011, 21:57 | #11 |
MCTS
|
Как сказали умные люди - если фильтр поставить по ключевым полям, то система сразу же пытается их валидейтить.
Т.е. если фильтр по номеру заказа, то проверяет, чтоб заказ был. Если и по номеру строки, то проверяет, чтоб номер строки существовал. А их похоже нету, вот и валится. |
|
25.07.2011, 22:00 | #12 |
Участник
|
Скорее все всего на форме "Prod. Order Comp. Line List" на AfterGetRecord написан код, из-за которого ругается.
Такая же фигня есть в складском функционала с таблицей Bin Content - в ней "шайтан" код сидит в самой таблице на OnInsert. |
|
26.07.2011, 00:04 | #13 |
Administrator
|
а если свойство формы DelayedInsert выставить в yes, вставки не будет, проблем со вставкой тоже...
|
|
26.07.2011, 09:47 | #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. Значит, дело в чём-то другом. Разбираюсь... |
|
26.07.2011, 10:13 | #15 |
Участник
|
А-ааа... Понял, короче, в чём дело.
Как уже и сказал Apanko, при наложении фильтра вызывается onValidate поля таблицы. В нашем случае это "Prod. Order No." в таблице 5407. Но это не просто поле, а ССЫЛКА на другую таблицу (посмотри в св-вах поля TableRelation) "Production Order".No. WHERE (Status=FIELD(Status)) И, если номер заказа неправильный, то Nav не находит его в таблице 5405 и вываливается, поскольку нельзя сделать Validate. Исправить можно просто Сделай из этого поля "обычное" поле, которое никуда не ссылается. Тогда фильтр на него будет накладываться без ошибок. Собственно, вот. ЗЫ: Я понимаю, что всё это звучит по-идиотски, но так уж устроен Nav. Как оказалось Спасибо за интересный вопрос! ЗЗЫ: Поправка: Такой "глюк" наблюдается ТОЛЬКО для ключевых полей. Поэтому, как вариант можно просто исключить поле из ключа. Тоже начнёт работать и не вылетать. |
|
26.07.2011, 12:09 | #16 |
Участник
|
Форма 53 не редактируемая, там никаких валидейтов в принципе быть не может. Для редактируемых форм, как отметил Sancho помогает DelayedInsert.
|
|
26.07.2011, 12:22 | #17 |
Участник
|
|
|
26.07.2011, 12:35 | #18 |
Участник
|
Цитата:
Хочу добавить по поводу фильтра по не ключевым полям. Поведение формы будет зависить от значения свойства PopulateAllFields. Если оно равно yes, то ошибка будет вываливаться и для не ключевых полей. |
|
26.07.2011, 12:40 | #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.); тоже наверно должен работать - не проверял. |
|
26.07.2011, 15:46 | #20 |
Участник
|
Цитата:
Хотя, честно говоря, я так и понял в чём же КАРДИНАЛЬНОЕ отличие кода? ProdOrderComponent.SETRANGE("Prod. Order No.", '256') который НЕ РАБОТАЕТ от ProdOrderComponent.SETRANGE("Prod. Order No.", '256', '256') который РАБОТАЕТ ?! Фантастика |
|