X++ 无法批量运行作业 static void Job47(Args\u Args) { str路径,stx; Treenodeitor iter; TreeNode TreeNode,treeNodeToRelease; 地图显示; FormName FormName; MenuItemName MenuItemName; 容器菜单; inti,n; ; 对于(n=1;n

X++ 无法批量运行作业 static void Job47(Args\u Args) { str路径,stx; Treenodeitor iter; TreeNode TreeNode,treeNodeToRelease; 地图显示; FormName FormName; MenuItemName MenuItemName; 容器菜单; inti,n; ; 对于(n=1;n,x++,dynamics-ax-2009,X++,Dynamics Ax 2009,首先,删除对RunBaseBatch类的修改。该方法意味着在扩展该类的任何类中都会被重写(继承)。请查看类“Tutorial\u RunBaseBatch”,了解如何实现RunBaseBatch模式 现在,也可以考虑当你运行X++代码时,它可以运行在客户端或服务器端。你可以锁定你允许代码运行的哪一方。Global::信息方法可以同时运行客户端和服务器端。 当激活批处理以运行类(而不是作业)时,批处理框架将根据您的设置运行类服务器端。然后,您的代码应独立于客户端,这意味着不能有任何需要访问客户端的

首先,删除对RunBaseBatch类的修改。该方法意味着在扩展该类的任何类中都会被重写(继承)。请查看类“Tutorial\u RunBaseBatch”,了解如何实现RunBaseBatch模式

现在,也可以考虑当你运行X++代码时,它可以运行在客户端或服务器端。你可以锁定你允许代码运行的哪一方。Global::信息方法可以同时运行客户端和服务器端。 当激活批处理以运行类(而不是作业)时,批处理框架将根据您的设置运行类服务器端。然后,您的代码应独立于客户端,这意味着不能有任何需要访问客户端的代码行。WinAPI::moveFile就是一个示例


希望这能有所帮助。

您可以使用客户端或服务器的修饰符标记方法:类有一个名为RunOn的元属性,其中的选项从/client/server调用。此外,任何操作菜单项(即类)也可以定义“RunOn”。如果您想知道代码中的info方法是在客户端还是服务器上运行,只需在该行上添加一个断点,然后查看调用堆栈中的图标。小型计算机表示客户端,服务器图标表示服务器。哦,没有愚蠢的问题,只是愚蠢的回答。这是尝试加载此方法的第一天从系统来看。糟糕的是,他们没有使用.Net来实现。如果您可以使用ISO-8601,那么我更愿意使用wkOfYr方法。如果您的代码确实要运行服务器端,那么您也可以使用.Net库来实现这一点。只需确保为TWC声明CLR权限。您的问题就是Batch如何破坏en存在对WinAPI的依赖关系。.Net库将在您事先确定的“端”上运行。如前所述,您可以标记类和方法,甚至menuitems以仅在服务器端运行。是否有任何特定原因导致您不能使用wkOfYr()?wkOfYr()和WeekOfYear是两种不同的方法。第一种方法假定为ISO-8601,如果您可以使用该方法,则不会出现模拟错误。TWC代表值得信任的计算。在运行需要与.Net(CLR)互操作性的代码之前,您应该声明您对此具有正确的访问权限。请看以下内容:这里有许多示例:但您必须记住,您必须使用完整的名称空间访问.Net库。请看以下内容:
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();
    }  
 }
}