PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → copie de données de 3 tables différentes
copie de données de 3 tables différentes
Débuté par priv!zn4pMun4z10-r+s4, 31 juil. 2025 12:07 - 7 réponses
Membre enregistré
4 messages
Posté le 31 juillet 2025 - 12:07
Bonjour à vous!!
Dans ma bd j'ai trois tables depuis lesquelles je dois partager des infos, je m'explique :
Une table Candidats, une table Personne, et une table groupes. Je dois copier dans la table Candidats les enregistrements "NOM" dans la table Personnes dans la colonne "NOM" si l'enregistrement n'existe pas et en même temps copier le premier enregistrement "LIBGROUPE" de mon fichier Groupes!
J'ai créer ce code a cet effet :

// Ouvrir les fichiers
HOuvre(Candidats)
HOuvre(PERSONNE)
HOuvre(GROUPES)

// Parcourir les enregistrements du fichier Candidat
HLitPremier(Candidats, "NOM")
TANTQUE PAS HEnDehors(Candidats)
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherche(PERSONNE, "NOM", Candidats.NOM)
SI HErreur() = Non ALORS
// L'enregistrement existe déjà, ne pas copier
HLitSuivant(Candidats, "NOM")
CONTINUER
SINON
// L'enregistrement n'existe pas, copier
HCopieEnreg(PERSONNE, Candidats)
HAjoute(PERSONNE)
FIN

// Ajouter le premier enregistrement du fichier Groupes
HLitPremier(GROUPES, "LIBGROUPE")
HCopieEnreg(PERSONNE, GROUPES)
HAjoute(PERSONNE)

// Passer à l'enregistrement suivant du fichier Candidat
HLitSuivant(Candidats, "NOM")
FIN

// Fermer les fichiers
HFerme(Candidats)
HFerme(PERSONNE)
HFerme(GROUPES)

Là ou le bas blesse c'est qu'il ne se passe rien, pas de message d'erreur, pas de plantage rien du tout, donc voilà si une âme charitable veut bien aider un vieux machin qui a du mal a avancer !
Par avance Merci pour votre aide
Membre enregistré
21 messages
Posté le 31 juillet 2025 - 13:07
Bonjour,
C'est assez ironique, le problème de votre code c'est qu' il ne fonctionnerait vaguement que s'il y avait une erreur.

Ormis cela, les structures de vos 3 tables sont les mêmes ? étonnant...
Les hcopieenreg() me semblent assez risqués.

Pour le principe uniquement vous pouvez vous inspirer de ceci :

