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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.12.2007, 15:52   #1  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
Ромео... нет...мы не поняли друг друга...
надо всего лишь прочитать программный код и в нем все понятно!!!!
у меня не работают : SETRANGE
при переборе SpecLine, он перебирвает все записи в SpecLine!!!!!! а SETRANGE не работает!!!! почему?????
т.е. надо перебирвать не все записи а те что в : SpecLine.SETRANGE("Production BOM No.",SpecHeader."No.");

так наверно яснее будет на много!

в свою очередь SpecLine2 должен перебирвать данные только через:
SpecLine2.SETRANGE("Production BOM No.",SpecHeader2."No.");
Старый 07.12.2007, 16:20   #2  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Вот, что получилось у меня после того, как я привел код в структурированный и более читаемый вид

Код:
  IF SpecHeader.FIND('-') THEN REPEAT
	SpecLine.SETRANGE("Production BOM No.", SpecHeader."No.");
	
	IF SpecHeader2.FIND('-') THEN REPEAT
	  SpecLine2.SETRANGE("Production BOM No.", SpecHeader2."No.");
	  IF (SpecHeader."No." <> SpecHeader2."No.") AND
		 (SpecHeader.Name = SpecHeader2.Name) 
	  THEN BEGIN
		IF SpecLine.FIND('-') THEN REPEAT
		  IF SpecLine2.FIND('-') THEN REPEAT
			IF (SpecLine.COUNT = SpecLine2.COUNT) AND
			   (SpecLine."Name." = SpecLine2."Name.") AND
			   (SpecLine."Quantity per" = SpecLine2."Quantity per)
			THEN BEGIN
			  Ret := TRUE;
			  Var1 := SpecHeader."No.";
			  Var2 := SpecHeader2."No.";
			END;
		  UNTIL SpecLine2.NEXT = 0;
		UNTIL SpecLine.NEXT =0;
	  END;
	UNTIL SpecHeader2.NEXT = 0;
  UNTIL SpecHeader.NEXT = 0;

  IF Ret 
	THEN MESSAGE('Есть')
	ELSE MESSAGE('Нет');
Затем.
Если вся шняга начинается как я понял, когда

Код:
	  IF (SpecHeader."No." <> SpecHeader2."No.") AND
		 (SpecHeader.Name = SpecHeader2.Name) 
	  THEN BEGIN
то почему сразу не фильтровать SpecHeader2 таким образом

Код:
SpecHeader2.SETRANGE(Name, Spec.Header.Name);
SpecHeader2.SETFILTER("No.", '<>%1', SpecHeader."No.");
Вот как получилось у меня
Код:
  IF SpecHeader.FIND('-') THEN REPEAT
	SpecHeader2.RESET;
	SpecHeader2.SETRANGE(Name, SpecHeader.Name);
	SpecHeader2.SETFILTER("No.", '<>%1', SpecHeader."No.");
	IF SpecHeader2.FIND('-') THEN REPEAT
	  SpecLine.SETRANGE("Production BOM No.", SpecHeader."No.");
	  SpecLine2.RESET;
	  SpecLine2.SETRANGE("Production BOM No.", SpecHeader2."No.");
	  
	  SpecLineCount := SpecLine.COUNT;
	  SpecLine2Coount := SpecLine2.COUNT;

	  IF SpecLineCount = SpecLine2Coount THEN BEGIN
		SpecLine2.SETRANGE(Name, SpecLine.Name);
		SpecLine2.SETRANGE("Quantity Per", SpecLine."Quantity Per");
		IF SpecLine2.FIND('-') THEN BEGIN
		  Ret := TRUE;
		  Var1 := SpecHeader."No.";
		  Var2 := SpecHeader2."No.";
		END;
	  END;
	UNTIL SpecHeader2.NEXT = 0;
  UNTIL SpecHeader.NEXT = 0;
  
  IF Ret 
	THEN MESSAGE('Есть')
	ELSE MESSAGE('Нет');

Ебрика!!!!
Вы ищете не заведен ли уже такой же в точности комплект???? По составу и всему остальному )

День сегодня проведен не зря.
Ды-бы-дым, ды-бы-дам )

Я все пОнял [Димон, Наша Раша]

Ммм. Плохо написал.
Накладывать фильтры на SpecLine надо вне начала цикла по SpecHeader2.. А то COUNT по SpecLine считается чаще, чем нужно ( А COUNT - тажелая функция.
А так все. Ах да...
Вот так должно было звучать условие задачи :
"Есть 27 и 90 таблицы. Коды комплектующих судя по всему у них могут повторяться (никто не смотрит, была ли уже дверца шкафа белая с кодом А. могут внести товар с тем же названием, но код будет уже Б). Задача в том, чтобы найти полностью идентичные комплекты по составу, учитывая, что не Код, а Название комплектующей имеет значение."

Вот коллега поправил код. Получился рабочий вариант. Вроде бы ) Я цикл забыл.

Код:
IF SpecHeader.FIND('-') THEN REPEAT 
  SpecHeader2.SETRANGE(Name, SpecHeader.Name);
  SpecHeader2.SETFILTER("No.", '<>%1', SpecHeader."No.");
  IF SpecHeader2.FIND('-') THEN REPEAT
	SpecLine.SETRANGE("Production BOM No.", SpecHeader."No.");
	SpecLine2.SETRANGE("Production BOM No.", SpecHeader2."No.");
	IF SpecLine.COUNT = SpecLine2.COUNT THEN BEGIN
	  IF SpecLine.FIND('-') THEN REPEAT
		SpecLine2.Setrange("Name.", SpecLine."Name.");
		SpecLine2.Setrange("Quantity per", SpecLine."Quantity per");
		IF NOT SpecLine2.ISEMPTY() THEN BEGIN
		  Ret := TRUE;
		  Var1 := SpecHeader."No.";
		  Var2 := SpecHeader2."No.";
		END;
	  UNTIL Ret OR (SpecLine.NEXT = 0);
	END;
  UNTIL Ret OR (SpecHeader2.NEXT = 0);
UNTIL Ret OR (SpecHeader.NEXT = 0);

IF Ret
  THEN MESSAGE('Есть совпадение') 
  ELSE MESSAGE('Нету сопадений');
 


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

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

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