PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Help > Besoin d'un exemple pour une fenetre qui enregistre sur 2 tables
Help > Besoin d'un exemple pour une fenetre qui enregistre sur 2 tables
Débuté par Sh1v4, 26 mar. 2024 14:19 - 31 réponses
Membre enregistré
32 messages
Posté le 26 mars 2024 - 14:19
Bonjour,

Je me suis tellement pris la tête sur mon projet que si quelqu'un pouvait m'aider soit en me montrant un tuto (internet/youtube), ou en me faisant un exemple (je suis sous la version 26).

L'idée, une simple fenêtre avec 2 champs qui en faisant "Valider" ajoute ou modifie les 2 tables.










Je sais plus si on peut le faire sans code, avec, avec des requêtes et des variables. Le truc simple qui me rend fou.
Membre enregistré
450 messages
Popularité : +31 (43 votes)
Posté le 26 mars 2024 - 14:48
Bonjour

fiche.nom = sai_nom
SI HAjoute(fiche) ALORS
details.adresse = sai_adresse
details.idfiche = fiche.Identifiant
HAjoute(details)
FIN


cdlt

DG
Membre enregistré
32 messages
Posté le 26 mars 2024 - 15:23
Merci.

Donc avec cela j'ai bien l'enregistrement qui se fait dans les 2 tables. La mise à jour quand à elle duplique l'entrée comme si c'était une nouvelle.
Dites moi si je me trompe. Il faudrait donc que je teste si IDFiche existe, si oui Hmodifie ?



EcranVersFichier()

Fiche.nom = SAI_nom
SI HAjoute(Fiche) ALORS
details.adresse = SAI_Adresse
details.IDFiche = Fiche.IDFiche
HAjoute(details)
FIN
Ferme("",Vrai)


Dailleurs, en regardant, écran vers fichier n'a plus d'interet ?
Message modifié, 26 mars 2024 - 15:24
Membre enregistré
16 messages
Posté le 26 mars 2024 - 15:48
Bonjour dans votre cas il faut utiliser un transaction au cas ou l'un deux enregistrement ne fonctionne pas
donc j'ouvre une transaction
après chaque enregistrement je vérifie si il n'y a pas d'erreur d'intégrité ou de doublon
en cas d'erreur j'annule la transaction
sinon je valide la transaction.
voir aide en ligne : https://doc.pcsoft.fr/?1000023384
bon développement.
Membre enregistré
32 messages
Posté le 26 mars 2024 - 16:52
Merci beaucoup. je vais de ce pas lire la docs.
j'espère aussi retrouver le bouquin.

Et si je travaille avec des conditions pour tester si l'ID Fiche existe, si oui, je continie avec Hajoute, et sinon, je fais un Hmodifie ? C'est ce que j'avais commencé sur mon projet mais à force j'ai perdu le fil.
Membre enregistré
3 890 messages
Popularité : +227 (347 votes)
Posté le 26 mars 2024 - 17:52
Sh1v4 a écrit :
Dailleurs, en regardant, écran vers fichier n'a plus d'interet ?

Il faut parfois préciser la table dans EcranVersFichier. Reprend ta doc.
C'est
Fiche.nom = SAI_nom

et
details.adresse = SAI_Adresse

Qui sont inutiles en cas d'utilisation de FichierVersEcran.
l'ID Fiche existe, si oui, je continie avec Hajoute, et sinon, je fais un Hmodifie ?

C'est le contraire. On ne peut pas modifier un tuple qui n'existe pas.
j'espère aussi retrouver le bouquin.

Regarde au niveau de l'armoire normande. Vue l'épaisseur, il doit servir de calle :D

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 26 mars 2024 - 18:00
Membre enregistré
450 messages
Popularité : +31 (43 votes)
Posté le 26 mars 2024 - 17:58
il y'a aussi la fonction henregistre qui peut etre intéressante qui modifie ou enregistre selon que l'enregistrement existe ou pas

https://doc.pcsoft.fr/?1000021375


Sh1v4 a écrit :
Merci.

