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

  1. #1
    Membre régulier
    Récupérer dans un enregistrement existant certaines données de l'enregistrement précédent
    Bonjour à tous,
    je souhaiterais modifier un enregistrement existant en récupérant certaines données de l'enregistrement précédent. Si j'arrive bien à modifier la fiche, je me heurte à son enregistrement. Pour ce faire, j'ai récupéré un fichier test (Adr_Livraison) comportant 5 rubriques : ID, Client, Code Postal, Ville et Pays. Ce fichier comporte 5 enregistrements, tous remplis sauf le dernier avec les rubriques Code Postal, Ville et Pays vides. Lors de l'affichage de la table, je sélectionne l'enregistrement 5, clic sur bouton modifier mène à l'affichage de la fiche avec les champs Code postal, Ville et Pays vides et ID et Client corrects. Sur clic du BTN-Reprendre, j'ai le code suivant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELON Dialogue("Voulez-vous recopier les éléments de la fiche précédente ?")
    	CAS 1
    		//lecture enregistrement précédent
    		HLitPrécédent(Adr_Livraison,IDAdresseLivraison)
    		//choix des champs
    		SC_Fiche.SAI_Ville = Adr_Livraison.Ville
    		SC_Fiche.SAI_CodePostal = Adr_Livraison.CodePostal
    		SC_Fiche.SAI_Pays = Adr_Livraison.Pays
     
    	CAS 2
    	// Ne rien faire	
    FIN


    Ma fiche de l'enregistrement 5 prend bien en compte les valeurs Code Postal, Ville et Pays de l'enregistrement précédent. Par contre le BTN_Valider :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EcranVersFichier()
    HEnregistre(Adr_Livraison)
    // Ferme la fenêtre
    Ferme("",Vrai)

    n'est pas opérant. Il ne prend pas en compte la modification de la fiche, les champs Code Postal, Ville et Pays restent vides dans la table et pire la rubrique Client de la fiche 4 prend la valeur de la fiche 5. Malgré mon acharnement, je n'arrive pas à trouver la solution, aussi conseils et pistes à suivre sont les bienvenus.

    Bonne journée
    Bernisch

  2. #2
    Expert éminent
    Bonjour,
    Dans le premier cas tu affectes les valeurs "à la main", et pas dans le deuxième cas.
    J'en déduis que les champs de saisie ne sont pas liés aux rubriques du fichier.
    Donc soit tu affectes à la main lors de l'enregistrement, soit tu lies les champs de saisie aux rubriques du fichier.

    Tatayo.

  3. #3
    Membre régulier
    Précisions
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Dans le premier cas tu affectes les valeurs "à la main", et pas dans le deuxième cas.
    J'en déduis que les champs de saisie ne sont pas liés aux rubriques du fichier.
    Donc soit tu affectes à la main lors de l'enregistrement, soit tu lies les champs de saisie aux rubriques du fichier.

    Tatayo.
    je suppose que tu ne parles pas des CAS 1 et CAS 2 de SELON Dialogue. Les valeurs sont bien affectées avec le premier code dans la fiche identifiée ID5. Les champs sont bien liés aux rubriques puisqu'une modification "à la main" est prise en compte. Je ne comprends pas pourquoi le deuxième code ne s'exécute pas et surtout pourquoi il y a modification de la fiche précédente.
    Merci pour ton aide

    Bernisch

  4. #4
    Rédacteur/Modérateur

    Il faut comprendre la logique derrière les fonctions hXxxx()
    Il y a un pointeur sur chaque fichier (une flèche, un marque-page).
    Quand on exécute une instruction hEnregistre() ou hModifie(), ça modifie l'enregistrement visé par ce pointeur.

    Quand on exécute une instruction hLitSuivant, hLitPrecédent, hLitRecherchePremier () etc ..., ça déplace le pointeur.

    Du coup ici :
    Quand tu affiches la fenêtre, ton pointeur pointe vers un enregistrement (le n°5)
    Tu as besoin d'aller lire l'enregistrement n°4
    Sauf action particulière, le hEnregistre qui suit va donc modifier l'enregistrement n°4

    2 options pour corriger :

    Option n°1 : Si l'utilisateur demande à recopier les infos de l'enreg. précédent, remettre le pointeur à sa place avant de continuer.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    HLitPrécédent(Adr_Livraison,IDAdresseLivraison)
    		//choix des champs
    		SC_Fiche.SAI_Ville = Adr_Livraison.Ville
    		SC_Fiche.SAI_CodePostal = Adr_Livraison.CodePostal
    		SC_Fiche.SAI_Pays = Adr_Livraison.Pays
                    HLitSuivant(Adr_Livraison,IDAdresseLivraison)     //   <-- Pour revenir à l'enregistrement qui nous intéresse


    Option n°2 : dans le bouton Valider
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HlitRecherche( Adr_Livraison , ??? , ??? )     //   Je ne connais pas exactement ta structure,  mais se repositionner sur l'enregistrement qui nous intéresse 
    EcranVersFichier()
    HEnregistre(Adr_Livraison)
    // Ferme la fenêtre
    Ferme("",Vrai)



    Il y a peut-être une autre piste en utilisant les contextes. J'en parle au cas où, mais je viens de regarder la documentation, et a priori, ce n'est pas adapté.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre régulier
    Merci popur les explications
    Bonsoir tbc92,

    merci pour tes explications sur le déplacement du pointeur. J'ai choisi ta première option et cela fonctionne parfaitement.

    Bonne fin de journée
    Bernisch

  6. #6
    Membre régulier
    je vais trop vite
    Je suis allé trop vite, cela fonctionne parfaitement avec le fichier test. En essayant de transposer la chose dans le fichier dans lequel je veux obtenir le même résultat, je suis confronté au message suivant :
    La source de données <7220> n'est pas initialisée.
    -S'il s'agit d'un fichier de données, le fichier n'a pas été trouvé dans l'analyse <D:\Mes Projets\Mes_Oeuvres\Mes_Oeuvres_1.wdd> ou n'a pas été décrit avec les fonctions HDéclare / HDéclareExterne.
    As-tu une idée ? Comment initialiser la source, le fichier Oeuvres fait bien partie de l'analyse.
    Bernisch

  7. #7
    Rédacteur/Modérateur

    Aucune idée.
    Est-ce que le n° 7220 t'inspire, est-ce que l'enregistrement que tu essaies de modifier porterait ce n°7220 ?
    Et dans ce cas je ferais : HLitSuivant("Adr_Livraison","IDAdresseLivraison") au lieu de HLitSuivant(Adr_Livraison,IDAdresseLivraison)
    Mais il n'y a pas de raison que ce soit ça.


    Plus solide : En principe, Windev te dit sur quelle ligne du programme ça plante. C'est quelle ligne ?


    Enfin, dernière piste pour 'diagnostiquer le problème ' (après, il faudra le résoudre) :

    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
     
    b est un booleen
    b=HLitPrécédent(Adr_Livraison,IDAdresseLivraison)
    si pas b alors 
       erreur ( " Plantage hLitPrecedent", hErreurinfo() ) 
       renvoyer faux 
    fin
    //choix des champs
    SC_Fiche.SAI_Ville = Adr_Livraison.Ville
    SC_Fiche.SAI_CodePostal = Adr_Livraison.CodePostal
    SC_Fiche.SAI_Pays = Adr_Livraison.Pays
    b=HLitSuivant(Adr_Livraison,IDAdresseLivraison)     //   <-- Pour revenir à l'enregistrement qui nous intéresse 
    si pas b alors 
       erreur ( " Plantage hLitSuivant", hErreurinfo() ) 
       renvoyer faux 
    fin
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #8
    Membre régulier
    Réponses
    Pour répondre à tes questions:
    • le 7220 est bien l'ID de la fiche que je veux modifier
    • la ligne notée en erreur est :
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      HLitPrécédent(Oeuvres.IDOeuvres)
      avec comme remarque "La source de données <7220> n'est pas initialisée, -S'il s'agit d'un fichier de données, le fichier n'a pas été trouvé dans l'analyse...."
    • Pour le diagnostique : l'erreur se situe dès la 2ème ligne
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      b=HLitPrécédent(Oeuvres,IDOeuvres)
      avec comme remarque "Aucun parcours n'a été amorcé pour la rubrique <IDOeuvres> sur le fichier <Oeuvres>.


    Bonne soirée
    Bernisch

  9. #9
    Membre expérimenté
    Bonjour,
    Pour pouvoir lire l'enregistrement précédent, il faut que l'enregistrement en cours soit lu. C'est cette lecture qui amorce le parcours.
    Un code du style :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    clLivraisonSource est CMLivraison //Instancie la lasse mappée Livraison
     
    HSauvePosition(Livraison,PK_Livraison)
    HlitRecherche(Livraison,PK_Livraison,nIDLivraisonSource) //Recherche les données à copier
    FichierVersMemoire(clLivraisonSource,Livraison)
    HRestaurePosition(Livraison,PK_Livraison)
    MémoireVersFichier(clLivraisonSource,Livraison)
    HEnregistre(Livraison)

    Devrait faire l'affaire
    Il y a peut être plus simple, mais ça tourne

  10. #10
    Rédacteur/Modérateur

    C'est un peu bizarre, ton fichier s'appelait adresse_Livraison, et maintenant, il s'appelle oeuvres.

    HLitPrécédent(Oeuvres.IDOeuvres) , ça ne peut pas marcher. C'est une virgule qu'il faut et surtout pas un point. Là, oeuvres.IdOeuvres est un nombre, il vaut notre fameux 7220 ; Windev s'attend à ce qu'on lui dise quel fichier il faut lire (1er paramètre de hLitPrécédent) et au lieu de lui envoyer un nom de fichier, on lui envoie le nombre 7220.

    A propos du 2ème message : "Aucun parcours n'a été amorcé pour la rubrique <IDOeuvres> sur le fichier <Oeuvres>." , ça veut dire quoi ?
    La première lecture d'un fichier, ça doit se faire par une commande hLit() ou hLitRecherche() ou hLitRecherchePRemier() (j'en oublie peut-être 1 ou 2 variantes) ; ça ne peut pas être hLitPrecedent() ni hLitSuivant()

    Si je reprend mon histoire de marque page, on ne peut pas dire 'page précédente' ni 'page suivante' si on n'a pas d'abord dit : 'aller à la page n°X'.
    Il faut d'abord placer le pointeur à un emplacement précis (hLitRecherchePremier par exemple), et ensuite, on peut dire Suivant ou Précédent.

    Et toutes ces contraintes sont valables sur chaque fichier. Si on se positionne sur un environnement précis sur le fichier Livraison hlitPremier(Livraison, idLivraison), ça n'autorise pas à faire hLitPrécédent(Oeuvres) juste après. Il faut une commande hLitPremier sur chacun des fichiers.

    Je te laisse dans les mains de Voroltinquo, il connaît visiblement beaucoup mieux que moi les commandes hXxx()
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre régulier
    Bonjour tcb92,
    Passage de Ad_Livraison vers Oeuvres: Ad_livraison est un fichier faisant partie d'une base remplie de bric et de broc et dans laquelle je teste les codes avec lesquels je rencontre des difficultés. Oeuvres est le fichier dans lequel je veux appliquer ce code. À noter que le code que tu m'avais proposé fonctionne correctement avec le fichier Adr_Livraisons ce qui m'avait amené à te répondre que tout était OK. Lors de son adaptation au fichier Oeuvres, j'ai rencontré les difficultés précédemment exposées. Je n'arrive pas à comprendre la différence de réaction entre ces 2 fichiers. Seule différence notable, Adr_Livraison est en configuration 64 bits et Oeuvres en 32 bits.
    Merci encore pour ton aide.
    Bonne journée
    Bernisch

  12. #12
    Membre régulier
    Problème résolu
    Bonjour à vous deux,

    j'ai résolu la chose de la façon suivante en conservant la première option proposé par tcb92; il suffisait de trier la table par l'IDOeuvres et non sur une autre clé avec doublon. Même si cela est contraignant dans l'affichage, tout semble correctement fonctionner. Pour la proposition de Voroltinquo: si tu peux avoir la patience et la gentillesse de m'expliquer, je suis preneur.
    Merci à vous deux et bonne journée.
    Bernisch

  13. #13
    Expert éminent
    Hello Bernisch,

    J'arrive après la bataille, mais je pense que tu aurais pu également t'en sortir avec des variables de type enregistrement.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

  14. #14
    Membre expérimenté
    Citation Envoyé par frenchsting Voir le message
    Tu aurais pu également t'en sortir avec des variables de type enregistrement.
    En effet, cela évite le passage par les classes mappées.
    Citation Envoyé par bernisch Voir le message
    Si tu peux avoir la patience et la gentillesse de m'expliquer, je suis preneur.
    J'utilise 2 concepts dans mon code. Lequel veux tu que je développe ?
    Il y a peut être plus simple, mais ça tourne

  15. #15
    Membre régulier
    Hello frenchsting
    Citation Envoyé par frenchsting Voir le message
    Hello Bernisch,

    J'arrive après la bataille, mais je pense que tu aurais pu également t'en sortir avec des variables de type enregistrement.
    Même si tu arrives après la bataille, content de savoir que tu es toujours là.

    Bernisch

  16. #16
    Membre régulier
    Choix du concept
    Citation Envoyé par Voroltinquo Voir le message
    En effet, cela évite le passage par les classes mappées.

    J'utilise 2 concepts dans mon code. Lequel veux tu que je développe ?
    Bonjour Voroltinquo,
    je n'ai ni a priori, ni de connaissances suffisantes pour m'autoriser à faire un choix. Je te laisse le soin de décider pour celui qui est le plus facilement compréhensible pour l'amateur que je suis.
    Bonne journée
    Bernisch

  17. #17
    Expert éminent
    Bonjour Bernisch,

    Merci de ta sollicitude.

    Il n'y a pas de "meilleure" solution. Dans ce cas, il faut que tu utilises celle qui te parle le plus. Ma solution est quasi la même que celle de Voroltinquo. C'est un peu comme choisir une variable de type réel ou monétaire pour manipuler des décimaux.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.