[SOLUCIONADO] Bug al sincronizar un datos_tabla con campo booleano???

Hola, los molesto por un problemita que tengo al sincronizar un ABM sencillo sobre un datos_tabla.
Probablemente no sea un bug… pero…
Por lo que veo en el log, los datos estarían bien, pero por algún motivo, el valor booleano de ‘vigente’, se convierte en “” al hacer el insert.
El punto 8 es un punto de debug que ingresé, y luego hay un var_dump de $datos

1. Iniciando componentes... 2. componente(2810): Pantalla de eventos: 'edicion' 3. Procesando eventos... 4. componente(2810): [ inicializar_dependencias ]
  array (
    0 => 'ci_docentes_cf_hist_edicion',
  )
  1. componente(2807): Pantalla de eventos: ‘funciones’

  2. componente(2807): [ inicializar_dependencias ]

    array (
    0 => ‘funciones_cuadro’,
    1 => ‘funciones_formulario’,
    )

  3. componente(2807): [ registrar_evento ] ‘nuevo’ → [ evt__funciones_formulario__nuevo ]

    array (
    0 =>
    array (
    ‘fecha_inicio’ => ‘2010-06-11’,
    ‘fecha_fin_original’ => ‘2011-06-10’,
    ‘id_ordenanza’ => ‘4’,
    ‘ini_fieldset_funcion’ => NULL,
    ‘id_funcion_area’ => ‘2’,
    ‘id_funcion_tipo’ => ‘1’,
    ‘fin_fieldset_funcion’ => NULL,
    ‘fecha_fin_real’ => ‘2010-12-02’,
    ‘observaciones_baja’ => ‘esto es una prueba’,
    ‘ini_fieldset_materia’ => NULL,
    ‘id_facultad_carrera’ => NULL,
    ‘id_carrera_materia’ => NULL,
    ‘id_materia_dictado’ => NULL,
    ‘fin_fieldset_materia’ => NULL,
    ),
    )

  4. MIRAR $DATOS

  5. array (

    ‘fecha_inicio’ => ‘2010-06-11’,
    ‘fecha_fin_original’ => ‘2011-06-10’,
    ‘id_ordenanza’ => ‘4’,
    ‘ini_fieldset_funcion’ => NULL,
    ‘id_funcion_area’ => ‘2’,
    ‘id_funcion_tipo’ => ‘1’,
    ‘fin_fieldset_funcion’ => NULL,
    ‘fecha_fin_real’ => ‘2010-12-02’,
    ‘observaciones_baja’ => ‘ESTO ES UNA PRUEBA’,
    ‘ini_fieldset_materia’ => NULL,
    ‘id_facultad_carrera’ => NULL,
    ‘id_carrera_materia’ => NULL,
    ‘id_materia_dictado’ => NULL,
    ‘fin_fieldset_materia’ => NULL,
    ‘id_docente’ => 28,
    ‘vigente’ => false,
    )

  6. componente(2509): dt_docentes_funciones El registro tiene una estructura incorrecta: El campo ‘ini_fieldset_funcion’ no forma parte de la DEFINICION.

  7. componente(2509): dt_docentes_funciones El registro tiene una estructura incorrecta: El campo ‘id_funcion_area’ no forma parte de la DEFINICION.

  8. componente(2509): dt_docentes_funciones El registro tiene una estructura incorrecta: El campo ‘fin_fieldset_funcion’ no forma parte de la DEFINICION.

  9. componente(2509): dt_docentes_funciones El registro tiene una estructura incorrecta: El campo ‘ini_fieldset_materia’ no forma parte de la DEFINICION.

  10. componente(2509): dt_docentes_funciones El registro tiene una estructura incorrecta: El campo ‘id_facultad_carrera’ no forma parte de la DEFINICION.

  11. componente(2509): dt_docentes_funciones El registro tiene una estructura incorrecta: El campo ‘id_carrera_materia’ no forma parte de la DEFINICION.

  12. componente(2509): dt_docentes_funciones El registro tiene una estructura incorrecta: El campo ‘fin_fieldset_materia’ no forma parte de la DEFINICION.

  13. TABLA: [docentes_funciones]

    Nuevo cursor ‘0’ en reemplazo del anterior ‘’

  14. AP_TABLA: [docentes_funciones]

    Inicio SINCRONIZAR

  15. ************ ABRIR transaccion (upso@localhost) ****************

  16. AP_TABLA: [docentes_funciones]

    registro: 0 - INSERT INTO docentes_funciones ( fecha_fin_original, fecha_fin_real, fecha_inicio, id_docente, id_funcion_tipo, id_materia_dictado, id_ordenanza, observaciones_baja, vigente )
    VALUES (‘2011-06-10’, ‘2010-12-02’, ‘2010-06-11’, ‘28’, ‘1’, DEFAULT, ‘4’, ‘ESTO ES UNA PRUEBA’, ‘’);

  17. Abortando transacción en docentes

  18. ************ ABORTAR transaccion (upso@localhost) ****************

  19. Relanzando excepción. exception ‘toba_error_db’ with message 'SQLSTATE[22P02]: Invalid text representation: 7 ERROR: la sintaxis de entrada no es válida para tipo boolean: «»

    LINE 2: …-06-11’, ‘28’, ‘1’, DEFAULT, ‘4’, ‘ESTO ES UNA PRUEBA’, ‘’);
    ^’ in C:\toba_1.4\php\lib\db\toba_db.php:497
    Stack trace:
    #0 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(727): toba_db->sentencia_ejecutar(0)
    #1 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(905): toba_ap_tabla_db->ejecutar_sql(‘INSERT INTO doc…’)
    #2 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(513): toba_ap_tabla_db->ejecutar_sql_insert(0)
    #3 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(467): toba_ap_tabla_db->insertar_registro_db(0)
    #4 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(409): toba_ap_tabla_db->sincronizar_insertados(Array)
    #5 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_datos_tabla.php(1522): toba_ap_tabla_db->sincronizar()
    #6 C:\toba_1.4\proyectos\docentes\php\docentes_cargos_funciones_historicos\ci_docentes_cf_hist_edicion.php(279): toba_datos_tabla->sincronizar()
    #7 C:\toba_1.4\proyectos\docentes\php\docentes_cargos_funciones_historicos\ci_docentes_cf_hist_edicion.php(236): ci_docentes_cf_hist_edicion->funciones_aceptar_datos(Array)
    #8 [internal function]: ci_docentes_cf_hist_edicion->evt__funciones_formulario__nuevo(Array)
    #9 C:\toba_1.4\php\nucleo\componentes\interface\toba_ci.php(321): call_user_func_array(Array, Array)
    #10 [internal function]: toba_ci->registrar_evento(‘funciones_formu…’, ‘nuevo’, Array)
    #11 C:\toba_1.4\php\nucleo\componentes\interface\toba_ei.php(278): call_user_func_array(Array, Array)
    #12 C:\toba_1.4\php\nucleo\componentes\interface\toba_ei_formulario.php(309): toba_ei->reportar_evento(‘nuevo’, Array)
    #13 C:\toba_1.4\php\nucleo\componentes\interface\toba_ci.php(201): toba_ei_formulario->disparar_eventos()
    #14 C:\toba_1.4\php\nucleo\componentes\interface\toba_ci.php(201): toba_ci->disparar_eventos()
    #15 C:\toba_1.4\php\nucleo\toba_solicitud_web.php(127): toba_ci->disparar_eventos()
    #16 C:\toba_1.4\php\nucleo\toba_solicitud_web.php(45): toba_solicitud_web->procesar_eventos()
    #17 C:\toba_1.4\php\nucleo\toba_nucleo.php(54): toba_solicitud_web->procesar()
    #18 C:\toba_1.4\proyectos\docentes\www\aplicacion.php(25): toba_nucleo->acceso_web()
    #19 {main}

  20. toba_error_db: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: la sintaxis de entrada no es válida para tipo boolean: «» LINE 2: …-06-11’, ‘28’, ‘1’, DEFAULT, ‘4’, ‘ESTO ES UNA PRUEBA’, ‘’); ^ [trAZA]exception ‘toba_error_db’ with message ‘SQLSTATE[22P02]: Invalid text representation: 7 ERROR: la sintaxis de entrada no es válida para tipo boolean: «» LINE 2: …-06-11’, ‘28’, ‘1’, DEFAULT, ‘4’, ‘ESTO ES UNA PRUEBA’, ‘’); ^’ in C:\toba_1.4\php\lib\db\toba_db.php:497 Stack trace: #0 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(727): toba_db->sentencia_ejecutar(0) #1 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(905): toba_ap_tabla_db->ejecutar_sql(‘INSERT INTO doc…’) #2 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(513): toba_ap_tabla_db->ejecutar_sql_insert(0) #3 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(467): toba_ap_tabla_db->insertar_registro_db(0) #4 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_ap_tabla_db.php(409): toba_ap_tabla_db->sincronizar_insertados(Array) #5 C:\toba_1.4\php\nucleo\componentes\persistencia\toba_datos_tabla.php(1522): toba_ap_tabla_db->sincronizar() #6 C:\toba_1.4\proyectos\docentes\php\docentes_cargos_funciones_historicos\ci_docentes_cf_hist_edicion.php(279): toba_datos_tabla->sincronizar() #7 C:\toba_1.4\proyectos\docentes\php\docentes_cargos_funciones_historicos\ci_docentes_cf_hist_edicion.php(236): ci_docentes_cf_hist_edicion->funciones_aceptar_datos(Array) #8 [internal function]: ci_docentes_cf_hist_edicion->evt__funciones_formulario__nuevo(Array) #9 C:\toba_1.4\php\nucleo\componentes\interface\toba_ci.php(321): call_user_func_array(Array, Array) #10 [internal function]: toba_ci->registrar_evento(‘funciones_formu…’, ‘nuevo’, Array) #11 C:\toba_1.4\php\nucleo\componentes\interface\toba_ei.php(278): call_user_func_array(Array, Array) #12 C:\toba_1.4\php\nucleo\componentes\interface\toba_ei_formulario.php(309): toba_ei->reportar_evento(‘nuevo’, Array) #13 C:\toba_1.4\php\nucleo\componentes\interface\toba_ci.php(201): toba_ei_formulario->disparar_eventos() #14 C:\toba_1.4\php\nucleo\componentes\interface\toba_ci.php(201): toba_ci->disparar_eventos() #15 C:\toba_1.4\php\nucleo\toba_solicitud_web.php(127): toba_ci->disparar_eventos() #16 C:\toba_1.4\php\nucleo\toba_solicitud_web.php(45): toba_solicitud_web->procesar_eventos() #17 C:\toba_1.4\php\nucleo\toba_nucleo.php(54): toba_solicitud_web->procesar() #18 C:\toba_1.4\proyectos\docentes\www\aplicacion.php(25): toba_nucleo->acceso_web() #19 {main}

  21. Mensaje a usuario: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: la sintaxis de entrada no es válida para tipo boolean: «»

    LINE 2: …-06-11’, ‘28’, ‘1’, DEFAULT, ‘4’, ‘ESTO ES UNA PRUEBA’, ‘’);
    ^

  22. Configurando dependencias para responder al servicio…

  23. componente(2810): Pantalla de servicio: ‘edicion’

  24. componente(2810): [ callback ] ‘conf__edicion’ no fue atrapado

  25. componente(2807): Pantalla de servicio: ‘funciones’

  26. componente(2807): [ callback ] ‘conf__funciones’ no fue atrapado

  27. componente(2807): [ callback ] ‘conf__funciones_cuadro’

  28. componente(2807): [ callback ] ‘conf__funciones_formulario’

  29. Se filtro el evento: modificacion

  30. Se filtro el evento: eliminar

  31. Se filtro el evento: cancelar

  32. componente(2810): [ callback ] ‘conf__ci_docentes_cf_hist_edicion’ no fue atrapado

  33. Respondiendo al servicio__generar_html…

