Trigger : Gestion commerciale / RAISERROR : erreur SQL

Cette section est consacrée aux développements d'applications interfacées avec les logiciels Sage.

Modérateurs: Super-Apogea, Super Modérateur

Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Mer 4 Mar 2009 13:19

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
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de youn29n » Mer 4 Mar 2009 14:24

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.
Posteur habitué
Posteur habitué
 
Messages: 20
Inscription: Jeu 13 Nov 2008 10:33

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Mer 4 Mar 2009 16:08

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
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Lun 20 Avr 2009 09:43

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.
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Lun 20 Avr 2009 11:00

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
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Lun 20 Avr 2009 11:04

Normalement il faut juste mettre le RAISERROR
sans le ROLLBACK et sans le return
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Lun 20 Avr 2009 11:12

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
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Lun 20 Avr 2009 11:45

Pouvez-vous poster le trigger complet ?
Votre contrôle est sur des infos libres ?
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Lun 20 Avr 2009 13:42

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
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Lun 20 Avr 2009 15:06

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.
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Lun 20 Avr 2009 15:55

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
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Lun 20 Avr 2009 16:44

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
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Lun 20 Avr 2009 17:19

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...
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Lun 20 Avr 2009 17:24

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 ?
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de lilibonome » Lun 20 Avr 2009 19:02

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
Posteur néophyte
Posteur néophyte
 
Messages: 12
Inscription: Mer 4 Mar 2009 11:10

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Mar 21 Avr 2009 10:33

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.
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de charly54220 » Jeu 30 Avr 2009 16:53

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.
Contributeur
Contributeur
 
Messages: 52
Inscription: Jeu 27 Sep 2007 16:23

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de jmz61 » Mar 5 Mai 2009 16:38

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.
Posteur néophyte
Posteur néophyte
 
Messages: 4
Inscription: Mar 10 Mar 2009 13:13
Localisation: Grenoble

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de charly54220 » Mar 5 Mai 2009 17:14

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
Contributeur
Contributeur
 
Messages: 52
Inscription: Jeu 27 Sep 2007 16:23

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de mike677 » Mar 5 Mai 2009 17:19

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.
Posteur néophyte
Posteur néophyte
 
Messages: 8
Inscription: Lun 20 Avr 2009 08:57

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de charly54220 » Mar 5 Mai 2009 21:58

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
Contributeur
Contributeur
 
Messages: 52
Inscription: Jeu 27 Sep 2007 16:23

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de JACKSON » Mar 21 Sep 2010 14:49

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
Posteur néophyte
Posteur néophyte
 
Messages: 13
Inscription: Mer 25 Aoû 2010 10:46

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de olivierPPC » Ven 11 Avr 2014 14:42

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.
Posteur néophyte
Posteur néophyte
 
Messages: 1
Inscription: Ven 11 Avr 2014 14:40

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de ahmedTUNISIE » Mar 23 Sep 2014 18:51

Bonjour est ce que il y à t-il une solution pour le message erreur sql ????????
Posteur néophyte
Posteur néophyte
 
Messages: 6
Inscription: Mar 23 Sep 2014 18:43

Re: Trigger : Gestion commerciale / RAISERROR : erreur SQL

de asr31 » Mer 24 Sep 2014 08:05

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,
ASR31

En recherche de missions.
Avatar de l’utilisateur
Super Contributeur
Super Contributeur
 
Messages: 2975
Inscription: Mer 13 Fév 2008 15:31
Localisation: TOULOUSE


Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité