Imprimir reporte con imagen (campo general, cursor resultado de una consultaMySql) VFP9

4,009 views
Skip to first unread message

Juan Pablo Carrasco M.

unread,
Apr 26, 2013, 12:39:10 PM4/26/13
to publice...@googlegroups.com
Estimado foro,

Estoy terminando de diseñar un reporte y solo me falta incluir una imagen con el logo de la Empresa que corresponda.

La tabla es MySql, y el cursor es producto del resultado de una consulta a este motor de bd.

El caso es que el campo generado es tipo Gen (en minuscula para los vacios, gen) y no Memo como recomiendan los expertos VFP.

La reporte el agregue un objeto Image/OLE Bound, con las siguientes propiedades:

General->Control Source Type->Expression or variable name
General->Control Source->Empresa.LogoEmpresa
General->If source and frame are differents size->Clip contents
Gereral->Object position->Flx relative to top on band

Al ejecutar el informe informa de inmedito el siguiente error:

"Operacion no es valida para un campo tipo General"

Por vuestra ayuda muchas gracias,

Víctor Hugo Espínola Domínguez

unread,
Apr 26, 2013, 9:11:14 PM4/26/13
to publicesvfoxpro
Hola Juan Pablo

>General->Control Source Type->Expression or variable name
>General->Control Source->Empresa.LogoEmpresa

Empresa,LogoEmpresa debe contener el nombre del archivo de imagen que quieres imprimir.

Necesariamente debes conocer o mejor aún tener guardado el tipo de archivo de la imagen (bmp, jpg, etc...) , luego debes crear un archivo temporal en algún lugar y ese nombre es el que tiene que estar en Empresa.LogoEmpresa.

Si tienes necesidad de imprimir un gráfico por cada registro, te puedo pasar un ejemplo. Para lo que ahora necesitas puedes mirar este enlace: http://www.scribd.com/doc/28575450/vfp-03-como-imprimir-campos-blob-de-manera-sencilla

Saludos,
Víctor.

ZeRoberto

unread,
Apr 26, 2013, 10:05:22 PM4/26/13
to publicesvfoxpro
Los expertos dijeron que tienes que castearlo a BLOB, pero ahun no lo he probado

CAST(Campogen AS BLOB)

Víctor Hugo Espínola Domínguez

unread,
Apr 26, 2013, 10:19:25 PM4/26/13
to publicesvfoxpro
Hola ZeRoberto

BLOB no está permitido en el control picture del report, debe ser tipo general.

Saludos,
Víctor.

ZeRoberto

unread,
Apr 26, 2013, 10:20:37 PM4/26/13
to publicesvfoxpro
Jeje como dije, no lo probé.

Gracias por la aclaración Víctor Hugo

Saludos

Víctor Hugo Espínola Domínguez

unread,
Apr 26, 2013, 10:58:57 PM4/26/13
to publicesvfoxpro

Malenkov

unread,
Apr 27, 2013, 2:06:40 PM4/27/13
to publice...@googlegroups.com

Para poder imprimir el Blob, hay que primero convertirlo a un archivo JPG para ello hay que utilizar el strtofile(), y en el reporte pones insertas un objeto OLE y pones el nombre del objeto, adjunto te envío el código del botón que utilizo para imprimir los documentos del archivo de personal que tengo en Mysql, cabe señalar que para hacer la recuperación de los datos utilizó un cursoradapter

 

SET SAFETY OFF

STRTOFILE(documentos.imagen,"documento.jpg",0)

 

REPORT FORM documento NEXT 1 TO PRINTER PREVIEW

 

Espero te sirva el dato

 

Saludos

 

 

LSCI Carlos A. Lara Plascencia

MSN malen...@hotmail.com

Juan Pablo Carrasco M.

