PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → TRIGGER - Insert impossible
TRIGGER - Insert impossible
Iniciado por François BOULIER, 30,sep. 2019 13:18 - 10 respuestas
Miembro registrado
6 mensajes
Publicado el 30,septiembre 2019 - 13:18
Bonjour, j'ai un problème à vous soumettre.
Mon application gère des dossiers contenant des documents.
Un dossier à un type et chaque type de dossier contient des documents.
Mon analyse est la suivante






Je souhaite par un trigger créer automatiquement les documents dés qu'un dossier est créé.
Le trigger est déclenché après insertion dans la table TYPE_DOSSIER
Ci dessous le code :

// Rattachement de l'ensemble des pièces du type de dossier
lReq est une Source dede Données
lSql est une chaîne
lIdEnreg est un entier

lIdEnreg=MonFichier.tdos_id

lSql =[
INSERT INTO PIECE_DOSSIER (DOS_ID, PIE_ID)
SELECT %1, TYPE_PIECE.TPIE_ID FROM TYPE_PIECE
]

lSql = ChaîneConstruit(lSql, lIdEnreg)
HExécuteRequêteSQL(lReq,hRequêteDéfaut,lSql)
HLibèreRequête(lReq)


Ce code ne marche pas et je ne comprends pas pourquoi.
Par avance merci pour votre aide.

François
Mensaje modificado, 30,septiembre 2019 - 13:21
Miembro registrado
160 mensajes
Publicado el 30,septiembre 2019 - 14:13
INSERT INTO PIECE_DOSSIER (DOS_ID, PIE_ID) **VALUES**
SELECT %1, TYPE_PIECE.TPIE_ID FROM TYPE_PIECE

Il manque 'Values' je crois
Miembro registrado
2.682 mensajes
Publicado el 30,septiembre 2019 - 14:47
Bonjour,

Il manque 'Values' je crois

Non il ne manque pas de values.

@François BOULIER
As-tu un message d'erreur à nous communiquer car là à part la boule de cristal il ne reste pas grand chose...

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
69 mensajes
Publicado el 30,septiembre 2019 - 15:12
Bonjour François,

Pour facilité les tests, je te conseille d'utiliser un hajoute() qui sera plus bavard lors de son retour d'erreur.

J'ai aussi un doute sur la possibilité d'utilisation de HDécritTrigger avec un INSERT sur un HF classic.

Bon développement
Miembro registrado
6 mensajes
Publicado el 30,septiembre 2019 - 22:23
Bonjour freak per et merci pour ton aide

J'ai essayé de rajouter VALUES mais sans succès
A noter que ce code fonctionne bien lorsqu'il est placé dans une procédure locale d'une fenêtre de mon application WINDEV 24
Mais par conter dans la procédure stockée de mon trigger, il ne fonctionne pas.

CI dessous la trace d'erreur

Erreur à la ligne 17 du traitement Procédure locale CréerTypeDossier.
Vous avez appelé la fonction HExécuteRequêteSQL.
Erreur renvoyée par le serveur <:4900> :
Une erreur WLangage s'est produite pendant l'exécution de la procédure stockée <psWD_NOTFORGET.pTypeDossierCreer>.

----- Informations techniques -----

Projet : NOTFORGET

Appel WL :
Traitement de 'Procédure locale CréerTypeDossier' (FEN_MAIN.PROCEDURE.CréerTypeDossier), ligne 17
Fonction 'HExécuteRequêteSQL', syntaxe 9

Que s'est-il passé ?
Erreur renvoyée par le serveur <:4900> :
Une erreur WLangage s'est produite pendant l'exécution de la procédure stockée <psWD_NOTFORGET.pTypeDossierCreer>.

Code erreur : 75003
Niveau : erreur non fatale
Code erreur WD55 : 5003

Dump de l'erreur du module 'WDHFSRV64.DLL' (24.0.50.1).
Identifiant des informations détaillées (.err) : 73407
Informations de débogage :
IEWDHFSRV=118.27
Module=<WDHFSRV>
Version=<24.0.50.1>
Fonction (7,55)
Informations supplémentaires :
EIT_TYPE_WDFILE : <2>
EIT_IDCODE : <458752>
EIT_SERVEURCS : <:4900>
EIT_LOGICALTABLENAME : <_SOURCE_lReq_7>
EIT_PILEWL :
Procédure locale CréerTypeDossier (FEN_MAIN.PROCEDURE.CréerTypeDossier), ligne 17
Procédure locale EnregistrerTypeDossier (FEN_MAIN.PROCEDURE.EnregistrerTypeDossier), ligne 6
Clic sur BTN_Sauver (FEN_MAIN.RUB_MAIN.BTN_Sauver), ligne 5
EIT_DATEHEURE : 30/09/2019 22:20:00

