Performance Giveaways

Author

Daniel Gorski

CEO

2 Min. Lesezeit

Business Central performance tips from BC TechDays

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:

https://github.com/waldo1001/waldo.BCPerfTool

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;
}

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;