AXForum
(//axforum.info/forums/index.php)
Evgenius | 28.02.2011 07:47 |
Информация об ошибке пакетного задания
Доброго времени суток.
Как в AX2009 можно получить подробную информацию о причинах ошибки, когда пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка»?
Спасибо.
Версия ядра 5.0.1000.52
Основное / Запросы / Пакетное задание, далее кнопка Журнал пакетных заданий, далее кнопка Журнал
Удобнее будет модернизировать метод serverProcessFinishedJobs() в классе BatchRun и получать содержимое информационного сообщения из кнопки «Журнал» сразу в уведомлении об ошибке, которое приходит на электронную почту или во всплывающем окне. Чтоб лишний раз не лазить по формам пакетных заданий.
Evgenius | 28.02.2011 13:14 |
Цитата:
Сообщение от d&m
(Сообщение 244238)
Основное / Запросы / Пакетное задание, далее кнопка Журнал пакетных заданий, далее кнопка Журнал
Я же написал: пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка».
Это означает, что я заглядывал в журнал пакетных заданий.
Меня интересует хоть что-то, кроме слова «Ошибка»
(уточню: я даже видел и нажимал кнопку «Журнал», при нажатии ничего не происходит)
Evgenius | 28.02.2011 13:16 |
Цитата:
Сообщение от Damn
(Сообщение 244261)
Удобнее будет модернизировать метод serverProcessFinishedJobs() в классе BatchRun и получать содержимое информационного сообщения из кнопки «Журнал» сразу в уведомлении об ошибке, которое приходит на электронную почту или во всплывающем окне. Чтоб лишний раз не лазить по формам пакетных заданий.
Уведомлений нет (хотя они настроены, в том числе на эл. почту). Есть только запись в журнале пакетных заданий, где в колонке «статус» надпись «Ошибка».
Цитата:
Сообщение от Evgenius
(Сообщение 244267)
Я же написал: пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка».
Это означает, что я заглядывал в журнал пакетных заданий.
Меня интересует хоть что-то, кроме слова «Ошибка»
Если вы нажмете кнопку «Журнал», про которую говорит d&m, откроется infolog со списком ошибок, которые привели статус выполнения пакетного задания к «Ошибке».
Т.е. кнопка «Журнал» — имеется ввиду не журнал пакетных заданий, она выводит лог в infolog.
Упс… прошу прощения, опередили, пропустил :-/
Цитата:
Сообщение от Evgenius
(Сообщение 244268)
Уведомлений нет (хотя они настроены, в том числе на эл. почту). Есть только запись в журнале пакетных заданий, где в колонке «статус» надпись «Ошибка».
Если в поле Info в таблице Batch контейнер абсолютно пуст — истории нет.
Evgenius | 28.02.2011 13:37 |
Цитата:
Сообщение от kornix
(Сообщение 244273)
Если в поле Info в таблице Batch контейнер абсолютно пуст — истории нет.
Пуст.
Как быть? И в чем м.б. причина того, что данные об ошибке не сохраняются?
Цитата:
Сообщение от Evgenius
(Сообщение 244278)
Пуст.
Как быть? И в чем м.б. причина того, что данные об ошибке не сохраняются?
Пробовали запускать операцию в обычном режиме?
Попробуйте запустить пакет вручную как «частный» пакет от себя, поставьте точку останова в методе pack и unpack вашего класса и посмотрите корректно ли сохраняются параметры при запаковке и распаковке класса.
P.S. А класс который не оставил сообщения стандартный или свой?
Цитата:
Сообщение от Evgenius
(Сообщение 244278)
И в чем м.б. причина того, что данные об ошибке не сохраняются?
Чтобы текст ошибки сохранился, нужно чтобы он вообще был. Если в процессе выполнения вырубили электричество или накрылся сервер или сеть или еще что, то никакого сообщения в Аксапте может и не быть.
Evgenius | 28.02.2011 14:02 |
Цитата:
Сообщение от Zabr
(Сообщение 244282)
Чтобы текст ошибки сохранился, нужно чтобы он вообще был. Если в процессе выполнения вырубили электричество или накрылся сервер или сеть или еще что, то никакого сообщения в Аксапте может и не быть.
Настроено повторение (т.е., статус задания обновляется периодически), и в последние дни сервер не падал
Evgenius | 28.02.2011 14:04 |
Цитата:
Сообщение от kornix
(Сообщение 244281)
Пробовали запускать операцию в обычном режиме?
Попробуйте запустить пакет вручную как «частный» пакет от себя, поставьте точку останова в методе pack и unpack вашего класса и посмотрите корректно ли сохраняются параметры при запаковке и распаковке класса.
P.S. А класс который не оставил сообщения стандартный или свой?
Класс — свой, но опробованный на запасном сервере (задание отрабатывало нормально) и потом перенесенный через xpo-файл.
Попробую ваш совет с частным пакетом, чуть погодя. До сих пор «частными пакетами» не пользоватлся…
Evgenius | 28.02.2011 16:20 |
После очередного перезапуска сервера (третьего) и ручного изменения статуса на «В ожидании» задание запустилось.
Теперь имеет место знакомое дурацкое сообщение
«Ошибка вызова статического метода ClrObject», которое может означать очень много что.
Нет ли способа вот об этой ошибке «вызова метода ClrObject» узнавать какие-либо подробности?
И заодно уже вопрос: как отлаживать код, выполняющийся в пакетных заданиях — только путем создания джоба (job) и его запуска в клиенте, или можно напрямую?
Цитата:
Сообщение от Evgenius
(Сообщение 244324)
И заодно уже вопрос: как отлаживать код, выполняющийся в пакетных заданиях — только путем создания джоба (job) и его запуска в клиенте, или можно напрямую?
Отлаживать код пакетных заданий можно при помощи частных пакетов: При запуске ставите галку «Частный», указываете пакетную группу, затем:
Основное — Переодические операции — Пакет — Обработка, в диалоге указываете выбранную пакетную группу и ставите галку «частный».
А вот по поводу текста сообщения, при его создании у вас наверняка появилась запись в системных сообщениях, если найти его по дате и времени — увидите более полное содержимое ошибки.
Более полное описание из Ax получить можно, но тут для каждого com придется писать свой обработчик ошибок, и не для каждого получится.. Например, тут обсуждалась похожая ошибка, ее причину установить достаточно проблематично.
Evgenius | 28.02.2011 17:35 |
Цитата:
Сообщение от kornix
(Сообщение 244339)
Отлаживать код пакетных заданий можно при помощи частных пакетов: При запуске ставите галку «Частный», указываете пакетную группу, затем:
Основное — Переодические операции — Пакет — Обработка, в диалоге указываете выбранную пакетную группу и ставите галку «частный».
А вот по поводу текста сообщения, при его создании у вас наверняка появилась запись в системных сообщениях, если найти его по дате и времени — увидите более полное содержимое ошибки.
Более полное описание из Ax получить можно, но тут для каждого com придется писать свой обработчик ошибок, и не для каждого получится.. Например, тут обсуждалась похожая ошибка, ее причину установить достаточно проблематично.
Ок, частный пакет все-таки понадобится, понятно.
А насчет остального: CLR и COM вещи разные. И в журналах windows мне ни разу не удавалось ничего найти.. Там ошибки вызова объектов CLR точно отражаются, не читали чего-ндь про это?
С одной стороны, вроде бы должны — это ведь исключения в приложении .Net, но почему-то ни разу не отыскалось ни фига.
Цитата:
Сообщение от Evgenius
(Сообщение 244324)
Нет ли способа вот об этой ошибке «вызова метода ClrObject» узнавать какие-либо подробности?
А вот это не используете ?
X++:
try
{
}
catch (Exception::CLRError)
{
throw error( AifUtil::getClrErrorMessage());
}
Цитата:
Сообщение от Damn
(Сообщение 244347)
А вот это не используете ?
X++:
try
{
}
catch (Exception::CLRError)
{
throw error( AifUtil::getClrErrorMessage());
}
Damn, у вас какая версия Ax? У меня в четверке такого нет
При исполнении CLR кода в аксапте перехват ошибок CLR происходит несколько иначе чем ошибки X++. Поэтому в логах пакетного задания не будет никакой информации, лишь сама пакетная задача переводится в статус «ошибка».
При использовании вызовов CLR методов придется всегда, в явном выиде ошибки перехватывать и парсить, иначе понять причины ошибки нельзя.
Вот пример, как получить описание ошибки вызванной исполнением CLR кода:
X++:
System.Exception exception;
;
try
{
... CLR
}
catch (Exception::CLRError)
{
exception = CLRInterop::getLastException();
while (exception)
{
error(exception.get_Message());
exception = exception.get_InnerException();
}
throw error("Операция отменена");
}
Evgenius | 28.02.2011 18:07 |
Цитата:
Сообщение от someOne
(Сообщение 244354)
При исполнении CLR кода в аксапте перехват ошибок CLR происходит несколько иначе чем ошибки X++. Поэтому в логах пакетного задания не будет никакой информации, лишь сама пакетная задача переводится в статус «ошибка».
При использовании вызовов CLR методов придется всегда, в явном выиде ошибки перехватывать и парсить, иначе понять причины ошибки нельзя.
Вот пример, как получить описание ошибки вызванной исполнением CLR кода:
X++:
System.Exception exception;
;
try
{
... CLR
}
catch (Exception::CLRError)
{
exception = CLRInterop::getLastException();
while (exception)
{
error(exception.get_Message());
exception = exception.get_InnerException();
}
throw error("Операция отменена");
}
Спасибо! В имеющейся под рукой книге то ли эта тема отдельно не выделена (CLRInterop), то ли вообще ни фига нет.
Пример — то, что нужно.
Evgenius | 28.02.2011 18:12 |
Цитата:
Сообщение от Damn
(Сообщение 244347)
А вот это не используете ?
X++:
throw error( AifUtil::getClrErrorMessage());
Последний ответ мне первым на глаза попался, но этот класс, похоже, также надо изучить.
Перепишу код задания с учетом подсказок, спасибо всем.
Часовой пояс GMT +3, время: 01:37. |
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация,
Реклама.
AXForum
(//axforum.info/forums/index.php)
Evgenius | 28.02.2011 07:47 |
Информация об ошибке пакетного задания
Доброго времени суток.
Как в AX2009 можно получить подробную информацию о причинах ошибки, когда пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка»?
Спасибо.
Версия ядра 5.0.1000.52
Основное / Запросы / Пакетное задание, далее кнопка Журнал пакетных заданий, далее кнопка Журнал
Удобнее будет модернизировать метод serverProcessFinishedJobs() в классе BatchRun и получать содержимое информационного сообщения из кнопки «Журнал» сразу в уведомлении об ошибке, которое приходит на электронную почту или во всплывающем окне. Чтоб лишний раз не лазить по формам пакетных заданий.
Evgenius | 28.02.2011 13:14 |
Цитата:
Сообщение от d&m
(Сообщение 244238)
Основное / Запросы / Пакетное задание, далее кнопка Журнал пакетных заданий, далее кнопка Журнал
Я же написал: пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка».
Это означает, что я заглядывал в журнал пакетных заданий.
Меня интересует хоть что-то, кроме слова «Ошибка»
(уточню: я даже видел и нажимал кнопку «Журнал», при нажатии ничего не происходит)
Evgenius | 28.02.2011 13:16 |
Цитата:
Сообщение от Damn
(Сообщение 244261)
Удобнее будет модернизировать метод serverProcessFinishedJobs() в классе BatchRun и получать содержимое информационного сообщения из кнопки «Журнал» сразу в уведомлении об ошибке, которое приходит на электронную почту или во всплывающем окне. Чтоб лишний раз не лазить по формам пакетных заданий.
Уведомлений нет (хотя они настроены, в том числе на эл. почту). Есть только запись в журнале пакетных заданий, где в колонке «статус» надпись «Ошибка».
Цитата:
Сообщение от Evgenius
(Сообщение 244267)
Я же написал: пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка».
Это означает, что я заглядывал в журнал пакетных заданий.
Меня интересует хоть что-то, кроме слова «Ошибка»
Если вы нажмете кнопку «Журнал», про которую говорит d&m, откроется infolog со списком ошибок, которые привели статус выполнения пакетного задания к «Ошибке».
Т.е. кнопка «Журнал» — имеется ввиду не журнал пакетных заданий, она выводит лог в infolog.
Упс… прошу прощения, опередили, пропустил :-/
Цитата:
Сообщение от Evgenius
(Сообщение 244268)
Уведомлений нет (хотя они настроены, в том числе на эл. почту). Есть только запись в журнале пакетных заданий, где в колонке «статус» надпись «Ошибка».
Если в поле Info в таблице Batch контейнер абсолютно пуст — истории нет.
Evgenius | 28.02.2011 13:37 |
Цитата:
Сообщение от kornix
(Сообщение 244273)
Если в поле Info в таблице Batch контейнер абсолютно пуст — истории нет.
Пуст.
Как быть? И в чем м.б. причина того, что данные об ошибке не сохраняются?
Цитата:
Сообщение от Evgenius
(Сообщение 244278)
Пуст.
Как быть? И в чем м.б. причина того, что данные об ошибке не сохраняются?
Пробовали запускать операцию в обычном режиме?
Попробуйте запустить пакет вручную как «частный» пакет от себя, поставьте точку останова в методе pack и unpack вашего класса и посмотрите корректно ли сохраняются параметры при запаковке и распаковке класса.
P.S. А класс который не оставил сообщения стандартный или свой?
Цитата:
Сообщение от Evgenius
(Сообщение 244278)
И в чем м.б. причина того, что данные об ошибке не сохраняются?
Чтобы текст ошибки сохранился, нужно чтобы он вообще был. Если в процессе выполнения вырубили электричество или накрылся сервер или сеть или еще что, то никакого сообщения в Аксапте может и не быть.
Evgenius | 28.02.2011 14:02 |
Цитата:
Сообщение от Zabr
(Сообщение 244282)
Чтобы текст ошибки сохранился, нужно чтобы он вообще был. Если в процессе выполнения вырубили электричество или накрылся сервер или сеть или еще что, то никакого сообщения в Аксапте может и не быть.
Настроено повторение (т.е., статус задания обновляется периодически), и в последние дни сервер не падал
Evgenius | 28.02.2011 14:04 |
Цитата:
Сообщение от kornix
(Сообщение 244281)
Пробовали запускать операцию в обычном режиме?
Попробуйте запустить пакет вручную как «частный» пакет от себя, поставьте точку останова в методе pack и unpack вашего класса и посмотрите корректно ли сохраняются параметры при запаковке и распаковке класса.
P.S. А класс который не оставил сообщения стандартный или свой?
Класс — свой, но опробованный на запасном сервере (задание отрабатывало нормально) и потом перенесенный через xpo-файл.
Попробую ваш совет с частным пакетом, чуть погодя. До сих пор «частными пакетами» не пользоватлся…
Evgenius | 28.02.2011 16:20 |
После очередного перезапуска сервера (третьего) и ручного изменения статуса на «В ожидании» задание запустилось.
Теперь имеет место знакомое дурацкое сообщение
«Ошибка вызова статического метода ClrObject», которое может означать очень много что.
Нет ли способа вот об этой ошибке «вызова метода ClrObject» узнавать какие-либо подробности?
И заодно уже вопрос: как отлаживать код, выполняющийся в пакетных заданиях — только путем создания джоба (job) и его запуска в клиенте, или можно напрямую?
Цитата:
Сообщение от Evgenius
(Сообщение 244324)
И заодно уже вопрос: как отлаживать код, выполняющийся в пакетных заданиях — только путем создания джоба (job) и его запуска в клиенте, или можно напрямую?
Отлаживать код пакетных заданий можно при помощи частных пакетов: При запуске ставите галку «Частный», указываете пакетную группу, затем:
Основное — Переодические операции — Пакет — Обработка, в диалоге указываете выбранную пакетную группу и ставите галку «частный».
А вот по поводу текста сообщения, при его создании у вас наверняка появилась запись в системных сообщениях, если найти его по дате и времени — увидите более полное содержимое ошибки.
Более полное описание из Ax получить можно, но тут для каждого com придется писать свой обработчик ошибок, и не для каждого получится.. Например, тут обсуждалась похожая ошибка, ее причину установить достаточно проблематично.
Evgenius | 28.02.2011 17:35 |
Цитата:
Сообщение от kornix
(Сообщение 244339)
Отлаживать код пакетных заданий можно при помощи частных пакетов: При запуске ставите галку «Частный», указываете пакетную группу, затем:
Основное — Переодические операции — Пакет — Обработка, в диалоге указываете выбранную пакетную группу и ставите галку «частный».
А вот по поводу текста сообщения, при его создании у вас наверняка появилась запись в системных сообщениях, если найти его по дате и времени — увидите более полное содержимое ошибки.
Более полное описание из Ax получить можно, но тут для каждого com придется писать свой обработчик ошибок, и не для каждого получится.. Например, тут обсуждалась похожая ошибка, ее причину установить достаточно проблематично.
Ок, частный пакет все-таки понадобится, понятно.
А насчет остального: CLR и COM вещи разные. И в журналах windows мне ни разу не удавалось ничего найти.. Там ошибки вызова объектов CLR точно отражаются, не читали чего-ндь про это?
С одной стороны, вроде бы должны — это ведь исключения в приложении .Net, но почему-то ни разу не отыскалось ни фига.
Цитата:
Сообщение от Evgenius
(Сообщение 244324)
Нет ли способа вот об этой ошибке «вызова метода ClrObject» узнавать какие-либо подробности?
А вот это не используете ?
X++:
try
{
}
catch (Exception::CLRError)
{
throw error( AifUtil::getClrErrorMessage());
}
Цитата:
Сообщение от Damn
(Сообщение 244347)
А вот это не используете ?
X++:
try
{
}
catch (Exception::CLRError)
{
throw error( AifUtil::getClrErrorMessage());
}
Damn, у вас какая версия Ax? У меня в четверке такого нет
При исполнении CLR кода в аксапте перехват ошибок CLR происходит несколько иначе чем ошибки X++. Поэтому в логах пакетного задания не будет никакой информации, лишь сама пакетная задача переводится в статус «ошибка».
При использовании вызовов CLR методов придется всегда, в явном выиде ошибки перехватывать и парсить, иначе понять причины ошибки нельзя.
Вот пример, как получить описание ошибки вызванной исполнением CLR кода:
X++:
System.Exception exception;
;
try
{
... CLR
}
catch (Exception::CLRError)
{
exception = CLRInterop::getLastException();
while (exception)
{
error(exception.get_Message());
exception = exception.get_InnerException();
}
throw error("Операция отменена");
}
Evgenius | 28.02.2011 18:07 |
Цитата:
Сообщение от someOne
(Сообщение 244354)
При исполнении CLR кода в аксапте перехват ошибок CLR происходит несколько иначе чем ошибки X++. Поэтому в логах пакетного задания не будет никакой информации, лишь сама пакетная задача переводится в статус «ошибка».
При использовании вызовов CLR методов придется всегда, в явном выиде ошибки перехватывать и парсить, иначе понять причины ошибки нельзя.
Вот пример, как получить описание ошибки вызванной исполнением CLR кода:
X++:
System.Exception exception;
;
try
{
... CLR
}
catch (Exception::CLRError)
{
exception = CLRInterop::getLastException();
while (exception)
{
error(exception.get_Message());
exception = exception.get_InnerException();
}
throw error("Операция отменена");
}
Спасибо! В имеющейся под рукой книге то ли эта тема отдельно не выделена (CLRInterop), то ли вообще ни фига нет.
Пример — то, что нужно.
Evgenius | 28.02.2011 18:12 |
Цитата:
Сообщение от Damn
(Сообщение 244347)
А вот это не используете ?
X++:
throw error( AifUtil::getClrErrorMessage());
Последний ответ мне первым на глаза попался, но этот класс, похоже, также надо изучить.
Перепишу код задания с учетом подсказок, спасибо всем.
Часовой пояс GMT +3, время: 09:36. |
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация,
Реклама.
|
#1 |
Участник |
Информация об ошибке пакетного задания Доброго времени суток. Версия ядра 5.0.1000.52
Последний раз редактировалось Evgenius; 28.02.2011 в 07:49. |
|
#2 |
MCT Регистрация: 11.09.2007 Записей в блоге: 6 |
Основное / Запросы / Пакетное задание, далее кнопка Журнал пакетных заданий, далее кнопка Журнал
__________________ |
За это сообщение автора поблагодарили: kornix (3). |
|
#3 |
Участник Регистрация: 28.05.2003 Адрес: Москва |
Удобнее будет модернизировать метод serverProcessFinishedJobs() в классе BatchRun и получать содержимое информационного сообщения из кнопки «Журнал» сразу в уведомлении об ошибке, которое приходит на электронную почту или во всплывающем окне. Чтоб лишний раз не лазить по формам пакетных заданий.
__________________ |
|
#4 |
Участник |
Цитата: Сообщение от d&m Основное / Запросы / Пакетное задание, далее кнопка Журнал пакетных заданий, далее кнопка Журнал Я же написал: пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка».
Последний раз редактировалось Evgenius; 28.02.2011 в 13:18.
|
|
#5 |
Участник |
Цитата: Сообщение от Damn Удобнее будет модернизировать метод serverProcessFinishedJobs() в классе BatchRun и получать содержимое информационного сообщения из кнопки «Журнал» сразу в уведомлении об ошибке, которое приходит на электронную почту или во всплывающем окне. Чтоб лишний раз не лазить по формам пакетных заданий. Уведомлений нет (хотя они настроены, в том числе на эл. почту). Есть только запись в журнале пакетных заданий, где в колонке «статус» надпись «Ошибка».
Последний раз редактировалось Evgenius; 28.02.2011 в 13:23. |
|
#6 |
MCP Регистрация: 24.02.2009 Адрес: Санкт-Петербург |
Цитата: Сообщение от Evgenius Я же написал: пакетное задание отображается в журнале пакетных заданий со статусом «Ошибка». Если вы нажмете кнопку «Журнал», про которую говорит d&m, откроется infolog со списком ошибок, которые привели статус выполнения пакетного задания к «Ошибке». Упс… прошу прощения, опередили, пропустил :-/ |
|
#7 |
MCP Регистрация: 24.02.2009 Адрес: Санкт-Петербург |
Цитата: Сообщение от Evgenius Уведомлений нет (хотя они настроены, в том числе на эл. почту). Есть только запись в журнале пакетных заданий, где в колонке «статус» надпись «Ошибка». Если в поле Info в таблице Batch контейнер абсолютно пуст — истории нет. |
|
#8 |
Участник |
Цитата: Сообщение от kornix Если в поле Info в таблице Batch контейнер абсолютно пуст — истории нет. Пуст. |
|
#9 |
MCP Регистрация: 24.02.2009 Адрес: Санкт-Петербург |
Цитата: Сообщение от Evgenius Пуст. Пробовали запускать операцию в обычном режиме? |
|
#10 |
||
Участник Регистрация: 26.06.2002 Адрес: Москва |
Цитата: Сообщение от Evgenius И в чем м.б. причина того, что данные об ошибке не сохраняются? Чтобы текст ошибки сохранился, нужно чтобы он вообще был. Если в процессе выполнения вырубили электричество или накрылся сервер или сеть или еще что, то никакого сообщения в Аксапте может и не быть. |
||
|
#11 |
Участник |
Цитата: Сообщение от Zabr Чтобы текст ошибки сохранился, нужно чтобы он вообще был. Если в процессе выполнения вырубили электричество или накрылся сервер или сеть или еще что, то никакого сообщения в Аксапте может и не быть. Настроено повторение (т.е., статус задания обновляется периодически), и в последние дни сервер не падал |
|
#12 |
Участник |
Цитата: Сообщение от kornix Пробовали запускать операцию в обычном режиме? Класс — свой, но опробованный на запасном сервере (задание отрабатывало нормально) и потом перенесенный через xpo-файл. Попробую ваш совет с частным пакетом, чуть погодя. До сих пор «частными пакетами» не пользоватлся… |
|
#13 |
Участник |
После очередного перезапуска сервера (третьего) и ручного изменения статуса на «В ожидании» задание запустилось. |
|
#14 |
MCP Регистрация: 24.02.2009 Адрес: Санкт-Петербург |
Цитата: Сообщение от Evgenius И заодно уже вопрос: как отлаживать код, выполняющийся в пакетных заданиях — только путем создания джоба (job) и его запуска в клиенте, или можно напрямую? Отлаживать код пакетных заданий можно при помощи частных пакетов: При запуске ставите галку «Частный», указываете пакетную группу, затем: А вот по поводу текста сообщения, при его создании у вас наверняка появилась запись в системных сообщениях, если найти его по дате и времени — увидите более полное содержимое ошибки. Более полное описание из Ax получить можно, но тут для каждого com придется писать свой обработчик ошибок, и не для каждого получится.. Например, тут обсуждалась похожая ошибка, ее причину установить достаточно проблематично. |
За это сообщение автора поблагодарили: Poleax (2), Evgenius (1). |
|
#15 |
Участник |
Цитата: Сообщение от kornix Отлаживать код пакетных заданий можно при помощи частных пакетов: При запуске ставите галку «Частный», указываете пакетную группу, затем: А вот по поводу текста сообщения, при его создании у вас наверняка появилась запись в системных сообщениях, если найти его по дате и времени — увидите более полное содержимое ошибки. Более полное описание из Ax получить можно, но тут для каждого com придется писать свой обработчик ошибок, и не для каждого получится.. Например, тут обсуждалась похожая ошибка, ее причину установить достаточно проблематично. Ок, частный пакет все-таки понадобится, понятно. С одной стороны, вроде бы должны — это ведь исключения в приложении .Net, но почему-то ни разу не отыскалось ни фига.
Последний раз редактировалось Evgenius; 28.02.2011 в 17:38.
|
|
#16 |
Участник Регистрация: 28.05.2003 Адрес: Москва |
Цитата: Сообщение от Evgenius Нет ли способа вот об этой ошибке «вызова метода ClrObject» узнавать какие-либо подробности? А вот это не используете ? X++: try { } catch (Exception::CLRError) { throw error( AifUtil::getClrErrorMessage()); }
__________________ |
За это сообщение автора поблагодарили: kornix (1), Evgenius (1). |
|
#17 |
MCP Регистрация: 24.02.2009 Адрес: Санкт-Петербург |
Цитата: Сообщение от Damn А вот это не используете ? X++: try { } catch (Exception::CLRError) { throw error( AifUtil::getClrErrorMessage()); } Damn, у вас какая версия Ax? У меня в четверке такого нет |
|
#18 |
||
Участник
Регистрация: 11.12.2008 Адрес: Москва |
При исполнении CLR кода в аксапте перехват ошибок CLR происходит несколько иначе чем ошибки X++. Поэтому в логах пакетного задания не будет никакой информации, лишь сама пакетная задача переводится в статус «ошибка». При использовании вызовов CLR методов придется всегда, в явном выиде ошибки перехватывать и парсить, иначе понять причины ошибки нельзя. Вот пример, как получить описание ошибки вызванной исполнением CLR кода: X++: System.Exception exception; ; try { ... CLR } catch (Exception::CLRError) { exception = CLRInterop::getLastException(); while (exception) { error(exception.get_Message()); exception = exception.get_InnerException(); } throw error("Операция отменена"); } |
||
За это сообщение автора поблагодарили: Evgenius (1). |
|
#19 |
Участник |
Цитата: Сообщение от someOne При исполнении CLR кода в аксапте перехват ошибок CLR происходит несколько иначе чем ошибки X++. Поэтому в логах пакетного задания не будет никакой информации, лишь сама пакетная задача переводится в статус «ошибка». При использовании вызовов CLR методов придется всегда, в явном выиде ошибки перехватывать и парсить, иначе понять причины ошибки нельзя. Вот пример, как получить описание ошибки вызванной исполнением CLR кода: X++: System.Exception exception; ; try { ... CLR } catch (Exception::CLRError) { exception = CLRInterop::getLastException(); while (exception) { error(exception.get_Message()); exception = exception.get_InnerException(); } throw error("Операция отменена"); } Спасибо! В имеющейся под рукой книге то ли эта тема отдельно не выделена (CLRInterop), то ли вообще ни фига нет. |
|
#20 |
Участник |
Цитата: Сообщение от Damn А вот это не используете ? X++: throw error( AifUtil::getClrErrorMessage());
Последний ответ мне первым на глаза попался, но этот класс, похоже, также надо изучить. Перепишу код задания с учетом подсказок, спасибо всем. |
I have a DLL with a class TestService.TestServiceWebClient
.
It’s constructor has two parameters, one of type string
, and the other one is of type TestService.TestServiceWebClient.MODE
which is an enum.
In C#, I use this easily with the code below.
string secret;
secret = "asdfasdf";
TestService.TestServiceWebClient test = new TestService.TestServiceWebClient(secret, TestService.TestServiceWebClient.MODE.TEST);
test.setGroupForCustomer("test@foo.com", "12345", "TestService.TestServiceWebClient.CUST_GROUPS.MILITARY);
In AX, I’m having some trouble. I know the DLL is referenced properly because I see the parameters when I create an instance of the class, but I’m getting errors such as
The class TestService does not contain this function
when I use the keyword new
:
TestService test;
;
test = new TestService.TestServiceWebClient(secret, "");
I’ve also tried…
TestService.TestServiceWebClient test;
;
test = new TestService.TestServiceWebClient(secret, "");
That second argument is NOT a string
, so when I try to add an enum, I get
enumeration doesn’t exist…
TestService test;
;
test = new TestService.TestServiceWebClient(secret, TestService.TestServiceWebClient.MODE::TEST);
Do I need an enum created in AX that would map to the enums from my DLL?
C# Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Collections.Specialized;
namespace ProductService
{
public class TestWebClient
{
public enum CUST_GROUPS
{
NOT_LOGGED_IN,
GENERAL,
WHOLESALE,
RETAILER,
TEST_REVIEWS,
COTM_DISCOUNT,
MILITARY,
FIRST_RESPONDER
};
public enum MODE
{
DEV,
TEST,
PROD
}
public static int COTM_GROUP_ID = 5;
public static int GENERAL_GROUP_ID = 1;
private string presharedSecret;
private string BASE_URL;
private static string destinationPathPut = "/path";
private static string destinationPathGet = "/pathgroup";
public TestWebClient(String presharedSecret, MODE mode)
{
this.presharedSecret = presharedSecret;
switch (mode)
{
case MODE.DEV:
BASE_URL = "http://dev";
break;
case MODE.TEST:
BASE_URL = "http://test";
break;
case MODE.PROD:
BASE_URL = "https://prod";
break;
}
}
public bool setGroupForCustomer(string customerEmail, string customerId, CUST_GROUPS selectedGroup)
{
WebClient client = new WebClient();
try
{
NameValueCollection requestParams = new NameValueCollection();
requestParams.Add("customer_id", customerId);
requestParams.Add("email", customerEmail);
requestParams.Add("group_id", ((int)selectedGroup).ToString());
requestParams.Add("signature", Util.sha1Hash(customerId.ToString() + ((int)selectedGroup).ToString() + customerEmail + presharedSecret));
byte[] response = client.UploadValues(BASE_URL + "/" + destinationPathPut,
requestParams
);
string result = System.Text.Encoding.UTF8.GetString(response);
}
catch (Exception e)
{
return false;
}
finally
{
client.Dispose();
}
return true;
}
public bool isInGroup(string customerEmail, string customerId, CUST_GROUPS selectedGroup)
{
WebClient client = new WebClient();
NameValueCollection requestParams = new NameValueCollection();
requestParams.Add("customer_id", customerId);
requestParams.Add("email", customerEmail);
requestParams.Add("group_id", ((int)selectedGroup).ToString());
requestParams.Add("signature", Util.sha1Hash(customerId.ToString() + ((int)selectedGroup).ToString() + customerEmail + presharedSecret));
byte[] response = client.UploadValues(BASE_URL + "/" + destinationPathGet,
requestParams
);
string result = System.Text.Encoding.UTF8.GetString(response);
client.Dispose();
System.Diagnostics.Debug.WriteLine(result);
return result.Equals("true");
}
}
}
I have a DLL with a class TestService.TestServiceWebClient
.
It’s constructor has two parameters, one of type string
, and the other one is of type TestService.TestServiceWebClient.MODE
which is an enum.
In C#, I use this easily with the code below.
string secret;
secret = "asdfasdf";
TestService.TestServiceWebClient test = new TestService.TestServiceWebClient(secret, TestService.TestServiceWebClient.MODE.TEST);
test.setGroupForCustomer("test@foo.com", "12345", "TestService.TestServiceWebClient.CUST_GROUPS.MILITARY);
In AX, I’m having some trouble. I know the DLL is referenced properly because I see the parameters when I create an instance of the class, but I’m getting errors such as
The class TestService does not contain this function
when I use the keyword new
:
TestService test;
;
test = new TestService.TestServiceWebClient(secret, "");
I’ve also tried…
TestService.TestServiceWebClient test;
;
test = new TestService.TestServiceWebClient(secret, "");
That second argument is NOT a string
, so when I try to add an enum, I get
enumeration doesn’t exist…
TestService test;
;
test = new TestService.TestServiceWebClient(secret, TestService.TestServiceWebClient.MODE::TEST);
Do I need an enum created in AX that would map to the enums from my DLL?
C# Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Collections.Specialized;
namespace ProductService
{
public class TestWebClient
{
public enum CUST_GROUPS
{
NOT_LOGGED_IN,
GENERAL,
WHOLESALE,
RETAILER,
TEST_REVIEWS,
COTM_DISCOUNT,
MILITARY,
FIRST_RESPONDER
};
public enum MODE
{
DEV,
TEST,
PROD
}
public static int COTM_GROUP_ID = 5;
public static int GENERAL_GROUP_ID = 1;
private string presharedSecret;
private string BASE_URL;
private static string destinationPathPut = "/path";
private static string destinationPathGet = "/pathgroup";
public TestWebClient(String presharedSecret, MODE mode)
{
this.presharedSecret = presharedSecret;
switch (mode)
{
case MODE.DEV:
BASE_URL = "http://dev";
break;
case MODE.TEST:
BASE_URL = "http://test";
break;
case MODE.PROD:
BASE_URL = "https://prod";
break;
}
}
public bool setGroupForCustomer(string customerEmail, string customerId, CUST_GROUPS selectedGroup)
{
WebClient client = new WebClient();
try
{
NameValueCollection requestParams = new NameValueCollection();
requestParams.Add("customer_id", customerId);
requestParams.Add("email", customerEmail);
requestParams.Add("group_id", ((int)selectedGroup).ToString());
requestParams.Add("signature", Util.sha1Hash(customerId.ToString() + ((int)selectedGroup).ToString() + customerEmail + presharedSecret));
byte[] response = client.UploadValues(BASE_URL + "/" + destinationPathPut,
requestParams
);
string result = System.Text.Encoding.UTF8.GetString(response);
}
catch (Exception e)
{
return false;
}
finally
{
client.Dispose();
}
return true;
}
public bool isInGroup(string customerEmail, string customerId, CUST_GROUPS selectedGroup)
{
WebClient client = new WebClient();
NameValueCollection requestParams = new NameValueCollection();
requestParams.Add("customer_id", customerId);
requestParams.Add("email", customerEmail);
requestParams.Add("group_id", ((int)selectedGroup).ToString());
requestParams.Add("signature", Util.sha1Hash(customerId.ToString() + ((int)selectedGroup).ToString() + customerEmail + presharedSecret));
byte[] response = client.UploadValues(BASE_URL + "/" + destinationPathGet,
requestParams
);
string result = System.Text.Encoding.UTF8.GetString(response);
client.Dispose();
System.Diagnostics.Debug.WriteLine(result);
return result.Equals("true");
}
}
}
Добрый день,
C# SDK 1.76, Framework 3.5
Исходящий документ, сформировал и заполнил переменную UniversalTransferDocument типа Diadoc.Api.DataXml.Utd820.UniversalTransferDocument, вызываю сериализацию объекта для последующей передачи в GenerateSenderTitleXml():
Вопроса 2, в каждом из вариантов.
Diadoc.Api.DataXml.Utd820.UniversalTransferDocument universalTransferDocument;
System.Byte[] contract;
;
…
1 вариант
contract = CLRInterop::staticInvoke('Diadoc.Api.XmlSerializerExtensions', 'SerializeToXml', universalTransferDocument);
Валится с внутренней ошибкой «Ошибка вызова статического метода ClrObject».
Мы должны передавать в метод эту переменную или над ней нужно провести доп операции ?
Возможно, проблема с моей стороны, но причину пока понять не могу.
Реализация метода
https://github.com/diadoc/diadocsdk-csharp/blob/a50fb514cc040bdca51e24e44f6e3ab4052d6ac2/src/XmlSerializerExtensions.cs
2 вариант
Использую самописную сериализацию, не полностью идентичную из апи, для теста отправки.
this.serializeToXml(universalTransferDocument);
public System.Byte[] serializeToXml(CLRObject _object)
{
System.Xml.Serialization.XmlSerializer xmlSerializer;
System.IO.MemoryStream xml;
System.Type type = _object.GetType();
System.Byte[] content;
;
xmlSerializer = new System.Xml.Serialization.XmlSerializer(type);
xml = new System.IO.MemoryStream();
xmlSerializer.Serialize(xml, _object);
content = xml.ToArray();
return content;
}
Сериализация проходит, но в GenerateSenderTitleXml() получаю ошибку
«There was an error generating the XML document. The type Diadoc.Api.DataXml.Utd820.Address was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.»
Что довольно странно на самом деле.
Invoice, СЧФДОП.
Нужно приводить самописную реализацию к виду официальной или адрес действительно не сериализуется ?
Я использую веб-службу отдыха в работе в AX 2012.
Я использую UTF-8, и когда я запускаю свою работу, я получаю ошибку: «CLRObject» не может быть [!]
dataStream = response.GetResponseStream();
мой код:
postData = strfmt('My json');
new InteropPermission = «my URL»;
request = System.Net.WebRequest :: Создать (url);
System.Net.ServicePointManager :: set_Expect100Continue (false);
request.set_Method («POST»);
utf8 = System.Text.Encoding :: get_UTF8 ();
byteArray = utf8.GetBytes (postData);
request.set_ContentType («application / JSON»);
request.set_ContentLength (byteArray.get_Length ());
dataStream = request.GetRequestStream (); [ ! d12]
dataStream.Write (byteArray, 0, byteArray.get_Length ());
dataStream.Close (); try
{
response = request.GetResponse();
}
catch (Exception :: CLRError)
{
postdata = «»;
}
dataStream = response.GetResponseStream ();
streamReader = новый System.IO.StreamReader (dataStream);
returnValue = streamReader.ReadToEnd ();
, пожалуйста, сообщите, что для тех же URL-адресов и почтовых данных (JSON) я могу получить правильные данные в Postman (), но я столкнулся с проблемой в AX.
, и я знаю, что что-то не так с моим Unicode, потому что, когда я тестирую то же, что и выше, с другим URL-адресом и данными для другого веб-сервиса, это приводит к ответу на меня, что в нем все «& amp;» символы заменяются на Unicode « u0026» !!!!!
не могли бы вы мне помочь?
Я пытаюсь принудительно открыть диалоговое окно печати, чтобы все, что нужно сделать пользователю, это установить адрес электронной почты и нажать «ОК». Я нашел несколько руководств о том, как распечатать отчет в файл или на принтер без диалогового окна печати, но это не то, что я ищу.
Обычно для отправки отчета по электронной почте пользователь отображает отчет, щелкает значок печати на панели инструментов, а затем выбирает сообщение электронной почты и отправляет его. Я хочу автоматически вырезать первые два шага.
Это одна из моих многочисленных попыток сделать это до сих пор, но безрезультатно.
void emailInvoice()
{
Args args;
ReportRun rr;
Report rb;
PrintJobSettings pjs;
CustInvoiceJour record;
;
select record where record.RecId == 5637175089;
args = new Args("SalesInvoice");
args.record(record);
args.parmEnum(PrintCopyOriginal::OriginalPrint);
// Set report run properties
rr = new ReportRun(args,'');
rr.suppressReportIsEmptyMessage(true);
rr.query().interactive(false);
// set report properties
rb = rr.report();
rb.interactive(true);
// set print job settings
pjs = rr.printJobSettings();
pjs.fileName(strfmt("C:UsersgbonzoDesktop%1.pdf", record.SalesId));
pjs.fitToPage(true);
// break the report info pages using the height of the current printer's paper
pjs.virtualPageHeight(-1);
// force PDF printing
pjs.format(PrintFormat::PDF);
pjs.setTarget(PrintMedium::Mail);
pjs.viewerType(ReportOutputUserType::PDF);
// lock the print job settings so can't be changed
// X++ code int the report may try to change the destination
// to the screen for example but this does not make
// sense when running a report here
pjs.lockDestinationProperties(true);
// Initialize the report
rr.init();
rr.run();
}
Заранее спасибо за вашу помощь!
RE: Ax 2009 Workflow
Post by usenet » Tue Sep 23, 2008 8:55 am
HI,
You vave installed one .Net Business Connector, and created two
configurations in the AX Config. Utility for the Business Connector, Right ?
Only one AX Configuration can be active at the same time. You have to
activate the second if you want, but the first will no work anymore.
I use IISReset DOS command to take in account a new . Net Business Connector
configuration… it’s may be a quick and dirty solution.
Greets,
Vijay
Reply
I am attempting to force open the print dialog so that all the user has to do is set the email address and press ok. I’ve found multiple tutorials on how to print a report to file or a printer without the print dialog, but that’s not what I’m looking for.
Typically to email a report, the user displays the report, clicks the print icon in the tool bar, and then chooses email and sends it. I want to cut out the first two steps automatically.
This is one of my many attempts at doing this so far, but to no avail.
void emailInvoice()
{
Args args;
ReportRun rr;
Report rb;
PrintJobSettings pjs;
CustInvoiceJour record;
;
select record where record.RecId == 5637175089;
args = new Args("SalesInvoice");
args.record(record);
args.parmEnum(PrintCopyOriginal::OriginalPrint);
// Set report run properties
rr = new ReportRun(args,'');
rr.suppressReportIsEmptyMessage(true);
rr.query().interactive(false);
// set report properties
rb = rr.report();
rb.interactive(true);
// set print job settings
pjs = rr.printJobSettings();
pjs.fileName(strfmt("C:\Users\gbonzo\Desktop\%1.pdf", record.SalesId));
pjs.fitToPage(true);
// break the report info pages using the height of the current printer's paper
pjs.virtualPageHeight(-1);
// force PDF printing
pjs.format(PrintFormat::PDF);
pjs.setTarget(PrintMedium::Mail);
pjs.viewerType(ReportOutputUserType::PDF);
// lock the print job settings so can't be changed
// X++ code int the report may try to change the destination
// to the screen for example but this does not make
// sense when running a report here
pjs.lockDestinationProperties(true);
// Initialize the report
rr.init();
rr.run();
}
Thanks in advance for your help!
Добрый день,
C# SDK 1.76, Framework 3.5
Исходящий документ, сформировал и заполнил переменную UniversalTransferDocument типа Diadoc.Api.DataXml.Utd820.UniversalTransferDocument, вызываю сериализацию объекта для последующей передачи в GenerateSenderTitleXml():
Вопроса 2, в каждом из вариантов.
Diadoc.Api.DataXml.Utd820.UniversalTransferDocument universalTransferDocument;
System.Byte[] contract;
;
…
1 вариант
contract = CLRInterop::staticInvoke('Diadoc.Api.XmlSerializerExtensions', 'SerializeToXml', universalTransferDocument);
Валится с внутренней ошибкой «Ошибка вызова статического метода ClrObject».
Мы должны передавать в метод эту переменную или над ней нужно провести доп операции ?
Возможно, проблема с моей стороны, но причину пока понять не могу.
Реализация метода
https://github.com/diadoc/diadocsdk-csharp/blob/a50fb514cc040bdca51e24e44f6e3ab4052d6ac2/src/XmlSerializerExtensions.cs
2 вариант
Использую самописную сериализацию, не полностью идентичную из апи, для теста отправки.
this.serializeToXml(universalTransferDocument);
public System.Byte[] serializeToXml(CLRObject _object)
{
System.Xml.Serialization.XmlSerializer xmlSerializer;
System.IO.MemoryStream xml;
System.Type type = _object.GetType();
System.Byte[] content;
;
xmlSerializer = new System.Xml.Serialization.XmlSerializer(type);
xml = new System.IO.MemoryStream();
xmlSerializer.Serialize(xml, _object);
content = xml.ToArray();
return content;
}
Сериализация проходит, но в GenerateSenderTitleXml() получаю ошибку
«There was an error generating the XML document. The type Diadoc.Api.DataXml.Utd820.Address was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.»
Что довольно странно на самом деле.
Invoice, СЧФДОП.
Нужно приводить самописную реализацию к виду официальной или адрес действительно не сериализуется ?