Ir al contenido


Foto

[RESUELTO] Guardando datos desde Delphi en BD Firebird


  • Por favor identifícate para responder
13 respuestas en este tema

#1 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 15 mayo 2010 - 04:00

Hola como estan!

Les comento que estoy teniendo un problema a la hora de cargar datos desde Delphi 7.
Tengo una pequeña base de datos con 3 tablas: clientes, articulos y pedidos.
la tabla clientes, tiene los siguientes campos: id_cliente, nombre, apellido, direccion, poblacion, codigo_postal, telefono, email.
Hice la conexion por medio de los componentes Zeos, y puedo visualizar la tabla en un DBgrid sin problemas.
Lo que hago es guardar los valores que se cargan en distintos  TEdit de la siguiente manera:



delphi
  1. TClientes.Insert;
  2. TClientes.FieldByName('nombre').asstring:=ENombre.Text;
  3. TClientes.FieldByName('apellido').asstring:=EApellido.Text;
  4. TClientes.FieldByName('direccion').asstring:=EDireccion.text;
  5. TClientes.FieldByName('poblacion').asstring:=EPoblacion.text;
  6. TClientes.FieldByName('codigo_postal').asstring:=ECodigoPostal.Text;
  7. TClientes.FieldByName('telefono').asinteger:=strtoint(Etelefono.Text);
  8. TClientes.Post;



cuando quiero guardar los datos en la tabla, me aparece la siguiente ventana

Imagen Enviada

hago click en ignore y me sale el siguiente error

Imagen Enviada

click en ok y me aparece lo siguiente

Imagen Enviada

A la base de datos junto con las tablas las cree por medio de la herramienta IBExpert, cree un generador para cada uno de los campos "autoincrementales" que tienen las tablas, en ese caso el campo que me marca como error "ide_cliente" por lo que creo que se deberian de cargar automaticamente en la base de datos.

Saludos y gracias por su tiempo!
  • 0

#2 donaldsimoda

donaldsimoda

    Member

  • Miembros
  • PipPip
  • 10 mensajes
  • LocationSan Isidro - Argentina

Escrito 15 mayo 2010 - 04:28

Hola como estan!

Les comento que estoy teniendo un problema a la hora de cargar datos desde Delphi 7.
Tengo una pequeña base de datos con 3 tablas: clientes, articulos y pedidos.
la tabla clientes, tiene los siguientes campos: id_cliente, nombre, apellido, direccion, poblacion, codigo_postal, telefono, email.
Saludos y gracias por su tiempo!


Colocale la propiedad REQUIRED del campo ID_CLIENTE en False en la tabla y no lanzará ningún error.
  • 0

#3 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 15 mayo 2010 - 05:32

Colocale la propiedad REQUIRED del campo ID_CLIENTE en False en la tabla y no lanzará ningún error.


Pero en ese caso estaria diciendo que el campo puede ser null o no? en este caso es una clave primaria, si o si tiene que tomar un valor
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 16 mayo 2010 - 08:44

Sí, pero como has puesto la generación en un Trigger, Delphi no le tiene que pasar ningún valor, sería la propia base de datos, mediante el trigger, la que le asignará un valor.


  • 0

#5 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 16 mayo 2010 - 02:54

Hola!

Hice lo que me dijeron pero me siguen aparenciendo ventanas como las que muestro arriba, piediendo los archivos ".pas" y al ignorar me sale un error diciendo que el campo ID_Cliente no puede ser null, como esta especificado en la base de datos.

Alguna otra idea para solucionarlo?

Gracias!
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 16 mayo 2010 - 08:52

Hola GUN10

Porque no nos proporcionas el DDL de tu tabla para ver como está configurado el campo, si tiene su trigger y su generador y que es lo que te pide dicho generador, de otra forma estamos navegando a oscuras. ;)

Salud OS
  • 0

#7 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 16 mayo 2010 - 09:58

Hola egostar

Esto es lo que tengo cuando hago click en la pestaña DDL en IBExpert. Por mas que elegi el campo autoincremental y cree un generador, no me aparece el codigo.



sql
  1. CREATE TABLE TCLIENTES (
  2.     ID_CLIENTE    INTEGER NOT NULL,
  3.     NOMBRE        VARCHAR(25),
  4.     APELLIDO      VARCHAR(25),
  5.     DIRECCION      VARCHAR(30),
  6.     POBLACION      VARCHAR(30),
  7.     CODIGO_POSTAL  VARCHAR(4),
  8.     TELEFONO      INTEGER,
  9.     EMAIL          VARCHAR(30)
  10. );
  11.  
  12. ALTER TABLE TCLIENTES ADD CONSTRAINT PK_TCLIENTES PRIMARY KEY (ID_CLIENTE);



Lo que hago es hacer doble click en AutoInc cuando estoy creando el campo y me aparece una ventana con 3 pestañas a donde elijo generador y aqui "crear generador".
Le doy un nombre, en este caso el que esta por defecto "GEN_TCLIENTES_ID" y valor incial le pongo 1.
En las demas pestañas no se si tengo que hacer algo mas. Las otras dos son Disparador y Procedure.

