Repository navigation
FAQs
Find answers to the most common questions about bc2adls. For additional questions, visit our GitHub Issues page.
- General Questions
- Setup and Configuration
- Export Operations
- Data and Fields
- Performance and Scaling
- Troubleshooting
- Advanced Topics
bc2adls is an open-source tool that exports incremental data from Dynamics 365 Business Central to Microsoft Fabric or Azure Data Lake Storage. It supports three export options:
- Azure Data Lake with Synapse pipelines
- Microsoft Fabric with notebooks
- Microsoft Fabric Open Mirroring (native)
Choose Azure Data Lake if:
- You need CDM format support
- You have complex transformation requirements
- You're already using Azure Synapse
Choose Microsoft Fabric with notebooks if:
- You prefer modern lakehouse architecture
- You want simpler setup than Azure Synapse
- You don't need CDM format
Choose Fabric Open Mirroring if:
- You want the absolute simplest setup
- You're OK with table-level (not field-level) selection
- You prefer a fully managed solution
The bc2adls extension and code are free and open source. However, you'll incur costs for:
- Azure Data Lake Storage
- Azure Synapse Analytics (if using)
- Microsoft Fabric capacity (if using)
- Business Central licenses
Originally created by Microsoft (Soumya Dutta and Henri Schulte), bc2adls is now maintained by the community, led by Bert Verbeek at 4PS.
📖 For detailed explanations of all configuration options, see the Configuration Reference page.
Use Business Central's Job Queue feature:
Option 1: Simple scheduling (all tables)
- Open Export to Azure Data Lake Storage page
- Click Schedule export action
- A Job Queue Entry is created
- Configure frequency in Job Queue
Option 2: Advanced scheduling (by category or table)
Use Report ADLSE Schedule Task Assignment for granular control:
- Open Job Queue Entries
- Create a new entry
- Set Object Type to Run: Report
- Set Object ID to Run:
82561(ADLSE Schedule Task Assignment) - Click Report Request Page Options
- Select:
- Specific Categories to export, or
- Specific Table IDs to export

