Page 1 sur 1

Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mer 4 Mar 2009 13:19
de lilibonome
Bonjour,
J'ai créé un trigger de contrôle sur la table F_DocEntete. Il fonctionne bien mais j'ai systématiquement le message "erreur SQL" suite au RaisError suivant :
Code: Tout sélectionner
RAISERROR("Indiquez le code affaire & la date livraison !",11,1)

quel que soit l'indice de sévérité choisi ( ici 11... ), il y a le message...
D'après SAGE, ce n'est pas possible autrement... est-ce que vous avez aussi cela dans vos triggers ou il y a-t-il une astuce ?
Merci de votre aide et félicitation pour ce super forum...

Ludovic

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mer 4 Mar 2009 14:24
de youn29n
Bonjour,

J'ai lu une discussion un peu plus bas dans le forum qui en parlait :

http://www.zoom.fr/phpBB2/message-d-information-depuis-trigger-t3854.html

Par contre sur ma version (15.53) la table F_Docentete est renseigné une première fois par le programme par un INSERT. Et ensuite les infos libres de type table et le Code affaire sont renseigné par des UPDATE.

En clair si je teste mon code affaire sur un trigger en INSERT, même si il est renseigné à la validation mon message se déclenche.
Il faut le faire en UPDATE pour contrôler la saisie d'un code affaire. Le soucis c'est que si il fait plusieurs UPDATE, ton message bien que non bloquant apparaitra 2-3 fois sur l'écran à chaque validation de l'entête.


Bonne fin de journée.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mer 4 Mar 2009 16:08
de lilibonome
Merci pour la réponse,
J'ai déja utilisé le code :
Code: Tout sélectionner
EXEC dbo.CB_SendMessage @@SPID, @alert

et effectivement, le souci est qu'il s'exécutera trop de fois... et je veux que le message soit bloquant...
Le truc que je n'aime pas c'est le "erreur SQL" qui suit mon message dans le RaisError...
d'autres idées ?

De plus, je dois contrôler aussi une information libre article au moment de l'insertion, mais à quel moment je peux le faire...c'est sur F_article mais en INSERT ca ne fonctionne pas parce que je ne peux plus aller sur l'onglet champs libres...

Ludovic

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 09:43
de mike677
Pour pouvoir envoyer un message bloquant à partir d'un trigger.
Il faut dans un premier temps créer un message dans la base :
Code: Tout sélectionner
exec sp_addmessage 80012,11, N'[b]Message[/b]', 'us_english'
exec sp_addmessage 80012,11, N'[b]Message[/b]', 'French'

Pour trouver le numéro de message il faut requeter sur la table master avec :
select * from sysmessages
Et trouver un numéro libre.

Dans le trigger, après le test de qui doit etre bloquant ecrire ceci :
Code: Tout sélectionner
RAISERROR(80012,11,1)  with seterror

Cela evite d'avoir le message "Erreur SQL"

Voila en esperant que cela aide.
J'ai utilisé ce principe pour bloquer une suppression dans les documents de vente.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 11:00
de lilibonome
J'ai fait exactement le test indiqué mais sans résultat. J'ai toujours le message ERREUR SQL ! qui suit mon message inscrit dans la table sysmessages...
Je joins ici un extrait du trigger remplacé selon les indications :
Code: Tout sélectionner
IF (@domaine = 0 AND @type = 0)
BEGIN
   IF (@codeaffaire = '' OR @datelivr= '') AND @status = 2
   BEGIN
      --RAISERROR('Indiquez le code affaire et la date livraison ou changez le status !',11,1)
      RAISERROR(80012,11,1) WITH SETERROR
      rollback transaction
      RETURN
   END
END


Pouvez-vous me confirmer que vous arrivez à ne pas avoir de message ERREUR SQL ?
Avez-vous le rollback transaction et le return à la suite du raiserror ?
Avez-vous le trigger complet afin que je puisse le tester ?

Un grand merci !

Ludovic

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 11:04
de mike677
Normalement il faut juste mettre le RAISERROR
sans le ROLLBACK et sans le return

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 11:12
de lilibonome
Si je ne mets pas le rollback j'ai le message (80012) qui s'affiche deux fois, suivi de ERREUR SQL !
Plus d'infos ?
Merci

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 11:45
de mike677
Pouvez-vous poster le trigger complet ?
Votre contrôle est sur des infos libres ?

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 13:42
de lilibonome
Voici le trigger, il contrôle l'entete de devis. Obligation d'entrer un code affaire et une date de livraison...