Saludos!
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 16 mayo 2010 - 10:08

Necesitas crear tambien el trigger, que es la siguiente pestaña despues de crear el generador, seleccionas crear trigger y le das COMMIT, con eso debes tener todo correctamente como lo tengo en este ejemplo.



sql
  1. /******************************************************************************/
  2. /*                Generated by IBExpert 05/16/2010 23:10:23                  */
  3. /******************************************************************************/
  4.  
  5. /******************************************************************************/
  6. /*        Following SET SQL DIALECT is just for the Database Comparer        */
  7. /******************************************************************************/
  8.  
  9. SET SQL DIALECT 3;
  10.  
  11. /******************************************************************************/
  12. /*                                  Tables                                  */
  13. /******************************************************************************/
  14.  
  15. CREATE GENERATOR GEN_USUARIOS_ID;
  16.  
  17. CREATE TABLE USUARIOS (
  18.     ID_USUARIO  INTEGER NOT NULL,
  19.     USUARIO    VARCHAR(10),
  20.     PASSW    VARCHAR(30),
  21.     NOMBRE      VARCHAR(100)
  22. );
  23.  
  24. /******************************************************************************/
  25. /*                                Primary Keys                                */
  26. /******************************************************************************/
  27.  
  28. ALTER TABLE USUARIOS ADD CONSTRAINT USUARIOS_PK PRIMARY KEY (ID_USUARIO);
  29.  
  30. /******************************************************************************/
  31. /*                                  Triggers                                  */
  32. /******************************************************************************/
  33.  
  34. SET TERM ^ ;
  35.  
  36. /******************************************************************************/
  37. /*                            Triggers for tables                            */
  38. /******************************************************************************/
  39.  
  40. /* Trigger: USUARIOS_BI */
  41. CREATE OR ALTER TRIGGER USUARIOS_BI FOR USUARIOS
  42. ACTIVE BEFORE INSERT POSITION 0
  43. AS
  44. BEGIN
  45.   IF (NEW.ID_USUARIO IS NULL) THEN
  46.     NEW.ID_USUARIO = GEN_ID(GEN_USUARIOS_ID,1);
  47. END
  48. ^
  49.  
  50. SET TERM ; ^



Esto quiere decir que puedes pasar un valor nulo al campo auto-incrementablesin mayor problema.

Salud OS
  • 0

#9 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 16 mayo 2010 - 10:11

Justo estaba escribiendote cuando respondiste.
Lo que hice fue ir a la pestaña "Disparador" hice click en crear disparador y deje el codigo qu me muestra como esta, le di ok.
Fui a mi programa en delphi y ya pude cargar datos sin problemas en la tabla.

Por lo que me decis entonces fue ese el problemita.
Pero ahora me queda la pestaña procedure, que si hago click en crear procedure, me muestra un codigo. Pero no si es necesario o con lo que tengo es suficiente.

Por el momento puedo cargar bien los datos pero si podes responderme esa duda te lo agradeceria, gracias por la rapidez en responder.

Saludos!
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 16 mayo 2010 - 10:16

Ah pues que bien (y), parece que si te faltaba el disparador para que ejecutara el autoincremento del campo. Yo normalmente utilizo generador y disparador, no sabia que solo creando el disparador funcionaba. ;)

Salud OS
  • 0

#11 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 16 mayo 2010 - 10:25

Marco el tema como [RESUELTO], muchisimas gracias nuevamente!  ;)
  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 17 mayo 2010 - 11:52

Me alegro que lo hayas resuelto, yo me estaba rompiendo la cabeza sobre que podría ser...

Ahora, si bien parece estar todo resuelto, yo me pregunto ¿Y el error ese de que te pedía añadir el pas? Eso si es raro ^o|

Saludos,
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 mayo 2010 - 11:56

Me alegro que lo hayas resuelto, yo me estaba rompiendo la cabeza sobre que podría ser...

Ahora, si bien parece estar todo resuelto, yo me pregunto ¿Y el error ese de que te pedía añadir el pas? Eso si es raro ^o|

Saludos,


Esos errores son comunes cuando no pueden acceder al archivo pas, me ha pasado mas de un par de veces, pero es porque no localiza la unidad y normalmente pasa cuando estás en un proceso de depuración, (yo le llamo TRACE :p :D)

Salud OS
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 17 mayo 2010 - 12:08

Pues, si te digo que me parece raro... es porque me resulta raro :D
A por lo menos a mí, cuando no me encuentra un archivo (.dcu o .pas) me pone las advertencias en el Warning pero de lanzarme el cuadro de diálogo pidiendome añadir al Library Path el pas... hasta ahora nunca he visto.
Y eso lo hace en cuanto uno intenta compilar.

Hasta ahora, realizando traza de MIS unidades no se me ha dado el caso. Quizá sólo puede llegar a suceder con las unidades que componen al Library Path.

¿Será alguna de las diferencias entre D6 y D7? O es un bug incentón y picarón :p

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.