2008-11-05 6 views
2

J'ai un ensemble de données en mémoire avec plusieurs champs, dont l'un est une clé primaire qu'un autre ensemble de données référence comme clé étrangère. La chose est, l'ensemble de données maître peut avoir plusieurs références à l'ensemble de données de détail. (Il s'agit de modéliser un objet qui contient un tableau dynamique d'autres objets.)Delphi: Affichage d'un sous-ensemble d'un ensemble de données dans les contrôles sensibles aux données

S'il n'y avait qu'un seul de chaque sous-objet, je pourrais faire la bonne association avec les propriétés KeyFields et LookupKeyFields du champ de référence dans le maître ensemble de données, mais cela est conçu uniquement pour renvoyer un résultat. Je veux charger tous les enregistrements les enregistrements dont la clé primaire correspond à la bonne clé ID et les afficher dans une liste.

Je pensais qu'un TDBListBox aiderait avec ceci, mais il s'avère que ce n'est pas ce qu'ils font. Alors, comment est-ce que je remplirais une liste de contrôle ou un contrôle similaire avec le jeu de résultats d'un contrôle de correspondance multiple comme ça pour une édition ultérieure? Je veux quelque chose de similaire au résultat d'une requête SQL comme ceci:

select field1, field2, field3 
from client_dataset 
where client_dataset.primary_key = master_dataset.id 

La seule chose est, cela se fait entièrement avec des ensembles de données en mémoire. Aucune base de données réelle n'est utilisée ici. Est-ce que quelqu'un sait comment cela peut être fait?

Répondre

3

L'ensemble de données a une propriété Filter qui peut être définie avec une condition. Vous devez également définir le drapeau filtré sur true. Et avec les contrôles de données, vous pouvez sélectionner les champs visibles.

Alors:

var 
    c : TColumn; 
begin 
    clientdataset.Filter := Format('primary_key = %d', [master_dataset.id]); 
    clientdataset.Filtered := True; 

    c := DBGrid1.Columns.Add; 
    c.FieldName := 'field1'; 
    c := DBGrid1.Columns.Add; 
    c.FieldName := 'field2'; 
    c := DBGrid1.Columns.Add; 
    c.FieldName := 'field3'; 
end; 

devrait faire l'affaire.

+0

Bonne réponse. L'ensemble de données que j'utilisais n'implémente pas actuellement la propriété Filter, ou je l'aurais probablement trouvé seul, mais maintenant que vous me dites que je me souviens avoir vu une discussion sur leur groupe de discussion au sujet d'un nouveau correctif qui le fait fonctionner. Je vais devoir vérifier. –

Questions connexes