martes, 5 de julio de 2022

SI.CONJUNTO-FILTRAR-SI aplica condiciones

Revisando pendientes me dí cuenta que no había escrito mucho sobre algunas funciones...
Y una que merece una especial atención sin duda es SI.CONJUNTO (echa un vistazo...).
Una función que lleva con nosotros desde 2016 y aún es una gran desconocida.

De paso que expongo el caso, aprovecharé para hacer una comparativa (o dar alternativas con otras funciones 'viejas' o 'nuevas').
Partiremos de una tabla con registros de empleados...
SI.CONJUNTO-FILTRAR-SI aplica condiciones


El objetivo es recuperar los valores de las jornadas, según condiciones, dados en el rango H2:I6, y determinar para cada registro de la tabla qué número de horas corresponde...

Analicemos en primer lugar las condiciones requeridas mediante un esquema de árbol de decisión:
SI.CONJUNTO-FILTRAR-SI aplica condiciones

Esquema que debemos asegurarnos que es correcto, ya que basaremos nuestro algoritmo en él...

En consecuencia, y como primera opción, añadimos a nuestra tabla de empleados el siguiente campo formulado:
=SI([@[Centro trabajo]]="FAB";
        SI([@Turno]="M";
              7;
              SI([@Turno]="N";6,5;8));
        SI([@[Centro trabajo]]="ALM";
               SI([@Turno]="N";7,5;8,5);
               8,5))

SI.CONJUNTO-FILTRAR-SI aplica condiciones

Fíjate que solo sigue la línea desarrollada en el esquema de árbol anterior...

Una alternativa sería desarrollar las condiciones en orden, siguiendo una 'cascada' de pruebas lógicas, tal cual nos van apareciendo...
=SI(Y([@[Centro trabajo]]="FAB";[@Turno]="m");
       7;
       SI(Y([@[Centro trabajo]]="FAB";[@Turno]="N");
           6,5;
           SI([@[Centro trabajo]]="FAB";
               8;
              SI(Y([@[Centro trabajo]]="ALM";[@Turno]="N");
                 7,5;
                 8,5))))

SI.CONJUNTO-FILTRAR-SI aplica condiciones

En este caso fíjate como solo vamos 'fluyendo' por las diferentes pruebas lógicas múltiples (gestionadas con un Y), dando sus respuestas de verdadero y falso...

A partir de las formas de proceder anteriores llegamos a la función SI.CONJUNTO, donde su estructura nos propone una alternancia de argumentos: prueba_lógica y salida de verdadero (SOLO verdadero, no da respuesta de falso directamente!!).
Además, según añadimos más y más pares de argumentos, los posteriores aplicarán solo en el caso de que no se hayan verificado las previas.
En nuestro ejemplo, añadimos nuevo campo formulado:
=SI.CONJUNTO([@[Centro trabajo]]="FAB";SI.CONJUNTO([@Turno]="M";7;
    						[@Turno]="N";6,5;
    						VERDADERO;8);
Y([@[Centro trabajo]]="ALM";[@Turno]="N");7,5;
VERDADERO;8,5)

SI.CONJUNTO-FILTRAR-SI aplica condiciones

Notemos cómo al anidar un nuevo SI.CONJUNTO como respuesta a la primera prueba lógica (centro_trabajo='FAB') conseguimos dar respuestas controladas para los distintos casos planteados...
Recuerda que la forma, con SI.CONJUNTO, de considerar el resto de casos no evaluados en las condiciones previas, es dando como prueba lógica un VERDADERO, seguido como respuesta el valor deseado...

PLUS sorprendente.
Una última opción que os propongo es solucionarlo empleando la función FILTRAR, apoyándome en un rango de criterios auxiliar, que represente inequívocamente las condiciones a verificar.
Incorporamos un último campo formulado a nuestra tabla de empleados...
=FILTRAR(Tabla2[Horas];
                   (Tabla2[CT]=[@[Centro trabajo]])*(SI.ERROR(HALLAR([@Turno];Tabla2[Turno])>0;0));
                   8,5)

SI.CONJUNTO-FILTRAR-SI aplica condiciones
La fórmula se basa en la idea de buscar (HALLAR) los turnos de cada registro en la tabla auxiliar (en la columna correspondiente), junto a la condición del 'centro de trabajo', claro... Es importante construir y transformar correctamente el rango auxiliar de condiciones... bastará ir condición a condición completando cada columna con su valor de campo correspondiente...
Siendo necesario definir listados excluyentes de 'turnos' para cubrir el caso de 'otros', como por ejemplo en la condición de 'FAB y otros turnos'
SI.CONJUNTO-FILTRAR-SI aplica condiciones

Con una buena definición de criterios en nuestro rango auxiliar conseguimos resultados únicos, dando salida a la opción 'cualquier otro caso' (última prueba lógica) con el tercer argumento de la función FILTRAR '[if_empty]'
:OOO

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.