PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV Mobile 2024 → HExecuteRequêteSQL / SQLite : Comment lire les données ?
HExecuteRequêteSQL / SQLite : Comment lire les données ?
Iniciado por KotlinIsland, 09,oct. 2020 11:41 - 25 respuestas
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 09,octubre 2020 - 11:41
Bonjour

J'arrive à créer une table SQLite avec les instructions suivantes :

HExécuteRequêteSQL(TestDb, "TestDb", hRequêteDéfaut, "CREATE TABLE test(champ1 TEXT, champ2 REAL);")


Puis je fais une requête SELECT qui se passe bien (HExecuteRequêteSQL retourne Vrai) :

HExécuteRequêteSQL(ScannedDb, "ScannedDb", hRequêteDéfaut, "SELECT * FROM test")


Maintenant comment lire les données ?

Merci
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 09,octubre 2020 - 11:42
Rectification :

La requête SELECT est :

HExécuteRequêteSQL(TestDb, "TestDb", hRequêteDéfaut, "SELECT * FROM test")
Publicado el 09,octubre 2020 - 15:18
ok... tu PEUX faire comme ca SI tu veux te compliquer la vie

Autrement, tu déclare simplement ta table dans l'analyse, puis tu chais un hchangeconnexion et un hcreationifnotfound
Après ca, tu peux tuiliser l'éditeur de requete, faire des hlitpremier/suivant, etc

D'autre par, faire du sqllite alors que tu as HF disponible en mobile (et donc la posiibilité de modifier FACILEMENT la structure des fichiers), c'est encore une fois se compliquer la vie
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 09,octubre 2020 - 15:26
Je donne le lien vers le code complet mais sans la lecture des données (toujours pas trouvé) :

https://gist.github.com/reuniware/6e547cf7e55355a2db552145840964e6

Si quelqu'un a une solution... Merci !!!
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 09,octubre 2020 - 15:29
Et voici la seule alternative que j'ai trouvé (car je ne peux pas créer d'analyse car il y en a déjà une liée à HFSQL C/S) :

https://gist.github.com/reuniware/ef0f0f0a59fe1a2f98ef4e7fb9ff1039
Publicado el 09,octubre 2020 - 15:59
(car je ne peux pas créer d'analyse car il y en a déjà une liée à HFSQL C/S) :

Et voila donc le vrai problème. La phrase ci-dessus est complètement fausse...

Il suffit de :
- déclarer TOUS les fichiers dans l'analyse (en hf classique)
- ne PAS déclarer de connexion dans l'analyse
- dans le code d'init des différent projets, faire un hchangeconnexion (vers HF C/S la ou c'est nécessaire, HF Classique sur mobile) et ce JUSTE ¨POUR LES FICHIERS concernés.

Il est même parfaitement possible d'avoir EN MEME TEMPS, dans le MEME PROJET, plusieurs connexions ouvertes vers des bases différentes, avec des fichiers qui pointent vers une base ou une autre

Et même d'utiliser des alias de fichiers existants pour pointer la même structure vers une autre base.
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 09,octubre 2020 - 17:58
Oui je suis d'accord mais c'est assez complexe à gérer car on se connecte souvent à la base de données...
De plus l'analyse est gérée par GDS et cela impacterait tous les autres projets liés au GDS.
Il faudrait idéalement une deuxième analyse hors GDS subsistant à côté de l'analyse gérée par GDS.
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 09,octubre 2020 - 17:59
Et puis pour être honnête je suis parti sur l'utilisation d'un fichier texte...

Très rapide la lecture et l'écriture... Et ça fait l'affaire !
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 09,octubre 2020 - 18:20
En faite je vais garder les 2 solutions, sachant que SQLite a des avantages (pour mettre à jour un enregistrement par son rowId par exemple)...
Du coup j'ai ma solution.

Mais j'ai d'autres soucis, comme par exemple l'impossibilité de renommer une fonction Java... Mais c'est un autre sujet...
Publicado el 09,octubre 2020 - 23:16
KotlinIsland a écrit :
> Oui je suis d'accord mais c'est assez complexe à gérer car on se connecte souvent à la base de données...

NOPE... 10 lignes de code max dans l'init du projet, une fois pour toutes... y a pas plus simple.

De plus l'analyse est gérée par GDS et cela impacterait tous les autres projets liés au GDS.


Et alors ? En quoi est ce que ca gene d'avoir des déclarations de fichiers pour mobile qui ne sont pas utilisées dans les autres projets ?

> Il faudrait idéalement une deuxième analyse hors GDS subsistant à côté de l'analyse gérée par GDS.

NOPE, encore une fois, absolument PAS nécessaire...

