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 ?