Bonjour à tous.
Je débute en programmation de base de données et avant de me lancer dans le grand bain pour mon application j’ai voulu faire mes armes sur un projet simple. En l’occurrence une base de données pour livres. Malgré la simplicité de ma base je bute sur un point. Après des jours de recherche et de test infructueux je me permets de vous sollicité.
Contexte de développement :
Delphi 12 community edition
Sqlite
La structure de ma base de données est la suivante
Code sql : 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 CREATE TABLE tableEditeurs( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, editeur VARCHAR(50) NOT NULL, collection VARCHAR(50) ); CREATE TABLE tableAuteurs( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nom VARCHAR(50) NOT NULL, prenom VARCHAR(50) ); CREATE TABLE tableSeries( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, serie VARCHAR(150) NOT NULL UNIQUE ); CREATE TABLE tableLivres( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, numero INTEGER NOT NULL, titre VARCHAR(150) NOT NULL, lu BOLEEN NOT NULL, acquit BOLEEN NOT NULL, autreNumero INTEGER, auteurs_id INTEGER NOT NULL, serie_id INTEGER NOT NULL, Editeur_id INTEGER NOT NULL, FOREIGN KEY(serie_id) REFERENCES tableSerie(id) ); CREATE TABLE tableLivres_tableAuteurs( livre_id INTEGER NOT NULL, auteurs_id INTEGER NOT NULL, FOREIGN KEY(livre_id) REFERENCES tableLivres(id), FOREIGN KEY(auteurs_id) REFERENCES tableAuteurs(id), PRIMARY KEY(livre_id, auteurs_id) UNIQUE ); CREATE TABLE tableLivres_tableEditeurs( livre_id INTEGER NOT NULL, editeurs_id INTEGER NOT NULL, FOREIGN KEY(livre_id) REFERENCES tableLivres(id), FOREIGN KEY(editeurs_id) REFERENCES tableEditeurs(id), PRIMARY KEY(livre_id, editeurs_id) UNIQUE );
Pour les trois tables ‘tableserie’, ‘tableediteurs’ et ‘tableauteurs’ je n’ai aucun problème de gestion ni de maintenance.
Pour la table livre j’ai voulu utiliser des DBLookupCombobox pour la gestion et c’est la que je rencontre un problème. Mes données sont affichées dans un DBGrid avec la requête suivante.
Les paramètres du DBLookupCombobox sont :
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 GrilleQuery.sql.Clear; GrilleQuery.sql.Add('SELECT'); // Champs affichés GrilleQuery.sql.Add ('tablelivres.numero AS N°, tablelivres.present AS Acquis, tablelivres.titre AS Titre,'); GrilleQuery.sql.Add ('tableediteurs.editeur AS Editeur, tableediteurs.collection AS Collection, tableSeries.serie AS Série,'); GrilleQuery.sql.Add (' tableAuteurs.nom AS Nom, tableAuteurs.prenom AS Prénom, tablelivres.lu AS Lu'); // Depuis la table GrilleQuery.sql.Add('FROM tableLivres'); // Récupère la série liée au titre GrilleQuery.sql.Add ('LEFT JOIN tableSeries on tablelivres.serie_id = tableSeries.id'); // Récupère le ou les auteurs liés au titre GrilleQuery.sql.Add ('JOIN tableLivres_tableAuteurs ON tableLivres_tableAuteurs.livre_id = tablelivres.id'); GrilleQuery.sql.Add ('JOIN tableAuteurs ON tableLivres_tableAuteurs.auteurs_id = tableAuteurs.id'); // Récupère le ou les éditeurs liés au titre GrilleQuery.sql.Add ('JOIN tableLivres_tableediteurs ON tableLivres_tableediteurs.livre_id = tablelivres.editeur_id'); GrilleQuery.sql.Add ('JOIN tableediteurs ON tableLivres_tableediteurs.editeurs_id = tableediteurs.id'); GrilleQuery.sql.Add('ORDER BY numero ASC'); GrilleQuery.Open;
La liste déroulante du DBLookupCombobox est bien mise à jour avec les bonnes valeurs.
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 // ==== test N° ============================================================ AuteurNomQuery := TFDQuery.Create(self); AuteurNomQuery.Connection := U_Data.Data.FDConnection1; AuteurNomQuery.sql.Clear; AuteurNomQuery.Open('SELECT nom FROM tableauteurs ORDER BY nom ASC'); AuteurNomDataSource := TDataSource.Create(self); AuteurNomDataSource.DataSet := AuteurNomQuery; EdAuteurNom.ListSource := AuteurNomDataSource; // EdAuteurNom.ListField := 'nom'; EdAuteurNom.KeyField := 'nom'; EdAuteurNom.DataSource := GrilleSource; EdAuteurNom.DataField := 'nom'; EdAuteurNom.DropDownWidth := 150; // ===========================================================================
La sélection d’un champ dans le DBGrid met bien à jour le champ de saisie du DBLookupCombobox.
Par contre il met impossible de sélectionner une valeur dans la liste déroulante et de mettre à jour le champ correspondant du DBGrid.
Pouvez me renseigner sur mon erreur et si j’utilise la bonne méthode pour la gestion de ma base. D’avance merci.
PS : Pas trop de termes trop techniques sur les bases de données je débute et ce n’est que ma première base de données.
Partager