
PB 11.5 ¡Problemas! LEN(BLOB)
Publicado por solindeveloper (30 intervenciones) el 10/09/2010 23:08:19
Sres Foristas
Acudo a ustedes pues ya he probado de todo y nada me da resultado...
El caso es que tenia un sistema hecho en PB 9, funciona perfectamente.
Este sistema lo migre a la version estable de PB 11.5
El problema que tengo es que mi sistema consulta en una base de datos un archivo de imagen(tif para ser exactos) y lo muestra en un objeto OLE simple.
Las rutinas que realiza esta visualizacion(boton ver imagen) son 2
1.-Extraer la imagen de la BD a una variable blob y escribirla en mi PC en una carpeta temporal.
2.-Insertar esta imagen a un objeto OLE y visualizarla
En PB 9 ambos procesos los realiza correctamente.
He notado algo muy importante y lo cual me parece es el problema:
El sistema asi como visualiza imagenes TIF de una BD tambien permite registrarlas desde la PC mediante otro modulo.
Cuando voy a cargar una imagen a mi BD especifico la ruta, ubico la imagen y hallo el tamaño de dicha imagen:
Ejemplo:
ln_flength = FileLength(as_imagen) //---> 20460 bytes
pero cuando lo extraigo de mi base de datos y verifico su tamaño me sale que es el doble del que ingreso:
SELECTBLOB .... into :lbb_imagen FROM ... .ETC
ll_FLength = Len(lbb_imagen) -----> 40920 bytes
En la version PB 9 ambos procesos me arrojan lo mismo 20460 bytes
Pero en PB 11.5 la consulta ME DEVUELVE EL DOBLE Y CORROMPE TODO MI PROCESO DE EXTRACCION.
Necesito saber si hay otra rutina en PB 11.5 para saber el tamaño del campo blob y me devuelva el nro de bytes exacto.
OJO si extraigo la imagen de la BD y la guardo en la PC pero como el nro de bytes que tiene no corresponde me resulta un archivo dañado que tiene el doble del tamaño del original.
Dejo mi rutina de visualizacion que uso en PB 11.5
HABER SI ALGUNO DE USTEDES ME PUEDE INDICAR QUE NUEVA FUNCION TRAE EL 11.5 QUE NO ME DEJA EXTRAER Y MOSTRAR CORRECTAMENTE MIS IMAGENES
long ln_count, ll_FLength, ll_res,ln_current_bd
Integer li_FileNum
blob lbb_imagen, b
string ls_tipo_envio,ls_emision,ls_remito,ls_archivo_temp
integer loops, i,ln_i
long new_pos
ls_tipo_envio = dw_cabecera.Object.tipo_envio[1]
ls_emision = dw_cabecera.Object.emision[1]
ls_remito = dw_cabecera.Object.remito[1]
ls_emision = string(long(ls_emision),"00")
ls_remito = string(long(ls_remito),"0000000")
ls_archivo_temp = gs_drive+":\vcourier\temp\remito.tif"
//ls_archivo_temp = "E:\SALVAR_SOLIN\temp\remito.tif"
SELECTBLOB imagen
INTO :lbb_imagen
FROM mv_imagen
WHERE tipo_envio = :ls_tipo_envio
and emision = :ls_emision
AND remito = :ls_remito USING GTRS_IMAGEN ;
If GTRS_IMAGEN.SQLCode <> 0 then
//////////////////////////////////////////////////
//busco el las demas base de datos
//////////////////////////////////////////////////
For ln_i = 1 to UpperBound(gtrs_img)
SELECTBLOB imagen
INTO :lbb_imagen
FROM mv_imagen
WHERE tipo_envio = :ls_tipo_envio
and emision = :ls_emision
AND remito = :ls_remito USING gtrs_img[ln_i] ;
ln_current_bd = ln_i
If gtrs_img[ln_i].SQLCode = 0 then Exit
Next
If UpperBound(gtrs_img) = 0 Then
messagebox('Remito no escaneado','El remito no esta escaneado')
Return
else
If gtrs_img[ln_current_bd].SQLCode <> 0 then
messagebox('Remito no escaneado','El remito no esta escaneado')
Return
End If
end if
end if
If IsNull(lbb_Imagen) Then
messagebox('Remito no escaneado','El remito no esta escaneado')
Return
End If
li_FileNum = FileOpen( ls_archivo_temp,StreamMode!, Write!, Shared!, Replace!)
ll_FLength = Len(lbb_imagen)
// Determine how many times to call FileRead
IF ll_FLength > 32765 THEN
IF Mod(ll_FLength, 32765) = 0 THEN
loops = ll_FLength/32765
ELSE
loops = (ll_FLength/32765) + 1
END IF
ELSE
loops = 1
END IF
// Read the file
new_pos = 1
FOR i = 1 to loops
b = blobmid(lbb_imagen,new_pos,32765)
FileWrite(li_FileNum, b)
new_pos += 32765
NEXT
FileClose(li_FileNum)
ole_imagen.InsertFile(ls_archivo_temp)
IF ole_imagen.activate(OffSite!) <> 0 then messagebox('Error','No se pudo activar el control para mostrar la imagen')
Acudo a ustedes pues ya he probado de todo y nada me da resultado...
El caso es que tenia un sistema hecho en PB 9, funciona perfectamente.
Este sistema lo migre a la version estable de PB 11.5
El problema que tengo es que mi sistema consulta en una base de datos un archivo de imagen(tif para ser exactos) y lo muestra en un objeto OLE simple.
Las rutinas que realiza esta visualizacion(boton ver imagen) son 2
1.-Extraer la imagen de la BD a una variable blob y escribirla en mi PC en una carpeta temporal.
2.-Insertar esta imagen a un objeto OLE y visualizarla
En PB 9 ambos procesos los realiza correctamente.
He notado algo muy importante y lo cual me parece es el problema:
El sistema asi como visualiza imagenes TIF de una BD tambien permite registrarlas desde la PC mediante otro modulo.
Cuando voy a cargar una imagen a mi BD especifico la ruta, ubico la imagen y hallo el tamaño de dicha imagen:
Ejemplo:
ln_flength = FileLength(as_imagen) //---> 20460 bytes
pero cuando lo extraigo de mi base de datos y verifico su tamaño me sale que es el doble del que ingreso:
SELECTBLOB .... into :lbb_imagen FROM ... .ETC
ll_FLength = Len(lbb_imagen) -----> 40920 bytes
En la version PB 9 ambos procesos me arrojan lo mismo 20460 bytes
Pero en PB 11.5 la consulta ME DEVUELVE EL DOBLE Y CORROMPE TODO MI PROCESO DE EXTRACCION.
Necesito saber si hay otra rutina en PB 11.5 para saber el tamaño del campo blob y me devuelva el nro de bytes exacto.
OJO si extraigo la imagen de la BD y la guardo en la PC pero como el nro de bytes que tiene no corresponde me resulta un archivo dañado que tiene el doble del tamaño del original.
Dejo mi rutina de visualizacion que uso en PB 11.5
HABER SI ALGUNO DE USTEDES ME PUEDE INDICAR QUE NUEVA FUNCION TRAE EL 11.5 QUE NO ME DEJA EXTRAER Y MOSTRAR CORRECTAMENTE MIS IMAGENES
long ln_count, ll_FLength, ll_res,ln_current_bd
Integer li_FileNum
blob lbb_imagen, b
string ls_tipo_envio,ls_emision,ls_remito,ls_archivo_temp
integer loops, i,ln_i
long new_pos
ls_tipo_envio = dw_cabecera.Object.tipo_envio[1]
ls_emision = dw_cabecera.Object.emision[1]
ls_remito = dw_cabecera.Object.remito[1]
ls_emision = string(long(ls_emision),"00")
ls_remito = string(long(ls_remito),"0000000")
ls_archivo_temp = gs_drive+":\vcourier\temp\remito.tif"
//ls_archivo_temp = "E:\SALVAR_SOLIN\temp\remito.tif"
SELECTBLOB imagen
INTO :lbb_imagen
FROM mv_imagen
WHERE tipo_envio = :ls_tipo_envio
and emision = :ls_emision
AND remito = :ls_remito USING GTRS_IMAGEN ;
If GTRS_IMAGEN.SQLCode <> 0 then
//////////////////////////////////////////////////
//busco el las demas base de datos
//////////////////////////////////////////////////
For ln_i = 1 to UpperBound(gtrs_img)
SELECTBLOB imagen
INTO :lbb_imagen
FROM mv_imagen
WHERE tipo_envio = :ls_tipo_envio
and emision = :ls_emision
AND remito = :ls_remito USING gtrs_img[ln_i] ;
ln_current_bd = ln_i
If gtrs_img[ln_i].SQLCode = 0 then Exit
Next
If UpperBound(gtrs_img) = 0 Then
messagebox('Remito no escaneado','El remito no esta escaneado')
Return
else
If gtrs_img[ln_current_bd].SQLCode <> 0 then
messagebox('Remito no escaneado','El remito no esta escaneado')
Return
End If
end if
end if
If IsNull(lbb_Imagen) Then
messagebox('Remito no escaneado','El remito no esta escaneado')
Return
End If
li_FileNum = FileOpen( ls_archivo_temp,StreamMode!, Write!, Shared!, Replace!)
ll_FLength = Len(lbb_imagen)
// Determine how many times to call FileRead
IF ll_FLength > 32765 THEN
IF Mod(ll_FLength, 32765) = 0 THEN
loops = ll_FLength/32765
ELSE
loops = (ll_FLength/32765) + 1
END IF
ELSE
loops = 1
END IF
// Read the file
new_pos = 1
FOR i = 1 to loops
b = blobmid(lbb_imagen,new_pos,32765)
FileWrite(li_FileNum, b)
new_pos += 32765
NEXT
FileClose(li_FileNum)
ole_imagen.InsertFile(ls_archivo_temp)
IF ole_imagen.activate(OffSite!) <> 0 then messagebox('Error','No se pudo activar el control para mostrar la imagen')
Valora esta pregunta


0