Bonjour,
Je souhaite donner un numéro aux messages d'erreurs liée à la base de donnée.
Message
Violation of FOREIGN KEY constraint "FK_CLIENT" on table "CLIENT"
Foreign key references are present for the record.
Merci pour votre aide
Bonjour,
Je souhaite donner un numéro aux messages d'erreurs liée à la base de donnée.
Message
Violation of FOREIGN KEY constraint "FK_CLIENT" on table "CLIENT"
Foreign key references are present for the record.
Merci pour votre aide
Il me semble que la plupart du temps tu as un message remonté dans l'exception.
Je pense aussi, mais comment personnaliser chacun d'entre eux ?
Quelle SGBD , Quels composants sont utilisés ?
par exemple : Pour Firebird , avec les ZEOSDBO
- dans la BDD il est possible de créer des exceptions
couplée a un Trigger
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE EXCEPTION PAIEMENTANEPASSUPPRIMER 'Ne pas Supprimer : Affecté à une touche';
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SET TERM ^ ; ALTER TRIGGER PAIEMENT_DELETE ACTIVE BEFORE DELETE POSITION 0 AS BEGIN IF (OLD.TOUCHE>0) THEN EXCEPTION PAIEMENTANEPASSUPPRIMER; END^ SET TERM ; ^
Dans le programme on obtient alors un message d'erreur avec l'intitulé de l'exception mais , hélas , avec encore des informations inutiles pour l'utilisateur , du genre :
pour vraiment personnaliser le message , il va falloir passer par un gestionnaire d'exceptionSQL error 808
Ne pas Supprimer : Affecté à une touche
En utilisant certains composants d'accès aux données cela peut se faire facilement , pour d'autres , non
Avec ZeosDBO on a un event OnDeleteError donc c'est facile
prenons maintenant d'autres cas , toujours avec Zeos
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure TFormModePaiement.TPaiementDeleteError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin Main.MainMessage('Modes Paiement: Erreur','Ce "Code" est affecté a une Touche,'+ ' il ne peut être détruit'); Action:=daAbort; end;
sans Zeos il suffit d'encadrer le post par un try except end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure TFormModePaiement.TPaiementPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin with EZDatabaseError(E) do begin case ErrorCode of -625 : Main.MainMessage('Modes Paiement : Erreur Base de Données','La colonne "Code" doit avoir une valeur'); -803 : Main.MainMessage('Modes Paiement : Erreur Base de Données','Code déjà existant '+#13+#10+'Il ne peut y avoir deux Codes identiques'); else Main.MainMessage('Modes Paiement : Erreur Base de Données',E.Message,MM_ERREUR,MM_SEND); end; end; Action:=daAbort; end;
Mais cela ne sera pas forcément suffisant , par exemple dans le dernier code ZEOS , toutes les exceptions 'personnalisées' auront le même numéro d'erreur gênant . La solution , parser le message d'erreur (e.message) pour n'obtenir que la partie "personnelle" qui se trouve être la deuxième ligne (et les suivantes) , une petite manipulation de String et on y est ouf
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 try Post; except on E:EdatabaseError do begin // gerer les erreurs end; end;
Tout cela pour expliquer , que plus on aura d'indications , plus on répondra pertinemment à la question
J'ai pensé au try ... except
J'ai penser à numeroter les messages et faire par la suite un referentiel
Genre erreur 001 -> "Pas de connexion internet"
Si déjà on savait de Quelle SGBD et avec quels composants déjà demandé dans mon post
Ceci dit , le try...except est incontournable
Ok , bon IBTable n'est pas forcément ma tasse de thé , d'ailleurs on conseille de l'éviter pour Firebird 2.1 et + . Bon , en plus j'aurais du demander quelle version de Delphi pour faire bonne mesure
Donc pour la partie Firebird , j'ai déjà expliquer comment faire des Exceptions très personnalisées.
IBtable comme ZTable a un évènement OnPostError / onDeleteError donc
pour les codes d'erreurs IBErrorCode , je pense qu'il faut se référer a
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 procedure TForm1.IBTable1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin with IBDatabaseError(E) do begin case IBErrorCode of -625 : ShowMessage('la clé doit avoir une valeur'); -803 : ShowMessage('Clé déjà existante'); else showmessage('Erreur'+E.Message); end; end; Action:=daAbort; end;
ce lien pour 2.1
je n'ai pas trouvé celui de 2.5
pour plus de détail on peut aussi tester sur GDSCode à la place de IBerrorCode
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager