2010-03-28 5 views
0

En utilisant TDataSet.FindKey vous pouvez localiser des enregistrements. Lorsque le résultat est True, le curseur de jeux de données sera positionné sur l'enregistrement trouvé. Quand il en résulte faux, le curseur n'est pas déplacé. Cela entraîne l'affichage des données d'enregistrement avant l'affichage de FindKey dans les composants sensibles aux données.Retourne aucun enregistrement si FIndKey donne False?

Comment puis-je coder le résultat de FindKey pour retourner un enregistrement vide?

if Not tblSomeTable.FindKey([SomeSearchData]) then 
    begin 
     < code to return empty or move data cursor to neutral position > 
    end; 

Mise à jour: (attendis quelques jours avant de choisir bonne réponse car je crois que la coutume est et ne pas blême pour décourager d'autres commentaires.) Il y avait plusieurs suggestions sur la lutte contre cette situation même si je crois que le La bonne réponse venait de Marcelo en ce sens qu'il n'est pas possible d'avoir un curseur sur un disque. Plusieurs solutions de contournement ont été suggérées. J'ai choisi l'un des miens. Il a quelque chose comme:

If Not tblSomeTable.FindKey([SomeSearchData]) then 
    begin 
     tblSomeTable.FindKey([-1,2010]); 
    end 

Ce que je l'ai fait est de créer un mannequin, enregistrement vide avec un indice que les données réelles ne peuvent jamais être, à savoir: La première valeur d'index ne sera jamais -1. Si la recherche initiale apparaît vide, FindKey positionnera le curseur sur cet enregistrement vide. Cela fournira l'effet visuel que je recherchais.

+0

Pourquoi voulez-vous faire? Cela pourrait aider à répondre à la question. Comme je l'ai –

+0

sélectionner des éléments dans une liste sur les données correspondantes gauche apparaît à droite. Lorsque FindKey échoue, les données à partir d'un enregistrement incorrect apparaît. – jwilfong

Répondre

0

Ce n'est pas possible pour autant que je sache. Le curseur doit toujours figurer sur un enregistrement sauf si Bof et Eof sont tous les deux vrais (ensemble de données vide).

1

TDataSet n'a pas de "position neutre". Mais comme toujours vous avez peu d'options:

  1. Réglez l'ensemble de données en mode d'insertion/ajout d'enregistrement. Ainsi, les contrôles et le code verront un enregistrement vide. Soyez prudent, car quelque chose peut accidentellement affecter des données à un champ, puis le nouvel enregistrement peut être publié dans la base de données.
  2. En fonction des composants d'accès aux données, vous utilisez, vous pouvez définir ensemble de données mises à jour en mode cache, insérez et post nouvel enregistrement vide en jeu de données, et cochez toutes les modifications appliquées. Puis affectez un filtre, en rejetant normalement cet enregistrement vide. Ensuite, dans votre code, vous devez basculer le filtre, donc il rejettera tous les enregistrements, à l'exclusion de celui qui est vide. Envisagez de déconnecter le TDataSource de l'ensemble de données et de le connecter à nouveau ultérieurement.

Notez que, mais sans doute il peut inventer d'autres approches :)

1

Hallo,

utilisation SetRange au lieu de FindKey. Lorsque vos critères garantissent que le maximum d'enregistrements correspondants est celui que vous récupérez avec l'instruction au-dessus de zéro ou un enregistrement.