Recuento Número de paquetes vendidos según el número de factura.

Un usuario Pregunto ✅

kpfútbol1029

Hola, estoy tratando de configurar una medida en Power BI que cuente el número de un paquete específico que se vende en mi empresa. Tengo una tabla de datos de facturas junto con una tabla de productos y quiero contar cuántas veces vendimos la combinación de componentes de productos «A, B y C» en cada factura única. En la siguiente tabla, la respuesta correcta sería 2 porque tenemos 3 ocurrencias positivas del paquete y 1 ocurrencia negativa que indica un paquete devuelto. También hay situaciones en las que puede haber 2 paquetes vendidos en una factura, o múltiplos de un artículo, pero solo puede clasificar 1 «paquete» porque los otros artículos solo tienen 1 unidad cada uno. Avíseme si necesita más información para ayudarlo con esto, ya que soy relativamente nuevo en DAX. Agradezco mucho cualquier ayuda.

Factura Componente del producto Unidades
111 A 1
111 B 1
111 C 1
111 D 1
222 A 2
222 B 3
222 C 2
333 A 1
333 C 1
333 X 1
333 V 1
444 B 1
444 A 1
444 V 1
555 A -1
555 B -1
555 C -1

Anónimo

En respuesta a Anónimo

# Bundles = 
SUMX(
    VALUES( InvoiceDetails[Invoice] ),
    var __invoiceDetails =
        CALCULATETABLE(
            InvoiceDetails,
            ALLEXCEPT( InvoiceDetails, InvoiceDetails[Invoice] )
        )
    var __onlyABCLines =
        FILTER(
            __invoiceDetails,
            InvoiceDetails[Component] in {"A", "B", "C"}
        )
    var __ABCLinesAggregated =
    	addcolumns(
	    	summarize(
	    		__onlyABCLines,
	    		InvoiceDetails[Component]
	    	),
	    	"UnitsSum",
	    		var __component = InvoiceDetails[Component]
	    		var __invWithComponent =
	    			filter(
	    				__onlyABCLines,
	    				InvoiceDetails[Component] = __component
	    			)
	    		return
	    			sumx(
	    				__invWithComponent,
	    				InvoiceDetails[Units]
	    			)
	    )
    var __abcPresent = COUNTROWS( __ABCLinesAggregated ) = 3
    var __min = MINX( __ABCLinesAggregated, [UnitsSum] )
    var __max = MAXX( __ABCLinesAggregated, [UnitsSum] )
    return
        if( __abcPresent,
            if( __min > 0, __min, __max ),
            0
        )
)

Por favor, intente lo anterior. Ahora debería funcionar….

Mejor

D

Anónimo

@kpfootball1029
Hola colega
si quieres, comparto contigo un enlace para descargar un archivo pbi con mi solución: https://gofile.io/?c=bUaaru
funciona muy bien
Sin embargo, la medida es un poco grande.

Anónimo

En respuesta a Anónimo

Pruebe la medida que ha escrito en modelos realmente grandes.

Pregunta: ¿Realmente tiene que usar flotadores imprecisos y más lentos para calcular los conteos? Tienes 4 cálculos (tablas) en tu código. Trate de contar también el número de transiciones de contexto. Entonces sabrás que esta medida es cuanto menos problemática.

Y por favor no me malinterpreten. Estoy escudriñando un poco tu medida y según mi experiencia… No es tan buena como te gustaría que fuera. Es muy probable que detenga todo el cálculo en modelos suficientemente grandes.

Una medida rápida es aquella que utiliza el motor de almacenamiento la mayor parte del tiempo. No el motor de fórmula. Desafortunadamente, sus fórmulas fuerzan el uso de FE.

Especialmente el uso de DIVIDE bajo SUMX es una forma segura de invocar CALLBACKS.

Mejor
D

Anónimo

En respuesta a Anónimo

Lo siento, pero no todos pueden ser tan inteligentes como tú.
Mucha gente está aquí para estudiar DAX (yo también porque soy nuevo)

Anónimo

En respuesta a Anónimo

@Anónimo, acabo de analizar tu código. No te estoy criticando, estoy señalando las debilidades del código.

También he estudiado DAX, pero no en foros, sino leyendo libros y tomando cursos, creando modelos para grandes empresas. En los foros apenas puedes tocar el tema. DAX es difícil. Hágase un favor y no use este foro como una forma de conocer a DAX. Carece de sentido. Aprenda de los maestros de su oficio: Alberto Ferrari y Marco Russo.

Mejor
D

Anónimo

En respuesta a Anónimo

Sí, no hay duda de que puedo estudiar más leyendo libros de esos chicos. 😃
seguro lo hare
Gracias

Anónimo

# Bundles = 
SUMX(
    VALUES( InvoiceDetails[Invoice] ),
    var __invoiceDetails =
        CALCULATETABLE(
            InvoiceDetails,
            ALLEXCEPT( InvoiceDetails, InvoiceDetails[Invoice] )
        )
    var __onlyABCLines =
            FILTER(
                __invoiceDetails,
                InvoiceDetails[Component] in {"A", "B", "C"}
            )
    var __abcPresent = COUNTROWS( __onlyABCLines ) = 3
    var __min = MINX( __onlyABCLines, InvoiceDetails[Units] )
    var __max = MAXX( __onlyABCLines, InvoiceDetails[Units] )
    return
        if( __abcPresent,
            if( __min > 0, __min, __max ),
            0
        )
)

Aquí está su medida… que también funciona bien con negativos.

Mejor

D

kpfútbol1029

En respuesta a Anónimo

Hola D, acabo de probar esta medida en mi conjunto de datos y no parece estar contando una factura que tiene 2 unidades de cada producto como 2 paquetes. En cambio, lo está contando como 0 paquetes, por lo que mi cuenta se está quedando corta. Es muy posible que haya cometido un error al poner esto en Power BI, pero quiero comprobar si esta solución también está configurada para ese escenario. ¿Tiene un archivo de ejemplo de Power BI donde esto funcione? ¡Gracias! – ken

Anónimo

En respuesta a kpfútbol1029

Claro que tengo… Esto es lo que devuelve la medida. Si tiene un caso en el que cree que no funciona… muéstremelo y actualizaré mi archivo. Gracias.

Paquetes Calc.PNG

kpfútbol1029

En respuesta a Anónimo

Estaba limitado por caracteres en mi última respuesta, pero aquí están mis capturas de pantalla del código. Junto con un cálculo manual de lo que necesito.

imagen.png

imagen.png

Conjunto de datos con monto de paquete correcto a nivel de factura.

Factura COMPONENTE Suma de Unidades Recuento de paquetes (Hecho A mano)
1111 A 1 1
1111 B 1
1111 C 1
1111 I 1
1111 O 1
1111 Y 1
2222 A 1 1
2222 B 1
2222 C 1
2222 I 1
2222 O 2
2222 Y 1
3333 A 1 1
3333 B 1
3333 C 1
3333 I 1
4444 A 1 1
4444 B 1
4444 C 1
4444 I 1
5555 A 1 1
5555 B 1
5555 C 1
5555 I 1
5555 O 1
5555 Y 1
6666 A 1 1
6666 B 1
6666 C 1
6666 I 1
6666 PAGS 1
7777 A 1 1
7777 B 1
7777 C 1
7777 D 1
7777 I 1
7777 X 6
7777 Y 2
8888 A 1 1
8888 B 1
8888 C 1
8888 I 1
8888 PAGS 1
9999 A 2 1
9999 B 1
9999 C 1
9999 D 1
9999 I 1
9999 X 6
9999 Y 2
11110 A 1 1
11110 B 1
11110 C 1
11110 D 1
11110 I 1
11110 X 6
11110 Y 2
12221 A 1 1
12221 B 1
12221 C 1
12221 D 1
12221 I 1
12221 X 6
12221 Y 2
13332 A 1 0
14443 A 1 1
14443 B 1
14443 C 1
14443 I 1
14443 PAGS 1
15554 A 1 0
16665 A 1 1
16665 B 1
16665 C 1
16665 D 1
16665 I 1
16665 X 6
16665 Y 2
17776 A 1 1
17776 B 1
17776 C 1
17776 D 1
17776 I 1
17776 X 6
17776 Y 2
18887 Z 1 0
19998 A 1 1
19998 B 1
19998 C 1
19998 I 1
19998 O 1
19998 Y 1
21109 A 1 1
21109 B 1
21109 C 1
21109 I 1
21109 O 2
21109 Y 1
22220 A 1 1
22220 B 1
22220 C 1
22220 I 1
22220 O 2
22220 Y 1
23331 A 2 2
23331 B 2
23331 C 2
23331 I 2
23331 PAGS 2
24442 A 1 1
24442 B 1
24442 C 1
24442 I 1
24442 PAGS 1
25553 A 2 2
25553 B 2
25553 C 2
25553 I 2
25553 PAGS 2
26664 A 1 1
26664 B 1
26664 C 1
26664 F 3
26664 H 1
26664 I 1
26664 METRO 2
26664 norte 2
27775 A 1 1
27775 B 1
27775 C 1
27775 I 1
27775 PAGS 1
28886 A 1 1
28886 B 1
28886 C 1
28886 I 1
28886 PAGS 1
29997 A 1 1
29997 B 1
29997 C 1
29997 I 1
29997 PAGS 1
31108 A 1 1
31108 B 1
31108 C 1
31108 I 1
31108 PAGS 1
32219 A 1 1
32219 B 1
32219 C 1
32219 I 1
32219 PAGS 1
33330 A 1 1
33330 B 1
33330 C 1
33330 I 1
33330 PAGS 1
34441 A 1 1
34441 B 1
34441 C 1
34441 I 1
34441 PAGS 1
35552 A 1 1
35552 B 1
35552 C 1
35552 I 1
35552 PAGS 1
36663 j 2
36663 k 1
36663 METRO 1
37774 A 1 1
37774 B 1
37774 C 1
37774 I 1
37774 PAGS 1
38885 A 1 1
38885 B 1
38885 C 1
38885 I 1
38885 PAGS 1
39996 A 1 1
39996 B 1
39996 C 1
39996 I 1
39996 PAGS 1
41107 A 1 1
41107 B 1
41107 C 1
41107 I 1
41107 PAGS 1
42218 A 1 1
42218 B 1
42218 C 1
42218 I 1
42218 PAGS 1
43329 L 1 0
44440 B 1 0
44440 METRO 1
45551 q 0 0
46662 q 0 0
47773 q 0 0
48884 q 0 0
49995 A 1 0
5555555 A -2 -2
5555555 B -2
5555555 C -2
grandioso Total 248 34

kpfútbol1029

En respuesta a Anónimo

Hola D, he replicado la medida con un nuevo conjunto de datos que se parece más a mis datos de trabajo. El recuento que obtengo es 31, pero el recuento correcto sería 34. Incluí el conjunto de datos y las capturas de pantalla de lo que tengo. Enviaría el archivo .pbix pero no veo una opción para adjuntar el archivo. ¡Gracias! – ken

Datos Colocar

Factura COMPONENTE Unidades
1111 A 1
2222 A 1
3333 A 1
4444 A 1
5555 A 1
6666 A 1
7777 A 1
8888 A 1
9999 X 1
9999 X 1
11110 A 1
12221 A 1
9999 A 1
9999 A 1
13332 A 1
14443 A 1
15554 A 1
16665 A 1
17776 A 1
11110 X 1
11110 X 1
12221 X 1
12221 X 1
7777 X 1
7777 X 1
17776 X 1
17776 X 1
11110 Y 1
7777 Y 1
12221 Y 1
12221 Y 1
9999 Y 1
16665 X 1
16665 X 1
11110 Y 1
9999 X 1
12221 X 1
11110 X 1
12221 X 1
9999 X 1
18887 Z 1
12221 D 1
9999 D 1
16665 D 1
7777 D 1
11110 D 1
17776 D 1
12221 B 1
11110 X 1
2222 Y 1
19998 Y 1
21109 Y 1
5555 Y 1
1111 Y 1
22220 Y 1
23331 A 1
24442 A 1
25553 A 1
25553 A 1
26664 F 1
26664 A 1
27775 B 1
26664 C 1
11110 X 1
12221 X 1
28886 A 1
12221 X 1
11110 X 1
19998 B 1
25553 B 1
23331 B 1
24442 B 1
29997 B 1
28886 B 1
23331 B 1
25553 B 1
21109 B 1
31108 B 1
22220 B 1
32219 B 1
33330 B 1
8888 B 1
34441 A 1
35552 A 1
26664 H 1
2222 B 1
22220 I 1
25553 I 1
26664 I 1
25553 I 1
11110 I 1
28886 I 1
9999 I 1
14443 I 1
29997 I 1
36663 j 1
33330 I 1
12221 I 1
31108 I 1
37774 I 1
17776 I 1
26664 F 1
36663 k 1
16665 I 1
8888 I 1
33330 A 1
31108 A 1
22220 A 1
38885 I 1
39996 I 1
32219 I 1
6666 I 1
1111 I 1
5555 I 1
4444 B 1
3333 B 1
19998 I 1
2222 I 1
37774 A 1
21109 A 1
19998 A 1
23331 A 1
41107 A 1
29997 A 1
27775 A 1
42218 A 1
28886 C 1
14443 C 1
37774 C 1
39996 C 1
16665 X 1
16665 X 1
43329 L 1
26664 METRO 1
26664 F 1
26664 METRO 1
16665 B 1
14443 B 1
41107 B 1
37774 B 1
39996 B 1
36663 j 1
26664 norte 1
26664 norte 1
26664 B 1
5555 B 1
42218 B 1
35552 B 1
34441 B 1
6666 B 1
17776 B 1
1111 B 1
38885 B 1
22220 O 1
5555 O 1
19998 O 1
21109 O 1
2222 O 1
22220 O 1
1111 O 1
21109 O 1
2222 O 1
17776 Y 1
7777 Y 1
7777 X 1
7777 X 1
16665 Y 1
16665 Y 1
17776 Y 1
9999 Y 1
9999 X 1
9999 X 1
11110 B 1
9999 B 1
7777 B 1
16665 C 1
8888 C 1
17776 C 1
32219 C 1
31108 C 1
22220 C 1
33330 C 1
38885 C 1
42218 C 1
27775 C 1
38885 PAGS 1
41107 PAGS 1
29997 PAGS 1
32219 PAGS 1
34441 PAGS 1
14443 PAGS 1
6666 PAGS 1
25553 PAGS 1
37774 PAGS 1
24442 PAGS 1
27775 PAGS 1
42218 PAGS 1
28886 PAGS 1
39996 PAGS 1
31108 PAGS 1
25553 PAGS 1
35552 PAGS 1
23331 PAGS 1
23331 PAGS 1
8888 PAGS 1
33330 PAGS 1
17776 X 1
16665 X 1
17776 X 1
16665 X 1
17776 X 1
17776 X 1
7777 X 1
7777 X 1
44440 METRO 1
36663 METRO 1
4444 C 1
3333 C 1
4444 I 1
3333 I 1
45551 q 1
46662 q 1
46662 q -1
47773 q 1
47773 q -1
45551 q -1
48884 q -1
48884 q 1
44440 B 1
34441 C 1
7777 C 1
35552 C 1
6666 C 1
5555 C 1
39996 A 1
49995 A 1
23331 I 1
21109 I 1
7777 I 1
24442 I 1
35552 I 1
42218 I 1
41107 I 1
23331 I 1
34441 I 1
27775 I 1
21109 C 1
23331 C 1
25553 C 1
25553 C 1
29997 C 1
11110 C 1
2222 C 1
24442 C 1
12221 C 1
41107 C 1
23331 C 1
9999 C 1
1111 C 1
19998 C 1
32219 A 1
38885 A 1
5555555 A -1
5555555 B -1
5555555 C -1
5555555 A -1
5555555 B -1
5555555 C -1

