Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Orden En Tabla (https://www.clubdelphi.com/foros/showthread.php?t=58438)

ebeltete 21-07-2008 00:04:45

Orden En Tabla
 
Hola amigos del foro, estoy migrando a Firebird 2.0, mi aplicacion que usa paradox, entre otras maneja 7 tablas sin indice primario, lo cual me permite mantener el orden segun donde se inserta el registro. Para hacerlo en Firebird con un indice primario, al hacer una consulta me devuelve los datos de la tabla ordenado segun el campo primario, como puedo hacer para ver la tabla como lo hacia en paradox.
Si el usuario inserta un registro en el renglon 21 de la tabla, quiero que al hacer la consulta, el renglon se vea en el mismo lugar.
Gracias

celades1 21-07-2008 07:35:51

Hola


primero suponemos que tienes un campo ID primary key luego añadele un campo que sea el orden crea un indice unique key para que no repita valores y vaya rapido al ordenar.
Al insertar comprueba donde estas insertando y si insertas en la posicion 50
antes deberas hacer update orden=orden+1 de todos los registros con orden>=50.
si quieres al hacer delete del registro 50 puedes hacer update orden=orden-1 de todos los registros con orden>=50.
Tambien si cambias de lugar el registro debes hacer los updates correspondientes.
Todo esto lo puedes montar con codigo delpho o bien con los triggers de la BD before_insert,before_update,after_delete.

Yo lo utilizo para ordenar las linias de un albaran tal como las meta el usuario
entonces la tabla linias_albaran tiene el UK que es Cabecera_albaran_id+orden; con un Id como PK

Otra solucion que yo utilize pero que no me gusta es que el campo orden sea double precision y asignarle siempres el valor medio entre su anterior y posterior registro.


Espero haberte podido ayudar

santiago14 21-07-2008 18:41:08

ID en firebird
 
Una manera sencilla sería poner un generador para el identificador.
Y en el trigger before insert llamarlo y obtener el id.

Otra manera, creo yo mas razonable, es desde el código delphi hacer la cosa en dos pasos.
Lo primero sería un select buscando el último nro de ID ingresado, a ver:

...iniciamos la transaccion y todo eso.

Código SQL [-]
Nueva_ID = select max(id) + 1 from tabla

Luego, con eso ya podemos hacer el insert sin problemas:
Código Delphi [-]
with query do
begin
  close;
  sql.clear;
  sql.add('Insert into tabla values (:ID, :campo2, ...)');

  parambyname('ID').asInteger:=Nueva_ID
  try
    execSQL;
  except
    raise;
  end;
end;

...terminamos la transacción y listo.
Por último, eso de no tener clave primaria en una tabla no es bueno, procura siempre tenerla.

Espero te sirva. Esto no es lo mejor pero funciona bastante bien.


La franja horaria es GMT +2. Ahora son las 00:06:17.

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