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 :
Form_remplir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
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 ?)
Partager