bonjour à tous

mon problème est du à la gestion des RecordSet en ADO.
après avoir potassé l'excellent 'PROGRAMMER ADO EN DELPHI' de JM RABILLOUD, je suis tombé sur un cas assez particuliers :

j'ai deux TADOTable en relation maître-détails, appelons les M et D
D est en LockType := ltBatchOptimistic.
sur la table D, il y a une PK (clé primaire) sur 2 champs dont 1 possède un FK (clé étrangère) qui sert à la liaison au M
sur mon interface, mes deux grilles affichent correctement les données voulues, et l'utilisateur peux ajouter, modifier et supprimer des lignes détails en fonction du maître sélectionné.
une violation de PK est levée lorsque l'utilisateur veut insérer une ligne déjà présente (doublon), ce qui est normal ! je la 'catch' dans mon try..except
ce qui l'est moins, c'est qu'il est impossible d'utiliser correctement cette exception selon la méthode de filtrage sur les les enregistrements en conflit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
FilterGroup := fgConflictingRecords
Filtered := True;
la lecture des enregistrements en conflit se passe correctement, mais le fait de repasser en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
FilterGroup := fgUnassigned
Filtered := False;
à la fin (pour faire réapparaitre toutes les lignes de D y compris celle que l'utilisateur veut ajouter) cela faire apparaitre TOUTES les lignes de la table D en cassant le lien maître-détails.

en debuggant, c'est Filtered := False; qui me casse le lien, et les autres valeurs de FilterGroup n'y font rien.

ça, c'est la méthode expliquée dans le document de M. RABILLOUD. alors j'ai essayé en clonant mon DataSet pour y travailler tranquillement, car c'est écrit :
Clone (Int)
Duplique le jeu d'enregistrement. Le jeu ainsi obtenu est rigoureusement identique à l'original. Il est possible de forcer le clone à être en lecture seule quel que soit le verrouillage de l'original. Une modification apportée à l'original est répercutée sur tous les clones sauf si on a exécuté la méthode Requery sur l'original.
hors c'est faux !
le DataSet dupliqué n'a pas l'état du lot traité, dont pas les lignes en conflit, c'est à dire que FilterGroup := fgConflictingRecords ne retourne aucune ligne.

voilà où j'en suis et j'avoue que je galère un peu