Autor Téma: Table.Delete OK, Table.Post NIE  (Přečteno 1069 krát)

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #45 kdy: 22-10-2020, 10:39:23 »
Vidím, že ku kódu nemáš pripomienku, čo ma teší. 

Aby nedošlo k omylu.  Já se k němu pouze nevyjádřil ;)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5530
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #46 kdy: 22-10-2020, 11:39:52 »
To si ma nemohol nechať v mojej blaženej nevedomosti?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 120
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Table.Delete OK, Table.Post NIE
« Odpověď #47 kdy: 23-10-2020, 11:51:11 »
Transakce ztrácí smysl, pokud ukládáš jeden záznam do tabulky - tam víš, jestli se uložil nebo ne.
Kdyz vezmeme v uvahu izolaci, tak vv multitaskingovem/viceuzivatelskem prostredi maji vyznam i tak.

Bral jsem to na případ tabulky a editace jednoho záznamu - edit/post. Tam se právě projeví negativum - transakce se ti otevře při edit a ukončí až při post, takže přijdeš o to, že by měla být transakce co nejkratší.
Ale trvám na svém názoru, že ve víceuživatelském prostředí použití Table proti SQL nemají co dělat. Tabulku (memory) můžu použít jako dočasné úložiště dat jako alternativu třeba k objectlistu nebo jako podklad pro někoho, kdo se nedokáže rozloučit s dbAware komponentami, podklad pro cxGrid (QuantumGrid) atd.
Na konec vygeneruju ze změněných záznamů update, ten v transakci provedu a transakci ukončím.
Jako alternativa (lepší) je poslat změněné   nové záznamy do pomocné tabulky na SQL, následně zavolat uloženou proceduru, která to zpracuje, vše ověří a v transakci zapíše do několika tabulek.
Je s tím ale mnohem víc práce než to jen "naklikat".

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5530
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #48 kdy: 23-10-2020, 12:41:31 »
Citace
Tabulku (memory) můžu použít jako dočasné úložiště dat jako alternativu třeba k objectlistu nebo jako podklad pro někoho, kdo se nedokáže rozloučit s dbAware komponentami,
  • Prejsť na nie DB komponenty by bolo veľmi veľa roboty a písania kódu, ktorý už je v DB komponentách.
  • O TableMemory viem, ale či by som ju vedel použiť ako zdroj pre DataSource je otázne. Ale hlavne ako to je s aktualizáciou jej obsahu. Matne si pamätám, že sa s ňou dá pracovať ako s klasickou tabuľkou. Ale neviem aké tam sú obmedzenia. Nastáva čas na čítanie. Ak by realizácia pomocou TMemoryTale nebola komplikovaná, tak by som ju zvážil
Citace
Je s tím ale mnohem víc práce než to jen "naklikat".
To je u mňa dosť podstatný problém
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3071
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #49 kdy: 23-10-2020, 12:59:20 »
Ale trvám na svém názoru, že ve víceuživatelském prostředí použití Table proti SQL nemají co dělat.
Naprosty souhlas. Nikde jsem to nevidel pouzit. Kdyz uz prisla bida na kozaky, tak jsem jako docela rozumne reseni videl CDS a load/save v rucne rizenych txn.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5530
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #50 kdy: 23-10-2020, 13:26:48 »
Tak som si zbežne pozrel TFDMemTable a príslušenstvo. Nevyzerá to zle. Mám funkciu na generovanie SQL textu Into or Update z tabuľky.
Jediný väčší/prácnejší problém vidím v naplnení parametrov správnymi hodnotami. Neviem či sa to deje automaticky, ak použijem MemTable + DataSource.
Môžem tam, kde mám TFDTable bez problémov použiť/zmeniť na TFDMemTable?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 120
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Table.Delete OK, Table.Post NIE
« Odpověď #51 kdy: 25-10-2020, 12:00:37 »
Memory tabulka se používá třeba tak, že provedeš dotaz (Query) a data nakopíruješ do memory tabulky - obvykle funkce memorytabulka.CopyData(Query, [...]), které předáš Query a parametry co vše se má převzít - struktura, data atd. Pak query zavřeš a pracuješ offline do doby, než budeš chtít změny zapsat.
Pokud chceš občerstvit data, pak si zapamatuješ pozici (abys zůstal v gridu na místě), provedeš znovu načtení dat - query, CopyData a vrácení pozice. Tohle pohodlně zapouzdříš do volání obecné funkce a nemusíš se o to starat.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5530
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #52 kdy: 25-10-2020, 12:18:33 »
Hm, v návode som čosi čítal a Queries pre načítanie, update a insert. To si tu FierDAC nemôže vytvoriť automaticky, pretože nepozná tabuľku. Alebo si to pamätám zle.
To kopírovanie údajov dávajú všade. S tým by nemal byť problém.
Zmeny sa zapisujú .Post? Nie je potrebná predtým žiadna príprava?
Pozíciu si musím zapamätať kvôli tabuľke. Čiže PK záznamu. Nie kvôli mriežke, pretože nepoužíva DBGrid.
Ako funguje Locate()? Predpokladám, že si to si musím urobiť sám, nakoľko MemTable nepozná tabuľku.
.
Ďakujem za návod.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 120
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Table.Delete OK, Table.Post NIE
« Odpověď #53 kdy: 27-10-2020, 16:56:37 »
Ako funguje Locate()? Predpokladám, že si to si musím urobiť sám, nakoľko MemTable nepozná tabuľku.

Locate provádíš přímo nad memory tabulkou její metodou MemTable.Locate. Nebo možná nerozumím, co jsi chtěl říct tím, že memtable nezná tabulku...
Stejně tak si tam můžeš v případě potřeby vytvářet indexy, nová pole atd.

Pokud to chceš používat pro editaci, je třeba přidat další sloupec, do něj si zachytit změny (insert/update/delete) a při zápisu se s tím poprat a pomocí SQL příkazů to zapsat na server. V případě větších změn to celé přenést do pomocné tabulky na serveru a uloženou procedurou zapsat (transakce až v uložené proceduře těsně před vlastním zápisem).
Ale je to úplně jiný styl práce, než jak jsi pracoval dosud.