bcquality/community/knowledge/architecture/posting-routines-must-follow-check-post-line-batch-pattern.good.al
Michael Dieringer 17e8856b35 Add 4 community knowledge articles: posting-routine pattern, email module, Word report layout, defensive/offensive blast radius
Contributed from Curabis's own BCQuality custom layer, rewritten to the
community contribution contract (no fenced code in the .md, AL samples as
sibling .good.al/.bad.al files, under 100 lines per article).
2026-08-27 18:11:04 +02:00

59 lines
1.7 KiB
AL

codeunit 50120 "Contoso Jnl.-Check Line"
{
procedure CheckLine(var JnlLine: Record "Contoso Journal Line")
begin
if JnlLine."Line No." = 0 then
exit; // skip empty lines without error
JnlLine.TestField("Posting Date");
JnlLine.TestField(Amount);
end;
}
codeunit 50121 "Contoso Jnl.-Post Line"
{
// Operates only on the record passed in — never reads or writes the
// Journal table itself, so document posting can call this directly.
procedure PostLine(var JnlLine: Record "Contoso Journal Line")
var
LedgerEntry: Record "Contoso Ledger Entry";
begin
LedgerEntry.Init();
LedgerEntry.TransferFields(JnlLine);
LedgerEntry.Insert(true);
end;
}
codeunit 50122 "Contoso Jnl.-Post Batch"
{
// The only one of the three that touches the Journal table.
procedure PostBatch(var JnlLine: Record "Contoso Journal Line")
var
CheckLine: Codeunit "Contoso Jnl.-Check Line";
PostLine: Codeunit "Contoso Jnl.-Post Line";
begin
if JnlLine.FindSet() then
repeat
CheckLine.CheckLine(JnlLine);
until JnlLine.Next() = 0;
if JnlLine.FindSet() then
repeat
PostLine.PostLine(JnlLine);
JnlLine.Delete();
until JnlLine.Next() = 0;
end;
}
codeunit 50123 "Contoso Jnl.-Post (Yes/No)"
{
// The only entry point a page should call.
trigger OnRun()
var
JnlLine: Record "Contoso Journal Line";
PostBatch: Codeunit "Contoso Jnl.-Post Batch";
begin
if Confirm('Do you want to post the journal lines?') then
PostBatch.PostBatch(JnlLine);
end;
}