не удается запустить задание в пакетном режиме

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)); Я попытался поставить false в методе runImpersonated() в классе RunbaseBatch. Но вроде тоже не работает.

Я новичок в AX2009, поэтому не совсем понимаю, что означает выполнение задания на клиенте или на сервере, пожалуйста, направьте меня в правильном направлении.


person piku    schedule 11.03.2011    source источник


Ответы (1)


Сначала удалите модификацию класса RunBaseBatch. Этот метод предназначен для переопределения в любых классах, расширяющих этот класс (наследование). Взгляните на класс Tutorial_RunbaseBatch, чтобы понять, как можно реализовать шаблон RunBaseBatch.

Теперь также учтите, что когда вы запускаете код x++, он может выполняться как на стороне клиента, так и на стороне сервера. У вас могут быть заблокированы методы, для какой стороны вы разрешаете выполнение кода. Метод GLobal::info может выполняться как на стороне клиента, так и на стороне сервера. Когда вы активируете пакет для запуска класса (не задания), класса, расширяющего RunBaseBatch, тогда пакетная среда запускает сервер класса в соответствии с вашими настройками. Тогда ваш код не должен зависеть от клиентской стороны, то есть не может быть ни одной строки кода, требующей доступа к клиентской стороне. WinAPI::moveFile является примером.

Надеюсь, что это помогает немного.

person Skaue    schedule 11.03.2011
comment
Привет Skaue спасибо за быстрый ответ. Можете ли вы объяснить, есть ли какие-либо преимущества при выполнении задания или класса на стороне сервера или на стороне клиента. Откуда я знаю, какая строка кода будет доступом к серверной или клиентской стороне. В моей работе строка info::messageWinAddLine(strfmt(iter:%1,n)); это на стороне клиента? - person piku; 11.03.2011
comment
Когда вы интерактивно запускаете задание в клиенте, вы явно запускаете его со стороны клиента. Вы можете активировать точки останова, и отладчик покажет, когда код выполняется на стороне клиента или на стороне сервера. Они показывают это, имея значок в стеке вызовов. Наличие класса, который может выполняться в виде пакета, может быть преимуществом, если это когда-либо является функцией, которую хочет клиент. Возможность экспортировать данные, например, в виде ночного пакетного задания — это нормально. Все зависит от того, для чего предназначен ваш класс. - person Skaue; 11.03.2011
comment
хотя глупый вопрос.. как я узнаю, для чего мой класс? можешь немного объяснить? В моей работе строка info::messageWinAddLine(strfmt(iter:%1,n)); это на стороне клиента или на сервере? большое спасибо за быстрый ответ. - person piku; 11.03.2011
comment
вы можете пометить методы модификаторами для клиента или сервера: msdn.microsoft.com/en -US/library/aa891619.aspx Классы имеют метасвойство, называемое RunOn, где параметры CalledFrom/Client/Server. Кроме того, любые MenuItems для Action (которые являются классами) также могут определять RunOn. Если вы хотите знать, выполняется ли информационный метод в вашем коде на клиенте или на сервере, просто добавьте точку останова в эту строку и посмотрите на значок в стеке вызовов. Маленький компьютер указывает на клиент, значок, похожий на сервер, указывает на сервер. о, и нет глупых вопросов, только глупые ответы - person Skaue; 11.03.2011
comment
Я очень ценю ваши усилия. Большое спасибо за ваши комментарии, мне это нравится ... Если у меня есть что-то еще, чтобы спросить о том же, я обязательно напишу это здесь. Еще раз спасибо. - person piku; 11.03.2011
comment
нет проблем, и спасибо, что отметили это как ответ. :) удачного кодирования! - person Skaue; 11.03.2011
comment
эй Skaue 1 последний вопрос. Предположим, у меня есть задание, которое выполняется на сервере, а строка задания должна выполняться на стороне клиента. Могу ли я добиться этого? Потому что, когда я запускаю метод WeekofYear в глобальном классе в пакетном режиме, он не выполняется (потому что он вызывает методы класса WINApi, которые могут работать только на клиенте). Пожалуйста, помогите. - person piku; 15.03.2011
comment
Да. Это метод firstDayOfWeek, который пытается загрузить это из системы. К сожалению, вместо этого они не использовали .Net. Если вы можете использовать ISO-8601, я бы предпочел вместо этого использовать метод wkOfYr. Если ваш код точно должен работать на стороне сервера, вы также можете использовать для этого библиотеки .Net. Просто убедитесь, что для TWC установлены разрешения CLR. Ваша проблема является прекрасным примером того, как пакетная обработка может сломаться, когда есть зависимость от WinAPI. - person Skaue; 15.03.2011
comment
Можете ли вы написать немного подробнее, я пытался использовать библиотеки .net, но это тоже не работает (также вызывает клиентскую сторону. - person piku; 16.03.2011
comment
Библиотеки .Net будут работать на той стороне, которую вы определите заранее. Как уже упоминалось, вы можете пометить классы и методы и даже элементы меню для запуска только на стороне сервера. По какой-то конкретной причине вы не можете использовать wkOfYr()? - person Skaue; 18.03.2011
comment
да, все, что я пытаюсь сделать, это запустить WeekOfyear в пакетном режиме, и он выдает ошибку. Сеанс олицетворения (RunAs) на стороне сервера пытался вызвать метод, доступный только для обработки на стороне клиента. Я хочу использовать .net lib или любые фиктивные классы или методы, чтобы решить проблему, просто разочарование, не способное найти выход :( - person piku; 21.03.2011
comment
И как здесь использовать .net lib и утверждать разрешения CLR для TWC? Гоша я такой тупой.. - person piku; 21.03.2011
comment
wkOfYr() и WeekOfYear — это два разных метода. Первый предполагает ISO-8601, и если вы можете использовать его, вы не получите ошибку олицетворения. TWC расшифровывается как Trust Worthy Computing. Прежде чем запускать код, требующий взаимодействия с .Net (CLR), вы должны убедиться, что у вас есть для этого надлежащий доступ. Взгляните на это: msdn.microsoft.com/en-US/library/ aa605505.aspx - person Skaue; 21.03.2011
comment
еще раз спасибо за быстрый ответ (я предполагаю, что iso-8601) ну, к сожалению, метод wkOfYr() отсутствует в моем глобальном классе (не могли бы вы прислать мне код). В настоящее время вы пытаетесь создать соответствующие методы в WinAPIServer class, убедившись, что соответствующий код работает только на сервере. Я также попробую использовать .net lib позже. Заранее спасибо. - person piku; 21.03.2011
comment
Это работает! я настроил свой WinAPIserver с помощью соответствующих методов, а также использовал метод assert(). Теперь я попытаюсь получить то же самое, используя .net lib (как использовать .net lib в x++, не могли бы вы предложить какие-либо документы с примерами?). Большое спасибо за вашу помощь еще раз :) - person piku; 22.03.2011
comment
Да, ты был прав, WkOfYr() тоже работает на сервере. Он тоже работает нормально. Не могли бы вы получить какую-нибудь идею или какой-либо пример относительно достижения того же самого с помощью библиотек .net, пожалуйста. - person piku; 23.03.2011
comment
Есть десятки примеров: google.no/ Вы должны помнить, что вам потребуется доступ к библиотекам .Net с полными пространствами имен. Посмотрите здесь: msdn.microsoft.com/en-US/library/cc598160 .aspx - person Skaue; 25.03.2011