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 :

Répétion OuiNon dans une boucle [WD24]


Sujet :

WinDev

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut Répétion OuiNon dans une boucle
    Bonjour à toutes et à tous,

    J'ai une fenêtre "réception de commande" dans laquelle j'ai récupéré les données d'une commande dans différents champs et notamment dans un champ table, dans lequel s'affiche Référence, Couleur, Quantité et autres. J'enregistre les valeurs dans des fichiers de données en cliquant sur un bouton "Enregister".
    Cela fonctionne depuis plusieurs mois.

    Je voudrais améliorer cette fenêtre pour gérer les reliquats lorsque la quantité d'un article à été modifiée. Je vous passe les détails de ce que j'ai fait pour que lorsque la quantité est soit à zéro soit modifiée un booléen "COL_Receptionne = 0".

    Là ou je rame c'est quand plusieurs ligne du champ table "Quantité" ont été modifiée parce que je fais une boucle "POUR TOUTE LIGNE DE" qui parcours le champ table à la recherche du booléen "COL_Receptionne = 0". Dés que la boucle en trouve un elle ouvre un OuiNon qui pose la question "Voulez-vous gérer les reliquats?".

    Si je clique sur Oui cela passe un "INT_Reliquat" de la ligne à 1 et la boucle continue jusqu'au prochain. Et c'est là ma difficulté, la boite de dialogue se répète autant de fois "COL_Receptionne = 0" ce qui n'est pas utile.

    Je voudrai que la boucle continue sans demander à chaque si je veux gérer les reliquats.

    J'ai essayé d’arrêter la boucle en utilisant les instruction SORTIR et RETOUR (mais peut-être pas au bon endroit).

    Je vous joins la partie du code où se pose mon problème et plus particulièrement à partir de la ligne 29 ou se trouve la partie qui fait appel à la boite de dialogue.

    Je sais que c'est le bordel dans mon code mais je suis pas un professionnel.

    Code WINDEV : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
     
    //Boucle pour parcourir toues les lignes du champ table
    POUR TOUTE LIGNE DE TABLE_REQ_Commande_en_Cours
     
    	//SI les interrupteurs restent cochés (Ils sont cochés par défaut, il faut les décocher si la marchandise n'est pas réceptionné soit totalement, soit partiellement)
    	//Maintenant les interrupteurs sont décochés automatiquement si une quantité est modifiée ou mise à zéro
     
    	//Partie 1
    	//Si toutes les lignes ont COL_Receptionne à 1
    	SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 1 ALORS
     
    		//Recherche dans le fichier de donnée COMMANDE_LIGNE que les IDligne_commande_ligne correspondent à l'identique
    		//avec les ID de TABLE_REQ_Commande_en_Cours.COL_commande_ligne_ligne
    		HLitRecherche(commande_ligne, IDligne_commande_ligne, TABLE_REQ_Commande_en_Cours.COL_commande_ligne_ligne,hIdentique)
     
    		TABLE_REQ_Commande_en_Cours.COL_commande_ligne_ligne = commande_ligne.IDligne_commande_ligne
    		//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE_LIGNE
    		commande_ligne.commande_ligne_receptionnee = TABLE_REQ_Commande_en_Cours.COL_Receptionne
    		SI HTrouve(commande_ligne) = Vrai ALORS
    			//Enregistre les modifications
    			HModifie(commande_ligne)
    		SINON
    			Erreur(HErreurInfo())
    		FIN	
     
     
     
    		//Partie 1 de 1
    		//Si des lignes ont COL_Receptionne à 0
    		SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 0 ALORS
     
    			//Ouvre une boite de dialogue OuiNon
    			SI OuiNon("Voulez-vous gérer les reliquats pour cette commande") = Oui ALORS
     
    				//Si clic sur le bouton Oui
    				//Coche INT_Reliquat
    				INT_Reliquat = 1
     
    				//J'ai essayé d'utiliser les instructions SORTIR et RETOUR ici mais la boucle s’arrête.
    				//J'ai fait un trace sur le nIndice et n'y avait que le numéro de la première ligne modifiée
    				//			SORTIR
    			FIN	
    		FIN
    		//Fin Partie 1 de 1
     
    		//J'ai essayé ceci pour re-parcourir les lignes du champs table mais ça n'empêche le OUiNON de se répéter
    		//	//Si des lignes ont COL_Receptionne à 0
    		//	SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 0 ALORS
    		//		
    		//			//Coche INT_Reliquat
    		//			INT_Reliquat = 1
    		//			
    		//	FIN	
    		//		
     
     
    		//Partie 2 de 1
    		//Pour procéder à l'enregistrement des valeurs dans les fichiers de données
     
    		//Recherche dans le fichier Commande que le numéro de commande correspondent à l'identique
    		//avec le numéro de commande dans SAI_Numéro_de_Commande
    		//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
    		HLitRecherche(commande,commande_numero,SAI_Numéro_de_Commande,hIdentique)
     
    		//Si trouve le Numéro de la commande Alors
    		SI HTrouve(commande) ALORS
     
    			//Le champs de saisie augment la valeur du numéro de reliquat de 1
    			SAI_Numero_Reliquat += commande.Commande_Reliquat_Numero
     
    			commande.Commande_Reliquat = INT_Reliquat
    			commande.Commande_Reliquat_Numero =SAI_Numero_Reliquat
    			commande.archive = 0
    			//Enregistre les modifications
    			HModifie(commande)
    		FIN
    		//Fin de Partie 2 de 1
     
    	SINON
    		//Recherche dans le fichier de donnée COMMANDE que le numéro de commande correspondent à l'identique
    		//avec le numéro de commande dans SAI_Numéro_de_Commande
    		HLitRecherche(commande, commande_numero, SAI_Numéro_de_Commande,hIdentique)
    		//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
    		commande.archive = 1
    		//Enregistre les modifications
    		HModifie(commande)
     
    	FIN
    	//Fin de Partie 1
     
    FIN

    Merci de vos retours et infos.

    Bien à vous

    Gregus

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 428
    Points : 10 497
    Points
    10 497
    Par défaut
    Bonjour,
    Une réponse rapide: tu fais deux passes:
    1. Tu parcours toutes les lignes, et si tu en trouve une qui correspond, tu mets à vrai un booléen. Là tu peux sortir de la boucle
    2. Tu demandes à l'utilisateur ce qu'il veux faire, et tu notes sa réponse dans nu booléen.
    3. Enfin dans ta boucle principale, tu as déjà la réponse, donc tu sais si tu dois ou non traiter les reliquats.

    C'est un peu bourrin de parcourir 2 fois la table, mais je doute fortement que tu ais des milliers de lignes, et (à priori) tout se fait en mémoire.

    Tatayo.

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    3 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 3 153
    Points : 7 227
    Points
    7 227
    Par défaut
    Quand j'enlève un certain nombre de lignes, je vois ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    POUR TOUTE LIGNE DE TABLE_REQ_Commande_en_Cours
    	SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 1 ALORS
    		SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 0 ALORS
            ... ...
    Je peux me tromper, mais les lignes que j'ai retiré ne jouent pas ...
    Et du coup, on ne rentrerait jamais dans le 2ème SI ... ALORS.

    Je dois forcément me tromper quelque part, puisque le OuiNon problématique, il est justement à cet endroit là.
    Bizarre.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    Bonjour tatayo et tbc92,
    Bonjour à toutes et tous,

    J'ai lu vos messages respectif avant quelque heures de sommeil. Je pense que vos réponse m'oriente vers la même chose. A savoir,
    ceci :
    Code WINDEV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 1 ALORS
    est, si l'on peut le dire ainsi, l'inverse ou le contraire de cela :
    Code WINDEV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 0 ALORS
    donc je parcours
    Citation Envoyé par tatayo Voir le message
    2 fois la table
    (Effectivement je n'ai pas des milliers de ligne par contre je ne suis pas en mémoire, j'utilise des fichiers de données en HFSQL C/S.)

    En fait, je devrais la parcourir qu'une seule fois et donc faire un choix, soit je parcours le champ table par COL_Receptionne = 1 soit par COL_Receptionne = 0 et dans l'instruction "SI" je passe les instructions fausse dans un "SINON".

    Je vais revoir cela et reviens vous faire part de mes essais.

  5. #5
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    juin 2017
    Messages
    1 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : juin 2017
    Messages : 1 637
    Points : 2 874
    Points
    2 874
    Par défaut
    Bonjour,
    Pourquoi ne pas modifier ta requête de manière à ce qu'elle ne retourne que les qts modifiées ou nulles.
    Il suffi alors de d'alimenter ton champ table avec ta requête. En parallèle, tu ajoutes une colonne interrupteur pour la gestion des reliquats. (au bout de quelques fenêtre "oui-non" l'utilisateur va en avoir marre et cliquer n'importe où.) Tu n'a plus qu'a traiter les lignes cochées par l'utilisateur.
    Il y a peut être plus simple, mais ça tourne

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    mai 2003
    Messages
    722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : mai 2003
    Messages : 722
    Points : 1 261
    Points
    1 261
    Par défaut
    Bonjour une solution simple est de créer un booléen ReponseRecue. Tu n'affiches le message que si le booléen est a faux. Tu le mets à vrai après la premiere réponse.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  7. #7
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    mutlitâche-multifonction
    Inscrit en
    juin 2003
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : mutlitâche-multifonction
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 4 100
    Points : 7 010
    Points
    7 010
    Par défaut
    Bonjour,

    En lisant la demande, j'allais répondre comme Philouz. Merci à toi de l'avoir écrite pour moi, Philippe.
    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.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    J'ai suivi les conseils de tatayo et tbc92 et du coup j'ai commencé par reprendre le code en supprimant tout ce qui était inutile ou redondant.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    POUR TOUTE LIGNE DE TABLE_REQ_Commande_en_Cours
     
    	//Partie 1
    	//Si toutes les lignes ont COL_Receptionne à 1
    	//SI les interrupteurs restent cochés (Ils sont cochés par défaut, il faut les décocher si la marchandise n'est pas réceptionné soit totalement, soit partiellement)
    	//Maintenant les interrupteurs sont décochés automatiquement si une quantité est modifiée ou mise à zéro
    	SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 0 ALORS
     
     
    		//Coche l'interrupteur INT_Reliquat
    		INT_Reliquat = 1
     
    		//Le champs de saisie augment la valeur du numéro de reliquat de 1
    		SAI_Numero_Reliquat = commande.Commande_Reliquat_Numero+1
     
    		//Recherche dans le fichier Commande que le numéro de commande correspondent à l'identique
    		//avec le numéro de commande dans SAI_Numéro_de_Commande
    		HLitRecherche(commande,commande_numero,SAI_Numéro_de_Commande,hIdentique)
     
    		//Si trouve le Numéro de la commande Alors
    		SI HTrouve(commande) ALORS
     
    	        //Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
     			commande.Commande_Reliquat = INT_Reliquat
    			commande.Commande_Reliquat_Numero =SAI_Numero_Reliquat
    //archive devient faux (Il est passé à vrai à l'ouverture de la fenêtre)
    			commande.archive = 0
     
    			//Enregistre les modifications
    			HModifie(commande)
     
    //Recherche dans le fichier de données commande_ligne que le numéro de la ligne correspondent à l'identique
    //avec le numéro de la ligne dans TABLE_REQ_Commande_en_Cours.COL_commande_ligne_ligne
    			HLitRecherche(commande_ligne, IDligne_commande_ligne, TABLE_REQ_Commande_en_Cours.COL_commande_ligne_ligne,hIdentique)
     
    			//Si trouve le numéro de la ligne alors
    			SI HTrouve(commande_ligne) ALORS
    //commande_ligne_receptionnee devient faux (Il est passé à vrai au chargement du champ table)
    				commande_ligne.commande_ligne_receptionnee = 0
     
    				//Enregistre les modifications
    				HModifie(commande_ligne)	
    			FIN
    		FIN
    	FIN
    FIN
    Cela fonctionne et j'obtiens bien les bonnes informations dans les fenêtres et les fichiers de données. J'ai même gagné en temps parce que le traitement de la boucle s’exécute que si une quantité à été modifiée.

    Ce que je n'ai toujours pas réussi à faire pour obtenir le résultat que je souhaite est avec la boite de dialogue "OuiNon"

    en effet si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .../...
    SI OuiNon("Voulez-vous gérer les reliquats pour la commande " +SAI_Numéro_de_Commande+ " ?") = Non ALORS
    .../...
    dans la boucle, le traitement s’exécute autant de fois que de ligne pour lesquelles la quantité a été modifiée. Et comme le dit très justement Voroltinquo au bout de quelques fenêtres j'en ai marre et puis c'est stupide comme fonctionnement.

    Il n'y a pas moyen d'éviter cette répétition si le traitement a déjà eu lieu une fois par un simple bout de code ????

    @Voroltinquo:
    Ma requête rempli le champ table à partir du numéro de la commande issu du fichier de données commande et également présent dans le fichier de données commande_ligne pour les lignes de la commande.
    Lorsque je réceptionne pour la première fois une commande les quantités sont par défaut celles de commande_ligne que je modifie si besoin depuis le champ table.
    A ce stade et tant que je n'ai cliqué sur le bouton "enregistrer" il n'y a aucune quantité modifiée ou null dans le fichier de donnée et donc je ne vois pas comment modifier ma requête.

    J'ai déjà une colonne "reliquat" qui se trouve dans le fichier donnée commande et que je fais cocher par la boucle dès la première quantité modifiée.

    @philouZ et @frenchsting
    Je vais regardé votre suggestion

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 428
    Points : 10 497
    Points
    10 497
    Par défaut
    Si tu mets un OuiNon dans une boucle, la demande sera faire plusieurs fois...
    Je vois deux façons de faire (il en existe certainement plusieurs autres).
    Tu fais une première passe pour voir s'il y a des reliquats, demander à l'utilisateur ce qu'il veut faire, et mettre sa réponse dans un booléen.
    Tu utilises alors ce booléen dans la boucle.

    Tu déclares 2 booléens : un premier pour savoir si tu as posé la question, et un autre pour la réponse.
    Dans la boucle, si les deux sont négatifs, tu poses la question, passe le premier à vrai et tu mémorises la réponse.
    Ensuite (donc en dehors du test), tu gères le reliquat en fonction de la réponse de l'utilisateur.

    Tatayo.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    @tatayo
    En écrivant mon post #8 j'ai réalisé ce que je crois que tu m'expliques dans
    Tu déclares 2 booléens
    Du coup j'avais commencé à écrire ceci quand j'ai vu ton post
    Code WINDEV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 0 ET INT_Reliquat = 0 ALORS
    		SI OuiNon("Voulez-vous gérer les reliquats pour la commande " +SAI_Numéro_de_Commande+ " ?") = Oui ALORS
    //.../... suite du traitement
     
    SINON
     
    //.../... traitement du dessus sans le "OuiNon"

    Je ne sais pas si je suis sur la bonne piste mais je teste

  11. #11
    Membre actif

    Homme Profil pro
    Sans
    Inscrit en
    mars 2018
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : mars 2018
    Messages : 140
    Points : 275
    Points
    275
    Billets dans le blog
    1
    Par défaut
    Tu peux aussi faire une première passe et stocker tous les éléments modifiés dans un array (ou leur indice table ou leur ID fichier).

    A la sortie de boucle, tu poses ton oui/non et tu ne traites que les éléments modifiés dans une seconde boucle si la réponse est oui.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    Je crois que j'ai réussi.

    Je teste encore et je vous explique ce que j'ai fait.

  13. #13
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    3 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 3 153
    Points : 7 227
    Points
    7 227
    Par défaut
    Peut-être que l'utilisateur veut qu'on répète la question 3 fois, 40 fois ...

    Plutôt que la fenêtre OuiNon, tu peux utiliser une fenêtre avec 3 boutons ( fonction dialogue ) :
    Voulez vous faire la modification ?
    Oui pour cette ligne
    Oui pour toutes les lignes
    Non.

    Et du coup, comme pour les autres scénarios, il faut que tu gardes quelque part une trace : L'utilisateur veut que je lui pose la question, ou il ne veut plus que je lui pose la question.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    C'est bon ça fonctionne,

    Merci pour vos conseils qui mon permis d'aboutir au résultat final que je recherchais.

    Le dernier conseil de tbc92 est un truc au quel j'avais pensé en utilisant des CAS N1, CAS N2,... Mais je n'ai jamais encore eu besoin d'avoir recours à cette technique, alors j'ai choisi ce que je savais faire.
    Comme je suis le seul utilisateur et que je code en même temps, je fais au plus simple et surtout plus facile. Quand je m'améliorerai bien j'explorerai d'autre possibilités.

    Pour les explications, j'ai fait en deux passes, j'avais déjà tous les éléments nécessaires dans la fenêtre, il mes restait qu'à bien les utiliser.
    Je ne sais pas si ma méthode est bonne mais grâce a vos réponses j'ai pu ré-ordonner les idées et les traitements. Bon j'ai mis longtemps à comprendre et il m'a relire plusieurs vos réponses.

    La première passe boucle sur toutes les lignes du champ table pour décocher un booléen "Réceptionné" selon si les quantités sont modifiées ou non par rapport à la commande.
    Dans cette passe j'en profite pour cocher un interrupteur "Reliquat" que j'utiliserai dans la deuxième passe.

    Dans la deuxième passe, selon que INT_Reliquat est coché ou pas j'appelle le OuiNon et/ou procède aux enregistrements.

    Voilà.

    Je vous mets le code si quelqu'un trouvait des améliorations à apporter. Je sais que ce n'est pas parfait, ni dans les règles de l'art. Mais je me répète je ne suis pas un professionnel et je suis le seul utilisateur.

    Code Windev : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    //Boucle pour parcourir toues les lignes du champ table
    POUR TOUTE LIGNE DE TABLE_REQ_Commande_en_Cours
     
    	//Si toutes les lignes ont COL_Receptionne à 1
    	//SI les interrupteurs restent cochés (Ils sont cochés par défaut, il faut les décocher si la marchandise n'est pas réceptionné soit totalement, soit partiellement)
    	//Maintenant les interrupteurs sont décochés automatiquement si une quantité est modifiée ou mise à zéro
    	SI TABLE_REQ_Commande_en_Cours.COL_Receptionne = 0 ALORS
     
    		//Si clic sur le bouton Oui
    		//Coche INT_Reliquat
    		INT_Reliquat = 1
     
    		//Recherche dans le fichier Commande que le numéro de commande correspondent à l'identique
    		//avec le numéro de commande dans SAI_Numéro_de_Commande
    		//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
    		HLitRecherche(commande,commande_numero,SAI_Numéro_de_Commande,hIdentique)
     
    		//Si trouve le Numéro de la commande Alors
    		SI HTrouve(commande) ALORS
    			commande.Commande_Reliquat = INT_Reliquat
    			commande.archive = 0
     
    			//Enregistre les modifications
    			//Commenté pour les tests
    			HModifie(commande)
     
    			HLitRecherche(commande_ligne, IDligne_commande_ligne, TABLE_REQ_Commande_en_Cours.COL_commande_ligne_ligne,hIdentique)
     
    			//Si trouve le Numéro de la commande Alors
    			SI HTrouve(commande_ligne) ALORS
    				commande_ligne.commande_ligne_receptionnee = 0
     
    				//Enregistre les modifications
    				//Commenté pour les tests
    				HModifie(commande_ligne)	
    			FIN
    		FIN
    	SINON
    		HLitRecherche(commande_ligne, IDligne_commande_ligne, TABLE_REQ_Commande_en_Cours.COL_commande_ligne_ligne,hIdentique)
     
    		//Si trouve le Numéro de la commande Alors
    		SI HTrouve(commande_ligne) ALORS
    			commande_ligne.commande_ligne_receptionnee = 1
     
    			//Enregistre les modifications
    			HModifie(commande_ligne)	
    		FIN
    	FIN
    FIN
     
    SI INT_Reliquat = 1 ALORS
    	SI OuiNon("Voulez-vous gérer les reliquats pour la commande " +SAI_Numéro_de_Commande+ " ?") = Oui ALORS
     
    		//Le champs de saisie augment la valeur du numéro de reliquat de 1
    		SAI_Numero_Reliquat = commande.Commande_Reliquat_Numero+1
     
    		//Recherche dans le fichier Commande que le numéro de commande correspondent à l'identique
    		//avec le numéro de commande dans SAI_Numéro_de_Commande
    		//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
    		HLitRecherche(commande,commande_numero,SAI_Numéro_de_Commande,hIdentique)
     
    		//Si trouve le Numéro de la commande Alors
    		SI HTrouve(commande) ALORS
    			commande.Commande_Reliquat_Numero = SAI_Numero_Reliquat
    			//Enregistre les modifications
    			//Commenté pour les tests
    			HModifie(commande)
    		FIN
     
     
    	SINON
     
    		SI SAI_Numero_Reliquat = 0 ALORS
    			//Si clic sur le bouton Oui
    			//INT_Reliquat prend pour valeur 0
    			INT_Reliquat = 0
     
    			//Recherche dans le fichier Commande que le numéro de commande correspondent à l'identique
    			//avec le numéro de commande dans SAI_Numéro_de_Commande
    			//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
    			HLitRecherche(commande,commande_numero,SAI_Numéro_de_Commande,hIdentique)
     
    			//Si trouve le Numéro de la commande Alors
    			SI HTrouve(commande) ALORS
    				commande.Commande_Reliquat = INT_Reliquat
    				commande.archive = 1
     
    				//Enregistre les modifications
    				HModifie(commande)
    			FIN
    		SINON
    			//Si clic sur le bouton Oui
    			//INT_Reliquat prend pour valeur 0
    			INT_Reliquat = 1
     
    			//Recherche dans le fichier Commande que le numéro de commande correspondent à l'identique
    			//avec le numéro de commande dans SAI_Numéro_de_Commande
    			//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
    			HLitRecherche(commande,commande_numero,SAI_Numéro_de_Commande,hIdentique)
     
    			//Si trouve le Numéro de la commande Alors
    			SI HTrouve(commande) ALORS
    				commande.Commande_Reliquat = INT_Reliquat
    				commande.archive = 1
     
    				//Enregistre les modifications
    				HModifie(commande)
     
    			FIN
     
     
     
     
     
     
    		FIN		
    	FIN
    SINON
    	//Si clic sur le bouton Oui
    	//INT_Reliquat prend pour valeur 0
    	INT_Reliquat = 0
     
    	//Recherche dans le fichier Commande que le numéro de commande correspondent à l'identique
    	//avec le numéro de commande dans SAI_Numéro_de_Commande
    	//Renvoi la valeur des champs interrupteurs dans le fichier de donnée COMMANDE
    	HLitRecherche(commande,commande_numero,SAI_Numéro_de_Commande,hIdentique)
     
    	//Si trouve le Numéro de la commande Alors
    	SI HTrouve(commande) ALORS
    		commande.Commande_Reliquat = INT_Reliquat
    		commande.archive = 1
     
    		//Enregistre les modifications
    		HModifie(commande)
     
    	FIN
    FIN

    Encore merci parce que sans votre aide je n'avais pas encore la solution. J'avais compris qu'il fallait que le OuiNon soit en dehors de la boucle mais je ne visualisais absolument pas comment faire pour le sortir de là.

    Merci

    Gregus

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

Discussions similaires

  1. [langage] incrementation de variable dans une boucle
    Par mimilou dans le forum Langage
    Réponses: 15
    Dernier message: 16/04/2004, 13h23
  2. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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