Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD11 HFCS]

2 réponses
Avatar
Pascal F
Bonsoir,
J'ai un problème avec une requete qui s'execute parfaitement bien en HF classic et qui ne fonctionne pas en HFCS.

Je fais une première requete.
Pas de problème.
Ensuite je fais une autre requete portant sur plusieurs fichiers et sur des rubriques de la 1ère requete.
Le hExecuteRequeteSQL ne retourne pas d'erreur, mais dès que je veux lire les enregistrement ou simplement le nombre
d'enregistrement de la 2ème requete, le système est bloqué comme si le système était dans une boucle infinie. Sur le serveur
hébergeant le moteur HFCS, le service Manta consomme pendant ce temps entre 2 et 25% des ressources.
Voici le code:

PROCEDURE VIRTUELLE Affiche_CA_Marge()


eInd est un entier
mTauxHoraire est un monétaire
cReqTot est une chaîne
so_SourceTot est une Source de Données
so_MaSourceT est une Source de Données
cTemp est une chaîne

hCA est un tableau de 4 réel

POUR eInd=1 A 4
:m_CAMA_N[eInd]=0
:m_CAMO_N[eInd]=0
:m_Montant_Marge_N[eInd]=0
:m_PV_MoyenHeure_N[eInd]=0
FIN

// Requete détail
SI PAS :m_bCalculSeul ALORS
{:m_tblObj,indChamp}..ImageDéroulée=::m_img_CA
{:m_tblObj,indChamp}..ImageEnroulée=::m_img_CA
FIN

:m_cReqDetail=[
SELECT
SUM(Detail_Comptes.Montant_N) AS Montant_Prevu,
SUM(Detail_Comptes.Montant_Realise) AS Montant_Realise,
SUM(Detail_Comptes.Montant_Achat) AS Achat_Realise,
SUM(Detail_Comptes.Montant_Marge_N) AS Marge_Realise,
SUM(Detail_Comptes.Montant_MO) AS CA_MO_Realise,
SUM(Detail_Comptes.Nb_Heure_N) AS Nb_Heure_N,
SUM(Detail_Comptes.Montant_Achat_Prevu) AS Achat_Prevu,
SUM(Detail_Comptes.Montant_MO_Prevu) AS CA_MO_Prevu,
SUM(Detail_Comptes.Montant_Marge_Prevu) AS Marge_Prevu,
SUM(Detail_Comptes.Nb_Heure_Prevu) AS Nb_Heure_Prevu
FROM
Detail_Comptes
WHERE
Detail_Comptes.IDDETAIL_PREVISIO = %1
AND Detail_Comptes.Lib_Annee_Mois ='%2'
]
:m_cReq=[
SELECT DISTINCT
SUM(Detail_Comptes.Montant_N) AS Montant_N,
SUM(Detail_Comptes.Montant_Realise) AS Montant_Realise,
SUM(Detail_Comptes.Montant_Achat) AS Montant_Achat,
SUM(Detail_Comptes.Montant_Marge_N) AS Montant_Marge_N,
SUM(Detail_Comptes.Montant_MO) AS Montant_MO,
SUM(Detail_Comptes.Nb_Heure_N) AS Nb_Heure_N,
SUM(Detail_Comptes.Montant_Achat_Prevu) AS Montant_Achat_Prevu,
SUM(Detail_Comptes.Montant_MO_Prevu) AS Montant_MO_Prevu,
SUM(Detail_Comptes.Montant_Marge_Prevu) AS Montant_Marge_Prevu,
SUM(Detail_Comptes.Nb_Heure_Prevu) AS Nb_Heure_Prevu,
Detail_Comptes.IDDETAIL_PREVISIO,
DETAIL_PREVISIO.IDVERSION_PREVISIONNEL
FROM Detail_Comptes INNER JOIN DETAIL_PREVISIO ON Detail_Comptes.IDDETAIL_PREVISIO=DETAIL_PREVISIO.IDDETAIL_PREVISIO
WHERE Detail_Comptes.Lib_Annee_Mois BETWEEN '%1' AND '%2'
AND DETAIL_PREVISIO.IDVERSION_PREVISIONNEL=%3
GROUP BY Detail_Comptes.IDDETAIL_PREVISIO,
DETAIL_PREVISIO.IDVERSION_PREVISIONNEL
ORDER BY Detail_Comptes.IDDETAIL_PREVISIO
]

