IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Utilisation du Trigger Avant pour récupérer l'enregistrement courant avant la modification


Sujet :

WinDev

  1. #1
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut Utilisation du Trigger Avant pour récupérer l'enregistrement courant avant la modification
    Salut à tous les windevers,

    Je travaille depuis plusieurs jours sur les triggers, car je voulais les utiliser pour réaliser l'historique des modifications effectuées par les utilisateurs.

    Ainsi, pour chaque enregistrement, je veux sauvegarder son état avant la modif et après la modif via les triggers avant et après.
    Sauf que pour le cas du trigger Avant modification de l'enregistrement. Je ne parviens pas à récupérer l'enregistrement avant la modif;

    Dans ce cas précis, bien que le trigger soit appelé avant, il sauvegarde plutôt l'enregistrement une fois la modif effectuée.
    Je ne sais comment procéder, si qqln a une méthode ?

    merci d'avance pour vos contributions et surtout bon développement !

  2. #2
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Tu peux travailler avec une classe mappée cf https://blogs.pcsoft.fr/fr/generer-c...10689/read.awp

    Supposons que tu veuilles récupérer un tuple de MaTable. Il suffit de créer la classe mappée MMaTable (avec 2 M.)
    Le code ressemble à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PROCEDURE TriggerAvant_MaTable()
    clMaRécupAvant est un MMaTable
     
    FichierVersMémoire(clMaRécup,MaTable)
    clMaRécupAvant contient alors les données du tuple avant modification
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  3. #3
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut
    Merci Voroltinquo, pour ton intervention.

    J'ai passé un long moment dessus sans aucune suite favorable, mais je n'utilisais pas de mapping.
    Mais plutôt à un certain moment la variable de type Enregistrement.

    Je l'avoue c'est une notion assez nouvelle pour moi (mapping), car je la connais seulement en théorie.
    Je vais essayer ta solution, et je te tiens informer.

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Sans le mapping, c'est aussi possible, à une condition : le nom des membre doit être le même que celui des colonnes de la table.
    Ce n'est pas gênant en soit, mais si on veut travailler en POO avec les données, on perd l'avantage des préfixes. En plus, chose non négligeable, on n'est pas obligé de se taper les déclaration "à la main".
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  5. #5
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    J'ai fait un développement similaire où un trigger "Applicatif" (programmé dans le projet Windev et non dans la base) me stocke les modifications effectuées sur un fichier.

    J'ai un trigger Avant et Après modification.
    Dans le trigger Avant, je récupère l'état de l'enregistrement dans une variable globale de type enregistrement (gpc_eTriggerAvt_Enreg).
    Dans le trigger Apres, je compare l'état actuel avec celui de ma variable globale et j'enregistre les modifications dans une table HF historique.

    ATTENTION ! dans le Trigger avant modification, je réaffecte les valeurs de l'enregistrement après mon HLit, cela pose des problèmes avec les Mémo Images (et peut-être d'autre type) : Ils sont perdus. Donc pour les modificaitons usr un fichier HF avec Mémo Image, j'ai un traitement particulier pour l'enregistrement de ce mémo image dans lequel je désactive le trigger (donc j'ai 2 HModifie pour la modification de cette table)

    ATTENTION 2 ! Cela ne prend pas en compte les modifications effectuées via une requête

    Le code de mon Trigger Avant modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    PROCÉDURE PG_Histo_TriggerAvant()
     
    LOCAL
    	sNomFichier	est une chaîne
    	eFichier		est un Enregistrement
     
     
    SI Majuscule(H.FonctionTrigger) _DANS_ ("HMODIFIE", "HSUPPRIME") ALORS
    	gpc_sRaisonSuppr	= ""
     
    	sNomFichier			= H.NomFichier
    	eFichier			= sNomFichier		// Contient l'état de l'enregistrement juste avant la modification (donc avec les modifications)
     
    	HRAZ(gpc_eTriggerAvt_Enreg)	
    	SI HLit(sNomFichier) ALORS
    		gpc_eTriggerAvt_Enreg		= sNomFichier		// Contient l'état de l'enregistrement tel que dans la base (donc avant les modifications)
    		{sNomFichier, indFichier}	= eFichier			// On remet à jour l'état de l'enregistrement
    		POUR TOUTE CHAÎNE sRubMemo DE HListeRubrique(sNomFichier, hLstMémo) SEPAREE PAR RC
    			{sNomFichier+"."+sRubMemo, indRubrique}	= {"eFichier."+sRubMemo}
    		FIN		
    	FIN
    FIN
    Le code de mon Trigger Apres modificaiton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    PROCÉDURE PG_Histo_TriggerApres()
     
    LOCAL
    	sNomFichier		est une chaîne
    	sLibAction		est une chaîne
    	sTypeAction		est une chaîne
    	sDetail			est une chaîne
    	sQui			est une chaîne	= sNomUtilisateur
    	sRubCle			est une chaîne
    	sRubrique		est une chaîne			// Nom de la rubrique traitée
    	nNbIndice		est un entier			// Nom bre d'indice pour les champs de type table (1 sinon)
     
     
    sNomFichier		= H.NomFichier
    POUR TOUTE CHAÎNE sRubrique DE HListeClé(sNomFichier, hLstClé+hLstDétail) SEPAREE PAR RC
    	SI Majuscule( Gauche(sRubrique,2))="ID" _ET_ ExtraitChaîne(sRubrique,5,TAB)=1 ALORS
    		sRubCle=ExtraitChaîne(sRubrique,1,TAB)
    		SORTIR
    	FIN	
    FIN
     
    SELON Majuscule(H.FonctionTrigger)
    	CAS "HAJOUTE"
    		sLibAction	= "Ajout"
    		sTypeAction	= "AJ_"
    	CAS "HMODIFIE"
    		POUR TOUTE CHAÎNE sRubriqueDetail DE HListeRubrique(sNomFichier, hLstDétail) SEPAREE PAR RC
    			sRubrique	= ExtraitChaîne(sRubriqueDetail, 1, TAB)
    			nNbIndice	= Val(ExtraitChaîne(sRubriqueDetail, 5, TAB))
    			SI nNbIndice=1 ALORS
    				SI {sNomFichier+"."+sRubrique, indRubrique}<>{"gpc_eTriggerAvt_Enreg."+sRubrique} ALORS
    					sDetail+= [RC]+ChaîneConstruit("%1=%3 ==> %2", sRubrique, {sNomFichier+"."+sRubrique, indRubrique}, {"gpc_eTriggerAvt_Enreg."+sRubrique})
    				FIN
    			SINON
    				POUR nIndEncours=1 _À_ nNbIndice
    					SI {sNomFichier+"."+sRubrique, indRubrique}[nIndEncours]<>{"gpc_eTriggerAvt_Enreg."+sRubrique}[nIndEncours] ALORS
    						sDetail+= [RC]+ChaîneConstruit("%1[%4]=%3 ==> %2", sRubrique, {sNomFichier+"."+sRubrique, indRubrique}[nIndEncours], {"gpc_eTriggerAvt_Enreg."+sRubrique}[nIndEncours], nIndEncours)
    					FIN
    				FIN
    			FIN
    		FIN
    		sLibAction = sDetail
    		sTypeAction	= "MO_"
    	CAS "HSUPPRIME"
    		sLibAction = "Suppression "+gpc_sRaisonSuppr
    		sTypeAction	= "SU_"
     
    	AUTRE CAS
    		sLibAction = "Inconnu"		
    FIN	
    sTypeAction+=sNomFichier
     
    SI sLibAction="" ALORS RETOUR	// Pas d'enregistrement dans la table HISTORIQUE en cas d'appel intempestif à HMODIFIE
     
    // Enregistrement de l'historique de la modification dans une table HF des valeurs 
    //	sLibAction
    //	DateSys()
    //	HeureSys()
    //	Utilisateur
    //	PAS sRubCle="" ? {sNomFichier+"."+sRubCle, indRubrique} SINON 0
    //	sTypeAction
    //	MonFichier..Nom
    //	ChaîneFormate(ProjetInfo(piNomProjet),ccMajuscule)
    //	MaFenêtre..Nom

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/10/2009, 17h37
  2. Réponses: 7
    Dernier message: 07/08/2009, 15h28
  3. Réponses: 0
    Dernier message: 08/01/2009, 15h33
  4. utilisation d'un dataenvironment pour effectuer un enregistrement
    Par ouatmad dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/11/2007, 20h21
  5. Réponses: 2
    Dernier message: 09/11/2006, 07h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo