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 :

Copier/dupliquer un enregistrement


Sujet :

WinDev

  1. #1
    Membre du Club
    Copier/dupliquer un enregistrement
    Bonjour,

    Je souhaite copier/dupliquer un en registre de mon fichier.L'affichage de ma table est alimenté par une requête.
    je me suis appui sur cette discussion dans le forum.

    [URL="https://www.developpez.net/forums/d1768921/environnements-developpement/windev/copier-coller-ligne-champs-table/[/URL] Donc : variable globale, gsXLigne est une chaine Sélection de la ligne à copier : [CODE]// Sélection de l'enregistrement à dupliquer SI TABLE_REQ_SelectionProduit <> -1 ALORS gsXLigne = TABLE_REQ_SelectionProduit[TABLE_REQ_SelectionProduit] FIN //1 : &Dupliquer //2 : &Ne pas dupliquer SELON Dialogue("Voulez-vous dupliquer cet enregistrement ?") // &Dupliquer CAS 1 // Dupliquer l'enregistrement sélectionné DupliquerEnregistrement() // &Ne pas dupliquer CAS 2 RETOUR FIN[/CODE] Copie et enregistrement de la ligne : [CODE]PROCÉDURE DupliquerEnregistrement() // On regarde la ligne sélectionné SI gsXLigne <> "" ALORS HLitDernier(FProduits, Référence) // On récupère la partie numérique les 6 derniers caractères nReference est un entier = Droite(FProduits.Référence,6) // Puis tu concatène selon le format désiré en complétant par des 0 devant ton n° incrémenté FProduits.Référence = "ATR-" + NumériqueVersChaîne(nReference + 1,"06d") // Extraire la valeur suivante de la chaîne COL_Référence = FProduits.Référence Trace(COL_Référence) // pour coller avec insertion d'une nouvelle ligne HAjoute(FProduits) Trace(gsXLigne) SINON Info("Sélectionnez d'abord la ligne à dupliquer") FIN // Réafficher la table TableAffiche(FI_ListeProduits.TABLE_REQ_SelectionProduit,taCourantEnreg) // Se positionner sur le dernier enregistrement TableSelectPlus(TABLE_REQ_SelectionProduit, TableOccurrence(TABLE_REQ_SelectionProduit))[/CODE] Tout fonctionne jusqu'à l'enregistrement : C'est le dernier enregistrement de mon fichier qui s'effectue avec la bonne référence modifiée mais pas la ligne sélectionnée au départ. Merci de votre aide .

  2. #2
    Membre expérimenté
    C'est normal, tu ajoutes juste après avoir lu le dernier !

  3. #3
    Membre du Club
    Si je comprends bien après mon hlitdernier qui me permet de récupérer ma dernière référence et de la modifier, je dois effectuer un hlitrecherche pour sélectionner la ligne souhaité, la modifier et l'enregistrer ?

    Merci de votre aide.

  4. #4
    Expert éminent
    Bonjour,

    comme te l'a dit Serendib, tu es positionné sur le dernier enregistrement : il est chargé en mémoire, tu modifies ta référence et tu enregistres

    Si j'ai bien compris :
    1- tu lis le dernier enregistrement
    2- tu crées/tritures/bidouilles (rayer les mentions inutiles ) la référence,
    3- tu veux la valeur de l'enregistrement sélectionné dans la table,
    4- tu remplace la référence par celle créée/triturée/bidouillée (rayer les mentions inutiles ),
    5- tu l'ajoutes dans ton fichier.

    Il te faut mémoriser ta valeur en 2, te positionner (3), remplacer la valeur (4) et enregistrer (5)
    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.

  5. #5
    Membre chevronné
    Bonjour,
    HSauvePosition est fait pour toi
    Il y a peut être plus simple, mais ça tourne

  6. #6
    Membre du Club
    Citation Envoyé par frenchsting Voir le message
    Bonjour,

    comme te l'a dit Serendib, tu es positionné sur le dernier enregistrement : il est chargé en mémoire, tu modifies ta référence et tu enregistres

    Si j'ai bien compris :
    1- tu lis le dernier enregistrement
    2- tu crées/tritures/bidouilles (rayer les mentions inutiles ) la référence,
    3- tu veux la valeur de l'enregistrement sélectionné dans la table,
    4- tu remplace la référence par celle créée/triturée/bidouillée (rayer les mentions inutiles ),
    5- tu l'ajoutes dans ton fichier.

    Il te faut mémoriser ta valeur en 2, te positionner (3), remplacer la valeur (4) et enregistrer (5)
    En résumé c'est un peu tous ça

    1 - Je sélectionne l'enregistrement à copier
    2 - Je lis le dernier enregistrement de mon fichier pour récupérer la dernière valeur de ma rubrique référence auquel j'incrémente de +1 (la bidouille débute là)
    3 - Et là je veux ajouter ma valeur (bidouillée) suivie des autres rubriques de l'enregistrement à copier.


  7. #7
    Membre du Club
    Citation Envoyé par Voroltinquo Voir le message
    Bonjour,
    HSauvePosition est fait pour toi
    Bonjour,
    Je vais regarder ce code et voir si j'y arrive.
    Merci

  8. #8
    Expert éminent
    Citation Envoyé par Rokitdev Voir le message
    En résumé c'est un peu tous ça

    1 - Je sélectionne l'enregistrement à copier
    2 - Je lis le dernier enregistrement de mon fichier pour récupérer la dernière valeur de ma rubrique référence auquel j'incrémente de +1 (la bidouille débute là)
    3 - Et là je veux ajouter ma valeur (bidouillée) suivie des autres rubriques de l'enregistrement à copier.

    Entre 2 et ton 3 tu dois sauvegarder ta valeur.
    En 3 tu te positionnes sur le bon enregistrement. Tu lui colles ta valeur bidouillée et tu j'ajoutes.
    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.

  9. #9
    Membre du Club
    Merci à tous de vos réponses et de votre aide je m'y colle et revient au plus tard demain vous donner des nouvelles.


  10. #10
    Membre du Club
    Bonjour,

    Je pense avoir modifier mon code comme indiqué mais il copie toujours mon dernier enregistrement de ma table mais pas ma ligne sélectionnée.
    Pour mémoire c'est une table alimenté par une requête.

    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
    PROCÉDURE DupliquerEnregistrement()
     
    // On regarde la ligne sélectionné
     
    SI gsXLigne <> "" ALORS
    	HLitDernier(FProduits, Référence)
    	// On récupère la partie numérique les 6 derniers caractères pour extraire la valeur référence de la chaîne
    	nReference est un entier = Droite(FProduits.Référence,6)
    	// Puis on concatène selon le format désiré en complétant par des 0 devant ton n° incrémenté + 1
    	FProduits.Référence = "ATR-" + NumériqueVersChaîne(nReference + 1,"06d")
    	// On mémorise la valeur modifié
    	sValeur est une chaîne = FProduits.Référence
    	// pour coller avec insertion d'une nouvelle ligne
    	FProduits.Référence = sValeur
    	HAjoute(FProduits)
    SINON
    	Info("Sélectionnez d'abord la ligne à dupliquer")
    FIN


    Je coince sur l'ajout.
    A l'enregistrement j'ai bien ma référence modifiée mais pas ma ligne sélectionnée que je veux dupliquer c'est toujours la dernière de mon fichier

    Merci de votre aide.

  11. #11
    Membre chevronné
    Citation Envoyé par Rokitdev Voir le message
    c'est toujours la dernière de mon fichier
    C'est logique, tu travailles avec le dernier enregistrement suite à l'instruction HLitDernier.
    En fait, tu veux incrémenter la référence de l'enregistrement sélectionné et l'ajouter en tant que nouvel enregistrement.

    Un truc du style :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sNouvelleRef est chaine
     
    sNouvelleRef=ChaineIncrémente(COL_Référence)
    Produit.Référence=sNouvelleRef
     
    HAjoute(Produit)
    HExécuteRequete(REQ_...)
    TableAffiche(TABLE_...)

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

  12. #12
    Membre expérimenté
    Tu lis les réponses ?
    Tu réfléchis, parfois ?
    Ou tu veux le code tout fait !

  13. #13
    Membre du Club
    Merci Voroltinquo de l'aide je restait sur HLitDernier.

    J'ai modifier comme suivant et c'est fonctionnel.

    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
    PROCÉDURE DupliquerEnregistrement()
     
    // On regarde la ligne sélectionné
    SI gsXLigne <> "" ALORS
     
    	// On lit la dernière référence
    	HLitDernier(FProduits, Référence)
    	// On récupère la partie numérique les 6 derniers caractères pour extraire la valeur référence de la chaîne
    	nReference est un entier = Droite(FProduits.Référence,6)
    	// Puis on concatène selon le format désiré en complétant par des 0 devant ton n° incrémenté + 1
    	FProduits.Référence = "ATR-" + NumériqueVersChaîne(nReference + 1,"06d")
    	// On mémorise la valeur modifié
    	sValeur est une chaîne = FProduits.Référence
     
    	HLitRecherche(FProduits,IDFProduits,gsXLigne)
    	SI HTrouve() ALORS
    		// pour coller avec insertion d'une nouvelle ligne
    		FProduits.Référence = sValeur
    		HAjoute(FProduits)
    	FIN
    SINON
    	Info("Sélectionnez d'abord la ligne à dupliquer")
    FIN
     
    // Réafficher la table
    TableAffiche(FI_ListeProduits.TABLE_REQ_SelectionProduit,taCourantEnreg)
     
    // Se positionner sur le dernier enregistrement
    TableSelectPlus(TABLE_REQ_SelectionProduit, TableOccurrence(TABLE_REQ_SelectionProduit))


    C'est peut-être pas joli mais pour un petit programme perso fait par un total amateur que je suis ça me plait

  14. #14
    Membre du Club
    Citation Envoyé par serendib Voir le message
    Tu lis les réponses ?
    Tu réfléchis, parfois ?
    Ou tu veux le code tout fait !
    Merci de l'aide et de la patience

    Mais non je ne lis pas
    Je ne sais pas réfléchir (plutôt même C.. )
    Et je ne vas pas de code tout fait


  15. #15
    Membre chevronné
    Tu fais un savant mélange d'entiers et de chaînes je me demande si à la longue ça va tenir le coup.
    Il y a peut être plus simple, mais ça tourne

  16. #16
    Membre du Club
    Citation Envoyé par Voroltinquo Voir le message
    A vue de nez, ton HLiRecherche est inutile.
    Par ailleurs, tu fais un savant mélange d'entiers et de chaînes je me demande si à la longue ça va tenir le coup.
    Je vais essayer de tout refaire en partant sur ton message précédent et ton code.

    Merci.

  17. #17
    Membre chevronné
    Dans un premier temps que renvoie ton champ table ? (Valeur mémorisée)
    Dans un deuxième temps es-tu en mono-poste, mono-utilisateur?
    Il y a peut être plus simple, mais ça tourne

  18. #18
    Membre du Club
    Ma table me renvoie la ligne que je veux dupliquer par
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SI TABLE_REQ_SelectionProduit <> -1 ALORS
    	gsXLigne = TABLE_REQ_SelectionProduit[TABLE_REQ_SelectionProduit]	
    FIN


    La valeur mémorisé sValeur n'est que ma valeur de la rubrique référence qui est une chaîne (clé unique) c'est pour cela que j'ai besoin de la modifier.

    Je suis en mono-poste et mono-utilisateur et de plus c'est une petite application toute personnelle qui me permet de gérer mon stock de composants électronique de 200 références pour l'instant.

    J'espère ne pas avoir répondu à côté.

  19. #19
    Membre chevronné
    Citation Envoyé par Rokitdev Voir le message
    Ma table me renvoie la ligne que je veux dupliquer par
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SI TABLE_REQ_SelectionProduit <> -1 ALORS
    	gsXLigne = TABLE_REQ_SelectionProduit[TABLE_REQ_SelectionProduit]	
    FIN


    La valeur mémorisé
    Lorsque l'on parle de la valeur mémorisée d'un champ table ou de la valeur renvoyée, on parle du réglage que l'on effectue dans la partie "Contenu" de la description du champ.
    A priori, tu n'a rien modifié donc c'est le comportement par défaut donc le n° de ligne, comme tu le précises au début de ton post.
    Dans un premier temps c'est un entier, pourquoi le stocker dans une chaîne ?
    Dans un 2° temps, tu fais une recherche sur IDProduit (qui est IDAuto je suppose) sur cette valeur pour récupérer l'enregistrement à dupliquer...
    Prenons le cas suivant
    PRODUIT
    N°Ligne IDProduit Produit
    1 1 Toto
    2 2 Titi
    3 3 Toto
    4 4 Tutu
    Jusque là, tout va bien, la ligne sélectionnée correspond à IDProduit
    Là ou ça se corse, c'est en cas de suppression d'un produit
    N°Ligne IDProduit Produit
    1 1 Toto
    2 3 Toto
    3 4 Tutu
    Avec ta manière de faire
    Si je sélectionne Toto, je vais rechercher le produit qui est à la 2° ligne (gxsLigne=2), c'est un moindre mal, la recherche sera infructueuse. Par contre, En sélectionnant Tutu, c'est Toto qui sera pris en compte.
    Il faut donc que ta table renvoie IDProduit. Une solution alternative consiste à créer un colonne cachée basée sur IDProduit et affecter la valeur de cette colonne à gxsLigne
    Il y a peut être plus simple, mais ça tourne

  20. #20
    Membre du Club
    Et si je me base sur ma colonne qui contient ma référence du produit au format "ATR-000001"qui est une clé unique dans mon fichier.
    Rubrique qui n'est pas modifiable.Elle ne peut être qu'en mode création ou suppression.

    Cela peut-il éviter le problème ?

    Merci de votre aide.