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并在调用对象的任何位置执行,可以是clientserver。它还依赖于 Class BatchableBatchRunable。这两个类的属性都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批量运行报告以通过电子邮件发送发票 P​​DF 时,我遇到了同样的错误消息。

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中运行时,除非启动 Batch 处理,否则它不会执行。可以通过导航到 开始批处理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 回答