This allows different tables to export at different frequencies.
Recommended approach:
- ✅ One data lake container per BC environment
- ✅ Keep production and sandbox data separate
- ✅ Use consistent naming conventions
After copying environments:
- Update the setup page in the new environment
- Point to a different container
- Verify configuration before running exports
Exports run only for the current company. To export from multiple companies:
Option 1: Manual switching
- Switch to a company in BC
- Run the export
- Repeat for each company
Option 2: Scheduled exports (Recommended)
- Create Job Queue Entries for each company
- Configure the Run in Company field on each entry
- Schedule at appropriate times
Important:
- Export the schema first from all companies
- All company data goes to the same container (differentiated by company field)
- Different containers for different environments
- Prevents data mixing
- Simplifies troubleshooting
- Clearer security boundaries
Check the Export to Azure Data Lake Storage page:
- Look at the Last exported status column
- When all tables show a status other than "In process", the export is complete
- Possible statuses:
- ✅ Success: Completed successfully
- 🔴 Failed: Error occurred
- 🕐 In process: Currently running
Yes! Use the category feature:
- Assign tables to categories:
- Example: "Hourly", "Daily", "Weekly"
- Create separate Job Queue Entries for each category
- Configure different schedules for each entry
- Use Report ADLSE Schedule Task Assignment to specify categories
Use cases:
- Export transactional tables (orders, invoices) hourly
- Export master data (customers, items) daily
- Export configuration tables weekly
When an export fails:
- Status changes to "Failed"
- Error message is recorded
- Other tables continue to export
- Delta files are not uploaded for failed table
- Next export will retry
To resolve:
- Check the error message
- Fix the underlying issue
- Run export again
- Only failed table will re-export (incremental)
- Disable tables you don't want to export
- Wait for current sessions to complete
- Exports are parallel and run in separate sessions
No. Only persistent fields on BC tables can be exported.
Workaround:
- Create a new table with calculated values
- Populate via AL code (e.g., on record insert/modify)
- Export the new table
No. BLOB fields are not supported directly.
Workaround:
- Convert BLOB to text using Base64 Convert codeunit
- Store in a new text field or separate table
- Export the text field
The following field types cannot be exported:
- ❌ BLOB fields
- ❌ Flow fields (calculated)
- ❌ Filter fields
- ❌ Fields marked Obsolete: Removed
- ❌ Fields with Access property other than
Public
When a field is obsoleted:
-
Before upgrade:
- Review obsoletion documentation
- Identify replacement fields
- Update your data model
-
During upgrade:
- Disable the obsolete field from export
- Enable the new replacement field
- Test the export
-
After upgrade:
- Schema change will occur
- Archive old data if needed
- Update pipelines/queries to use new fields
- Map old data to new schema if necessary
Note: Including pending obsoletion fields will cause upgrade errors when the field is fully removed.
Explanation:
- Records created before the
SystemCreatedAtaudit field was introduced have NULL values - bc2adls sets an artificial value of 01 Jan 1900 for these records
- This ensures consistency regardless of timezone
Impact:
- Filter out these records if time-based analysis is critical
- Use other date fields for accurate historical tracking
Timeout issues can occur in two places:
Symptom: Timeout when fetching records before export
Solution:
- Enable Skip row version sorting on the setup page
- Export completes without sorting
⚠️ May cause duplicate exports on subsequent runs- Disable after initial data transfer completes
When to use:
- Large tables (millions of records)
- Initial export only
- Temporary measure
Symptom: Error message like Could not commit blocks... OperationTimedOut
Solution 1: Reduce payload size
- Open Export to Azure Data Lake Storage page
- Reduce Max payload size (MiBs) setting
- Try values: 4 → 2 → 1
Solution 2: Increase timeout (advanced)
- Open AL code:
ADLSEGen2Util.Codeunit.al - Find procedure
CommitAllBlocksOnDataBlob - Add timeout parameter to URL:
?timeout=XX- Replace XX with seconds (e.g., 300 for 5 minutes)
- Recompile and redeploy extension
Solution 3: Optimize table
- Export fewer fields
- Use Skip row version sorting
- Export during off-peak hours
- Enable read-only replica
Business Central side:
✅ Enable read-only replica (BC 21+)
- Go to Feature Management
- Enable Report read-only data access
- Exports read from replica database
- Reduces impact on production
✅ Schedule wisely
- Export during off-peak hours
- Stagger company exports
- Use categories for different frequencies
✅ Optimize field selection
- Export only necessary fields
- Fewer fields = faster exports
- Smaller file sizes
✅ Configure payload size
- Default: 4 MiB
- Increase for faster uploads (if no timeouts)
- Decrease if experiencing timeouts
Azure/Fabric side:
✅ Use Parquet format (ADLS)
- Better compression
- Faster queries
- Handles special characters better
✅ Scale Synapse workspace (ADLS)
- Increase DWU for pipelines
- Add more Spark nodes
- Optimize pipeline parallelism
✅ Use parallel notebooks (Fabric)
- Use
CopyBusinessCentral_parallel_option.ipynb - Process multiple tables simultaneously
- Adjust parallel count based on capacity
✅ Adequate capacity (Fabric)
- Ensure sufficient Fabric capacity
- Monitor capacity metrics
- Scale up during heavy loads
Technical limits:
- ✅ No hard limit on number of tables
⚠️ Limited by asynchronous task limits
Best practices:
- Export tables in batches using categories
- Monitor session capacity
- Tables not exported due to limits will retry on next run
- Typical deployments: 50-200 tables
Session management:
- bc2adls spawns one session per table per company
- BC has limits on concurrent sessions
- Use staggered schedules for many tables
Each delta file has metadata:
File properties:
- Modified timestamp: When export finished
- Size: Amount of data exported
-
Name pattern:
<company>/<table>_<timestamp>.csv
Tracking methods:
-
Compare with ADLSE Run table:
- View in BC: Related > Runs
- Match Modified time with Started/Ended fields
- Correlate files to specific export runs
-
Use telemetry:
- Enable Emit telemetry on setup page
- Track in Application Insights
- See which run created which file
-
Azure Storage Explorer:
- Install Azure Storage Explorer
- Browse container and deltas folder
- View file properties and metadata
Checklist:
✅ Verify consolidation ran
- Check Synapse pipeline ran successfully (ADLS)
- Check Fabric notebook executed (Fabric)
- Look for data in
datafolder (ADLS) or tables (Fabric)
✅ Refresh Power BI
- Click Refresh Preview in Power BI
- Close and reopen dataset
- Check connection settings
✅ Verify CDM manifest (ADLS only)
- Look for
data.cdm.manifest.jsonin container - Verify tables listed in manifest
- Check file paths are correct
✅ Check permissions
- Service principal has read access
- Power BI credential is valid
- Azure/Fabric permissions are correct
Common causes:
-
No deltas exported:
- Verify BC export completed
- Check deltas folder has files
- Ensure container name is correct
-
Wrong container parameter:
- Pipeline parameter must match BC configuration
- Check spelling and case
-
Permissions issue:
- Synapse workspace identity needs Storage Blob Data Contributor
- Service principal has correct roles
Expected scenarios:
-
Tables with DataPerCompany = false:
- These tables export from all companies
- Same data exported multiple times
- Pipeline removes duplicates during consolidation
-
Table reset and re-export:
- When you reset a table's export
- Historical data exports again
- Creates duplicates in deltas
- Pipeline handles deduplication
Solution:
- ✅ Consolidation pipeline automatically removes duplicates
- ✅ No action needed from your side
- ℹ️ This is expected behavior
Yes! bc2adls is open source:
- Clone the GitHub repository
- Modify AL code in
businessCentral/app/src - Common customizations:
- Add custom field transformations
- Implement custom validation
- Add export events
- Modify file naming conventions
- Recompile and deploy to your environment
Important:
⚠️ Customizations make upgrades harder- 📝 Document your changes
- 🧪 Test thoroughly
- 🔄 Consider contributing back to community
When table schema changes (add/remove fields):
Minor changes (add fields):
- Enable new field on export page
- Next export includes new field
- CDM manifest updates automatically
- Previous records have null/empty for new field
Major changes (remove fields, type changes):
- Archive current data folder
- Disable old field, enable replacement
- Export schema with new structure
- Update Power BI / downstream consumers
- Optionally migrate historical data
Yes! bc2adls supports both:
- ✅ Business Central Online
- ✅ Business Central On-Premises
On-Premises considerations:
- Ensure network connectivity to Azure/Fabric
- Configure firewall rules for outbound connections
- Service principal authentication still required
- Consider VPN or ExpressRoute for security
⚠️ On-Premises: DisableWriteInsideTryFunctionsOn BC On-Premises, the server configuration setting
DisableWriteInsideTryFunctionsis set toTrueby default. This blocks database writes (including IsolatedStorage) insideTryFunctionprocedures, which can cause token cache errors during export.If you encounter issues with the token cache, set
DisableWriteInsideTryFunctionstoFalsein your BC server configuration.This is a platform difference between BC On-Premises and SaaS — in BC SaaS this restriction is not enabled. See Microsoft documentation on TryFunction behavior for details.
Row-level security is implemented in the consumption layer, not in bc2adls:
Power BI approach:
- Use Power BI Row-Level Security (RLS)
- Define roles and filters
- Apply to datasets
SQL approach (Shared metadata tables):
- Create views with filters
- Grant users access to views only
- Implement security in SQL layer
Synapse approach:
- Use Synapse serverless SQL pools
- Implement views with security filters
- Use SQL authentication
Fabric approach:
- Use Fabric's built-in security features
- Configure data access policies
- Implement in Power BI semantic models
Not directly. But you can:
-
For file links:
- Export the file path field
- Consumers access files via path
-
For embedded files:
- Use BLOB workaround (Base64 conversion)
- Store in separate table
- Export as text
-
For SharePoint/OneDrive:
- Export link fields
- Access files via URL
Try these resources:
- GitHub Issues: Browse existing issues
- Create new issue: Report a bug or request feature
- Community: Join discussions on GitHub
- Documentation: Review other wiki pages
- Go to GitHub Issues
- Provide:
- BC version
- Export option (ADLS/Fabric/Mirroring)
- Steps to reproduce
- Error messages
- Screenshots if applicable
- Search existing issues first to avoid duplicates
We welcome contributions!
- Code: Submit pull requests
- Documentation: Improve wiki pages
- Testing: Test new features
- Feedback: Share your experience
- Support: Help others in issues
Last updated: 2025 Have more questions? Ask on GitHub