Question

Utilisation TDataSet.FindKey vous pouvez localiser les enregistrements. Quand il en résulte vrai le curseur de jeux de données sera positionné sur l'enregistrement trouvé. Quand il en résulte False le curseur ne bouge pas. Il en résulte les données d'enregistrement avant FindKey émis en cours d'affichage dans les données des composants au courant.

Comment puis-je coder le résultat de FindKey pour retourner un dossier 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 n'a pas wan pour décourager d'autres commentaires.) Il y avait plusieurs suggestions sur la lutte contre cette situation bien que je crois la bonne réponse était de Marcelo en ce qu'il est impossible d'avoir un curseur pas sur un enregistrement. Plusieurs solutions de contournement ont été suggérées. J'ai choisi un de mes propres. 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 arrive vide alors la FindKey se positionner le curseur sur ce dossier vide. Cela fournira l'effet visuel que je recherchais.

Était-ce utile?

La solution

Ce n'est pas possible pour autant que je sache. Le curseur doit toujours être sur un dossier, à moins et Eof sont bof à la fois vrai (jeu de données vide).

Autres conseils

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

  1. Définir ensemble de données dans l'insert / append mode d'enregistrement. Ainsi, les commandes et le code verront enregistrement vide. Soyez prudent, car quelque chose peut d'ailleurs attribuer des données à un champ, puis le nouveau dossier peut être affiché à la DB.
  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érer et post nouvel enregistrement vide en jeu de données, et cochez toutes les modifications appliquées. Ensuite, attribuez un filtre, normalement rejeter ce dossier vide. Ensuite, dans votre code, vous devez passer le filtre sur, il rejettera tous les dossiers, sauf celui-ci vide.
  3. Envisagez de déconnecter le TDataSource de l'ensemble de données, puis connectez-le à nouveau.

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

Hallo,

utilisation SetRange au lieu de FindKey.

tblSomeTable.SetRange([SomeSearchData],[SomeSearchData]);
try
  while not tblSomeTable.Eof do begin
    <do something with the Record>
    tblSomeTable.Next;
  end;
finally
  tblSomeTable.CanelRange;
end;

lorsque des critères vous assure que le maximum d'enregistrements correspondant est celui que vous récupérez avec l'énoncé ci-dessus zéro ou un enregistrement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top