|
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 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 164 mensajes Popularité : +10 (10 votes) |
|
Publicado el 09,octubre 2020 - 15:29 |
| |
| |
| | | |
|
| | |
| |
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 |
| |
| |
| | | |
|
| | |
| |
Publicado el 12,octubre 2020 - 10:21 |
KotlinIsland vient de nous annoncer :
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 397 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 HExécuteRequêteSQL(sdData, "TestDb", hRequêteDéfaut, "SELECT * FROM test") ALORS POUR TOUT sdData Trace(sdData.champ1, sdData.champ2) FIN FIN
HAnnuleDéclaration(sdData)
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 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 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
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 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 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
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 |
| |
| |
| | | |
|
| | |
| |
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 477 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 477 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 477 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 |
| |
| |
| | | |
|
| | | | |
| | |
|