Autor Téma: Zoznam položiek zo Z1, ktoré nie sú v Z2  (Přečteno 410 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
Zoznam položiek zo Z1, ktoré nie sú v Z2
« kdy: 20-03-2017, 14:51:48 »
Potrebujem získať položky zo zoznamu 1, ktoré sa nenachádzajú v zozname 2. Sú to prebytočné záznamy v DB, ktoré potrebujem vymazať. Zoznam 2 môže obsahovať aj položky "navyše". Ako správne na to?
Viem si to vymyslieť, ale možno existuje nejaké "hotové riešenie".
Položiek môže byť, v jednom i druho zozname, maximálne 50. Zoznam 1 získam pomocou SQL a zoznam 2 si načítam z komponentov na formulári.

Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 6
    • Verze Delphi: 7, XE6
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #1 kdy: 20-03-2017, 15:23:32 »
Použiješ podmínku not in. Za not in dáš do závorky tvůj seznam hodnot Z2, oddělených čárkami:

select z1.* from z1 where z1.hodnota not in (seznamZ2)

Nic nepíšeš o typech hodnot, takže jen taková stručná rada.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #2 kdy: 20-03-2017, 15:26:45 »
Sú to primárne kľúče tabuľky. To budem môcť využiť priamo v SQL pre výmaz riadkov. Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline paja666

  • Nováček
  • *
  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: 10.1.2 Berlin
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #3 kdy: 20-03-2017, 20:54:29 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #4 kdy: 21-03-2017, 09:27:33 »
Nakoniec som si to vymyslel takto:

Z1 - zoznam ID z tabuľky FLATROOMS
Z2 - - zoznam ID z komponentov formulára
Vymaž záznam ak sa položka zo Z1 nenachádza v Z2.
Kód: Delphi [Vybrat]
  1.   for I := 0 to Z1.Count - 1 then
  2.   begin
  3.     if Z1[I] not in Z2 then
  4.       DeleteRoom(Z1[I]);  // procedure DeleteRoom(AID: Integer);
  5.   end
  6.  
  7.   myQry.ParamByName('IDFLATROOMS').AsInteger := AID;
  8.   DELETE FROM FLATROOMS WHERE FLATROOMS.IDFLATROOMS :IDFLATROOMS
  9.  
paja666: obrázok je pekný, ale nie je to to, čo potrebujem. Posledný riadok som nepoznal.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

PetrB00

  • Host
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #5 kdy: 21-03-2017, 11:10:28 »
když budeš mít dvě tabulky
Tab1 id,hodnota
Tab2 id,hodnota

tak duplicity z tab1 odstraníš třeba takto:
delete from Tab1
where exists (Select Tab2.id from Tab2 WHere tab2.Hodnota=tab1.Hodnota)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #6 kdy: 21-03-2017, 20:46:55 »
Nakoniec som to urobil hrubou silou
Kód: Delphi [Vybrat]
  1.   for I := 0 to FlstOriginalIDFlatRooms.Count - 1 do
  2.   begin
  3.     Found := False;
  4.  
  5.     for K := 0 to lstNewIDFlatRooms.Count - 1 do
  6.     begin
  7.       if FlstOriginalIDFlatRooms[I] = lstNewIDFlatRooms[K] then
  8.       begin
  9.         Found := True;
  10.         Break;
  11.       end;
  12.     end;
  13.  
  14.     if not Found then
  15.     begin
  16.       if DeleteIDFlatRooms = '' then
  17.         DeleteIDFlatRooms := '(' + IntToStr(FlstOriginalIDFlatRooms[I])
  18.       else
  19.         DeleteIDFlatRooms := DeleteIDFlatRooms + ',' + IntToStr(FlstOriginalIDFlatRooms[I]);
  20.     end;
  21.   end;
  22.  
  23.   if DeleteIDFlatRooms = '' then
  24.     Exit
  25.   else
  26.     DeleteIDFlatRooms := DeleteIDFlatRooms + ')';
  27.  
  28. //  FqryDeleteRooms.SQL.Text := 'DELETE FROM FLATROOMS WHERE FLATROOMS.IDFLATROOMS IN :IDFLATROOMS';
  29.   FqryDeleteRooms.ParamByName('IDFLATROOMS').AsString := DeleteIDFlatRooms;
  30.   FqryDeleteRooms.Transaction.StartTransaction;
  31.  
  32.   try
  33.     FqryDeleteRooms.ExecSQL;
  34. ...
  35.  
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1081
  • Karma: 36
    • Verze Delphi: 7, 2010
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #7 kdy: 21-03-2017, 20:53:20 »
Jasně, jde to udělat 1 jednoduchým SQL dotazem nebo 30 řádky kódu.

PS: v SQL můžeš použít JOIN, IN i EXISTS na řešení tvého problému se stejným výsledkem ;)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Zoznam položiek zo Z1, ktoré nie sú v Z2
« Odpověď #8 kdy: 21-03-2017, 21:02:49 »
Citace
PS: v SQL můžeš použít JOIN, IN i EXISTS na řešení tvého problému se stejným výsledkem
Tak to som nedokázal :-[  Poznámka o saniach v lete platí.
Zoznam existujúcich PK je samozrejme v DB tabuľke. Ale zoznam nových PK, v ktorom sa už niektoré pôvodné nemusia nachádzať, je skrytý vo formulári. Ale sú tam aj položky, kde je PK = 0. To sú nové záznamy.
Keď zoberiem do úvahy, že maximálnych teoretický počet cyklov je 5 * 10 * 10 = 500, tak sa to dá prežiť. Prakticky sa to bude pohybovať niekde medzi 150 - 200 cyklusmi.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: