Obtener el número de artículo correcto

Un usuario Pregunto ✅

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í:

imagen.png

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

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:

vluwangmsft_0-1632796442473.png

¿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í:

imagen.png

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *