PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → taches parallèles
taches parallèles
Débuté par JUPETON, 10 déc. 2018 00:00 - 9 réponses
Membre enregistré
7 messages
Posté le 10 décembre 2018 - 00:00
Bonjour à tous,
suite à mes recherches sur la gestion des taches parallèles, je me suis exercé sur un projet mais malheureusement j'ai message d'erreur : "Un élément de type 'TâcheParallèle' n'a pas de valeur."
je ne sais pas où commencer dans mes recherches. j'ai besoin de votre aide!!!

voici mon code :
//Trace("calcul stock : "+HeureSys())
gMaTache_qtéSortie,gMaTache_qtéEntrée,gMaTache_qtéUG,gMaTache_qtéAttente, gMaTache_qtéTransf, gMaTache_qtéRegul, gMaTache_qtéDét, gMaTache_qtéCH, gMaTache_qtéReclam, gMaTache_qtéMatPre, gMaTache_qtéRetourDepot sont des TâcheParallèle

dDateDbt, dDateFin est une Date
xStkInit, xIDMémo, xStockVente,xStockTransferé, xQteAttente, xStkAchat, xStkDef, xStkRegul,xStkDeconditionnéeDet,xStkDeconditionnéePr, xStkRéclamé,xStkUG,xStkMatPremiere, xStkRetourDepot est un numérique = 0

//HExécuteRequête(REQ_LastDateMémoStock,hRequêteDéfaut)
SI HNbEnr(MémoStock) = 0 ALORS
dDateDbt = "10000101"
dDateFin = gdDatejournée
SINON
//HLitDernier(MémoStock,IDMémoStock)
HExécuteRequête(REQ_MemoStockLast,hRequêteDéfaut)
//dDateDbt = MémoStock.DateMémoStock
dDateDbt = REQ_MemoStockLast.DateMémoStock
dDateDbt..Jour ++
//trace("date debut "+dDateDbt)
xIDMémo = REQ_MemoStockLast.IDMémoStock
dDateFin = gdDatejournée
//dDateFin..Jour --
//Trace("date fin "+dDatefin)
FIN

REQ_StockInitialMémo.art = xIDARTICL
REQ_StockInitialMémo.MémoID = xIDMémo
HExécuteRequête(REQ_StockInitialMémo,hRequêteDéfaut)//,xIDARTICL,xIDMémo)
SI HNbEnr(REQ_StockInitialMémo) = 0 ALORS
xStkInit = 0
SINON
xStkInit = REQ_StockInitialMémo.StockArticle
FIN
//Trace("Stock init "+xStkInit)