Code: Tout sélectionner
CREATE TRIGGER CTRLSTATE_UPD_F_DOCENTETE ON F_DOCENTETE FOR UPDATE  AS
SET NOCOUNT ON
BEGIN
DECLARE @codeaffaire char(12), @status int, @datelivr smalldatetime, @Msg char(255), @piece char(9)
DECLARE @domaine int, @type int
SELECT @status = DO_Statut, @codeaffaire = CA_Num,  @datelivr = DO_DateLivr, @piece = DO_Piece, @domaine = DO_Domaine, @type = DO_Type  FROM INSERTED
-- Cas des DEVIS
IF (@domaine = 0 AND @type = 0)
BEGIN
   IF (@codeaffaire = '' OR @datelivr= '') AND @status = 2
   BEGIN
      RAISERROR('Indiquez le code affaire & la date livraison ou changez le status !',11,1)
      --RAISERROR(80012,11,1) WITH SETERROR
      rollback transaction
      RETURN
   END
END
END

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 15:06
de mike677
Je viens de tester le trigger.
J'ai tracé les requetes envoyé à SQL Server.
Le problème vient du fait que le code affaire n'est pas envoyé dans la table Inserted il est toujours à blanc.
Je ne sais ni quand ni comment est ecrit ce param (CA_Num)
Si vous testez simplement sur la date cela fonctionne.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 15:55
de lilibonome
Qu'est-ce qui fonctionne exactement ? l'alerte ou le "non affichage" du message ERREUR SQL !...??
Parce qu'en faisant comme vous dites, c'est à dire en enlevant le CA_Num :
--------------------------------------------
Code: Tout sélectionner
IF (@datelivr= '') AND @status = 2
   BEGIN
      --RAISERROR('Indiquez le code affaire & la date livraison ou changez le status !',11,1)
      --RAISERROR('Indiquez la date livraison ou changez le status !',11,1)
      RAISERROR(80012,11,1) WITH SETERROR
      rollback transaction
      RETURN
END

--------------------------------------------
J'ai toujours le message ERREUR SQL !
Je précise bien que le trigger fait bien ce que je veux, c'est à dire empêcher d'avoir les champs code affaire et date livraison non saisis... mais je voudrais ne pas avoir le message ERREUR SQL ! qui suit le message envoyé par mon raiserror...

Merci

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 16:44
de mike677
Le message ne s'affiche que dans le cas ou je ne renseigne pas la date de livraison.
Je n'arrive pas à le faire fonctionner pour l'affaire
Le trigger est le suivant :

Code: Tout sélectionner
CREATE TRIGGER CTRLSTATE_UPD_F_DOCENTETE ON F_DOCENTETE FOR  update AS
SET NOCOUNT ON
BEGIN
   DECLARE @codeaffaire char(12), @status int, @datelivr smalldatetime, @Msg char(255), @piece char(9)
   DECLARE @domaine int, @type int
   SELECT @status = DO_Statut, @codeaffaire = CA_Num, @datelivr = DO_DateLivr, @piece = DO_Piece, @domaine = DO_Domaine, @type = DO_Type FROM INSERTED
   -- Cas des DEVIS
   IF (@domaine = 0 AND @type = 0)
      BEGIN
      IF isnull(@datelivr,'')= '' AND @status = 2
      BEGIN
      RAISERROR(80002,11,1) WITH SETERROR
      END
   END
END

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 17:19
de lilibonome
De mon côté le trigger fonctionne très bien...
Le seul souci que je rencontre c'est qu'après le raiserror qui m'affiche bien le message que j'ai inscrit dans sysmessages, il suit un autre message ERREUR SQL ! que je ne souhaiterai pas...

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 17:24
de mike677
Chez moi je n'arrive pas à tester l'affaire.
Par contre au niveau des messages cela fonctionne bien je n'ai pas ce fameux message "Erreur SQL"
Dernière tentative :
Essayer de changer le numéro du message et mettre le 80002. Juste pour voir si cela change quelque chose ?

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Lun 20 Avr 2009 19:02
de lilibonome
En fait dès que je prends un message de SAGE, je n'ai pas l'ERREUR SQL! qui suit...
Donc avec RaisError(80002,11,1), j'ai le message : Suppression impossible ! mais pas suivi de ERREUR SQL!
Je voudrai le même résultat mais avec un message personnalisé...

