Bonjour,
J’ai besoin d’avoir en mémoire un ensemble d’enregistrements en petit nombre (30 à 40 lignes en moyenne) mais construit à partir d’une requête assez complexe, car utilisant de très nombreuses liaisons, dont certaines sur elles-mêmes (j’utilise notamment des personnes reliées à des personnes elles-mêmes reliées à d’autres personnes...).
Le nombre des fichiers reliés et la complexité des jointures externes m’obligent à créer moi-même cette requête par programmation, avec des données issues de plusieurs fichiers HF et des rubriques calculées.
J'initialise cette requête à partir d'un texte ressemblant à (simplifié) :
sTexteReq = " Select 0 as COL1 , FICHIER1.RUB1 as COL2, FICHIER2.RUB2 as COL3,
' ' as COL4, ' ' as COL5, From FICHIER1, FICHIER2
where FICHIER1.IDRUB = ' " + MonParam + " ' and FICHIER2.RUBAA =FICHIER1.RUBAA "
Elle est lancée par "HExécuteRequêteSQL".
Dans une étape provisoire et afin de vérifier mes données, j'affiche le résultat dans une table mémoire avec
ConstruitTableFichier( MATABLE , MaRequete, taAvecIDAuto+taRemplirTable+taAvecBinaire)
===> Jusque là tout est OK : j'ai bien toutes mes valeurs, plus les colonnes vides COL1 (numérique), COL4 et COL5 (alpha).
Puis j'efface la table avec "TableSupprimeTout(MATABLE)".
Les données disparaissent, mais les colonnes créées en automatique restent en place.
Je passe ensuite ma requête dans une boucle pour affecter des valeurs aux rubriques vides et recréer les lignes de la table avec les enregistrements de la requête modifiés :
sChaine est une chaine
nCpt est un entier = 0 // compteur spécifique
HLitPremier(MaRequete)
TANTQUE PAS HEnDehors(MaRequete)
nCpt ++
MaRequete.COL1 = nCpt
nIndice est un entier = MaRequete.COL3
HLitRecherchePremier(FICHIERXXX, IDXXX, nIndice)
SI Htrouve(FICHIERXXX) ALORS
MaRequete.COL4 = FICHIERXXX.LaValeurQueJeVeux1
MaRequete.COL5 = FICHIERXXX.LaValeurQueJeVeux2
FIN
sChaine = HRécupèreEnregistrement(MaRequete)
TableAjoute(MATABLE,sChaine)
HLitSuivant(MaRequete)
FIN
===> Toujours OK : la table contient tous les enregistrements complétés (rubriques d'origine + rubriques calculées)
Je repasse une nouvelle fois dans la requête pour lire les valeurs sous le débogueur :
vTest est un variant
HLitPremier(MaRequete)
TANTQUE PAS HEnDehors(MaRequete)
vTest = Marequete.COL1 ////// colonne calculée = 0
vTest = Marequete.COL2 // OK - colonne d’origine
vTest = Marequete.COL3 // OK - colonne d’origine
vTest = Marequete.COL4 ////// colonne calculée = " "
vTest = Marequete.COL5 ////// colonne calculée = " "
HLitSuivant(MaRequete)
FIN
===> Et là, mes valeurs calculées se sont perdues dans la nature et mes champs ont retrouvé leur valeur d'initialisation ... entre le premier passage, la copie des informations dans une table mémoire et le deuxième passage !!!
J'ai fait un autre essai en ne construisant ma table qu'après l'affectation des valeurs calculées : c'est pareil, je perds ces valeurs.
Il semblerait qu'elles ne soient utilisables que sur l'enregistrement en cours de modif. et qu'elles disparaissent dès que l'on passe à l'enregistrement suivant.
Quelqu'un a t'il déjà remarqué ce phénomène ?
Ou bien ai-je fais une erreur quelque part ?
Ou encore y a t'il une manip particulière à faire ?
Je n’ai rien pu trouver dans l’aide à ce sujet, hormis sur la commande HModifie, dont il est dit de ne pas l’utiliser sur une requête, l’enregistrement étant automatique.
J'ai envoyé une requête au ST, mais comme je suis en version 9, je ne sais pas si je vais avoir une réponse.
Merci aux bonnes âmes qui pourraient me mettre sur la piste.