[R] Version SQLite

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
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: [..] Version SQLite

#21

Message par jchd »

Si tu pouvais poster ici ou en privé ton code actuel et un jeu d'essai (bidon ou pas, je m'en fiche) ça gagnerait un temps considérable.

Au passage, chaque CREATE .. SQL est une instruction SQL. S'il y en a plusieurs à la suite dans un _SQLite_Exec, les séparer par un point-virgule tout simplement.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [..] Version SQLite

#22

Message par ludoo »

je bloque sur cette commande:
► Afficher le texte
message d'erreur :
! SQLite.au3 Error
--> Function: _SQLite_Exec
--> Query: CREATE TABLE UsersGroups ( UserId INTEGER CONSTRAINT fkUsersGroup_User REFERENCES Users (UserId) ON DELETE CASCADE ON UPDATE CASCADE NOT DEFERRABLE INITIALLY DEFERRED, GroupId INTEGER CONSTRAINT fkUsersGroups_Group REFERENCES Groups (GroupId) ON DELETE CASCADE ON UPDATE CASCADE NOT DEFERRABLE INITIALLY DEFERRED, CONSTRAINT () PRIMARY KEY (UserId, GroupId) ON CONFLICT IGNORE);
--> Error: near "(": syntax error
Ludo
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: [..] Version SQLite

#23

Message par jchd »

Tu as changé les crochets contre des parenthèses !
CONSTRAINT () PRIMARY KEY (UserId, GroupId) ON CONFLICT IGNORE);
devrait être
CONSTRAINT [] PRIMARY KEY (UserId, GroupId) ON CONFLICT IGNORE);
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [..] Version SQLite

#24

Message par ludoo »

je pensais qu'il n'y avait pas de crochet ds les envoies de commande ,mea-culpa
je continue la création pour renseigne la base.
Ludo
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: [..] Version SQLite

#25

Message par jchd »

Pour SQL :
-) des simples quotes encadrent un littéral texte, à doubler pour représenter une quote significative
'c''est comme ça'
-) des crochets droits encadrent un nom du schéma (table [virtuelle], colonne, contrainte, index, trigger, vue, alias, base, collation ...)
[ma table] ou [cet index-là au nom Unicode bizarre ΞζϝЗБ]
-) SQLite accepte aussi des doubles quotes au lieu de crochets droits (compatibilité MS)
"ma table" ou "cet index-là au nom Unicode bizarre ΞζϝЗБ"

Le type de contrainte dont on parlait peut avec SQLite ne pas avoir de nom, d'où le [] qu'on peut aussi écrire "" ou même sucrer complètement.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [..] Version SQLite

#26

Message par ludoo »

j'ai mon fichier txt avec les utilisateurs et groupes du type:
user1,GG-XX
user1,GG-YY
user2,GG-XX
user2,GG-ZZ
Pour la création de la base plus d'erreur ( les crochets)
Pour renseigner la base voici le code
► Afficher le texte
Par contre j'ai des erreurs
► Afficher le texte
Ludo
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: [..] Version SQLite

#27

Message par jchd »

Il faut quoter tes littéraux !
4 simples X devraient le faire.

Code : Tout sélectionner

        _SQLite_Exec($hDb, "insert into Users (Username) values (" & X($res[0]) & ");" & _
                "insert into Groups (Groupname) values (" & X($res[1]) & ");" & _
                "insert into UsersGroups (UserId, GroupId) values ((select UserId from Users where Username = " & X($res[0]) & ", (select GroupId from Groups where Groupname = " & X($res[1]) & " );")
C'est bien visible dans la ligne d'erreur que l'UDF SQLite t'affiche dans la console :

Code : Tout sélectionner

