Не возвращать записи, если FIndKey приводит к False? - PullRequest
0 голосов
/ 28 марта 2010

Используя 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 ]

1 голос
/ 28 марта 2010

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

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

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

1 голос
/ 28 марта 2010

Алло,

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

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

0 голосов
/ 28 марта 2010

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

...