gMaTache_qtéSortie = TâcheParallèleExécute(Calcul_QtéVendue,(xIDARTICL,dDateDbt,dDateFin,xStockVente),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéEntrée = TâcheParallèleExécute(Calcul_QtéLivrée,(xIDARTICL,dDateDbt,dDateFin,xStkAchat),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéUG = TâcheParallèleExécute(Calcul_QtéUG,(xIDARTICL,dDateDbt,dDateFin,xStkUG),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéAttente = TâcheParallèleExécute(Calcul_QtéVenteEnAttente,(xIDARTICL,dDateDbt,dDateFin,xQteAttente),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéTransf = TâcheParallèleExécute(Calcul_QtéTransférée,(xIDARTICL,dDateDbt,dDateFin,xStockTransferé),tpoCopieComplèteContexteHFSQL)

gMaTache_qtéRegul = TâcheParallèleExécute(Calcul_QtéCorrigée,(xIDARTICL,dDateDbt,dDateFin,xStkRegul),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéDét = TâcheParallèleExécute(Calcul_QtéDéstockageDétail,(xIDARTICL,dDateDbt,dDateFin,xStkDeconditionnéeDet),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéCH = TâcheParallèleExécute(Calcul_QtéDéstockagePr,(xIDARTICL,dDateDbt,dDateFin,xStkDeconditionnéePr),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéReclam = TâcheParallèleExécute(Calcul_QtéRetournée,(xIDARTICL,dDateDbt,dDateFin,xStkRéclamé),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéMatPre = TâcheParallèleExécute(Calcul_QtéMP,(xIDARTICL,dDateDbt,dDateFin,xStkMatPremiere),tpoCopieComplèteContexteHFSQL)
gMaTache_qtéRetourDepot = TâcheParallèleExécute(Calcul_QtéRetourDépôt,(xIDARTICL,dDateDbt,dDateFin,xStkRetourDepot),tpoCopieComplèteContexteHFSQL)

TâcheParallèleExécuteAprèsToutes([gMaTache_qtéSortie,gMaTache_qtéEntrée,gMaTache_qtéUG,gMaTache_qtéAttente,gMaTache_qtéTransf,gMaTache_qtéRegul,gMaTache_qtéDét,gMaTache_qtéCH,gMaTache_qtéReclam,gMaTache_qtéMatPre,gMaTache_qtéRetourDepot],...)
AfficheStock,(xIDARTICL,0,xStkInit,gMaTache_qtéEntrée,gMaTache_qtéSortie,gMaTache_qtéTransf,gMaTache_qtéAttente,gMaTache_qtéRegul,gMaTache_qtéCH,gMaTache_qtéDét,gMaTache_qtéReclam,gMaTache_qtéUG,gMaTache_qtéMatPre,gMaTache_qtéRetourDepot),tpoThreadPrincipal)



voici le code d'une de mes taches parallèles
Procedure Calcul_QtéLivrée(xIDARTICL,dDateDbt,dDateFin,xStkAchat)
xStkAchat = 0
SI HExécuteRequête(REQ_HistoriqueQtéEntrée,hRequêteDéfaut,xIDARTICL,dDateDbt,dDateFin) ALORS
SI HNbEnr(REQ_HistoriqueQtéEntrée) = 0 ALORS
xStkAchat = 0
SINON
POUR TOUTE REQ_HistoriqueQtéEntrée
xStkAchat += REQ_HistoriqueQtéEntrée.QteAchetée
FIN
FIN
SINON
xStkAchat = 0
FIN
RENVOYER xStkAchat
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 10 décembre 2018 - 10:13
bonjour,

avec le nombre de tâches que vous avez, je pense qu'un petit tableau serait sympa.

_mes_taches est un tableau de TâchesParallèles


Vous faite un petit : ( après chaque TâcheParallèleExécute() )
Ajoute(_mes_taches, nomdematacheparallèle )


Ensuite votre soucis viens je pense du fait que vous envoyé vos tâches parallèles à votre procédure AfficheStock()
qui elle je suppose s'attend a avoir plutôt le retour de vos tâches.

Donc çà serait plutôt , ceci en reprenant le tableau de tâches et en utilisant le mot clé ValeurRenvoyéeTâchePrécédente
TâcheParallèleExécuteAprèsToutes(_mes_taches,
AfficheStock,(xIDARTICL,0,xStkInit,ValeurRenvoyéeTâchePrécédente),tpoThreadPrincipal)



à tester ;) bon dèv
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 10 décembre 2018 - 10:19
A , j'oubliais,

pourquoi dans vos tâches parallèles vous vous servez qu'un paramètre comme retour ?


Procedure Calcul_QtéLivrée(xIDARTICL,dDateDbt,dDateFin) : numerique
PRIVÉ
_val_retour est un numerique = 0

SI HExécuteRequête(REQ_HistoriqueQtéEntrée,hRequêteDéfaut,xIDARTICL,dDateDbt,dDateFin) ALORS
POUR TOUTE REQ_HistoriqueQtéEntrée
_val_retour += REQ_HistoriqueQtéEntrée.QteAchetée
FIN
FIN
RENVOYER _val_retour


çà simplifierait le nombre de paramètres de vos tâches...

Peu être également prévoir une requête qui ne vous renvoie qu'une seule ligne avec les quantités cumulées directement, çà éviterait de tout parcourir.
Membre enregistré
7 messages
Posté le 11 décembre 2018 - 07:23
bonjour Christophe,
merci pour le coup de main, voici une copie de l'application de vos conseils :
gMaTache_qtéSortie = TâcheParallèleExécute(Calcul_QtéVendue,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéSortie )

gMaTache_qtéEntrée = TâcheParallèleExécute(Calcul_QtéLivrée,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéEntrée )

gMaTache_qtéUG = TâcheParallèleExécute(Calcul_QtéUG,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéUG )

gMaTache_qtéAttente = TâcheParallèleExécute(Calcul_QtéVenteEnAttente,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéAttente )

gMaTache_qtéTransf = TâcheParallèleExécute(Calcul_QtéTransférée,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéTransf )

gMaTache_qtéRegul = TâcheParallèleExécute(Calcul_QtéCorrigée,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéRegul )

gMaTache_qtéDét = TâcheParallèleExécute(Calcul_QtéDéstockageDétail,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéDét )

gMaTache_qtéCH = TâcheParallèleExécute(Calcul_QtéDéstockagePr,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéCH )

gMaTache_qtéReclam = TâcheParallèleExécute(Calcul_QtéRetournée,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéReclam )

gMaTache_qtéMatPre = TâcheParallèleExécute(Calcul_QtéMP,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéMatPre )

gMaTache_qtéRetourDepot = TâcheParallèleExécute(Calcul_QtéRetourDépôt,(xIDARTICL,dDateDbt,dDateFin),tpoCopieComplèteContexteHFSQL)
Ajoute(_mes_taches, gMaTache_qtéRetourDepot )

TâcheParallèleExécuteAprèsToutes(_mes_taches,
AfficheStock,(xIDARTICL,0,xStkInit,ValeurRenvoyéeTâchePrécédente),tpoThreadPrincipal)


mais voila une erreur que j'ai à mon niveau. il s'agit de ma procédure afficheStock.
Les paramètres d'appel du code 'Procédure locale AfficheStock' sont incorrects : on attendait 14 paramètres et on en a reçu 4.
Procedure AfficheStock(xIDARTICL,xStkDef,xStkInit,xStkAchat,xStockVente,xStockTransferé,xQteAttente,xStkRegul,xStkDeconditionnéePr,xStkDeconditionnéeDet,xStkRéclamé,xStkUG,xStkMatPremiere,xStkRetourDepot)

HLitRecherche(Produits,IDProduits,xIDARTICL,hIdentique)
SI HTrouve(Produits) ALORS
xStkDef = xStkInit + xStkAchat - xStockVente - xStockTransferé - xQteAttente + xStkRegul - xStkDeconditionnéePr + xStkDeconditionnéeDet - xStkRéclamé + xStkUG - xStkMatPremiere + xStkRetourDepot//- xStkPack
SAI_STOCK = xStkDef
//SAI_StockT1 = xStkDef
SI Produits.StockArticle <> xStkDef ALORS
Produits.StockArticle = xStkDef
HModifie(Produits,hNumEnrEnCours,hBlocageNon)
FIN
FIN


Merci pour votre pour votre aide
Posté le 11 décembre 2018 - 08:21
Bonjour JUPETON,

Si tu n'utilise pas tous les paramètres, met les en optionnel dans la déclaration :

Procedure AfficheStock(xIDARTICL,xStkDef,xStkInit,xStkAchat,xStockVente = 0,xStockTransferé = 0,xQteAttente = 0,xStkRegul = 0,xStkDeconditionnéePr = 0,xStkDeconditionnéeDet = 0,xStkRéclamé = 0,xStkUG = 0,xStkMatPremiere = 0,xStkRetourDepot = 0)

HLitRecherche(Produits,IDProduits,xIDARTICL,hIdentique)
SI HTrouve(Produits) ALORS
xStkDef = xStkInit + xStkAchat - xStockVente - xStockTransferé - xQteAttente + xStkRegul - xStkDeconditionnéePr + xStkDeconditionnéeDet - xStkRéclamé + xStkUG - xStkMatPremiere + xStkRetourDepot//- xStkPack
SAI_STOCK = xStkDef
//SAI_StockT1 = xStkDef
SI Produits.StockArticle <> xStkDef ALORS
Produits.StockArticle = xStkDef
HModifie(Produits,hNumEnrEnCours,hBlocageNon)
FIN
FIN
Membre enregistré
7 messages
Posté le 11 décembre 2018 - 09:35
Bonjour Geoffrey
je crois que mon problème doit se situer dans l'exploitation des données : ValeurRenvoyéeTâchePrécédente

Comment exploiter les valeurs issues des différentes taches pour effectuer mon calcul dans la procédure AfficheStock?
TâcheParallèleExécuteAprèsToutes(_mes_taches,
AfficheStock,(xIDARTICL,0,xStkInit,ValeurRenvoyéeTâchePrécédente),tpoThreadPrincipal)
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 11 décembre 2018 - 09:41
rebonjour,

vous êtes certain que toutes vos fonctions 'Calcul_XXXXX' font toute un RENVOYER xxxxxxx ?
et qu'elle ne plante pas ?

Vous pouvez rajouter : numerique dans l'entête de vos fonctions, çà permettra à windev de vous indiquez celle où il n'y a pas de RENVOYER

par exemple :
Procedure Calcul_QtéRetourDépot(param1,param2,param3) : numerique
....
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 11 décembre 2018 - 09:45
Pardon, je n'avait pas fait gaffe à la fonction que tu utilisais. Une erreur dans le nom:

Ce n'est pas : ValeurRenvoyéeTâchePrécédente
Mais : ValeursRenvoyéesTâchesPrécédentes
Tu as oublié les S

--
(\ _ /)
(='.'=)
(")-(")
Membre enregistré
7 messages
Posté le 11 décembre 2018 - 10:01
Bonjour Geoffrey et Christophe
comment exploiter ValeursRenvoyéesTâchesPrécédentes dans ma procédure AfficheStock
Comment exploiter les valeurs issues des différentes taches pour effectuer mon calcul dans la procédure AfficheStock ?
TâcheParallèleExécuteAprèsToutes(_mes_taches,
AfficheStock,(xIDARTICL,0,xStkInit,ValeursRenvoyéesTâchesPrécédentes ),tpoThreadPrincipal)
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 11 décembre 2018 - 10:12
Aide de windev:
Le mot-clé ValeursRenvoyéesTâchesPrécédentes permet de passer les valeurs de retour des tâches 
précédentes en paramètre de la procédure de continuation,
 dans l'ordre des tâches du tableau des tâches précédentes.


Donc tu exploite comme tu le fait d'habitude avec n'importe qu'elle autre fonction. Après j'ai un doute sur cette forme :

(xIDARTICL,0,xStkInit,ValeursRenvoyéesTâchesPrécédentes )


Je pense qu'il faudrait plus un truc comme ça (Pas testé):
TâcheParallèleExécuteAprèsToutes(_mes_taches,
AfficheStock,ValeursRenvoyéesTâchesPrécédentes,tpoThreadPrincipal)


Mais dans ce cas, faudrait pouvoir passer les paramètres manquant.

C'est pas propre, mais une tâche parallèle pour chaque xIDARTICL,0,xStkInit? A testé pour voir si c'est ça.

--
(\ _ /)
(='.'=)
(")-(")
Message modifié, 11 décembre 2018 - 10:12