Correcto Producción

Factura Cantidad de paquetes
1111 1
2222 1
3333 1
4444 1
5555 1
6666 1
7777 1
8888 1
9999 1
11110 1
12221 1
13332 0
14443 1
15554 0
16665 1
17776 1
18887 0
19998 1
21109 1
22220 1
23331 2
24442 1
25553 2
26664 1
27775 1
28886 1
29997 1
31108 1
32219 1
33330 1
34441 1
35552 1
36663 0
37774 1
38885 1
39996 1
41107 1
42218 1
43329 0
44440 0
45551 0
46662 0
47773 0
48884 0
49995 0
5555555 -2
Gran total 34

Anónimo

En respuesta a kpfútbol1029

La suposición en la fórmula es que no puede tener tal caso:

5555555 A-1
5555555 B-1
5555555 C-1
5555555 A-1
5555555 B-1
5555555 C-1

Los casos deben agregarse, nunca debe haber un valor repetido de A, B, C,…. Lo anterior debe ser A -> -2, B -> -2….

¿Por qué tienes repeticiones?

Mejor
D

kpfútbol1029

En respuesta a Anónimo

Hay repeticiones porque el componente es una jerarquía por encima del número de elemento que sería un valor único para cada fila, lo que crea repeticiones en el campo del componente. Probablemente necesitaríamos un paso que agrupe las filas por componente primero para eliminarlas luego.

Anónimo

