Ir al contenido



Foto

Problema con Insert en una BD FireBird con Zeos

insert zeos firebird lazarus codetyphon

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

#1 AngelF

AngelF

    Advanced Member

  • Miembros
  • PipPipPip
  • 100 mensajes
  • LocationValencia - España

Escrito 16 septiembre 2015 - 03:55

Hola a todos.

 

He tenido un problemón al intentar añadir datos a una BD Firebird 2.5 utilizando Codetyphon 5.40 y los componentes Zeos. El caso es que al hacer el Post (componente Zquery) me salía un error de que determinados campos que no podían ser NULL (campo requerido) no tenía asignado ningún valor. Es decir, si tienes una tabla con un campo IDTABLA requerido, con la propiedad NOT NULL y no asignas ningún valor a IDTABLA, entonces te salta un error lógico.

 

Hasta aquí bien, el problema es que el error me lo daba cuando sí había asignado un valor a ese campo. Asigno un valor (mediante Zquery.FieldByName('IDTABLA').asinteger=12 por ejemplo) y luego me dice que IDTABLA no puede ser NULL. Este error no me lo daba siempre, lo que es extraño, porque me hice una BD de prueba y ahí no tenía ningún error y hacía todo correcto.

 

El caso es que buceando en foros, he encontrado de rebote la solución. :smiley: Busqué aquí en Delphiaccess y no he encontrado a nadie con un problema similar, pero en otros foros en inglés (e incluso alemán) sí que les pasaba algo parecido.

 

Por si a alguien le pasa en un futuro, comparto la solución que a mí me ha servido. Copio y pego unos apuntes que me he redactado yo:

 

Los campos autoincremento, su propiedad FieldKind debe ser fkInternalCalc (no fkdata). Para eso hay que definir primero todos los campos en el Zquery:
Pasos:
1. En el SQL del ZQuery poner: SELECT * FROM TABLA1
2. Desde el inspector de objetos poner ZQuery.Active := True
3. Añadir todos los campos al ZQuery (botón derecho del ratón sobre el ZQuery)
4. Seleccionar el campo que sea autoincremento en el inspector de objetos, y poner su propiedad FieldKind en fkInternakCalc. (Esto no he encontrado cómo hacerlo desde código)
 
Ahora, los campos que sean NOT NULL, hay que poner su propiedad Required en false (si no, produce un error que te vuelve loco). Esto lo podemos hacer desde código.
 
Ejemplo de insert:
 

php
  1. dm1.ZQEntradaRegistro.Open;
  2. dm1.ZQEntradaRegistro.Insert;
  3. dm1.ZQEntradaRegistro.FieldbyName('FECHA_ENTRADA').Required:=False; // <-- Aquí
  4. dm1.ZQEntradaRegistro.FieldbyName('FECHA_ENTRADA').AsDateTime := Now;
  5. dm1.ZQEntradaRegistro.FieldbyName('HORA_ENTRADA').Required:=False; // <-- Aquí
  6. dm1.ZQEntradaRegistro.FieldbyName('HORA_ENTRADA').AsDateTime := Time;
  7. dm1.ZQEntradaRegistro.FieldbyName('FICHERO_ENTRADA').AsString := sc.strip(sc.copy(FFich, 1, 300));
  8. dm1.ZQEntradaRegistro.FieldbyName('USUARIO').AsString := sc.strip(sc.copy(stuser, 1, 50));
  9. dm1.ZQEntradaRegistro.FieldbyName('VOLUMEN').AsString := sc.strip(sc.copy(stvolumen, 1, 30));
  10. dm1.ZQEntradaRegistro.FieldbyName('IDPROYECTO').AsInteger := unit01.idproyectoactual;
  11. dm1.ZQEntradaRegistro.FieldbyName('NOTAS').AsString := 'Got with RATON';
  12. dm1.ZQEntradaRegistro.FieldbyName('NUMERO_DATOS').AsInteger := 0;
  13. dm1.ZQEntradaRegistro.FieldbyName('NUMERO_DATOS_NULL').AsInteger := 0;
  14. dm1.ZQEntradaRegistro.FieldbyName('NUMERO_LINEAS').AsInteger := StrToInt(itotallines);
  15. dm1.ZQEntradaRegistro.FieldbyName('RESULTADO').Required:=False;
  16. dm1.ZQEntradaRegistro.FieldbyName('RESULTADO').AsInteger := 0;
  17. dm1.ZQEntradaRegistro.FieldbyName('TIPO_DATOS').AsString := '0|0|0|0|0|0|0';
  18.  
  19. dm1.ZQEntradaRegistro.Post;
  20. dm1.ZQEntradaRegistro.Close;
  21. dm1.ZConec.Commit;

Espero le sirva a alguien.

 

Un saludo.

 

 


  • 1

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.404 mensajes
  • LocationRepública Dominicana

Escrito 16 septiembre 2015 - 07:24

Gracias por el aporte amigo, No necesariamente debes colocar la propiedad required en tiempo de ejecución, lo puedes hacer en tiempo de diseño, le das doble click al dataset donde se muestra todos los campos, selecciona el campo ID y en el inspector de objectos buscas la propiedad required y lo colocas en false, así te olvidas de agregar código de más por el resto del proyecto.

 

Saludos.


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.257 mensajes
  • LocationArgentina

Escrito 16 septiembre 2015 - 11:54

Gracias por el datazo amigo.

Yo utilicé Zeos en CodeTyphon 5.1 y no he tenido este tipo de problemas. Quizá algo ha cambiado entre las versiones o será porque no acostumbro a emplear los campos persistentes (quizá el problemita esté allí).

Es bueno tener esto documentado, porque quien sabe... a lo mejor me pasa más adelante a mi.

 

Saludos,


  • 0

#4 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 830 mensajes
  • LocationArgentina

Escrito 16 septiembre 2015 - 02:20

Yo la verdad nunca me senti comodo usando los componentes de acceso a datos de esa forma. Jamas use campos persistentes, tampoco los metodos Insert, Post, Edit, etc; me siento mas comodo utilizando sentencias SQL

 

Sera cuestion de gustos


  • 0





Etiquetado también con una o más de estas palabras: insert, zeos, firebird, lazarus, codetyphon