0

C#からDynamicsAX元帳ジャーナルを作成して投稿しています。

AXに付属している2つのヘルパークラスを使用したいのですが、

LedgerJournalEngineとLedgerJournalCheckPost、私が作成したジャーナルを検証します。

私の質問は次のとおりです。

1.)これらのクラスまたは他のクラスのいずれかからエラーのリスト->バウチャーを取得するにはどうすればよいですか?

2.)AXトランザクション内の投稿をシミュレートして、ロールバックできますか?

2-a。)トランザクションで投稿をロールバックする場合、AXは、ロールバックされたバウチャー番号を再利用するのに十分スマートですか?

4

2 に答える 2

1

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()));
于 2011-07-27T13:59:24.593 に答える
1

私は結局:

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;
}
于 2011-07-29T12:53:02.553 に答える