PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → requetes et mémoire
requetes et mémoire
Débuté par Pascal, 03 mar. 2016 15:05 - 11 réponses
Membre enregistré
302 messages
Posté le 03 mars 2016 - 15:05
Bonjour

Ayant besoin de réaliser une requête paramétrée depuis une liste de champ sur une page, j’exécute une requete standard, puis ce résultat est utilisé pour réaliser une série de requetes sql selon les choix utilisateurs (si pas d echoix particuliers, je reprends tous les résultats de la requete précédente.

Ceci fonctionne très bien pour des petits nombres de resultats, (trace hnbrenr à chaque étape me donne le même nombre)

Dès que le résultats dépasser les 250 000, j'ai un phénomène étrange.. ma première requete donne la bonne valeur, puis j'en perd très rapidement pour finir à 0....)

Est-ce un problème de mémoire d'après vous ? Comment contourner ce problème ?

Merci beaucoup

--
Pascal
Posté le 03 mars 2016 - 16:40
Bonjour Pascal,

Est-ce un problème de mémoire d'après vous ? Comment contourner ce
problème ?


Non... perso, je dirais que a priori ca vient de ton code... tu sais,
celui que tu ne nous montre pas :-)

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com


Merci beaucoup

--
Pascal
Membre enregistré
302 messages
Posté le 03 mars 2016 - 16:56
: ))



//Initialise la requête
SI HExécuteRequête(REQ_CSAN,hRequêteDéfaut,SAI_AD_ID_ADH,SAI_AD_NOM,SAI_AD_PRENOM,SAI_AD_CIVIL,SAI_famille,SAI_AD_SYND,SAI_HDF,SAI_DECES,SAI_AD_CODPOST,SAI_AD_CODE_INSEE,SAI_AD_VILLE,SAI_AD_PAYS_CODE,SAI_ADRESSE_PERSO,SAI_GRADCODE,SAI_SPEC_CODE,SAI_POSITION,SAI_DEPT,SAI_FONCTION,SAI_NAISSANCE,SAI_NAISSANCE1,SAI_NOMINATION,SAI_historique) = Faux ALORS
Erreur("Erreur d'initialisation de la requête" + RC + HErreurInfo())
RETOUR
FIN
Trace (HNbEnr(REQ_CSAN))


// test téléphone non null
sdREQ1 est une Source de Données
// test téléphone non null
SI SEL_TEL[1]=1 ALORS
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN WHERE AD_TEL <>''")
SINON SI SEL_TEL[2]=1
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN WHERE AD_TEL =''")
SINON
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN")
FIN
Trace (HNbEnr(sdREQ1))


sdREQ2 est une Source de Données
// test portable non null
SI SEL_Portable[1]=1 ALORS
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 WHERE AD_PORTABLE <>''")
SINON SI SEL_TEL[2]=1
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 WHERE AD_PORTABLE =''")
SINON
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 ")
FIN
Trace (HNbEnr(sdREQ2))


sdREQ3 est une Source de Données
// test mail perso non null
SI SEL_mail_perso[1]=1 ALORS
HExécuteRequêteSQL(sdREQ3, "SELECT * FROM sdREQ2 WHERE AD_MAIL_PERSO <>''")
SINON SI SEL_mail_perso[2]=1 ALORS
HExécuteRequêteSQL(sdREQ3, "SELECT * FROM sdREQ2 WHERE AD_MAIL_PERSO =''")
SINON
HExécuteRequêteSQL(sdREQ3, "SELECT * FROM sdREQ2 ")
FIN
Trace (HNbEnr(sdREQ3))

... et affichage de tout cela

merci

--
Pascal
Posté le 03 mars 2016 - 17:45
Bonjour,

Regarde bien

