viernes, 24 de noviembre de 2017

Borrar registros de un dataset mediante While

El problema aquí es que pasa con el puntero cuando se elimina un registro y el next. Pues bien, cuando se elimina el registro, pasa al siguiente, por lo tanto hay que evitar el next cuando se borra.

While not (DMF.ZQReg.EOF ) do
begin 

  if algunacondicion then
    begin
      nEmple:=DMF.ZQReg.FieldByName('regemple').AsInteger;
      dFechaHora:=DMF.ZQReg.FieldByName('regfechahora').AsDateTime;
      DMF.ZQReg.Edit;
      DMF.ZQReg.Delete;
      Inc(nContador);
    end
  else
    begin
      nEmple:=DMF.ZQReg.FieldByName('regemple').AsInteger;
      dFechaHora:=DMF.ZQReg.FieldByName('regfechahora').AsDateTime;
      DMF.ZQReg.Next;
    end;
end; 


En este caso debo eliminar registros duplicados de lector biométrico, en algunacondicion evaluo si el registro es duplicado y tomo los datos antes de borrarlo, porque a veces los datos están hasta quintuplicados.
Como puede verse, el Next lo realizo solo si no se elimina el registro (fila).

Si el volumen de datos a procesar es grande, conviene utilizar una conexión sin autocommit y utilizar BEGIN y COMMIT tal como se explica aquí.

No hay comentarios:

Publicar un comentario