Pouvez-vous me confirmer que vous arrivez à faire afficher un RaisError personnalisé non suivi de ERREUR SQL ??

Merci

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mar 21 Avr 2009 10:33
de mike677
Si le RaiseError provoque le fameux message SQL c'est que le message que vous essayer de lancer n'est pas bon.
En l'occurence le 80012.
Avez-vous bien créer les messages comme dans la procédure que j'ai mise au début ?
Il faut verifier dans la base master si ce que vous avez avec :
Code: Tout sélectionner
select * from sysmessages where error = 80012

Vous devez avoir 2 lignes normalement.

Si vous essayer de mettre un message comme ceci :
Code: Tout sélectionner
RAISERROR('Indiquez la date livraison ou changez le status !',11,1)
, vous aurez toujours le message "Erreur SQL".
Il faut toujours appeler un numéro de message pour que ça fonctionne.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Jeu 30 Avr 2009 16:53
de charly54220
Bonjour,

j'ai également le meme message.
si je prends un code erreur existant, cela fonctionne
par contre si je crée un code erreur, mon message est suivi d'une erreur sql

si quelqu'un a réussi à trouver la solution

Merci

mike677 a écrit:Si le RaiseError provoque le fameux message SQL c'est que le message que vous essayer de lancer n'est pas bon.
En l'occurence le 80012.
Avez-vous bien créer les messages comme dans la procédure que j'ai mise au début ?
Il faut verifier dans la base master si ce que vous avez avec :
select * from sysmessages where error = 80012
Vous devez avoir 2 lignes normalement.

Si vous essayer de mettre un message comme ceci : "RAISERROR('Indiquez la date livraison ou changez le status !',11,1)", vous aurez toujours le message "Erreur SQL".
Il faut toujours appeler un numéro de message pour que ça fonctionne.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mar 5 Mai 2009 16:38
de jmz61
Désolé d'intervenir un peut tard, mais dans le contexte du test du code affaire dans la fenêtre principale de la pièce, j'ai déja constaté que la valeur qui y est insérérée n'est jamais pris en compte dans la table INSERTED.

"Exemple le champ code affaire (je ne veut pas le modifier mais vérifier qu'il contiens une valeur à la création)...

Le triger FOR INSERT me dira toujours qu'il est vide (si je le saisi dans l'écran principal de la commande...).
pour qu'il en accepte une valeur, il faut que je le saisisse par la fenêtre Infromations document !!!"


Pour infos...

Je croit que ce sujet à déja été abordé dans ce forum..

codialement.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mar 5 Mai 2009 17:14
de charly54220
lilibonome a écrit:En fait dès que je prends un message de SAGE, je n'ai pas l'ERREUR SQL! qui suit...
Donc avec RaisError(80002,11,1), j'ai le message : Suppression impossible ! mais pas suivi de ERREUR SQL!
Je voudrai le même résultat mais avec un message personnalisé...

Pouvez-vous me confirmer que vous arrivez à faire afficher un RaisError personnalisé non suivi de ERREUR SQL ??

Merci



Bonjour,

personne n'aurait d'explications sur ce message "ERREUR SQL"?

Merci

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mar 5 Mai 2009 17:19
de mike677
Reponse de SAGE :

Le second message renvoyé est tout à fait normal pour l’instant en SQL Server 2000.
C’est un principe de contrôle interne des applications Sage.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mar 5 Mai 2009 21:58
de charly54220
mike677 a écrit:Reponse de SAGE :

Le second message renvoyé est tout à fait normal pour l’instant en SQL Server 2000.
C’est un principe de contrôle interne des applications Sage.


Merci pour la réponse
On fera avec

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mar 21 Sep 2010 14:49
de JACKSON
Pour info, TRIGGER de contrôle du code affaire avec la petite astuce pour éviter le message d'erreur SQL
Code: Tout sélectionner
/*ci-joint le trigger mis à jour par rapport aux contraintes du mode personnalisé. Il est nécessaire de créer une information libre de type Texte sur les Entetes de document avec les paramètres suivants :


Intitulé : CtrlAffaire

 
Mode de calcul :
Si DocEntete.InfoLibValeur(1) = "" Alors

            Resultat = "Insert"

FinSi

*/


IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[AffaireDoc]'))
DROP TRIGGER [dbo].[AffaireDoc]
GO


Create trigger [dbo].[AffaireDoc] on [dbo].[F_DOCENTETE] for INSERT, UPDATE as
Set nocount on

-- Déclaration des variables

