|  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') который РАБОТАЕТ ?! Фантастика   | 
|  |