En respuesta a kpfútbol1029

Sí, la fórmula debe ajustarse para tener en cuenta estos casos. Lo haré en un momento.

Mejor
D

Anónimo

En respuesta a Anónimo

# Bundles = 
SUMX(
    VALUES( InvoiceDetails[Invoice] ),
    var __invoiceDetails =
        CALCULATETABLE(
            InvoiceDetails,
            ALLEXCEPT( InvoiceDetails, InvoiceDetails[Invoice] )
        )
    var __onlyABCLines =
        FILTER(
            __invoiceDetails,
            InvoiceDetails[Component] in {"A", "B", "C"}
        )
    var __ABCLinesAggregated =
    	addcolumns(
	    	summarize(
	    		__onlyABCLines,
	    		InvoiceDetails[Component]
	    	),
	    	"UnitsSum",
	    		var __component = InvoiceDetails[Component]
	    		var __invWithComponent =
	    			filter(
	    				__onlyABCLines,
	    				InvoiceDetails[Component] = __component
	    			)
	    		return
	    			sumx(
	    				__invWithComponent,
	    				InvoiceDetails[Units]
	    			)
	    )
    var __abcPresent = COUNTROWS( __ABCLinesAggregated ) = 3
    var __min = MINX( __ABCLinesAggregated, [UnitsSum] )
    var __max = MAXX( __ABCLinesAggregated, [UnitsSum] )
    return
        if( __abcPresent,
            if( __min > 0, __min, __max ),
            0
        )
)

Por favor, intente lo anterior. Ahora debería funcionar….

Mejor

D

greg_deckler

Probablemente mejores formas de hacer esto, pero esto parece funcionar. PBIX adjunto.

Measure = 
    VAR __Table = FILTER('Table',[Units]>0)
    VAR __Table1 =
        SUMMARIZE(
            'Table',
            [Invoice],
            "A",SUMX(FILTER(__Table,[Invoice]=EARLIER('Table'[Invoice]) && [Product Component] = "A"),[Units]),
            "B",SUMX(FILTER(__Table,[Invoice]=EARLIER('Table'[Invoice]) && [Product Component] = "B"),[Units]),
            "C",SUMX(FILTER(__Table,[Invoice]=EARLIER('Table'[Invoice]) && [Product Component] = "C"),[Units])
        )
RETURN
    COUNTROWS(FILTER(__Table1,[A] > 0 && [B] > 0 && [C] > 0))

kpfútbol1029

En respuesta a greg_deckler

¡Hola Greg! ¡Aprecio tu respuesta! Eché un vistazo a la salida y la puse en una tabla con la Factura y la Medida y parece que solo devuelve las Facturas 111 y 222 con valores de 1 paquete cada una. Idealmente, devolvería todas las facturas, con un valor de la cantidad de paquetes similar al siguiente. – Gracias Ken

Factura Paquetes (Medida)
111 1
222 2
333 0
444 0
555 -1
Total 2

Anónimo

En respuesta a kpfútbol1029

Hola

echa un vistazo a mi solución por favor. Espero que te ayude

scr.png

Anónimo

En respuesta a Anónimo

@Anónimo, su medida se rompe cuando hay números negativos en una factura de valor diferente. Por ejemplo, A -> -1, B -> -3, C -> -2. Su fórmula devolverá -3 y debería -1.

Mejor
D

Anónimo

En respuesta a Anónimo

@AnónimoHola

¿Podría echar un vistazo, si tiene algo de tiempo en mi solución? Parece funcionar
PD: para corregir un total incorrecto en mi primera tabla, agregué una medida adicional en mi segunda tabla

Gracias

scr.pngscr1.png

Anónimo

En respuesta a Anónimo

Hola @Anonimo.

Lamento decirte eso, pero nunca miro el código que es muy incomprensible y complejo. Es una pérdida de tiempo. El código donde los nombres de var son como a, b, c, d… no es algo que disfrute leer. Un buen nombre hace las cosas mucho más fáciles.

Y por favor, no te ofendas por esto. Simplemente no tengo suficiente tiempo para repasar las medidas y analizarlas en detalle.

Hágase una pregunta simple: ¿Qué versión de código le gustaría mantener con el tiempo: la mía o la suya arriba? No es suficiente escribir algo que funcione. Tiene que ser comprensible y fácil de cambiar sin romper la funcionalidad existente. Este es el estándar de programación que necesito.

Mejor
D

Deja un comentario

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