PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV (earlier versions) → taches parallèles
taches parallèles
Started by JUPETON, Dec., 10 2018 12:00 AM - 9 replies
Registered member
7 messages
Posted on December, 10 2018 - 12:00 AM
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
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on December, 10 2018 - 10:13 AM
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
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on December, 10 2018 - 10:19 AM
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.
Registered member
7 messages
Posted on December, 11 2018 - 7:23 AM
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
Posted on December, 11 2018 - 8:21 AM
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
Registered member
7 messages
Posted on December, 11 2018 - 9:35 AM
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)
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on December, 11 2018 - 9:41 AM
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
....
Registered member
28 messages
Popularité : +1 (1 vote)
Posted on December, 11 2018 - 9:45 AM
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

--
(\ _ /)
(='.'=)
(")-(")
Registered member
7 messages
Posted on December, 11 2018 - 10:01 AM
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)
Registered member
28 messages
Popularité : +1 (1 vote)
Posted on December, 11 2018 - 10:12 AM
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 modified, December, 11 2018 - 10:12 AM