CREATE TRIGGER CIQPGMR4.CITSNKTIAA BEFORE INSERT ON CIQPGMR4.CITSNKP1
REFERENCING NEW AS NW FOR EACH ROW WHEN (NW.NOR8 = 0 OR NW.NOR8 IS NULL) SET NW.NOR8 = (SELECT MAX((IFNULL(NKP.NOR8, 0))+1) FROM CIQPGMR4.CITSNKP1 NKP WHERE NKP.CSOC = NW.CSOC ) ;
Le problème semble provenir de la requête de récupération "SELECT MAX((IFNULL(NKP.NOR8, 0))+1) ..."
Merci d'avance de votre retour si vous avez la solution à mon problème
un peu plus de détail sur l'erreur ce serait pas de refus
mais cette requête ne peut pas fonctionner s'il n'y a pas d'enregistrement dans CITSNKP1 WHERE NKP.CSOC = NW.CSOC, dans ces cas le select retourne NULL malgré l'IFNULL parceque ce dernier n'est pas exécuté ... parce-qu'aucun enregistrement n'est sélectionné
ça marcherai mieux comme ça
= IFNULL(SELECT MAX(NKP.NOR8, 0) FROM CIQPGMR4.CITSNKP1 NKP), 0) + 1
Merci de votre retour, effet j'ai fait la modification sur la requete SQL, ci-dessous plus d'information sur le message d'erreur lorsque je souhaite executer le script de création du trigger:
Code fournisseur : -628
Message : [SQL0628] Clauses incorrectes dans la même définition. Cause . . . . . : Les clauses indiquées pour définir les attributs d'une colonne, d'une fonction dérivée, d'une procédure, d'un déclencheur ou d'un index ne sont pas admises. L'une des erreurs suivantes s'est produite : - Plusieurs clauses FOR BIT DATA, FOR SBCS DATA, FOR MIXED DATA ou CCSID ont été indiquées pour une définition de colonne. - READ PERMISSION FS et WRITE PERMISSION BLOCKED ont été indiqués pour une colonne de type DATALINK. - READ PERMISSION DB et WRITE PERMISSION FS ont été indiqués pour une colonne de type DATALINK. - WRITE PERMISSION FS et la clause ON UNLINK ont été indiqués pour une colonne de type DATALINK. - INCLUDING ou EXCLUDING COLUMN DEFAULTS et USING TYPE DEFAULTS ont été indiqués pour une table. - Une clause a été indiquée alors qu'elle n'est pas admise lors de la création d'une fonction dérivée. -- Une clause RETURNS a été indiquée pour ALTER FUNCTION, mais la modification n'a pas indiqué REPLACE. -- AUTONOMOUS est spécifié pour une procédure et COMMIT ON RETURN ou DYNAMIC RESULT SETS avec une valeur autre que zéro est également spécifié. -- WITH RETURN est spécifié pour un curseur dans une instruction composée (dynamique). -- FOR EACH STATEMENT est indiqué pour un déclencheur BEFORE ou INSTEAD, ou est précisé avec MODE DB2ROW. - MODE DB2SQL est indiqué pour un déclencheur BEFORE et celui-ci contient une référence à une table de déclenchement. -- Une clause WHEN ou une liste de colonnes UPDATE est associée à un déclencheur INSTEAD OF. - Un nom de corrélation avec OLD ROW ou NEW ROW et un SET OPTION pour les options de date et d'heure ont été indiqués. -- Pour CREATE INDEX, la clause RCDFMT ne peut pas être indiquée si la clause INCLUDE est précisée. La clause INCLUDE requiert la clause ENCODED VECTOR. -- L'option définie dans SET OPTION DBGVIEW n'est pas cohérente par rapport à la valeur attribuée au mode débogage. -- L'option SET OPTION CONACC ne peut pas être indiquée avec l'option de routine CONCURRENT ACCESS RESOLUTION. -- L'option SET OPTION SYSTIME ne peut pas être indiquée avec l'option de routine SYSTEM_TIME SENSITIVE. Que faire . . . : Modifiez ou supprimez une clause pour que la définition soit admise. Renouvelez votre demande.
Je pense que le problème soit là:
MODE DB2SQL est indiqué pour un déclencheur BEFORE et celui-ci contient une référence à une table de déclenchement.
En anglais ce serait plûtot la table de déclenchement
MODE DB2SQL is specified for a BEFORE trigger and the trigger contains a reference to the trigger table.
Je crois qu'il va falloir trouver un autre moyen de calculer l'incrément
CREATE TRIGGER CIQPGMR4.CITSNKTIAA BEFORE INSERT ON CIQPGMR4.CITSNKP1 REFERENCING NEW ROW AS N FOR EACH ROW MODE DB2ROW SECURED WHEN(N.NOR8 = 0 OR N.NOR8 IS NULL) BEGIN SET N.NOR8 = IFNULL((SELECT MAX((IFNULL(NKP.NOR8, 0))) FROM CIQPGMR4.CITSNKP1 NKP WHERE NKP.CSOC = N.CSOC ), 0) + 1 ; END