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 :

HFSQL C/S : Duplication automatique d'un enregistrement dans une autre table


Sujet :

WinDev

  1. #1
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut HFSQL C/S : Duplication automatique d'un enregistrement dans une autre table
    Bonjour,

    Pour des besoins spécifiques, j'ai besoin d'automatiser la duplication d'enregistrements dans une base HFSQL C/S.

    Pour faire simple, j'ai deux tables CLIENT et CLIENT_BACKUP.
    Lors de l'ajout, de la modification et de la suppression d'enregistrements dans la table CLIENT, j'aimerai reporter ces modifications dans ma table CLIENT_BACKUP.
    L'idéal pour moi serait d'automatiser cette opération pour ne pas devoir le faire manuellement (en programmation) dans chaque partie de l'application.

    Je pense qu'il est possible de faire cette opération directement sur le serveur HFSQL C/S, avec les procédures internes et les triggers mais je n'arrive pas à le mettre en place.

    Savez-vous si cela est possible ? Et si oui quelle procédure interne créée pour récupérer l'enregistrement qui vient d'être créé, modifié, supprimé ?

    Merci d'avance.

  2. #2
    Membre émérite
    Femme Profil pro
    .
    Inscrit en
    Janvier 2012
    Messages
    1 039
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : .
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 1 039
    Points : 2 486
    Points
    2 486

  3. #3
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bonjour Serendib. Et merci de t'intéresser à mon problème. Je me suis peut-être mal expliqué, ou peut-être que je ne comprend pas bien toute la portée de ta réponse mais comme j'ai essayé de l'expliquer dans mon premier post : j'aimerais ne pas gérer la duplication par programmation dans mon application. Je voudrais que mes développeurs ai simplement à coder les appels et requêtes aux fichier CLIENTS, sans se soucier de la recopier vers CLIENTS_BACKUP.
    C'est pour ça que j'avais pensé à faire ce travail sur le serveur HFSQL C/S directement (si cela est possible bien sûr).

    Dans l'idée je pensais créer un trigger depuis le centre de controle HFSQL pour appeler une procédure stockée du serveur HFSQL lors d'un ajout, d'une modification ou d'une suppression. Mais je n'arrive pas à comprendre ce que je fais mal car je n'arrive pas à recopier l'enregistrement concerné.... Je ne trouve nul part les paramètres d'entrées de la fonction suite à un appel trigger....

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 348
    Points : 9 495
    Points
    9 495
    Par défaut
    Hello Leon,

    Tu déclares des triggers dans une proc globale (par exemple), lancée au début de ton projet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HDécritTrigger("Client", "HAjoute","MaBelleProcHajoute",hTriggerAvant)
    HDécritTrigger("Client", "HModifie","MaBelleProcHModifie",hTriggerAvant)
    Et les procédure associées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure MaBelleProcHajoute()
    hraz(Client_BackUp)
    HcopieEnreg(Client_BackUp, Client)
    Hajoute(Client_BackUp)
     
    Procedure MaBelleProcHModifie()
    HlitrecherchePremier(Client_BackUp, MaCle, Client.MaCle, HlimiteParcours)
    HcopieEnreg(Client_BackUp, Client)
    HModifie(Client_BackUp)
    J'ai mis hTriggerAvant, mais il n'y a pas de raison que cela ne fonctionne pas avec le hTriggerAprès.

    PS: lorsque ton trigger se déclenche, tu es positionné sur le "bon" enregistrement de Client.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 411
    Points : 434
    Points
    434
    Par défaut
    Ta peux aussi utiliser la réplication sur une autre base.
    Il n'y aura pas d'impact sur le code.

  6. #6
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Je ne souhaite pas actuellement gérer une réplication sur une autre base. La réplication proposée par PcSoft ne me semble pas assez transparente à l'heure actuelle. On n' a aucun moyen de savoir si la réplication en temps réel est bien synchronisée. Il n'y a nul part une information pour dire "Dernière synchro le dd/mm/yyyy à hh:mm", "état de la synchonisation : en cours, synchronisé", etc... On met cela en place et croise les doigts pour que cela marche...

    Merci FrenchSting pour toutes ces informations !
    Si j'ai bien compris ici il s'agit de trigger gérés par l'application elle-même ? Et non pas par un trigger et une procédure stockée qui serait executée par le serveur HFSQL C/S ?

  7. #7
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 854
    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 854
    Points : 5 396
    Points
    5 396
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeonCosnyd Voir le message
    Si j'ai bien compris ici il s'agit de trigger gérés par l'application elle-même ? Et non pas par un trigger et une procédure stockée qui serait executée par le serveur HFSQL C/S ?
    Les deux sont possibles.
    Si ta table n'est pas utilisée par une autre application, le trigger serveur et le trigger "appli" on quasiment le même comportement. Si la table est utilisée par une autre application, avec l'utilisation d'un trigger serveur, il se déclenchera quelle que soit l'appli appelante.
    De plus contrairement aux trigger "appli", on peut utiliser plusieurs triggers sur la même table.

    On peut même envisager l'emploi de la fonction HSurveille.

  8. #8
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 348
    Points : 9 495
    Points
    9 495
    Par défaut
    Citation Envoyé par LeonCosnyd Voir le message
    Si j'ai bien compris ici il s'agit de trigger gérés par l'application elle-même ? Et non pas par un trigger et une procédure stockée qui serait executée par le serveur HFSQL C/S ?
    Oui, dans mon cas, c'est cela. C'est pour cela que la déclaration est faite (des triggers) au lancement du projet.

  9. #9
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Pour le coup le HSurveille() ne fonctionnera pas dans mon cas car l'application est utilisé en simultanée par plusieurs machines. Ainsi si j'implémente un HSurveille() dans l'application, tous les postes vont se mettre à surveiller et à dupliquer l'enregistrement dans le fichier _BACKUP....

    Est-ce que c'est le même principe pour le HDécritTrigger() ? Est-il appelé pour chaque ajout/modification sur le fichier ? Ou n'est-il appelé que par les ajouts/modifications effectuées depuis l'instance de l'application en cours ?

  10. #10
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 348
    Points : 9 495
    Points
    9 495
    Par défaut
    Sur l'appli d'un utilisateur, lorsque celui-ci fait un ajout, le programme va déclencher le trigger avant (dans le code que je t'ai donné) l'ajout et exécuter la procédure associée. Tout simplement.

    Tu peux implémenter très rapidement, en faisant le copier-coller du code que je t'ai donné. Et ça fonctionne en mode test

  11. #11
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bonjour,

    Merci à vous pour toutes ces informations ! Grâce à cela j'ai pu mettre en place un système qui me convient bien.

    Je suis passé par un trigger serveur et une procédure stockée dans le serveur HFSQL C/S.

    Voici ce que je fais :

    Au moment de l'initialisation de mon programme (après les fameurs HChangeConnexion et HOuvreConnexion) j'implémente une ligne pour créer le trigger serveur si celui-ci n'existe pas avec la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HDécritTriggerServeur(oConnexionHFSQL,"NOM_DU_TRIGGER",ps_SynchronisationClients,hTriggerAprès,"CLIENT","HAjoute,HModifie,HSupprime")
    Dans l'analyse du programme, je créé une procéduré stockée nommée ps_SynchronisationClients :

    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
    HDéclareExterne("CLIENT_SYNC.FIC","CLIENT_SYNC","MonMotDePasseFichiersHFSQL")
     
    Merci à vous ! Je passe en résolu
     
    SELON H.FonctionTrigger
    	CAS "HModifie"
    		HLitRecherche(CLIENT_SYNC,IDCLIENT,MonFichier.IDCLIENT)
    		SI HTrouve(CLIENT_SYNC) ALORS
    			HCopieEnreg(CLIENT_SYNC, MonFichier,hCopieIdAuto)
    			HModifie(CLIENT_SYNC)		
    		FIN
     
     
    	CAS "HAjoute" 
    		HRAZ(CLIENT_SYNC)
    		HCopieEnreg(CLIENT_SYNC, MonFichier,hCopieIdAuto)
    		HAjoute(CLIENT_SYNC,hForceIdAuto)
     
    	CAS "HSupprime"
    		HLitRecherche(CLIENT_SYNC,IDCLIENT,MonFichier.IDCLIENT)
    		SI HTrouve(CLIENT_SYNC) ALORS
    			HSupprime(CLIENT_SYNC)		
    		FIN
     
    	AUTRE CAS
    // Rien à faire
    FIN
    Il faut savoir que les fichiers de données ne sont pas positionnés lors de l’exécution d'une procédure stockée appelé par un trigger serveur. Il faut les déclarer par le HDéclareExterne(). Seul le mot-clé MonFichier permet d'être positionné sur le fichier (à l'enregistrement concerné).

    J'ai choisi cette solution car il arrive qu'on doivent modifier à la main via le centre de controle HFSQL les données contenues dans le fichier CLIENT (Oui je sais, c'est pas bien ).

  12. #12
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 348
    Points : 9 495
    Points
    9 495
    Par défaut
    +1 @ toi mon Léon,

    même si j'aurais créé 3 triggers(un par action), et fait mes recherches positionnement dans les procédures des triggers).

    Je pense néanmoins que tu as fait ce qui te convient le mieux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] déplacer un enregistrement dans une autre table
    Par botk62 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/07/2009, 20h40
  2. [AC-2007] Création d'enregistrements dans une autre table
    Par Alain7751 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/04/2009, 16h36
  3. Dupliquer un enregistrement dans une autre table
    Par Sniper Fou dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/06/2007, 13h21
  4. effacer enregistrements dans une autre table
    Par milielf dans le forum Access
    Réponses: 6
    Dernier message: 03/08/2006, 12h17
  5. Réponses: 2
    Dernier message: 05/06/2006, 14h24

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