[R] Recherche sqlite last tbl_name

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

[R] Recherche sqlite last tbl_name

#1

Message par tekserver »

Bonsoir le forum,

J'utilise une fonction pour alimenter une listbox avec les noms de certaines tables qui se trouve dans ma base de données.

Code : Tout sélectionner

Func _test()

Local $aResult, $iRows, $iColumns

_SQLite_GetTable($ziftm, "select tbl_name from sqlite_master WHERE tbl_name LIKE '%RP%' ;", $aResult, $iRows, $iColumns)
_GUICtrlListBox_BeginUpdate($Liste_RP)

    For $i = 2 To UBound($aResult) -1
        _GUICtrlListBox_AddString($Liste_RP, $aResult[$i])
    Next

_GUICtrlListBox_EndUpdate($Liste_RP)


EndFunc
Je recherche le moyen, que sqlite me donne le résultat en commençant avec la dernière table créée.

Aurez vous une idée ?

En vous remerciant,
Cordialement.
Modifié en dernier par tekserver le lun. 21 sept. 2015 23:30, modifié 1 fois.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Recherche sqlite last tbl_name

#2

Message par jchd »

En bref : non, aucun moyen.

Pourquoi ?
SQL, d'une manière générale, gère des entités (tables) assimilables à des ensembles. Un "SELECT * FROM mytable" est susceptible de renvoyer les rangées correspondantes dans n'importe quel ordre (et éventuellement dans un ordre différent à chaque invocation) à défaut d'une clause ORDER BY.

De ce fait, SQL (SQLite ici) n'a aucune notion d'ordre de création et ne peut donc répondre de façon fiable à ta question. On pourrait penser que SQLite stocke les rangées de sqlite_master "dans l'ordre" de création/modification, mais un rapide coup d'oeil dans une base ayant un peu évolué au cours du temps montre qu'il n'en est absolument rien. De toute façon, c'est un détail d'implémentation non documenté, susceptible de changements d'une version à l'autre et donc sur lequel il ne faut pas faire reposer une décision.

EDIT: j'ajoute pour clore ce point qu'il n'y a pas non plus de rapport direct entre ces deux résultats :

Code : Tout sélectionner

select rowid, * from sqlite_master where type = 'table' order by rowid desc limit 1;
pragma schema_version;
La première requête ne renvoie pas la drenière table créée et la seconde requête ne "pointe" pas vers une chose plutôt qu'une autre. De plus, SQLite peut parfaitement changer demain l'implémentation interne de sqlite_master et utiliser une hashtable au lieu d'un B-Tree / rowid.

