Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
Hi All,
I am requesting help to build a function that assigns SKU's within Orders to a container. Each Order uses containers of a certain size which is determined in the Max Bin Qty. SKU Qty is the number of SKU's for that Order. The function should create a running sum for each Order and as that running sum exceeds the Max Bin Qty the running sum will reset to 0 for the next container. Please assume nothing and if you find yourself needing to assume anything please reach out and confirm that assumption! Thank you so much in advance! I know this one is not a typical request and appreciate the help. I've been trying to solve this myself for the last few weeks with bad results and late nights.
Order (Function Input) | SKU ID (Function Input) | SKU Qty (Function Input) | Max Bin Qty (Function Input) | Container # (Function Output) |
1000 | 100 | 10 | 30 | 1 |
1000 | 200 | 20 | 30 | 1 |
1000 | 300 | 15 | 30 | 2 |
1000 | 400 | 17 | 30 | 3 |
2000 | 500 | 5 | 10 | 1 |
2000 | 600 | 4 | 10 | 1 |
2000 | 700 | 7 | 10 | 2 |
2000 | 800 | 3 | 10 | 2 |
Solved! Go to Solution.
Hi @Anonymous ,
if my understanding is correct, you can use this function on the order-level:
// fnContainers
(Source, MaxBinQtyColName as text, SKUQtyColName as text ) =>
let
//Source = #"myTable (2)"{1}[Partition],
//MaxBinQtyColName = "Max Bin Qty (Function Input)",
//SKUQtyColName = "SKU Qty (Function Input)",
MaxBinQty = List.First(Table.Column(Source, MaxBinQtyColName)),
BufferedList = List.Buffer(Table.Column(Source, SKUQtyColName)),
Output = List.Skip(List.Generate( () =>
[RT = 0, Bin = 0, Counter = 0],
each [Counter] <= List.Count(BufferedList),
each [
RT = if ( [RT] + BufferedList{[Counter]} ) > MaxBinQty then BufferedList{[Counter]} else [RT] + BufferedList{[Counter]} ,
Bin = if ( [RT] + BufferedList{[Counter]} ) > MaxBinQty then [Bin] + 1 else [Bin],
Counter = [Counter] + 1
],
each [Bin] + 1
))
in
Output
To apply it, your code would look like so (also, see the attached file):
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQwMFDSAVFgEkgYg1lKsTpwSSMoiVXSGKLTFCZphCxpApE0h0kagyWNkO00hdlriCwHsdIEq5w5hITJGSHLWUDchCQXCwA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [#"Order (Function Input)" = _t, #"SKU ID (Function Input)" = _t, #"SKU Qty (Function Input)" = _t, #"Max Bin Qty (Function Input)" = _t, #"Container # (Function Output)" = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Order (Function Input)", Int64.Type}, {"SKU ID (Function Input)", Int64.Type}, {"SKU Qty (Function Input)", Int64.Type}, {"Max Bin Qty (Function Input)", Int64.Type}, {"Container # (Function Output)", Int64.Type}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"Order (Function Input)"}, {{"Partition", each _}}),
#"Invoked Custom Function" = Table.AddColumn(#"Grouped Rows", "Container", each fnContainers([Partition], "Max Bin Qty (Function Input)", "SKU Qty (Function Input)")),
#"Added Custom" = Table.AddColumn( #"Invoked Custom Function",
"Result",
each Table.FromColumns(Table.ToColumns([Partition]) & {[Container]}, Table.ColumnNames([Partition]) & {"Container"})),
Custom1 = Table.Combine(#"Added Custom"[Result])
in
Custom1
This technique should also work fairly fast on large tables.
Imke Feldmann (The BIccountant)
If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!
How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
100 | |
51 | |
19 | |
12 | |
11 |