Requête complète SI HExécuteRequête(REQ_CSAN,hRequêteDéfaut, etc.....

sdREQ1 est une Source de Données
sdREQ2 est une Source de Données
sdREQ3 est une Source de Données

// 1 la requête est faite sur REQ_CSAN
// Test téléphone
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN WHERE AD_TEL <>''")

// test portable
// 2 la requête est faite sur sdREQ1 et pas sur REQ_CSAN comme pour le numéro de téléphone
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 WHERE AD_PORTABLE <>''")

// test mail perso
// 3 la requête est faite sur sdREQ2 et pas sur REQ_CSAN comme pour le numéro de téléphone
HExécuteRequêteSQL(sdREQ3, "SELECT * FROM sdREQ2 WHERE AD_MAIL_PERSO <>''")


c'est normal que le nombre diminue à chaque requête.

Cordialement.
Posté le 03 mars 2016 - 19:47
Il se trouve que Pascal a formulé :
: ))



//Initialise la requête SI
HExécuteRequête(REQ_CSAN,hRequêteDéfaut,SAI_AD_ID_ADH,SAI_AD_NOM,SAI_AD_PRENOM,SAI_AD_CIVIL,SAI_famille,SAI_AD_SYND,SAI_HDF,SAI_DECES,SAI_AD_CODPOST,SAI_AD_CODE_INSEE,SAI_AD_VILLE,SAI_AD_PAYS_CODE,SAI_ADRESSE_PERSO,SAI_GRADCODE,SAI_SPEC_CODE,SAI_POSITION,SAI_DEPT,SAI_FONCTION,SAI_NAISSANCE,SAI_NAISSANCE1,SAI_NOMINATION,SAI_historique)
= Faux ALORS
Erreur("Erreur d'initialisation de la requête" + RC + HErreurInfo())
RETOUR
FIN
Trace (HNbEnr(REQ_CSAN))


// test téléphone non null
sdREQ1 est une Source de Données
// test téléphone non null
SI SEL_TEL[1]=1 ALORS
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN WHERE AD_TEL <>''")
SINON SI SEL_TEL[2]=1
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN WHERE AD_TEL =''")
SINON
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN")
FIN
Trace (HNbEnr(sdREQ1))


sdREQ2 est une Source de Données
// test portable non null
SI SEL_Portable[1]=1 ALORS
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 WHERE AD_PORTABLE <>''")
SINON SI SEL_TEL[2]=1
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 WHERE AD_PORTABLE =''")
SINON
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 ")
FIN
Trace (HNbEnr(sdREQ2))


sdREQ3 est une Source de Données
// test mail perso non null
SI SEL_mail_perso[1]=1 ALORS
HExécuteRequêteSQL(sdREQ3, "SELECT * FROM sdREQ2 WHERE AD_MAIL_PERSO <>''")
SINON SI SEL_mail_perso[2]=1 ALORS
HExécuteRequêteSQL(sdREQ3, "SELECT * FROM sdREQ2 WHERE AD_MAIL_PERSO =''")
SINON
HExécuteRequêteSQL(sdREQ3, "SELECT * FROM sdREQ2 ")
FIN
Trace (HNbEnr(sdREQ3))

... et affichage de tout cela

merci


tu m'étonnes que ca part en vrille !

voila à peu près ce qui se passe dans le cas sans critères

req3 = SELECT * FROM (
SELECT * FROM (
SELECT * FROM REQ_CSAN
)
)

alors que faire une truc du genre, pour reprendre votre code sans
optimisation extreme et sans faire de test mais pour juste pour le
principe, serait bien mieux

szReq est chaine
szCond est chaine

szReq = [
select *
from REQ_CSAN
%1
]
SI SEL_TEL[1]=1 ALORS
szCond = "AD_TEL <>''"
SINON SI SEL_TEL[2]=1
szCond = "AD_TEL =''"
FIN
SI SEL_TEL[1]=1 ALORS
szCond += [" and/or "] + "AD_TEL <>''" // choisir and ou or
SINON SI SEL_TEL[2]=1
szCond += [" and/or "] + "AD_TEL =''"
FIN
etc...
szCond = "where "+szCond"
szReq = ChaineConstruit(szReq,szCond)
etc...

