0
static void Job47(Args _args)
{
str                                  path,stx;
TreeNodeIterator                     iter;
TreeNode                             treeNode, treeNodeToRelease;
Map                                  dictMenuDisplay;
FormName                             formName;
MenuItemName                         menuItemName;
container                            conMenu;
int                                  i,n;
    ;

   for (n=1;n<=1;n++)
   {
    info::messageWinAddLine(strfmt("iter:%1",n));
    path            ="Menu Items\\Display";
    dictMenuDisplay = new Map(Types::String,Types::Container);
    treenode        = Treenode::findNode(path);
    iter            = treenode.AOTiterator();
    treenode        = iter.next();

    while (treenode)
      {
        formName     = treenode.AOTgetProperty("Object");
        menuItemName = treenode.AOTname();

       if (dictMenuDisplay.exists(formName))
        {
         conMenu = dictMenuDisplay.lookup(formName);
         conMenu = conIns(conMenu,conlen(conMenu)+1,menuItemName);
         dictMenuDisplay.insert(formName,conMenu);
         }

       else
         dictMenuDisplay.insert(formName,[menuItemName]);
         treenode = iter.next();
    }  
 }
}

当我批量运行上述作业时,它显示以下错误“服务器端模拟(RunAs)会话试图调用仅可用于客户端处理的方法”并指向行 info::messageWinAddLine(strfmt("iter: %1",n)); 我尝试在 RunbaseBatch 类的方法 runsImpersonated() 中添加 false。但似乎也不起作用。

我是 AX2009 的新手,所以不太了解在客户端或服务器中运行作业意味着什么,请引导我走向正确的方向。

4

1 回答 1

1

首先,删除对 RunBaseBatch 类的修改。该方法意味着在任何扩展该类(继承)的类中被覆盖。查看“Tutorial_RunbaseBatch”类,了解如何实现 RunBaseBatch 模式。

现在,还要考虑当您运行 x++ 代码时,它可以在客户端或服务器端运行。您可以锁定允许代码运行的哪一侧的方法。GLOBAL::info 方法可以在客户端和服务器端运行。当你激活一个批处理来运行一个类(不是一个作业),一个扩展 RunBaseBatch 的类,那么批处理框架将根据你的设置运行类服务器端。然后,您的代码应该独立于客户端,这意味着不能有任何代码行需要访问客户端。WinAPI::moveFile 就是一个例子。

希望这个对你有帮助。

于 2011-03-11T13:42:14.660 回答