Par contre, je m'interroge sur le besoin que tu as : c'est toi qui doit connaître la liste de tes tables et si, comme ton exemple semble le faire croire, tu crées des tables similaires à la volée (d'où le LIKE '%RP%'), c'est que ton schéma n'est vraisemblablement pas bon.

EDIT bis : Quand on en arrive à traiter le nom de tables (ou tout autre nom du schéma) comme des variables, c'est une excellente indication que ce schéma n'est pas (assez) normalisé.

Pose-toi la question : qu'est-ce qui différencie les tables LIKE '%RP%' entre elles ? Disons pour rester générique que c'est la caractéristique <truc>. Et bien les différentes valeurs de <truc> doivent former une colonne distinctive d'une seule et unique table RP.

Du coup le problème disparaît immédiatement. Si tu veux savoir quand on a créé ou modifié en premier ou en dernier une rangée de caractéristique <truc>, cela devient une partie d'une clause WHERE ou HAVING de tes SELECT, à condition bien sûr de stocker un marquer de temps dans cette table. Autre solution, créer un trigger qui enregistrera l'information temporelle dans une table séparée.
C'est le contexte qui dictera le meilleur moyen de procéder en pratique, mais ce choix relève plus de l'optimisation que du design, donc à faire plutôt tardivement.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

Re: [..] Recherche sqlite last tbl_name

#3

Message par tekserver »

Merci Jchd pour ta réponse, je vais essayer de trouver/imaginer un autre moyen plus adapter pour éviter de créer des tables "à la volée"
jchd a écrit :Pourquoi ?
Pour avoir les dernières tables crées en haut de la listbox.

Encore merci,
Cordialement.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Recherche sqlite last tbl_name

#4

Message par jchd »

Ce "pourquoi" introduisait la réponse longue.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Recherche sqlite last tbl_name

#5

Message par jchd »

Je recopie ici pour le bénéfice d'autres lecteurs.

Puisque la seule différence est la date ...

"
Alors c'est très simple : tu ajoutes une colonne Date à une unique table et le tour est joué. Par contre le seul format valable pour s'y retrouver c'est YYYY-MM-JJ. Ainsi tu peux utiliser les fonctions date offertes par SQLite, très flexibles.

Par exemple :
select ceci, cela from matable where date = date('now', 'start of month', '-3 month', '+5 days')

et tu récupères ce que tu as enregistré le 6, trois mois avant. Voir la doc.
"
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

Re: [..] Recherche sqlite last tbl_name

#6

Message par tekserver »

Bonsoir Jchd, le forum

Merci pour ta réponse claire. Ton expertise est d'une très grande aide.

Je me suis surpris d'avoir pu adapter aussi rapidement tout mon script en suivant tes conseils, et tout fonctionne bien. J'en suis au même point que hier, mais au mois j'ai une bd plus "propre" et il est vrai que c'est vraiment beaucoup mieux comme ça, plus clair.

Voici désormais ma fonction qui alimente ma listbox:

Code : Tout sélectionner

Func _test()

Local $aResult, $iRows, $iColumns

_SQLite_GetTable($ziftm, "SELECT distinct MaDate FROM Historique ORDER BY MaDate;", $aResult, $iRows, $iColumns)

_GUICtrlListBox_BeginUpdate($Liste_Day)

    For $i = 2 To UBound($aResult) -1       
        _GUICtrlListBox_AddString($Liste_Day, $aResult[$i])
    Next

_GUICtrlListBox_EndUpdate($Liste_Day)


EndFunc


Les dates sont dans l'ordre, mais pas comme j'aimerais, c'est à dire je voudrais avoir les dates les plus récentes en haut dans la listbox.

Je me suis pas encore plongé dans le reformatage des dates pour la listbox, en ligne de code, comme tu me le suggérais en MP, ça sera la prochaine étape.
jchd a écrit :Si tu veux par exemple savoir combien de fois tu as mangé du colin dans les 30 derniers jours :
select count(*) from historique where nom like 'colin%' and madate between date('now', '-30 days') and date('now')

Si tu veux savoir à quelles dates c'était :
select madate from historique where nom like 'colin%' and madate between date('now', '-30 days') and date('now') order by date
Merci pour ces infos précieuses avec sqlite, car j'avoue pouvoir savoir combien de kilo de riz j'ai mangé dans l'année ou autre, en une commande, peut mettre très utile, ça me laisse la possibilité de faire plein de stats à l'avenir :roll: Vraiment sqlite c'est top :)

Merci à toi Jchd,
Cordialement
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Recherche sqlite last tbl_name

#7

Message par jchd »

Les dates sont dans l'ordre, mais pas comme j'aimerais, c'est à dire je voudrais avoir les dates les plus récentes en haut dans la listbox.
Je me doutais que tu aimerais voir ça ainsi. Très simple : tu veux un ordre décroissant (descendant), alors ta clause devient ORDER BY MADATE DESC
Par défaut (sans clause ORDER BY) l'ordre des résultats n'est pas défini et peut être quelconque. ORDER BY tout seul implique tri croissant (ascendant), donc ASC.
Merci pour ces infos précieuses avec sqlite, car j'avoue pouvoir savoir combien de kilo de riz j'ai mangé dans l'année ou autre, en une commande, peut m'être très utile, ça me laisse la possibilité de faire plein de stats à l'avenir :roll: Vraiment sqlite c'est top :)
Eh oui, et encore tu n'en entrevois qu'une toute petite partie. Si tu veux savoir combien de fois tu as mangé du scrournblouc avec des tomates trois jours au plus après avoir ingurgité de la pastagouille au cours des six dernier mois impairs, tu peux te construire cette requête complexe et la machinerie SQL fera le boulot nécessaire pour te fournir le résultat.

C'est toujours de la programmation, mais elle repose sur un paradigme radicalement différent des langages dits impératifs, où tu dois décrire toi-même tout le chemin pour arriver à tes fins. En SQL, tu décris ce que tu souhaites obtenir et bingo, le bidule pédale et se met en quatre pour te satisfaire. Avec AutoIt, c'est toi qui conduit mais avec SQL tu as un chauffeur à tes ordres. C'est un luxe rare.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
tekserver
Niveau 3
Niveau 3
Messages : 37
Enregistré le : lun. 24 févr. 2014 11:36
Status : Hors ligne

Re: [..] Recherche sqlite last tbl_name

#8

Message par tekserver »

Re Jchd,

Encore une fois, via tes explications j'ai pu réussir à faire, ce que je voulais obtenir comme résultat, en ayant un peu plus appris sur sqlite, MERCI à toi.

Voici la fonction:

Code : Tout sélectionner

Func _test()

Local $aResult, $iRows, $iColumns

_SQLite_GetTable($ziftm, "SELECT distinct MaDate FROM Historique ORDER BY MaDate DESC;", $aResult, $iRows, $iColumns)

_GUICtrlListBox_BeginUpdate($Liste_Day)

    For $i = 2 To UBound($aResult) -1

        $dOriginal = $aResult[$i]   ; Convertion YYYY-MM-DD à MM/DD/YYYY
        $dNew = StringRegExpReplace($dOriginal, "\A(\d*)-(\d*)-(\d*)","$3/$2/$1")

        _GUICtrlListBox_AddString($Liste_Day, $dNew)
    Next

_GUICtrlListBox_EndUpdate($Liste_Day)


EndFunc
jchd a écrit : Si tu veux savoir combien de fois tu as mangé du scrournblouc avec des tomates trois jours au plus après avoir ingurgité de la pastagouille au cours des six dernier mois impairs
Lol, j'avoue y'a de quoi faire :) Une chose est sur, une fois que mon script sera fonctionnel je me pencherai sur ces possibilités.

Merci Jchd,
Cordialement.
Répondre