----- Sous-erreur n°1 -----

Code erreur : 0
Niveau : pas d'erreur

Informations supplémentaires :
EIT_TYPE_WDFILE : <0>
EIT_IDCODE : <-1>


J'espère que vous pourrez m'aider
par avance merci
Mensaje modificado, 30,septiembre 2019 - 22:26
Miembro registrado
6 mensajes
Publicado el 30,septiembre 2019 - 22:25
Marret, Philippe, je n'avais pas vu vos message.
Merci pour votre aide
Dans le post précédent la trace d'erreur
Miembro registrado
4.361 mensajes
Publicado el 30,septiembre 2019 - 23:06
Bonjour,
A priori, tu utilises HF Classic.
HF Classic n'autorise pas l'utilisation des procédures stockées cf https://doc.pcsoft.fr/?3044360.
Pour utiliser les triggers, il faut se servir des fonctions HXXXTrigger.
Ton code ressemblera alors à ça
HDécritTrigger("Type_Dossier","HAjoute","AjoutDossier",hTriggerAprès)


Procedure AjoutDossier
PIECE_DOSSIER.ID_DOS=TYPE_DOSSIER.TDOS_ID
HAjoute(PIECE_DOSSIER)

ATTENTION, il faut bien utiliser HAjoute et non une requête SQL pour activer le déclenchement du trigger.

--
Il y a peut être plus simple, mais, ça tourne
Mensaje modificado, 30,septiembre 2019 - 23:25
Miembro registrado
6 mensajes
Publicado el 01,octubre 2019 - 23:29
Merci voroltinquo pour ta contribution.
Je suis bien en HF client serveur; qu'est ce qui te fait dire que je suis en Classic ?
Miembro registrado
6 mensajes
Publicado el 02,octubre 2019 - 01:19
voroltinquo merci mercI merCI meRCI mERCI MERCI !!!!!!!
Tu as raison le SQL n'est pas autorisé dans HF CLASSIC mais aussi dans HF CLIENT SERVEUR.
J'ai supprimé le SQL au profit de HAJOUTE
Et ça marche !!!

Ci dessous mon code de remplacement
lIdEnreg est un entier

lIdEnreg=MonFichier.tdos_id
PIECE_DOSSIER.TDOS_ID = lIdEnreg
PIECE_DOSSIER.TPIE_ID = 1
HAjoute(PIECE_DOSSIER)

Je dois encore résoudre un problème.
Dans mon code je ne créé que la pièce 1 du dossier lIdEnreg
Moi je veux créer toutes les pièces du dossier lIdEnreg

En tout cas merci à tous pour votre aide
Mensaje modificado, 02,octubre 2019 - 01:19
Miembro registrado
6 mensajes
Publicado el 02,octubre 2019 - 02:05
It's done
have a good night

// Rattachement de l'ensemble des pièces du type de dossier
lIdEnreg est un entier = MonFichier.tdos_id
CléParcours est une chaîne = HFiltre(TYPE_PIECE, "TPIE_SUPPRIME<>1")

HLitPremier(TYPE_PIECE, CléParcours)
TANTQUE HEnDehors() = Faux
// Traitement de l'enregistrement
PIECE_DOSSIER.TDOS_ID = lIdEnreg
PIECE_DOSSIER.TPIE_ID = TYPE_PIECE.TPIE_ID
HAjoute(PIECE_DOSSIER)

HLitSuivant(TYPE_PIECE, CléParcours)
FIN
// Annule le filtre
HDésactiveFiltre(TYPE_PIECE)
Miembro registrado
2.682 mensajes
Publicado el 02,octubre 2019 - 09:29
Bonjour,

tu dois pouvoir raccourcir ton code en mettant ceci
POUR TOUT TYPE_PIECE AVEC TPIE_SUPPRIME<>1
PIECE_DOSSIER.TDOS_ID = lIdEnreg
PIECE_DOSSIER.TPIE_ID = TYPE_PIECE.TPIE_ID
HAjoute(PIECE_DOSSIER)
FIN


--
Cordialement,

Philippe SAINT-BERTIN
Mensaje modificado, 02,octubre 2019 - 09:29