FALSE https://interactivechaos.ovh/es es Marcado de días como laborables o no laborables https://interactivechaos.ovh/es/dax/scenario/marcado-de-dias-como-laborables-o-no-laborables <span class="field field--name-title field--type-string field--label-hidden">Marcado de días como laborables o no laborables</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Dom, 14/07/2019 - 09:20</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La adición de esta información a nuestra tabla de calendario -si cada uno de los días es o no laborable- puede resultar de gran utilidad de muchos casos. Planteémonos, en primer lugar, el caso más sencillo: el marcado de cada uno de los días en función del día de la semana de que se trate. Es decir, marquemos como laborables los días entre el lunes y el viernes, ambos incluidos, y como no laborables el sábado y el domingo. Para ello vamos a utilizar la función <a href="/dax/function/weekday">WEEKDAY</a> que acepta como argumento una fecha y devuelve un número identificando el día de la semana correspondiente.</p> <p>Partimos de una tabla "<em>Calendar</em>" que incluye únicamente una columna con las fechas:</p> <img alt="Tabla calendario" data-entity-type="file" data-entity-uuid="287975a2-fe80-44b5-9dcf-c0688d1cb295" src="/sites/default/files/inline-images/escenario-dax-0090.png" class="align-center" width="182" height="270" loading="lazy" /><p>Creamos una nueva columna calculada en la que extraemos el número de día de la semana:</p> <div class="codigo"> <p>Nº de día de la semana =<br />     WEEKDAY('Calendar'[Date];2)</p> </div> <p>En este caso se ha optado por la opción 2 (de las tres que se ofrecen), opción que asigna el valor 1 al lunes y el 7 al domingo:</p> <img alt="Calendario incluyendo el número de día de la semana" data-entity-type="file" data-entity-uuid="35ac43d6-5558-435a-92dd-57d4cdf90d7e" src="/sites/default/files/inline-images/escenario-dax-0091.png" class="align-center" width="327" height="335" loading="lazy" /><p>Podemos comparar los nombres de los días de la semana que se muestran en la función <em>Date</em> con el valor mostrado en la columna recién creada para confirmar que el criterio es el comentado. Así, por ejemplo, la primera fecha mostrada en la del jueves 1 de enero de 2015, día al que se asigna correctamente el valor 4 en la recién creada columna calculada.</p> <p>En realidad no hubiera sido necesario crear esta columna, apenas nos sirve para confirmar los valores que reciben cada uno de los días. Lo que sí es necesario en la creación de una columna -a la que podemos llamar <em>Día laboral</em>- que, por ejemplo, contenga el booleano TRUE cuando el día sea laboral, y el booleano FALSE cuando no lo sea. Y para esta asignación vamos a comparar el valor numérico asignado por la función WEEKDAY a cada uno de los días: cuando tome los valores 1, 2, 3, 4 o 5, se asignará el valor TRUE, y cuando tome los valores 6 o 7, FALSE. Lógicamente estos valores son los correctos solo si estamos usando la función WEEKDAY con la mencionada opción 2. Si escogiésemos otra opción, habría que escoger las cifras adecuadamente:</p> <div class="codigo"> <p>Día laboral = <br />     IF(<br />         WEEKDAY('Calendar'[Date]; 2) &lt; 6;<br />         TRUE();<br />         FALSE()<br />     )</p> </div> <img alt="Calendario con los días marcados como laborables o no laborables" data-entity-type="file" data-entity-uuid="61008365-5edc-4674-815b-f93cad57427c" src="/sites/default/files/inline-images/escenario-dax-0092.png" class="align-center" width="407" height="474" loading="lazy" /><p>En un segundo paso, si quisiéramos añadir como días no laborables otras festividades, podríamos recurrir a mantener otra tabla con este listado. Por ejemplo, supongamos que las fechas no laborables adicionales son las mostradas en la siguiente tabla ("<em>Festivos</em>"):</p> <img alt="Tabla de festivos" data-entity-type="file" data-entity-uuid="0709eb31-d6ce-4f96-928d-b2406e1dd240" src="/sites/default/files/inline-images/escenario-dax-0093.png" class="align-center" width="162" height="73" loading="lazy" /><p>Relacionamos ambas tablas:</p> <img alt="Tablas relacionadas" data-entity-type="file" data-entity-uuid="751866e4-492e-4d27-b171-65584857be69" src="/sites/default/files/inline-images/escenario-dax-0094.png" class="align-center" width="407" height="304" loading="lazy" /><p>Y, a continuación, modificamos el código que hemos creado de forma que asigne el valor TRUE si y solo si el número de día es menor que 6 y no aparece en la tabla de festivos. Esta última condición puede ser escrita de diversas maneras. Por ejemplo, contando el número de filas de la tabla <em>Festivos</em> asociada a cada fecha del calendario: cuando la fecha en cuestión no esté incluida en <em>Festivos</em>, esta tabla no contendrá ningún registro. Y cuando esté, tendrá uno:</p> <div class="codigo"> <p>Día laboral = <br />     IF(<br />         WEEKDAY('Calendar'[Date]; 2) &lt; 6 &amp;&amp; COUNTROWS(RELATEDTABLE(Festivos)) = 0;<br />         TRUE();<br />         FALSE()<br />     )</p> </div> <p>El resultado es el mostrado en la siguiente imagen:</p> <img alt="Calendario considerando los festivos" data-entity-type="file" data-entity-uuid="72e2356c-64a3-4d8e-abdc-b9411aeca29c" src="/sites/default/files/inline-images/escenario-dax-0095.png" class="align-center" width="457" height="510" loading="lazy" /><p>Podemos ver que los días 6 y 13 de enero han sido marcados como "no laborables", tal y como esperábamos.</p> <p>Por supuesto, este escenario podría hacerse más complejo para mostrar diferentes columnas para diferentes localidades o países, etc.</p> </div> <div class="field field--name-field-funciones-dax-involucradas field--type-entity-reference field--label-above"> <div class="field__label">Funciones DAX involucradas</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/term/29" hreflang="es">IF</a></div> <div class="field__item"><a href="/es/taxonomy/term/92" hreflang="es">WEEKDAY</a></div> <div class="field__item"><a href="/es/taxonomy/term/67" hreflang="es">COUNTROWS</a></div> <div class="field__item"><a href="/es/taxonomy/term/71" hreflang="es">RELATEDTABLE</a></div> <div class="field__item"><a href="/es/taxonomy/term/66" hreflang="es">TRUE</a></div> <div class="field__item"><a href="/es/taxonomy/term/95" hreflang="es">FALSE</a></div> </div> </div> Sun, 14 Jul 2019 07:20:08 +0000 admin 1162 at https://interactivechaos.ovh