Donc avec cela j'ai bien l'enregistrement qui se fait dans les 2 tables. La mise à jour quand à elle duplique l'entrée comme si c'était une nouvelle.
Dites moi si je me trompe. Il faudrait donc que je teste si IDFiche existe, si oui Hmodifie ?



EcranVersFichier()

Fiche.nom = SAI_nom
SI HAjoute(Fiche) ALORS
details.adresse = SAI_Adresse
details.IDFiche = Fiche.IDFiche
HAjoute(details)
FIN
Ferme("",Vrai)


Dailleurs, en regardant, écran vers fichier n'a plus d'interet ?
Message modifié, 26 mars 2024 - 15:24
Membre enregistré
3 890 messages
Popularité : +227 (347 votes)
Posté le 26 mars 2024 - 18:00
L'inconvénient de HEnregistre est qu'il ne déclenche pas les triggers.

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
450 messages
Popularité : +31 (43 votes)
Posté le 27 mars 2024 - 09:07
je suis d'accord @voroltinquo mais au vue de sa question initial et de sa réponse suivante pourquoi l'embrouiller avec les triggers ! le but est déjà qu'il comprenne le fonctionnement basique et ensuite d 'évoluer en fonction de son besoin si cela est nécessaire


Sh1v4 a écrit :
Merci beaucoup. je vais de ce pas lire la docs.
j'espère aussi retrouver le bouquin.

Et si je travaille avec des conditions pour tester si l'ID Fiche existe, si oui, je continie avec Hajoute, et sinon, je fais un Hmodifie ? C'est ce que j'avais commencé sur mon projet mais à force j'ai perdu le fil.
Membre enregistré
32 messages
Posté le 27 mars 2024 - 09:12
@Voroltinquo > L'armoire :p
Merci à tous, je vais revoir un peu tout cela.
Je ne maitrise pas assez les bases de Windev et les fonctions. C'est pour cela que j'avais besoin de vous afin de savoir vers ou partir pour cette histoire de fenêtre unique.
Membre enregistré
32 messages
Posté le 27 mars 2024 - 09:26
Je reprends en partant du 1er code de Dimitri soit :

fiche.nom = sai_nom
SI HAjoute(fiche) ALORS
details.adresse = sai_adresse
details.idfiche = fiche.Identifiant
HAjoute(details)
FIN


Cela fonctionne si la fiche est neuve. En cas de modification, cela crée un nouvel enregistrement.
Je pars la dessus avec vos recommandations.

Henregistre joue bien son rôle et enregistre si rien et modifie si la valeur existe. Je continue mon test.
Message modifié, 27 mars 2024 - 09:33
Membre enregistré
32 messages
Posté le 27 mars 2024 - 10:32
En fait non, Henregistre marche et puis au bout d'un moment écrase une ancienne valeur. Je me retrouve toujours avec 4 lignes dans ma tables details. }:(
Membre enregistré
546 messages
Posté le 27 mars 2024 - 10:35
Bonjour,
Vous pouvez poursuivre avec le code fourni par Dimitri G :

HLitRecherchePremier(Fiche, Nom, sai_nom)
SI HTrouve() = Faux ALORS
Fiche.Nom = sai_nom
SI HAjoute(Fiche) ALORS
Details.Adresse = sai_adresse
Details.IDFiche = Fiche.IDFiche
HAjoute(Details)
FIN
SINON
HLitRecherchePremier(Details, IDFiche, Fiche.IDFiche)
SI HTrouve() = Vrai ALORS
Details.Adresse = sai_adresse
HModifie(Details)
FIN
FIN

Cdlt
Membre enregistré
450 messages
Popularité : +31 (43 votes)
Posté le 27 mars 2024 - 12:18
merci @cedric_34 c 'est vrai qu'hier j'ai livré le minimum syndical :) je partais en reunion

Cédric_34 a écrit :
Bonjour,
Vous pouvez poursuivre avec le code fourni par Dimitri G :