unread,
Apr 29, 2013, 12:59:12 PM4/29/13
to publice...@googlegroups.com
 Estimados,

 Les agradezco a todos los comentarios realizados, pero lamentablemente mi problema sigue igual.

 La idea es imprimir una tabla completa de funcionarios de distintas empresas, y dependiendo de la empresa distito es el logo que la identifica.




Juan Pablo Carrasco M.

unread,
Apr 29, 2013, 1:06:48 PM4/29/13
to publice...@googlegroups.com
 Osea que al momento de pinchar el boton "Imprimir", se emitiran mas de 100 documentos de diferentes Empresas y cada Empresa tiene un Logo distinto, osea que lo ideal es que la referrencia a la Imagen contenida en la tabla sea dinamica y no puntual.

 Yo necesito imprimir todo y el objeto no presenta muchas propiedades para aplicar, es por eso que les solicito un soporte urgente al respecto.

 Muchas gracias.

Juan Pablo Carrasco M.

unread,
Apr 29, 2013, 1:13:30 PM4/29/13
to publice...@googlegroups.com
  Estimado Malenkov,

 Su comentario es bastante completo, pero digame:

 ¿Como inicializa su cursoradapter?
 ¿Tiene un ejemplo con un algoritmo mas completo?

 Gracias por su colaboracion.

Víctor Hugo Espínola Domínguez

unread,
Apr 29, 2013, 4:09:47 PM4/29/13
to publicesvfoxpro
Hola Juan Pablo

Si las imágenes de los logos son originalmente del tipo .bmp puedes probar si funciona  eligiendo General field name en Control source type y en Control source pones el nombre del campo.

La única forma de incluir imágenes .jpg en el diseñador de reportes es mediante el archivo.jpg, es decir que tienes que regenerar o ubicar cada archivo original de los logos.

Si sabes cual es el software asociado a tus imágenes, quizá sea posible mediante automatización reconstruir el archivo original.

Mi recomendación es que guardes los gráficos, documentos, planillas, etc. como campo texto o varchar (usando base 64 es mejor aún ) y también guardes la extensión del archivo original. Procediendo así es fácil reconstruir el archivo original , con otro nombre por supuesto.

Ejemplo de como reconstruir un gráfico desde un campo texto en base 64:

Create Cursor crsCliente( Nombre c(50), archivo c(254) )

Use Datos\Cliente In 0
Select Cliente
Scan
Insert Into crsCliente ( Nombre ) Values ( Cliente.Nombre )
lcNomArchivoImagen = ""
lcStrImagen                = ""

lcExtArchivoImagen = Trim( FotoExt )
lcB64Imagen           = FotoB64

If ! ( Empty( lcB64Imagen ) Or Isnull( lcB64Imagen ) )

lcNomArchivoImagen = Sys( 2023 ) + "\tmpImagen" + Sys(3) + "." + lcExtArchivoImagen
lcStrImagen = Strconv( lcB64Imagen, 14 )
= Strtofile( lcStrImagen, lcNomArchivoImagen )
Replace crsCliente.Archivo     With lcNomArchivoImagen
Endif

Endscan

Select crsCliente
Report Form Rprts\Cliente Noconsole Preview


Saludos,
Víctor.


Eric Natareno Guerra

unread,
Apr 29, 2013, 4:19:36 PM4/29/13
to publice...@googlegroups.com

Pienso que deberias guardar en una columna el nombre de la imagen para el logo incluyendo extencion y seguir las instrucciones de los companeros

Juan Pablo Carrasco M.

unread,
Apr 29, 2013, 5:02:46 PM4/29/13
to publice...@googlegroups.com
Victor Hugo,

Gracias por su algoritmo, lo aplicare y te comentare los resultados.

La verdad manejo 6 Empresas y por el volumen prefiero transportar mas que direccionar.

Gracias por su soporte.

Malenkov

unread,
Apr 29, 2013, 6:03:24 PM4/29/13
to publice...@googlegroups.com

 

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Víctor Hugo Espínola Domínguez


Enviado el: lunes, 29 de abril de 2013 03:10 p.m.
Para: publicesvfoxpro

