Autor Téma: TFDCommand - ošetrenie chýb. Takto?  (Přečteno 1358 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4445
  • Karma: 39
    • Verze Delphi: XE7 professional
TFDCommand - ošetrenie chýb. Takto?
« kdy: 27-05-2016, 08:33:00 »
V tomto prípade sú nasledujúce TFDCommand závislé na úspešnom vykonaní predchádzajúcich.
Vytvorenie Transaction
Kód: Delphi [Vybrat]
  1. function CreateCommand(AOwner: TComponent): TFDCommand;
  2. begin
  3.   Result := TFDCommand.Create(AOwner);
  4.   Result.Connection := dtmdBasic.conBasic;
  5.   Result.Transaction := dtmdBasic.trnBasic;
  6.   // kde
  7.   dtmdBasic.trnBasic.AutoCommit := False;
  8.   dtmdBasic.trnBasic.DisconnectAction := xdRollback;
  9. end;
  10.  
Vytvorenie TFDCommand
Kód: Delphi [Vybrat]
  1.   ...
  2.   Ncmd := CreateCommand(MyForm);
  3.   ...
  4.  
Použitie
Kód: Delphi [Vybrat]
  1. function TMyObject.CheckData: Boolean;
  2. begin
  3.   1cmd.ParamByName('xxx').AsInteger := IDxxx;
  4.   ...
  5.   Result := ExecuteCmd(1cmd);
  6.  
  7.   if Result then
  8.   begin
  9.     Ncmd.ParamByName('yyy').AsInteger := IDyyy;
  10.     ...
  11.     Result := ExecuteCmd(1cmd);
  12.   end;
  13.  
  14.   if Result then
  15.   begin
  16.     FFDTransaction.CommitRetaining;
  17.   end
  18.   else
  19.   begin
  20.     FFDTransaction.Rollback;
  21.   end;
  22. end;
  23.  
Predstava funkcie ExecuteCmd
Kód: Delphi [Vybrat]
  1. function ExecuteCmd(cmd: TFDCommand): Boolean;
  2. var
  3.   Text, sNote, sHelp: string;
  4. begin
  5.   Text := '';
  6.   sNote := '';
  7.  
  8.   try
  9.     cmd.Execute;
  10.   except // ešte nemám naštudované významy jednotlivých chýb.
  11.     on CmdAborted: ekCmdAborted do XXX;
  12.     on RecordLocked: ekRecordLocked do
  13.       begin
  14.         Text := 'Záznam je uzamknutý iným užívateľom';
  15.         sNote := 'Skúste to opäť neskôr';
  16.         sHelp := 'Zistite kto je na obede'
  17.       end;
  18.     on UKViolated: ekUKViolated do XXX;
  19.     on FKViolated: ekFKViolated do XXX;
  20.     on ServerGone: ekServerGone do XXX;
  21.     on ServerOutput: ekServerOutput do XXX;
  22.     on NoDataFound: ekNoDataFound do XXX;
  23.     on TooManyRows: ekTooManyRows do XXX;
  24.     on InvalidParams: ekInvalidParams do XXX;
  25.     on DatabaseError: EDatabaseError do XXX;
  26.     on UpdateError: EUpdateError do XXX; // class(DatabaseError)
  27.     on FDDBEngineException: EFDDBEngineException do Fault('');
  28.   end;
  29.  
  30.   if Text <> '' then
  31.   begin
  32.     // Tu použijem TMS MessageDialog, ktorý má rozšírené možnosti.
  33.     // Len symbolicky - ešte som s tým nepracoval. Len som si pozrel demo.
  34.     TMSMessageDialog.Text := Text;
  35.     TMSMessageDialog.Note := sNote;
  36.     // Prípadne
  37.     TMSMessageDialog.Help := sHelp;
  38.     Result := False;
  39.     // Zápis do log súboru
  40.       // Dátum
  41.       // Názov cmd
  42.       // Chybová hláška
  43.       // Kód chyby
  44.       // ...?
  45.   end
  46.   else
  47.     Result := True;
  48. end;
  49.  
Ako mi odporúčate riešiť log súbor?
  *.txt
  nejaká malá jednoduchá DB
  iné
« Poslední změna: 27-05-2016, 08:35:53 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4445
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:TFDCommand - ošetrenie chýb. Takto?
« Odpověď #1 kdy: 30-05-2017, 19:28:08 »
Na to raise ma už naviedli inde. Tu sa mi páči vnorenie ExecuteCommand; do ExecuteAllCommands; Porozmýšľam nad tým. Teraz používam
Kód: [Vybrat]
procedure Cosi;
begin
  StartTransaction;
  try
    Query1.ExecuteSQL;
    Query2.ExecuteSQL;
    ...
  except
    Rollback;
  end;
end;
a mám tu problém ošetriť jednotlivé výnimky podľa Queryn. Konkretizovať ich. Viem, že sa vyvolá len jediná.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.