PDA

Ver la Versión Completa : insertar campos autonumericos


wopc
27-03-2007, 20:27:33
Hola a todos

Me prsento y soy nuevo en este foro ademas nunca antes habia programado en Delhpi soy de la vieja escuela de programadores (Cobol) asi que para mi el cambio ha sido duro.. bueno iré al grano amigos

la verdad busque y se que que hay algunos ejemplos pero no me ha quedado muy claro tengo una BD Firebird 2.0 y Delphi 5.0
y se trata de lo siguiente:

1 Tabla que tiene los campos codigo y Descripción. En la tabla el codigo es autonumerico .

Tiene un triggers (generado por IBexpert)

SET SQL DIALECT 3;
SET NAMES NONE;
CREATE GENERATOR GEN_FAMILIA_ID;
SET TERM ^ ;

CREATE TRIGGER FAMILIA_BI FOR FAMILIA
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.COD_FAMILIA IS NULL) THEN
NEW.COD_FAMILIA = GEN_ID(GEN_FAMILIA_ID,1);
END
^

SET TERM ; ^

------------------------------------------------------------------

y un procedmineto almacenado (IBexpert)

SET TERM ^ ;
CREATE PROCEDURE SP_GEN_FAMILIA_ID
returns (
id integer)
as
BEGIN
ID = GEN_ID(GEN_FAMILIA_ID, 1);
SUSPEND;
END^
SET TERM ; ^
GRANT EXECUTE ON PROCEDURE SP_GEN_FAMILIA_ID TO SYSDBA;

------------------------------------------------------------

cuando Inserta directamente en IBexpert un registro a la tabla, solo el codigo incrementa en 1 el numero.

mi pregunta...: Como obtengo, o mas bien como se hace para que grabe el codigo en forma automatica sin que se tengar que decir cual es el nuevo numero, como deberia ser el procedimiento mas adecuado.

Amigos ojala que me lo expliquen con manzanitas jeje

tengo un formulario(fm_base) donde tengo todas la Database las tablas y datasources y en los otros formularios mis aplicaciones que llaman a este cuando requiere el acceso a una tabla.

Espero haberme explicado bien!!!!

gracias


wopc :D.

Lepe
28-03-2007, 11:10:10
Olvídate del Store Procedure. Envíale un "Null" al tiempo de insertar:

insert into familia (cod_familia, descripcion)
values (:cod_familia, :descripcion);



uses Variants;

query1.parambyname('cod_familia').Value := null
query1.parambyname('descripcion').AsString := Edit1.text;
query1.ExecSql
Antes de insertar, se ejecuta el trigger before_insert, y allí se pregunta....

if new.Cod_familia is null then

por tanto el trigger se encarga de generar el autonumérico.

Evitando el problema desde otro frente:
Si usas un MDODataset (equivalente a un IBDataset) tienes la opción de decirle en sus propiedades quien es el generador, y la clave primaria de ese dataset, y además cuando aplicar la generación del autonumérico (al hacer un post, cuando el servidor quiera, al insertar).

Saludos

wopc
28-03-2007, 20:11:36
Lepe gracias por tu respuesta muy amable.

Entendi claramente lo que me explicaste pero al grabar sale error " 'familia_qy1:field 'cod_familia' is of an inknown type" .
para salir de dudas si mi procediiento estaba bien el NULL lo cambien por un valor numerico y graba bien, ahora el como VALUE := NULL me sale error

en el query

insert into familia (cod_familia, nombre)
values (:cod_familia, :nombre);


asi tengo el codigo

datos_fm.familia_qy1.parambyname('cod_familia').VALUE := NULL;
datos_fm.familia_qy1.parambyname('nombre').AsString := familia_fm.descripcion_edit.text;
datos_fm.familia_qy1.Execsql;

wopc :)

Lepe
29-03-2007, 12:17:53
¡¡Ay!!, ¡¡Ay!!, que error más tonto he cometido.

No debemos usar parambyname..... sino FieldbyName :D.

En un sql, cuando ponemos ":Cod", el Query lo tratará dependiendo del nombre que le demos:
- Si existe un campo en la tabla que se llama "Cod" (case insensitive), ya no es un parámetro de sql, sino el valor del campo "Cod"; para darle un valor debemos usar FieldByName.
- Si no existe ningún campo en la tabla con el nombre "Cod", entonces el Query lo tratará como un parámetro, y en ese caso, debemos usar ParamByName.

A todo lo que se le antepone los ":" se le suele llamar parámetros en SQL, de ahí que no me fijase bien.

Saludos.

wopc
30-03-2007, 02:57:18
Lepe Amigo mio

:confused: :confused:
probe lo que me indicaste

y asi lo dejé


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
datos_fm.familia_qy1.fieldbyname('cod_familia').VALUE := NULL;
datos_fm.familia_qy1.fieldbyname('nombre').AsString := familia_fm.descripcion_edit.text;
datos_fm.familia_qy1.Execsql;





y en el Query lo deje igual....


<DIV class=frame_codigo_sql>Código SQL [-] (http://www.clubdelphi.com/foros/#)<DIV class=texto_codigo_sql id=sql_div_460c5ff51aea9>

wopc
30-03-2007, 03:05:54
:( Lepe

algo paso con mi pregunta anterior
:confused: :confused:
pero aqui voy de nuevo...

asi deje el codigo en delphi



Código Delphi [-] (http://www.clubdelphi.com/foros/#)

datos_fm.familia_qy1.fieldbyname('NOMBRE').AsString := familia_fm.descripcion_edit.text;
datos_fm.familia_qy1.Fieldbyname('COD_FAMILIA').VALUE := NULL;
datos_fm.familia_qy1.Execsql;








<DIV class=frame_codigo_sql>Código SQL [-] (http://www.clubdelphi.com/foros/#)<DIV class=texto_codigo_sql id=sql_div_460c62567af44>

Insert INTO FAMILIA (COD_FAMILIA, NOMBRE)

Lepe
30-03-2007, 12:03:24
Pues algo pasa con las etiquetas SQL, a simple vista no entiendo lo que ocurre.

Pero vamos al tema ¿no funciona? ¿te da el mismo error? ¿otro?
¿qué componentes estas usando IBX, ADO, MDOLIB?

Es muy extraño, porque ahora si debe funcionar.

Saludos