Perdón por lo escueto del correo anterior Juan Pablo, permíteme explicar un poco más el ejemplo, el código que te envíe es de una pantalla que utilizó para capturar la documentación del archivo de personal de la fábrica donde laboro, el motor de la base de datos es MySQL en un servidor Ubuntu, para crear el cursor utilizo el siguiente query:

 

select documento, empleados.id, id_row, imagen,nombre

from docto_personal,empleados

where docto_personal.id=empleados.id

and empleados.id=?thisform.empleado order by document

 

donde empleados es la tabla con los datos generales del empleado y docto_personal es la tabla que contiene los documentos, esto me genera un cursor con la siguiente estructura:

 

DOCUMENTO C(45), ID I, ID_ROW I, IMAGEN G, NOMBRE C(45)

 

En el caso de la variable imagen, está definida en la base de datos como LONGBLOB, al recuperarla información tengo un campo binario, por lo que el reporteador no sabe qué hacer con él y es necesario transformarlo en un archivo que es cuando utilizo el strtofile(), en mi reporte lo doy de alta como un objeto ole, para que no me marque error el diseñador de formas, primero genero un archivo “documento.jpg” en blanco utilizando el paint, esto es nada más para que el diseñador me permita la creación del reporte, ya que este archivo se sustituye cada vez que se ejecuta el código, es importante que en el proyecto marques este archivo como “exclude”, para que no lo incluya en el código y que cada vez que se invoque lo busque.

 

Espero esto te ayude un poco en tus proyecto, si gustas te puedo enviar por correo esta y otras 2 pantallas del mismo sistema que utilizan también imágenes almacenadas en la base de datos

Víctor Hugo Espínola Domínguez

unread,
Apr 29, 2013, 6:28:01 PM4/29/13
to publicesvfoxpro
Hola Malenkov

Puedes decirnos cómo generaste el campo imagen antes de subirlo a Mysql?. Lo hiciste con APPEND GENERAL o con FILETOSTR()?

Saludos,
Víctor.

Juan Pablo Carrasco M.

unread,
May 2, 2013, 11:19:29 AM5/2/13
to publice...@googlegroups.com
Hola Malenkov,

Probe paso a paso todas tus instrucciones, pero lamentablemente para mi, no pude lograr imprimir el logo de ninguna de las Empresas que manejo.

Ahora, a simple vista se ve que tu algoritmo, en el caso de funcionar en mi Reporte, imprimiria solo una Empresa, la Empresa a la que le aplicas STRTOFILE() y lo que yo necesito es imprimir mas de una.

Entonces, ¿que pruedo hacer?

Al momento de pinchar el boton "Imprimir", todo el control pasa del Objeto al Reporte, osea que dentro del reporte se debe inserta alguna "variable" o un objetos que me permita manejar las faces de la imagen que se debe imprimir, al como:

variables del reporte (en secuencia)
_logoEmpresa        IIF(!EMPTY(empresa.logoEmpresa),STRTOFILE(empresa.logoEmpresa,"logo.jpg"),"")
_logoImagen           Objeto OLE, controlsource->logo.jpg

Yo creo que de esta forma podriamos imprimir un objeto imagen dinamico, que cambie dependiendo de la Empresa a que corresponda.

¿Tiene algo desarrollado de esta forma?
¿A trabajado con un Reporte para varios registros con imagenes aleatoreas?

Gracias.

Víctor Hugo Espínola Domínguez

unread,
May 2, 2013, 12:05:35 PM5/2/13
to publicesvfoxpro
Hola Juan Pablo

Para poder ayudarte necesitamos saber lo siguiente:

1) Qué versión de Visual FoxPro usas?

2) En qué tipo de columna de Mysql está guardada la imagen?

3) Como se generó en VFP el dato antes de enviarlo a la base de datos de Mysql?

4) Qué tipo(s) de imágenes eran originalmente (bmp, jpg, etc...)?