Mais clairement, tu aimes te compliquer la vie, donc je vais te laisser faire.
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 12,octubre 2020 - 09:51
Merci quand même pour tes réponses.
Comprends que je préfère éviter d'impacter tous les autres projets juste car j'ai besoin d'une table pour un projet...
J'ai ma solution, je suis passé par du code Java (ce n'est pas plus compliqué pour moi car je viens du monde Java/Kotlin).
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 12,octubre 2020 - 09:52
Je redonne le lien de ma solution si ça peut aider quelqu'un :
https://gist.github.com/reuniware/ef0f0f0a59fe1a2f98ef4e7fb9ff1039
Publicado el 12,octubre 2020 - 10:21
KotlinIsland vient de nous annoncer :
Je redonne le lien de ma solution si ça peut aider quelqu'un :
https://gist.github.com/reuniware/ef0f0f0a59fe1a2f98ef4e7fb9ff1039


bonjour,

votre code JAVA contient le code pour exec et lire le résultat, il en
va de même pour le WL

ursor mCount= db.rawQuery("select count(*) from article;", null); =>
HExecuteRequêteSQL()

mCount.moveToFirst(); => HLitPremier()

****************
HExécuteRequêteSQL(TestDb, "TestDb", hRequêteDéfaut, "SELECT * FROM
test")
HLitPremier(TestDb)

--
Cordialement JeAn-PhI
Miembro registrado
386 mensajes
Popularité : +13 (13 votes)
Publicado el 12,octubre 2020 - 10:38
Bonjour,

Pour répondre à la question initiale, il faut utiliser une variable de type source de données, et faire un parcours dessus :

sdData est une Source dede Données

// Si plusieurs résultats, parcourir avec un POUR TOUT
SI HExécuteRequêteSQL(sdData, "TestDb", hRequêteDéfaut, "SELECT * FROM test") ALORS
POUR TOUT sdData
Trace(sdData.champ1, sdData.champ2)
FIN
FIN

// On vide le contenu de sdData
HAnnuleDéclaration(sdData)

// Si on n'attend qu'un seul enregistrement, un HlitPremier fait l'affaire
SI HExécuteRequêteSQL(sdData, "TestDb", hRequêteDéfaut, "SELECT * FROM test WHERE champ2 = 1") _ET_ HLitPremier(sdData) ALORS
Trace(sdData.champ1, sdData.champ2)
FIN


Il est bien sûr possible de passer par du Java, mais le Wlangage fonctionne très bien pour ça aussi :)
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 12,octubre 2020 - 11:02
Il me semble avoir essayé ça déjà... Ok merci je vais faire d'autres tests.
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 12,octubre 2020 - 11:40
sdData.champ1 et sdData.champ2 ne retournent rien (vide). Et la boucle POUR TOUT n'est pas exécutée malgré que HNbEnr retourne bien un nombre d'enregistrements différent de 0.
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 12,octubre 2020 - 11:48
Je reviens au java, je continuerai les tests sur cette façon de faire plus tard... Merci tout de même pour la piste.
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 19,octubre 2020 - 18:27
Toujours pas de solution... (je ne veux vraiment pas toucher à l'analyse existante).

Je rappelle mon code :

SI fFichierExiste(fRepExe() + "\databases\BDD.db") ALORS
//Info("fichier existe")
FIN

BDD est une Connexion
BDD..Provider = hAccèsNatifSQLite
BDD..Source = "BDD.db"
BDD..Accès = hOLectureEcriture

SI HOuvreConnexion(BDD) = Faux ALORS
Erreur(HErreurInfo())
SINON
SI HExécuteRequêteSQL(BDD, "BDD", hRequêteDéfaut, "CREATE TABLE IF NOT EXISTS matable(champ1 TEXT, champ2 REAL);") = Vrai ALORS
//Info("Create table if not exist ok")
POUR i = 1 À 20
SI HExécuteRequêteSQL(BDD, "BDD", hRequêteDéfaut, "INSERT INTO matable(champ1, champ2) VALUES ('aaa" + i + "', 1.5);") = Faux ALORS
Info("ERREUR insert");
FIN
FIN
SINON
Info(HErreurInfo())
FIN
FIN

//NE FONCTIONNE PAS
sdMatable est une Source dede Données
HExécuteRequêteSQL(sdMatable, "BDD", hRequêteDéfaut, "SELECT champ1, champ2 FROM matable")
// ---

HFermeConnexion(BDD)
Publicado el 20,octubre 2020 - 10:06
KotlinIsland avait soumis l'idée :
Toujours pas de solution... (je ne veux vraiment pas toucher à l'analyse
existante).

Je rappelle mon code :

SI fFichierExiste(fRepExe() + "\databases\BDD.db") ALORS
//Info("fichier existe")
FIN

BDD est une Connexion
BDD..Provider = hAccèsNatifSQLite
BDD..Source = "BDD.db"
BDD..Accès = hOLectureEcriture

SI HOuvreConnexion(BDD) = Faux ALORS
Erreur(HErreurInfo())
SINON
SI HExécuteRequêteSQL(BDD, "BDD", hRequêteDéfaut, "CREATE TABLE IF NOT
EXISTS matable(champ1 TEXT, champ2 REAL);") = Vrai ALORS
//Info("Create table if not exist ok")
POUR i = 1 À 20
SI HExécuteRequêteSQL(BDD, "BDD", hRequêteDéfaut, "INSERT INTO
matable(champ1, champ2) VALUES ('aaa" + i + "', 1.5);") = Faux ALORS
Info("ERREUR insert");
FIN
FIN
SINON
Info(HErreurInfo())
FIN
FIN

//NE FONCTIONNE PAS
sdMatable est une Source dede Données
HExécuteRequêteSQL(sdMatable, "BDD", hRequêteDéfaut, "SELECT champ1, champ2
FROM matable")
// ---

HFermeConnexion(BDD)


bonjour,

voila ce que je fais et qui fonctionne dans un projet contenant une
analyse SQLite

cnxSQLite est une Connexion

// Paramètres de la connexion
cnxSQLite..Provider = hAccèsNatifSQLite
cnxSQLite..Utilisateur = ""
cnxSQLite..MotDePasse = ""
cnxSQLite..Source = fRepExe() + "\databases\BDD.db" // ici j'ai
remplacer par votre chemin
cnxSQLite..BaseDeDonnées = ""
cnxSQLite..Accès = hOLectureEcriture

// Ouverture de la connexion
HOuvreConnexion(cnxSQLite)
HChangeConnexion("*",cnxSQLite)

//*************
szReq est une chaîne

sdReq est une Source de Données

bOK est un booléen


szReq = [
select *
from MaTable
]

bOK = HExécuteRequêteSQL(sdReq,hRequêteDéfaut,szReq)

--
Cordialement JeAn-PhI
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 20,octubre 2020 - 10:35
Oui mais il faut déclarer la table dans l'analyse.
Je ne veux pas toucher à l'analyse existante.
Avec votre code (et avec les différents tests que j'ai fait) j'ai toujours l'erreur suivante :
"Fichier <matable> inconnu dans l'analyse"...

Je deviens dingue avec ce truc :D
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 20,octubre 2020 - 10:38
J'ai aussi essayé avec ça mais toujours la même erreur :

SI HDécritConnexion("MaConnexion", "", "", "BDD.db", "", hAccèsNatifSQLite, hOLectureEcriture, "") = Vrai ALORS
cnxMaConnexion est une Connexion
cnxMaConnexion..BaseDeDonnées = "BDD.db"
cnxMaConnexion..Provider = hAccèsNatifSQLite
cnxMaConnexion..Accès = hOLectureEcriture
SI HOuvreConnexion(cnxMaConnexion) = Vrai ALORS
Info("HOuvreConnexion ok")
sdMaSource est une Source dede Données
SI HExécuteRequêteSQL(sdMaSource, cnxMaConnexion, hRequêteDéfaut, "SELECT * FROM matable") = Vrai ALORS
Info("Req ok")
FIN
FIN
FIN
Miembro registrado
473 mensajes
Popularité : +20 (20 votes)
Publicado el 20,octubre 2020 - 11:06
tu ne peux pas utiliser hRequêteDéfaut si tes fichiers ne sont pas dans l'annalyse, il faut utiliser hRequêteSansCorrection

SI HExécuteRequêteSQL(sdMaSource, cnxMaConnexion, hRequêteSansCorrection, "SELECT * FROM matable") = Vrai ALORS
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 20,octubre 2020 - 11:22
Je viens d'essayer (mais j'avais déjà fait un test avant)
Même erreur...
Miembro registrado
473 mensajes
Popularité : +20 (20 votes)
Publicado el 20,octubre 2020 - 12:55
Ce code fonctionne bien sans erreur pour moi,
j'utilise des tables sqlite avec ou sans analyse depuis des années sans aucun problème donc ton erreur vient d'ailleurs

Par contre la syntaxe n'est pas bonne pour
SI HExécuteRequêteSQL(BDD, "BDD", hRequêteDéfaut, ...


C'est le premier paramètre qui peut être entre guillemet (celui de la connexion) pas le deuxième

Je ne peux que te conseiller de regarder attentivement dans l'aide et les nombreux exemples fournis
Miembro registrado
473 mensajes
Popularité : +20 (20 votes)
Publicado el 20,octubre 2020 - 12:58
stef1811 a écrit :

C'est le premier paramètre qui peut être entre guillemet (celui de la connexion) pas le deuxième

Celui de la source de données et non celui de la connexion
Miembro registrado
164 mensajes
Popularité : +10 (10 votes)
Publicado el 20,octubre 2020 - 15:21
Que deviendrait cette ligne donc ?

SI HExécuteRequêteSQL(sdMaSource, cnxMaConnexion, hRequêteSansCorrection, "SELECT * FROM matable") = Vrai ALORS


Merci