UpdateBlob

Hola!
En la operación de emitir certificado de Alumno Regular, se genera el PDF y se graba en la base de datos (a través de un UpdateBlob) y luego se recupera ese pdf guardado y se muestra por pantalla.

     Como se manejan en G3W2 los update de los tipos de datos Blob? 

Saludos!
Flavia

Hola Flavia, fíjate con esto http://www-01.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.sqls.doc/ids_sqs_1526.htm

vas a ver que abajo hay documentación de como convertir un archivo en BLOB para poder hacer un INSERT (en el UPDATE debe ser lo mismo).

saludos, Leonel.

Leonel, subí a colab el código para que veas el avance, pero intenté con eso y me da error de informix -9632.
Es que no coinciden los tipos (columna/valor), pero la columna es byte.
Nosotros nos conectamos mediante pdo. Será que no soporta esa sentencia?

Saldos,
Flavia

Para los campos byte/text en informix, los datos de estas columnas se recuperan con la sentencia:

 SELECTBLOB campo_blob INTO ... FROM...

Y se actualizan con la sentencia:

UPDATEBLOB tabla SET campo_blob = var_blob ....

En este otro tema del foro se estuvo discutiendo este problema de los campos blob: http://foro.comunidad.siu.edu.ar/index.php?topic=3162.msg11846

Hola Flavia, proba con lo que te paso Ale Delú, y si no te llega a funcionar con eso acá encontré otra posible solución:

lo que tenes que hacer es donde haces la query obtener el objeto PDO:

$pdo = kernel::db()->conexion();

luego haces un prepare de la query:

$q = $pdo->prepare("INSERT INTO books (title,author,cover) values(?,?,?)");

Nota: “books” es una tabla de ejemplo, cuya columna “cover” es de tipo blob.

luego al hacer el bindParam (vinculación) del valor de la columna “cover” le decimos que es del tipo \PDO::PARAM_LOB:


$q->bindParam(1, $title);
$q->bindParam(2, $author);
$q->bindParam(3, $cover, \PDO::PARAM_LOB);

$q->execute();

la variable $cover seria el contenido del pdf que puede ser una cadena de texto o el contenido del archivo pdf:

$cover = fopen('certificado_alumno_regular.pdf','rb');

El ejemplo completo quedaría algo así:


$title = "Titulo Prueba";
$author = "Leonel";
$cover = fopen('certificado_alumno_regular.pdf','rb');

$pdo = kernel::db()->conexion();
$q = $pdo->prepare("INSERT INTO books (title,author,cover) values(?,?,?)");
$q->bindParam(1, $title);
$q->bindParam(2, $author);
$q->bindParam(3, $cover, \PDO::PARAM_LOB);

$q->execute();

Dejo un par de referencias:

http://php.net/manual/es/pdo.lobs.php
http://www.phpeveryday.com/articles/PDO-Working-With-BLOBs-P554.html
http://books.google.com.ar/books?id=eprEAgAAQBAJ&pg=PA318&lpg=PA318&dq=php+pdo+update+blob+informix&source=bl&ots=6UrgeRhv12&sig=akBSpmA1ICF38tnkBrHAtL3XnAg&hl=es&sa=X&ei=gMs_VInOIYvAggSIuIF4&ved=0CB4Q6AEwAA#v=onepage&q=php%20pdo%20update%20blob%20informix&f=false

cualquier cosa avísame.

saludos, Leonel.

Muchas gracias Leonel, esta solución funcionó perfectamente, ya se guarda el campo Blob en la BD.
Ahora el problema está en el SELECT para recuperarlo y mostrarlo.

Tengo un sp que recupera el campo:


$sql = "execute procedure sp_u810_cert_areg({$parametros['nro_certificado']})";
$datos = kernel::db()->consultar($sql, db::FETCH_NUM);
return $datos;

O haciéndolo en base a las referencias que me pasaste, igual al UPDATE


$pdo = kernel::db()->conexion();
$q = $pdo->query("SELECT cert_emitido FROM u810_cert_emitidos  WHERE nro_certificado= {$parametros['nro_certificado']}");
$datos=$q->fetch(\PDO::FETCH_NUM);
return $datos;

Y de ambas formas obtengo el recurso pero cuando quiero ponerlas en un archivo o header para mostrar el pdf me dice que el recurso es vacío. Como debería mostrarlo? Estaba probando así:


$tempfile= "/tmp/cert_aux.pdf";
file_put_contents($tempfile, $datos[0] );
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="'.$tempfile.'"');
readfile($tempfile);

Saludos,
Flavia

Hola Flavia, para recuperarlo tendrías que hacer lo siguiente:


$pdo = kernel::db()->conexion();
$sentencia = $pdo->prepare("SELECT cert_emitido FROM u810_cert_emitidos WHERE nro_certificado = ?");
$sentencia->execute(array($parametros['nro_certificado']));
$sentencia->bindColumn(1, $pdf, \PDO::PARAM_LOB);
$sentencia->fetch(\PDO::FETCH_BOUND);

header('Content-type: application/pdf');
fpassthru($pdf);
exit;

proba con eso y cualquier cosa decime.

saludo, Leonel.

Leonel, el problema creo que está en el formato que lo guarda.
Con esto puedo recuperar campos blob viejos guardados en la base, pero no los nuevos que se generan ahora.
Yo estoy guardando lo que me devuelve el return $this->instancia->Output(); Estará mal eso?

Saludos!
Flavia

Hola Flavia, me parece que no es

$this->instancia->Output();

sino

$this->instancia->ezOutput();

.

Otra cosa que observe y deberías modificar es la clase src/siu/operaciones/_comun/operaciones/reporte/generador_pdf.php, la cual es la clase padre de la que vos esta personalizando, deberías poner todas las propiedades/atributos en protected, sino no vas a poder heredar y usar dichas propiedades en la clase hija (la que vos estas personalizando src/pers/cordoba/operaciones/_comun/operaciones/reporte/generador_pdf.php). Esto ya fue solucionado para las próximas versiones de G3W2.

proba con eso y cualquier cosa decime.

acá te dejo la documentación de la librería del PDF: http://pubsvn.ez.no/doxygen/4.0/html/classCezpdf.html

saludo, Leonel.

Leonel, al final la grabación funcionó con:

$this->instancia->Output();

Lo que hicimos fue grabar el output en un archivo temporal, grabarlo en la base desde ese archivo y luego recuperarlo de la base.
Gracias por tu ayuda.
Saludos,
Flavia

Perfecto Flavia, ni bien lo terminen y vean que esta funcionando bien lo suben al colab, y me pasan todos los scripts sql que habría que correrle a la base de datos.

saludos, Leonel.

Leonel, ya subimos a colab todo lo del certificado de alumno regular (la emisión y el validador).
También agregamos las librerías Barcode y Config de Zend en la carpeta \src\siu\lib\Zend.
Te mando por mail los scripts que hay que correr en la base.

Gracias por la ayuda!!
Flavia