0

TDataSet.FindKeyを使用すると、レコードを見つけることができます。Trueの場合、データセットカーソルは見つかったレコードに配置されます。Falseになると、カーソルは移動しません。これにより、FindKeyが発行される前のレコードデータがデータ対応コンポーネントに表示されます。

FindKeyの結果をコーディングして、空のレコードを返すにはどうすればよいですか?

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

更新:(それは習慣であり、それ以上のフィードバックを思いとどまらせたくなかったので、正しい答えを選択する前に数日待っていました。)正しい答えはマルセロからのものであると私は信じていますが、この状況に取り組むためのいくつかの提案がありましたカーソルをレコード上に置かないようにすることはできません。いくつかの回避策が提案されました。私は自分のものを選びました。それは次のようになりました:

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

私が行ったことは、実際のデータにはなり得ないインデックスを使用して、ダミーの空白のレコードを作成することです。つまり、最初のインデックス値が-1になることはありません。最初の検索が空になると、FindKeyはこの空のレコードにカーソルを置きます。これは私が求めていた視覚効果を提供します。

4

3 に答える 3

1

TDataSet には「中立的な立場」がありません。ただし、いつものように、いくつかのオプションがあります。

  1. データセットを挿入/追加レコード モードに設定します。したがって、コントロールとコードには空のレコードが表示されます。偶発的にフィールドにデータが割り当てられ、新しいレコードが DB にポストされる可能性があるため、注意してください。
  2. 使用しているデータ アクセス コンポーネントに応じて、データセットをキャッシュ更新モードに設定し、新しい空のレコードをデータセットに挿入して投稿し、すべての変更を適用済みとしてマークすることができます。次にフィルタを割り当て、通常はこの空のレコードを拒否します。次に、コードでフィルターを切り替える必要があるため、この空のレコードを除くすべてのレコードが拒否されます。
  3. TDataSource をデータセットから切断し、後で再度接続することを検討してください。

確かに注意してください、しかしおそらくいくつかの他のアプローチが発明されているかもしれません:)

于 2010-03-28T08:06:20.737 に答える
1

ハロー、

FindKey の代わりに SetRange を使用します。

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

条件を指定すると、一致するレコードの最大数が、ゼロまたは 1 レコードより上のステートメントで取得したレコードになることが保証されます。

于 2010-03-28T09:36:01.000 に答える
0

私の知る限り、これは不可能です。Bof と Eof の両方が true (空のデータ セット) でない限り、カーソルは常にレコード上にある必要があります。

于 2010-03-28T07:59:11.993 に答える