¿Calcular el reparto de ingresos en un contexto de muchos a muchos?

Un usuario Pregunto ✅

nironixón

Hola, soy completamente nuevo en Power Bi y DAX y realmente no sé cómo calcular
reparto de ingresos en un escenario de muchos a muchos.

Tengo el siguiente modelo de «dominio»:

  1. Cada línea de pedido hace referencia a un «artículo».
  2. Cada Artículo tiene uno o más «Canales» asociados.
  3. Cada combinación de un Artículo y un Canal tiene una «Clave de Asignación».
    La «Clave de asignación» dicta el reparto de ingresos que debe pagarse al «Canal».

reparto de ingresos.png

Ahora se supone que debo crear un informe que responda lo siguiente en un informe dinámico:

Para cada fecha, ¿cuál es el ingreso de cada canal?

«Pseudocódigo»:

  1. para cada fecha:
    1. para cada canal:
      suma += Línea de pedido.Cantidad * Artículo.Puente_Artículo_Canal.Clave de asignación

¿Tienes alguna idea de cómo resolver esto?
¡Se agradece mucho cualquier ayuda!

Saludos
Niclas

nironixón

En respuesta a nironixón

HOLA @MFelix y otros,

¡Creo que he resuelto mi problema y me gustaría compartirlo contigo ya que fuiste amable tratando de ayudarme!

1. Reestructuré el modelo de datos y las relaciones subyacentes, pero mantuve la relación requerida de muchos a muchos.

2. Una nueva tabla llamada «Asignaciones» que almacena la fórmula ArticleId, Channel y Allocation.

Para calcular el reparto de ingresos de cada canal, creo dos medidas. Uso la función DAX LOOKUPVALUE para encontrar la fórmula de asignación actual necesaria al calcular el reparto de ingresos.

Parece estar funcionando, dando un resultado correcto en mis datos de prueba. Sin embargo, no estoy seguro de si hay errores ocultos en esto de los que me he dado cuenta todavía. ¡Aprender DAX es sangriento!

Reparto de ingresos =
CALCULAR (
SUMX (
Líneas de pedido;
Líneas de pedido[Amount] * [AllocationKey]
)
)

Clave de asignación =
VALOR DE BÚSQUEDA (
Asignaciones[Allocation];
Asignaciones[ArticleId]; VALOR SELECCIONADO ( Líneas de pedido[ArticleId] );
Asignaciones[Channel]; VALOR SELECCIONADO ( Asignaciones[Channel] )
)

nuevasrelaciones.png

También he actualizado el archivo pbix si quieres echarle un vistazo.

https://mskpistormaster.blob.core.windows.net/share/calle.pbix

Saludos Niclas

mfelix

Hola @nironixon,

No estoy seguro de cómo deberían verse sus datos en términos de asignación, pero hice una muestra basada en su imagen.

Cree una medida con el siguiente código:

Price allocated =
CALCULATE (
    SUMX (
        OrderLines;
        OrderLines[Price] * RELATED ( Bridge_Article_Channel[AllocationFormula] )
    )
)

Como puede ver a continuación en mi muestra, esto es calcular los valores del precio multiplicado por la asignación, ya que es una medida que se basa en el contexto, por lo que si cambia sus imágenes para la fecha/canal, debe proporcionar lo que necesita.

Relación.png

Saludos,

mfelix

nironixón

En respuesta a mfelix

Hola @MFelix, muchas gracias por todos tus esfuerzos tratando de ayudarme, ¡realmente lo aprecio!

Traté de implementar su solución pero no funciona. Supongo que estamos usando un modelo y relaciones diferentes.
Al crear la medida «Precio asignado», no puedo hacer referencia a la tabla puente «Bridge_Article_Channel».

Adjunté un archivo pbix con mi modelo y algunos datos de prueba para que tengamos la misma visión del problema.

https://mskpistormaster.blob.core.windows.net/share/calle.pbix

¡Una vez más, agradezco sus esfuerzos!

Saludos
Niclas

mfelix

En respuesta a nironixón

Hola @nironixon,

En mi tabla, solo agrego una relación uno a uno entre el puente y el artículo, ¿cómo sabe en las líneas de pedido a qué canal se relaciona su producto?

Si agrega el artículo a la tabla que ha colocado en el PBI, obtiene varias líneas por artículo, lo cual no es cierto, ya que solo vendió 100 de cada uno.

El resultado le da los 300 finales ya que tiene el filtro cruzado entre el artículo y el puente para ambos; sin embargo, este no es el resultado correcto ya que obtiene 3 líneas cada una con 100 para el producto 3.

Saludos,

mfelix

nironixón

En respuesta a mfelix

¡¡Hola de nuevo @MFélix!!

¿Le sería posible compartir un archivo pbix de su solución o un volcado de pantalla de su modelo y relaciones?
No puedo establecer una relación uno a uno entre los artículos y la tabla Bridge_Articel_Channel. Recibo un mensaje de error que dice «La cardianidad que seleccionó no es válida para esta relación».

