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.

Foi útil?

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:

  1. 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.
  2. 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.
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top