LedgerJournalEngine и LedgerJournalCheckPost - PullRequest
0 голосов
/ 27 июля 2011

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

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

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

Мои вопросы:

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

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

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

Ответы [ 2 ]

1 голос
/ 29 июля 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;
}
1 голос
/ 27 июля 2011

Рассматривали ли вы использование 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()));
...