[R] Delete item listview et sqlite & réindexation

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Delete item listview et sqlite & réindexation

#21

Message par mikell »

aulus a écrit :Le problème est que je ne peux pas faire un WHERE sur un autre champ, car tous les champs peuvent se répéter
Evidemment il y aurait problème si tous les champs étaient identiques mais ce serait alors un doublon dans la base

VALUES (1,'cum','quand','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")
VALUES (2,'cum','comme','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")
VALUES (3,sicut','comme','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")

_SQLite_Exec($Base_SQLite, "DELETE FROM liste WHERE mot_latin = 'cum' AND mot_français = 'quand';")
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Delete item listview et sqlite & réindexation

#22

Message par aulus »

Oui, j'avais essayé ça, mais il y a encore un "mais" : _GUICtrlListView_GetItemText($myList, $IndexItemListView) ne retourne que la valeur du premier champ de l'item sélectionné de la ListView.

Du coup, dans le cas :

VALUES ('cum','quand','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")
VALUES ('cum','comme','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")

... la fonction ne me retourne que le "cum" et ne choisit, bien sûr, pas le bon !!!
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: [..] Delete item listview et sqlite & réindexation

#23

Message par jchd »

C'est un peu ce que je craignais.

Quand je vois ceci :
GuiCtrlCreateListview("n°|mot latin|mot français|texte|oeuvre|auteur latin|manuel|page|auteur manuel|editeur", ...
suivi de :
Le problème est que je ne peux pas faire un WHERE sur un autre champ, car tous les champs peuvent se répéter :

VALUES (1,'cum','quand','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")
VALUES (2,'cum','comme','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")
VALUES (3,sicut','comme','Comment on devient serf','Liber de servis','Marmoutiers','Moyen âge','14','Delannoy','OCDL');")
je ne peux m'empêcher de voir un tas de LEDs rouge qui m'indiquent un niveau d'alarme élevé.

Tu es à mon humble avis en train de t'empêtrer dans de pseudo problèmes d'interface qui ne font que refléter les graves déficiences du design de la base.

Tu soupçonnes cette situation, d'ailleurs :
Je suis complètement perdu :( Je ne maîtrise pas suffisamment sqlite. Je vais sans doute succomber à la tentation de remplacer les bases sqlite que j'envisageais de créer par des fichiers textes que je sais manipuler.
Mais le "remède" que tu envisages s'avèrera inexorablement bien pire que le mal : plus tu auras des informations "plates" (sans organisation), plus tu devras t'engluer dans du code spaghetti non maintenable pour gérer ces données et leur donner un semblant d'organisation de surface.

Il te faut accepter de cesser de cacher ou de transférer la difficulté d'organisation de tout ceci et t'y attaquer à bras le corps tout en gardant la tête froide. D'après le peu que je comprends de ton projet, SQL est parfaitement adapté pour stocker et organiser ces données et c'est de prime abord à ce niveau qu'il faut mouiller le maillot pour bâtir une véritable organisation qui modélise le besoin. Une fois une base solidement pensée et conçue, une fois que les requêtes "tourneront" dans un gestionnaire comme SQLite Expert, une fois ces requêtes codées dans des fonctions AutoIt, l'IHM se fera quasi-mécaniquement.
Faire l'inverse, c'est se tirer volontairement une balle dans le pied. SQLite tel qu'il est implémenté dans AutoIt est tout aussi indiqué du fait de sa facilité de mise en oeuvre, sa performance et sa souplesse, sauf si tu as besoin d'une architecture client-serveur (une base centralisée et de multiples clients qui tapent dedans à distance).
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Delete item listview et sqlite & réindexation

#24

Message par aulus »

Je suis d'accord avec vous sur toute la ligne... Je suis bien convaincu de l'avantage d'une base sqlite sur un fichier texte. D'autant plus qu'entrer des données, les modifier et les supprimer, ce n'est pas la mer à boire. Sur ces points, pas de problème.

Ce que j'essaie de résoudre, c'est comment afficher les données pour l'utilisateur, afin que celui-ci puisse sélectionner l'enregistrement qu'il souhaite modifier/supprimer. Evidemment j'ai pensé aussitôt à une listView. Mais dur-dur pour récupérer la ligne sélectionnée, et bien modifier/supprimer cet enregistrement-là dans la base sqlite.

Quelle autre méthode que le passage par une ListView permettrait à la fois de sélectionner un enregistrement, et de récupérer sa valeur entière pour l'envoyer à une fonction ?
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: [..] Delete item listview et sqlite & réindexation

#25

Message par jchd »

Je déguste mon Canigou pour le moment. Je t'ai confectionné une base qui (au pif) pourrait convenir pour stocker et surtout organiser correctement les données que tu mentionnes. Je finis d'avaler un morceau, je te met quelques entrées (incongrues, j'ai perdu tout mon latin !) et te joindrai quelques indications pour jouer avec.

Les questions d'IHM sont presque complètement disjointes ; ce n'est que de l'habillage.
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: [..] Delete item listview et sqlite & réindexation

#26

Message par jchd »

Je vais manquer un peu de temps là, mais voici quand même une base minimaliste qui, encore une fois, ne repose que sur ma propre interprétation (donc déviante) de tes besoins.

Comment je définirais la base :
► Afficher le texte
Je sais, ça va te sembler du charabia indémerdable, mais ne te fie pas à ton impression première.

Voici une copie de la base avec quelques "données" à manipuler avec SQLite Expert.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Delete item listview et sqlite & réindexation

#27

Message par aulus »

Grand merci jchd pour tout ce travail à mon intention... C'est de la haute voltige !

Est-ce que tout ça peut être inclus dans un programme autoit ? Car l'utilisateur du programme autoit ne va pas sortir du programme pour lancer Sqlite Expert.

Le programme est destiné à mémoriser le vocabulaire contenu dans des textes latins. L'utilisateur entre les mots et leurs traductions dans la base au fur et à mesure qu'il les rencontre dans ses traductions, puis dans un module différent, le programme tire au hasard un mot de la base et demande à l'utilisateur sa traduction. La réponse est alors vérifiée par le programme. Les champs autres que "motLatin" et "motfrancais" sont destinés à filtrer l'exercice (vocabulaire appartenant à tel texte...)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Delete item listview et sqlite & réindexation

#28

Message par mikell »

Bigre :shock:
Et ça serait quoi une base non minimaliste ?
aulus a écrit :_GUICtrlListView_GetItemText($myList, $IndexItemListView) ne retourne que la valeur du premier champ de l'item sélectionné de la ListView.
_GUICtrlListView_GetItemText ( $hWnd, $iIndex [, $iSubItem = 0] )
To retrieve the text of a subitem, set $iSubItem to the 1-based subitem's index.
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Delete item listview et sqlite & réindexation

#29

Message par aulus »

Merci Mikell d'avoir attirer mon attention sur le 3° argument de la fonction. Le code suivant marche bien :

Code : Tout sélectionner

Local $IndexItemListView = _GUICtrlListView_GetNextItem($myList)
Local $champ0 = _GUICtrlListView_GetItemText($myList, $IndexItemListView,0)
Local $champ1 = _GUICtrlListView_GetItemText($myList, $IndexItemListView,1)

...

_SQLite_Exec ($Base_SQLite, "DELETE FROM liste WHERE latin = '" & $champ0 & "' AND francais = '" & $champ1 & "';", $hQuery)
 
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: [..] Delete item listview et sqlite & réindexation

#30

Message par jchd »

C'est à peu près ce dont je me doutais.

Oui, c'est grosso modo la base de base. On pourrait ajouter des compteurs d'utilisation, de fréquence (dont le mécanisme est déjà intégré dans la table virtuelle FTS4 [Full Text Search]), un indicateur de niveau de langage (de base, léttré, savant, poétique) et bien sûr ce qu'il convient pour enregistrer les questions déjà posées avec leur date et les performances de chaque élève. Ce ne sont que des idées piochées au détour des circonvolutions de mon pauvre cervelas fatigué.

Toujours est-il quon a fortement intérêt à minimiser au maximum la duplication d'informations. Une base SQL digne de ce nom n'a aucun problème pour gérer un gros volume et croiser des tables (on parle de jointures). Il s'avère plus pénalisant de forcer le moteur à rechercher dans une seule table sur le modèle de la listview (où tout figure en clair et en redondance) plutôt que de lui indiquer par des références liant des tables séparées et restreintes où rechercher l'ouvrage, l'auteur, l'édition, etc.

Ainsi, on peut penser qu'il n'y aura qu'un nombre très limité d'éditeurs, un petit nombre d'auteurs et au pire quelques centaines d'ouvrages. Par contre, des mots (français et latin), il risque fort d'en exister des milliers. Si on met tout dans une seule table, on dupliquera autant de fois les références auteur, manuel, texte, éditeur et autres, ce qui pénalisera fortement les recherches.

Avoir a mettre au point les quelques requêtes nécessaires, même si elles demandent plusieurs jointures entre tables, n'est pas dramatique dès lors que ces tables regroupent logiquement des informations uniques.

On peut trouver une analogie courante : il est plus facile -tant pour un humain qu'un OS- de rechercher un fichier texte contenant les termes 'nomen' et 'mutus' dans un répertoire particulier que si les 357412 fichiers se trouvaient tous à la racine d'un volume disque. L'analogie fonctionne car un "filesystem" n'est autre qu'une base de données très spécialisée !
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: [..] Delete item listview et sqlite & réindexation

#31

Message par jchd »

Je fais suite, désolé du hachage !

Bien évidemment, c'est très facile de saucissonner cela dans un quelconque programme AutoIt (ou tout autre langage d'ailleurs du fait de l'incroyable portabilité de SQLite, aussi bien du code de la biblithèque que des bases elles-mêmes).

L'emploi d'un formidable outil comme Expert permet de se cuisiner une base aux petits oignons sans avoir à écrire une seule ligne de code, ce qui fait gagner 70% du temps de développement (sans rire !) quand on ne s'appuie pas sur une analyse exhaustive.

J'ai mis à jour la base à télécharger (il manquait une colonne vitale et j'avais fait une faute de frappe). Utiliser le même lien.

Pour démontrer qu'il n'est aucunement rédhibitoire de faire une requête complexe, ouvrir la base dans Expert, choisir un onglet SQL et coller ceci :

Code : Tout sélectionner

select Mot,
       motlatin "Mot(s) latin(s)",
       snippet(citations, '▶', '◀', '…', 0, 10) "Citation",
       oeuvre "Ouvrage d'origine",
       auteurlatin "Auteur latin",
       Manuel,    
       edition "Édition",
       Page,
       manuelauteur "Auteur",    
       editeur "Éditeur"
    from Mots
        natural join citations
        natural join oeuvres
        natural join auteurslatins
        natural join manuels
        natural join auteursmanuels        
        natural join editeurs
    where texte match 'fts4 NEAR/3 module'
 
puis faire F5 ou cliquer sur le bouton Execute SQL.

En bref, je veux la traduction et les références connues où figurent les mots FTS4 et modules séparés d'au plus 3 mots. Je donne aux colonnes des titres parlant.

Pour une requête de traduction simple, ouvrir un second onglet SQL et coller cette requête (bidon, je l'accorde) :

Code : Tout sélectionner

select motlatin "Mot latin", mot Traduction from mots where motlatin = 'moduli'
Pour une validation de traduction avec toutes références, dans un autre onglet SQL :

Code : Tout sélectionner

with
    trad ("Mot latin", Traduction)
  as
    (select motlatin, mot from mots where motlatin = 'moduli')    

select motlatin "Mot(s) latin(s)",
       Mot,
       snippet(citations, '▶', '◀', '…', 0, 10) "Citation",
       oeuvre "Ouvrage d'origine",
       auteurlatin "Auteur latin",
       Manuel,    
       edition "Édition",
       Page,
       manuelauteur "Auteur",    
       editeur "Éditeur"
    from Mots
        join trad on motlatin = "mot latin"
        natural join citations
        natural join oeuvres
        natural join auteurslatins
        natural join manuels
        natural join auteursmanuels        
        natural join editeurs
 where texte match traduction
Cette dernière requête emploie une CTE (common table expression) introduite récemment avec la clause WITH, ce qui permet de tout grouper dans une seule requête.

Donc mis à part la relative rugosité du langage SQL, il n'y a rien de magique là-dedans.
On dispose aussi de possibilités offertes directement par le moteur et qui pourraient apporter un sérieux plus, par exemple lister le thésaurus des mots latins cités par un auteur donné, faire des statistiques d'occurence de mots, de termes proches les uns des autres (embryon de contexte sémantique), lister le thésaurus commun à Virgile, Esope et Lucrèce qui n'est employé par aucun autre auteur latin, etc. Les possibilités sont infinies et ne demandent pas une ingénierie extraordinaire, si l'on accepte de tâter l'eau et de s'y plonger (même si elle peut sembler frisquette au début, je sais).

Les définitions dans cette base "jouet" assurent l'intégrité des données. On ne peut rentrer une citation que si les éléments qu'elle référence existent préalablement (clés étrangères ou Foreign Keys). Si l'on modifie ou supprime une entité de base, par exemple un éditeur, alors toutes les données qui y font référence seront modifiées ou supprimées.

Même dans cet état de squelette et sans aucun contrôle de vraisemblance au niveau des données, le moteur SQL assure déjà bien cette cohérence de base. Il serait énormément plus difficile d'aboutir au même niveau de robustesse avec des fichiers texte ou une table unique. Ainsi, le nom d'un auteur ou d'un éditeur ne figure qu'une fois ce qui met à l'abri de fautes de saisie qu'il serait impossible d'éviter en pratique si l'on devait saisir de nouveau ces données à chaque citation.

Je suis bien conscient d'avoir fait ici une longue parenthèse (trop ?) orientée SQL par rapport au contexte initial, mais j'espère qu'elle ouvrira des portes.

Ne pas oublier qu'on peut formater directement en SQL avec l'opérateur de concaténation || le résultat d'une requête pour qu'elle soit immédiatement collable dans les éléments d'une listview.
A titre d'exemple ultra-simple, on peut faire (cas de | utilisé en séparateur de colonnes pour la listview) :

Code : Tout sélectionner

_SQLite_GetTable($hDB, "select manuel || '|' || manuelauteur || '|' || editeur from manuels natural join auteursmanuels natural join editeurs", $aRows, $iRows, $iCols)
Essayer avec Expert : le tableau 1D obtenu (la première rangée comporte le titre et est à ignorer) contient des chaînes susceptibles de peupler une listview. Là encore, zéro code ou si peu.
Modifié en dernier par jchd le lun. 12 mai 2014 22:25, modifié 1 fois.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Delete item listview et sqlite & réindexation

#32

Message par aulus »

Un grand merci à tous pour vos interventions, à Mikell qui m'a proposé la solution AutoIt dès le début et que je n'ai pas su exploiter à la première lecture, à Hugues, GarydelaMer et jchd qui ont élargi mon horizon en me présentant des alternatives (ADO, SQLite). Tout ça est loin d'être gagné pour moi mais le champ d'étude est séduisant. J'étudierai à tête reposée tous les exemples donnés...
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: [R] Delete item listview et sqlite & réindexation

#33

Message par jchd »

Si tu me fais parvenir ta base existante (en pm, par mail, par lien sur un site de partage, ...), je pourrai peupler le squelette proposé pour que tu aies une perception plus juste de ce que ça peut t'offrir en pratique. Fabriquer 2 ou 3 entrées complètement bidon n'est pas très parlant alors que manipuler une base gavée de données réelles est bien plus à propos.

Au fait, ADO est l'interface "objet" (DOM) permettant d'exploiter une BDD à travers un pilote dit ODBC. Il existe des pilotes ODBC pour à peu près tous les moteurs de BDD. SQLite a le sien mais il vaut mieux utiliser l'UDF standard qui est bien plus véloce.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] Delete item listview et sqlite & réindexation

#34

Message par aulus »

J'ai fait une petite base pour tester, les bases n'étant pas fournies à l'utilisateur par le programmeur mais devant être créées par l'utilisateur au fur et à mesure de ses besoins.
Je vous envoie ma base test par MP.
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: [R] Delete item listview et sqlite & réindexation

#35

Message par jchd »

Merci bien, ça me permet de constater que j'envisageais un projet de niveau plus académique, enfin plus demandeur, avec des milliers de textes et des foultitudes de mots. J'avais aussi mal interprété "texte" en terme de citation, ce qui n'est pas du tout le cas. Du coup, la table virtuelle permettant la recherche de mots ne sert plus à rien et on peut aussi accepter une certaine dé-normalisation de la base par souci de simplification.

Voilà ce à quoi j'arrive après ces considérations.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre