OVH Cloud OVH Cloud

SQL [alter]natif

8 réponses
Avatar
bruno.a73[no_spam]
Si je comprends bien, ces accès se font sans ODBC ?

Bruno

8 réponses

Avatar
Manu
> Si je comprends bien, ces accès se font sans ODBC ?



Oui. Les accès alternatifs proviennent d'une initaive sur MySQL (Rodolphe si
tu nous lit) qui a été étendue à d'autres bases (Oracle, PostGre, SQLite,
ADO, FireBird). Ils se décomposent tous en une dll et une classe windev 7.5
permettant une encapsulation des ordres AppelDLL.

La dll est développée en C (VC+, Borland C) en se basant sur les API C
fournies par les éditeurs. Cela évite la couche ODBC, OLE-DB, ADO.

Bruno



Emmanuel Lecoester
Avatar
dacoolg
"Manu" wrote in message news:<bvavmq$i95$...
> Si je comprends bien, ces accès se font sans ODBC ?

Oui. Les accès alternatifs proviennent d'une initaive sur MySQL (Rodolphe si
tu nous lit) qui a été étendue à d'autres bases (Oracle, PostGre, SQLite,
ADO, FireBird). Ils se décomposent tous en une dll et une classe windev 7.5
permettant une encapsulation des ordres AppelDLL.

La dll est développée en C (VC+, Borland C) en se basant sur les API C
fournies par les éditeurs. Cela évite la couche ODBC, OLE-DB, ADO.

> Bruno

Emmanuel Lecoester




Bonjour,

J'ai testé les classes sous windev 7.5 version 206h que j'ai récupéré
depuis le projet Exsql4wd.

Il m'apparait un problème majeur :

Je créé une première requête qui parcourt une table factures avec le
numrequete à 0.
Dans le fetch je récupère le code du client et j'interroge à l'aide
d'uen deuxième requete (numrequete 1) ma table client pour avoir son
nom. En gros j'ai deux requêtes imbriquées. La deuxième requête plante
en m'indiquant ce message :

Erreur 2014
Commands out of sync; You can't run this command now ...

Si vous avez une explication ...

D'avance merci
Avatar
Roumegou Eric
Legui a présenté l'énoncé suivant :

Bonjour,

J'ai testé les classes sous windev 7.5 version 206h que j'ai récupéré
depuis le projet Exsql4wd.

Il m'apparait un problème majeur :

Je créé une première requête qui parcourt une table factures avec le
numrequete à 0.
Dans le fetch je récupère le code du client et j'interroge à l'aide
d'uen deuxième requete (numrequete 1) ma table client pour avoir son
nom. En gros j'ai deux requêtes imbriquées. La deuxième requête plante
en m'indiquant ce message :

Erreur 2014


> Commands out of sync; You can't run this command now ...
Il faut bien sûr que dans le fetch, tu fermes bien ta requête 1 apès
avoir récupéré ton client.
fsql:mysqlferme(2)

Notes aussi que, c'est l'intérêt du sql, tu peux faire une jointure
entre tes lignes de factures et ton client et tout récupérer en 1 seule
requete.


Si vous avez une explication ...





D'avance merci



--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
dacoolg
Roumegou Eric wrote in message news:...
Legui a présenté l'énoncé suivant :
>
> Bonjour,
>
> J'ai testé les classes sous windev 7.5 version 206h que j'ai récupéré
> depuis le projet Exsql4wd.
>
> Il m'apparait un problème majeur :
>
> Je créé une première requête qui parcourt une table factures avec le
> numrequete à 0.
> Dans le fetch je récupère le code du client et j'interroge à l'aide
> d'uen deuxième requete (numrequete 1) ma table client pour avoir son
> nom. En gros j'ai deux requêtes imbriquées. La deuxième requête plante
> en m'indiquant ce message :
>
> Erreur 2014
> Commands out of sync; You can't run this command now ...
Il faut bien sûr que dans le fetch, tu fermes bien ta requête 1 apès
avoir récupéré ton client.
fsql:mysqlferme(2)




Le problème est que le message d'erreur s'affiche avant la fermeture
de la requête.
Je te donne un bout de code pour que tu puisses m'expliquer ce qui
cloche

Local

RetCode est un booleen
RetCode2 est un booleen
Mafacture est une chaine
Monclient est une chaine=""

