Bonsoir à tous, Je bloque depuis un moment dans mon code. Je fais appel à tous ceux qui pourraient m'aider. Voilà: J'ai un fichier TMP_MENSUEL dont la structure est la suivante: TMP_MENSUEL.CODEFOURN TMP_MENSUEL.DESIGNATION TMP_MENSUEL.JANVIER TMP_MENSUEL.FEVRIER TMP_MENSUEL.MARS TMP_MENSUEL.AVRIL TMP_MENSUEL.MAI TMP_MENSUEL.JUIN TMP_MENSUEL.JUILLET TMP_MENSUEL.AOUT TMP_MENSUEL.SEPTEMBR TMP_MENSUEL.OCTOBRE TMP_MENSUEL.NOVEMBRE TMP_MENSUEL.DECEMBRE Ce fichier est déjà rempli avec le code founiture et la désignation. je voudrais donc parcourir ce fichier du début à la fin et pour chaque ligne, allez chercher la quantité entrée pour chaque mois jusqu'à 12 mois avant de passer à la fourniture suivante. Voici mon code: HExécuteRequête(REQ_SELECT_TMP_FOURN_TCD,hRequêteDéfaut) HLitPremier(REQ_SELECT_TMP_FOURN_TCD) TANTQUE PAS HEnDehors(REQ_SELECT_TMP_FOURN_TCD) //----- HLitRecherchePremier(TMP_MENSUEL,IDTMP_MENSUEL,REQ_SELECT_TMP_FOURN_TCD.IDTMP_MENSUEL) SI HTrouve(TMP_MENSUEL) ALORS //--Recup. pour les 12 mois de la fourniture en cours. POUR ind=1 _A_ 12 sMonMois=NumériqueVersChaîne(ind,"02d") //---Je récupère les quantités entrées mois par mois TâcheParallèleExécute(RecupQteEntreeMois,(sMonMois,REQ_SELECT_TMP_FOURN_TCD.CODEFOURNIT)) FIN j'écris les quantités des 12 mois de la ligne fourniture ///---------------- ///---------------- TMP_MENSUEL.JANVIER = sJanv TMP_MENSUEL.FEVRIER = sFev TMP_MENSUEL.MARS = sMars TMP_MENSUEL.AVRIL = sAvril TMP_MENSUEL.MAI = sMai TMP_MENSUEL.JUIN = sJuin TMP_MENSUEL.JUILLET = sJuillet TMP_MENSUEL.AOUT = sAout TMP_MENSUEL.SEPTEMBRE= sSept TMP_MENSUEL.OCTOBRE = sOct TMP_MENSUEL.NOVEMBRE = sNov TMP_MENSUEL.DECEMBRE = sDecemb HModifie(TMP_MENSUEL) FIN //----- HLitSuivant(REQ_SELECT_TMP_FOURN_TCD) FIN la deuxième procédure qui récupère les quantités PROCEDURE RecupQteEntreeMois(_Mois,_codeFourn) nQte est un entier=0 REQ_TCD_ENTREE_FOURNIT.sEtatDansLaLsite = "1;2" REQ_TCD_ENTREE_FOURNIT.sExo = gpExerciceEncours REQ_TCD_ENTREE_FOURNIT.sCodeFourn = _codeFourn REQ_TCD_ENTREE_FOURNIT.sMois = _Mois HExécuteRequête(REQ_TCD_ENTREE_FOURNIT,hRequêteDéfaut) HLitPremier(REQ_TCD_ENTREE_FOURNIT) SI PAS HEnDehors(REQ_TCD_ENTREE_FOURNIT) ALORS nQte = REQ_TCD_ENTREE_FOURNIT.QTE_LIVREE FIN //------------------------- //------------------------- SELON _Mois CAS "01" sJanv = nQte CAS "02" sFev = nQte CAS "03" sMars = nQte CAS "04" sAvril = nQte CAS "05" sMai = nQte CAS "06" sJuin = nQte CAS "07" sJuillet = nQte CAS "08" sAout = nQte CAS "09" sSept = nQte CAS "10" sOct = nQte CAS "11" sNov = nQte CAS "12" sDecemb = nQte AUTRE CAS FIN Rien donc ne marche pourriez vous m'éclairer s'il vous plaît. Merci.
Bonjour, Ta modification devrait être à l'intérieur de ta tâche parallèle, présentement elle est à l'extérieur. Par défaut le code s'exécute à la suite, ligne 1, ligne 2, ligne n..., le code est bloquer tant que la ligne n'est pas exécuter si on peut dire Par contre lorsque tu lance une tache parallèle, le code continue, alors c'est comme si tu lui dit au code : calcul le résultat et avant même que le calcul soit terminé, tu demande de modifier la table de données. et en plus tu ne lui indique pas du tout ou il est rendu. Tu vient de lancer 12+ calculs en même temps, même si le mois de janvier est lancer en premier, tu ne peux pas savoir qu'il va se terminer en premier il pourrait être terminée après le mois de décembre si le calcul de janvier est plus long. Tes paramètres de ta tâches devrait être en local pour éviter que ton calcul devienne erronée (je le fait toujours par précaution car on connait pas toujours ce qui se passe sous les couvertures ) PROCEDURE RecupQteEntreeMois(LOCAL _Mois est une chaine, LOCAL _codeFourn est une chaine) En passant, une petite méthode de travail qui pourrait aussi te facilité la vie. Plutôt que d'utilisé un HlitPremier() et Tantque PAS HEnDehors, tu peux utilisé la boucle POUR TOUT POUR TOUT REQ_SELECT_TMP_FOURN_TCD // code FIN Ceci facilite le code et rend beaucoup plus facile la lisibilité de celui-ci. En bref, à l'intérieur de la même procédure tu doit exécuter ton calcul, recherche la ligne à modifier et la modifier. Sinon ca te prendrait une tache parallèle de récupération qui va récupéré la valeur de ton mois calculer, ta quantité ainsi que ton identifant de ligne à modifié, voir Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens! Mais dans ton cas, 1 s
Merci Phantom. Je t'avoue en postant ce message je priais que tu passes par là. Merci de prendre de ton temps pour nous. Je teste et je fais un retour.
Merci Ca me fait plaisir, si ca ne fonctionne pas comme tu veux, gêne toi pas pour réécrire, je repassera au courant de la soirée.
Bonsoir. J'ai effectué les modifications. Et j'obtiens ceci : A l'ouverture de fenêtre qui affiche les résultats j'ai dans le code initialisation RecupEntreeStock() //--------------------------------------------------------- //--Procedure locale PROCEDURE RecupEntreeStock() REQ_SELECT_TMP_FOURN_TCD.sCodeF=SFournit HExécuteRequête(REQ_SELECT_TMP_FOURN_TCD,hRequêteDéfaut) POUR TOUT REQ_SELECT_TMP_FOURN_TCD HLitRecherchePremier(TMP_MENSUEL,IDTMP_MENSUEL,REQ_SELECT_TMP_FOURN_TCD.IDTMP_MENSUEL) SI HTrouve(TMP_MENSUEL) ALORS //--Recup. pour les 12 mois de la fourniture en cours. POUR ind=1 _A_ 12 sMonMois=NumériqueVersChaîne(ind,"02d") TâcheParallèleExécute(RecupQteEntreeMois,(sMonMois,REQ_SELECT_TMP_FOURN_TCD.CODEFOURNIT)) FIN FIN FIN //------------------------------------ //------------------------------------ PROCEDURE RecupQteEntreeMois(_Mois est une chaîne,_codeFourn est une chaîne) nQte est un entier=0 REQ_TCD_ENTREE_FOURNIT.sEtatDansLaLsite = "1;2" REQ_TCD_ENTREE_FOURNIT.sExo = gpExerciceEncours REQ_TCD_ENTREE_FOURNIT.sCodeFourn = _codeFourn REQ_TCD_ENTREE_FOURNIT.sMois = _Mois HExécuteRequête(REQ_TCD_ENTREE_FOURNIT,hRequêteDéfaut) HLitPremier(REQ_TCD_ENTREE_FOURNIT) SI PAS HEnDehors(REQ_TCD_ENTREE_FOURNIT) ALORS nQte = REQ_TCD_ENTREE_FOURNIT.QTE_LIVREE FIN //------------------------- //------------------------- SELON _Mois CAS "01" sJanv = nQte TMP_MENSUEL.JANVIER = sJanv CAS "02" sFev = nQte TMP_MENSUEL.FEVRIER = sFev CAS "03" sMars = nQte TMP_MENSUEL.MARS = sMars CAS "04" sAvril = nQte TMP_MENSUEL.AVRIL = sAvril CAS "05" sMai = nQte TMP_MENSUEL.MAI = sMai CAS "06" sJuin = nQte TMP_MENSUEL.JUIN = sJuin CAS "07" sJuillet = nQte TMP_MENSUEL.JUILLET = sJuillet CAS "08" sAout = nQte TMP_MENSUEL.AOUT = sAout CAS "09" sSept = nQte TMP_MENSUEL.SEPTEMBRE= sSept CAS "10" sOct = nQte TMP_MENSUEL.OCTOBRE = sOct CAS "11" sNov = nQte TMP_MENSUEL.NOVEMBRE = sNov CAS "12" sDecemb = nQte TMP_MENSUEL.DECEMBRE = sDecemb AUTRE CAS FIN HModifie(TMP_MENSUEL) Sur HModifie j'ai l'erreur : Erreur à la ligne 81 du traitement Procédure locale RecupQteEntreeMois. Vous avez appelé la fonction HModifie. Aucun enregistrement en cours n'est défini pour le fichier <TMP_MENSUEL>.
Rebonjour Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens! , Tu fait un HLitRecherPremier avant d'exécuter ta tâche parallèle. Comme j'ai mentionné plus haut une tache parallèle ne s'exécute plus séquentiellement à ton code mais bien en parallèle. Dans ta boucle tu demande de rechercher un enregistrement et dans un tache parallèle tu demande de le modifié, mais vue que plusieurs tâche sont lancées en même temps, on ne peut pas savoir lequel des enregistrement sera réellement modifié. Ton HLitRecherche et ton HModifie doivent être les 2 dans ta tâches parallèles. Voilà ce qui devrait fonctionner en espérant que tu l'analyse pour bien le comprendre Code (Windev): PROCEDURE RecupEntreeStock() REQ_SELECT_TMP_FOURN_TCD.sCodeF=SFournit Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(REQ_SELECT_TMP_FOURN_TCD,hRequêteDéfaut) POUR TOUT REQ_SELECT_TMP_FOURN_TCD POUR i = 1 _A_ 12 // tes TP ne font que récupérer les paramètres, le code est ensuite exécuter complètement dans ta TP TâcheParallèleExécute(RecupQteEntreeMois, (i, REQ_SELECT_TMP_FOURN_TCD.CODEFOURNIT, REQ_SELECT_TMP_FOURN_TCD.IDTMP_MENSUEL)) FIN FIN PROCÉDURE RecupQteEntreeMois(LOCAL indMois est un entier, LOCAL codeFourn est une chaîne, LOCAL nIDTMP_MENSUEL est un entier) Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(TMP_MENSUEL ,IDTMP_MENSUEL, nIDTMP_MENSUEL) // récupération de l'id provenant de requête bouclé SI Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(TMP_MENSUEL) ALORS sMonMois=Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(indMois, "02d") nQte est un entier=0 REQ_TCD_ENTREE_FOURNIT.sEtatDansLaLsite = "1;2" REQ_TCD_ENTREE_FOURNIT.sExo = gpExerciceEncours REQ_TCD_ENTREE_FOURNIT.sCodeFourn = codeFourn REQ_TCD_ENTREE_FOURNIT.sMois = sMonMois Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(REQ_TCD_ENTREE_FOURNIT,hRequêteDéfaut) Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(REQ_TCD_ENTREE_FOURNIT) SI PAS Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(REQ_TCD_ENTREE_FOURNIT) ALORS nQte = REQ_TCD_ENTREE_FOURNIT.QTE_LIVREE FIN SELON sMonMois CAS "01" sJanv = nQte TMP_MENSUEL.JANVIER = sJanv CAS "02" ... FIN // modification de l'enregistrement Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!(TMP_MENSUEL) FIN Tout ton code est maintenant encapsuler dans ta TP. Un autre petit point : Ton sMonMois=NumériqueVersChaîne(indMois, "02d") pourrait être à l'extérieur de ta TP et lui passé directement le paramètre comme tu l'avais fait. Par contre il ne faut pas oublier que TOUT code réaliser en dehors d'un thread ou d'une tâche parallèle utilise le thread principal et est donc bloquant. Il devrait donc, à mon avis, être à l'intérieur de ta TP. Espérant t'avoir aider à éclaircir tout ça.
Bsr Phantomx. Merci INFINIMENT pour ta disponibilité. J'ai testé et ça marche impeccablement. Mille fois merci.