Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como trabajar las llaves primarias en red (https://www.clubdelphi.com/foros/showthread.php?t=30800)

javicho_villa 19-04-2006 20:07:03

Como trabajar las llaves primarias en red
 
Hola a todos:
Ante todo muchas gracias por la leer este hilo, tengo un problema al guardar registros en Paradox en varios terminales a la vez, el problema se cebtra en generar la clave primaria en los terminales.

probe con un campo autoincremental pero cuando un registro se elimina se pierde ese numero, siendo escencial mantener y reutilizar estos numeros.

Como veran no se puede poner en exclusivo la tabla por que se esta compartioendo con varios terminales.

Cual seria una Solución viable.(uso paradox y delphi 6.0)

Nuevamente Muchas Gracias.

Javier Villa.

Neftali [Germán.Estévez] 19-04-2006 20:20:24

Si no necesitas que sean correlativos, es decir, que puedes aprovechar los que se borran, yo utilizaría un proceso paralelo que reutilice los números, ya sea en el momento de asignarlos o utilizando una tabla intermedia que guarde los libres.

En todo caso debes eliminar la característica de autoincremental de campo.

javicho_villa 19-04-2006 20:34:15

De todas maneras se elimina el autoincremental
 
Lo que mas molesta es cuando varios usuarios quieren grabar al mismo tiempo en diferentes terminales, cual es el procedimiento a seguir en ese caso.

Lepe 19-04-2006 21:38:58

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 :D :D

Saludos


La franja horaria es GMT +2. Ahora son las 13:08:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi