Dbm (discuter | contributions) m (→ENGLISH VERSION) |
Dbm (discuter | contributions) m (→ENGLISH VERSION) |
||
Ligne 73 : | Ligne 73 : | ||
<big><b> 1. What is SQLfast ?</b></big> | <big><b> 1. What is SQLfast ?</b></big> | ||
</font> | </font> | ||
− | </td></tr> | + | </td></tr></table> |
− | </table> | + | |
Ligne 81 : | Ligne 80 : | ||
<big><b> 2. Installing SQLfast and Getting started</b></big> | <big><b> 2. Installing SQLfast and Getting started</b></big> | ||
</font> | </font> | ||
− | </td></tr> | + | </td></tr></table> |
− | </table> | + | |
Ligne 89 : | Ligne 87 : | ||
<big><b> 3. SQLfast Documentation</b></big> | <big><b> 3. SQLfast Documentation</b></big> | ||
</font> | </font> | ||
− | </td></tr> | + | </td></tr></table> |
− | </table> | + | |
− | < | + | <big>Comparing DB access code</big> |
+ | |||
<table> | <table> | ||
<tr> | <tr> | ||
− | <td width=" | + | <td width="35%"> |
<b>SQLfast</b> | <b>SQLfast</b> | ||
</td> | </td> | ||
− | <td> | + | <td width="65%"> |
<b>Java/JDBC</b> | <b>Java/JDBC</b> | ||
</td> | </td> | ||
Ligne 105 : | Ligne 103 : | ||
<tr> | <tr> | ||
<td valign=top> | <td valign=top> | ||
− | <tt><b>openDB</b> CLICOM.db; | + | <tt><b>openDB</b> CLICOM.db;<br> |
− | + | <b>select</b> NCLI,NOM <b>from</b> CLIENT;</tt> | |
</td> | </td> | ||
<td valign=top> | <td valign=top> | ||
Ligne 135 : | Ligne 133 : | ||
</td> | </td> | ||
</tr> | </tr> | ||
− | |||
<tr valign=top> | <tr valign=top> | ||
<td valign=top> | <td valign=top> | ||
Ligne 180 : | Ligne 177 : | ||
+ | </td> | ||
+ | </tr> | ||
+ | </table> | ||
+ | |||
+ | |||
+ | <big>Comparing GUI code</big> | ||
+ | |||
+ | <table> | ||
+ | <tr> | ||
+ | <td width="45%"> | ||
+ | <b>SQLfast</b> | ||
+ | </td> | ||
+ | <td> | ||
+ | <b>Python/Tkinter</b> | ||
+ | </td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td valign=top> | ||
+ | <tt> | ||
+ | <b>set</b> oid = 30186;<br> | ||
+ | <b>set</b> pid = PA60;<br> | ||
+ | <b>set</b> q = 75;<br> | ||
+ | <b>ask-u</b> oid,pid,q = [/bSaisie données DETAIL]<br> | ||
+ | {COMMANDE}|IdCom:[!<b>select</b> NCOM <b>from</b> COMMANDE]<br> | ||
+ | ||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];<br> | ||
+ | </tt> | ||
+ | </td> | ||
+ | <td valign=top> | ||
+ | <tt> | ||
+ | <b>from</b> Tkinter <b>import</b> *<br> | ||
+ | <b>import</b> ttk<br> | ||
+ | <b>import</b> sqlite3<br> | ||
+ | <br> | ||
+ | <b>def</b> setComboBoxColors():<br> | ||
+ | styl = ttk.Style()<br> | ||
+ | styl.map("TCombobox",fieldbackground = <br> | ||
+ | [('!readonly','!focus','white'),<br> | ||
+ | ('readonly', '!focus','white')] )<br> | ||
+ | return<br> | ||
+ | <br> | ||
+ | <b>class</b> EntryBox():<br> | ||
+ | <br> | ||
+ | <b>def</b> __init__(self,parent,title):<br> | ||
+ | self.Parent = parent<br> | ||
+ | self.Parent.title(title)<br> | ||
+ | self.mainFr = Frame(parent,relief=FLAT,bd=1)<br> | ||
+ | self.initial_focus = self.body()<br> | ||
+ | self.mainFr.pack(padx=5,pady=5)<br> | ||
+ | self.buttonbox()<br> | ||
+ | self.Parent.protocol("WM_DELETE_WINDOW",self.cancel)<br> | ||
+ | self.Parent.mainloop()<br> | ||
+ | return<br> | ||
+ | <br> | ||
+ | <b>def</b> body(self):<br> | ||
+ | M1 = Message(self.mainFr,text=Comment,<br> | ||
+ | font=('Helvetica',9,'bold'),anchor=W,<br> | ||
+ | justify=LEFT,relief=SUNKEN,bd=1,<br> | ||
+ | width=300)<br> | ||
+ | M1.grid(row=0,column=0,columnspan=4,padx=2,<br> | ||
+ | pady=2,ipadx=1,ipady=1,sticky=N+W+E)<br> | ||
+ | M2 = Message(self.mainFr,text="COMMANDE",font=("Helvetica",9,<br> | ||
+ | "bold"),anchor=W, justify=LEFT,<br> | ||
+ | bd=1,width=300)<br> | ||
+ | M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)<br> | ||
+ | Label(self.mainFr,text="IdCom:").grid(row=2,column=0,sticky=E)<br> | ||
+ | self.fr0v1 = StringVar()<br> | ||
+ | self.fr0e1 = ttk.Combobox(self.mainFr,width=15,<br> | ||
+ | height=20,state='readonly',<br> | ||
+ | textvariable=self.fr0v1)<br> | ||
+ | self.fr0e1.grid(row=2,column=1,<br> | ||
+ | pady=1,padx=3,sticky=W+E)<br> | ||
+ | self.fr0e1["values"] = vList1<br> | ||
+ | M3 = Message(self.mainFr,text="PRODUIT",<br> | ||
+ | font=("Helvetica",9,"bold"),anchor=W,<br> | ||
+ | justify=LEFT,bd=1,width=300)<br> | ||
+ | M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)<br> | ||
+ | Label(self.mainFr,text="IdPro:").grid(row=2,column=2,sticky=E)<br> | ||
+ | self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)<br> | ||
+ | self.fr0e2.grid(row=2,column=3,<br> | ||
+ | pady=3,padx=3,sticky=W+E)<br> | ||
+ | Label(self.mainFr,text="Quantité:").grid(row=3,column=2,sticky=E)<br> | ||
+ | self.fr0v3 = StringVar()<br> | ||
+ | self.fr0e3 = ttk.Combobox(self.mainFr,width=15,<br> | ||
+ | height=20,textvariable=self.fr0v3)<br> | ||
+ | self.fr0e3.grid(row=3,column=3,<br> | ||
+ | pady=1,padx=3,sticky=W+E)<br> | ||
+ | self.fr0e3["values"] = vList2<br> | ||
+ | self.fr0v1.set(oid)<br> | ||
+ | self.fr0e2.insert(0,pid)<br> | ||
+ | self.fr0v3.set(q)<br> | ||
+ | self.Parent.bind("<Return>", self.ok)<br> | ||
+ | self.Parent.bind("<Escape>", self.cancel)<br> | ||
+ | setComboBoxColors()<br> | ||
+ | return<br> | ||
+ | <br> | ||
+ | <b>def</b> buttonbox(self):<br> | ||
+ | buttonFr = Frame(self.Parent)<br> | ||
+ | Ok = Button(buttonFr,text="OK",relief=RAISED,<br> | ||
+ | overrelief=SUNKEN,width=10,command=self.ok)<br> | ||
+ | Ok.pack(side=LEFT, padx=5, pady=5)<br> | ||
+ | Can = Button(buttonFr,text="Cancel",relief=RAISED,<br> | ||
+ | overrelief=SUNKEN,width=10,command=self.cancel)<br> | ||
+ | Can.pack(side=LEFT,padx=5,pady=5)<br> | ||
+ | buttonFr.pack()<br> | ||
+ | return<br> | ||
+ | <br> | ||
+ | <b>def</b> apply(self):<br> | ||
+ | ndx1 = self.fr0e1.current()<br> | ||
+ | if ndx1 > -1:<br> | ||
+ | actVal = vList1[ndx1]<br> | ||
+ | else:<br> | ||
+ | actVal = ""<br> | ||
+ | self.result.append(actVal)<br> | ||
+ | self.result.append(self.fr0e2.get())<br> | ||
+ | ndx3 = self.fr0e3.current()<br> | ||
+ | if ndx3 > -1:<br> | ||
+ | actVal = vList2[ndx3]<br> | ||
+ | else:<br> | ||
+ | actVal = self.fr0v3.get()<br> | ||
+ | self.result.append(actVal)<br> | ||
+ | return<br> | ||
+ | <br> | ||
+ | <b>def</b> ok(self,event=None):<br> | ||
+ | self.result = ["OK"]<br> | ||
+ | self.apply()<br> | ||
+ | self.Parent.destroy()<br> | ||
+ | self.Parent.quit()<br> | ||
+ | return<br> | ||
+ | <br> | ||
+ | <b>def</b> cancel(self,event=None):<br> | ||
+ | self.result = ["Cancel"]<br> | ||
+ | self.Parent.destroy()<br> | ||
+ | self.Parent.quit()<br> | ||
+ | return<br> | ||
+ | <br> | ||
+ | <br> | ||
+ | conn = sqlite3.connect('CLICOM.db')<br> | ||
+ | c = conn.cursor()<br> | ||
+ | c.execute('select NCOM from COMMANDE order by NCOM')<br> | ||
+ | vList1 = []<br> | ||
+ | for row in c:<br> | ||
+ | vList1.append(row[0])<br> | ||
+ | c.close()<br> | ||
+ | root = Tk()<br> | ||
+ | root.withdraw()<br> | ||
+ | Comment = 'Saisie données DETAIL'<br> | ||
+ | vList2 = [1,2,5,10,20,50]<br> | ||
+ | BoxTitle = "[ User data entry ]"<br> | ||
+ | oid = "30186"<br> | ||
+ | pid = "PA60"<br> | ||
+ | q = 75<br> | ||
+ | d = EntryBox(root,BoxTitle)<br> | ||
+ | DIALOGbutton = d.result[0]<br> | ||
+ | if DIALOGbutton == 'OK':<br> | ||
+ | oid = d.result[1]<br> | ||
+ | pid = d.result[2]<br> | ||
+ | q = int(d.result[3])<br> | ||
+ | print DIALOGbutton,oid,pid,q<br> | ||
+ | c.close()<br> | ||
+ | conn.close()<br> | ||
+ | </tt> | ||
</td> | </td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
--> | --> |
1. Qu'est-ce que SQLfast ? |
Le nom SQLfast désigne, d'une part, un langage permettant de rédiger des scripts de manipulation de bases de données relationnelles, et d'autre part, un logiciel permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des scripts SQLfast de toute nature et de complexité quelconque. Langage et logiciel SQLfast ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.
Le langage SQLfast est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL2 et d'autre part, des instructions d'échange de données avec l'utilisateur (boites de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions (voire plusieurs centaines de millions pour des scripts de chargement de données).
Le langage SQL a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que celle des dialogues avec l'utilisateur sont entièrement cachées car gérées par le moteur SQLfast. Une boite de saisie de données relatives à un client est définie en une seule instruction SQLfast et en 66 instructions en Python/Tkinter. De même, la consultation des données d'une table nécessite 2 instructions en SQLfast (openDB CLICOM.db; select * from CLIENT) mais plus de 23 instructions en Java/JDBC.
SQLfast est un logiciel dit portable, qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.
Le logiciel SQLfast offre une interface graphique particulièrement conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en trois variantes :
Le logiciel SQLfast est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test et quelques scripts de démonstration), il n'occupe guère plus de 15 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données (plusieurs centaines de Go) nécessitera des ressources plus importantes.
SQLfast est développé en Python 2.7, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD SQLite 3.8.10 et la bibliothèque graphique standard Tkinter. La version actuellement disponible fonctionne sous les systèmes MS Windows à partir de XP.
Des versions tournant sous OS X et Linux ont été testées avec succès mais ne sont pas diffusées pour l'instant. Des versions basées sur MySQL et MS Access existent mais ne sont pas disponibles pour l'instant.
2. Installation et démarrage |
Le package d'installation comprend trois parties : le logiciel, le guide d'installation et une brève introduction à l'utilisation du logiciel.
3. Documentation sur SQLfast |
Il existe deux sources principales de documentation concernant l'outil et le langage SQLfast : les documents de la fonction d'aide (Help) du logiciel et le tutoriel de SQLfast.
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). Ils sont normalement localisés dans les répertoires par défaut SQLfastHelp_FR et SQLfastHelp_EN localisés dans le répertoire général SQLfast selon la langue désirée. Le répertoire courant est spécifié par le paramètre helpDirectory du fichier d'initialisation SQLfast.ini :
helpDirectory = SQLfastHelp_FR
1. What is SQLfast ? |
2. Installing SQLfast and Getting started |
3. SQLfast Documentation |
Comparing DB access code
SQLfast |
Java/JDBC |
openDB CLICOM.db; |
import java.net.URL; |
+------+-----------+ | NCLI | NOM | +------+-----------+ | B112 | HANSENNE | | C123 | MERCIER | | B332 | MONTI | | F010 | TOUSSAINT | | K111 | VANBIST | | S127 | VANDERKA | | B512 | GILLET | | B062 | GOFFIN | | C400 | FERARD | | C003 | AVRON | | K729 | NEUMAN | | F011 | PONCELET | | L422 | FRANCK | | S712 | GUILLAUME | | D063 | MERCIER | | F400 | JACOB | +------+-----------+ |
NCLI, NOM B112,MERCIER B332,MONTI F010,TOUSSAINT K111,VANBIST S127,VANDERKA B512,GILLET B062,GOFFIN C400,FERARD C003,AVRON K729,NEUMAN F011,PONCELET L422,FRANCK| S712,GUILLAUME D063,MERCIER F400,JACOB |
Comparing GUI code
SQLfast |
Python/Tkinter |
set oid = 30186; |
from Tkinter import * |
-->