PDA

Ver la Versión Completa : ¿Cómo validar campos vacíos en ReportBuilder?


ContraVeneno
15-03-2011, 18:46:05
Que tal

Estoy utilizando reportBuilder 10.08 y tengo un reporte con algunos elementos que tienen imágenes. El detalle es que no todos los elementos tienen imágenes y quería, en esos casos, que no aparezca el componente de la imagen. Un simple "DBImage.Visible := False;".

El problema es que no se como verificar si el campo imagen (que es un BLOB de Firebird 2.1) viene vacío o viene con datos.

Ya probe con nil, con null, transformandolo a cadena y nada más no le encuentro como validarlo. La misma consulta en el IBExpert me dice que el campo está como NULL, pero ReportBuilder no me dice nada.


{if DatoBLOB['Imagen'] = nil then begin --no hace nada}
{if DatoBLOB['Imagen'] = NULL then begin --no hace nada}
{if DatoBLOB['Imagen'] = '' then begin --no hace nada}
DBImage1.Visible := False;
end else begin
DBImage1.Visible := True;
end;


¿Alguien sabrá como verificar el contenido de un campo BLOB en reportbuilder?

Casimiro Notevi
15-03-2011, 19:01:08
Pero si está vacío no saldrá nada, no hace falta ponerlo invisible, no?

ContraVeneno
15-03-2011, 19:27:34
EL problema es mas que nada en el espacio. Si no hay imagen, queda un espacio en blanco al momento de imprimirse, cosa que quiero evitar.

Si no hay imagen, todos los renglones aparecen juntos, si hay imagen, el siguiente renglón se recorre un poco.

Lo mismo sería cambiar la propiedad "Height" ya sea del componente imagen o de la banda detalle.

El problema es que no puedo hacer que funcione la condición para validar si el campo blob es NULL o viene con datos.

Casimiro Notevi
15-03-2011, 19:34:19
Creo recordar que puedes pinchar con el botón derecho encima y seleccionar "mover relativo a..." y le dices el componente que está por encima, entonces no aparecerá ni ocupará el espacio.

ContraVeneno
15-03-2011, 19:44:49
Precisamente esa opción es la que he utilizado siempre, para cuadros de texto, para memos, etc. Pero curiosamente el componente DBImage no lo tiene; o al menos yo no lo veo.

Casimiro Notevi
15-03-2011, 19:53:47
Es que aunque lo pongas invisible te seguirá ocupando el espacio.
Si está en una "banda" entonces puedes ocultar la banda.
Voy a ver si tengo alguna copia por aquí de informes con alguna imagen... a ver...

ContraVeneno
15-03-2011, 20:04:12
es que en las pruebas que estoy haciendo, el poner invisible el componente DBImage, hace que todos los renglones aparezcan correctos, sin espacio en blanco. Por eso intento ponerlo invisible. El problema es la condición nunca cambia, siempre me pone todo en "True", o si lo invierto, me lo pone todo en "False".

No logro hacer que la condición se cumpla como debe.

Casimiro Notevi
15-03-2011, 20:44:38
A mí me funciona correctamente del modo esperado.
En el beforeprint del header, donde tengo puesto el logo de la empresa, he puesto:


if Tbempresas['Logotipo'] = null then
dbimage1.visible := false;


Y funciona bien.

ContraVeneno
15-03-2011, 20:58:44
changos... ¿y tons por qué a mi no?... tengo eso mismo en el BeforePrint de la banda Detalle.


if DatoBLOB['Imagen'] = NULL then begin
DBImage1.Visible := False;
end else begin
DBImage1.Visible := True;
end;
Pero siempre se va por lado "falso" y me muestra siempre el cuadro de la imagen, a pesar de que el valor del campo es null.

¿tendrás el RTM disponible?

Casimiro Notevi
15-03-2011, 21:12:34
Te sobra el punto y coma después de false;


if DatoBLOB['Imagen' = null then
DBImage1.visible := false <-- se te ha colado un ; ahí
else
DBImage1.visible := true;


Edito: ya me he dado cuenta que lo has puesto entre "begin" y "end", así que no es por eso

Casimiro Notevi
15-03-2011, 21:40:06
Lo he probado con paréntesis y cambiando el "=null" por "is null" y funciona también.


if (DatoBLOB['Imagen'] is null) then
DBImage1.visible := false
else
DBImage1.visible := true;


Si quieres el .rtm te lo paso, aunque yo tengo un RB versión 3.xx :D

ContraVeneno
16-03-2011, 01:36:17
pues no tengo ni la más mínima idea de porque no me quiere funcionar ninguna de las opciones que me das... a final de cuentas he hecho lo mismo, pero diferente. Tengo un campo ID numérico para registrar la imagen y me he basado en ese campo para hacer funcionar la condición:

{este dato es entero, si es null viene en blanco, pero puedo revisar que traiga valor}
if Datos['ID'] > 0 then begin
DBImage1.Visible := True;
end else begin
DBImage1.Visible := False;
end;


con esto sí me funciona como quiero... mañana seguiré indagando para ver porque con el campo BLOB no hace nada...

Muchas gracias por tu tiempo maese Casimiro.

Casimiro Notevi
16-03-2011, 11:37:44
Pues no sé, es posible que esa versión tenga algún bug al respecto, ya te digo, yo tengo una versión de hace por lo menos 12 años y funciona :D