Add ocumentation on 'if not Insert then Modify' best practices
This commit is contained in:
parent
d39e29c9fa
commit
0e30934d6f
1 changed files with 55 additions and 1 deletions
|
|
@ -1 +1,55 @@
|
||||||
//todo
|
---
|
||||||
|
title: "if not Insert then Modify"
|
||||||
|
tags: ["AL","Performance"]
|
||||||
|
categories: ["Best Practice"]
|
||||||
|
---
|
||||||
|
|
||||||
|
_Created by SosicStefan, Described by SosicStefan_
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
When handling data insertion in Business Central, a common but inefficient pattern is attempting to insert a record and modifying it if the insert fails due to duplicate keys. This approach introduces unnecessary performance overhead and should be avoided.
|
||||||
|
|
||||||
|
{{% alert title="Note" color="info" %}}
|
||||||
|
This pattern is only good when used on singleton table. Read more about [Singleton Table](https://alguidelines.dev/docs/navpatterns/patterns/singleton/singleton-table/).
|
||||||
|
{{% /alert %}}
|
||||||
|
|
||||||
|
## Why Not Use 'If Not Insert Then Modify'?
|
||||||
|
|
||||||
|
Using the following structure:
|
||||||
|
|
||||||
|
```al
|
||||||
|
InitializeRecord(SomeRecord);
|
||||||
|
if not SomeRecord.Insert() then
|
||||||
|
SomeRecord.Modify();
|
||||||
|
```
|
||||||
|
|
||||||
|
Presents several issues:
|
||||||
|
|
||||||
|
- Prevents buffered inserts: This impacts performance as batch insert optimizations are lost.
|
||||||
|
- Generates unnecessary SQL errors: If a duplicate primary key exists, the failed insert raises an error, which Business Central must handle.
|
||||||
|
- Slower and less efficient: Handling SQL errors is far from an optimal way to check for record existence.
|
||||||
|
|
||||||
|
|
||||||
|
## Best Practice: Use IsEmpty
|
||||||
|
|
||||||
|
Instead of relying on insert failures, ensure the record’s uniqueness upfront using a number series or an incremental primary key. If the data comes from an external source where duplicates might exist, use IsEmpty to check for existence.
|
||||||
|
|
||||||
|
```AL
|
||||||
|
InitializeRecord(SomeRecord);
|
||||||
|
SomeRecord.SetRecFilter();
|
||||||
|
|
||||||
|
if SomeRecord.IsEmpty() then
|
||||||
|
SomeRecord.Insert()
|
||||||
|
else
|
||||||
|
SomeRecord.Modify();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Why IsEmpty is Better
|
||||||
|
|
||||||
|
- No SQL errors: The check is done before attempting an insert.
|
||||||
|
- Performance improvement: Avoids unnecessary error handling and maintains buffered inserts.
|
||||||
|
- More readable and efficient: The intent is clear—checking existence before performing actions.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
Avoid using if not Insert then Modify. Instead, ensure record uniqueness upfront or use IsEmpty to check existence efficiently. This leads to better performance and cleaner code.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue