Este asunto es de los que te pueden tener una mañana entretinido como un bobo mientras intentas averiguar qué #%$# está pasando...

Hoy estuve tocando una aplicación vieja escrita en .NET 1.1. El caso es que el programador había metido una campo calculado en un DataTable que incluía una división, así:

tabla.Columns.Add( new DataColumn( "Rentabilidad", typeof(decimal), "Beneficio / Ingresos");

El problemilla es que algunos registros tienen los ingresos a cero, por lo que en cuanto creabas el campo se obtenía una divisón por cero, claro.

Lo primero que se te ocurre hacer (parte de meterlo en la consulta de la base de datos, que es lo primero que este programador debería haber hecho) es lo siguiente:

tabla.Columns.Add( new DataColumn( "Rentabilidad", typeof(decimal), "IIF(Ingresos = 0, 0, Beneficio / Ingresos)");

Es decir, que si los ingresos son diferentes a cero que haga la divisón, si no que no la haga. Vale, el problema es que simplemente esto no funciona y sigues obteniendo todo el rato una divisón por cero. ¿y eso?!!!!.

Bueno, pues resulta que el caso es que esta función evalúa los dos miembros siempre, no sólo el miembro que corresponda al resultado de la condición, como parece lógico, así que no nos vale.

¿La solución?

Pues hay varias.

1) Mete el cálculo en el servidor, en la consulta SQL con un condicional.

2) Crea el campo sin expresión, recorre todos los registros y asigna por código el valor (no me gusta nada, sólo es una opción).

3) Sé creativo :-) Por ejemplo, esta expresión es equivalente a la que originalmente queríamos, aunque un poco más rebuscada. Lo que consigue es evitar cualquier división por cero en cualquier circunstancia y multiplica por 1 o 0 el resultado para devolver el correcto:

tabla.Columns.Add( new DataColumn( "Rentabilidad", typeof(decimal), "Beneficio / IIF(Ingresos=0, 1, Ingresos) * IIF(Ingresos= 0, 0, 1)"));

mola ¿eh? :-)

En fin... pienso que lo lógico sería que IIF funcionara como cabría pensar y no tener que estar con estas técnicas retorcidas, pero espero que a alguien le sirva lo que aquí explico.

Saludetes

JM

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor