根据物料清单和每种材料(组件)的采购价格历史记录计算一系列日期的产品成本
TableBOM 包含每种产品所需的组件组合(Q = 数量)
组件 1 | Q1 | 组件 2 | Q2 | 结果 |
---|---|---|---|---|
纸1 | 1 | 塔吉塔个人 | 20 | 塔吉塔 x20 |
纸2 | 2 | 塔尔杰顿 | 40 | Tarjetón x40 |
银行 | 4 | Empaque pequeño | ||
辛塔佩 | 5 | Empaque pequeño | ||
分离器pe | 6 | Empaque pequeño | ||
塔吉塔 x20 | 1 | Empaque pequeño | 1 | Tarjeta empaque pe |
Tarjetón x40 | 1 | 大恩帕克 | 1 | Tarjetón empaque gr |
Caja gr | 7 | 大恩帕克 | ||
辛塔格 | 8 | 大恩帕克 | ||
诺塔 | 1 | Empaque pequeño | 1 | Nota empaque pe |
塔吉塔 x20 | 1 | 大恩帕克 | 1 | Tarjeta empaque gr |
Tarjetón empaque gr | 1 | Nota empaque pe | 2 | Tarjetón + 注释 |
纸3 | 3 | 塔尔杰顿 | ||
迪维格 | 9 | 大恩帕克 | ||
索布雷4 | 1 | Nota sola | 1 | 诺塔 |
TablePurchaseComponent有每种材料(组件)的历史价格
费查 | 组件 | Preciounitario |
---|---|---|
2023 年 1 月 1 日 | Caja gr | 100 |
2023 年 1 月 1 日 | 银行 | 110 |
2023 年 1 月 1 日 | 辛塔格 | 120 |
2023 年 1 月 1 日 | 辛塔佩 | 130 |
2023 年 1 月 1 日 | 迪维格 | 140 |
2023 年 1 月 1 日 | Nota sola | 150 |
2023 年 1 月 1 日 | 纸1 | 10 |
2023 年 1 月 1 日 | 纸2 | 20 |
2023 年 1 月 1 日 | 纸3 | 30 |
2023 年 1 月 1 日 | 分离器pe | 190 |
2023 年 1 月 1 日 | 索布雷4 | 200 |
2023 年 1 月 1 日 | 塔吉塔个人 | 2 |
2024 年 1 月 1 日 | Caja gr | 200 |
2024 年 1 月 1 日 | 银行 | 220 |
2024 年 1 月 1 日 | 辛塔格 | 240 |
2024 年 1 月 1 日 | 辛塔佩 | 260 |
2024 年 1 月 1 日 | 迪维格 | 280 |
2024 年 1 月 1 日 | Nota sola | 300 |
2024 年 1 月 1 日 | 纸1 | 20 |
2024 年 1 月 1 日 | 纸2 | 40 |
2024 年 1 月 1 日 | 纸3 | 60 |
2024 年 1 月 1 日 | 分离器pe | 380 |
2024 年 1 月 1 日 | 索布雷4 | 400 |
2024 年 1 月 1 日 | 塔吉塔个人 | 4 |
工作表中的表格:
fxProcessVal:
=LAMBDA(lookup_val;LET(comp_res; VSTACK(FILTER(TableBOM[[Componente 1]:[Q1]]; TableBOM[Resultado] = lookup_val); FILTER(TableBOM[[Componente 2]:[Q2]]; TableBOM[Resultado] = lookup_val)); comp_res_fil; FILTER(comp_res; CHOOSECOLS(comp_res; 2) <> ""); lookup_col; IFNA(EXPAND(lookup_val; ROWS(comp_res_fil)); lookup_val); IFERROR(HSTACK(lookup_col; comp_res_fil); "")))
fxProcessCompRow:
=LAMBDA(data;lookup_row;LET(sourceData; fxProcessVal(INDEX(data; lookup_row; 2)); res_val; INDEX(data; 1; 1); res_col; IFNA(EXPAND(res_val; ROWS(sourceData)); res_val); sourceRes; HSTACK(res_col; DROP(sourceData; 0; 1)); IF(sourceData <> ""; FILTER(sourceRes; CHOOSECOLS(sourceRes; 2) <> ""); CHOOSEROWS(data; lookup_row))))
fxProcessComp:
=LAMBDA(source;LET(seq; SEQUENCE(ROWS(source)); reducer; REDUCE(""; seq; LAMBDA(acc;curr; VSTACK(acc; IFNA(fxProcessCompRow(source; curr); HSTACK(""; ""; ""))))); temp_res; DROP(reducer; 1); temp_res))
fxCompCost:
=LAMBDA(comp;date;INDEX(TablePurchaseComponent[Precio unitario]; MATCH(MAXIFS(TablePurchaseComponent[Fecha]; TablePurchaseComponent[Fecha]; "<=" & date; TablePurchaseComponent[Componente]; comp) & comp; TablePurchaseComponent[Fecha] & TablePurchaseComponent[Componente]; 0)))
近似值:
=LAMBDA(seed;LET(res; IF(COUNTA(seed) = 1; fxProcessVal(seed); fxProcessComp(seed)); comp; CONCAT(seed) = CONCAT(res); IF(comp; seed; prox(res))))
分解 BOM 清单的公式(并分解所需的每种产品材料和数量):
=UNIQUE(DROP(REDUCE("";TableBOM[Resultado];LAMBDA(acc;curr;VSTACK(acc;prox(curr))));1))
计算每种产品成本的日期是使用以下公式在一个范围内动态设置的:
=DATE(YEAR(Q1);SEQUENCE(1;DATEDIF(Q1;Q2;"M")+1;MONTH(Q1);1);1)
我想设置Q3(日期范围作为溢出范围)并计算每个月每种产品的成本。
目前 SUMPRODUCT 计算所有月份(范围内的日期)的总计。
我尝试过 BYCOL 以及 MAP 和 Sequence 的组合,但还没有弄清楚。
如有任何帮助,我将不胜感激。
链接到只读示例文件(无宏)
=LET(
data;L4#;
date;Q3#;
res;INDEX(data;;1);
comp;INDEX(data;;2);
q;INDEX(data;;3);
lab;UNIQUE(res);
cost;q*fxCompCost(comp;date);
rt;MAP(lab;LAMBDA(a; SUMPRODUCT((res=a)*cost)));
temp;HSTACK(lab;rt);
temp
)
想要的结果:
我使用了
REDUCE
和 SEQUENCE
的组合来迭代每个日期列。
=LET(
data;L4#;
dateRow;DATE(YEAR(ParamStartDate);SEQUENCE(1;DATEDIF(ParamStartDate;ParamEndDate;"M")+1;MONTH(ParamStartDate);1);1);
headers;HSTACK("";dateRow);
date;dateRow;
res;INDEX(data;;1);
comp;INDEX(data;;2);
q;INDEX(data;;3);
lab;UNIQUE(res);
cost;q*fxCompCost(comp;date);
reducer;REDUCE("";SEQUENCE(COLUMNS(date));LAMBDA(acc;curr;HSTACK(acc;MAP(lab;LAMBDA(a; SUMPRODUCT((res=a)*CHOOSECOLS(cost;curr)))))));
result;VSTACK(headers;HSTACK(lab;DROP(reducer;;1)));
result
)
已添加到工作表中的姓名:
参数开始日期:
Q2
参数结束日期:Q3
决赛:
如果有人提出更好的解决方案,甚至可以处理 BOM,请发布。
希望这对其他人有帮助。