FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
insertar campos autonumericos
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 . |
#2
|
||||
|
||||
Olvídate del Store Procedure. Envíale un "Null" al tiempo de insertar:
Antes de insertar, se ejecuta el trigger before_insert, y allí se pregunta.... 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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#3
|
|||
|
|||
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 |
#4
|
||||
|
||||
¡¡Ay!!, ¡¡Ay!!, que error más tonto he cometido.
No debemos usar parambyname..... sino FieldbyName . 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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#5
|
|||
|
|||
Lepe Amigo mio
probe lo que me indicaste y asi lo dejé Código Delphi [-] 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 [-]<DIV class=texto_codigo_sql id=sql_div_460c5ff51aea9> |
#6
|
|||
|
|||
Lepe
algo paso con mi pregunta anterior pero aqui voy de nuevo... asi deje el codigo en delphi Código Delphi [-] 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 [-]<DIV class=texto_codigo_sql id=sql_div_460c62567af44> Insert INTO FAMILIA (COD_FAMILIA, NOMBRE) |
#7
|
||||
|
||||
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Autonumericos | crc2005 | Tablas planas | 7 | 23-10-2006 21:02:19 |
InsertRecord con autonumericos | Caljim | Conexión con bases de datos | 5 | 04-06-2004 11:52:30 |
Insertar campos en un tabla SQL SERVER | jose arriagada | SQL | 1 | 18-03-2004 01:09:48 |
Autonumericos | NuncaMas | Tablas planas | 1 | 14-10-2003 20:15:37 |
Autonumericos en FireBird | jmselesan | Firebird e Interbase | 2 | 18-09-2003 16:48:02 |
|