Newsgroup: it.comp.lang.delphi
Titolo: Trapping database error BDE

Ciao,
qualcuno mi sa spiegare come gestire le eccezioni sollevate gestendo
inserimenti, update, delete,... in un record ?
Mi pare di utilizzare correttamente gli eventi...
Ad esempio OnPostError di TTable, controllando il codice di errore ottenuto,
(ad esempio per una KeyViolation durante un inserimento) e gestendo l'errore
nella maniera piů semplice con un Abort...
E' quanto viene spiegato anche in un demo di Delphi 4, il project DBError...
Solamente che quando si verifica un errore, il gestore viene chiamato
correttamente, solo che poi il sistema resta impallato...
Boh ?!...

 wrote in message
7L1f4.30868$I3.3...@news.infostrada.it...

io uso try except e finally in genere va tutto fuorchč l'uso del debug
ciao max

 nella maniera più semplice con un Abort...
Ciao, nell'OnPostError prova a fare così:
if (E is EDBEngineError) then
with (E as EDBEngineError) do
if (Errors[0].ErrorCode = DBIERR_KEYVIOL) then action:=daAbort;
vedi il file bde.lib per gli altri codici di errori...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply
Ps: il codice non è merito mio, mi aiutò il sempre gentilissimo Cosimo
Laddomada quando ebbi lo stesso problema. :-)

 vedi il file bde.lib per gli altri codici di errori...
Grazie,... loavevo fatto solo che il mio problema stava.... nello "Stop on
Exception" del debugger di delphi... Ci ho messo un po' a capirlo! ;-)
Dove si trova il file bde.lib ?
Io ho Delphi 4,... In un demos (dberror) indica che gli altri codici di
errore sono in un file IDAPI.H ..io pero' non ne ho traccia...

 errore sono in un file IDAPI.H ..io pero' non ne ho traccia...
Dovrebbe essere sul Cd di Delphi...
Adesso che lo leggo trovo anch'io questa nota:
***
  A complete listing of the database errorcodes is found in the
  DBIErrs.Int file in the Delphi/Doc directory or in the IDAPI.h
  file in the Borland Database Engine.
***
percui penso che troveremmo tutto nell'header delle API del BDE ... penso
che anche quel file si trovi sul CD di Delphi ma non l'ho sottomano in
questo momento...


 questo momento...
A dire il vero... io non sono stato abbastanza fortunato... ;-((
Non ho trovato nulla... neppure sul cd... che tra l'altro è originale! ;-)

 Non ho trovato nulla... neppure sul cd... che tra l'altro è originale! ;-)
Ciao,
            guarda sono abbastanza perplesso anch'io perchè nemmeno io sono
riuscito a recuperarlo...
Ne ho una copia nella mia raccolta di procedure e, visto che sembra
interessarti parecchio, te la copio-incollo qua sotto:
Nota: includi la unit bde per altri codici (cfr. bde.lib)
----
(*
  This example represents a sampling of the way that you might
  approach trapping a number of database errors.
  A complete listing of the database errorcodes is found in the
  DBIErrs.Int file in the Delphi/Doc directory or in the IDAPI.h
  file in the Borland Database Engine.
  Database errors are defined by category and code. Here's a sample:
{ ERRCAT_INTEGRITY }
  ERRCODE_KEYVIOL               = 1;  { Key violation }
  ERRCODE_MINVALERR             = 2;  { Min val check failed }
  ERRCODE_MAXVALERR             = 3;  { Max val check failed }
  ERRCODE_REQDERR               = 4;  { Field value required }
  ERRCODE_FORIEGNKEYERR         = 5;  { Master record missing }
  ERRCODE_DETAILRECORDSEXIST    = 6;  { Cannot MODIFY or DELETE this Master
record }
  ERRCODE_MASTERTBLLEVEL        = 7;  { Master Table Level is incorrect }
  ERRCODE_LOOKUPTABLEERR        = 8;  { Field value out of lookup tbl
range }
  ERRCODE_LOOKUPTBLOPENERR      = 9;  { Lookup Table Open failed }
  ERRCODE_DETAILTBLOPENERR      = 10; { 0x0a Detail Table Open failed }
  ERRCODE_MASTERTBLOPENERR      = 11; { 0x0b Master Table Open failed }
  ERRCODE_FIELDISBLANK          = 12; { 0x0c Field is blank }
  The constant for the base category is added to these constants to
represent
  a unique DBI errorcode;
  DBIERR_KEYVIOL  = (ERRBASE_INTEGRITY + ERRCODE_KEYVIOL);
  DBIERR_REQDERR = (ERRBASE_INTEGRITY + ERRCODE_REQDERR);
  DBIERR_DETAILRECORDSEXIST = (ERRBASE_INTEGRITY +
ERRCODE_DETAILRECORDSEXIST);
  DBIERR_FORIEGNKEYERR = (ERRBASE_INTEGRITY + ERRCODE_FORIEGNKEYERR);
  The ERRBASE_INTEGRITY value is $2600 (Hex 2600) or 9728 decimal.
  Thus, for example, the errorcode for keyviol is 9729
                                   for master with details is 9734.
  *)
---
Per il file idapi.h, visto che è un header del C, potrebbe essere che venga
distribuito con C++Builder...
Cmq penso che sia reperibile sul sito Borland...
