IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Firebird Discussion :

Comment faire remonter une exception gérée au niveau de la base de données ?


Sujet :

Firebird

  1. #1
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut Comment faire remonter une exception gérée au niveau de la base de données ?
    Bonjour

    Voici un exemple d'une exception créée au niveau FB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHECK(DATE_PREVISIONELLE_REMISE>date_arret)
    L'application réagit très bien quand y'a un problème entre les deux dates et donne comme message ceci :
    Ouvrages à l'arrêt -- > SR CARMILA <Erreur
    Operation violates CHECK constraint on view or table TB_SR_ARRET
    At trigger 'CHECK_401'>
    Mais le message en lui même reste très flou et n'est pas explicite pour l’utilisateur final d'où ma question (peut-être assez stupide )

    comment intercepter cette exception et délivrer un message plus compréhensif à la place de Operation violates CHECK constraint on view or table TB_SR_ARRET ?

    Merci à vous pour toute idée ou suggestion.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    comment intercepter cette exception et délivrer un message plus compréhensif
    dans quel contexte, ISQL ou GUI Firebird (Flamerobin, IBExpert etc...) , dans une Procedure Firebird ou bien dans un programme ?

    en petit point, une contrainte peut être nommée différemment du nom par défaut ( CHECK_401 peut devenir DATEPREVERREUR)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 048
    Points
    19 048
    Par défaut
    Salut à tous.

    Je pense qu'il faut transformer une contrainte de type "check" en un déclencheur.
    Voici un petit exemple où je teste sur la colonne "val" par une contrainte "check" et sur la colonne "num" par le déclencheur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    CREATE DATABASE '..\..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- =========
    -- Exception
    -- =========
     
    create exception verif '''val'' compris entre 10 et 25 !';
     
    -- =====================
    -- création table "test"
    -- =====================
     
    create table test (
      id   integer generated by default as identity not null constraint pk primary key,
      val  decimal(15,2) constraint verif check (val between 10 and 25 and val is not null),
      num  integer not null
    );
     
    -- =======
    -- Trigger
    -- =======
     
    SET TERM #;
     
    CREATE TRIGGER verif
    FOR test ACTIVE
    BEFORE INSERT POSITION 0
    AS
    BEGIN
      IF (new.num not between 10 and 25) THEN exception verif;
    END#
     
    SET TERM ;#
     
    commit;
     
    -- =====================
    -- insertion dans 'test'
    -- =====================
     
    insert into test (val,num) values (15.0, 12);
    insert into test (val,num) values (33.0, 12);
    Statement failed, SQLSTATE = 23000
    Operation violates CHECK constraint VERIF on view or table TEST
    -At trigger 'CHECK_1'
    After line 41 in file Base.sql
    insert into test (val,num) values (12.0, 12);
    insert into test (val,num) values ( 6.0, 12);
    Statement failed, SQLSTATE = 23000
    Operation violates CHECK constraint VERIF on view or table TEST
    -At trigger 'CHECK_1'
    After line 43 in file Base.sql
    insert into test (val,num) values (20.0, 12);
     
     
    insert into test (val,num) values (12.0, 15);
    insert into test (val,num) values (12.0, 33);
    Statement failed, SQLSTATE = HY000
    exception 1
    -VERIF
    -'val' compris entre 10 et 25 !
    -At trigger 'VERIF' line: 6, col: 43
    After line 48 in file Base.sql
    insert into test (val,num) values (12.0, 12);
    insert into test (val,num) values (12.0, 6);
    Statement failed, SQLSTATE = HY000
    exception 1
    -VERIF
    -'val' compris entre 10 et 25 !
    -At trigger 'VERIF' line: 6, col: 43
    After line 50 in file Base.sql
    insert into test (val,num) values (12.0, 20);
     
    -- ================
    -- Vidage de 'test'
    -- ================
     
    select * from test;
     
              ID                   VAL          NUM
    ============ ===================== ============
               1                 15.00           12
               3                 12.00           12
               5                 20.00           12
               6                 12.00           15
               8                 12.00           12
              10                 12.00           20
     
     
    -- =====================
    -- Liste des contraintes
    -- =====================
     
    select  *
      from  RDB$RELATION_CONSTRAINTS
     where  RDB$RELATION_NAME = 'TEST';
     
    RDB$CONSTRAINT_NAME             RDB$CONSTRAINT_TYPE RDB$RELATION_NAME               RDB$DEFERRABLE RDB$INITIALLY_DEFERRED RDB$INDEX_NAME
    =============================== =================== =============================== ============== ====================== ===============================
    PK                              PRIMARY KEY         TEST                            NO             NO                     PK
    VERIF                           CHECK               TEST                            NO             NO                     <null>
    INTEG_1                         NOT NULL            TEST                            NO             NO                     <null>
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Par contre, ce que je ne sais pas faire, en terme de présentation, c'est supprimé le message d'anomalie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Statement failed, SQLSTATE = HY000
    exception 1
    -VERIF
    -'val' compris entre 10 et 25 !
    -At trigger 'VERIF' line: 6, col: 43
    After line 48 in file Base.sql
    qui se trouve autour de la ligne en rouge.

    J'aimerai connaitre l'avis de SergioMaster sur une autre approche que celle d'un trigger.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message

    dans quel contexte, ISQL ou GUI Firebird (Flamerobin, IBExpert etc...) , dans une Procedure Firebird ou bien dans un programme ?
    désolé je croyais que s'était clair (rire) ... c'est dans un programme codé en Delphi.

    Citation Envoyé par SergioMaster Voir le message

    en petit point, une contrainte peut être nommée différemment du nom par défaut ( CHECK_401 peut devenir DATEPREVERREUR)
    ça peut aider mais toujours pas assez explicite
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    @Artemus , je suis totalement d'accord avec ton approche Trigger (à ceci près qu'il manque le OR UPDATE) et c'est pour cela que j'avais demandé des précisions quant au contexte . Ceci étant, je pensais aussi à une possibilité de table pseudo système [CODEINLINE]TC$TEXTE(RDB$CONSTRAINT_NAME CHAR(31) NOT NULL ,MOTIF VARCHAR(80), CONTRAINT PK_CONTRAINTE PRIMARY KEY(RDB$CONSTRAINT))[/CODE] mais sans vraiment me pencher sérieusement dessus en attendant le contexte

    désolé je croyais que s'était clair (rire) ... c'est dans un programme codé en Delphi.
    ben non, justement et cela change la donne voire même le forum !
    reste encore en plus la précision des composants d'accès utilisés avec Delphi de la précision, de la précision et encore plus de précision

    rapidement pour Delphi (tu devras te contenter de cette réponse sur ce forum, mais c'est avec plaisir que je m'y étendrai sur une question posée dans le forum Delphi/Base de Données )
    tu as bien sûr la gestion d'erreurs (Try Except end mais aussi les évènements champs onValidate ou d'ensemble de données onBeforePost
    Donc il faut encore plus de .... (devine)

    à la relecture donc, dans l'autre forum
    N.B. je crois me souvenir que j'avais/m'étais déjà posé la question (et donc sur le forum) mais où ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 048
    Points
    19 048
    Par défaut
    Salut SergioMaster.

    Citation Envoyé par SergioMaster
    Ceci étant, je pensais aussi à une possibilité de table pseudo système TC$TEXTE(RDB$CONSTRAINT_NAME CHAR(31) NOT NULL ,MOTIF VARCHAR(80), CONTRAINT PK_CONTRAINTE PRIMARY KEY(RDB$CONSTRAINT)) mais sans vraiment me pencher sérieusement dessus en attendant le contexte
    Pourriez-vous développer cette idée, ce serait une bonne chose car je ne comprends pas trop l'astuce ?

    Je serai intéressé par l'affichage d'un message comme dans le cas de "signal" sous MySql mais sans avoir la fioriture comme dans le cas de l'exception (voir mon dernier message).

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ce n'était qu'une idée à creuser et pas (du moins je ne le pense pas) applicable à Firebird mais à l'applicatif (donc i.e le programme Delphi). Mon idée :
    dans le programme Delphi avec un peu d'astuce (expressions régulières), il serait facile de récupérer le nom de la contrainte et donc récupérer un texte plus explicite dans la table.

    En réfléchissant, au niveau de firebird, il faut savoir que tous les messages sont formatés (firebird.msg du moins pour les versions < 3)
    mes sources :
    la FAQ
    mes discussions :
    voir cette discussion, faute de temps (toujours pas à la retraite), je n'ai pas approfondi. Retrouver le message impliquant les Exceptions et le formater pour n'avoir que le texte semble du domaine du possible ?
    Reste que je n'ai toujours pas trouvé (ou du moins pas que je m'en souvienne) l'éditeur adéquat
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 755
    Points : 52 521
    Points
    52 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Je pense qu'il faut transformer une contrainte de type "check" en un déclencheur.
    Bonjour les performances !!!!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Bonjour les performances !!!!!!
    On est d'accord, mais il s'agit d'un contexte précis (ISQL) en général ce n'est pas dans ce genre d'outil que l'on a besoin de "surcharger" le(s) message(s)
    Dans une procédure on se contenterait de traiter les erreurs (WHEN ANY DO .....) .

    La question posée par Just-Soft ne l'a pas été au bon endroit puisque c'est en fait le programme devait se charger de la gestion de l'erreur. Et s'il a posé la question sur ce forum c'est parce que son programme ne traitant qu'une partie des erreurs et non la totalité il croyait que c'était du à Firebird
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Comment faire remonter une erreur dans couche superieure?
    Par OhKerod dans le forum Développement Windows
    Réponses: 3
    Dernier message: 10/01/2014, 10h05
  2. Réponses: 7
    Dernier message: 23/11/2011, 17h29
  3. comment faire suivre une exception?
    Par giova_fr dans le forum C#
    Réponses: 3
    Dernier message: 10/05/2010, 10h53
  4. Comment faire remonter des exceptions
    Par specsy dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 02/05/2008, 11h04
  5. Réponses: 2
    Dernier message: 28/08/2003, 00h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo