Bonjour à tous,
Je développe depuis peu une appli "compagnon" sur Lazarus/FPC chargée d'alimenter une BDD SQLite3 pour une autre appli en C++. Je me heurte à un souci que je n'arrive pas à résoudre.
Le besoin fonctionnel : (n'hésitez pas à me dire si c'est pas clair )
J'ai deux recordsets Sqlite3 (TSqlite3DataSet) dans un DataModule, qui pointent sur deux BDD différentes :
- Un recordset qui pointe sur une table présente dans la BDD "principale", qui regroupe toutes les données de l'appli.
- L'autre recordset qui pointe sur une table "trad", présente dans une autre BDD (chaque langue étant stockée dans un fichier de BDD différente, l'idée étant qu'un autre de mes programmes, qui l'exploite, ne charge que la langue dont il a besoin). La table trad contient trois champs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 | ID | Autres | Champs |
- l'ID de l'élément à traduire (correspond à la clé primaire de mon premier recordset).
- Un énuméré (integer) qui me permet de faire le lien avec la table à traduire dans la première BDD et qui me sert à filtrer le recordset de trad quand je rentre dans l'écran approprié => toutes les trad sont dans la même table.
- La chaîne traduite du libellé.
J'aimerais afficher ce fameux champ libellé dans une colonne de TDBGrid et je ne vois pas comment m'y prendre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 | trad_id | trad_category | trad_label |
Ce que j'ai tenté.
J'ai testé plusieurs approches :
1. Ne pas paramétrer de fieldDefs sur le recordset principal (donc le laisser construire les champs à partir de la table) puis ajouter un champ calculé à la main.
Puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Recordset.Open; Recordset.FieldDefs.Update; // Pour le forcer à construire ses champs. Recordset.Close; theField := TStringField.Create(Recordset); theField.FieldKind:= fkCalculated; theField.Calculated:= true; theField.FieldName:= 'libelle'; theField.DataSet := RecordSet; Recordset.OnCalcFields:= @Self.ShowTranslation;
2. Le même principe mais en renseignant les FieldDefs à la main dans l'inspecteur d'objets plutôt qu'ouvrir une première fois le DataSet pour les remplir automatiquement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TAppModel.ShowTranslation(DataSet: TDataSet); begin str := TSqlite3Dataset(DataSet).PrimaryKey; theField := DataSet.FieldByName('libelle'); myID:= DataSet.FieldByName(str).AsInteger; // Plante en m'indiquant qu'il n'a pas trouvé le champ "id", qui est pourtant dans la table de base puisqu'il s'agit de la clé primaire. if RecordsetTrad.Locate('trad_id;trad_category', VarArrayOf([ myID, 12 ]), [ loCaseInsensitive ]) then begin str := RecordsetTrad.FieldByName('trad_label').AsString; theField.AsString:= str; end; end;
Là en revanche il parvient à trouver le champ "id", mais pas le champ "libelle"...
3. Skipper complètement l'aspect recordset et à tenter de paramétrer le champ via le TDBGrid en implémentant l'événement OnDrawCell pour afficher la valeur texte que je souhaite.
Là j'ai un autre souci : les cellules ne sont tout simplement pas dessinées.
J'ai clairement le sentiment d'aborder le problème du mauvais sens car ça me paraît "simple" (à priori). Les quelques sujets que j'ai lus sur les champs calculés n'ont fait que me confondre encore davantage.
Si quelqu'un peut me dépatouiller...
Merci d'avance !
Partager