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 :

Insérer EAN13 via trigger et procédure stockée


Sujet :

Firebird

  1. #1
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 135
    Points
    135
    Par défaut Insérer EAN13 via trigger et procédure stockée
    Bonjour à tous,

    Je souhaite insérer dans une table BARTEST composée des colonnes
    - BARCODE
    - NAME

    un BARCODE au format EAN13 calculé par la procédure ID2EAN13

    l'insertion étant effectuée par le trigger TRGBARTESTEAN au moment de la création de l'enregistrement

    lui même s'appuyant sur le générateur GENBARTESTEAN

    1/ (Vous ne m'en voudrez pas trop pour le choix des noms )
    2/ Est-ce possible ?
    > (la procédure stockée semble correcte par elle même)
    > FB version 2.5

    Voici le code :

    PS récupérée sur internet fonctionnement parait OK
    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
     
    SET TERM ^^ ;
    CREATE PROCEDURE ID2EAN13 (
      PREFIX  VARCHAR(2)
     ,ID      INTEGER
    ) RETURNS (
      BARCODE VARCHAR(13)
    )AS
      DECLARE VARIABLE N INTEGER;
    BEGIN
      BARCODE = PREFIX || LPAD(ID, 12 - CHAR_LENGTH(PREFIX), '0');
     
      N = (CAST (SUBSTRING (BARCODE FROM  2 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM  4 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM  6 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM  8 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM 10 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM 12 FOR 1) AS INTEGER)
          ) * 3+
           CAST (SUBSTRING (BARCODE FROM  1 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM  3 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM  5 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM  7 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM  9 FOR 1) AS INTEGER)+
           CAST (SUBSTRING (BARCODE FROM 11 FOR 1) AS INTEGER);
     
      N = MOD(N, 10);
      IF(N > 0)THEN N = 10 - N;
     
      BARCODE = BARCODE || CAST(N AS VARCHAR(20));
     
      SUSPEND;
    END
    ^^
    SET TERM ; ^^
    Générateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE GENERATOR GENBARTESTEAN ;
    SET GENERATOR GENBARTESTEAN TO 0 ;
    Trigger (syntaxe incorrecte / non accepté)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SET TERM ^^ ;
    CREATE TRIGGER TRGBARTESTEAN for BARTEST ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
        if (new.BARCODE is null) then
        new.BARCODE =   EXECUTE PROCEDURE ID2EAN13( '33', gen_id(GENBARTESTEAN, 1)) ;
    END
    ^^
    SET TERM ; ^^
    La création du trigger bloque sur le "EXECUTE" et j'imagine bien qu'il est possible de faire l'insertion telle que je la souhaite mais je ne vois pas comment...
    Merci par avance de vos réponses

    Question subsidiaire : comment mettre l'année (AA) à la place du préfixe ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    a mon avis c'est un SELECT FROM PROCEDURE qu'il faut mettre dans le Trigger (pas testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET TERM ^^ ;
    CREATE TRIGGER TRGBARTESTEAN FOR BARTEST ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
        IF (new.BARCODE IS NULL) then
        new.BARCODE =   SELECT BARCODE FROM PROCEDURE ID2EAN13( '33', gen_id(GENBARTESTEAN, 1)) ;
    END
    ^^
    SET TERM ; ^^
    pour ce qui est de AA , une petite extraction mâtinée d'un MOD sur la date courrante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MOD(EXTRACT(YEAR FROM CURRENT_DATE),10) FROM RDB$DATABASE;
    P.S. : on a affaire ici a un code barre EAN non standardisé ? (j'ai eu le même cas dans mon entreprise) cependant il faut savoir que normalement les non-standard commencent en général par '2' , j'ai eu de la chance le jour ou l'entreprise a voulu vendre certains articles via Amazon ces derniers commencaient justement par le bon préfixe (rien a voir avec le fait que c'était prévu , le 2 était le type d'article = FEMME , )
    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
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 135
    Points
    135
    Par défaut Select from procedure pas mieux
    Bonjour Sergio,

    Merci de ta réponse. Après tests le select from procedure ne donne pas de meilleurs résultats. Je suis cependant certain que cela doit être possible.
    Merci pour l'extraction de AA.

    Cordialement.
    Archie

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    méa culpa ! j'ai pensé Delphi et non PSQL

    là , j'ai pris le temps de créer une table, le génerateur , la procédure
    et de tester le trigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET TERM ^^ ;
    CREATE TRIGGER TRGBARTESTEAN FOR BARTEST ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
        IF (new.BARCODE IS NULL) then
          SELECT BARCODE FROM PROCEDURE ID2EAN13( '33',gen_id(GENBARTESTEAN, 1)) INTO :New.BARCODE ;
    END
    ^^
    SET TERM ; ^^
    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

  5. #5
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 135
    Points
    135
    Par défaut Trop fort Sergio
    Un grand merci tout d'abord.

    La création du trigger s'est bien passée.
    J'ai seulement eu à modifier légèrement le code ci-dessus en supprimant "PROCEDURE" et en mettant new.BARCODE (minuscules).
    (j'ai testé avec IBEASY et FLAMEROBIN)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SET TERM ^^ ;
    CREATE TRIGGER TRGBARTESTEAN FOR BARTEST ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
        IF (new.BARCODE IS NULL) then
          SELECT BARCODE FROM ID2EAN13( '33',gen_id(GENBARTESTEAN, 1)) into new.BARCODE ;
    END
    ^^
    SET TERM ; ^^
    Je me heurte toutefois actuellement à un message de la DB lorsque je veux faire l'insertion, dont je pense qu'il est dû à une utilisation d'une DB FB 1.5 sous FB 2.5

    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
     
    Executing...
    Error: *** IBPP::SQLException ***
    Context: Statement::Execute( INSERT INTO BARTEST (NAME)
     VALUES ('ANAME') )
    Message: isc_dsql_execute2 failed
     
    SQL Message : -802
    Arithmetic overflow or division by zero has occurred.
     
    Engine Code    : 335544321
    Engine Message :
    arithmetic exception, numeric overflow, or string truncation
    gds_$start_request failed
    password required
    Je vais recréer la seule table BARTEST sous FB 2.5 à fins de tests mais si quelqu'un a une idée entre temps je suis preneur. ;-)

    Archie

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Archibald29
    J'ai seulement eu à modifier légèrement le code ci-dessus en supprimant "PROCEDURE"
    oops , désolé , mauvaise copie (décidément)

    Quant à l'erreur , ça sent une valeur trop longue tout simplement . A contrôler la taille des champs de la table
    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

  7. #7
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 135
    Points
    135
    Par défaut Tout tout bon
    1/ Tout marche du premier coup en recréant une DB sous FB 2.5 et en créant procedure stockée, trigger, générateur puis en tentant quelques insertions.

    2/ Effectivement les codes barres sont destinés à de la gestion "interne".

    3/ Prochaine étape pour moi je mets l'année AA en préfixe du code barre....

    Archie

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Uruguay

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Archibald29 Voir le message
    Bonjour à tous,

    Je souhaite insérer dans une table BARTEST composée des colonnes
    - BARCODE
    - NAME

    un BARCODE au format EAN13 calculé par la procédure ID2EAN13
    s'il vous plaît marquer la bonne réponse

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    il n'y a pas de bonne réponse à proprement parler .
    la procédure du post 1 était bonne
    le trigger corrigé (en enlevant la partie barrée en rouge) du post 4 était bon (donc comme post 5)
    quant à l'erreur toujours du post 5 Archibald29 n'a pas dit comment il l'avait corrigé
    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

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Venezuela

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juin 2014
    Messages : 1
    Points : 0
    Points
    0
    Par défaut
    A guide to create EAN-13!

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    @derek054 Bienvenue sur les forums de developpez , cependant je regrette d'avoir à signaler que ta réponse n'a aucun rapport avec le sujet

    1-nous sommes dans une rubrique de Firebird , pas de Excel
    2-le problème était de gérer le code dans un trigger pas d'en créer un

    un code EAN13 n'est ni plus ni moins qu'un code numérique de 12 chiffres + un code de contrôle (checkdigit)
    après , si l'on veut appliquer la normalisation je suggère de lire l'article wiki ou carrément les ormes à ce sujet
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trigger et procédure stockée
    Par emespere dans le forum PL/SQL
    Réponses: 2
    Dernier message: 19/06/2007, 19h15
  2. trigger ou procédure stockée?
    Par iulius dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/03/2007, 15h19
  3. [SQL2005][débutant]Trigger ou procédure stockée
    Par DebutantDotNet dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/10/2006, 11h15
  4. création triggers et procédure stockées
    Par jhons dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/07/2006, 17h54
  5. Triggers et Procédures stockées
    Par agecanonix dans le forum Débuter
    Réponses: 3
    Dernier message: 21/01/2005, 10h16

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