Reporte con campos binary data

Victor Nuñez
2011-03-24
2013-03-07
  • Victor Nuñez
    Victor Nuñez
    2011-03-24

    Buenas tardes comunidad, estoy generando un reporte con ireport (3.7.6) de los trabajadores de la empresa, en este reporte debe ir una foto, la cual esta guardada en un campo tipo binarydata (BD postgres 8.3) en la tabla ad_image, tengo una vista la cual hace referencia a los datos del trabajador y de la imagen, pero en el reporte no he podido asociarlo al tipo de datos que me permita ver la imagen, tambien he tratado de generar el reporte dentro de Adempiere a traves de formato de impresion y luego con informe y  proceso, pero aca me da despliega una pantalla de error que dice "error de carga" y el log me indica:

    13:51:41.361 ADialog.error: LoadError - null
    13:52:23.301 AMenu.propertyChange: 1000157 - Carnet Invepal
    13:52:23.307 ProcessDialog.<init>: Process=1000039; SOTrx=false
    13:52:24.269 MRole.get: AD_Role_ID=1000004, AD_User_ID=100, reload=false
    13:52:24.289 Trx.commit: **** POSave_4ba94646-72fc-421a-986a-410cb4b02617
    13:52:24.306 ReportCtl.start: start - ProcessInfo
    13:52:24.320 MQuery.get: AD_PInstance_ID=1004327, TableName=RV_Zresma_Carnet
    13:52:24.322 ReportEngine.<init>: MPrintFormat,Items=6] - MQuery
    13:52:24.324 DataEngine.getPrintDataInfo: RV_Zresma_Carnet - es_VE
    13:52:25.012 DataEngine.loadPrintData: Rows=1 - ms=688
    13:52:25.022 Viewer.<init>: 
    13:52:25.022 LayoutEngine.<init>: MPrintFormat,Items=6] - PrintData - MQuery
    13:52:25.036 LayoutEngine.layoutTable: Carnet Invepal - RV_Zresma_Carnet
    -------> MIssue.set_ValueNoCheck: ReleaseNo - Value too long - truncated to length=4
    13:52:25.141 Trx.commit: **** POSave_a4ab5005-6715-4c73-9dbf-27f82a88676d
    ===========> Viewer.<init>: 
    java.lang.NullPointerException
    at org.compiere.print.CPaper.toString(CPaper.java:371)
    at org.compiere.print.Viewer.revalidate(Viewer.java:477)
    at org.compiere.print.Viewer.dynInit(Viewer.java:409)
    at org.compiere.print.Viewer.<init>(Viewer.java:167)
    at org.compiere.print.Viewer.<init>(Viewer.java:141)
    at org.compiere.print.SwingViewerProvider.openViewer(SwingViewerProvider.java:32)
    at org.compiere.print.ReportCtl.preview(ReportCtl.java:437)
    at org.compiere.print.ReportCtl.createOutput(ReportCtl.java:421)
    at org.compiere.print.ReportCtl.startStandardReport(ReportCtl.java:208)
    at org.compiere.print.ReportCtl.start(ReportCtl.java:151)
    at org.compiere.print.ReportCtl.start(ReportCtl.java:98)
    at org.compiere.apps.ProcessCtl.run(ProcessCtl.java:441)

    Sigo intentando resolver el problema, pero si alguien tiene alguna idea se los agradacere

    Saludos

    Victor Nuñez

     
  • Carlos Ruiz
    Carlos Ruiz
    2011-03-25

    Hola Víctor, qué versión de Adempiere estás usando?

    Saludos,

    Carlos Ruiz

     
  • Victor Nuñez
    Victor Nuñez
    2011-03-28

    Carlos, gracias nuevamente por tu preocupacion, te comento que la version de Adempire que estamos adecuando es las 360LTS, la version de ireport es la 3.7.6 y que ademas ya solucione el problema de la imagen, la solucion la documento a continuacion

    1.- En ireport defini una imagen usando la paleta de ireport, le asocie cualquier imagen de mi computador
    2.-  Luego modifique image expresion por "new java.io.ByteArrayInputStream ($F{nombre_campo_imagen})"
    3.- Luego modifique Expresion Class de la imagen por "java.io.InputStream"
    y problema resuelto,

    Nuevamente te agradezco la preocupación, esta respuesta es la primera ayuda que puedo entregar a la comunidad, espero les sirva a todos.

    Saludos

    Victor Nuñez

     
  • Carlos Ruiz
    Carlos Ruiz
    2011-03-28

    Perfecto Víctor, que bueno que hayas resuelto tu problema - mi pregunta respecto a la versión es debido que hace unos 5 meses encontré y corregí un problema con el despliegue de imágenes de la base de datos en reportes Jasper en la versión 360.

    Esto fue corregido con la revisión 5876 y está integrado en los patches que globalqss libera para la versión 360
    http://kenai.com/projects/adempiere361/sources/adempiere361/revision/5876

    Este problema lo encontré usando la clase MImage, quizás la forma diferente en que lo resolviste (utilizando ByteArrayInputStream) no te presente este problema.

    Saludos,

    Carlos Ruiz

     
  • Victor Nuñez
    Victor Nuñez
    2011-08-16

    Carlos,  gracias por tus respuestas, cuando escribí la solución al problema que tuve los reportes estaban definidos para lenguaje groovy, pero como ahora queremos que que estos reportes funcionen también en el componente web de Adempiere tuvimos que cambiar los reportes a lenguaje java, y la solución cambia un poco con respecto a la origina y justamente vimos la solución mirando la corrección que me indicas, ahora seguimos usando ByteArrayInputStream, pero le agregamos un cast del campo bytea a byte

    en resumen la solucion fue definir :
    Image Expression: new java.io.ByteArrayInputStream ((byte)$F{binarydata})
    Expression Class: java.io.InputStream

    Espero que esto sirva a alguien mas.

    Saludos,

    Victor Nuñez

     
  • Ignacio Lanzagorta
    Ignacio Lanzagorta
    2012-07-17

    Hola Víctor.

    Traté de implementar la solución que propones en ireport.
    también obtengo el campo  binarydata de ad_image
    yo estoy utilizando jasper 3.7.4 y postgresql 9.0.7
    el field los definí del tipo Object
    y la imagen tal como tú la propones.

    el error que recibo es :

    Error exporting print… Image read failed.
    net.sf.jasperreports.engine.JRException: Image read failed.      at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73)      at net.sf.jasperreports.engine.util.JRImageLoader.loadImage(JRImageLoader.java:245)      at net.sf.jasperreports.engine.JRImageRenderer.getImage(JRImageRenderer.java:476)      at net.sf.jasperreports.engine.JRImageRenderer.getDimension(JRImageRenderer.java:512)      at net.sf.jasperreports.engine.JRImageRenderer.getOnErrorRendererForDimension(JRImageRenderer.java:378)      at net.sf.jasperreports.engine.export.ooxml.JRDocxExporter.exportImage(JRDocxExporter.java:809)      at net.sf.jasperreports.engine.export.ooxml.JRDocxExporter.exportGrid(JRDocxExporter.java:553)      at net.sf.jasperreports.engine.export.ooxml.JRDocxExporter.exportPage(JRDocxExporter.java:443)      at net.sf.jasperreports.engine.export.ooxml.JRDocxExporter.exportReportToStream(JRDocxExporter.java:359)      at net.sf.jasperreports.engine.export.ooxml.JRDocxExporter.exportReport(JRDocxExporter.java:255)      at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:1156)      at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)      at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)

    ..Saludos
    Ignacio Lanzagorta

     
  • Helio Gutierrez
    Helio Gutierrez
    2012-07-18

    Yo tambien necesito mostrar una imagen de un campo binario, y segui los pasos que propuso victor:

    "1.- En ireport defini una imagen usando la paleta de ireport, le asocie cualquier imagen de mi computador
    2.-  Luego modifique image expresion por "new java.io.ByteArrayInputStream ($F{nombre_campo_imagen})"
    3.- Luego modifique Expresion Class de la imagen por "java.io.InputStream"
    y problema resuelto"

    Pero en mi iReport al darle preview si compila y muestra el reporte, pero al darle "scroll" hacia abajo para ver mi imagen, en donde inicia la imagen me dice "Error mostrando la pagina del reporte, Vea la consola por detalles"  y pone toda la pagina en blanco.

    Pero la consola no muestra ningun error ni de compilacion.

    Estoy usando iReport 3.7.3 y Adempiere 360

    Alguien ha podido mostrar la imagen en iReport?

    Saludos

     
  • John Agudelo
    John Agudelo
    2012-07-18

    Haganlo de la siguiente forma:
    1. Busquen el field en el reporte y cambie la propiedad Field class a  java.io.InputStream
    2. Agreguen un control de image y cambien la propiedad Expression class a java.io.InputStream

    Saludos

    John Agudelo
    www.osgroup.co

     
  • John Agudelo
    John Agudelo
    2012-07-18

    Se me olvido decirles que en la propieda Image Expresión del control Image solo debe estar $F{nombre_campo_imagen}

    Saludos

    John Agudelo
    www.osgroup.co

     
  • Ignacio Lanzagorta
    Ignacio Lanzagorta
    2012-07-18

    Helio:

    El error te debe aparecer en la ventana donde muestra los datos de compilación, un truco que yo estoy usando es a la imagen, en sus propiedades en Error Type, ponerle Blank, con este sigue ejecutando el reporte pero te pone un recuadro blanco en donde va la imagen.

    John, hice lo que recomendaste y me arroja el mismo error en ireport, no lo he probado desde Adempiere, sigo en ireport usan el botón de Preview. Pero supongo que fallará igual.

    El error es…
    net.sf.jasperreports.engine.JRException: Image read failed.      at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73)      at net.sf.jasperreports.engine.util.JRImageLoader.loadImage(JRImageLoader.java:245)      at net.sf.jasperreports.engine.JRImageRenderer.getImage(JRImageRenderer.java:476)      at net.sf.jasperreports.engine.JRImageRenderer.getOnErrorRendererForImage(JRImageRenderer.java:429)      at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1298)      at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:773)      at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:737)      at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:615)      at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:384)      at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:1156)      at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)      at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) 

    …Saludos
    Ignacio Lanzagorta

     
  • Ignacio Lanzagorta
    Ignacio Lanzagorta
    2012-07-18

    Helio:

    Hice la prueba desde Adempiere y funciona, al parecer el problema es de iReport al exportar a .PDF o .docx.

    Incluso probé ambos escenearios.

    El del Helio:
    Field (el que es bytea) ->Edit Field Class -> java.io.InputStream

    En la imagen
      Expresion Class -> java.io.InputStream
    Image Expression -> $F{FIELD}

    y el caso de Víctor
    Field (el que es bytea) ->Edit Field Class -->Object

    En la imagen
      Expresion Class -> java.io.InputStream
    Image Expression -> new java.io.ByteArrayInputStream ((byte)$F{FIELD})

    En ambos casos, marqué los atributos using Cahce y es Lazy de la imgen.
    y ambos me dan error en iReport y funcionan desde Adempiere,
    Les comento que yo utilizo 3.7.4 iReport, quizá una versión posterior resuelva esto

    En adempiere en el attach del reporte pongo el .jasper (el compilado)

    …Saludos

     
  • Helio Gutierrez
    Helio Gutierrez
    2012-07-18

    Que tal Ignacio muchas gracias por tu sugerencia…

    fijate que hice la prueba en Adempiere y le puse la validacion en el iReport de que si habia error muestre un icono, y no truena en Adempiere pero no me muestra mi imagen algo no decodifica de este dato.

    Ya use ambas opciones :(

    Tambien puse el jrxml dado que adempiere lo compila pero tampoco hay resultados…

    mi imagen es un codigo bidimensional pero segun esta en PNG

    si consulto la columna por query se ve asi:

    \211PNG\015\012\032\012\000\000\000\015IHDR\…..

    y si exporto el registro se ve asi:

    \x89504e470d0a1a0a0000000d4948445200000078000000780802000000b606a185000002d84944415478daed9bc16ec3300c43f3ff3fbd5d070c094452766ce7e954145d97bcc09444a9d70f31252e100…..

    Estare mal desde como guardo el dato?

    Saludos!

     
  • Helio Gutierrez
    Helio Gutierrez
    2012-07-22

    Para no debar abierto el tema lo resolvi de la siguiente manera:

    Encontre que la imagen me llega en base64 por lo que intentamos cambiando el field en la base de datos a tipo Text (es postgresql) y en el ireport de esta manera:

    Se agrego en el iReport 3.7.3

    en el ClassPath ->  Adempiere/lib/Adempiere.jar

    Field (el que es text) ->Edit Field Class -> java.lang.String

    En la imagen
      Expresion Class -> java.io.InputStream
    Image Expression -> new ByteArrayInputStream(org.adempiere.util.Base64Coder.decode($F{FIELD}))

    Con esto le digo que saque el texto del campo y lo decodifique en base64 para mostrarlo en la imagen y ya pude mostrarlo.

    Espero le sirva a alguno que tuviera mi problema.

    Saludos!