RetCode=fsql:mysqlexec("select numdossier,codeclient from factures",0)
si RetCode alors
tantque fsql:mysqlfetch(0)
Mafacture=fsql:msqlitcol(0,1)
RetCode2=fsql:mysqlexec("select nomclient from clients where
codeclient='"+fsql:msqlitcol(0,2)+"'",1)
si RetCode2 alors
si fsql:mysqlfetch(1) alors
// je récupère mon client
Monclient=fsql:msqlitcol(1,1)
fin
fsql:msqlferme(1)
sinon
info("erreur")
fsql:msqlferme(1)
// C'est ici que ça plante et tu vois que je n'ai pas
encore fermé la requête numéro 0. Le message d'erreur est celui
affiché dans mon précédent message.
fin
fin
fsql:mysqlferme(0)
sinon
info("erreur")
fin

Voila. Evidemment je pourrai utiliser une jointure comme tu me le fais
remarquer mais je débute en prog SQL et je commence donc par des
choses simples et des algorithmes que je maitrise même si ceux ci ne
sont pas "optimaux" en termes de programmation.

J'ai posté ce message car dans la doc j'ai lu qu'on pouvait
"identifier" 5 requêtes (cela veut dire j'imagine que l'on peut
éxécuter cinq requêtes simultanément ?)

Dans mon exemple ce n'est pas la cas et je voudrai comprendre
pourquoi.

Notes aussi que, c'est l'intérêt du sql, tu peux faire une jointure
entre tes lignes de factures et ton client et tout récupérer en 1 seule
requete.

>
> Si vous avez une explication ...
>


> D'avance merci




Quoiqu'il en soit merci de m'avoir répondu
Avatar
Roumegou Eric
Bonjour,
je viens de voir ton msg et j'avoue que je ne comprenais pas ce qui
clochait dans ton code.
Je l'ai donc testé en l'adaptant à 2 de mes tables.
Première chose, les méthodes n'étaient pas reconnues. (mySQLlitCol et
non pas msqlCol et d'autres cas encore). Bien sûr, tu peux renommer les
méthodes dans les classes que tu récupères, mais pour évoluer bonjour !
Je pense que c'était plutôt une erreur et c'est cela qui provoquait le
plantage.

Par contre, la deuxieme requete (indice 1) ne plantait pas mais ne
renvoyait pas le résultat. J'ai donc essayé avec une boucle sqlpremier,
sqlsuivant et là cela fonctionne.
Pour ma part, je n'utilise pas le sqlfetch car selon les accès natifs,
cela se comportait différemment (sqlcol et sqllitcol) et je me demande
si je n'ai pas déjà eu ce meme pb.
Comme je suis un garçon qui a horreur de se poser des questions,
j'adopte systématiquement la boucle sqllitpremier,tantque pas
sqlendehors,sqlsuivant et j'utilise les sqlcol.

Voilà, mais la leçon de ce test est que l'on ne peut imbriquer deux
boucles sqlfetch. Donc, moi j'utilise sqlpremier.

sinon la solution optimale est
select LEVEL_PEOPLE.LVL_DESC,LEVEL_PEOPLE.OPE_ID,OPE_DESC from
LEVEL_PEOPLE INNER JOIN OPERATION ON
LEVEL_PEOPLE.OPE_ID=OPERATION.OPE_ID

et tu récupères le tout en 1 seule requête.

Voilà ta requête corrigée et qui marche (Tu peux remplacer le sqlfetch
de la 2eme req par une boucle sqlpremier)

LOCAL

RetCode est un booléen
RetCode2 est un booléen
Mafacture est une chaîne
Monclient est une chaîne=""
commande est une chaîne=""

RetCode=fSQL:mySQLExec("select LVL_DESC,OPE_ID from LEVEL_PEOPLE",0)
SI RetCode ALORS
fSQL:mySQLPremier(0)
TANTQUE PAS fSQL:mySQLEnDehors
Mafacture=fSQL:mySQLCol(0,1)
commande="SELECT OPE_DESC FROM OPERATION WHERE
OPE_ID="+fSQL:mySQLCol(0,2)
RetCode2=fSQL:mySQLExec(commande,1)
SI RetCode2 ALORS
SI fSQL:mySQLFetch(1) ALORS
// je récupère mon client
Monclient=fSQL:mySQLLitCol(1,1)
FIN
fSQL:mySQLFerme(1)
SINON
Info("erreur")
fSQL:mySQLFerme(1)
FIN
fSQL:mySQLSuivant(0)
FIN
fSQL:mySQLFerme(0)
SINON
Info("erreur")
FIN

--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
dacoolg
Bonjour,

Pour ce qui est des noms des méthodes il s'agit juste d'une erreur de
frappe puisque j'ai écrit ce bout de code et non recopié depuis
windev.

Quoiqu'il en soit tu me confirmes que les fetch imbriqués ne marchent
pas et je vais donc utiliser la méthode sqlpremier,sqlsuivant ...
J'aurai du y penser avant mais tu sais ce que c'est quant tu es
confronté à un bout de code (aussi simple soit il) qui coince : tu
oublies l'évidence.

Enfin ce post aura permis de mettre en lumière un bug(?) de la classe
et au moins ai je l'impression d'avoir fait avancer le schimilili, le
schimimimili, le schililimili, les choses ...

Grand merci pour ton aide

Cordialement
Avatar
Roumegou Eric
Legui a formulé la demande :

Enfin ce post aura permis de mettre en lumière un bug(?) de la classe
et au moins ai je l'impression d'avoir fait avancer le schimilili, le
schimimimili, le schililimili, les choses ...



Oui, avant de tirer des conclusions sur le comportement du sqlfetch, je
vais tester ton code : (des fetchs imbriqués)
- en accès mysql pcsoft
- en accès alternatif sqlite
- en accès alternatif Oracle
(C'est facile avec ma classe fsql)
et si le pb ne se pose que sur mysql alternatif, on soumettra ce pb à
Rodolphe.
Il me semble important de se faire une religion là dessus.

Grand merci pour ton aide

Cordialement



--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Firetox
Bonjour, a tous

en SQLite c'est possible on peut empiler jusqu'a 5 fetch sans probleme
j'en suis sur en regardant le code et pour plus de securité j'ai fait le
test : OK

Voila

Bon dev
@+

Firetox

"Roumegou Eric" a écrit dans le message de news:

Legui a formulé la demande :
>
> Enfin ce post aura permis de mettre en lumière un bug(?) de la classe
> et au moins ai je l'impression d'avoir fait avancer le schimilili, le
> schimimimili, le schililimili, les choses ...

Oui, avant de tirer des conclusions sur le comportement du sqlfetch, je
vais tester ton code : (des fetchs imbriqués)
- en accès mysql pcsoft
- en accès alternatif sqlite
- en accès alternatif Oracle
(C'est facile avec ma classe fsql)
et si le pb ne se pose que sur mysql alternatif, on soumettra ce pb à
Rodolphe.
Il me semble important de se faire une religion là dessus.
>
> Grand merci pour ton aide
>
> Cordialement

--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)