Purpose:
The purpose of this document is to describe how we can quickly post general journals (also known as GL opening balances or simply GL balances) across all the companies in X++.
Business requirement:
Ability to post GL balances across all the companies in X++ along with the posting log.
Prerequisites:
Fiscal periods are open for the relevant periods.
Assumptions:
The number sequence for the Journal batch number contains a constant segment “_GL” to designate it as a GL balance entry. Based on this assumption the given code filters GL balance record from the LedgerJournalTable.
Development:
1. Create a posting log table MAKLedgerJournalPostLog with the following fields:

where,
JournalNum – uses LedgerJournalId EDT
Posted – uses NoYesId EDT
PostingLog – uses Log EDT
TransactionTime – uses DateTimeExecuted EDT
2. Create an AOT job with the following code:
static void MAKLedgerJournalPost(Args _args)
{
LedgerJournalTable ledgerJournalTable;
LedgerJournalName ledgerJournalName;
LedgerJournalCheckPost ledgerJournalValiate, ledgerJournalPost;
Log errorMessage;
SysInfologEnumerator sysInfologEnumerator;
MAKLedgerJournalPostLog postingLogTable;
//Private method
void insertLog(log _log, ledgerjournalid _journalNum, NoYes _post)
{
postingLogTable.clear();
postingLogTable.PostingLog = _log;
postingLogTable.JournalNum = _journalNum;
postingLogTable.TransactionTime = DateTimeUtil::utcNow();
postingLogTable.Posted = _post;
postingLogTable.insert();
infolog.clear();
}
delete_from postingLogTable;
while select crossCompany * from ledgerJournalTable
where ledgerJournalTable.JournalNum like '*_GL*'
&& ledgerJournalTable.Posted == NoYes::No
{
try
{
changeCompany(ledgerJournalTable.dataAreaId)
{
ledgerJournalName = LedgerJournalName::find(ledgerJournalTable.JournalName);
ledgerJournalValiate = ledgerJournalCheckPost::newLedgerJournalTable(
ledgerJournalTable,
NoYes::No);
ledgerJournalValiate.run();
if (!ledgerJournalValiate.tableErrorLog())
{
ledgerJournalPost = ledgerJournalCheckPost::newLedgerJournalTable(
ledgerJournalTable,
NoYes::Yes);
ledgerJournalPost.run();
insertLog(
ledgerJournalValiate.tableErrorLog(),
ledgerJournalTable.JournalNum,
NoYes::Yes);
}
else
{
insertLog(
ledgerJournalValiate.tableErrorLog(),
ledgerJournalTable.JournalNum,
NoYes::No);
}
}
}
catch(Exception::Error)
{
sysInfologEnumerator = SysInfologEnumerator::newData(infolog.infologData());
errorMessage = "";
while (sysInfologEnumerator.moveNext())
{
errorMessage += sysInfologEnumerator.currentMessage() + "; ";
}
insertLog(
errorMessage,
ledgerJournalTable.JournalNum,
NoYes::No);
}
}
info("Posting completed. Please check log for posting results.");
}
3. After running the above AOT job, you can find the posting log by querying records in table MAKLedgerJournalPostLog from SQL server client.