Replacing an Access database breaks down into six tracks. First, the data export: tables from the Access file are transferred to the target database (Postgres, MySQL or SQL Server, depending on what your IT environment already runs). Access-specific column types (AutoNumber, Yes/No, OLE Object, Hyperlink, Memo) are mapped to serial, boolean, bytea and text. Foreign keys that existed implicitly in Access (via lookups in forms) are recorded explicitly in the schema with the corresponding constraints.
Next, the forms. Access forms are often a mix of input fields, lookup combo boxes, subforms and VBA events. We rebuild them as a web UI in React, Vue or Astro, with the same fields and validation rules but in a design that works across multiple screen sizes. Subforms become tabs or accordions, lookup combo boxes become search fields with autocomplete, and validation happens in the browser as well as again on the server side.
The reports move to a BI environment: Power BI if you are Microsoft-oriented, Metabase for self-hosted setups, or Looker Studio for Google environments. The advantage: reports are now live, shareable via link and interactively filterable rather than compiled at a fixed point in time. The monthly report that used to take an hour of Excel work becomes a dashboard that is always up to date.
The macros are the delicate part. VBA code can range from trivial ("clear this field when a new record is created") to complex ("generate an invoice PDF using several queries and email it to the customer"). We document every macro, decide with you which ones are still relevant to the new way of working, and rebuild those as backend logic in TypeScript or Python with tests, so that a later change does not quietly break a calculation. The rest we deliberately drop.
The queries, especially the saved queries used in forms and reports, become API endpoints. A REST or GraphQL API returns the data that used to sit in a query result. That immediately opens the door to integrations with other systems: your accounting, CRM or a mobile scanner app. Or another team can build its own customer portal on that API without ever touching the database directly.
Finally, the cut-over. Nobody likes to switch over all at once without a safety net. We work in parallel: Access remains as a reference, and a synchronisation layer mirrors changes between old and new. At go-live, the write direction switches; Access remains available for historical reference.