HLitRecherchePremier(Fiche, Nom, sai_nom)
SI HTrouve() = Faux ALORS
Fiche.Nom = sai_nom
SI HAjoute(Fiche) ALORS
Details.Adresse = sai_adresse
Details.IDFiche = Fiche.IDFiche
HAjoute(Details)
FIN
SINON
HLitRecherchePremier(Details, IDFiche, Fiche.IDFiche)
SI HTrouve() = Vrai ALORS
Details.Adresse = sai_adresse
HModifie(Details)
FIN
FIN

Cdlt
Message modifié, 27 mars 2024 - 12:18
Membre enregistré
186 messages
Posté le 27 mars 2024 - 12:30
Bonjour,
je ferai même plus simplement :

HLitRecherchePremier(Fiche, Nom, sai_nom)
SI HTrouve() = Faux ALORS
Fiche.Nom = sai_nom
SI HAjoute(Fiche) ALORS
Details.Adresse = sai_adresse
Details.IDFiche = Fiche.IDFiche
HAjoute(Details)
FIN
SINON // c'st que Htrouve est à vrai
Details.Adresse = sai_adresse
HModifie(Details)
FIN
Membre enregistré
32 messages
Posté le 27 mars 2024 - 12:42
Merci à vous tous,
Je viens de tester le code de Cédric_34 et cela fonctionne.
Une question, pourquoi faire la recherche sur le nom et non pas sur l'ID fiche dans le 1er ?
Et comme le mentionne André, pourquoi faire une nouvelle recherche sur l'ID fiche dans le 2ieme ?
J'essaie de comprendre.

