Picture con Cursoradapter y SQL

113 views
Skip to first unread message

Mario Escudero

unread,
Feb 22, 2016, 9:37:44 AM2/22/16
to Comunidad de Visual Foxpro en Español
Buenos dias:_

Sé que hay varios artículos al respecto, los he leído casi todos pero aún no logro aplicarlo correctamente a mi proyecto.

Mi caso es el siguiente:

1) En SQL tengo mi tabla "Articulos" donde defino el campo "Foto" como tipo image

2) En mi form tengo el campo "PicFoto" donde irá la imagen

3) Cuando quiero Crear o Editar un articulo pongo lo siguiente:
if xnuevo
   xfoto = "imagenes\sinfoto.jpg"
else
   xfoto = CAST(cArticulos.foto as blob)   && No creo que esto sea correcto poruqe me bota error...
endi
Donde cArticulos.foto es el campo del cursor que jala los datos de la tabla Aritculos de SQL

4)  Finalmente, qué debe ir dentro de los botones "Cargar Foto" y "Eliminar Foto"?

Mil gracias de antemano
Saludos

Víctor Hugo Espínola Domínguez

unread,
Feb 22, 2016, 11:00:12 AM2/22/16
to publice...@googlegroups.com
Hola Mario

Disculpame por haber recomendado el uso del tipo de datos Image, el mismo está condenado a muerte: https://msdn.microsoft.com/en-us/library/ms187993.aspx

Debes elegir entre Varchar(max), Varbinary(max) o Filestream.


Saludos,
Víctor.
Lambaré - Paraguay.

Antonio Meza

unread,
Feb 22, 2016, 11:13:03 AM2/22/16
to Comunidad de Visual Foxpro en Español
Hola!!

Hace tiempo publique como subir y bajar imágenes o archivos con MariaDb, Mysql y FireBird, usando FoxyDb, en tu caso usas SqlServer pero lo que te hace falta es solo el código para obtener el archivo en Base64 y guardar y extraer, lo puedes checar descargando el formulario en


saludos
Antonio Meza

Mario Escudero

unread,
Feb 22, 2016, 12:57:54 PM2/22/16
to publice...@googlegroups.com

Habría algún problema si uso los pictures llamando y guardando la ruta del archivo imagen solamente? Gracias

Mario Escudero
Rpm #995817087
www.cheff2000.com

Enviado desde mi móvil

Antonio Meza

unread,
Feb 22, 2016, 1:11:33 PM2/22/16
to Comunidad de Visual Foxpro en Español


El lunes, 22 de febrero de 2016, 8:37:44 (UTC-6), Mario Escudero escribió:

Antonio Meza

unread,
Feb 22, 2016, 1:11:46 PM2/22/16
to Comunidad de Visual Foxpro en Español
Eso dependerá de tu necesidad y pues eso solo tu lo sabes, lo ideal es en la base de datos, pero si las imágenes siempre se van a accesar locales pues no tendrás problemas, si se necesitan accesar de forma remota ahí te acordaras de que hubiera sido mejor en la base de datos jajajaj

saludos
Antonio Meza

Mario Escudero

unread,
Feb 22, 2016, 1:21:14 PM2/22/16
to publice...@googlegroups.com

De acuerdo Antonio.
Pero sigo sin comprender bien por donde empezar lo que puse en el post....
No sé si me estaré ahogado en un vaso de agua o realmente es trabajoso lo del campo Image...
Gracias

Mario Escudero
Rpm #995817087
www.cheff2000.com

Enviado desde mi móvil

Víctor Hugo Espínola Domínguez

unread,
Feb 22, 2016, 3:10:47 PM2/22/16
to publice...@googlegroups.com
>if xnuevo
>   xfoto = "imagenes\sinfoto.jpg"
>else
>   xfoto = CAST(cArticulos.foto as blob)   && No creo que esto sea correcto poruqe me bota error...
>endi

if xnuevo
    Thisform.PicFoto.PictureVal = FileToStr("imagenes\sinfoto.jpg")
else
    Thisform.PicFoto.PictureVal = cArticulos.Foto
endif


Saludos,
Víctor.
Lambaré - Paraguay.


Mario Escudero

unread,
Feb 22, 2016, 6:42:03 PM2/22/16
to publice...@googlegroups.com
Excelente Victor.
Ahora me estaría faltando el boton Agregar y Quitar foto.
En otro proyecto, donde guardo la ruta de la  imagen en un campo texto, en el Click del boton Agregar Foto pongo:

