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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Table.Delete OK, Table.Post NIE
« Odpověď #30 kdy: 21-10-2020, 16:42:21 »

Samozrejme, že nemám. Ako som písal, tých záznamov mám v prevažnej väčšine málo. Rádovo v stovkách. To je vytvorené na základe tunajších diskusií. Už z princípu. Že o tom viem.
Citace
- režii vytváření seznamu
- hlídaní zda tento seznam patří k požadovanému Query
- režii  a hlídaní uvolnování seznamu
Prvé beriem
Druhé - to vlastne nemusím riešiť. Ak spúšťam viac Query naraz, tak majú vlastný zoznam. To je minimum prípadov. Ešte som s tým nemal problém
Tretie - Réžia toho zoznamu je nižšia, než získavanie polí z Query či tabuľky. Preto to odporúčali a používa sa to. Niektorým to celkom pomohlo. Query použijem a hneď záznam zničím. Tam kde som ho vytvoril. Žiaden problém.
.
Trošku k Tvojmu kódu. Viem, že to je len narýchlo urobený príklad. Nerozumiem niektorým veciam.
Kód: [Vybrat]
  VytvorCteciTransakci(IBTransactionV);
...
  if not Q1.Transaction.Active then       Q1.Transaction.StartTransaction;
Ja totiž nepredpokladám, že vytvoríš Transaction a zároveň ju spustíš.
.
Vytvoríš Q1, priradíš jej Database (čo ja nerobím) a nalseduje Q1.Close; Veď nebola otvorená.
Pýtam sa preto, aby som mal istotu, že o niečom neviem.
Nie je potrebné pred použitím FreeAndNil(IBTransactionV); ukončiť transakciu?
Viem, že pri FreeAndNil(Q1); sa zavolá udalosť Close.

W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #31 kdy: 21-10-2020, 18:11:57 »


Citace
Réžia toho zoznamu je nižšia, než získavanie polí z Query či tabuľky. Preto to odporúčali a používa sa to. Niektorým to celkom pomohlo.
To myslíš toto
https://delphi.cz/post/Pripad-FieldByName.aspx

Citace
Kód: [Vybrat]
  VytvorCteciTransakci(IBTransactionV);
...
  if not Q1.Transaction.Active then       Q1.Transaction.StartTransaction;

Ja totiž nepredpokladám, že vytvoríš Transaction a zároveň ju spustíš.

A proč ne ?

Citace
Nie je potrebné pred použitím FreeAndNil(IBTransactionV); ukončiť transakciu?
No puristicky pojato možná ano.   


Citace
Vytvoríš Q1, priradíš jej Database (čo ja nerobím) a nalseduje Q1.Close; Veď nebola otvorená.
Vycházím z toho že vytvářím instanci cizí komponenty a nevim jaký vychozí stav je zvolil autor komponenty (v této či další verzi dané komponenty)
Tak si zvolené údaje nastavím do požadovaného stavu než s nimi začnu pracovat.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Table.Delete OK, Table.Post NIE
« Odpověď #32 kdy: 21-10-2020, 18:22:03 »
Mám ešte jeden problém, ktorý neviem rozlúsknuť. Volám viacero Query a niektoré aj v cykle.
  • Ako mám vyriešiť tvorbu Transaction. Môže/musí byť len jedna. Jediné riešenie mi napadá pomocou premennej. Teraz priradím tú čo mám v DataModul-e.
  • Ničiť ju nemusím. Myslím si, že rozhodujúce je použiť Commit/RollBack. Alebo sa tu mýlim?

W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Table.Delete OK, Table.Post NIE
« Odpověď #33 kdy: 21-10-2020, 18:29:45 »
Citace
To myslíš toto
https://delphi.cz/post/Pripad-FieldByName.aspx
Áno, tam to je vysvetlené. A pár diskusií tu, kde to odporúčali a niektorí sa rozhodli upraviť kód.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #34 kdy: 21-10-2020, 19:04:08 »
Mám ešte jeden problém, ktorý neviem rozlúsknuť. Volám viacero Query a niektoré aj v cykle.
  • Ako mám vyriešiť tvorbu Transaction. Môže/musí byť len jedna. Jediné riešenie mi napadá pomocou premennej. Teraz priradím tú čo mám v DataModul-e.
  • Ničiť ju nemusím. Myslím si, že rozhodujúce je použiť Commit/RollBack. Alebo sa tu mýlim?

