7 de mayo de 2016

Como imprimir campos BLOB de manera sencilla

Recientemente tuve que desarrollar un sistema del tipo medico, y en los requerimentos habia la necesidad de incorporar hasta 20 fotografias del paciente. Para el caso, use una tabla con campos BLOB que me ha parecido bastante practico de incorporar las imagenes. Anteriormente en otros proyectos los he usado y hasta la fecha he comprobado que son mas estables que los campos general.

Sin embargo, estas imagenes tambien tenian que ser impresas por lo que me di a la tarea de buscar como.

El problema era que el Report Writer no acepta campos BLOB, acepta campos GENERAL y FILE (imagenes en la ruta especifica). De manera que no habia forma de imprimirlas.

Como siempre, mi primer referencia es portalfox.com, ya que habia leido unos articulos de Cesar Ch. y de Calvin Hsia, asi como una referencia en MSDN. Sus ejemplos son excelentes, y su codigo muy bueno, sin embargo a la 1:30 de la madrugrada no me daba para mas, asi que en un arranque de inspiracion, hice algo mas simple...

  1. Abri la tabla con los campos blob
  2. Use la fucion STRTOFILE y converti el valor de los campos de nuevo en imagenes reales.
  3. Una vez hecho esto las tome al reporte y funciono.

El siguiente codigo muestra como se procesa. Este codigo va dentro de un boton de comando puesto dentro de la pestana que se muestran las fotos.

* Procedimiento para imprimir el las fotos como miniaturas
* Como estamos posicionados en el registro del paciente no necesitamos movernos a ninguna parte.
* Debemos convertir cada foto en una jpg independiente y grabarla al disco para despues 
* tomarla desde el reporte. En caso de que no exita foto, debemos poner una imagen generica...
*
* Eliminar las fotos anteriores creadas
ERASE photo1.jpg
ERASE photo2.jpg
ERASE photo3.jpg
ERASE photo4.jpg
ERASE photo5.jpg
ERASE photo6.jpg
ERASE photo7.jpg
ERASE photo8.jpg
ERASE photo9.jpg

backImage = 'noid.jpg'

* Convertir fotos a jpg de nuevo ya que estan en campos blob (caracteres o binarios)
lbFoto1 = IIF(EMPTY(photo1), 'noid.jpg', STRTOFILE(pacfotos.photo1, 'photo1.jpg'))
lbFoto2 = IIF(EMPTY(photo2), 'noid.jpg', STRTOFILE(pacfotos.photo2, 'photo2.jpg'))
lbFoto3 = IIF(EMPTY(photo3), 'noid.jpg', STRTOFILE(pacfotos.photo3, 'photo3.jpg'))
lbFoto4 = IIF(EMPTY(photo4), 'noid.jpg', STRTOFILE(pacfotos.photo4, 'photo4.jpg'))
lbFoto5 = IIF(EMPTY(photo5), 'noid.jpg', STRTOFILE(pacfotos.photo5, 'photo5.jpg'))
lbFoto6 = IIF(EMPTY(photo6), 'noid.jpg', STRTOFILE(pacfotos.photo6, 'photo6.jpg'))
lbFoto7 = IIF(EMPTY(photo7), 'noid.jpg', STRTOFILE(pacfotos.photo7, 'photo7.jpg'))
lbFoto8 = IIF(EMPTY(photo8), 'noid.jpg', STRTOFILE(pacfotos.photo8, 'photo8.jpg'))
lbFoto9 = IIF(EMPTY(photo9), 'noid.jpg', STRTOFILE(pacfotos.photo9, 'photo9.jpg'))

* Sin embargo dentro del reporte se vuelven a poner estas variable detectando si se 
* creo el archivo de manera correcta, para poder visualizarlo
REPORT FORM pacrepfotos NEXT 1 TO PRINTER PROMPT PREVIEW

Ahora, habria que hacer el reporte. Para ello, primero se declararon unas variables dentro de la seccion variables del reporte:

Basicamente en el valor a almacenar se puso la siguiente instruccion:

IIF( FILE('photo1.jpg'),'photo1.jpg','noid.jpg')

Luego, en el reporte, se hicieron las inscrustaciones del objeto OLE (imagen) para verlas asi:

Y en las propiedades:

Usamos la variable declarada anteriormente.

De esta forma es muy facil imprimir cualquier foto, ya que algunas veces no se toman todas las fotos (en el reporte se imprimen 9 a la vez), y si solamente fueron 7 u 8 las que se tienen almacenadas el resto quedan vacias.

Hacer esto, me tomo un poco de menos de media hora y pude irme a dormir tranquilo.

Para finalizar, he aqui las pantallas de como se ve ejecutandose...

Sergio Hugo Sanchez

1 comentario :

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.