2009-02-10 91 views
5

Hay indicios de la respuesta a esta pregunta aquí y allá en este sitio, pero estoy haciendo una pregunta ligeramente diferente.Fórmula de Crystal Reports: IsNull + Iif

¿Dónde documenta Crystal Reports que esta sintaxis no funciona?

Trim({PatientProfile.First}) + " " 
    + Trim(Iif(
     IsNull({PatientProfile.Middle}) 
     , Trim({PatientProfile.Middle}) + " " 
     , " " 
     ) 
    ) 
+ Trim({PatientProfile.Last}) 

Sé que la solución es

If IsNull({PatientProfile.Middle}) Then 
    Trim({PatientProfile.First}) 
     + " " + Trim({PatientProfile.Last}) 
Else 
    Trim({PatientProfile.First}) 
     + " " + Trim({PatientProfile.Middle}) 
     + " " + Trim({PatientProfile.Last}) 

pero ¿cómo se supone que vamos a averiguar que no podemos usar la primera versión?

La documentación para EsNulo dice

  • evalúa el campo especificado en el registro actual y devuelve verdadero si el campo contiene un valor nulo

y Iif da

  • [devoluciones ] truePart si la expresión es True y falsePart si la expresión es False. El tipo del valor devuelto es el mismo que el tipo de truePart y falsePart.

supongo que si usted mira fijamente esa línea de "tipo del valor de retorno" lo puede conseguir, pero ...

+0

no tengo CRXI práctica de hoy, pero lo que no funciona sobre el primero? ¿Acaso el espaciado es incorrecto (que es un error lógico en el código? ¿Tiene un Trim() adicional allí) o falla de alguna otra manera? – Stobor

+0

Para registros donde .Middle es NULL, CR no puede evaluar el valor de cadena en Trim (.Middle), y decide que el valor de Iif es NULL, aunque tengo esa prueba explícita allí. – SarekOfVulcan

Respuesta

5

creo CR evalúa ambas partes IIFs verdaderos y falsos. Debido a que tiene la parte "Recortar ({PatientProfile.Middle})" que se evaluará como un valor nulo, el evaluador de la fórmula CR parece fallar.

+1

Sí, pero estoy tratando de descubrir en qué parte de la documentación sangrienta dice esto, en lugar de hacer que todos los que se tropiecen con ella busquen la respuesta. Después de todo, uno o dos de nosotros sabemos cómo se supone que el código funciona ... – SarekOfVulcan

+2

De la ayuda de CR: Todos los argumentos de la función IIF se evalúan antes de que se devuelva el resultado. Por lo tanto, debe vigilar los efectos secundarios indeseables cuando use IIF. Por ejemplo, si falsePart da como resultado una división por cero, se producirá un error, incluso si la expresión es True y se devuelve truePart. – Arvo

10

¿Dónde documenta Crystal Reports que esta sintaxis no funciona?

Dudo que haya cualquier lugar lo suficientemente grande en el universo entero para documentar todo lo que no funciona en Crystal Reports ...

+0

lol, gracias por hacerme reír en este fino viernes;) – contactmatt

5

Sé que soy años de retraso en este caso, pero vine sobre esta pregunta al tratar de descubrir lo mismo. Bastante gracioso, ni siquiera pude encontrar la respuesta en la documentación de Crystal Reports, sino en un link to IBM.

Baiscally, si está utilizando Crystal Reports 8.xo 10.x, ISNULL y IIF no funcionan juntos. Desde el sitio:

Causa

Hay un defecto en 8.xy 10.x Crystal Reports que impide la fórmula anterior funcione correctamente. Los comandos 'IIF' e 'IsNull' no pueden funcionar juntos, y eso incluye intentar usar "No" para modificar el comando IsNull; por ejemplo, IIF (Not IsNull()).

La solución del problema

La solución consiste en utilizar una sentencia "If-Then-Else".Por ejemplo,

If IsNull({~CRPT_TMP0001_ttx.install_date}) Then "TBD" Else "In Progress" 

Así que si usted está utilizando 8.x CR o 10.x (que somos), estás de suerte. Lo hace REALMENTE divertido cuando concatenas varios campos juntos y uno de ellos puede ser NULO.

+1

Tenga en cuenta que incluso si está concatenando múltiples campos juntos, la sintaxis no es tan mala, ya que Crystal admite cosas como esta: (si IsNull ({Col1}) luego 0 else {Col1}) + (si IsNull ({Col12}) luego 0 else {Col2}) – JoshL

-3

probar esto:

currencyvar tt; 
currencyvar dect; 
tt :={ship.comm_amount}; 
dect := tt - Truncate(tt); 
tt := truncate(tt); 
dect := dect * 100; 
if dect = 0 then 
UPPERCASE('$ ' + ToWords (tt,0)) + ' ONLY' 
else 
UPPERCASE('$ ' + ToWords (tt,0) + ' And ' + ToWords(dect,0)) + ' ONLY '; 
+4

¿Qué pregunta se supone que debe responder? – SarekOfVulcan

Cuestiones relacionadas