Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-03-2007
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
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 .
Responder Con Cita
  #2  
Antiguo 28-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Olvídate del Store Procedure. Envíale un "Null" al tiempo de insertar:
Código SQL [-]
insert into familia (cod_familia, descripcion)
values (:cod_familia, :descripcion);

Código Delphi [-]
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....
Código SQL [-]
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 28-03-2007
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
Smile

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
Responder Con Cita
  #4  
Antiguo 29-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
¡¡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.
Responder Con Cita
  #5  
Antiguo 30-03-2007
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
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>
Responder Con Cita
  #6  
Antiguo 30-03-2007
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
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)
Responder Con Cita
  #7  
Antiguo 30-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 10:35:52.


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
Copyright 1996-2007 Club Delphi