Ver Mensaje Individual
  #4  
Antiguo 19-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Para la clave primaria usaría un autoincremental.
Para el código que sea correlativo, usaría otro campo distinto con un índice.

Hay muchas formas de hacerlo, una de ellas:
- En el OnNewRecord, buscas el hueco del correlativo y lo asignas al campo.
- En el BeforePost y asegurándote que la tabla está en estado dsInsert (se está insertando pero todavía no se ha guardado). Buscas de nuevo el correlativo por si alguien ha grabado mientras este usuario estaba pensando en las musarañas .

Esto tiene fallos de todas formas, porque imagina que se da un registro de alta, se guarda, otro usuario hace lo mismo y despues el primer usuario borra su registro. Obviamente queda un hueco (que se puede aprovechar la próxima vez que se inserte un registro).

La rutina para volverse loco es esta:
Código:
procedure TDTM.BuscaHuecoCliente(const idActual: Integer);
var
  nextIdx, hueco: Longint;
  qryHuecos: Tquery;
  salir: Boolean;

begin
  if not (dtm.TblClientes.state in [dsInsert]) then
  begin
    frmmdi.Notifica(mAviso,
        'Solo se puede buscar huecos al dar de alta un nuevo Cliente', NIL);
    exit
  end;

  hueco := 0;
  salir := false;

  qryHuecos := Tquery.Create(nil);
  try
    qryHuecos.DatabaseName := gl.DB.Alias; // alias del bde
    qryHuecos.SQL.Text     := 'select idCliente from Clientes order by idCliente';
    qryHuecos.SessionName  := dtm.DtbPPal.SessionName; //session del TDatabase

    qryHuecos.Prepare;
    qryHuecos.Open;
    if not qryHuecos.IsEmpty then
    begin
      qryHuecos.First;
      while not ((qryHuecos.Eof) or salir) do
      begin
        inc(hueco);
        nextIdx := qryHuecos.Fields[0].AsInteger;
        if nextIdx - hueco <> 0 then
          salir := (hueco <> idactual)
        else
          qryHuecos.Next;
      end; //while
    end; // qry vacia

    qryHuecos.Close;
  finally
    FreeAndNil(qryHuecos);
  end; // finally
  if salir then
    dtm.TblClientesIdCliente.AsInteger := hueco
  else
    dtm.TblClientesIdCliente.AsInteger := nextId +1;
end;
Es penoso porque hay que hacer una búsqueda secuencial para encontrar los huecos.... pero no hay más remedio.

OFFtopic: ¿Quién será el que se ha cargado las etiquetas delphi

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita