Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-04-2006
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 99
Poder: 20
javicho_villa Va por buen camino
Exclamation 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.
Responder Con Cita
  #2  
Antiguo 19-04-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 19-04-2006
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 99
Poder: 20
javicho_villa Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 19-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Incrementar las llaves primarias con zeos uper MySQL 1 16-07-2005 20:23:00
Problema de llaves primarias y foráneas!! romansiux Varios 2 10-04-2005 16:20:57
Key Violation en tabla sin claves primarias mak8888 Tablas planas 6 27-02-2005 11:48:12
Problemas con claves primarias y campos obligatorios Bitbanner Conexión con bases de datos 1 09-02-2005 11:20:31
como crear exception para validar duplicación de llaves en tabla viajero2015 Conexión con bases de datos 6 21-10-2003 09:54:09


La franja horaria es GMT +2. Ahora son las 21:59:17.


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
Copyright 1996-2007 Club Delphi