insert into Users (Username) values (USER1);insert into Groups (Groupname) values (GG-XX);insert into UsersGroups (UserId, GroupId) values ((select UserId from Users where Username = USER, (select GroupId from Groups where Groupname = GG-XX );
Ce que tu lui passes (USER1, GG-XX) c'est deux identifiants de schéma, pas des chaînes littérales ('USER1', 'GG-XX')
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [..] Version SQLite

#28

Message par ludoo »

j'ai repris le code avec la fonction X
► Afficher le texte
mais toujours message d'erreur:
► Afficher le texte
le code :
► Afficher le texte
ça rempli bien la table 'Users' ds son intégralité j'ai bien tous mes utilisateurs,
pour la table 'Groups' , elle est partiellement remplie,
pour la table 'UsersGroups', elle est vide.
j'utilise le logiciel SQLite 2009 Pro pour éditer la base.
Ludo
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: [..] Version SQLite

#29

Message par jchd »

Plates excuses, essaye ça :
► Afficher le texte
j'utilise le logiciel SQLite 2009 Pro pour éditer la base.
Comme tu veux...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [..] Version SQLite

#30

Message par ludoo »

super , la création de la base est ok ,
l'insertion ds la base est correct , j'ai modifié les inserts ,de faire tous d'un seul bloque généré des erreurs.
Pour la création d'une base par mois, c comme j'ai les log tous les mois donc ... , mais créer un base générale , j'adhère , cela modifie les insert ds la base ou je garde les insert actuel?
remis les parenthèses que tu avais enlevé dans l'insert (user, groupe), salopiaud ;-)
c pour tester ta myopie traditionnelle :wink: pas de souci :mrgreen: malgré les nombreux pièges ( bout de code, information incomplète, ect..).
Au début j'avais commencé un code via des requêtes snmp vers les imprimantes et copieur pour interroger les compteurs d'impression , puis mettre tout cela ds un fichier excel.
Puis la demande de création de script en se basant sur le spooler d'impression ( la base sqlite), question est ce que tous les impressions qui passent par le spooler d'impression sont bien réellement imprimées, chez moi hélas non car les fonctions avancées des copieurs permet de faire du stockage avant impression. D'où l'info du spooler est partiellement vrai.
l'idéale sa serait de merger les deux, mais la c l'usine. La plupart des logiciels de rapport d'impression se base sur le spooler d'impression des serveurs d'impression.
Stop j'arrête la réflexion ( c dimanche et OL fait match nul contre PSG). je rectifie , l'OL vient de perdre arrrhhh!!
Voici les différents scripts qui vont m'aider à effectuer des rapports d'impression assez finement en pièce jointe.
Pour le script snmp , je pense qu'on peut l'optimiser
Pour le script Excel , peut on renseigner le fichier sans l'ouvrir ?
Pour le script SQlite , merci jchd
j'ai encore des lacunes sur les requêtes sqlite ex:
- requête avec les groupes et le nombre d'impression A4 (total copie*pages)
► Afficher le texte
Fichiers joints
consolidation_compteur_imp_mail.au3
(78.07 Kio) Téléchargé 80 fois
collecte_compteur_imp_mail.au3
(229.8 Kio) Téléchargé 79 fois
Ludo
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: [..] Version SQLite

#31

Message par jchd »

Tu peux accumuler niaisement, tu as la date de chaque printout, indexée. Rien ne limite la fourchette de dates, ni au niveau des inserts, ni ailleurs. C'est à toi de requérir sur "date between xxx and yyy" si tu en as besoin. Côté volume, rien à craindre, SQLite assume.

Pour SNMP, je ne suis pas assez familier avec, donc je risque de te dire (encore) des couenneries. Au niveau du principe, tente d'extraire les infos sous le même format que celui des logs. Quite à rajouter une colonne "source" dans la table printout, qui pourrait valoir 'S' (SNMP), 'L' (logs), 'D' (divination), ...

Tu peux faire ce que tu veux avec un fichier Excel via l'UDF ... Excel. Facile.

Pour le total de copies par groupe, il faut savoir de quoi on parle :
select upper(groupname) as Groupe, total(pages * copies) as "Copies imprimées" from printouts natural join users natural join usersgroups natural join groups group by groupname order by groupname;
va bien renvoyer une liste de tous les groupes qui ont imprimé avec le total des copies faites par ce groupe.
Mais ...
si un user fait partie de deux ou plusieurs groupes, son total de copies
► Afficher le texte
Il faut toujours bien réfléchir avant de se lancer dans le vide sans parachute sinon nos merveilleuses machines nous renvoient, à la vitesse de l'éclair, nos "myopies" dans les dents sous forme de données non significatives et de pseudo-informations faussées.

Exercice : modifier la requête précédente pour éviter cela, faisant donc en sorte que le total des copies attribuées aux différents groupes corresponde au total des copies physiques.

Quand tu as des requêtes récurrentes (type rapports), n'hésite pas à en faire des vues, par exemple :
► Afficher le texte
Zut, j'ai bien peur d'avoir donné la solution...
Ensuite, dans ton appli, tu peux récupérer le contenu de la vue comme si c'était une table, à laquelle tu peux d'ailleurs rajouter des conditions de sélection :
► Afficher le texte
Une vue ne coûte rien : ce n'est qu'une requête (celle qui définit la vue) stockée dans la DDL de la base. Elle ne s'exécute que lorsque tu l'affiche avec ton manager ou quand tu "tapes" dedans avec une autre requête, comme celle ci-dessus. Elle en devient alors une sous-requête. Cela simplifie/clarifie le code de ton appli. Qui plus est, il est possible de modifier les données d'une vue (si, si !) par des triggers INSTEAD OF qui permettent de modifier la ou les tables qui alimentent cette vue.

>Tu vois que les possibilités sont virtuellement infinies, avec _très_ peu de code en fait (une fois que le schéma de la base est créé). Imagine le code AutoIt qu'il te faudrait écrire si tu voulais obtenir autant de souplesse et de puissance de requêtes et les difficultés de mise au point et de maintenance/évolution.

Encore une fois, j'avoue profiter lâchement de ton exemple de projet pour illustrer à quel point SQLite s'avère l'outil idéal pour stocker, organiser et accéder à des données applicatives sous un format portable, compact et terriblement efficace. Quand on rajoute à ça les qualités ACID que SQLite offre naturellement, on voit mal pourquoi certains s'obstinent à maintenir péniblement des usines à gaz de multiples fichiers aux formats propriétaires qui n'assurent aucune solidité et demandent beaucoup plus d'efforts de développement.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [..] Version SQLite

#32

Message par ludoo »

merci pour les requêtes "create view",
Ensuite, dans ton appli, tu peux récupérer le contenu de la vue comme si c'était une table, à laquelle tu peux d'ailleurs rajouter des conditions de sélection :
Spoiler pour :
select * from [Copies/Groupe] where date like '2011-09';
alors ça c terrible :D
Qui plus est, il est possible de modifier les données d'une vue (si, si !) par des triggers INSTEAD OF qui permettent de modifier la ou les tables qui alimentent cette vue.
c pour mettre à jour la vue?je vais chercher sur un forum sql
je te remercie du temps que tu as consacré sur mon problème et trouver la bonne solution pour que ce script soit stable dans le temps et aussi d'orienter vers le SQL car c vraiment puissant couplé avec AutoIt.
on a du te le dire une bonne centaine de fois , un tuto sur SQLite :mrgreen:

# une section sur SQLite dans le forum ?#
Ludo
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] Version SQLite

#33

Message par jchd »

L'intérêt des vues est qu"elles permettent de disposer de tables (fictives dans ce sens où elles ne contiennent aucune données elles-mêmes) rassemblant des requêtes simples ou extrêmement complexes sans surcharger ni la base ni l'application.

J'ai un tout autre point de vue concernant les procédures stockées. Ou bien ce sont des fonctions génériques (traitement particulier de chaînes ou autre) et dans ce cas elles devraient être implémentées sous forme d'extension. Ou bien elles sont propriétaires à une appli et devraient par conséquent être ramenées dans l'application. J'ai vu trop de cas où on utilise des procédures stockées pour créer une couche orientée-objet à du SQL classique. C'est pour moi une perversion dangereuse, car pour une modif de spécification, on doit synchroniser les modifs du schéma, des procédures stockées et de l'application ; c'est le contraire de la POO !

Je m'égare... Oui des vues sont utilisables telles quelles via par exemple un manager comme SQLite Expert qui te permet d'en faire un rapport texte, CSV, Excel, HTML, ... ou par toi dans une autre requête (ou autre vue) comme s'il s'agissait d'une table physique. C'est donc une "brique" SQL, tout comme une classe est une brique en POO. Exemple typique : j'ai une appli qui syndique deux bases dans des domaines connexes mais bien distincts. Plutôt que de mélanger dans une requête des éléments "bas niveau" des deux bases, je crée des vues dans les deux bases, offrant à la syndication les seuls éléments qu'elle a à connaître sans avoir à mettre les mains dans le cambouis et à tout mélanger. La syndication n'a plus à se préoccuper du "comment" pour l'obtention de telle info, on lui présente toute ficelée. La savoir-faire et les recettes de cuisine internes à une base restent cloîtrées au sein de celle-ci. C'est encore une forme de POO (limitée certes) ou au moins relève d'une salutaire séparation des pouvoirs. BTW, on peut accéder à une base externe après l'avoir rendue accessible avec un ATTACH. Très simple.

Oui moi aussi je trouve SQL très performant pour une palette d'utilisation incroyable et une sûreté de fonctionnement inégalée. Le fait que SQLite soit sans administration, sans installation et portable sur toute plate-forme 32 ou 64 bits sans _aucun_ changement en fait un outil de choix dans bien des cas ou l'instinct de beaucoup amène à construire des châteaux de sable qui ne tiennent ni la distance (maintenance, évolution) ni la charge (volume, multi-utilisateurs). L'investissement requis au départ pour construire la base et la faire vivre est vite rentabilisé et ce qui semble ardu et tortueux à un néophyte ne représente souvent qu'un petit pavé de lignes, surtout avec une plate-forme comme AutoIt.

Ton post est en fait un tuto "live". Du fond de mon actuelle cabanne de chantier et avec pour lien une clé 3G qui me coûte un bras et deux jambes chaque jour, j'ai du mal à faire beaucoup plus pour le moment. Plus tard, je ne dis pas...

Bonne chance pour ton projet et n'hésite pas à taper dans le mail si tu coinces sur un truc.

Sur ce, je présente à tou[te]s mes plus plates excuses pour avoir volontairement fait dévier ce post (long de par ma faute) d'un pur sujet AutoIt à des considérations centrées sur SQLite. Ceci dit, je crois que ce n'était pas une mauvaise chose et pourra servir à d'autres.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [R] Version SQLite

#34

Message par ludoo »

j'ai voulu créer 2 vues:
► Afficher le texte
puis les requêtes sur ces vues:
► Afficher le texte
et une vue [utilisateur / copie A4]:
► Afficher le texte
par contre un truc bizarre ds la base,
exemple:
user1 membre du groupe XX
ds la vue [utilisateur / copie A4] j'ai bien mon user1 avec le nombre de copie.
lorsque j'ouvre la vue [Copies/Groupe/A4], je n'ai pas le groupe XX dont l'utilisateur fait parti.
Ludo
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] Version SQLite

#35

Message par jchd »

N'ayant pas ta base ni celle que j'ai fabriqué à l'arrache sous la main, je tente une hypothèse : et si ton user1 fait partie de plus d'un groupe ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ludoo
Niveau 4
Niveau 4
Messages : 89
Enregistré le : lun. 11 août 2008 09:25
Localisation : Drôme 26
Status : Hors ligne

Re: [R] Version SQLite

#36

Message par ludoo »

oui effectivement , l'utilisateur fait partie de plusieurs groupe.
le nom des groupes est de la forme : GG-xx-ab , GG-xx-ac
code de la base avec les vues.
► Afficher le texte
Ludo
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] Version SQLite

#37

Message par jchd »

C'est donc bien cela. Revois le message où j'évoquais cette subtilité. Si on liste tous les groupes d'un utilisateur et qu'on fait le total de _leurs_ copies (de cchaque groupe), on dupplique l'information des utilisateurs faisant partie de plus d'un groupe. D'où le left outer join et alors il peut y avoir des groupes qui "disparaissent" (en fait, les copies sont décomptées sous un autre groupe).

Si j'ai 5 boîtes de tomates pelées que je considère comme faisant partie à la fois de la famille des fruits et de la famille des légumes, ce n'est pas pour autant que j'ai 10 de ces boîtes en stock ! Si je liste niaisement le stock de chaque famille, c'est bien le résultat absurde que j'obtiens.

Soit on fait un état du stock des légumes, soit des fruits, soit des boîtes de conserves. Toute autre combinaison n'a pas de sémantique et est une erreur mathématique (n'oublions pas que SQL traite essentiellement des ensembles, de leurs éléments et de leurs relations avec une logique reposant quasi-exclusivement sur la théorie mathématique sous-jacente).

De la même façon, un fichier ne peut appartenir à la fois à deux arborescence distinctes. Soit on le copie ailleurs (il y a alors deux fichiers distincts), soit on en fait un lien symbolique (ce qui est un autre type d'objet distinct du fichier réel).

On frôle le "paradoxe" du catalogue des catalogues qui ne se mentionnent pas eux-mêmes...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre