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

  1. #1
    Membre émérite
    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

    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)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    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
    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

    Ce message n'a pas pu être affiché car il comporte des erreurs.
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Expert éminent sénior
    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

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  8. #8
    Rédacteur

    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 +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Rédacteur/Modérateur

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

###raw>template_hook.ano_emploi###