Pokud volám  více Query (nebo cokoliv jiného z databáze) a tvoří to logický celek tak si jednu transakci vytvořím před začátkem cyklu  použiji v celém  cyklu,  pak provedu commit a následně uvolním
Znovu doporučuji projít si knihu od Pavla Císaře

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #35 kdy: 21-10-2020, 19:10:11 »
Citace
To myslíš toto
https://delphi.cz/post/Pripad-FieldByName.aspx
Áno, tam to je vysvetlené. A pár diskusií tu, kde to odporúčali a niektorí sa rozhodli upraviť kód.
Můžeš poslat úryvek kodu jak to používáš ?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Table.Delete OK, Table.Post NIE
« Odpověď #36 kdy: 21-10-2020, 19:31:08 »
Jedna z možností. Nie sú tu vnorené cykly jednotlivých query.
Kód: [Vybrat]
procedure TFlatOwner.FillOtherTables;
var
  I: Integer;
begin
  try
    TFDFunction.QryOpen(FqryOwnerFlat, FlstfldOther);
    FqryHeatingCost_I.Params.ArraySize := FqryOwnerFlat.RecordCount;
    FqryBillingRestBefore_I.Params.ArraySize := FqryOwnerFlat.RecordCount;
    FqryOwnerFlat.ParamByName('FKFOCS').AsInteger := oGlobVar.IDFOC;
.
    for I := 0 to FqryOwnerFlat.RecordCount -1 do
    begin
      FqryHeatingCost_I.ParamByName('FKOWNER_FLAT').AsIntegers[I] := FlstIDOwnerFlat[I];
      FqryBillingRestBefore_I.ParamByName('FKOWNER_FLAT').AsIntegers[I] := FlstIDOwnerFlat[I];
      ....
      FqryOwnerFlat.Next;
    end;
.
    TFDFunction.QryExecute(FqryHeatingCost_I, esInsert, False);
    TFDFunction.QryExecute(FqryBillingRestBefore_I, esInsert, False);
  except //on E: Exception do
    raise;
  end;
end;
Ak má SVB 100 bytov, tak tých záznamov bude 100 + nejaká zmena vlastníkov počas roka. U nás v meste nepoznám SVB, ktoré by malo viac než 104 bytov.
Do tej knihy sa pozriem. Pomocou nej som sa učil FB.
« Poslední změna: 21-10-2020, 19:32:50 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 234
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Table.Delete OK, Table.Post NIE
« Odpověď #37 kdy: 21-10-2020, 20:03:55 »
Teraz to tak prerábam. Jirka v príklade stále vytvára a ničí transakcie. To ma zaskočilo. Ale ako písal, je tu 100 % istota.

Představ si transakci jako dávku příkazů - ukládáš údaje do více tabulek a potřebuješ, aby se buď uložily všechny nebo žádné. Nechceš, aby se ti něco uložilo do hlavičky a pak ti spadlo ukládání řádků a uložila se jich třeba jen polovina. Přesně k tomu je transakce - obalí ty příkazy a když vše projde, potvrdíš ji (commit) nebo vše vrátíš (rollback). Protože při zahájení transakce dojde k uzamknutí záznamů (při vkládání pak k uzamknutí dalšího vkládání - identity apod.), tak je ve tvém zájmu, aby vlastní transakce trvala co nejkratší dobu. Ve tvém případě na stisknutí uložení zapneš transakci, provedeš post do všech tabulek a potvrdíš transakci.
Transakce ztrácí smysl, pokud ukládáš jeden záznam do tabulky - tam víš, jestli se uložil nebo ne.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #38 kdy: 21-10-2020, 20:39:47 »
Transakce ztrácí smysl, pokud ukládáš jeden záznam do tabulky - tam víš, jestli se uložil nebo ne.
Tento výrok může být pro někoho matoucí
(už vidím jak Stano zajásal že transakce vlastně nepotřebuje když bude ukladat po jednom záznamu  ;) )
Ale prakticky  každé  napojení musí ve Firebirdu  běžet v nějaké transakci




Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #39 kdy: 21-10-2020, 21:39:19 »
Ty to máš změřené ?