André STASZEWSKI > Merci, je regarde.
Membre enregistré
546 messages
Posté le 27 mars 2024 - 12:54
Pour la première recherche, le nom est plus évident (connaissez-vous l'ID ?)
Pour le second, vous n'allez pas modifier le bon enregistrement si nous ne pointez pas sur cet enregistrement.
Membre enregistré
450 messages
Popularité : +31 (43 votes)
Posté le 27 mars 2024 - 13:50
faire la recherche que sur le champs "nom" peut également vite poser problème, dans le cas où 2 personnes ont le même nom ? impossible de le créer puisque vous trouverez déjà un nom existant et même si vous en avez 2 le premier trouvé sera modifié.

donc vous devriez ajouter d'autre champs pour permettre une recherche avec plus de critère comme le prénom, l'adresse, cp, ville etc

Et Pourquoi avoir crée 2 tables, une avec le champs nom,prenom,adresse,cp,ville aurait suffit !
Ce qui serait cohérent pour une seconde table serait une table pour la civilité : Monsieur,Madame,Mademoiselle,etc et de relier l'id de la civilité à la première.

Bon après je ne mesure pas complètement votre besoin et la porté de votre projet
Membre enregistré
32 messages
Posté le 27 mars 2024 - 14:14
D'abord merci beaucoup à tous, vous m'avez débloqué sur beaucoup de chose.

Pour résumé Dimitri, je suis sur un autre projet ou la fiche comporte 60 champs, nom prenom et si la personne à réaliser des actions ou non, je pourrais le faire facilement dans une table unique, mais je pense (A tord ?) qu'il faut mieux séparer la fiche personne, de la fiche suivi (dans l'exemple ici suivi est l'adresse).
J'avais besoin d'un exemple simple pour comprendre et déjà je peinais.

J'avais créer un premier sujet ici:

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/271062-fenetre-avec-onglet-alimenter-2-tables-probleme-cardinalite/read.awp…

Oui je connais l'ID, et je peux au pire l'afficher dans un champ. Je vais modifier dans ce sens et continuer mes essais.

Et complexifier pour au final avec une table fiche et 6 autres liées dans une seule fenetre. Raison ou tord ?
Message modifié, 27 mars 2024 - 14:40
Membre enregistré
546 messages
Posté le 27 mars 2024 - 15:00
Nous ne connaissons pas la structure du fichier de données pour vous aider d'avantage mais je ne pense pas que vous ayez tort.
Il est en effet préférable d'avoir un fichier "Fiche" et des liaisons pour, comme vous le mentionnez, le suivi, etc...
L'important étant de bien réfléchir à votre analyse avant de vous lancer.
Cdlt
Membre enregistré
3 890 messages
Popularité : +227 (347 votes)
Posté le 27 mars 2024 - 15:12
Sh1v4 a écrit :
Je pourrais le faire facilement dans une table unique, mais je pense (A tord ?) qu'il faut mieux séparer la fiche personne, de la fiche suivi (dans l'exemple ici suivi est l'adresse).

Ce n'est pas toi qui décide, c'est la modélisation, qui est le reflet de la réalité. Quoiqu'il en soit, si tu te retrouve avec une table avec 60 colonnes, il y a une forte probabilité que ta modélisation ne soit pas 3 FN. Dans ce cas les problèmes vont survenir par la suite.
Une question à se poser est : ai-je besoin d'un historique des adresses ? D'ailleurs comment représentes tu une adresse ? A-t-elle sa "vie propre" au terme données i.e. dans ton MCT as tu des traitements spécifiques uniquement sur l'adresse ?
--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 27 mars 2024 - 15:25
Membre enregistré
32 messages
Posté le 27 mars 2024 - 15:51
Comme je suis entouré de pro, et que je peux avoir votre avis, j'en profite :
Le projet pour l'asso, qui permet le suivi des personnes en difficultés. C'est une grande fiche avec des coches ou oui/non qui se complète au fur et à mesure du suivi, (mis à part la table liste-rendez-vous) que j'ai décomposé de cette maniere :




La table fiche va se garnir par un import XLS.
Commune et lieux peuvent changer, donc 2 tables sans liaison que l'on peut remplir par un simple formulaire.
Membre enregistré
3 890 messages
Popularité : +227 (347 votes)
Posté le 27 mars 2024 - 16:34
Cause impayé doit être une table à part entière (1° forme normale)

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
32 messages
Posté le 27 mars 2024 - 16:56
Je le concède. C'est une facilité de l'avoir réuni pour l'import dans un seul et même fichier.
Membre enregistré
186 messages
Posté le 27 mars 2024 - 18:44
Cédric_34 a écrit :
Pour la première recherche, le nom est plus évident (connaissez-vous l'ID ?)
Pour le second, vous n'allez pas modifier le bon enregistrement si nous ne pointez pas sur cet enregistrement.


là, il y a qq chose qui m'échappe parce que le HlitrecherchePremier placé juste avant la condition pointe justement sur l'enregistrement.
https://doc.pcsoft.fr/fr-FR/?3044036
Membre enregistré
546 messages
Posté le 27 mars 2024 - 19:41
@André STASZEWSKI
Bonjour,
"HlitrecherchePremier placé juste avant la condition pointe justement sur l'enregistrement", oui mais pour le fichier "Fiche".
Sans le HlitrecherchePremier sur le fichier "Details", on modifie l'enregistrement actif qui n'est pas forcément l'enregistrement souhaité.
Cdlt
Membre enregistré
32 messages
Posté le 28 mars 2024 - 10:10
Bonjour,
en reprenant l'exemple et en l'appliquant avec un HlitrecherchePremier" sur l'IDFiche, cela fonctionne correctement.
Mais je me demande si ne commets pas une erreur.
//recherche "IDFiche" correspond à "Fiche.IDFiche".
HLitRecherchePremier(Fiche,IDFiche,Fiche.IDFiche)
//Cela vérifie si la fonction "HTrouve" n'a pas trouvé de correspondance dans la recherche précédente.
SI HTrouve() = Faux ALORS
//Si aucune correspondance n'est trouvée, cette ligne attribue la valeur de "SAI_Nom" à la propriété "Identité_du_ménage" de l'objet "Fiche".
// Lecture des informations saisies
EcranVersFichier()
// doublons ci-dessous
Fiche.Identité_du_ménage = SAI_Nom
// Ensuite, cela vérifie si l'ajout de la "Fiche" est réussi (HAjoute est une fonction qui ajoute un enregistrement dans une base de données).
SI HAjoute(Fiche) ALORS
//Si l'ajout de la "Fiche" est réussi, ces lignes attribuent des valeurs à certaines propriétés de l'objet "Suivi_equipe_mobile" et ajoutent cet objet à une base de données.
Suivi_equipe_mobile.Acompagnement_EM = COMBO_Acompagnement_équipe_mobile
Suivi_equipe_mobile.Perte_contact = COMBO_Perte_contact
Suivi_equipe_mobile.Relogement = INT_relogement
Suivi_equipe_mobile.Situation_stabilisée = INT_situation_stabilise
Suivi_equipe_mobile.Réorientation = INT_reorientation
Suivi_equipe_mobile.Prise_en_charge_partenaire = INT_prise_en_charge
Suivi_equipe_mobile.IDFiche = Fiche.IDFiche
HAjoute(Suivi_equipe_mobile)
FIN
SINON // c'st que Htrouve est à vrai
//Cette ligne met à jour la propriété "Acompagnement_EM" de l'objet "Suivi_equipe_mobile" avec la valeur de
// "COMBO_Acompagnement_équipe_mobile", puis elle modifie l'objet dans la base de données à l'aide de la fonction "HModifie".
Suivi_equipe_mobile.Acompagnement_EM = COMBO_Acompagnement_équipe_mobile
Suivi_equipe_mobile.Perte_contact = COMBO_Perte_contact
Suivi_equipe_mobile.Relogement =INT_relogement
Suivi_equipe_mobile.Situation_stabilisée = INT_situation_stabilise
Suivi_equipe_mobile.Réorientation = INT_reorientation
Suivi_equipe_mobile.Prise_en_charge_partenaire = INT_prise_en_charge
HModifie(Suivi_equipe_mobile)

Fiche.Année = COMBO_annee_de_saisie
Fiche.date_saisie= SAI_Date_de_saisie

Fiche.CDP = COMBO_CDP
Fiche.CDP_date=SAI_Date_CDP
Fiche.CQL = COMBO_CDQL
Fiche.CQL_date=SAI_Date_CQL
Fiche.CFP=COMBO_CFP
Fiche.CFP_date=SAI_Date_CFP
//
Fiche.Identité_du_ménage= SAI_Nom
Fiche.Identité_prenom=SAI_Prénom
Fiche.Téléphone=SAI_Téléphone
Fiche.email=SAI_Email
Fiche.adresse=SAI_Adresse
Fiche.Commune=COMBO_Commune
Fiche.Composition_familiale=COMBO_composition_familiale
Fiche.Tranche_d_Age=COMBO_age
Fiche.Cat_socioprofessionnelle_des_ménages=COMBO_categporie_professionnelle
Fiche.Montant_de_la_dette=SAI_Montant_de_la_dette
Fiche.Cause_impayé_1=COMBO_cause_impayé_1
Fiche.Cause_impayé_2=COMBO_cause_impayé_2
Fiche.Cause_impayé_3=COMBO_cause_impayé_3

HModifie(Fiche)
FIN
Ferme("",Vrai)
Membre enregistré
32 messages
Posté le 28 mars 2024 - 10:29
Ous, j'ai oublié EcranVersFichier() dans le sinon, ce qui m’allège le code.
Membre enregistré
32 messages
Posté le 28 mars 2024 - 12:26
Je ne comprends pas pourquoi j'ai à nouveau une erreur d'intégrité à l'ajout en insérant la partie préconisation.

// Lecture des informations saisies
EcranVersFichier()

//Cette ligne lit la première occurrence dans une liste ou une base de données (représentée par "Fiche") où "IDFiche" correspond à "Fiche.IDFiche".
HLitRecherchePremier(Fiche,IDFiche,Fiche.IDFiche)
//Cela vérifie si la fonction "HTrouve" n'a pas trouvé de correspondance dans la recherche précédente.
SI HTrouve() = Faux ALORS
//Si aucune correspondance n'est trouvée, cette ligne attribue la valeur de "SAI_Nom" à la propriété "Identité_du_ménage" de l'objet "Fiche".
// Lecture des informations saisies
//EcranVersFichier()
// doublons ci-dessous
Fiche.Identité_du_ménage = SAI_Nom
// Ensuite, cela vérifie si l'ajout de la "Fiche" est réussi (HAjoute est une fonction qui ajoute un enregistrement dans une base de données).
SI HAjoute(Fiche) ALORS
//Si l'ajout de la "Fiche" est réussi, ces lignes attribuent des valeurs à certaines propriétés de l'objet "Suivi_equipe_mobile" et ajoutent cet objet à une base de données.
Suivi_equipe_mobile.Acompagnement_EM = COMBO_Acompagnement_équipe_mobile
Suivi_equipe_mobile.Perte_contact = COMBO_Perte_contact
Suivi_equipe_mobile.Relogement = INT_relogement
Suivi_equipe_mobile.Situation_stabilisée = INT_situation_stabilise
Suivi_equipe_mobile.Réorientation = INT_reorientation
Suivi_equipe_mobile.Prise_en_charge_partenaire = INT_prise_en_charge
Suivi_equipe_mobile.IDFiche = Fiche.IDFiche
HAjoute(Suivi_equipe_mobile)
// parti préconisation
// Ajout d'un nouvel enregistrement à la table Juridique_preconisation
Juridique_preconisation.IDJuridique_preconisation = Fiche.IDFiche
Juridique_preconisation.Deposer_DALO = INT_Deposer_DALO // Ajouter d'autres champs ou valeurs selon vos besoins
HAjoute(Juridique_preconisation)
FIN
SINON // c'st que Htrouve est à vrai
//Cette ligne met à jour la propriété "Acompagnement_EM" de l'objet "Suivi_equipe_mobile" avec la valeur de
// "COMBO_Acompagnement_équipe_mobile", puis elle modifie l'objet dans la base de données à l'aide de la fonction "HModifie".
Suivi_equipe_mobile.Acompagnement_EM = COMBO_Acompagnement_équipe_mobile
Suivi_equipe_mobile.Perte_contact = COMBO_Perte_contact
Suivi_equipe_mobile.Relogement =INT_relogement
Suivi_equipe_mobile.Situation_stabilisée = INT_situation_stabilise
Suivi_equipe_mobile.Réorientation = INT_reorientation
Suivi_equipe_mobile.Prise_en_charge_partenaire = INT_prise_en_charge
HModifie(Suivi_equipe_mobile)
EcranVersFichier()
// pronisaction juri
//***************************************************************************************
Juridique_preconisation.IDJuridique_preconisation = Fiche.IDFiche
Juridique_preconisation.Deposer_DALO = INT_Deposer_DALO
HModifie(Juridique_preconisation)



HModifie(Fiche)
FIN
Ferme("",Vrai)
Membre enregistré
397 messages
Popularité : +13 (13 votes)
Posté le 28 mars 2024 - 18:10
Bonjour,

Sauf erreur de ma part, vous ne faites pas la liaison sur la bonne colonne.
Juridique_preconisation.IDJuridique_preconisation = Fiche.IDFiche
// Devrait être
Juridique_preconisation.IDFiche = Fiche.IDFiche
Membre enregistré
186 messages
Posté le 28 mars 2024 - 21:28
Cédric_34 a écrit :
@André STASZEWSKI
Bonjour,
"HlitrecherchePremier placé juste avant la condition pointe justement sur l'enregistrement", oui mais pour le fichier "Fiche".
Sans le HlitrecherchePremier sur le fichier "Details", on modifie l'enregistrement actif qui n'est pas forcément l'enregistrement souhaité.
Cdlt


Effectivement, j'ai lu trop vite...
Bien vu :merci:
Membre enregistré
32 messages
Posté le 05 avril 2024 - 15:11
Merci bchanudet, je n'ai pas eu le temps de me remettre sur ce projet et effectivement le pointage n'est pas le bon. :(

Pour ma curiosité personnelle : Là on utilise les conditions et le Wlanguage, il n'existe pas d'autres méthodes par requête ou directement en Wyswyg ?
J'en profite, je ne trouve pas d'aide sur les liaisons multiple sur les champs. Si vous avez un lien, je suis preneur.