SI PAS :m_bMois1 ALORS
:m_cReq=ChaîneConstruit(:m_cReq,:m_Date[1][[ A 6]],:m_Date[1][[ A 6]],:m_IDVERSION_PREVISIONNEL)
SINON
:m_cReq=ChaîneConstruit(:m_cReq,:m_Date[1][[ A 6]],:m_Date[2][[ A 6]],:m_IDVERSION_PREVISIONNEL)
FIN

SI PAS HExécuteRequêteSQL(so_MaSourceT,hRequêteDéfaut,:m_cReq) ALORS
Erreur(HErreurInfo())
RETOUR
FIN

:m_cReq=[
SELECT DISTINCT
DETAIL_PREVISIO.IDDETAIL_PREVISIO AS IDDETAIL_PREVISIO,
DETAIL_PREVISIO.Type_Donnee AS Type_Donnee,
so_MaSourceT.Montant_N AS Montant_Prevu,
so_MaSourceT.Montant_Realise AS Montant_Realise,
so_MaSourceT.Montant_Achat AS Achat_Realise,
so_MaSourceT.Montant_Marge_N AS Marge_Realise,
so_MaSourceT.Montant_MO AS CA_MO_Realise,
so_MaSourceT.Nb_Heure_N AS Nb_Heure_N,
so_MaSourceT.Montant_Achat_Prevu AS Achat_Prevu,
so_MaSourceT.Montant_MO_Prevu AS CA_MO_Prevu,
so_MaSourceT.Montant_Marge_Prevu AS Marge_Prevu,
so_MaSourceT.Nb_Heure_Prevu AS Nb_Heure_Prevu,
DETAIL_PREVISIO.Montant_N AS Montant_N_DE,
DETAIL_PREVISIO.Montant_NMoins1 AS Montant_ANTE,
FAMILLE.Nom AS Nom,
REPARTITION_FAMILLE.Ratio_MO AS Ratio_MO,
REPARTITION_FAMILLE.Ratio_March AS Ratio_March,
REPARTITION_FAMILLE.Marge_Famille AS Marge_Famille,
REPARTITION_FAMILLE.Taux_Horaire AS Taux_Horaire,
(PCG_005.Num_Compte+' '+PCG_005.Libelle_Compte) AS Num_Compte
FROM
DETAIL_PREVISIO,
REPARTITION_FAMILLE,
so_MaSourceT,
FAMILLE,
PCG_005
WHERE
PCG_005.IDPCG_005 = DETAIL_PREVISIO.IDPCG_005
AND DETAIL_PREVISIO.IDDETAIL_PREVISIO = so_MaSourceT.IDDETAIL_PREVISIO
AND DETAIL_PREVISIO.IDVERSION_PREVISIONNEL = %1
AND DETAIL_PREVISIO.Type_Donnee = 4
AND FAMILLE.IDFAMILLE = REPARTITION_FAMILLE.IDFAMILLE
AND DETAIL_PREVISIO.IDDETAIL_PREVISIO = REPARTITION_FAMILLE.IDDETAIL_PREVISIO
ORDER BY
Type_Donnee ASC,
(PCG_005.Num_Compte + ' ' + PCG_005.Libelle_Compte)
]

cReqTot=[
SELECT SUM(Detail_Comptes.Montant_N) AS Montant_Prevu,
SUM(Detail_Comptes.Montant_Achat_Prevu) AS Achat_Prevu,
SUM(Detail_Comptes.Montant_MO_Prevu) AS CA_MO_Prevu,
SUM(Detail_Comptes.Montant_Marge_Prevu) AS Marge_Prevu,
SUM(Detail_Comptes.Nb_Heure_Prevu) AS Nb_Heure_Prevu
FROM Detail_Comptes
WHERE Detail_Comptes.IDDETAIL_PREVISIO= %1
AND Detail_Comptes.Num_Ligne=2
AND Detail_Comptes.Lib_Annee_Mois BETWEEN '%2' AND '%3'
]

