ruhrbi
¡Hola a todos!
Tuvimos un problema con la valoración de nuestro inventario en DAX, ya que obtuvimos una dependencia circular. Como DAX no es capaz de recurrir a la recursividad, estamos bastante seguros de que resolveremos este problema con funciones de consulta de energía.
El problema es el siguiente:
Suponiendo que empiezo con un stock inicial: QTY 900000, Price 0,3 y también tengo mi QTY de ventas mensual y QTY de compra y precio, podría crear lo siguiente (se adjunta el Excel con las fórmulas para 2 meses)
Rendimiento de entradas | |||
Cálculo FIFO Promedio Mensual | Precio | Cantidad | Valor |
Apertura total | 0,30 | 900.000,00 | 270.000,00 |
Compras totales | 0,88 | 1.980,00 | 1.749,40 |
Total Apertura + Compras | 0,30 | 901.980,00 | 271.749,40 |
Inventario desde la apertura | 0,30 | 899.914,40 | 269.974,32 |
Inventario de compras | 0,88 | 1.980,00 | 1.749,40 |
Inventario de cierre | 0,30 | 901.894,40 | 271.723,72 |
COGS desde la apertura | 0,30 | 85,60 | 25,68 |
COGS de compras | 0,88 | – | – |
COGS totales | 0,30 | 85,60 | 25,68 |
Luego, en el próximo mes, «solo» necesitaría tomar mi fila de inventario de cierre como mi fila de apertura.
Aquí es donde radica el problema, ya que necesitaría hacer referencia a sí mismo al definir la fórmula de esta manera:
aperturaunitrate=
si «tasa unitaria de stock inicial» = en blanco () entonces
inventariodesdeapertura(mesaño-1)*tasaunitariaapertura(mesaño-1)+
inventariodecompras(mesaño-1)*tasaunitariadecompra(mesaño-1)
/
cierre de existencias (mesaño-1)
demás
«tasa unitaria de stock inicial»
Además, lo que habría que hacer es una agrupación por «Categoría» y la columna cumplimiento_año. Debería comenzar el próximo año con 0 ya que solo tenemos un stock inicial este año.
No sé si esto realmente requerirá una función recursiva en PowerQuery, por lo que si tiene alguna otra idea de cómo resolverlo, ¡también está bien! En mi cabeza, esta lógica tiene mucho sentido, pero como tengo poca experiencia con PQ, estoy luchando para codificarla allí.
Adjunté un archivo de Excel que incluye tanto el cálculo realizado en Excel como los datos de muestra que deberían mejorarse.
Encuéntralo en el siguiente enlace:
DATA DE MUESTRA
gracias y saludos,
Martín
ruhrbi
Así que ahora he creado un GroupedIndex que debería funcionar para realizar un bucle a través de List.Generate o List.Accumulate.
Para que quede más claro lo que necesito, adjunto también una captura de pantalla reciente de los datos. Debería ser sencillo para los profesionales…
OpeningUnitRate es en realidad la columna que necesito calcular, es solo para una mejor lectura que ya está aquí en este caso. Se parece a la tarifa unitaria inicial (que obtuve durante algunos meses).
Necesito:
TasaUnitaria=
Si tasa de unidad de apertura <> 0, entonces
AperturaUnitRate
demás
InventarioDesdeApertura(GroupIndex-1)**Unidad de medida*+ (¡Necesito el resultado anterior de la columna que estoy calculando!)
InventoryFromPurchases(GroupIndex-1)*PurchasePrice(GroupIndex-1) (Tengo el precio de compra)
/
ClosingStock(GroupIndex-1) (Tengo el ClosingStock)
v-deddai1-msft
En respuesta a ruhrbi
Hola @ruhrbi,
Aquí hay una publicación similar para su referencia: https://community.powerbi.com/t5/Power-Query/Simple-recursive-calculation-Power-Query/mp/1093141
Si esta publicación le ayuda, considere aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.
Atentamente,
dai demon
ruhrbi
En respuesta a v-deddai1-msft
¡Gracias, eso ayudó mucho! Sin embargo, sigue siendo un problema, pero creo que es fácil de solucionar:
Mi función:
let
unitratefunction = (InitialUnitRate,InventoryFromOpening,InventoryFromPurchases,PurchaseUR,ClosingStock,Counter,Index) as number=>
let
UR = if InitialUnitRate <> 0 then InitialUnitRate else
((InventoryFromOpening{Counter-1}*@unitratefunction(InitialUnitRate,InventoryFromOpening,InventoryFromPurchases,PurchaseUR,ClosingStock,Counter-1,Index))+
InventoryFromPurchases{Counter-1}*PurchaseUR)/ClosingStock,
Return = UR
in
Return
in
unitratefunction
Mi columna agregada llamando a la función:
UR=Table.AddColumn(#"Added Custom12", "UR", each unitratefunction([OpeningUnitRate],[InventoryFromOpening],[InventoryFromPurchases],[PurchasedValueCumu]/[PurchasedTicketsCumu],[ClosingStock],1,[Index]))
in
UR
Luego obtendré el siguiente error en aquellos elementos donde initialunitrate es 0:
An error occurred in the ‘unitratefunction’ query. Expression.Error: We cannot convert the value 2993376.231 to type List.
Details:
Value=2993376,231
Type=[Type]
¿Algunas ideas? No quiero una lista, solo quiero el resultado como un número.
v-deddai1-msft
En respuesta a ruhrbi
Hola @ruhrbi,
La mejor persona para ayudar en esto es @ImkeF uno de los mejores (si no el mejor) usuario en lenguaje M en la comunidad.
Atentamente,
dai demon
ruhrbi
Investigué eso y entendí que se parece a un bucle for en la consulta de energía.
Eso debería funcionar en teoría, pero me cuesta traducirlo a la práctica, especialmente la parte de agrupación.
lbendlin
Este es un escenario acumulativo, no un escenario recursivo. Las funciones recursivas van a niveles más profundos de una jerarquía (y retroceden) mientras permanece en el mismo nivel de jerarquía. Familiarícese con la función List.Accumulate: es extremadamente poderosa.