Citat:
savkic:Handlovanje greške u OnPostError je u redu, s tim što ne preporučujem prikazivanje generičkog teksta (Unos nije uspeo). Treba staviti dovoljno informacija da se zna koja tabela je u pitanju i koji objekat (primarni, spoljni ključ, indeks), olakšava kasniju pomoć korisnicima.
Slažem se.
Kolekcija TADOConnection::Errors (nakon greške) u principu ima dovoljno podataka za informaciju korisniku šta se dogodilo.
Ali ipak, lično sam vremenom usvojio jedno možda ne baš najsrećnije rešenje sa stanovišta dobre prakse (jer tekst poruke nije obavezan da za sva vremena ostane onakav kakav je sada), ali ipak da ga pomenem. radi se o parsovanju E.Message.
// kod je Borland C++ Builder, ali je 100% VCL tako da ga necu prevoditi...
Code:
void __fastcall TDM::ManifestacijaADOTablePostError(TDataSet *DataSet,
EDatabaseError *E, TDataAction &Action)
{
Action = daAbort;
// ***********************************************************************
// PROVERA DA LI JE NESTO DUPLIRANO ...
// ***********************************************************************
if ( StrPos( E->Message.c_str(), "duplicate values" ) != NULL )
{
ShowMessage( "PODACI NISU IZMENJENI\n"
"Ne sme doći do dupliranja!" );
return;
}
if ( StrPos( E->Message.c_str(), "duplicate key" ) != NULL )
{
ShowMessage( "PODACI NISU IZMENJENI\n"
"Ne sme doći do dupliranja manifestacije!" );
return;
}
// ***********************************************************************
// PROVERA DA LI SU POLJA PRAZNA ...
// ***********************************************************************
if ( StrPos( E->Message.c_str(), "zero-length" ) ||
StrPos( E->Message.c_str(), "Null value" ) ||
StrPos( E->Message.c_str(), "must have a value" ) ||
StrPos( E->Message.c_str(), "Error in row" ) ||
StrPos( E->Message.c_str(), "not a valid date" ) ||
StrPos( E->Message.c_str(), "Datetime field overflow" ) ||
StrPos( E->Message.c_str(), "related record is required " ) ||
StrPos( E->Message.c_str(), "Empty row cannot be inserted" ) )
{
if ( StrPos( E->Message.c_str(), "Naziv" ) )
{
ShowMessage( "PODACI NISU IZMENJENI\n"
"Polje 'Naziv' ne može ostati prazno!" );
return;
}
// ITD
ShowMessage( "PODACI NISU IZMENJENI\n"
"Slog ne može biti prazan!\n\n" + E->Message );
return;
}
// ***********************************************************************
// AKO NIJE NI JEDNA OD PREDVIDJENIH GRESAKA ...
// ***********************************************************************
ShowMessage( "Nepoznata greska.\nMolimo zapišite je i javite Tehnickoj podršci.\n\n" + E->Message );
}