Anónimo
Todo,
Recibo el siguiente error:
«Consulta (21, 20) La variable de tabla ‘TopValues’ no se puede utilizar en el contexto actual porque se espera una tabla base.«
al ejecutar la siguiente expresión:
// This expression adds minutes to a datetime, but only distributes them over specified work days (mon-fri) and work hours (9-5). EVALUATE VAR startDatetime = DATE ( 2018, 12, 28 ) + TIME ( 16, 0, 0 ) VAR MinutesToAdd = 720 VAR Range = GENERATESERIES ( startDatetime, startDatetime + 90, TIME ( 0, 1, 0 ) ) // the 90 days is an abritary number. VAR FilteredRange = FILTER ( Range, NOT WEEKDAY ( [Value] ) IN { 1, 7 } // Include only weekdays && HOUR ( [Value] ) >= 9 && HOUR ( [Value] ) < 17 // 9 AM to 5 PM && NOT ( MONTH ( [Value] ) = 12 && DAY ( [Value] ) = 25 ) // Exclude Christmas ) VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC ) VAR Result = MAX ( TopValues[Value] ) RETURN Result
¿Alguna idea sobre una solución?
Anónimo
Arreglado. Por alguna razón, cambiar MAX a MAXX funciona:
EVALUATE { VAR startDatetime = DATE ( 2018, 12, 28 ) + TIME ( 16, 0, 0 ) VAR MinutesToAdd = 720 VAR Range = GENERATESERIES ( startDatetime, startDatetime + 90, TIME ( 0, 1, 0 ) ) // the 90 days is an abritary number. VAR FilteredRange = FILTER ( Range, NOT WEEKDAY ( [Value] ) IN { 1, 7 } // Include only weekdays && HOUR ( [Value] ) >= 9 && HOUR ( [Value] ) < 17 // 9 AM to 5 PM && NOT ( MONTH ( [Value] ) = 12 && DAY ( [Value] ) = 25 ) // Exclude Christmas ) VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC ) VAR Result = MAXX ( TopValues, [Value] ) // Must be changed to MAXX RETURN Result }
Anónimo
Arreglado. Por alguna razón, cambiar MAX a MAXX funciona:
EVALUATE { VAR startDatetime = DATE ( 2018, 12, 28 ) + TIME ( 16, 0, 0 ) VAR MinutesToAdd = 720 VAR Range = GENERATESERIES ( startDatetime, startDatetime + 90, TIME ( 0, 1, 0 ) ) // the 90 days is an abritary number. VAR FilteredRange = FILTER ( Range, NOT WEEKDAY ( [Value] ) IN { 1, 7 } // Include only weekdays && HOUR ( [Value] ) >= 9 && HOUR ( [Value] ) < 17 // 9 AM to 5 PM && NOT ( MONTH ( [Value] ) = 12 && DAY ( [Value] ) = 25 ) // Exclude Christmas ) VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC ) VAR Result = MAXX ( TopValues, [Value] ) // Must be changed to MAXX RETURN Result }
Greg_Deckler
Correcto, TOPN requiere una tabla, no una tabla o expresión de tabla.
https://docs.microsoft.com/en-us/dax/topn-function-dax
No estoy completamente seguro de entender su necesidad de eso, ya que en la siguiente línea simplemente toma el MAX. ¿Solo toma el MAX de tu FilteredRange?
Anónimo
En respuesta a Greg_Deckler
El TOPN (junto con MAX ()) es necesario para que funcione la lógica de negocios descrita (es decir, agregar tiempo a una fecha y hora, pero solo para que se aplique a los días y horas de trabajo). Como alternativa a TOPN y MAX (), es posible que haya agregado un índice y luego aplicado FILTER () para regresar [value] donde [index] = MinutesToAdd, pero TOPN es una solución elegante con un plan de consulta optimizado.
De todos modos, este punto es discutible porque TOPN no es el problema. Puede confirmar esto en DAX Studio evaluando esa variable, es decir, esto funciona:
VAR TopValues = TOPN ( MinutesToAdd, FilteredRange, [Value], ASC ) //VAR Result = MAX ( TopValues[Value] ) RETURN TopValues