Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Mayor Numero Paradox (https://www.clubdelphi.com/foros/showthread.php?t=60278)

marcoszorrilla 26-09-2008 21:36:36

El riesgo de los campos autoinc es que si por un casual se nos ocurre que sean índice para establecer una relación maestro-detalle, por ejemplo una factura y sus líneas. Si por algún motivo falla, tiene efectos desastrosos pues nos borraría facturas.

Me explico, tengo una tabla de facturas y otra líneas, por el motivo que sea decido importar la tabla de facturas completa a una nueva tabla, por ejemplo por alguna corrupción que ha sufrido, a partir de aquí la nueva tabla es posible que no coincida el autoincremento que llevabamos y por lo tanto la relación maestro-detalle se vuelve azarosa.

Si además el autoincremento por el motivo que fuere cambia irá machacando todas las facturas que sea superiores, hablo por experiencia, pues en una ocasión un sistema perdía recibos por suerte descubrí pronto que por un trasvase a otra tabla el autoincremento se había vuelto inferior al que llevaba la tabla antigua.

Un Saludo.

Softweb 27-09-2008 11:10:08

Hola te paso una funcion para hacer lo que tu quieres.

Código Delphi [-]
function GenerarId(KeyField, TableName, Condicion: string): Integer;
var
  NewValue: Integer;
begin
  NewValue := -1;
  Query1.Close;
  Query1.SQL.Clear;
  if Condicion <> '' then
    Query1.SQL.Add('SELECT Max( '+KeyField+' ) AS MAXIMO FROM '+TableName+ ' WHERE '+Condicion)
  else
    Query1.SQL.Add('SELECT Max('+KeyField+') AS MAXIMO FROM '+TableName);
  Query1.Open;
  // Si no hay registros en la tabla la consulta devuelve null
  if VarIsNull( Query1.FieldValues[ 'MAXIMO' ] ) then
    NewValue := 1 // valor para el primer registro de la tabla
  else
    NewValue := Integer( Query1.FieldValues[ 'MAXIMO' ] ) + 1;
  Query1.Close;
  Result := NewValue;
end;

Para usarla es asín.

Código Delphi [-]
NuevoNumero := GenerarId('num_veh','vehiculos.db', '');

O si lo quieres con alguna condicion.

Código Delphi [-]
NuevoNumero := GenerarId('num_veh','vehiculos.db', 'Fecha > ''01/06/2008''');


Saludos


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

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