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)
-   -   Funcion de autoincremento (https://www.clubdelphi.com/foros/showthread.php?t=57219)

Zakio14 09-06-2008 03:56:18

Funcion de autoincremento
 
Pura vida foreros!!

Trabajo con firebird
Tabla: Factura
Campo: ID_factura(llave primaria)

Mi consulta es esta:
Quiero crear una función que me cree automáticamente el ID_factura en la Tabla

Por ejemplo cada ves que yo guarde en la Tabla, llamar esta función para que autoincremente el ID_factura sin repetirlo por ser una llave primaria

He buscado durante un buen rato en google he escudriñado aquí también pero no encuentro nada… me encantarían que me ayuden con este problemita…

Desde Costa Rica un Aprendiz les Agradece
Pura vida foreros!!

Trabajo con firebird
Tabla: Factura
Campo: ID_factura(llave primaria)

Mi consulta es esta:
Quiero crear una función que me cree automáticamente el ID_factura en la Tabla

Por ejemplo cada ves que yo guarde en la Tabla, llamar esta función para que autoincremente el ID_factura sin repetirlo por ser una llave primaria

He buscado durante un buen rato en google he escudriñado aquí también no se si he buscado lo suficiente pero no encuentro nada… me encantarían que me ayuden con este problemita…

Desde Costa Rica un Aprendiz les Agradece

Delphius 09-06-2008 04:59:22

Lo que tu estás buscando se consigue con un generador y un trigger:

Un ejemplo de un generador:
Código SQL [-]
CREATE GENERATOR EMP_NO_GEN;

Un generador pemite llevar ese incremento. Y puede, si se desea, indicarle un valor inicial:
Código SQL [-]
SET GENERATOR EMP_NO_GEN TO 145;

En el ejemplo vale 145.

Y un ejemplo de un trigger:

Código SQL [-]
CREATE TRIGGER SET_EMP_NO FOR EMPLOYEE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
    /* FIXED by helebor 19.01.2004 */
    if (new.emp_no is null) then
    new.emp_no = gen_id(emp_no_gen, 1);
END
La función gen_id() recibe como parámetro un generador y un valor de incremento. En este caso de 1.

El disparador (Trigger) se dispara antes de insertar (en este ejemplo). En tu caso debe ser AFTER INSERT.

Entonces, antes de insertar en la tabla, se dispara el trigger, llama a la función gen_id() con el generador en cuestión. Al final del proceso, el valor obtenido es 146.

Los ejemplos que te pasee fueron extraídos de la DB de ejemplo EMPLOYEE que acompaña a la instalación de Firebird.

Sería bueno ahora darte una pequeña advertencia: el uso de los generadores violan el concepto de transaccionalidad. Es decir que si en una transacción se ejecutan dichos procesos, un rollback no volverá el valor hacia atrás.

Deberás analizar efectivamente si el uso de los generadores es que estás buscando. Puesto que también hay otras maneras de conseguir este efecto.

Saludos,

Al González 09-06-2008 05:34:29

¡Hola!

Además de la estupenda recomendación de Marcelo, recomiendo que tomes muy en cuenta estos dos mensajes sobre llaves primarias que escribí hace tiempo:

http://www.clubdelphi.com/foros/show...3&postcount=14

http://www.clubdelphi.com/foros/show...66&postcount=2

Saludos.

Al González. :)

Zakio14 09-06-2008 06:07:07

gracias por su ayuda es muy Enriquecedora para mi!!

Al Rodriguez
Estube viendo tu ejemplo que dejaste en el enlase y diculpa mi ingnorancia soy nuevo y tengo poca experiencia me pueden decir donde pongo esto

Código SQL [-]
CREATE PROCEDURE SPIDGENERAL 
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = Gen_ID (GNGENERAL, 1);
END

Delphius 09-06-2008 06:16:41

Cita:

Empezado por Al González (Mensaje 292193)
¡Hola!

Además de la estupenda recomendación de Marcelo, recomiendo que tomes muy en cuenta estos dos mensajes sobre llaves primarias que escribí hace tiempo:

http://www.clubdelphi.com/foros/show...3&postcount=14

http://www.clubdelphi.com/foros/show...66&postcount=2

Saludos.

Al González. :)

Pues precisamente amigo a dichos comentarios me refiería con alternativas.

Por ello el tema de las facturas es, como he leído en otros hilos, un tema peliaduro (o algo así... no recuerdo la palabra exacta:D). Y debo admitir que a mi cada vez que se me pasa por la cabeza esos ejemplos (ese constante ejercicio que hago a diario) de facturas o algo similar se me plantean otra vez que es bueno hacer, que es malo...
En fin, al final se trata de un análisis de la situación y del dominio.
Por ello a mi me gusta apegarme a la regla: análisis primero, código después.

Saludos,


La franja horaria es GMT +2. Ahora son las 13:36:48.

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