gfoto = GETFILE('JPG;GIF;BMP','Elija la Foto del Empleado','Aceptar',0)
IF !EMPT(gfoto)
* Se quita la ruta para que jale las fotos al Iniciar en Red (\\xxxxx\xxxx)
FOR i = 100 TO 1 STEP -1
IF SUBSTR(gfoto,i,1) = "\"
gfoto = SUBSTR(gfoto,i+1,100-i)
EXIT
ENDIF
NEXT
*
thisform.pageframe1.page1.image1.picture = gfoto
repl foto with gfoto
ELSE 
REPLACE  foto with ""
ENDIF 
thisform.refresh

Y en Quitar Foto:

repl foto with ''
thisform.refresh

Esto mismo tendría que poner en el nuevo proyecto?
Finalmente, se fuera el caso, cómo guardo al imagen en el cursoradapter para que que se grabe en el campo Image del SQL?

Gracias nuevamente
Saludos



----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 22, 2016, 7:06:29 PM2/22/16
to publice...@googlegroups.com
Hola Victor:
Hacer caso omiso a mi tonto mail anterior...jeje
En el boton Agregar Foto he pueso:

gfoto = GETFILE("JPG;GIF;BMP;PNG","Elija la Foto del Artículo","Aceptar",0)
IF !EMPTY(gfoto)
Thisform.PicFoto.PictureVal = FILETOSTR(gfoto)
ENDIF 
thisform.refresh


Y en le boton Quitar Foto he puesto:

Thisform.PicFoto.PictureVal = FILETOSTR("imagenes\sinfoto.jpg")
thisform.refresh

Y funciona bien.
Lo único que me estaría faltando es cómo Guardarlo en el cursoradapter asociado al SAL. Voy a investigar un poco y te cuento.
Gracias


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 22, 2016, 8:03:00 PM2/22/16
to Comunidad de Visual Foxpro en Español
Hola con todos:
Adjunto pantallazos donde cargo imagen correctamente pero no sé por qué se pierde la variable xfoto cuando le doy el replace al cursor.
Con eso ya estariá toodo de maravilla....
Mil gracias nuevamente
Saludos



El lunes, 22 de febrero de 2016, 19:06:29 (UTC-5), Mario Escudero escribió:
Hola Victor:
Hacer caso omiso a mi tonto mail anterior...jeje
En el boton Agregar Foto he pueso:

gfoto = GETFILE("JPG;GIF;BMP;PNG","Elija la Foto del Artículo","Aceptar",0)
IF !EMPTY(gfoto)
Thisform.PicFoto.PictureVal = FILETOSTR(gfoto)
ENDIF 
thisform.refresh


Y en le boton Quitar Foto he puesto:

Thisform.PicFoto.PictureVal = FILETOSTR("imagenes\sinfoto.jpg")
thisform.refresh

Y funciona bien.
Lo único que me estaría faltando es cómo Guardarlo en el cursoradapter asociado al SAL. Voy a investigar un poco y te cuento.
Gracias


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Libro1.xls

Mario Escudero

unread,
Feb 22, 2016, 8:18:41 PM2/22/16
to Comunidad de Visual Foxpro en Español
La variable xfoto la defini como PUBLIC en Load con el valor
xfoto = FILETOSTR("imagenes\sinfoto.jpg")

Pero ahora, al hacer el replace me sale el mensaje adjunto.
He probado cambiando el tipo de campo Foto en SQL de Image a varbinary(50) y varbinary(MAX) y he reconstruido el cursoradapter pero sigue le mismo error...
Ya me estoy volviendo loco !!!! jeje
Gracias
Saludos
Libro1.xls

Víctor Hugo Espínola Domínguez

unread,
Feb 22, 2016, 8:22:10 PM2/22/16
to publice...@googlegroups.com
Prueba con:

Replace cArticulos.Foto With Cast(m.xFoto As Blob)


Saludos,
Víctor.
Lambaré - Paraguay.


Antonio Meza

unread,
Feb 22, 2016, 8:23:21 PM2/22/16
to Comunidad de Visual Foxpro en Español
Te recomiendo 2 cosas, la primera es crear mejor una propiedad del formulario llamada si gustas xFoto y donde tengas 

