Forum Discussion

D3K's avatar
D3K
Advocate II
5 years ago
Solved

Stocks redistribution Table

Hello everyone! I have a really compliсated task to make it by myself, believe I've tried 🙂  so asking for help here.   We have a database with Stores, Products, Sales History and Current Stocks....
  • Anonymous's avatar
    Anonymous
    5 years ago

    Here's the solution:

    You use the Filter Pane of the table above with the [Is True Target Store] measure to obtain the above.

    And here's what needs to be created in PQ behind the scenes:

    // SalesAndStockBaseTable
    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCi7JL0pVMDBU0lFyBGIgMlWK1YGLG0HFjUFySOLGUHEjdA0mSBLI4qYIC8yRxc2AAk4QcWRhc6iwKZq4BUK5oRGyhCVWcwwNEMLGSrGxAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Store ID" = _t, ProductID = _t, #"Sales Qty" = _t, #"Stock Qty" = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Store ID", type text}, {"ProductID", type text}, {"Sales Qty", Int64.Type}, {"Stock Qty", Int64.Type}}),
        #"Added Custom" = Table.AddColumn(#"Changed Type", "Store Type", 
            each 
            let
                StockQty = if [Stock Qty] = null then 0 else [Stock Qty],
                SalesQty = if [Sales Qty] = null then 0 else [Sales Qty],
                Output = 
                    if StockQty > 0 and SalesQty = 0 then "Source Store" 
                    else 
                    if StockQty = 0 and SalesQty > 0 then "Target Store" 
                    else 
                        "Neutral Store"
            in
                Output
        )
    in
        #"Added Custom"
    
    // Stores
    let
        Source = SalesAndStockBaseTable,
        #"Removed Other Columns" = Table.SelectColumns(Source,{"Store ID", "Store Type"}),
        #"Removed Duplicates" = Table.Distinct(#"Removed Other Columns")
    in
        #"Removed Duplicates"
    
    // Products
    let
        Source = SalesAndStockBaseTable,
        #"Removed Other Columns" = Table.SelectColumns(Source,{"ProductID"}),
        #"Removed Duplicates" = Table.Distinct(#"Removed Other Columns")
    in
        #"Removed Duplicates"
    
    // Target Stores
    let
        Source = Stores,
        #"Filtered Rows" = Table.SelectRows(Source, each ([Store Type] = "Target Store")),
        #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Store Type"}),
        #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Store ID", "Target Store ID"}})
    in
        #"Renamed Columns"
    
    // Sales and Stock
    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCi7JL0pVMDBU0lFyBGIgMlWK1YGLG0HFjUFySOLGUHEjdA0mSBLI4qYIC8yRxc2AAk4QcWRhc6iwKZq4BUK5oRGyhCVWcwwNEMLGSrGxAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Store ID" = _t, ProductID = _t, #"Sales Qty" = _t, #"Stock Qty" = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Store ID", type text}, {"ProductID", type text}, {"Sales Qty", Int64.Type}, {"Stock Qty", Int64.Type}}),
        #"Added Custom" = Table.AddColumn(#"Changed Type", "Store Type", 
            each 
            let
                StockQty = if [Stock Qty] = null then 0 else [Stock Qty],
                SalesQty = if [Sales Qty] = null then 0 else [Sales Qty],
                Output = 
                    if StockQty > 0 and SalesQty = 0 then "Source Store" 
                    else 
                    if StockQty = 0 and SalesQty > 0 then "Target Store" 
                    else 
                        "Neutral Store"
            in
                Output
        ),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Store Type"})
    in
        #"Removed Columns"
  • Anonymous's avatar
    Anonymous
    5 years ago
    Current Stocks = 
    var StoreInScope = ISINSCOPE( Stores[Store ID] ) 
    var ProductInScope = ISINSCOPE( Products[ProductID] )
    var BothInScope = StoreInScope && ProductInScope
    var Result =
        if( BothInScope,
            sum( 'Sales and Stock'[Stock Qty] )
        )
    return
        Result
    Is True Target Store = 
    var SourceStoreInScope = ISINSCOPE( Stores[Store ID] )
    var SourceStoreIsReallySource = 
        SELECTEDVALUE( Stores[Store Type] ) = "Source Store"
    var TargetStoreInScope = ISINSCOPE( 'Target Stores'[Target Store ID] )
    var TargetStoreNotBlank =
        // It could be blank due to the additional row
        // generated by DAX in the Target Stores table
        // after enabling the relationship which has
        // referential integrity violations (but this is
        // how it should be since not all stores are
        // target stores).
        NOT ISBLANK( SELECTEDVALUE( 'Target Stores'[Target Store ID] ) )
    var ProductInScope = ISINSCOPE( Products[ProductID] )
    var AllThreeInScope = TRUE()
        && SourceStoreInScope
        && SourceStoreIsReallySource
        && TargetStoreInScope
        && TargetStoreNotBlank
        && ProductInScope
    var IsCurrentTargetStoreForCurrentProduct =
        if( AllThreeInScope,
            CALCULATE(
                NOT ISEMPTY( 'Sales and Stock' ),
                // Remove filters from Stores
                ALL( Stores ),
                // Enable filtering from the Target Stores
                USERELATIONSHIP(
                    'Target Stores'[Target Store ID],
                    'Sales and Stock'[Store ID]
                )
            )
        )
    return
        // I multiply by 1 to return an int
        // so that the Filter Pane can work
        // with this measure.
        1 * IsCurrentTargetStoreForCurrentProduct