Odpověď

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:
Předmět:
Ikona zprávy:

Ověření:
Kolik je šest plus čtyři (slovem):

Zkratky: stiskněte shift+alt+s pro odeslání nebo shift+alt+p pro prohlédnutí


Shrnutí tématu

Poslal: Stanislav Hruška
« 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.
Poslal: < z >
« 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 ;)
Poslal: Stanislav Hruška
« 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.  
Poslal: PetrB00
« 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)
Poslal: Stanislav Hruška
« 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.
Poslal: paja666
« kdy: 20-03-2017, 20:54:29 »

Poslal: Stanislav Hruška
« 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.
Poslal: KarelHorky
« 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.
Poslal: Stanislav Hruška
« 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.