All credits belong to Waldo. His session on BC Tech Days 2022 was refreshing and informative.
You should check his new Business Central Performance Tool:
If you want to read more about that cool guy, just check his blog https://www.waldo.be/
Our TOP 5 "Performance"-Giveaways:
1. Check if record is filled before you fire "DeleteAll":
AssemblyCommentLine.SetCurrentKey("Document Type", "Document No.");
AssemblyCommentLine.SetRange("Document Type", "Document Type");
AssemblyCommentLine.SetRange("Document No.", "No.");
if not AssemblyCommentLine.IsEmpty() then
AssemblyCommentLine.DeleteAll();
2. Don't load the whole record. Load always a subset by using "SetLoadFields":
Item.SetLoadFields(Item."Item Category Id", Item."Item Category Code");
Item.SetRange(Item."Item Category Code", '');
if Item.FindSet() then
repeat
Item2 := Item;
if ItemCategory.GetBySystemId(Item2."Item Category Id") then begin
Item2."Item Category Code" := ItemCategory."Code";
Item2.Modify();
end;
until Item.Next() = 0;
3. Calculating flowfields always outside the loop by using SetAutoCalcFields:
ConfigPackageTable.SetAutoCalcFields("Table Name");
if ConfigPackageTable.FindSet() then
repeat
if not HideDialog then
ConfigProgressBar.Update(ConfigPackageTable."Table Name");
ExportConfigTableToXML(ConfigPackageTable, PackageXML);
until ConfigPackageTable.Next() = 0;
4. Using the right keys in your tables and using IncludedFields and SumIndexFields
key(Key1; "Vendor No.", "Posting Date")
{
IncludedFields = "Currency Code", "Amount to Apply", Open;
}
or
key(Key2; "Vendor No.", "Posting Date")
{
SumIndexFields = "Purchase (LCY)";
}
5. Use TextBuilder to append substrings instead of using Text variable
procedure ReadAsTextWithSeparator(InStream: InStream; LineSeparator: Text)
var
Tb: TextBuilder;
Line: Text;
begin
InStream.ReadText(Line);
Tb.Append(Line);
while not InStream.EOS do begin
InStream.ReadText(Line);
Tb.Append(LineSeparator);
Tb.Append(Line);
end;
end;
Comments