2

以下に示すメソッドは、バッチで実行するrunクラスからのものです。Tutorial_RunbaseBatch

次の変更を加えました。

  1. クラスSysSecurityのメソッドconstructSecurityKeySetを次のように変更しました。server client static public SecurityKeySet constructSecurityKeySet()

  2. クラスBatchRunのメソッドrunJobStaticを次のように変更しました。server client static void runJobStatic(recId batchId)

フレームワーククラスをいじってはいけないという事実は承知していますが、これは単なる調査です。次のコードセクションを追加するまではうまくいきました。

コード変更 1:

MenuItemName    menuItemName;
AccessType      act;

コード変更 2:

act = securitySet.secureNodeAccessmenuItemName,SysSecurity::accessRecType2UtilElementType(AccessRecordType::MenuItemDisplay)); // Line 24

上記のコードセクションを追加した後、以下のエラーメッセージが表示されます

The server-side impersonated (RunAs) session tried to invoke a method that is available for client-side processing only.
(S)\Classes\Tutorial_RunbaseBatch\run - line 24 
(S)\Classes\BatchRun\runJobStatic - line 62 //which is  batchClass.run();

SecurityKeySet(SystemClass)にはプロパティRunOnが設定さcalledFromれており、オブジェクトが呼び出された場所 ( clientまたはserver )で実行されます。Class BatchableおよびBatchRunableにも依存しています。両方のクラスにプロパティRunOnが設定されていますcalledFrom

クラスのプロパティをサーバーに変更しようとしましたが、うまくいきませんでした

とにかくこのコードを機能させる方法はありますか?

完全なコード:

public void run()
{
    SecurityKeySet      securitySet;
    UserGroupId         fromUserGroupId;
    DomainId            domainId;
    MenuItemName        menuItemName;
    AccessType          act;
    ;

    #OCCRetryCount

    fromUserGroupId = "XXXX";
    domainId        = "YYYY";

    if (!this.validate())
        throw error("");

    try
    {
        ttsbegin;
        // this.Update();
        securitySet=SysSecurity::constructSecurityKeySet();//error
        securitySet.loadGroupRights(fromUserGroupId,domainId);
        act = securitySet.secureNodeAccess(menuItemName,SysSecurity::accessRecType2UtilElementType(AccessRecordType::MenuItemDisplay));
        ttscommit;
    }
    catch (Exception::Deadlock)
    {
        retry;
    }
    catch (Exception::UpdateConflict)
    {
        if (appl.ttsLevel() == 0)
        {
            if (xSession::currentRetryCount() >= #RetryNum)
            {
                throw Exception::UpdateConflictNotRecovered;
            }
            else
            {
                retry;
            }
        }
        else
        {
            throw Exception::UpdateConflict;
        }
    }
}
4

2 に答える 2

3

問題の理由:

SysSecurityクラスは、デフォルトで で実行するように設定されていますClient。メソッドconstructSecurityKeySetを に変更しても、サーバー上でコードを実行するのには役立ちserver client staticません。クラス SysSecurity のRunOnプロパティを変更できますが、実行するように設定されている理由がある場合がありますClient。したがって、RunOnモードをに変更するオプションはお勧めしませんClient

ただし、それでもコードをバッチで実行したい場合は. 私が直面したのと同じエラーと、回避策を使用して問題をどのように解決したかについて、以下の説明を読むことができます。

同様の問題:

SalesInvoiceバッチでレポートを実行して請求書の PDF を電子メールで送信しようとすると、同じエラー メッセージが表示されました。

The server-side impersonated (RunAs) session tried to invoke a method that is available for client-side processing only.

私のシナリオの問題は、レポートに画像があり、レポートにロゴを埋め込むにはクライアント側の処理が含まれ、バッチ プロセスはサーバーでの実行中にそれを処理できないことでした。バッチ プロセスに追加されたジョブは、常にServer.

この情報を見つけるには、AX で次の手順を実行します。

  1. 案内するBasic \ Inquiries \ Batch job
  2. バッチ ジョブをクリックします。
  3. View tasks右側をクリックして、タスク ウィンドウを表示します。
  4. [タスク] ウィンドウで、ジョブが実行される列にRun locationが表示されます。Server

注意:

T-SQL クエリを使用してデータベース内のバッチ ジョブ データを更新する以下のアプローチには注意することをお勧めします。

考えられる修正:

クライアントでジョブを実行するSalesInvoiceには、4.0 で行っていたように、以下のクエリを使用してデータベース内の値を直接変更する必要がありました。

UPDATE dbo.BATCH SET RUNTYPE = 0 WHERE CAPTION = '<Your job caption name...>'

クエリを実行してバッチ ジョブ データを更新したら、ジョブRun locationの [タスク] ウィンドウの下の列が に設定されていることを確認しClientます。ジョブ タスクがClientで実行されるように設定されている場合、バッチ処理が開始されない限り実行されません。に移動すると、バッチ処理を開始できますBasic \ Periodic \ Batch \ Processing

于 2011-05-23T06:01:27.427 に答える
0

バッチジョブをクライアント層で実行する場合は、runsImpersonatedメソッド(クラスから継承RunBaseBatch)をオーバーライドして、falseを返すようにします。

public boolean runsImpersonated()
{
    return false; // always on the client
}

よろしく。

于 2011-06-15T12:27:37.520 に答える