LedgerJournalEngine и LedgerJournalCheckPost

Я создаю и публикую журналы Dynamics AX Ledger из C#.

Я хочу использовать два вспомогательных класса, поставляемых с AX,

LedgerJournalEngine и LedgerJournalCheckPost для проверки журналов, которые я создаю.

Мои вопросы:

1.) Как вы получаете список ошибок -> ваучер любого из этих классов или какого-либо другого класса?

2.) Можно ли смоделировать публикацию внутри транзакции AX и откатить ее?

2-a.) Если вы откатите публикацию в транзакции, будет ли AX достаточно умным, чтобы повторно использовать номера ваучеров, которые были отменены?


person tradotto    schedule 27.07.2011    source источник


Ответы (2)


Рассматривали ли вы возможность использования AIF?

Простой способ, если вы настаиваете на прямом вызове AX:

Создайте статические методы X++ и вызовите их:

  1. для создания журнала
  2. для создания строки журнала, поля как параметры
  3. для публикации журнала верните infolog (в виде строки)

Позвольте методам AX выполнить сантехнику с классами проводки бухгалтерской книги.

Проводка все или ничего (с возможным переносом строк ошибок в новый журнал). Номера ваучеров используются повторно в случае ошибки. Я предполагаю, что это означает, что номера ваучеров выделяются при публикации, которые можно настроить для имени журнала.

Возвращаемое значение infolog можно преобразовать в строку, чтобы упростить сторону C#.

Код X++ для преобразования в строку:

client server static str infoCon2List(container c)
{
    TextBuffer t = new TextBuffer();
    str info;
    int i;
    int n;
    for (i = 1; i <= conlen(c); i += 2)
    {
        info = conpeek(c,i+1);
        n = strFind(info,'\t',strLen(info),-99999);
        t.appendText(strFmt('%1\t%2\t%3\n', conpeek(c,i), n > 1 ? strReplace(subStr(info,2,n-2), '\t', '\\') : '', substr(info,n+1,9999)));
    }
    return t.getText();
}

Как это назвать:

int e = infolog.num();
try
{
    doThePosting(...);
}
catch //anything
{
    exceptionTextFallThrough();
}
return Info::infoCon2List(infolog.copy(e+1,infolog.num()));
person Jan B. Kjeldsen    schedule 27.07.2011
comment
Хорошее предложение, но я искал инструкции о том, как это сделать с помощью бизнес-коннектора. 'код' - person tradotto; 29.07.2011
comment
И ответ был таков: используйте методы AX для сантехники, а затем упростите жизнь, возвращая более простые результаты обратно в C#. Это маршрут, который вы выбрали, только с контейнерным классом ERSImport_Errors для отчетов об ошибках. Это чище, чем упаковка в строку. - person Jan B. Kjeldsen; 29.07.2011
comment
Нет, вы вообще не ответили ни на один из моих трех вопросов. - person tradotto; 02.08.2011

Я закончил с:

public static ERSImport_Errors PostJournal(int64 _journalRecID)
{
    LedgerJournalTable          ledgerJournaltable;
    LedgerJournalCheckPost      ledgerJournalCheckPost;
    LedgerJournalID             errorJournalID;
    LedgerJournalEngine         lje;
    ERSImport_Errors             errors;

    boolean                     ret = true;//True we posted this journalRecID
    LedgerJournalTrans          ledgerJournalTrans;
    ;

    errors = new ERSImport_Errors();
    select crosscompany ledgerjournaltable where ledgerjournaltable.RecId == _journalRecID;

    if(ledgerJournalTable == null)
        throw error("Could not find ledger journal table provided");

    changecompany(ledgerJournalTable.dataAreaId)
    {
        ledgerJournalCheckPost = LedgerJournalCheckPost::newLedgerJournalTable(ledgerJournalTable,NoYes::Yes,NoYes::No);
        lje = LedgerJournalEngine::construct(ledgerJournalTable.JournalType);
        lje.newJournalActive(ledgerJournalTable,true);
        ledgerJournalCheckPost.parmLedgerJournalEngine(lje);
        try
        {
            ledgerJournalCheckPost.run();
        }
        catch
        {
            while select ledgerJournalTrans where ledgerJournalTrans.JournalNum == ledgerJournalTable.JournalNum
            {
                if(lje.errorExists(ledgerJournalTrans.Voucher))
                {
                    errors.addError(lje.errorLog(ledgerJournalTrans.Voucher),ledgerJournalTrans.RecId);
                }
            }
        }
    }
    return errors;
}
person tradotto    schedule 29.07.2011