Не возвращать записей, если 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 не имеет "нейтральной позиции". Но, как всегда, у вас есть несколько вариантов:
- Установите набор данных в режим вставки / добавления записи. Итак, элементы управления и код увидят пустую запись. Будьте осторожны, так как что-то может случайно назначить данные полю, а затем новая запись может быть опубликована в БД.
- В зависимости от используемых компонентов доступа к данным вы можете установить набор данных в режим кэшированных обновлений, вставить и опубликовать новую пустую запись в набор данных и пометить все изменения как примененные. Затем назначьте фильтр, обычно отклоняя эту пустую запись. Затем в вашем коде вы должны переключить фильтр, чтобы он отклонял все записи, кроме этой пустой.
- Попробуйте отключить TDataSource от набора данных, а затем снова подключить его.
Обратите внимание, конечно, но, вероятно, могут быть изобретены некоторые другие подходы:)