Не возвращать записей, если 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 поместит курсор на эту пустую запись.Это обеспечит тот визуальный эффект, которого я добивался.
Решение
Насколько я знаю, это невозможно.Курсор всегда должен находиться на записи, если только Bof и Eof не являются истинными (пустой набор данных).
Другие советы
TDataSet не имеет «нейтральной позиции».Но как всегда у вас есть несколько вариантов:
- Установите набор данных в режим вставки/добавления записи.Таким образом, элементы управления и код увидят пустую запись.Будьте осторожны, так как что-то может случайно назначить данные полю, а затем новая запись может быть отправлена в БД.
- В зависимости от используемых вами компонентов доступа к данным вы можете перевести набор данных в режим кэшированных обновлений, вставить и опубликовать новую пустую запись в набор данных и пометить все изменения как примененные.Затем назначьте фильтр, обычно отклоняющий эту пустую запись.Затем в вашем коде вам нужно переключить фильтр, чтобы он отклонял все записи, кроме этой пустой.
- Рассмотрите возможность отключения 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;
когда ваш критерий гарантирует, что максимум совпадающих записей — это тот, который вы получаете с помощью оператора выше нуля или одной записи.