Retornar nenhum registro se o FindKey resultar em False?
Pergunta
Usando tdataset.findKey, você pode localizar registros. Quando resultar em True, o cursor dos conjuntos de dados será posicionado no registro encontrado. Quando resulta em falso, o cursor não é movido. Isso resulta nos dados de registro antes da emissão do FindKey sendo exibida nos componentes conscientes dos dados.
Como posso codificar o resultado do FindKey para retornar um registro vazio?
if Not tblSomeTable.FindKey([SomeSearchData]) then
begin
< code to return empty or move data cursor to neutral position >
end;
Atualizar: (Esperei alguns dias antes de selecionar a resposta certa, pois acredito que esse é o costume e não WAN para desencorajar mais feedback.) Houve várias sugestões sobre como enfrentar essa situação, embora eu acredite que a resposta correta foi de Marcelo, pois não é possível ter um cursor não estar em um registro. Várias soluções alternativas foram sugeridas. Eu escolhi um dos meus. Foi algo como:
If Not tblSomeTable.FindKey([SomeSearchData]) then
begin
tblSomeTable.FindKey([-1,2010]);
end
O que eu fiz é criar um registro em branco e dummy com um índice que os dados reais nunca podem ser, ou seja: o primeiro valor do índice nunca será -1. Se a pesquisa inicial estiver vazia, o FindKey posicionará o cursor nesse registro vazio. Isso fornecerá o efeito visual que eu estava atrás.
Solução
Isso não é possível até onde eu sei. O cursor deve estar sempre em um registro, a menos que o BOF e o EOF sejam true (conjunto de dados vazios).
Outras dicas
O tdataset não tem uma "posição neutra". Mas como sempre você tem poucas opções:
- Defina o conjunto de dados no modo de registro Inserir / Anexo. Portanto, os controles e o código verão o registro vazio. Cuidado, pois algo pode atribuir dados incidentalmente a um campo e, em seguida, o novo registro pode ser publicado no DB.
- Dependendo dos componentes de acesso a dados, você está usando, você pode definir o conjunto de dados para armazenar no modo de atualizações em cache, inserir e postar um novo registro vazio no conjunto de dados e marcar todas as alterações aplicadas. Em seguida, atribua um filtro, normalmente rejeitando este registro vazio. Em seguida, no seu código, você deve alternar o filtro, para que ele rejeite todos os registros, excluindo este vazio.
- Considere desconectar o TDataSource do conjunto de dados e mais tarde conectá -lo novamente.
Observe com certeza, mas provavelmente pode haver algumas outras abordagens :)
Hallo,
Use setRange em vez de FindKey.
tblSomeTable.SetRange([SomeSearchData],[SomeSearchData]);
try
while not tblSomeTable.Eof do begin
<do something with the Record>
tblSomeTable.Next;
end;
finally
tblSomeTable.CanelRange;
end;
Quando você os critérios garantem que o máximo de registros correspondentes seja aquele que você recupera com a instrução acima de zero ou um registro.