Не возвращать записей, если FIndKey дает значение False?

StackOverflow https://stackoverflow.com/questions/2532244

  •  22-09-2019
  •  | 
  •  

Вопрос

Используя 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 поместит курсор на эту пустую запись.Это обеспечит тот визуальный эффект, которого я добивался.

Это было полезно?

Решение

Насколько я знаю, это невозможно.Курсор всегда должен находиться на записи, если только Bof и Eof не являются истинными (пустой набор данных).

Другие советы

TDataSet не имеет «нейтральной позиции».Но как всегда у вас есть несколько вариантов:

  1. Установите набор данных в режим вставки/добавления записи.Таким образом, элементы управления и код увидят пустую запись.Будьте осторожны, так как что-то может случайно назначить данные полю, а затем новая запись может быть отправлена ​​в БД.
  2. В зависимости от используемых вами компонентов доступа к данным вы можете перевести набор данных в режим кэшированных обновлений, вставить и опубликовать новую пустую запись в набор данных и пометить все изменения как примененные.Затем назначьте фильтр, обычно отклоняющий эту пустую запись.Затем в вашем коде вам нужно переключить фильтр, чтобы он отклонял все записи, кроме этой пустой.
  3. Рассмотрите возможность отключения TDataSource от набора данных, а затем подключите его снова.

Обратите внимание, конечно, но, возможно, могут быть изобретены и другие подходы :)

Привет,

используйте SetRange вместо FindKey.

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

когда ваш критерий гарантирует, что максимум совпадающих записей — это тот, который вы получаете с помощью оператора выше нуля или одной записи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top