Accès à une base SQLITE3 - Ajout des enregistrements
Bonjour à tous,
Je suis désolé de revenir sur un problème déjà ressassé mais dont je n'arrive pas à trouver la solution bien que j'aie déjà fait ce genre de choses. Je cherche à entrer des données dans une base SQLITE3 (Lazarus version 1.6.4.- Windows10 -Zeos 1.7.4 Stable paquets mis à jour par GVasseur).
Je veux accéder à une base SQLITE3 pour y ajouter des enregistrements. La base a été créée auparavant par code sans problème. Pour cela je dispose de 3 composants :
un Composant TZConnection (ZC_InfoPromo), un composant TZ_QUERY (ZQ_InfoPromo) et un DataSource (DataSEcoPromo). Devant renseigner 3 tables de la base, j'ai construit, en faisant appel à un "RadioGroup" le code suivant :
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
|
procedure TF_InfoPromo.Bt_OKEcolPromoClick(Sender: TObject);
Var MessOuv : String ;
Var TablTravail : String ;
Var ChoixTablactiv : String ;
Var FlagOuvTbl : String ;
begin
BaseActive := F_GestBase.Ed_BaseActive.Text ;
Ed_FlagMsg.Text := 'Coucou !' ;
FlagOuvTbl := 'OuvrNon' ;
Try ;
Case (RG_ChoixTbl1.ItemIndex) of
0: Begin ; // Instructions pour la table Ecole
ChoixTablactiv := 'Select * From Ecole' ;
TablTravail := 'Ecole' ;
FlagOuvTbl := 'OuvrOui' ;
End;
1: Begin ; // Instructions pour la table InfoPromo
ChoixTablactiv := 'Select * From InfoPromo' ;
TablTravail := 'Promo' ;
FlagOuvTbl := 'OuvrOui' ;
End;
2: Begin ; // Instructions pour la table Sections
ChoixTablactiv := 'Select * From section' ;
TablTravail := 'Sections' ;
FlagOuvTbl := 'OuvrOui' ;
End;
End ;
// *** Instructions d'accès à la Base à traiter
if(FlagOuvTbl = 'OuvrOui') Then
Begin
// base à traiter
ZC_EcoPromo.Connected:= False ;
ZC_EcoPromo.Database:= BaseActive ;
ZC_EcoPromo.Connected:= True ;
Ed_FlagMsg.Text := TablTravail;
// **** Accès aux tables
ZQ_EcoPromo.Active := False ;
ZQ_EcoPromo.Connection := ZC_EcoPromo;
ZQ_EcoPromo.DataSource := DataSEcoPromo;
ZQ_EcoPromo.Active := False ;
ZQ_EcoPromo.SQL.Clear ;
ZQ_EcoPromo.SQL.Text := ChoixTablActiv ;
ZQ_EcoPromo.ExecSQL ;
Ed_FlagMsg.Text := TablTravail ;
F_GestBase.visible := False ;
end;
Except
MessOuv := 'Problème d''accès à la table ' + TablTravail + ' de la base' + #13 + BaseActive ;
ShowMessage (MessOuv) ;
End;
End; |
Sachant que le DataSource correspondant à valeur Dataset à ZQ_EcoPromo
A l’exécution de ce code, J'accède bien aux contrôles à renseigner mais aucune lise à jour des enregistrements n'est effectuée. Les datasets sont inactifs. SI au lieu d'utiliser
Code:
ZQ_EcoPromo.ExecSQL;
j'utilise
j'ai une erreur SIGSEGV qui s'affiche.
Je dois donc avoir omis de déclarer comme active la table à renseigner mais comment faire ?
Merci de vos réponses.
R.O.
Ajout d'enregistrements à une table - Suite
Bonjour et merci à Tintinux pour avoir répondu,
Mon interrogation manque certainement de clarté, aussi je vais tenter de préciser. En fait, je reprends, pour tenter de l'améliorer un programme que j'ai fait il y a 3 ou 4 ans. Ce programme est basé sur 3 formulaires permettant de gérer une base de données comportant 4 tables.
Le premier formulaire me sert à identifier ou à créer la base sur laquelle on va travailler et à créer par code chacune des tables Cela fonctionne bien (composants Zeos , Table Sqlite3). Une fois la table créée, une option permet de l'ouvrir et en même temps, le formulaire 1 est masqué et le formulaire 2 devient visible. Le nom complet (chemin+ Nom + extension .db3) est mémorisé dans une variable globale du second formulaire.
J'ai déposé sur ce second formulaire des TDBEdit pour entrer les données à sauvegarder pour les tables Ecole, InfoPromo et Section. La quatrième table qui s’appelle Eleve devant être gérée par troisième formulaire. En principe le nombre d'enregistrements de la table Ecole est en général unique, celui des tables InfoPromo et section est assez faible.
Pour gérer l'accès successif aux diverses tables j'ai donc déposé sur le second formulaire qui ferme après avoir géré les options de mise à jour des tables par l'utilisation d'un un composant RadioGroup dont les les 3 premières options permettent d'accéder aux 3 tables déjà nommées, la quatrième option permettant d'accéder au formulaire 3 tout en masquant le formulaire 2 et en sauvegardant pour les utiliser dans le formulaire 3 certaines valeurs du formulaire 2 .
En voulant écrire le code le plus concis possible, je n'ai déposé sur le formulaire 2 qu'un seul TZConnection, un TZQUERY et un DataSource e, me disant qu'il serait possible, par code et en modifiant les références du DataSource (propriété Dataset) et au SQL du TZQUERY d'accéder aux diverses tables pour y stocker des données. La navigation entre les données et les fonctions d'ajout, modification, suppression étant assurées par un TDBNavigator. .
Depuis,j'ai réalisé que je faisais une erreur et je suis donc revenu à une conception plus classique avec un TZConnection (référence à une base) et un TZQUery et un TadataSouce par table. Ce qui donne le code suivant pour la table Ecole, un code similaire devant être construit pour chacune des deux autres tables.
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
| procedure TF_InfoPromo.Bt_OKEcolPromoClick(Sender: TObject);
Var MessOuv : String ;
Var TablTravail : String ;
Var ChoixTablactiv : String ;
Var FlagOuvTbl : String ;
begin
Ed_FlagMsg.Text := 'Coucou !' ;
FlagOuvTbl := 'OuvrNon' ;
Try ;
Case (RG_ChoixTbl1.ItemIndex) of
0: Begin ; // Instructions pour la table Ecole
BaseActive := F_GestBase.Ed_BaseActive.Text ;
// base à traiter
ZC_EcoPromo.Connected:= False ;
ZC_EcoPromo.Database:= BaseActive ;
ZC_EcoPromo.Connected:= True ;
// **** Accès aux tables
ED_FlagMsg.Text := 'Ecole' ;
FlagOuvTbl := 'OuvrOui' ;
DBNavPromo.DataSource := DataSEcole ;
ZQ_TblEcole. Active := False ;
// ZQ_TblEcole.Sql.Text := 'INSERT INTO "Ecole" (*) Values (*)' ; // Code en construction C'est là que se situe le prbl.
ZQ_TblEcole. Open ;
DBNavPromo.DataSource := DataSEcole ;
End;
1: Begin ; // Instructions pour la table InfoPromo
// La suite du code..... |
Dans le passé j'ai déjà utilisé la ligne de code
Code:
ZQ_TblEcole.Sql.Text := 'Select * From Ecole' ;
à ce niveau et cela fonctionnait correctement.
Il y a peut-être quelque chose de changé dans la version actuelle de Lazarus ou dans la façon de gérer SQLite ?
En attendant je vais tente d'avancer avec la suggestion vos Suggestions (Tintinus et SergioMaster)
Merci
R.O.
Accès à une table Sqlite-3
Bonjour à tous et merci pour les réponses qui m'ont été apportées.
En définitive, et après être revenu à une conception de base du renseignement de la base de données soit : Une table est renseignée par un formulaire contenant des TDBEDIT ou des composants similaires ; A chaque table est associé un TZConnection, un TZQuery et un Tdatasource et un TDBNavigator la séquence donnée en exemple ci après fonctionne bien à la condition expresse que les Propriétés et Evènements associés à ces divers contrôles soient correctement renseignés .
Exemple de Code :
Code:
1 2 3 4 5
| //************** Connection à la base de Données
BaseActive2 := F_GestBase.Ed_BaseActive.Text ;
ZC_Promocree.Connected:= False ;
ZC_Promocree.Database:= BaseActive2 ;
ZC_Promocree.Connected:= True ; |
Puis, plus loin dans le code et avant de renseigner les TDBEdit :
Code:
1 2 3 4 5
| // **** Accès à la table Promo : Paramétrage ZQuery
ZQ_Promocree.Active := False ;
ZQ_Promocree.SQL.Clear ;
ZQ_Promocree.SQL.Text := 'Select * From InfoPromo' ;
ZQ_Promocree.Open ; |
Les propriétés des divers contrôles étant fixées à :
Pour le TZConnection
Database : laissé vierge (il est renseogné par code)
Connected à true
Protocol à sqlite-3
Aucun évènement validé
Pour le TZQuery :
Evènements : Connection Le TZConnection
Propriétés : Connection Le TZConnection
Pour le TDataSource
Propriétés : Le Dataset à TZQuery
Évènements : idem
Pour le TDBEdit :
Propriétés :
le Datasource au Datasource de la feuille
Le DataField : renseigné manuellement au nom du champ de la table concernée.
Evènements Le Datasource de la feuille
AutoEdit et Enabled à True.
Cordialement
R.O.