1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

Problème de remplissage de fichier dans une tâche parallèle

Discussion dans 'Windev' créé par NCGUI, Juin 17, 2019.

  1. NCGUI

    NCGUI New Member

    Inscrit:
    Juin 1, 2018
    Messages:
    11
    J'aime reçus:
    0
    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.
     
    Tags:
  2. PhantomX

    PhantomX Member

    Inscrit:
    Juil 11, 2018
    Messages:
    78
    J'aime reçus:
    61
    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 :p)
    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
     
  3. NCGUI

    NCGUI New Member

    Inscrit:
    Juin 1, 2018
    Messages:
    11
    J'aime reçus:
    0
    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.
     
  4. PhantomX

    PhantomX Member

    Inscrit:
    Juil 11, 2018
    Messages:
    78
    J'aime reçus:
    61
    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.
     
  5. NCGUI

    NCGUI New Member

    Inscrit:
    Juin 1, 2018
    Messages:
    11
    J'aime reçus:
    0
    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>.
     
  6. PhantomX

    PhantomX Member

    Inscrit:
    Juil 11, 2018
    Messages:
    78
    J'aime reçus:
    61
    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. :)
     
    Kill3rbko et suenodesign aiment ça.
  7. NCGUI

    NCGUI New Member

    Inscrit:
    Juin 1, 2018
    Messages:
    11
    J'aime reçus:
    0
    Bonjour. Ok merci beaucoup. Tu testes et je te tiens au courant.
     
  8. NCGUI

    NCGUI New Member

    Inscrit:
    Juin 1, 2018
    Messages:
    11
    J'aime reçus:
    0
    Bsr Phantomx.

    Merci INFINIMENT pour ta disponibilité. J'ai testé et ça marche impeccablement. Mille fois merci.
     
  9. NCGUI

    NCGUI New Member

    Inscrit:
    Juin 1, 2018
    Messages:
    11
    J'aime reçus:
    0
    STP Dernière faveur marque le post comme résolu. je ne vois comment le faire.
     

Partager cette page

Chargement...