xFoto = XXX

remplazar por 

thisform.xfoto = xxx

Así evitaras problemas con la variables y no vayas a caer en la tentación de crear una variable publica jejeje

La segunda y mas importante, es que crees Métodos del formulario en vez de poner tu código dentro de los eventos Click y mucho menos de un Label, por accidente puede eliminar el label y listo te diste un tiro en la cabeza con el código jajajaja (medio exagerado pero es solo para hacer mas ameno el mensaje jajaja)

Entonces en el click del label pones solo algo así como Thisform.MetodoNombre(), y todo el demás código en el método y poco a poco vas cambiando al uso de buenas practicas.

saludos
Antonio Meza

Antonio Meza

unread,
Feb 22, 2016, 8:26:14 PM2/22/16
to Comunidad de Visual Foxpro en Español
Demasiado tarde caíste en la tentación de la variable publica jajajajaj cámbiala por una propiedad, suerte!!!

No uso SqlServer para decirte como almacenar la foto. sorry!!!

saludos
Antonio Meza

Mario Escudero

unread,
Feb 22, 2016, 8:33:21 PM2/22/16
to publice...@googlegroups.com
Igual Victor, sale el mismo error.
Reconstruí nuevamente el cursoradapter y el campo final fue Image...


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 22, 2016, 8:36:13 PM2/22/16
to publice...@googlegroups.com
Gracias Antonio por los consejos. Los tomaré en cuenta.
Pero el problema ahora ya no es el de la variable sino el de la incompatibildad al Grabar,
entre la variable xfoto y el campo cArticulos.foto, tal como lo muestro en los dos últimos pantallazos.
Slds


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 22, 2016, 8:48:18 PM2/22/16
to publice...@googlegroups.com
ok Antonio, gracias de todos modos.
Saludos


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 22, 2016, 8:56:18 PM2/22/16
to publice...@googlegroups.com
Me he quedado con varbinary(MAX)
Gracias por el dato !
Mi único problema ahora es que me sale error cuando hago el replace del PictureVal al campo Foto del cursoradapter proveniente del SQL.
Slds


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 22, 2016, 9:03:38 PM2/22/16
to publice...@googlegroups.com
También acabo de probar con:

xfoto = cast(filetostr(gfoto) as blob)
replace cArticulos.foto with xfoto y me sigue saliendo el mismo error
"Data type mismatch"....



----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 22, 2016, 9:08:56 PM2/22/16
to publice...@googlegroups.com
xfoto está bien....

Imagen integrada 1


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Mario Escudero

unread,
Feb 23, 2016, 1:18:51 PM2/23/16
to publice...@googlegroups.com

Gracias a todos por sus aportes.
Ya pude resolver mi problema aplicando, en esta ocasión, el método de Daniel Sánchez usando en SQL el campo Foto como tipo Text y en VFP usando STRTOF y CONVERT...
Saludos

Mario Escudero
Rpm #995817087
www.cheff2000.com

Enviado desde mi móvil

Víctor Hugo Espínola Domínguez

unread,
Feb 23, 2016, 1:23:52 PM2/23/16
to publice...@googlegroups.com
Tal parece que es la mejor opción, prueba cambiar Text a Varchar(max), el tipo text también está condeanado a desaparecer.


Saludos,
Víctor.
Lambaré - Paraguay.


Mario Escudero

unread,
Feb 23, 2016, 5:52:43 PM2/23/16
to publice...@googlegroups.com
Asi es Victor Hugo.
Cambie el tipo de los campos Foto y Observacion por varchar(MAX).
Gracias
Slds


----
Mario Escudero
Mov 995-817087  Rpm #995817087 

Víctor Hugo Espínola Domínguez

unread,
Feb 23, 2016, 6:35:36 PM2/23/16
to publice...@googlegroups.com
Acabo de terminar una prueba con VarBinary(max) grabando y leyendo con cursor adapter y también funciona, probablemente también funcione con Filestream pues esta técnica es un complemento del tipo varbinary(max).

A mí me gusta más la opción de texto en base 64.

Adjunto el ejemplo, usar FoxBin2Prg de fernando Bozzo para generar el form.


Saludos,
Víctor.
Lambaré - Paraguay.


img_varbin_ca.sc2
vhecageneric.prg
Reply all
Reply to author
Forward
0 new messages