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