Forum Discussion
Creating a Accumulated Net Inventory on hand qty table
- 1 year ago
Hey ianburns143,
Looking at your issue, I can see the problem. Your measures are summing ALL transactions across the entire dataset instead of respecting the pivot table's row context (CODE and DATE). The ALL(Transactions) function is removing all filters, which is why you're getting totals across everything.
Here's the alternate approach:
Replace your current measures with these corrected versions:
1. Net Inventory (Fixed):
Net Inventory = SUM(Transactions[FINAL QTY])
2. Accumulated Net Inventory (Fixed):
Accumulated Net Inventory =
CALCULATE(
SUM(Transactions[FINAL QTY]),
FILTER(
ALL(Dates[Date]),
Dates[Date] <= MAX(Dates[Date])
)
)
3. Individual Transaction Types (Fixed):STOCK =
CALCULATE(
SUM(Transactions[FINAL QTY]),
Transactions[TYPE] = "STOCK"
)WORK ORDER =
CALCULATE(
SUM(Transactions[FINAL QTY]),
Transactions[TYPE] = "WORK ORDER"
)SALES ORDER =
CALCULATE(
SUM(Transactions[FINAL QTY]),
Transactions[TYPE] = "SALES ORDER"
)Why Your Original Measures Weren't Working
- ALL(Transactions) removes all filters from the Transactions table, including the CODE filter from your pivot table rows
- SUMX(ALL(Transactions), ...) was calculating the same total for every row
- The measures weren't respecting the individual item codes (A1, B1, C1, etc.)
Key Changes Made
- Removed ALL(Transactions) - Now measures respect the pivot table context
- Used SUM() instead of SUMX() - More efficient for simple aggregations
- Used CALCULATE() with filters - Properly filters by transaction type while maintaining row context
- Kept ALL(Dates[Date]) only in accumulation - This is correct for time intelligence
Expected Behavior Now
- Each measure will now calculate only for the specific CODE in each row
- The accumulated measure will sum all transactions for that CODE up to the selected date
- Individual transaction type measures will show only their respective values
Try these corrected measures and your pivot table should now show the proper running totals by item code and date as desired.
Fixed? ✓ Mark it • Share it • Help others!
Best Regards,
Jainesh Poojara | Power BI Developer
Hey ianburns143,
You need to create a running total inventory calculation that combines three transaction types and accumulates values over time. The formula is: Stock On Hand + Work Orders - Sales Orders = Net Inventory.
Step-by-Step Implementation
1. Data Preparation in Power Query
Combine All Transaction Tables:
- Append all three tables (Stock, Work Orders, Sales Orders) into a single transactions table
- Ensure consistent column structure across all tables
- Add a multiplier column: Stock (+1), Work Orders (+1), Sales Orders (-1)
Source Tables Structure:
- TYPE | CODE | QTY | DATE
- Add calculated column: [Multiplier] = if [TYPE] = "SALES ORDER" then -1 else 1
- Final QTY = [QTY] * [Multiplier]
2. Create Date Dimension Table
Establish Proper Date Relationships:
- Create a continuous date table covering your entire date range
- Set earliest date as minimum date from all three source tables
- Ensure proper date relationships for time intelligence functions
3. Power Pivot Measures Implementation
Base Inventory Measure:
Net Inventory =
SUMX(
ALL(Transactions),
Transactions[QTY] * Transactions[Multiplier]
)
Accumulated Inventory Measure:
Accumulated Net Inventory =
CALCULATE(
[Net Inventory],
FILTER(
ALL(Dates[Date]),
Dates[Date] <= MAX(Dates[Date])
)
)
4. Transaction Type Handling
Separate Calculations by Type:
- Stock On Hand: Filter TYPE = "STOCK"
- Inward Stock: Filter TYPE = "WORK ORDER"
- Outward Stock: Filter TYPE = "SALES ORDER"
- Apply appropriate positive/negative values for each type
5. Time-Based Accumulation Logic
Key Considerations:
- Stock entries use current date (TODAY)
- Work Orders and Sales Orders use historical transaction dates
- Running total must consider all transactions up to the selected date
- Multiple transactions per day per item must be properly aggregated
6. Data Model Relationships
Required Relationships:
- Transactions table linked to Date dimension on transaction date
- Item codes properly categorized for filtering
- Proper cardinality settings (many-to-one from transactions to dates)
7. Expected Output Structure
Final Pivot Table Format:
CODE | DATE | STOCK | WORK ORDER | SALES ORDER | NET STOCK | ACCUMULATED NET
A1 | 31/07| 10 | 0 | 0 | 10 | 10
A1 | 01/08| 0 | 0 | 100 | -100 | -90
A1 | 02/08| 0 | 200 | 0 | 200 | 110
8. Power Query Transformation Steps
Data Consolidation Process:
- Load all three source tables
- Standardize column names and data types
- Add transaction type identifiers
- Create unified transaction table
- Establish proper date formatting
- Add calculated columns for inventory direction
9. Validation and Testing
Quality Assurance Steps:
- Verify total quantities match source data
- Test accumulation logic with known scenarios
- Confirm date filtering works correctly
- Validate negative inventory scenarios
- Check multiple transactions per day handling
10. Performance Optimization
Efficiency Considerations:
- Use proper indexing on date and code columns
- Implement incremental refresh for large datasets
- Consider partitioning by date ranges
- Optimize DAX calculations for better performance
This solution will provide you with a robust inventory tracking system that accurately reflects accumulated net inventory positions over time, handling all your transaction types appropriately while maintaining data integrity and calculation accuracy.
Fixed? ✓ Mark it • Share it • Help others!
Best Regards,
Jainesh Poojara | Power BI Developer
- ianburns1431 year agoNew Member
Thank you so much for taking some time to show me this. I have followed your steps but I am not seeing the desired output. looks like it is summing all the Qty's across the dataset ,
Power Pivot Table below , with settings and what the desired output should look like
Here are the Steps followed
Source Tables
1/ I have alligned all the Fields across all 3 tables to have matching attributes
2/ I have created the date table (date only) running 1st day of my dataset to the last date
3/ In all 3 tables I have grouped all the Qty's having the same dates
Transaction Table
1/ Append all 3 tables together - output below
2/ Created the Calculated Multiplier and Final Qty columns as you requested
transaction table output
Power Pivot
1/Date table and transaction table loaded into Data Model and relationship established between dates
2/ I have created the following measures in the Transaction table
a) Net Inventory:=SUMX(ALL(Transactions),Transactions[QTY] * Transactions[Multiplier])
b) Accumulated Net Inventory:=CALCULATE([Net Inventory],FILTER(ALL(Dates[Date]),Dates[Date] <= MAX(Dates[Date])))
c) STOCK:=SUMX(FILTER(Transactions,Transactions[TYPE] = "STOCK" ),Transactions[FINAL QTY])
d)WORK ORDER:=SUMX(FILTER(Transactions,Transactions[TYPE] = "WORK ORDER" ),Transactions[FINAL QTY])
e)SALES ORDER:=SUMX(FILTER(Transactions,Transactions[TYPE] = "SALES ORDER" ),Transactions[FINAL QTY])
I am probally missing something simple, but if you could advise it would be greatly appreciated
- jaineshp1 year agoMemorable Member
Hey ianburns143,
Looking at your issue, I can see the problem. Your measures are summing ALL transactions across the entire dataset instead of respecting the pivot table's row context (CODE and DATE). The ALL(Transactions) function is removing all filters, which is why you're getting totals across everything.
Here's the alternate approach:
Replace your current measures with these corrected versions:
1. Net Inventory (Fixed):
Net Inventory = SUM(Transactions[FINAL QTY])
2. Accumulated Net Inventory (Fixed):
Accumulated Net Inventory =
CALCULATE(
SUM(Transactions[FINAL QTY]),
FILTER(
ALL(Dates[Date]),
Dates[Date] <= MAX(Dates[Date])
)
)
3. Individual Transaction Types (Fixed):STOCK =
CALCULATE(
SUM(Transactions[FINAL QTY]),
Transactions[TYPE] = "STOCK"
)WORK ORDER =
CALCULATE(
SUM(Transactions[FINAL QTY]),
Transactions[TYPE] = "WORK ORDER"
)SALES ORDER =
CALCULATE(
SUM(Transactions[FINAL QTY]),
Transactions[TYPE] = "SALES ORDER"
)Why Your Original Measures Weren't Working
- ALL(Transactions) removes all filters from the Transactions table, including the CODE filter from your pivot table rows
- SUMX(ALL(Transactions), ...) was calculating the same total for every row
- The measures weren't respecting the individual item codes (A1, B1, C1, etc.)
Key Changes Made
- Removed ALL(Transactions) - Now measures respect the pivot table context
- Used SUM() instead of SUMX() - More efficient for simple aggregations
- Used CALCULATE() with filters - Properly filters by transaction type while maintaining row context
- Kept ALL(Dates[Date]) only in accumulation - This is correct for time intelligence
Expected Behavior Now
- Each measure will now calculate only for the specific CODE in each row
- The accumulated measure will sum all transactions for that CODE up to the selected date
- Individual transaction type measures will show only their respective values
Try these corrected measures and your pivot table should now show the proper running totals by item code and date as desired.
Fixed? ✓ Mark it • Share it • Help others!
Best Regards,
Jainesh Poojara | Power BI Developer- ianburns1431 year agoNew Member
Hi jainesh, this is perfect thank you so much for the solution, but more importantly thank you for giving me an insight into the actual coding and why it wasn't working.... very insightful!