El mensaje de error tiene sentido para mí, las tablas son una configuración clásica de muchos a muchos, entonces, ¿cómo podemos tener una relación uno a uno?

uno a uno.png

Realmente apreciando su tiempo!

Atentamente

Niclas

mfelix

En respuesta a nironixón

Hola,

Consideré que un producto solo tendría un canal.

Por eso funcionó. ¿Cómo relacionas el 100 del producto 3 con cada uno de los canales?

nironixón

En respuesta a mfelix

@MFélix,

Sospeché que tenías el caso equivocado, por eso tomé screendumps y también compartí mi archivo pbix.

  1. Escribes sobre «productos», supongo que te refieres a lo que he llamado Artículos, ¿correcto?
  2. No entiendo su pregunta sobre cómo relaciono el producto 100 con el 3.
    Si miras mis tablas y sus relaciones, debería quedar claro cómo relaciono las cosas, ¿no?

Saludos Niclas

mfelix

En respuesta a nironixón

Hola @nironixon,

1. Sí productos = artículo 😄

2. La relación se entiende perfectamente, lo que no entiendo es cómo se hace la asignación entre el precio y la fórmula de asignación para cada canal.

Tiene el Artículo 3 como 1 línea de orden con 100, sin embargo, tiene 3 canales conectados al Artículo 3 con 3 fórmulas de asignación.

¿Quieres tener artículo3 con 100*0,1 + 100*0,2 + 100*0,3 o solo por uno de los canales?

Saludos

mfelix

nironixón

En respuesta a mfelix

Hola de nuevo @MFelix

Ok, veamos si puedo describir mi problema así.

Se coloca una «Línea de pedido» para un «Artículo» determinado con una «Cantidad» determinada.
Un «Artículo» es referenciado por uno a muchos «Canales» que tienen una «Fórmula de Asignación» asociada que se usa cuando
calcular la participación en los ingresos que se debe pagar al «Channnel».

Tomemos Orderline con Id = 2 como ejemplo:

  1. Tiene una cantidad de 100.
  2. Referencias de línea de pedido Artículo 2.
  3. El artículo 2 está referenciado por:
    1. Canal 1 con una Fórmula de Asignación de 0,1
    2. Canal 2 con una Fórmula de Asignación de 0,2

Ahora, para calcular la cantidad que se debe pagar al dueño del «Chanel», el reparto de ingresos,

Canal 1: 100 * 0,1 = 10
Canal 2: 100 * 0,2 = 20

El reparto de ingresos debe presentarse en un informe matricial con

  • Canales como Filas
  • Fechas como columnas
  • Reparto de ingresos como valores

Entonces, el reparto de ingresos es la cantidad que se debe pagar a cada propietario del canal calculado
como Importe * Fórmula de asignación

Saludos cordiales Niclas

nironixón

En respuesta a nironixón

HOLA @MFelix y otros,

Creo que he resuelto mi problema y me gustaría compartirlo con ustedes ya que fuiste amable tratando de ayudarme!

1. Reestructuré el modelo de datos y las relaciones subyacentes, pero mantuve la relación requerida de muchos a muchos.

2. Una nueva tabla llamada «Asignaciones» que almacena la fórmula ArticleId, Channel y Allocation.

Para calcular el reparto de ingresos de cada canal, creo dos medidas. Uso la función DAX LOOKUPVALUE para encontrar la fórmula de asignación actual necesaria al calcular el reparto de ingresos.

Parece estar funcionando, dando un resultado correcto en mis datos de prueba. Sin embargo, no estoy seguro de si hay errores ocultos en esto de los que me he dado cuenta todavía. ¡Aprender DAX es sangriento!

Reparto de ingresos =
CALCULAR (
SUMX (
Líneas de pedido;
Líneas de pedido[Amount] * [AllocationKey]
)
)

Clave de asignación =
VALOR DE BÚSQUEDA (
Asignaciones[Allocation];
Asignaciones[ArticleId]; VALOR SELECCIONADO ( Líneas de pedido[ArticleId] );
Asignaciones[Channel]; VALOR SELECCIONADO ( Asignaciones[Channel] )
)

nuevasrelaciones.png

También he actualizado el archivo pbix si quieres echarle un vistazo.

https://mskpistormaster.blob.core.windows.net/share/calle.pbix

Saludos Niclas

mfelix

En respuesta a nironixón

Hola @nironixon,

Me alegro de que haya encontrado la solución y lamento la respuesta tardía, pero tenía algunas prioridades de trabajo que atender.

Saludos,

mfelix

En respuesta a nironixón

@nironixon,

Me alegra saber que el problema se resolvió, puede aceptar las respuestas apropiadas como respuestas, de esta manera, otros miembros de la comunidad podrían encontrar fácilmente la respuesta cuando tengan los mismos problemas.

Saludos,
lidia

Deja un comentario

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