Autor Téma: Dočasná tabuľka - ako ju riešiť?  (Přečteno 1434 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3460
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #15 kdy: 18-04-2018, 21:32:15 »
To som akosi tak predpokladal. Ale ako mám teraz nájsť chybu :'( :( ?
FqryI.Transaction.DataSetCount mi vráti 4. Takže by tam niečo malo byť. Aj keď som očakával podľa SELECT-U 10. Ale tých vrstiev mám viac. Idem všetky preveriť.
« Poslední změna: 18-04-2018, 21:34:39 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3460
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #16 kdy: 18-04-2018, 21:37:27 »
Jaj, DataSetCount nie je počet záznamov :-[
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1123
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #17 kdy: 18-04-2018, 21:41:43 »
Jaj, DataSetCount nie je počet záznamov :-[

Neni :) Nicmene kdyz uz jsme u RecordCount, dej si na nej pozor. Je rizen rezimem RecordCountMode ktery Ti s vychozim nastavenim nemusi vyhovovat.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 472
  • Karma: 36
    • Verze Delphi: 10.2
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #18 kdy: 18-04-2018, 22:13:47 »
To som akosi tak predpokladal. Ale ako mám teraz nájsť chybu :'( :( ?

Možná by pomohlo po dobu vývoje tu tabulku definovat ne jako dočasnou, ale jako klasickou, aby se dalo v db manageru na ty záznamy podívat.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3460
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #19 kdy: 18-04-2018, 22:24:27 »
Nad tým tuho rozmýšľam. Zmenil som Isolation na xiDirty a Table.FetchOptions.RecordCountMode := cmTotal; Aj tak mám 0. Pokračujem zajtra.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1123
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #20 kdy: 19-04-2018, 07:59:32 »
Nad tým tuho rozmýšľam. Zmenil som Isolation na xiDirty a Table.FetchOptions.RecordCountMode := cmTotal; Aj tak mám 0. Pokračujem zajtra.

Pokud sis nadefinoval tu tabulku s ON COMMIT DELETE ROWS tak je uplne jedno jakou pouzijes izolacni uroven transakce. Po jejim "commitu" (resp. zmene stavu) se data smazou. Ty data zkratka existuji jen v ramci jedne transakce (a ji vnorenych).

Z pohledu FireDAC jednoduse pouzij stejny transakcni objekt (linkuj property Transaction na stejny objekt vsem query objektum ve kterych se chces k datum dostat).
« Poslední změna: 19-04-2018, 08:23:56 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3460
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #21 kdy: 19-04-2018, 08:19:24 »
Citace
Z pohledu FireDAC jednoduse pouzij stejny transakcni objekt (linkuj stejnou Transaction pro query objekty ve kterych se chces k datum dostat).
Tu som robil chybu. Poplietlo ma to, že sme v diskusii konštatovali, že mám mať pre GTT samostatnú transakciu :D  V noci sa mi to vyjasnilo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1123
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #22 kdy: 19-04-2018, 08:34:24 »
Citace
Z pohledu FireDAC jednoduse pouzij stejny transakcni objekt (linkuj stejnou Transaction pro query objekty ve kterych se chces k datum dostat).
Tu som robil chybu. Poplietlo ma to, že sme v diskusii konštatovali, že mám mať pre GTT samostatnú transakciu :D  V noci sa mi to vyjasnilo.

Nevim co konkretne delas, ale mel jsi obavy ze se Ti data budou "bit" (tak jsem si tu poznamku alespon vysvetlil):

Tak to si musím pre túto úlohu vytvoriť samostatnú transakciu. Aby sa mi to nebilo s ostatnými.

Coz se dit samozrejme muze. Kdybys napr. potreboval dve separatni sady dat, vytvoril bys dva separatni transakcni objekty (TFDTransaction). Pokud bys chtel jednu sadu, pouzijes jeden transakcni objekt.
« Poslední změna: 19-04-2018, 08:52:16 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3460
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #23 kdy: 19-04-2018, 21:09:15 »
Len dopĺňam, že transakcia sa môže spustiť len jediný raz. Na to som zabudol, a dalo mi to poriadne zabrať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1123
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Dočasná tabuľka - ako ju riešiť?
« Odpověď #24 kdy: 20-04-2018, 08:04:57 »
Len dopĺňam, že transakcia sa môže spustiť len jediný raz. Na to som zabudol, a dalo mi to poriadne zabrať.

Ano. Transakce je unikatni instance objektu ohranicujici davku prikazu v DBMS. A jako takova muze byt spustena (resp. vytvorena) jen jednou. Pomoci transakcniho objektu FireDAC (TFDTransaction) muzes vytvaret transakce opakovane, ale pujde vzdy o unikatni instance (tudiz z pohledu dat GTT definovane s ON COMMIT DELETE ROWS o separatni kontejner). Pokud ovsem nepujde o transakci vnorenou (vnorena transakce bude mit pristup k datum GTT, jedna-li se o stejny transakcni objekt FireDAC), tzn. v nasledujicim pripade lze sdilet data GTT mezi dvema query objekty:

Kód: Delphi [Vybrat]
  1. FDQuery1.Transaction := FDTransaction1; // ← stejny transakcni objekt prirazen dvema ruznym query objektum
  2. FDQuery2.Transaction := FDTransaction1; // ← stejny transakcni objekt prirazen dvema ruznym query objektum
  3.  
  4. FDQuery1.Transaction.StartTransaction; // ← start vnejsi transakce
  5. try
  6.   FDQuery1.SQL.Text := 'INSERT INTO MyTempTable (TheInteger) VALUES (123)';
  7.   FDQuery1.ExecSQL;
  8.  
  9.   FDQuery2.Transaction.StartTransaction; // ← start vnorene transakce
  10.   try
  11.     FDQuery2.SQL.Text := 'SELECT TheInteger FROM MyTempTable';
  12.     FDQuery2.Open;
  13.     Assert(FDQuery2.FieldByName('TheInteger').AsInteger = 123, 'GTT read failed!'); // data lze precist
  14.     FDQuery2.Transaction.Commit;
  15.   except
  16.     FDQuery2.Transaction.Rollback;
  17.     raise;
  18.   end;
  19.  
  20.   FDQuery1.Transaction.Commit;
  21. except
  22.   FDQuery1.Transaction.Rollback;
  23.   raise;
  24. end;

Zatimco v pripade pouziti ruznych transakcnich objektu ne:

Kód: Delphi [Vybrat]
  1. FDQuery1.Transaction := FDTransaction1; // ← tento query objekt ma svuj vlastni transakcni objekt
  2. FDQuery2.Transaction := FDTransaction2; // ← tento query objekt ma svuj vlastni transakcni objekt
  3.  
  4. FDQuery1.Transaction.StartTransaction; // ← start transakce
  5. try
  6.   FDQuery1.SQL.Text := 'INSERT INTO MyTempTable (TheInteger) VALUES (123)';
  7.   FDQuery1.ExecSQL;
  8.  
  9.   FDQuery2.Transaction.StartTransaction; // ← start transakce
  10.   try
  11.     FDQuery2.SQL.Text := 'SELECT TheInteger FROM MyTempTable';
  12.     FDQuery2.Open;
  13.     Assert(FDQuery2.FieldByName('TheInteger').AsInteger = 123, 'GTT read failed!'); // data nelze precist
  14.     FDQuery2.Transaction.Commit;
  15.   except
  16.     FDQuery2.Transaction.Rollback;
  17.     raise;
  18.   end;
  19.  
  20.   FDQuery1.Transaction.Commit;
  21. except
  22.   FDQuery1.Transaction.Rollback;
  23.   raise;
  24. end;
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

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í:
Kolik je šest plus čtyři (slovem):