A i kdyby to mělo mít nějaké vyznačné zrychlení  tak se to IMHO nevyplatí minimálně oproti
- režii vytváření seznamu
- hlídaní zda tento seznam patří k požadovanému Query
- režii  a hlídaní uvolnování seznamu
My jsme v dobach, kdy tam bylo tupe prochazeni cyklu jeste pred generiky a unicodifikaci Delphi doplnili index na jmena a jestli si to pamatuju, tak se to zrychlilo 4x - ta efektivita zalezi na nejakem strednim poctu poctu poli v aplikaci a co se s temi datasety dela. A kdyz zavedli ty hashovaci funkce, tak jsme to tady taky probirali a zjistilo se, ze jsou skutecne rychle, rychlejsi nez puleni intervalu

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #40 kdy: 21-10-2020, 21:40:47 »
FreeAndNil(MyQuery)
Aha, to mi nedoslo.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Table.Delete OK, Table.Post NIE
« Odpověď #41 kdy: 21-10-2020, 22:11:36 »
Transakce ztrácí smysl, pokud ukládáš jeden záznam do tabulky - tam víš, jestli se uložil nebo ne.
Tento výrok může být pro někoho matoucí
(už vidím jak Stano zajásal že transakce vlastně nepotřebuje když bude ukladat po jednom záznamu  ;) )
Ale prakticky  každé  napojení musí ve Firebirdu  běžet v nějaké transakci
Tak to nie. Práve som odložil knihu, takže viem (aj som vedel), že bez transakcie nedám ani ranu. Vidím, že ku kódu nemáš pripomienku, čo ma teší. Len tu upresním, že pri jednorázovom prístupe k DataSet-u (jeden záznam) zoznam polí nepoužívam. Až také kraviny nerobím.
.

To Fiala: tieto veci viem. V mojom kóde vždy vidíš v jednej funkcii StartTransaction a Commit/Rollback. Chcem tým povedať, že ak spustím transakciu, tak okamžite nasleduje dopyt na DB a okamžité ukončenie transakcie. Vždy to je najkratší čas aký je potrebný na transakciu. Nie je tam nič, čo nie je potrebné pre vykonanie "transakcie". Aj tak ďakujem za príspevok, lebo sa mi to lepšie uloží v pamäti. Ja som mal problém hlavne s úrovňou izolácie.
Citace
Transakce ztrácí smysl, pokud ukládáš jeden záznam do tabulky - tam víš, jestli se uložil nebo ne.
Tak to teda nevidím. Nepoužívam DBGrid ale VST. Ten aktualizujem hneď po Commit. Tak sa mi stalo, že som na formulári videl vo VST záznamy, ktoré v DB neexistovali :) Bol to pre mňa horor.
.
Tie zoznamy ponechám, lebo by to bolo veľa práce ich odstrániť. Pritom si nemyslím, žeby to malo nejaký praktický význam.
.
Ostáva mi vyriešiť otázku života Transaction ako takého (vytvorenie a zničenie). Tie v DataModule ponechám, lebo ich potrebujem v čase programovania - živé prepojenie DB komponentov s DB.
Teraz mám úlohu uviesť, najprv teoreticky, do praxe výrok "transakciu vytvorím pred začiatkom cyklu". Ako vidieť z môjho kódu, teraz ich priraďujem v NewQry. Potrebujem to premiestniť do OpenQry. Tým pádom to musím hrať na premennú/é, kde si tú transakciu uložím. Má to výhody:
  • môžem mať ReadOnly True i False zároveň
  • AutoOpen a spol True i False zároveň
  • stačí mi test Assigned(varTransaction)
Zas som si pokecal, ale to mi pomáha vo vyjasnení problému. A niekedy dostanem veľmi dobré rady. Nie všetky výlevy duše tu uverejňujem.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Table.Delete OK, Table.Post NIE
« Odpověď #42 kdy: 21-10-2020, 22:19:44 »
Citace
My jsme v dobach, kdy tam bylo tupe prochazeni cyklu jeste pred generiky a unicodifikaci Delphi doplnili index na jmena a jestli si to pamatuju, tak se to zrychlilo 4x - ta efektivita zalezi na nejakem strednim poctu poctu poli v aplikaci a co se s temi datasety dela.
Ja som raz, už zo zúfalstva, pridal do join prepojenie dvoch tabuliek, ktoré už boli prepojené nepriamo. Čas vykonania sa mi skrátil aspoň o dva rády. Dosť som na to čumel a zároveň som sa neskutočne potešil.
Tie hash-ovacie funkcie sú vo vzťahu k indexom?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #43 kdy: 22-10-2020, 07:33:33 »
Tie hash-ovacie funkcie sú vo vzťahu k indexom?
Tento typ hashovacich funkci (napr. narozdil od el. podepisovani dat) slouzi k namapovani hodnoty do klice, ktery slouzi primo jako index do datove struktury napr. Data[hashkey] a tim se obchazi hledani, at uz jakymkoli algoritmem a az na pripadne kolize klicu se nic neprohledava. Takze rychlostne je vypocetu hashe + cas na reseni kolizi vs. cas na vyhledani dat.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #44 kdy: 22-10-2020, 07:36:10 »
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.