--
Cordialement JeAn-PhI
Membre enregistré
302 messages
Posté le 04 mars 2016 - 09:37
Merci Jean Phil !

Je vais étudier cette méthode.

--
Pascal
Membre enregistré
302 messages
Posté le 04 mars 2016 - 10:48
Cette méthode est effectivement beaucoup plus propre.
Néanmoins j'ai toujours un problème
hnbrenr sur REQ_CSAN
384850
trace chaine
select * from REQ_CSAN
hnbrenr sur chaine
282600

puis j'ai une erreur TableAjouteLigne.
Pas assez de mémoire pour effectuer l'opération
(l'allocation de 264 octets a échoué).

--
Pascal
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 07 mars 2016 - 13:37
Bonjour,

Perso je n'aurais pas travaillé comme ça, J'aurais plutôt fait la totalité en code, j'aurais écris une seule et unique requête qui m'aurait remontée la totalité des enregistrements dont j'avais besoin.

Pour ça j'utiliserai ChaineConstruit(). Au moins tu sais ce que tu as dans ta requête. Pour le moment, je ne vois même pas comment on pourrait t'aider sans avoir la requête de départ.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
302 messages
Posté le 07 mars 2016 - 15:08
Merci Philippe,

Qu'entends tu par avoir la requête ?? la requête de départ est dans le code...

Avoir une seule requête est plus propre, mais j'ai un paquets de champs à tester (j'en ai retiré la moitié pour l'envoi de ma question) et ca va être pénible à coder ....

bonne journée

--
Pascal
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 07 mars 2016 - 16:18
Certes coder une longue requête peut paraître pénible, mais c'est aussi ça le métier.

Au final entre le temps passé à poser les questions sur divers forums ou encore à faire les recherches sur internet pour comprendre ce qui ne va pas, n'as tu pas mis autant de temps (voir plus :p) que si tu avais écris la requête entièrement codée ?

Si tu nous donnes le code entier de ta requête, c'est plus facile de voir où il y a un problème.

De plus, je peux te dire qu'il y a déjà au moins une erreur à corriger, 5ème ligne du code ci-après, je pense qu'il reste une erreur de copier coller sur "SEL_TEL[2]".

sdREQ2 est une Source de Données
// test portable non null
SI SEL_Portable[1]=1 ALORS
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 WHERE AD_PORTABLE <>''")
SINON SI SEL_TEL[2]=1
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 WHERE AD_PORTABLE =''")
SINON
HExécuteRequêteSQL(sdREQ2, "SELECT * FROM sdREQ1 ")
FIN
Trace (HNbEnr(sdREQ2))


--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 07 mars 2016 - 16:37
Je vois que tu fais :
HExécuteRequêteSQL(sdREQ1, "SELECT * FROM REQ_CSAN WHERE AD_TEL <>''")

Personnellement , je n'ai jamais fait ainsi.
J'ai toujours fait :
req est une chaîne
req = [
SELECT * FROM REQ_CSAN WHERE AD_TEL <>''
]
HExécuteRequêteSQL(sdREQ1, req )


.. A priori, ça ne change pas grand chose. Mais en terme de maintenance ou de fabrication de requête plus ou moins customisée selon les cas ... ça change tout :
req , cond0 est une chaîne
req = [
SELECT * FROM REQ_CSAN WHERE
]
SI sel_tel [1] = 1 ALORS cond0 += ["and"] + " ad_tel <> '' " + RC
SI sel_tel [2] = 1 ALORS cond0 += ["and"] + " ad_tel = '' " + RC
// etc etc

req = req + cond0
Info(req)
HExécuteRequêteSQL(sdREQ1, req )
// etc etc


Ca fait juste un code beaucoup plus court, et une requête beaucoup plus simple pour le moteur HFSQL, puisqu'il reçoit une requête, au lieu de n requêtes imbriquées.
Membre enregistré
302 messages
Posté le 07 mars 2016 - 19:14
Merci pour votre aide, vous avez raison, je vais tout réécrire... je suis convaincu !

--
Pascal