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

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

3 ответа

Решение

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

Алло,

используйте 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;

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

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

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

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

Другие вопросы по тегам