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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.12.2007, 14:02   #1  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
Такое дело:
Иметься Т1 и Т2.(Таблицы)
Они взаимосвязаны между собой полем “No.” T1 и Production BOM No в T2.
В таблице Т1 есть записи З1Т1, З2Т1 и т.д
В таблице Т2 есть записи З1Т2, З2Т2 и т.д.

Мне нужно сравнить их на совпадение по 3 полям…
Первое это по Name в Т1, Name в T2, “Quantity per” в Т3

Сначала идет сравнение по Name в T1, Если совпало то смотрим во вторую таблицу и сравниваем там записи по Name, Если воспали то по Qper. Совпало ура! Нет : Нет совпадений!

// структура такая 1 : М (один ко многим)!


Вот…я делал все таким образом:
SpecHeader – Т1;
SpecHeader2 – Т2;
SpecLine – З1;
SpecLine2 – З2;


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." THEN BEGIN
IF SpecHeader.Name = SpecHeader2.Name THEN BEGIN
IF SpecLine.FIND('-') THEN BEGIN
REPEAT
IF SpecLine2.FIND('-') THEN BEGIN
REPEAT
IF SpecLine.COUNT = SpecLine2.COUNT AND ( SpecLine."Name." = SpecLine2."Name.") AND (SpecLine."Quantity per" = SpecLine2."Quantity per") BEGIN
Ret:= TRUE;
Var1:=SpecHeader."No.";
Var2:=SpecHeader2."No.";
END;
UNTIL SpecLine2.NEXT = 0;
END;
UNTIL SpecLine.NEXT =0;
END;
END;
END;
UNTIL SpecHeader2.NEXT = 0;
UNTIL SpecHeader.NEXT = 0;

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


SETRANGE вроде нормально все делает…
Не нравиться мне как работают эти циклы….
Что посоветуете?
Старый 07.12.2007, 14:05   #2  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
забыл указать проблему...
Истиному программисту наверно сразу будет ясно, что здесь не так...
Дело в том, что при работе IF SpecLine.FIND('-') он как бы перебирает все записи не зависемо от того, что я указал:
SpecLine.SETRANGE("Production BOM No.",SpecHeader."No.");
Старый 07.12.2007, 14:57   #3  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Ни фига не понял.
Итак. Есть таблицы 27 Товар и 90 БОМ Компонент. В 90ой состав комплекта. И? Какие Name там надо сравнивать? Название из 27ой у вас как-то наследуется в 90ю для товара-комплекта чтоли? И вы хотите знать, в каких записях оно расходится, чтобы потом эти записи поправить? Так?
Старый 07.12.2007, 15:27   #4  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
Приведу пример так как сам плохо понимаю:
Таблица1
запись 2 (ббб)
запись 3 (ввв)
запись 1 (ааа)

Таблица2
ааа - вапотвлаопт
ааа - ваотмваотм
ааа - ватвоатав
ббб - валотволатп
ббб - влатпотап
ввв- влатплвоатп
ввв -ваотпволапт

Нужно сравнить данные в Таблице 1(т.е. сравнить чтобы не было совпадений, чтобы дважды ааа не встречалось или ввв).... Если вдруг такое происходит
То таблица2 разруливает все это дело...
допустим есть запись 1(ааа) и вдруг добавили запись 4(ааа)
Имя полей одинаковое... тогда заходим в таблицу 2 и смотрим, а действительно ли запись 4 близнец записи1?!
сравниваем количество записей.... т.е. Запись 1.Количество записей из 2 таблице= Записи2.Количество записей из 2 таблице ; если так то сравниваем уже не по количеству записей допустим, а по какому либо серийному номеру!!!!!
Старый 07.12.2007, 15:40   #5  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
А нельзя сделать справочник с первичным ключом из одного поля, позволить выбирать в другой таблице значение из этого справочника и пофиг, что там совпадает, что не совпадает - запись другая (значение первичного ключа другое) и все.

Если честно, то я и до сих пор не понял, зачем и что надо делать. Но уже вижу, что реализация должна была быть другой.. Не настолько рушащей мозг.
Старый 07.12.2007, 15:52   #6  
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   #7  
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('Нету сопадений');
Старый 07.12.2007, 16:25   #8  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Я тоже ничего не понял, даже не дойдя до SETRANGE!
Что это за хитрые обозначения?
SpecHeader – Т1;
SpecHeader2 – Т2;
SpecLine – З1;
SpecLine2 – З2;

Что б запутать классового врага?

Если я правильно понял SpecHeader и SpecLine - это Record одной и тойже таблицы. Тогда
SpecLine.SETRANGE("Production BOM No.",SpecHeader."No.");
не имеет никакого смысла в данном случае



А вот после этого:
Цитата:
Сообщение от by_HT Посмотреть сообщение
Приведу пример так как сам плохо понимаю:
Таблица1
запись 2 (ббб)
запись 3 (ввв)
запись 1 (ааа)

Таблица2
ааа - вапотвлаопт
ааа - ваотмваотм
ааа - ватвоатав
ббб - валотволатп
ббб - влатпотап
ввв- влатплвоатп
ввв -ваотпволапт
я начинаю думать, что Вы извращенец со склонностью к садизму! Уважайте читателей, пишите примеры словами, а не набором букв!
Старый 10.12.2007, 16:44   #9  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
извенаюсь за такой жаргон...буду исправляться!!!!
romeo все отлично, все заработало.... только мы опять упустили один цикл
Код:
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
	  IF SpecLine2.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 (SpecLine2.NEXT = 0);
	  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('Нету сопадений');
теперь работает так как мне надо....
Старый 17.12.2007, 08:44   #10  
by_HT is offline
by_HT
Участник
 
195 / 10 (1) +
Регистрация: 12.10.2007
Поселдний программный код работает только в случае не более 4 записей в 27(как указал Romeo) таблице.....
По сути дело мне нужно удалять найденные идентичные комплекты!!!!
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:19.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.