07.12.2007, 14:02 | #1 |
Участник
|
Такое дело:
Иметься Т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 |
Участник
|
забыл указать проблему...
Истиному программисту наверно сразу будет ясно, что здесь не так... Дело в том, что при работе IF SpecLine.FIND('-') он как бы перебирает все записи не зависемо от того, что я указал: SpecLine.SETRANGE("Production BOM No.",SpecHeader."No."); |
|
07.12.2007, 14:57 | #3 |
Участник
|
Ни фига не понял.
Итак. Есть таблицы 27 Товар и 90 БОМ Компонент. В 90ой состав комплекта. И? Какие Name там надо сравнивать? Название из 27ой у вас как-то наследуется в 90ю для товара-комплекта чтоли? И вы хотите знать, в каких записях оно расходится, чтобы потом эти записи поправить? Так? |
|
07.12.2007, 15:27 | #4 |
Участник
|
Приведу пример так как сам плохо понимаю:
Таблица1 запись 2 (ббб) запись 3 (ввв) запись 1 (ааа) Таблица2 ааа - вапотвлаопт ааа - ваотмваотм ааа - ватвоатав ббб - валотволатп ббб - влатпотап ввв- влатплвоатп ввв -ваотпволапт Нужно сравнить данные в Таблице 1(т.е. сравнить чтобы не было совпадений, чтобы дважды ааа не встречалось или ввв).... Если вдруг такое происходит То таблица2 разруливает все это дело... допустим есть запись 1(ааа) и вдруг добавили запись 4(ааа) Имя полей одинаковое... тогда заходим в таблицу 2 и смотрим, а действительно ли запись 4 близнец записи1?! сравниваем количество записей.... т.е. Запись 1.Количество записей из 2 таблице= Записи2.Количество записей из 2 таблице ; если так то сравниваем уже не по количеству записей допустим, а по какому либо серийному номеру!!!!! |
|
07.12.2007, 15:40 | #5 |
Участник
|
А нельзя сделать справочник с первичным ключом из одного поля, позволить выбирать в другой таблице значение из этого справочника и пофиг, что там совпадает, что не совпадает - запись другая (значение первичного ключа другое) и все.
Если честно, то я и до сих пор не понял, зачем и что надо делать. Но уже вижу, что реализация должна была быть другой.. Не настолько рушащей мозг. |
|
07.12.2007, 15:52 | #6 |
Участник
|
Ромео... нет...мы не поняли друг друга...
надо всего лишь прочитать программный код и в нем все понятно!!!! у меня не работают : 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 |
Участник
|
Вот, что получилось у меня после того, как я привел код в структурированный и более читаемый вид
Код: 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.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 |
Участник
|
Я тоже ничего не понял, даже не дойдя до SETRANGE!
Что это за хитрые обозначения? SpecHeader – Т1; SpecHeader2 – Т2; SpecLine – З1; SpecLine2 – З2; Что б запутать классового врага? Если я правильно понял SpecHeader и SpecLine - это Record одной и тойже таблицы. Тогда SpecLine.SETRANGE("Production BOM No.",SpecHeader."No."); не имеет никакого смысла в данном случае А вот после этого: я начинаю думать, что Вы извращенец со склонностью к садизму! Уважайте читателей, пишите примеры словами, а не набором букв! |
|
10.12.2007, 16:44 | #9 |
Участник
|
извенаюсь за такой жаргон...буду исправляться!!!!
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 |
Участник
|
Поселдний программный код работает только в случае не более 4 записей в 27(как указал Romeo) таблице.....
По сути дело мне нужно удалять найденные идентичные комплекты!!!! |
|