PBCIT
Ok, tengo un problema que he estado tratando de resolver desde hace un tiempo. Tengo algunas tablas que estoy usando. El primero es de una base de datos que creó un tercero y es lo que uso para obtener los datos de la factura. En nuestro sistema ERP, a cada artículo se le asigna un número de artículo para su identificación, pero los números de artículo se pueden reutilizar. En la base de datos que uso, esto se contabiliza dando a cada artículo una identificación de producto separada para dar cuenta de las diferentes versiones del artículo. Luego tengo informes que registran el número de artículo, pero dado que no hay una identificación de producto en esos informes, tengo dificultades para emparejar los datos y obtener el artículo que se usó en el momento de la compra. Aquí hay una muestra de los datos y lo que he hecho actualmente (los datos son falsos):
De la base de datos:
ID del Producto | Número de artículo | Descripción | Última fecha de facturación |
215678 | 00001 | Pancho | 8/1/2020 |
215679 | 00002 | bollos | 8/1/2020 |
215680 | 00001 | Perro caliente jumbo | 18/09/2021 |
215681 | 00002 | Paquete de 8 bollos |
19/09/2021 |
Del informe:
Fecha de devolución: | Número de artículo |
7/6/2020 | 00001 |
31/07/2020 | 00002 |
2/1/2021 | 00001 |
¿Cómo puedo asegurarme de que se complete la descripción correcta según el número de artículo y la fecha de devolución? ¿Alguien tiene alguna idea?
tommartens
Hola @PBCIT,
Uso esta instrucción DAX para crear una columna calculada dentro de la tabla del informe:
Column =
var ItemNumber="report"[Item Number]
var DateReturned = 'report'[Date Returned]
var previousDate = MAXX(FILTER( SUMMARIZE( 'database' , database[Item Number] , database[LastDateInvoiced] ) , 'database'[Item Number] = 'database'[Item Number] && 'database'[LastDateInvoiced] < DateReturned ) , database[LastDateInvoiced] )
var checkPreVDate = IF( ISBLANK( previousDate ) , DateReturned , previousDate + 1)
var nextDate = MINX(FILTER( SUMMARIZE( 'database' , database[Item Number] , database[LastDateInvoiced] ) , 'database'[Item Number] = 'database'[Item Number] && 'database'[LastDateInvoiced] >= DateReturned ) , database[LastDateInvoiced] )
var _item = MAXX( FILTER( 'database' , 'database'[Item Number] = ItemNumber && ( 'database'[LastDateInvoiced] >= checkPreVDate && database[LastDateInvoiced] <= nextDate ) ) ,[Description] )
return
_item
Lo que hace esta declaración (o al menos debería hacer) es lo siguiente: determinar el período de tiempo en que se usó un elemento en función de la columna de fecha de devolución en la tabla del informe. Estas fechas se almacenan en las variables checkPreviousDate y nextDate. Luego, estas fechas se utilizan para filtrar la descripción.
Según los datos de muestra que proporcionó, el informe se verá así:
Tenga en cuenta que este tipo de cálculo puede volverse lento, según el tamaño de la tabla de la base de datos y la cantidad de versiones, esto se debe a que SSAS Tabular, el motor de base de datos subyacente del modelo de datos de Power BI, no sabe la secuencia del tipo de datos.
Es posible que deba considerar la creación de columnas de artículo/descripción fuera de Power BI y usar una base de datos relacional en el medio (algún tipo de almacén de datos).
Con suerte, esto proporciona lo que está buscando.
Saludos,
Tomás
v-luwang-msft
Hola @PBCIT,
Use el siguiente dax para crear una nueva columna:
describution =
VAR maxdate =
CALCULATE (
MAX ( 'Table'[LastDateInvoiced] ),
FILTER (
ALL ( 'Table' ),
'Table'[LastDateInvoiced] > 'Table (2)'[Date Returned:]
&& 'Table'[Item Number] = 'Table (2)'[Item Number]
)
)
RETURN
CALCULATE (
MAX ( 'Table'[Description] ),
FILTER (
ALL ( 'Table' ),
'Table'[Item Number] = 'Table (2)'[Item Number]
&& 'Table'[LastDateInvoiced] = maxdate
)
)
Resultado de salida:
¿Respondí tu pregunta? ¡Marca mi publicación como una solución!
Atentamente
Lucien
tommartens
Hola @PBCIT,
Uso esta instrucción DAX para crear una columna calculada dentro de la tabla del informe:
Column =
var ItemNumber="report"[Item Number]
var DateReturned = 'report'[Date Returned]
var previousDate = MAXX(FILTER( SUMMARIZE( 'database' , database[Item Number] , database[LastDateInvoiced] ) , 'database'[Item Number] = 'database'[Item Number] && 'database'[LastDateInvoiced] < DateReturned ) , database[LastDateInvoiced] )
var checkPreVDate = IF( ISBLANK( previousDate ) , DateReturned , previousDate + 1)
var nextDate = MINX(FILTER( SUMMARIZE( 'database' , database[Item Number] , database[LastDateInvoiced] ) , 'database'[Item Number] = 'database'[Item Number] && 'database'[LastDateInvoiced] >= DateReturned ) , database[LastDateInvoiced] )
var _item = MAXX( FILTER( 'database' , 'database'[Item Number] = ItemNumber && ( 'database'[LastDateInvoiced] >= checkPreVDate && database[LastDateInvoiced] <= nextDate ) ) ,[Description] )
return
_item
Lo que hace esta declaración (o al menos debería hacer) es lo siguiente: determinar el período de tiempo en que se usó un elemento en función de la columna de fecha de devolución en la tabla del informe. Estas fechas se almacenan en las variables checkPreviousDate y nextDate. Luego, estas fechas se utilizan para filtrar la descripción.
Según los datos de muestra que proporcionó, el informe se verá así:
Tenga en cuenta que este tipo de cálculo puede volverse lento, según el tamaño de la tabla de la base de datos y la cantidad de versiones, esto se debe a que SSAS Tabular, el motor de base de datos subyacente del modelo de datos de Power BI, no sabe la secuencia del tipo de datos.
Es posible que deba considerar la creación de columnas de artículo/descripción fuera de Power BI y usar una base de datos relacional en el medio (algún tipo de almacén de datos).
Con suerte, esto proporciona lo que está buscando.
Saludos,
Tomás