Declare @CA_Num NVarChar(13)
Declare @DO_Piece NVarChar (17)
Declare @DO_Domaine Int
Declare @DO_Type Int
Declare @MsgVente Nvarchar(255)
Declare @MsgAchat Nvarchar(255)
Declare @CtrlAffaire Nvarchar(10)
Declare @Ins Int
Declare @Del Int

--  Identification des valeurs à insérer
Select
   @CA_Num=Isnull(CA_NUM,''),
   @DO_Type=DO_Type,
   @DO_Piece=DO_Piece,
   @DO_Domaine=DO_Domaine,
   @CtrlAffaire=CtrlAffaire
From
   Inserted

Select @Del=Count(*) from Deleted

Select    @Ins=Count(*) from Inserted

Set @MsgVente='La saisie du code affaire est obligatoire pour un document de vente !'

Set @MsgAchat='La saisie du code affaire est obligatoire pour un document d''achat !'

--  Contrôle des documents de vente
--If Isnull(@CtrlAffaire,'')='Insert' begin
--Update F_docentete set CtrlAffaire='Modif' where do_type=@do_type and do_piece=@do_piece
--end

IF @CA_NUM='' and (@do_domaine=0) and (@DO_Type<=6) and Update(CtrlAffaire) and Isnull(@CtrlAffaire,'')='Insert'  Begin
   Raiserror(@MsgVente,16,1)
END

IF @CA_NUM='' and (@do_domaine=0) and (@DO_Type<=6) and Update(CA_Num) and Isnull(@CtrlAffaire,'')='Insert'  Begin
   Raiserror(@MsgVente,16,1)
END

--  Contrôle des documents d'achat
IF @CA_NUM='' and (@do_domaine=1) and (@DO_Type<=16) and Update(CtrlAffaire) and Isnull(@CtrlAffaire,'')='Insert' Begin
   Raiserror(@MsgAchat,16,1)
END

IF @CA_NUM='' and (@do_domaine=1) and (@DO_Type<=16) and Update(CA_Num) and Isnull(@CtrlAffaire,'')='Insert'  Begin
   Raiserror(@MsgVente,16,1)
END

GO


IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[AffaireLigne]'))
DROP TRIGGER [dbo].[AffaireLigne]
GO


Create trigger [dbo].[AffaireLigne] on [dbo].[F_DOCLigne] for INSERT as
Set nocount on

-- Déclaration des variables

Declare @CA_Num NVarChar(13)
Declare @DO_Piece NVarChar (17)
Declare @DO_Domaine Int
Declare @DO_Type Int
Declare @MsgVente Nvarchar(255)
Declare @MsgAchat Nvarchar(255)
Declare @Ins Int
Declare @Del Int

--  Identification des valeurs à insérer
Select
   @CA_Num=Isnull(CA_NUM,''),
   @DO_Type=DO_Type,
   @DO_Piece=DO_Piece,
   @DO_Domaine=DO_Domaine
From
   Inserted


Set @MsgVente='La saisie du code affaire est obligatoire pour un document de vente !'

Set @MsgAchat='La saisie du code affaire est obligatoire pour un document d''achat !'

--  Contrôle des documents de vente

IF @CA_NUM='' and (@do_domaine=0) and (@DO_Type<=6)  Begin
   Raiserror(@MsgVente,16,1)
END

--  Contrôle des documents d'achat
IF @CA_NUM='' and (@do_domaine=1) and (@DO_Type<=16) Begin
   Raiserror(@MsgAchat,16,1)
END
GO

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Ven 11 Avr 2014 14:42
de olivierPPC
Bonjour,

Gros déterrage.

J'essaie aussi d'envoyer un message via un trigger, mais j'ai aussi ce message "Erreur SQL".
Je ne comprends pas en quoi consiste l'astuce du précédent post.

merci.

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mar 23 Sep 2014 18:51
de ahmedTUNISIE
Bonjour est ce que il y à t-il une solution pour le message erreur sql ????????

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

MessagePosté: Mer 24 Sep 2014 08:05
de asr31
Bonjour,

La fonction RaiseError est une manière d'envoyer un message à partir de SQL Server vers l'interface cliente SAGE Compta ou gescom. On simule une erreur SQL, d'où le titre de le fenêtre qu'on ne sait pas modifier.

On doit pouvoir passer par la fonction SAGE CB_SendMessage mais celle-ci ne s'affiche sur l'interface client qu'au bon vouloir du raffraichissement de l'application SAGE.

Cordialement,