[SQLite] Construction par code
Bonjour,
Reprenant mon initiation à l'environnement Lazarus, et tout particulièrement à la gestion des bases de données, je me heurte à quelques difficultés.
Mon objectif est de créer, renseigner, modifier et extraire dans un environnement monoposte une base de données. J'utilise pour cela une base de type SQLITE3 et la palette de composants Zeos.
J'ai réussi (non sans mal, mais rien d'étonnant à cela ) à*:
- Construire un formulaire qui permet d'accéder à la création/ouverture d'une base de données puis à ouvrir (au choix) l'une des deux tables de cette base (form1). Ce formulaire contient donc les divers contrôle Zeos*: Zlit_Stock (TZ connection), ZquerStocks (TZQuery), Ztb_Stock et Tdatasource*: Donnees.
L'ouverture de la table étant acquise, ce formulaire est masqué pour laisser la place à un autre formulaire (form_remplir) qui sera destiné à gérer la base de données. Il contient des contrôles «*Tedit*» destinés à recevoir les informations qui viendront renseigner les divers champs de la table concernée. Il continent aussi des contrôles boutons ( contrôles TBItBtbn) destinés à créer un enregistrement vide ( Bt_Nouveau), valider la création de l'enregistrement après avoir renseigné les champs correspondants, sélectionner un enregistrement pour le modifier, sélectionner un enregistrement pour le supprimer.
La communication entre les divers formulaires est convenablement assurée (d'après mes tests) par les déclarations d'unités.
La compilation se déroule sans problème, ainsi que la création de la base et des tables. Par contre, lorsque je tente d'ajouter un enregistrement (Click sur Nouveau – form_remplir) j'ai un message d'erreur*: SQL error*: SQL logic error or missing Database .
J'ai donc certainement oublié de renseigner quelque chose dans les contrôles de la form1 ou des instructions manquent pour que la table soit accessible mais Quoi*?
Mon code pour les deux feuilles concernées suit*:
FORM1 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
procedure TForm1.Bt_creatClick(Sender: TObject);
Var NomRepBase : String ;
Var Dnombase :string ;
Var NomBase0 : String ;
Var Cree_tableSQL : string ;
Var Cree_table2SQL : string ;
var Toto : string ;
begin
NomRepBase := Dir_RepBase.Text ;
NomBase0 := File_NomBase.text ;
DNombase := NomRepBase + '\' + NomBase0 + '.sqlite' ;
if BR_Cree.checked = True Then
if fileexists(DNomBase) then // recherche si la base à déjà été créée dans le chemin complet indiqué par Dnombase
Begin
Showmessage ('ATTENTION - La base ' + Nombase0 + ' existe ' + #13 +' Changer de Nom !! ') ;
File_NomBase.Setfocus ;
end
Else
Begin
Zlit_Stock.Database := Dnombase ;
Zlit_Stock.Connected := True ;
// Définition de la table Stock_A associée à la base SQLITE qui vient d'être Créée
Cree_tableSQL :='CREATE TABLE Stock_A ("IDProduit" INTEGER PRIMARY KEY AUTOINCREMENT, "Produits" VARCHAR(15), "Designation" VARCHAR(40),' ; // ici la syntaxe est conforme
Cree_tableSQL := Cree_tableSQL + '"Categorie" VARCHAR(2),"Prix" Numeric(6,2),"Quantite" Integer )'; // au langage SQL
// Fin de la construction de la chaine de caractères définissant la structure de la table à créer
Cree_table2SQL :='CREATE TABLE Clients ("NOM" VARCHAR(60), "Prenom" VARCHAR(120),' ;
Cree_table2SQL := Cree_table2SQL + '"Ville" VARCHAR(40), "Code" VARCCHAR(5) )';
// Définition de la seconde table
// Création des tables
ZQuerStocks.SQL.Clear ; // vide la chaine SQL existante par instruction SQL du contrôle ZQuerStocks
ZQuerStocks.SQL.Text := Cree_tableSQL ; // chargement de la commande SQL à Exécuter
ZQuerStocks.execSql ; //Exécution de la commande SQL
ZQuerStocks.SQL.Clear ; // vide la chaine SQL existante par instruction SQL du contrôle ZQuerStocks
ZQuerStocks.SQL.Text := Cree_table2SQL ; // chargement de la commande SQL à Exécuter
ZQuerStocks.execSql ; //Exécution de la commande SQL
// ZQuerStocks.active := True ;
// ZTB_Stock.open ; // La table est céée on peut l'ouvrir
// Message de succès de création de la base
Showmessage ('Base ' + Dnombase + ' + table Créées !') ;
edit2.caption := Dnombase ;
end ;
Toto := 'Coucou' ;
edit1.caption := Toto ;
Zlit_Stock.Connected:=True ;
// ouverture de la table et de la feuille correspondante selon choix du bouton 'Choix de table'
// ouverture de la base SQLITE désignée par RepBase et NomBase (valeur du bouton radio)
// accéder à la table Stock_A ou Clients
if BR_Produits.Checked = True then
Begin
ZTb_Stock.tablename := 'Stock_A' ;
Form_remplir.show ;
End
Else
Begin
// If BR_Clients.checked := True then
ZTb_Stock.tablename := 'Clients' ;
FormClient.show ;
end ;
End;
end. |
Form_remplir:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| var
Form_remplir: TForm_remplir;
implementation
Uses
unitstocks; //permet l'accès à Form1 depuis le formulaire de remplissage
{$R *.lfm}
{ TForm_remplir }
procedure TForm_remplir.Bt_NouveauClick(Sender: TObject);
var Nombase2 : string ;
begin
Nombase2 := Form1.Edit2.Text;
Form1.Zlit_Stock.Database := nombase2 ;
Form1.Zlit_Stock.Connected := True ;
Form1.hide ; //masquer le formulaire d'entrée
ED_Produit.text := '' ; // vider les diverses boites d'entrée des variables
Ed_Designation.text := '' ;
Ed_Prix.text := '00.00' ;
Ed_Quantite.Text := '0';
Form1.ZTb_Stock.tableName := 'Stock_A' ;
Form1.ZTb_Stock.active := True;
Form1.ZTb_Stock.append; // ajoute un enregistrement vierge à la table Stock_A
Form1.ZTb_Stock.Fieldbyname('Produits').asstring := Ed_Produit.text;
Form1.ZTb_Stock.Fieldbyname('Designation').asstring := Ed_Designation.text;
Form1.ZTb_Stock.Fieldbyname('Categorie').asstring := CB_Categorie.text;
Form1.ZTb_Stock.Fieldbyname('Prix').asFloat := Strtofloat(Ed_Prix.text) ;
Form1.ZTb_Stock.Fieldbyname('Quantite').asinteger := Strtoint(Ed_Quantite.text);
end;
procedure TForm_remplir.Bt_ValideClick(Sender: TObject);
begin
Form1.ZTb_Stock.post;
end;
end. |
Je précise que la Form1 contient un DBGRID dont je ne me suis pas servi pour l'instant. Certaines lignes sont inutiles ou laissées en remarque ce sont des résidus de mes tests.
Question subsidiaire :
J'ai tenté de modifier la couleur du texte de certains boutons pour agrémenter l'interface (par exemple Supprimer en rouge) mais malgré la modification faite dans la "Font" du bouton rien ne se passe (Bug ?)
Suite à la suggestion de Michel VBG
Bonjour,
Merci pour votre suggestion mais cela ne marche pas : Réponse : "operation cannot be performed on an inactive dataset".
R.O.