|
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 ) 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
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
req = req + cond0 Info(req) HExécuteRequêteSQL(sdREQ1, req )
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 |
| |
| |
| | | |
|
| | | | |
| | |
|