HLitPremier(GROUPE,"LIBGROUPE")
Pour TOUT candidats
SI PAS HLitRecherchePremier(PERSONNE,"NOM",candidats.nom",hidentique) ALORS

//vos traitements d'ajout dans la table PERSONNE ici

FIN
FIN
Membre enregistré
2 299 messages
Posté le 31 juillet 2025 - 14:56
Bonjour,

1. Pour simplifier la discussion, employez le terme WinDev fichier plutôt que table.

2. Le code :
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherche(PERSONNE, "NOM", Candidats.NOM)
SI HErreur() = Non ALORS

est impropre ! Vous testez s'il y a une erreur ce qui ne dit rien de si la recherche a abouti ou non.
// Parcourir les enregistrements du fichier Candidat
HLitPremier(Candidats, "NOM")
TANTQUE PAS HEnDehors(Candidats)
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherchePremier(PERSONNE, "NOM", Candidats.NOM)
SI HTrouve(PERSONNE) = Vrai ALORS
// L'enregistrement existe déjà, ne pas copier
HLitSuivant(Candidats, "NOM")
SINON
// L'enregistrement n'existe pas, copier
HCopieEnreg(PERSONNE, Candidats)
HAjoute(PERSONNE)
FIN
FIN


--
Bon dev,
Jean-Pierre
Message modifié, 31 juillet 2025 - 15:00
Membre enregistré
21 messages
Posté le 31 juillet 2025 - 15:13
Hello Jean Pierre
Manque le hlitSuivant si l'ajout est effectué, boucle infinie garantie.

Il vaut mieux inverser la condition du Htrouve() et mettre systematiquement le hlitsuivant en fin de boucle.

Bon dev.

Jean-Pierre BLOCH a écrit :
Bonjour,

1. Pour simplifier la discussion, employez le terme WinDev fichier plutôt que table.

2. Le code :
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherche(PERSONNE, "NOM", Candidats.NOM)
SI HErreur() = Non ALORS

est impropre ! Vous testez s'il y a une erreur ce qui ne dit rien de si la recherche a abouti ou non.
// Parcourir les enregistrements du fichier Candidat
HLitPremier(Candidats, "NOM")
TANTQUE PAS HEnDehors(Candidats)
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherchePremier(PERSONNE, "NOM", Candidats.NOM)
SI HTrouve(PERSONNE) = Vrai ALORS
// L'enregistrement existe déjà, ne pas copier
HLitSuivant(Candidats, "NOM")
SINON
// L'enregistrement n'existe pas, copier
HCopieEnreg(PERSONNE, Candidats)
HAjoute(PERSONNE)
FIN
FIN


--
Bon dev,
Jean-Pierre
Message modifié, 31 juillet 2025 - 15:00
Posté le 31 juillet 2025 - 15:36
Jean-Pierre BLOCH a écrit :
Bonjour,

1. Pour simplifier la discussion, employez le terme WinDev fichier plutôt que table.

2. Le code :
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherche(PERSONNE, "NOM", Candidats.NOM)
SI HErreur() = Non ALORS

est impropre ! Vous testez s'il y a une erreur ce qui ne dit rien de si la recherche a abouti ou non.
// Parcourir les enregistrements du fichier Candidat
HLitPremier(Candidats, "NOM")
TANTQUE PAS HEnDehors(Candidats)
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherchePremier(PERSONNE, "NOM", Candidats.NOM)
SI HTrouve(PERSONNE) = Vrai ALORS
// L'enregistrement existe déjà, ne pas copier
HLitSuivant(Candidats, "NOM")
SINON
// L'enregistrement n'existe pas, copier
HCopieEnreg(PERSONNE, Candidats)
HAjoute(PERSONNE)
FIN
FIN


--
Bon dev,
Jean-Pierre


Merci à vous !! Je suis un vieux machin qui n'a plus touché un clavier depuis quelques années, suite a la demande de ma fille je tente de lui développer un petit programme de gestion d'interim, ma mémoire est loin d'être vaillante mais je m'accroche, votre aide est tres précieuse pour moi, encore une fois merci!
Posté le 31 juillet 2025 - 15:59
Samir BOUCHETIBAT a écrit :
Bonjour,
C'est assez ironique, le problème de votre code c'est qu' il ne fonctionnerait vaguement que s'il y avait une erreur.

Ormis cela, les structures de vos 3 tables sont les mêmes ? étonnant...
Les hcopieenreg() me semblent assez risqués.

Pour le principe uniquement vous pouvez vous inspirer de ceci :

HLitPremier(GROUPE,"LIBGROUPE")
Pour TOUT candidats
SI PAS HLitRecherchePremier(PERSONNE,"NOM",candidats.nom",hidentique) ALORS

//vos traitements d'ajout dans la table PERSONNE ici

FIN
FIN


Dites moi POUR TOUT .... OU HLitpremier ne sont pas équivalents dans la lecture des données?
je met ici une copie de partie de mon analyse pour plus de compréhension




Membre enregistré
2 299 messages
Posté le 31 juillet 2025 - 16:34
Rebonjour,

POUR TOUT a été "inventé" dans WinDev après TANT QUE.
Il est beaucoup plus simple a utilisé :D
// Parcourir les enregistrements du fichier Candidat
POUR TOUT Candidats
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherchePremier(PERSONNE, "NOM", Candidats.NOM)
SI HTrouve(PERSONNE) = Faux ALORS
// L'enregistrement n'existe pas, copier
HCopieEnreg(PERSONNE, Candidats)
HAjoute(PERSONNE)
FIN
FIN

--
Bon dev,
Jean-Pierre
Message modifié, 31 juillet 2025 - 16:37
Posté le 31 juillet 2025 - 19:43
Jean-Pierre BLOCH a écrit :
Rebonjour,

POUR TOUT a été "inventé" dans WinDev après TANT QUE.
Il est beaucoup plus simple a utilisé :D
// Parcourir les enregistrements du fichier Candidat
POUR TOUT Candidats
// Vérifier si l'enregistrement existe déjà dans le fichier Personnes
HLitRecherchePremier(PERSONNE, "NOM", Candidats.NOM)
SI HTrouve(PERSONNE) = Faux ALORS
// L'enregistrement n'existe pas, copier
HCopieEnreg(PERSONNE, Candidats)
HAjoute(PERSONNE)
FIN
FIN

--
Bon dev,
Jean-Pierre


Merci pour l'info !!