Pregunta

El uso de TDataSet.FindKey puede localizar registros. Cuando el resultado es verdad que el cursor de conjuntos de datos se coloca en el registro encontrado. Cuando el resultado es falso el cursor no se mueve. Esto hace que los datos de registro anteriores a FindKey se emiten datos que se muestra en componentes conscientes.

¿Cómo puedo codificar el resultado de FindKey para devolver un registro vacío?

    if Not tblSomeTable.FindKey([SomeSearchData]) then
    begin
        < code to return empty or move data cursor to neutral position >
    end;

Actualización: (esperó unos días antes de seleccionar una respuesta correcta ya que creo que es la costumbre y no wan a desalentar la retroalimentación.) Hubo varias sugerencias sobre la lucha contra esta situación aunque creo la respuesta correcta era de Marcelo en que no es posible tener un cursor no puede estar en un registro. Se propusieron varias soluciones. Elegí uno de los míos. Fue algo como:

    If Not tblSomeTable.FindKey([SomeSearchData]) then
    begin
        tblSomeTable.FindKey([-1,2010]);
    end

Lo que hice es crear un maniquí, registro en blanco con un índice que los datos reales nunca pueden ser, por ejemplo: El primer valor del índice nunca será -1. Si la búsqueda inicial aparece vacía, entonces el FindKey permite colocar el cursor en este disco vacío. Esto proporcionará el efecto visual que fue después.

¿Fue útil?

Solución

Esto no es posible en la medida que yo sepa. El cursor debe estar siempre en un registro a menos Bof y Eof son verdaderas (conjunto de datos vacío).

Otros consejos

TDataSet no tiene una "posición neutral". Pero como siempre usted tiene algunas opciones:

  1. conjunto de datos Conjunto al modo de inserción / append registro. Por lo tanto, los controles y código verán registro vacío. Tenga cuidado, ya que algo puede incidentalmente datos asigna a un campo y entonces el nuevo registro puede ser enviado a DB.
  2. En función de los componentes de acceso a datos, que está utilizando, puede establecer conjunto de datos a modo depositado actualizaciones, inserción y post nuevo registro vacío al conjunto de datos, y marcar todos los cambios aplicados. A continuación, asigne un filtro, normalmente rechazar este registro vacío. Luego, en el código debe de cambiar el filtro terminado, por lo que rechazará todos los registros, con exclusión de éste vacía.
  3. Considere desconectar el TDataSource del conjunto de datos y luego conectarla de nuevo.

Nota seguro, pero probablemente no puede ser inventado algunos otros enfoques:)

Hola,

El uso SetRange en lugar 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;

Cuando criterios asegura que el máximo de registros que coinciden es uno de recuperar con la declaración anterior cero o un registro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top