Bonjour,
Un petit cas d'école Sage, à adapter :
La gestion des informations libres dans les applications Sage 100 diffère des autres champs lors de
l’insertion (requête INSERT) d’un enregistrement.
En effet, lors de l’insertion d’un enregistrement, dans un premier temps les différents champs sont
insérés (requête INSERT) alors que les informations libres de la ligne sont ensuite mises à jour par
une requĂŞte UPDATE.
Par conséquent, la modification d’informations libres par l’intermédiaire d’un trigger n’est possible que
dans les conditions suivantes :
- le trigger doit s’exécuter lors de la mise à jour de l’enregistrement (trigger FOR UPDATE) ;
- un contrôle de la valeur courante de l’information libre (avant UPDATE) doit être effectué par
le trigger avant la mise à jour l’information libre. Dans le cas contraire, un appel récursif du
trigger se produira (UPDATE successifs déclenchés par le trigger).
Exemple : Stockage de l’utilisateur du domaine et de la date à laquelle une ligne de document à été
créée ou modifiée.
Sur une base de données Sage 100 Gestion Commerciale pour SQL Server, les informations libres
ligne de document suivantes doivent être créées :
- Utilisateur (texte de 50 caractères)
- Date_saisie (date)
- Code: Tout sélectionner
CREATE TRIGGER Trace_User ON F_DOCLIGNE
FOR UPDATE
AS
DECLARE @Utilisateur varchar(50) /* Info libre ligne Utilisateur (Texte de 50
caractères) */
DECLARE @Date_saisie smalldatetime /* Info libre ligne Date_saisie (Date) */
DECLARE @Date_saisieOld smalldatetime
/* Récupération de l'utilisateur du poste (dans le domaine NT) et de la date
courante : */
SELECT @Utilisateur = nt_username, @Date_saisie = getdate() FROM
master..sysprocesses WHERE spid=@@SPID
/* Récupération de l'ancienne date de saisie de la ligne modifiée (Date_saisieOld): */
SELECT @Date_saisieOld = DL.Date_saisie
FROM F_DOCLIGNE DL JOIN INSERTED INS
ON DL.CBMARQ = INS.CBMARQ
/* Mise Ă jour des infos libres Utilisateur et Date_saisie de la ligne si la
nouvelle Date_saisie
est différente de l'ancienne (Date_saisieOld) ou si l'ancienne n'est pas renseignée
(NULL) : */
IF @Date_saisieOld <> @Date_saisie OR @Date_saisieOld IS NULL
BEGIN
UPDATE DL SET DL.Utilisateur = @Utilisateur, DL.Date_saisie = @Date_saisie
FROM F_DOCLIGNE DL JOIN INSERTED INS
ON DL.CBMARQ = INS.CBMARQ
END
HTH,