Forum Discussion

ARona's avatar
ARona
Regular Visitor
1 year ago
Solved

Running total against weekly Capacity

Hi everyone, 

 

I hope someone can help. 

 

I have a table that I can filter by product, displaying weekly orders and respective capacity on a graph. I want to add a Backlog Impact column and include it in the graph as well. In Excel, the table looks as below: 

 

Year Week TextSum of OrdersWeeklyCapacityBacklog
Prior60060
2024-502843600
2024-512703000
2024-5203000
2024-5301200
2025-01501800
2025-02490300190
2025-03412300302
2025-04552300554
2025-05332300586
2025-06324300610
2025-07271300581
2025-08194300475
2025-09143300318
2025-10208300226
2025-11463000
2025-1203000
2025-13323000
2025-1403000
2025-1503000

 

 

 

 

For the "Prior" row, the value is taken directly from B2 (e.g., 60 in this example, but it varies by product). For each subsequent row, the formula is:

 

=MAX(0, D2 + B3 - C3)

I've tried creating several measures in Power BI to replicate this, but none have worked so far. Here's the table in Power BI:

 

 

 

My last attempt at a measure (Cumulative Overdue) was:

 

Cumulative Overdue =
VAR CurrentWeek = MAX(WorkingDays[Year Week Text])
VAR CumulativeValue =
    SUMX(
        FILTER(
            ALL(WorkingDays),
            WorkingDays[Year Week Text] <= CurrentWeek
        ),
        'WorkingDays'[OverdueUpd]
    )
RETURN
    IF(CumulativeValue < 0, 0, CumulativeValue)
 
I’d really appreciate any guidance on how to make this work... Thanks in advance!
  • Anonymous's avatar
    Anonymous
    1 year ago

    Hi ARona,

     

    According to your statement, I think your requirement is to accumulate the running total if the data is larger that 0.

    I think Power BI doesn't support us to achieve looping. I suggest you to achieve your goal in Power Query Editor by M Query.

    Add an Index column first.

    Then add an custom column named B-C.

    Then create a custom column based on them.

    let 
    _Limit = 0,
    _CurrentIndex = [Index],
    _CurrentRow = Table.SelectRows(#"Added Custom",each [Index] <= _CurrentIndex),
    _CumulativeSum = List.Accumulate(
    _CurrentRow[#"B-C"], 
        0, 
        (state, current) => 
            let
                _NewSum = state + current
            in
                if _NewSum < _Limit then _Limit else _NewSum
            )
    in
    _CumulativeSum

    Result is as below.

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bdA9DsMgDAXguzAnEv4jcIvuKAfIVCn3H8qzqoriLEh82A9D7+l1X+87bankseR0bj1xZt0Ne646VimzE/zAqeTZ2ftXla8S/9T2jAy/gOrMiNC2hAxHiBIHx3Bm0Q0i0QuENfjhT6LgFRO2WN/gKquTf5l3/TuStQR++LGhHhtmJ30stlnPDw==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Year Week Text" = _t, #"Sum of Orders" = _t, WeeklyCapacity = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Year Week Text", type text}, {"Sum of Orders", Int64.Type}, {"WeeklyCapacity", Int64.Type}}),
        #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1, Int64.Type),
        #"Added Custom" = Table.AddColumn(#"Added Index", "B-C", each [Sum of Orders] - [WeeklyCapacity]),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "Backlog", each let 
    _Limit = 0,
    _CurrentIndex = [Index],
    _CurrentRow = Table.SelectRows(#"Added Custom",each [Index] <= _CurrentIndex),
    _CumulativeSum = List.Accumulate(
    _CurrentRow[#"B-C"], 
        0, 
        (state, current) => 
            let
                _NewSum = state + current
            in
                if _NewSum < _Limit then _Limit else _NewSum
            )
    in
    _CumulativeSum),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"B-C"})
    in
        #"Removed Columns"

     

    Best Regards,
    Rico Zhou

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

     

5 Replies

  • ARona , First You can use DAX to create a calculated column that computes the backlog for each week. 

    DAX
    Backlog =
    VAR PreviousBacklog =
    IF(
    ISBLANK(WorkingDays[Year Week Text]),
    0,
    CALCULATE(
    MAX(WorkingDays[Backlog]),
    FILTER(
    WorkingDays,
    WorkingDays[Year Week Text] = EARLIER(WorkingDays[Year Week Text]) - 1
    )
    )
    )
    RETURN
    MAX(0, PreviousBacklog + WorkingDays[Sum of Orders] - WorkingDays[WeeklyCapacity])

     

    If you need a measure to calculate the cumulative overdue,

    DAX
    Cumulative Overdue =
    VAR CurrentWeek = MAX(WorkingDays[Year Week Text])
    VAR CumulativeValue =
    SUMX(
    FILTER(
    ALL(WorkingDays),
    WorkingDays[Year Week Text] <= CurrentWeek
    ),
    WorkingDays[Backlog]
    )
    RETURN
    IF(CumulativeValue < 0, 0, CumulativeValue)

    • ARona's avatar
      ARona
      Regular Visitor

      Thank you very much - this is the error I now get: 

       

      I also modified line 15 to use SUM(OpenOrderBook[Total Quantity]), as the total order quantity is pulled from a different table (OpenOrderBook). Not sure if this will work either..

       

      • bhanu_gautam's avatar
        bhanu_gautam
        Icon for Super User rankSuper User

        ARona , Try this DAX then using EARLIER

         

        Backlog =
        VAR PreviousBacklog =
        CALCULATE(
        MAX(WorkingDays[Backlog]),
        FILTER(
        WorkingDays,
        WorkingDays[Year Week Text] = EARLIER(WorkingDays[Year Week Text]) - 1
        )
        )
        RETURN
        IF(
        ISBLANK(PreviousBacklog),
        0,
        MAX(0, PreviousBacklog + WorkingDays[Sum of Orders] - WorkingDays[WeeklyCapacity])
        )