Saludos,
Víctor.

Juan Pablo Carrasco M.

unread,
May 2, 2013, 12:20:31 PM5/2/13
to publice...@googlegroups.com
Hola Victor Hugo,

Le comento acerca de lo solicitado:


1) Qué versión de Visual FoxPro usas?
Resp. VFP 9.0 version 09.00.0000.2412


2) En qué tipo de columna de Mysql está guardada la imagen?
Resp. MediumBlob


3) Como se generó en VFP el dato antes de enviarlo a la base de datos de Mysql?
Resp. Cree un archivo pequeño .JPG con Paint y lo envie en una variable a MySql codificada con FILETOSTR()


4) Qué tipo(s) de imágenes eran originalmente (bmp, jpg, etc...)?
Resp. Como le indique; JPG creada con Paint

Gracias.

Juan Pablo Carrasco M.

unread,
May 2, 2013, 6:06:55 PM5/2/13
to publice...@googlegroups.com
Victor Hugo,

Cree una funcion que elimina, busca y genera, el logo de Empresa a imprimir en los reportes.

Ahora el problema es que la imagen no cambia, es siempre la primera que muestra (la primera que encuentra)

Por eso necesito implementar un reporte que cada vez que cambie la Empresa del empleado, tambien cambie el logo de la Empresa a la cual pertenece.

Digame; ¿usted me puede ayudar a conseguir que la imagen cambie dependiendo la empresa?

Gracias.

Víctor Hugo Espínola Domínguez

unread,
May 2, 2013, 7:24:23 PM5/2/13
to publicesvfoxpro
Hola Juan Pablo

No he podido probar lo que te envío, pero te dará una idea de la estrategia a implementar.

Saludos,
Víctor.

rprempresaempleado.txt

Juan Pablo Carrasco M.

unread,
May 6, 2013, 4:22:16 PM5/6/13
to publice...@googlegroups.com
Victor Hugo,

El algoritmo que usted me envio tiene la siguiente caida:

	lcStrImagen        = LogoEmpresa
                 - funcion no valida para campo tipo general

¿Tiene alguna sugerencia al respecto?

Gracias

Víctor Hugo Espínola Domínguez

unread,
May 6, 2013, 4:58:17 PM5/6/13
to publicesvfoxpro
Hola Juan Pablo

El código que te envié es para que veas como relacionar el cursor de empleados con el de empresa.

Si LogoEmpresa es generado en el cursor como tipo GENERAL entonces puedes dejar dejar como comentario todo el bloque scan/endscan, y en tu report pones como Source control type: General field name y en Control source: crsEmpresa.LogoEmpresa.  No estoy seguro que funcione, pero pruébalo.

El bucle scan/endscan es para generar archivos temporales que contengan los logos de las empresas pero funcionará sólo si la columna Mysql LogoEmpresa es de tipo MEDIUMTEXT.
 
Saludos,
Víctor.
P.D.: Nunca, nunca, nunca uses campos tipo General

Juan Pablo Carrasco M.

unread,
May 17, 2013, 11:31:03 AM5/17/13
to publice...@googlegroups.com
Hola Victor Hugo,

Si tu algoritmo esta correcto y resuelve mi requerimiento.

Muchas gracias Victor Hugo y a todos los que comentaron llenos de experiencia.

Miguel Angel Cabezas Castillo

unread,
Dec 1, 2014, 4:23:17 PM12/1/14
to publice...@googlegroups.com
No uses campo General, te vas a complicar la vida, usa campo text en el SQL, y guiate del Ejemplo de Victor Hugo que es lo correcto, ya ahi le cambias la ruta que va a generar y tu cursor o debf debe ser de tipo caracter, para que almacenes la ruta del archivo generado en disco y asi puedas mostrarlo en tu report.
tal vez ya lo has solucionado. por que veo que este post es del 2013
Saludos Colega
Reply all
Reply to author
Forward
0 new messages