SQLite avec Panoramic

Pour ceux qui veulent utiliser la puissance de SQL pour faire leur propre base de données, il existe SQLite. Pour montrer un exemple d'utilisation de SQLite, nous allons réaliser un programme de carnet d'adresse.

Notre base de données contiendra les champs suivant:

champ description Type de donnée SQL
nom chaîne de caractères
prenom chaîne de caractères
adresse chaîne de caractères
tel

Cet exemple a été écrit en langage basic Panoramic. Il génère une petite base de données et insère des éléments dans une table via des commandes SQL standards.

DIM DB_NAME$:DB_NAME$="contact.db"
DIM DB_OUTPUT:DB_OUTPUT=200
DIM DB_NB_ENREGISTREMENT
DIM ExecSQL$:ExecSQL$="sqlite3.exe "+DB_NAME$+" "
DLL_ON "Utils.dll"
DLIST DB_OUTPUT: ' sortie de SQLite
LIST 1:FONT_NAME 1,"Courier new"
WIDTH 1,200:LEFT 1,100:HEIGHT 1,HEIGHT(0)-80

CreateDB(DB_NAME$)
SQL("SELECT COUNT(*) FROM Personne")
DB_NB_ENREGISTREMENT=VAL(ITEM_READ$(DB_OUTPUT,1))
IF DB_NB_ENREGISTREMENT=0
  InsertPersonne("Alain","PROVIST","84 Chemin de la foret","06032")
  InsertPersonne("Eleanor","MALLE","84 Chemin de la foret","06032")
  InsertPersonne("Sarah","FRECHY","84 Chemin de la foret","06032")
  InsertPersonne("Agathe","ZEUBLOUZE","84 Chemin de la foret","06032")
  InsertPersonne("Anne","ONIME","84 Chemin de la foret","06032")
  InsertPersonne("Delphine","TALARON","84 Chemin de la foret","06032")
END_IF
SQL("SELECT COUNT(*) FROM Personne")
DB_NB_ENREGISTREMENT=VAL(ITEM_READ$(DB_OUTPUT,1))
CAPTION 0,"Nb enregistrement:"+ITEM_READ$(DB_OUTPUT,1)
AfficheListeNom()
DLL_OFF
END


SUB AfficheListeNom()
  SQL("SELECT nom,prenom FROM Personne ORDER BY nom ASC")
  IF COUNT(DB_OUTPUT)<>0
     ListCopy(DB_OUTPUT,1)
  END_IF
END_SUB

SUB InsertPersonne(Prenom$,Nom$,Adresse$,tel$)
  DIM_LOCAL value$
  Nom$=TRIM$(UPPER$(Nom$)) : Prenom$=TRIM$(LOWER$(Prenom$)) : Prenom$=UPPER$(LEFT$(Prenom$,1))+RIGHT$(Prenom$,LEN(Prenom$)-1)
  value$="SELECT nom,prenom FROM Personne WHERE nom='"+Nom$+"' AND prenom='"+Prenom$+"'"
  SQL(value$)
  IF COUNT(DB_OUTPUT)>0
    MESSAGE "Désolé mais "+Nom$+" "+Prenom$+" est déjà présent dans la base."
  ELSE
    value$="NULL,'"+Nom$+"','"+Prenom$+"','"+Adresse$+"','"+tel$+"'"
    SQL("INSERT INTO Personne(rowid,nom,prenom,adresse,tel) VALUES("+value$+")")
  END_IF
END_SUB

SUB SQL(cmd$)
  DIM_LOCAL Dll_return,batch$
  FILE_OPEN_WRITE 1,"tmp.sql"
    FILE_WRITELN 1,".output out.txt" : ' le résultat sera stocké dans le fichier out.txt
    ' FILE_WRITELN 1,".separator '#'"
    FILE_WRITELN 1,".mode column"    : ' option non obligatoire (cf. doc sqlite)
    FILE_WRITELN 1,".width 10"       : ' option non obligatoire (cf. doc sqlite)
    FILE_WRITELN 1,cmd$+";"
  FILE_CLOSE 1
  batch$=ExecSQL$+chr$(34)+".read tmp.sql"+chr$(34)
  Dll_return = DLL_CALL1("ExecuteAndWait",ADR(batch$))
  FILE_DELETE "tmp.sql"
  CLEAR DB_OUTPUT
  IF FILE_EXISTS("out.txt")=1
    FILE_LOAD DB_OUTPUT,"out.txt":FILE_DELETE "out.txt"
  END_IF
END_SUB


' Création de la table 'Personne' contenant les champs:
' nom, prenom, adresse et tel
SUB CreateDB(name$)
  DIM_LOCAL Dll_return,batch$
  FILE_OPEN_WRITE 1,"tmp.sql"
  FILE_WRITELN 1,"CREATE TABLE IF NOT EXISTS Personne("
  FILE_WRITELN 1,"id INTEGER PRIMARY KEY AUTOINCREMENT,"
  FILE_WRITELN 1,"nom VARCHAR(15),"
  FILE_WRITELN 1,"prenom VARCHAR(15),"
  FILE_WRITELN 1,"adresse VARCHAR(15),"
  FILE_WRITELN 1,"tel VARCHAR(15));"
  FILE_CLOSE 1
  batch$ = ExecSQL$+chr$(34)+".read tmp.sql"+chr$(34)
  Dll_return = DLL_CALL1("ExecuteAndWait",ADR(batch$))
  FILE_DELETE "tmp.sql"
END_SUB

' Copie une liste dans une autre
SUB ListCopy(a%,b%)
 DIM_LOCAL i% : i%=1
 CLEAR b%
 WHILE (COUNT(a%)<>0)
   ITEM_ADD b%,ITEM_READ$(a%,i%)
   ITEM_DELETE a%,1
 END_WHILE
END_SUB

L'exécutable en ligne de commande SQlite3.exe se trouve ici :http://www.sqlite.org/download.html

La DLL qui contient la fonction ExecuteAndWait(). Cette fonction permet de lancer un batch de manière silencieuse (sans apparition de la fenêtre DOS) : Utils.zip

Klaus a fait également un travail remarquable avec son système de gestion de base de données. Son approche est différente par rapport à une base de données "classique" et mérite d'y jeter un coup d'oeil (voir ici).