Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
1 year ago
Solved

Customer Forecasts: Calculating latest value when a record removed from most recent data source

Hello all,  I have a query that I can't figure out, can anyone help please?   We are sent customer forecasts every few days in a spreadsheet which contains the product requirements by delivery dat...
  • MarkLaf's avatar
    1 year ago

    I put the below together with the following embellished test data:

     

    CombinedWorkbooks

    FileNameFile Received DateProduct CodeDelivery DateQty
    File A5/5/2025BB225/20/2025100
    File B5/10/2025BB225/20/2025150
    File A5/5/2025BB775/20/202575
    File B5/10/2025BB775/20/2025100
    File C5/15/2025BB775/20/202595
    File B5/10/2025BB445/20/202550
    File C5/15/2025BB445/20/202560
    File A5/5/2025BB115/15/202575
    File B5/10/2025BB115/15/2025100

     

     

    Same as your data, BB22 is missing a File C record.

     

    The following code will figure out the expected latest file for each delivery date, then use that to either pull latest order record when from latest file, or construct a 0 Qty order from latest file if no such order exists.

     

    let
        Source = CombinedWorkbooks,
    
        // Latest related file for each delivery date based on all products
        ExpectedDates = Table.ExpandRecordColumn( 
            Table.Group( 
                Table.Sort( Source, { "File Received Date", Order.Descending } ), 
                "Delivery Date", {
                    "MaxFileRow", Table.First, 
                    Type.TableRow(Value.Type(Source))
                }
            ), 
            "MaxFileRow", {"FileName","File Received Date"} 
        ),
    
        // For each Product and Delivery Date:
        GroupAndAddMissing = Table.Group( 
            Source, {"Product Code", "Delivery Date"}, 
            { { 
                "groups", 
                each [ 
                    // Get latest order within the group
                    LatestOrder = Table.First( Table.Sort( _, {"File Received Date", Order.Descending} ) ), 
                    // Get latest expected file for the delivery date (using ExpectedDates table)
                    LatestFile = Table.First( 
                        Table.SelectRows( ExpectedDates, each [Delivery Date] = LatestOrder[Delivery Date] ) 
                    ), 
                    // Does latest file for this order match latest expected file?
                    DatesMatch = LatestFile[File Received Date] = LatestOrder[File Received Date],
                    // If latest order is from latest file, use it as is.
                    // Otherwise, return a row from latest file with 0 Qty order
                    ResultRow = 
                        if DatesMatch then 
                            LatestOrder 
                        else 
                            LatestFile & [ Product Code = LatestOrder[Product Code], Qty = 0 ]
                ] [ResultRow], 
                Type.TableRow( Value.Type( Source ) )
            } } 
        ),
        
        Combine = Table.FromRecords( GroupAndAddMissing[groups], Value.Type( Source ) )
    in
        Combine

     

    Result: