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