MS Access Inventory System Problems: Why Stock Counts Are Wrong and How to Fix Them
What this guide covers
MS Access inventory system problems fall into five categories: stock discrepancy and on-hand drift, record locking and write conflicts, multi-user concurrency failures, transaction integrity gaps (orphaned movements and partial imports), and FIFO/LIFO cost-layer errors. This guide explains the root cause of each problem, how to diagnose it with SQL, and how to fix it permanently — with a step-by-step protocol for US and Canadian businesses that need reliable inventory counts.
Written by Hire Access Developer · MS Access specialists serving the USA and Canada · Updated May 2026
What Causes MS Access Inventory Problems
Most MS Access inventory system problems trace back to one of three architectural decisions made when the database was first built. Understanding the root cause is what separates a permanent fix from a patch that fails again at the next month-end.
- Cached on-hand without a movement ledger. The database stores a single editable "Qty On Hand" number per SKU instead of deriving it by summing an append-only movements table. Every deletion, back-dated edit, and partial import permanently corrupts that number — there is no transaction history to reconcile against.
- No atomic transaction boundaries. A sale, transfer, or receipt should write to both the header table and the stock movement table as a single all-or-nothing operation. When VBA processes these as separate steps with no error handling and no rollback, a crash or user interruption between the two writes leaves the database in a permanently inconsistent state.
- Concurrency not designed for multi-user writes. MS Access file-mode multi-user works well for readers; it needs disciplined architecture for concurrent writers on the same records. Bound forms that hold rows open, missing FE/BE splits, and hot SKUs with many simultaneous updates all produce write conflicts and phantom quantity changes that users blame on "the network."
| Symptom you see | Root cause to investigate |
|---|---|
| On-hand quantity ≠ physical shelf count | Cached on-hand field instead of ledger-derived total; deleted sale headers without stock reversal; failed mid-batch VBA imports. |
| Write conflict error when saving a record | Two bound forms open on the same SKU row; exclusive lock held across user think-time; missing FE/BE split. |
| Negative stock quantities appearing | No minimum-quantity constraint; transfer posted without both paired lines; LIFO/FIFO layer table out of sync with on-hand. |
| Month-end report runs for 5+ minutes | Missing indexes on SKU, date, and movement-type columns; unbounded Cartesian join in totals query. |
| Import says "complete" but counts are wrong | VBA loop opens/closes recordset per row; DAO object not released; errors swallowed silently; no single transaction boundary. |
| Random COGS swings in cost reports | Off-by-one allocation in FIFO/LIFO layer query; average-cost shortcut mixed with layer table; picks split across receipts without correct layer consumption. |
Stock Discrepancies
Why MS Access inventory stock counts are wrong — and how to reconcile them
Treat an inventory stock discrepancy in MS Access as a ledger reconciliation problem, not a data-entry problem. The screen says twelve; the shelf says nine; finance says fifteen. All three numbers can be wrong simultaneously when the database has been patched instead of fixed.
The diagnostic step is simple: run a query that compares your on-hand field to the sum of your movement ledger per SKU. Any SKU where those two numbers differ is drifted. The SQL sample in the Transaction Integrity section below does exactly this. Run it before touching anything else.
The fix is to insert an adjustment movement row — a signed quantity correction — rather than editing the on-hand cell directly. This preserves the audit trail and lets you trace the correction at any future point. Editing the cell directly is how the discrepancy grew in the first place.
Record Locking
Write conflicts and the .laccdb file — what they mean and how to fix them
When two users in a US warehouse or office hit "Write Conflict: This record has been changed by another user" on an inventory form, the symptom is a concurrency problem but the root cause is architecture. Bound Access forms hold rows open across navigation, extending exclusive locks longer than necessary. On a slow LAN or VPN, that lock window extends further — long enough for the second user's save to collide.
The standard fix sequence: (1) confirm the database is split into a separate front-end and back-end file — this alone reduces most random locking; (2) switch high-contention forms from Edited Record locking to No Locks with a VBA save handler that checks for conflicts explicitly; (3) shorten transactions so the lock scope is milliseconds, not seconds; (4) for hot SKUs updated by many users simultaneously, serialize writes through a queue table or move that tier to SQL Server.
Multi-User Scaling
How many concurrent users can update MS Access inventory at the same time?
File-backed MS Access works reliably for inventory systems with up to 10–15 concurrent users when the FE/BE is split, forms use appropriate locking, and indexes match the query paths. Beyond that, performance degrades and write conflicts become frequent enough to damage operations.
For US and Canadian businesses with growing teams, the most common and cost-effective path is an Access front-end / SQL Server back-end architecture. The Access forms, reports, and VBA that your team already knows stay in place; the data moves to SQL Server, which provides row-level locking, proper transaction logs, and the ability to support 50–100+ concurrent users without performance issues. This is far cheaper and less disruptive than a full platform migration.
Need expert help?
Is your MS Access inventory database drifting, locking, or producing wrong counts at month-end? We fix these problems for US and Canadian businesses — root cause first, no guesswork. Hire an MS Access inventory database specialist or book a free consultation.
Transaction Integrity
Fixing inventory transaction errors in MS Access — one event, one atomic footprint
A sale, transfer, or receipt is one business event. It should write to the header table and the stock movement table in a single atomic operation — either both rows commit, or neither does. When VBA processes them as two separate steps without a workspace transaction and error handler, a crash between the two writes creates an orphaned record that permanently drifts your counts.
The correct pattern: DBEngine.Workspaces(0).BeginTrans before the first write, CommitTrans after both succeed, and Rollback in the error handler. Never use append-only movement inserts that rely on form events firing in the correct order without explicit transaction wrapping.
Use this SQL to find SKUs where on-hand already differs from the movement ledger sum. Run it on a backup copy before making any changes:
-- Find SKUs where on-hand quantity ≠ movement ledger total -- Rename tblInventory, tblInventoryMovements, SKU, QtyOnHand, QtyDelta -- to match your actual table and field names before running. SELECT i.SKU, i.QtyOnHand AS OnHand, Nz(s.LedgerNet, 0) AS LedgerNet, [QtyOnHand] - Nz([LedgerNet], 0) AS Drift FROM tblInventory AS i LEFT JOIN ( SELECT SKU, Sum(QtyDelta) AS LedgerNet FROM tblInventoryMovements GROUP BY SKU ) AS s ON i.SKU = s.SKU WHERE [QtyOnHand] <> Nz([LedgerNet], 0) OR (s.SKU Is Null AND i.QtyOnHand <> 0);
LIFO / FIFO Logic Errors
Why COGS swings randomly and how to fix cost-layer allocation in MS Access
FIFO and LIFO are not sort orders — they are consumption algorithms applied against a cost-layer table. The most common MS Access FIFO/LIFO errors occur when:
- Picks can split across multiple receipts but the allocation query does not correctly consume layers in date order, leaving fractional quantities assigned twice or not at all.
- The system uses an average-cost shortcut in some reports and a layer table in others — the two figures can never reconcile without an audit.
- Adjustments and returns are posted directly to on-hand without a corresponding layer entry, causing the layer sum to diverge from on-hand after every adjustment cycle.
The fix requires a dedicated inventory layers table where each receipt row records its cost, date, quantity received, and quantity remaining. Every pick allocates against layers in the correct order and updates the remaining-quantity field on the layer row. A post-pick reconciliation check confirms that the sum of remaining layer quantities matches on-hand before the transaction commits.
Step-by-Step Fix
How to fix MS Access inventory stock discrepancy — 6 steps
This is the exact sequence we use when a US or Canadian business calls us with inventory counts that don't match. Follow it on a copy of your database — never on the live production file.
- Run the drift reconciliation query. Export the results to a spreadsheet. Every drifted SKU needs a root cause identified before any fix is applied.
- Identify the source of each drift. For each drifted SKU, check the movement history: were headers deleted without reversing stock? Did an import fail halfway? Were on-hand cells edited directly?
- Insert adjustment movement rows — do not edit on-hand directly. For each drifted SKU, insert a signed adjustment row (+/−) equal to the drift amount. Mark it with a movement type of "Audit Adjustment" and today's date.
- Add referential integrity to prevent orphaned records. Enable cascade delete or restrict delete on the relationship between your header tables and movement tables so future deletions cannot orphan stock records.
- Index the columns you query most. Add indexes to SKU, transaction date, and movement type. Run your month-end report again and compare the query time.
- Schedule a weekly automated reconciliation check. Set up a VBA autoexec or scheduled task that runs the drift query and logs any drifted SKUs to a monitoring table. Catch drift weekly instead of discovering it at the annual audit.
Inventory Audit Protocol
Freeze, snapshot, reconcile, ship — the right order for an MS Access inventory audit
Running an inventory audit on a live MS Access database while users are still posting transactions guarantees inconsistent results. The correct sequence:
- Freeze all transactions during the audit window — no receipts, sales, or transfers posted.
- Take a timestamped backup of the back-end file before running any reconciliation queries. This is your rollback point.
- Run the drift SQL and export results. Investigate every discrepancy before inserting adjustment rows.
- Insert adjustment rows with audit notation — movement type, date, and the person authorizing the correction.
- Run the drift SQL again to confirm all SKUs now reconcile before re-opening transactions.
For databases with engine-level corruption (compact-and-repair fails, tables won't open, records are missing), route through MS Access database repair before trusting any inventory count.
When to Call a Specialist
Signs your MS Access inventory problem needs a professional fix
Some inventory problems are fixable with the steps above. Others have grown to the point where self-service diagnosis risks making things worse. Call a specialist when:
- The drift reconciliation query returns more than 20–30% of your SKUs as drifted — the architecture needs a redesign, not patch-by-patch corrections.
- You cannot locate a known-good backup from before the drift started — you are reconciling against an already-corrupted baseline.
- Compact-and-repair fails or tables throw "unrecognized database format" errors — this is engine-level corruption that needs forensic recovery.
- The database is accessed by 15 or more concurrent users and write conflicts are daily — a SQL Server back-end migration will likely save more time than further locking tuning.
- Month-end is in less than 48 hours and counts are wrong — this is not the time for experimental fixes on a production copy.
We provide MS Access inventory database specialist services for US and Canadian businesses — same-day triage for production-down situations, documented fixes, and honest written assessments of when migration makes more sense than repair.
Frequently Asked Questions
- What are the most common MS Access inventory system problems?
- The most common MS Access inventory system problems are: (1) on-hand quantities that drift from physical counts because the system stores a cached total instead of deriving it from an append-only movement ledger; (2) write conflicts when two users update the same SKU simultaneously on bound forms; (3) missing indexes on transaction tables that make month-end reports and searches slow; (4) orphaned movement records when a sale or transfer header is deleted without reversing the stock adjustment; and (5) partial VBA import failures that commit rows in one table but not the paired stock table.
- Why does my MS Access inventory show wrong stock counts?
- Wrong stock counts in MS Access almost always mean the on-hand field is maintained as an edited number rather than calculated from an auditable movement ledger. When users delete orders, back-date records, or when a VBA batch fails halfway, the cached number drifts permanently. The fix is a ledger-first architecture: every stock change (receipt, sale, adjustment, transfer) writes an append-only movement row, and on-hand is always derived by summing that ledger—never stored as an editable cell.
- How do I fix inventory stock discrepancy in MS Access?
- To fix inventory stock discrepancy in MS Access: (1) Run a reconciliation query comparing your on-hand field to the sum of your movement ledger for each SKU—the difference is your drift amount. (2) Do not edit the on-hand field directly; instead insert an explicit adjustment movement row with the signed drift quantity so the history is preserved. (3) Identify what caused the drift—deleted headers, failed imports, or direct cell edits—and fix the root cause. (4) Add referential integrity constraints so deletions cannot orphan movement records. (5) Schedule a weekly automated reconciliation query to catch future drift early.
- Can multiple users update the same MS Access inventory database at the same time?
- Yes, but with important architectural conditions. File-backed MS Access supports multi-user access, but write conflicts occur when two users open bound forms on the same record simultaneously and one saves before the other. The correct approach for inventory databases with multiple concurrent writers is: split the database into a front-end (forms, queries, reports) and a back-end (tables only); use optimistic locking on forms; serialize updates to hot SKUs using a VBA queue or a staging table; and consider moving the back-end data to SQL Server when concurrent user count exceeds 10–15.
- What causes record locking errors in MS Access inventory systems?
- Record locking errors in MS Access inventory systems are caused by bound forms holding rows open across navigation events, which extends exclusive locks long enough for a second user's save attempt to collide. Contributing factors include: forms that requery on every keystroke, slow network connections that lengthen lock duration, missing back-end split (FE/BE), and transactions that span multiple tables without being closed promptly. The fix is to shorten lock scope, use unbound or lightly-bound forms for high-contention records, and split the FE/BE if you haven't already.
- How do I fix FIFO or LIFO errors in an MS Access inventory database?
- FIFO and LIFO errors in MS Access inventory databases occur when picks are not correctly allocated against cost layers in date order. The fix requires: (1) a dedicated inventory layers table that records each receipt as a separate row with its cost, date, and remaining quantity; (2) an allocation query or VBA procedure that consumes layers in the correct order (oldest first for FIFO, newest first for LIFO) and never subtracts twice from the same layer; (3) a reconciliation check that compares the sum of layer quantities against on-hand after every pick. Symptoms like random COGS swings or negative layer quantities usually mean the allocation logic has an off-by-one error or is using a totals query that mixes average-cost shortcuts with the layer table.
- How do I stop MS Access inventory imports from creating wrong stock counts?
- MS Access inventory import failures that produce wrong stock counts are almost always caused by VBA loops that open and close a recordset per row, swallow errors silently, or fail to release DAO objects—leaving the batch partially committed. The fix is to wrap the entire import in a single workspace transaction (DBEngine.Workspaces(0).BeginTrans / CommitTrans), validate every row before appending, log errors to a separate table instead of swallowing them, and reconcile movement ledger to on-hand totals at the end of every import run before marking it as complete.
- Should I fix my MS Access inventory database or migrate to SQL Server?
- For US and Canadian SMEs with fewer than 15–20 concurrent users and a fundamentally sound data model, fixing the MS Access inventory database is usually faster and cheaper than migrating. The most common issues—stock drift, record locking, and slow queries—are fixable at the architecture level without a platform change. Migration to SQL Server makes sense when: concurrent user counts regularly exceed 15–20, data volumes have grown past 500,000–1,000,000 movement rows, or compliance and audit requirements need row-level security and transaction logs that Access cannot provide. A specialist can assess your specific situation and give you a written comparison of both paths.
- How much does it cost to fix MS Access inventory system problems?
- Cost depends on the root cause and scope. Targeted fixes—reconciliation queries, index additions, locking improvements—often complete in hours to a few days at an hourly rate. Architectural work like adding a proper movement ledger, redesigning FIFO/LIFO logic, or splitting FE/BE typically runs from several days to a few weeks. A free consultation scopes the problem and gives you a written estimate before any billing starts. For US and Canadian businesses, we offer fixed-price and hourly options with no long-term contracts required to start.
Related services and guides:
MS Access inventory counts wrong? We fix it permanently.
Send us your SKU drift counts, whether you have a movement ledger, and whether the database is split FE/BE. We respond with a diagnosis and a realistic fix scope — not a sales pitch. Serving businesses across the USA and Canada.