Es un ingreso de un nuevo dato… con el evento nuevo según el siguiente código:


<?php...
	function evt__funciones_formulario__nuevo($datos)
	{
		$this->funciones_aceptar_datos($datos);
	}

	function evt__funciones_formulario__eliminar()
	{
		$this->dep('docentes_funciones')->eliminar_todo();
		$this->funciones_resetear();
	}

	function evt__funciones_formulario__modificacion($datos)
	{
		$this->funciones_aceptar_datos($datos);
	}

	function evt__funciones_formulario__cancelar()
	{
		$this->funciones_resetear();
	}
	
	function funciones_resetear()
	{
		$this->dep('docentes_funciones')->resetear();
	}

	function funciones_aceptar_datos($datos)
	{
		$datos['id_docente'] = $this->s__id_docente;
		$datos['vigente']    = false;
		toba::logger()->debug('MIRAR $DATOS');
		toba::logger()->var_dump($datos);
		$this->dep('docentes_funciones')->set($datos);
		$this->dep('docentes_funciones')->sincronizar();
		$this->funciones_resetear();
	}	

Cabe aclara que el evento vigente tiene valor por defecto 0, pero está desactivado en el formulario.
Probé haciendo $datos[‘vigente’] = false… y $this->dep(‘docentes_funciones’)->set_columna_valor(‘vigente’, false)… y tampoco funcionó.

Mil gracias de antemano?

Probablemente sirva aclarar, que el mismo código con vigente = true por defecto, funciona sin problemas, y funciona si fuerzo el valor 0 (false), pero no lo hace si lo pongo por defecto en el formulario.

Martin dos consultas,

  • Cual es el tipo del campo ‘vigente’ en la base de datos?.. es un boolean o un smallint?

  • Cual es el tipo que tiene definido el datos_tabla para dicha columna?. Logico, Binario o Entero?

Saludos

En la tabla el campo es booleano.
Y en el datos_tabla es logical.

Para mi, el problema está en el set($datos) antes de sincronizar… por algún motivo lo convierte en “” en lugar de mantener el valor FALSO.
Yo opero sobre los datos en forma previa, por ello muestro $datos luego de operar, pero el valor sigue siendo false (recorro el array $datos y pongo todo en mayúsculas si es una string).

XD Es lo que me temia :stuck_out_tongue:

Los campos de tipo boolean no tienen soporte en toba aun (de hecho creo que no son estandar para todos los motores), generalmente nosotros los representamos como smallint not null default 0, creo que ese es el problema, lamentablemente no se terminaron de implementar todos los tipos de dato y entonces surgen estas situaciones, es una de las cuentas pendientes que tenemos.

Saludos

Ok… entonces tenemos que tener en cuenta esto y listo.
En lugar de setear false, pondremos 0 y listo… postgre lo reconoce como false.
Gracias mil!