SI PAS :m_bMois1 ALORS
:m_cReq=ChaîneConstruit(:m_cReq,:m_IDVERSION_PREVISIONNEL,:m_Date[1][[ A 6]],:m_Date[1][[ A 6]])
SINON
:m_cReq=ChaîneConstruit(:m_cReq,:m_IDVERSION_PREVISIONNEL,:m_Date[1][[ A 6]],:m_Date[2][[ A 6]])
FIN
cTemp=:m_cReq
SI PAS HExécuteRequêteSQL(:m_MaSource,hRequêteDéfaut+hRequêteSansCorrectionHF,:m_cReq) ALORS
Erreur(HErreurInfo(),ErreurInfo(errLigne),ErreurInfo(errTraitement))
RETOUR
FIN
//trace(HNbEnr(:m_MaSource))
//trace(HNbEnr(so_MaSourceT))
POUR TOUT :m_MaSource

c'est sur la dernière ligne que le blocage se produit.

Merci de l'aide ou des pistes de solution éventuelles.

--
Pascal
N0.pascal.SPAM@efpe.biz
Ne garder que le prénom pour me joindre

2 réponses

Avatar
mat
Pascal F wrote:
...
//trace(HNbEnr(:m_MaSource))
//trace(HNbEnr(so_MaSourceT))
POUR TOUT :m_MaSource

c'est sur la dernière ligne que le blocage se produit.

Merci de l'aide ou des pistes de solution éventuelles.





Bonjour,

Peut-être une piste: j'ai eu des blocages similaires avec HF Classic que
j'ai réussi à remédier en ajoutant la colonne de tri en utilisant la
syntaxe suivante: POUR TOUT :m_MaSource SUR Type_Donnee

Si cela ne change rien, il serait intéressant de savoir si le blocage se
produit aussi lorsque la première ligne de trace (HNbEnr(:m_MaSource)
est activée. Je pense que non, car j'ai l'impression que des fois le
moteur de requêtes retourne trop vite le contrôle au programme (tandis
que lui s'occupe de la requête en arrière plan) et des boucles POUR TOUT
n'y parviennent pas encore à accéder le résultat. Par contre, hNbEnr
frêne l'exécution du programme jusqu'à la lecture de la dernière ligne
du résultat, donc ce problème ne peut pas se produire.

Salutations
Mat
Avatar
Pascal F
mat a formulé la demande :
Pascal F wrote:
...
//trace(HNbEnr(:m_MaSource))
//trace(HNbEnr(so_MaSourceT))
POUR TOUT :m_MaSource

c'est sur la dernière ligne que le blocage se produit.

Merci de l'aide ou des pistes de solution éventuelles.





Bonjour,

Peut-être une piste: j'ai eu des blocages similaires avec HF Classic que j'ai réussi à remédier en ajoutant la colonne de tri
en utilisant la syntaxe suivante: POUR TOUT :m_MaSource SUR Type_Donnee

Si cela ne change rien, il serait intéressant de savoir si le blocage se produit aussi lorsque la première ligne de trace
(HNbEnr(:m_MaSource) est activée. Je pense que non, car j'ai l'impression que des fois le moteur de requêtes retourne trop vite
le contrôle au programme (tandis que lui s'occupe de la requête en arrière plan) et des boucles POUR TOUT n'y parviennent pas
encore à accéder le résultat. Par contre, hNbEnr frêne l'exécution du programme jusqu'à la lecture de la dernière ligne du
résultat, donc ce problème ne peut pas se produire.

Salutations
Mat



Malheureusement, si j'active la ligne de trace, c'est à ce niveau que le programme bloque. J'ai aussi essayé en mettant d'abord
un HlitPremier(:m_MaSource) et la aussi blocage. :'(

--
Pascal

Ne garder que le prénom pour me joindre