22.04.2011, 14:09 | #1 |
Участник
|
AIF - AifFileSystemAdapter (импорт)
Здравствуйте!
Не могу решить проблемку. Нужно для обкатки AIF, импортировать номенклатуру из AX 2009 №1 в AX 2009 №2, соответственно с помощью AIF. Номенклатура из AX 2009 №1 выгружается, тут проблем нет. Теперь хочу импортировать эту номенклатуру в AX 2009 №2: 1. Создал "Локальную конечную точку" 2. Настроил "Адаптер транспортировки" 3. Создал "Канал" с направление "Входящий", указал путь к выгруженной номенклатуре из AX 2009 №1 4. Активировал "Службу AIF" InventItemService 5. Создал "Конечную точку" -> Политика действий: InventItemService.create (все поля, при выгрузке тоже все поля). 6. Выполняю Job: X++: static void AifInboundProcessing(Args _args) { AifInboundProcessingService inbound = new AifInboundProcessingService(); AifGatewayReceiveService send = new AifGatewayReceiveService(); ; send.run(); inbound.run(); } Файл выгруженный из AX 2009 №1 удаляется(по логике так и должно быть), но номенклатура не создаётся. Перехожу на форму "Основное -> Периодические операции -> AIF -> Исключения", вижу ошибку: Локальная конечная точка DIT не существует. DIT, это "Конечная точка" в AX 2009 №1. Не долго думая, я пересоздал конечную точку в AX 2009 №2 и обозвал её именно DIT , конечно же я не рассчитывал что это поможет. Подскажите, пожалуйста, как справиться с этой ошибкой, что от меня требует система, почему ей нужна именно эта конечная точка? За ранее спасибо. |
|
22.04.2011, 18:10 | #2 |
Участник
|
Результат переименования конечной точки озвучь более конкретно: импорт после этого был успешно сделан или нет...
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
25.04.2011, 07:25 | #3 |
Участник
|
Нет!
Ошибка: Локальная конечная точка DIT не существует Последний раз редактировалось Sergikrus; 25.04.2011 в 08:13. |
|
25.04.2011, 09:49 | #4 |
Участник
|
Какие у тебя настройки в форме Конечные точки?
Должно быть так: Путь: Основное/Настройка/AIF/Конечные точки. • Процедура - входящее перемещение o Конечная точка является источником o Локальная конечная точка является назначением • Процедура - исходящее перемещение o Конечная точка является назначением o Локальная конечная точка является источником Действия: • Задать конечную точку (Код, Имя) • Выбрать локальную конечную точку • Определить политику действий для выбранной конечной точки |
|
25.04.2011, 10:47 | #5 |
Участник
|
Помоему всё так как вы сказали, но наверно опишу подробнее как есть у меня.
Настройки AIF в AX 2009 №1 (Выгрузка номенклатуры): 1. Локальные конечные точки: 2. Адаптеры транспортировки: 3. Каналы: 4. Конечные точки: Политика действий конечной точки: Ну и отметил галками какие поля выгрузать, отметил все. Выгрузка: 1. На форме "Номенклатура", жму "Отправка по эл.почте" 2. Выбираю 1 номенклатуру, жму "Ок" 3. выполняю Job: X++: static void AifOutboundProcessing(Args _args) { AifOutboundProcessingService outbound = new AifOutboundProcessingService(); AifGatewaySendService send = new AifGatewaySendService(); ; outbound.run(); send.run(); } Настройки AIF в AX 2009 №2 (Импорт номенклатуры): 1. Локальные конечные точки: 2. Адаптеры транспортировки: 3. Каналы: 4. Конечные точки: Политика действий конечной точки: Отметил галками все поля, так как выгружал тоже все. Импорт: 1. Выполнил Job: X++: static void AifInboundProcessing(Args _args) { AifInboundProcessingService inbound = new AifInboundProcessingService(); AifGatewayReceiveService send = new AifGatewayReceiveService(); ; send.run(); inbound.run(); } Локальная конечная точка DIT не существует. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
25.04.2011, 11:17 | #6 |
Участник
|
В каждой установке вам нужно создать по две конечные точки - одна ссылается на локальную точку (т.е. сама система), а вторая - это конечная точка, соответствующая другой установке AX. Например так:
1. AX1: 1.1. Локальная точка DAT. 1.2. Конечная точка AX1 со ссылкой на DAT. 1.3. Конечная точка AX2. 2. AX2: 2.1. Локальная точка DAT. 2.2. Конечная точка AX2 со ссылкой на DAT. 2.3. Конечная точка AX1. В итоге при экспорте вы делается отправку в AX2. А при импорте вы делаете приемку от AX1.
__________________
Ivanhoe as is.. |
|
25.04.2011, 11:17 | #7 |
Участник
|
Хм...В политике действий вы используете только InventItemService.create?
Попробуйте еще использовать InventItemService.read при экспорте. а также задать "перекрытие внешенего кода": http://schemas.microsoft.com/InventItemService.create Здесь играет роль только постфикс create. Выглядит странновато, но мне помогало. |
|
25.04.2011, 11:20 | #8 |
Участник
|
"Не долго думая, я пересоздал конечную точку в AX 2009 №2 и обозвал её именно DIT , конечно же я не рассчитывал что это поможет."
Да, конечно, нужно задать по 2 конечные точки. Спасибо, Invanhoe - недоглядел. |
|
25.04.2011, 12:09 | #9 |
Участник
|
Я свое сообщение по ошибке удалил
__________________
Ivanhoe as is.. |
|
25.04.2011, 13:41 | #10 |
Участник
|
Повтори пожалуйста, я его не успел прочитать
Последний раз редактировалось Sergikrus; 25.04.2011 в 14:17. |
|
25.04.2011, 17:05 | #11 |
Участник
|
Примерный ответ Ivanhoe звучал так:
Для каждой Инсталляции AX нужно создать по 2 локальные конечные точки: Out, In соответственно при экспорте из 1 инсталляции форма конечных точек Будет как на Рис.Out При импорте в инсталляции 2 форма конечных точек будет как на Рис. In. |
|
|
За это сообщение автора поблагодарили: Sergikrus (1). |
25.04.2011, 17:45 | #12 |
Модератор
|
|
|
26.04.2011, 08:28 | #13 |
Участник
|
Предыдущие советы вроде бы помогли, но сейчас возникает новое исключение :
Сервиса с пространством имен = "http://schemas.microsoft.com/dynamics/2008/01/services" и внешним именем = "InventItemService не существует. Служба такая включена. Что ещё мне нужно проверить, как найти причину данной ошибки? Последний раз редактировалось Sergikrus; 26.04.2011 в 08:53. |
|
26.04.2011, 10:03 | #14 |
Участник
|
А вы привели текст ошибки полностью? Дело в том, что, допустим, кто-то настроил AIF правильно - он и не будет знать что такие ошибки бывают А по тексту ошибки хотя бы можно попробовать найти место в системе, где она выдается, и понять по контексту, чего же не хватает.
__________________
Ivanhoe as is.. |
|
26.04.2011, 10:40 | #15 |
Участник
|
Дело в том, что AIF файл то сжирает,а в Диспетчере очередей помещает запись об ошибке ("пространство имен...") со ссылкой на журнал исключений.
Как вариант - попробуйте создать свои классы с помощью мастера. |
|
27.04.2011, 13:29 | #16 |
Участник
|
Значит так :
1) Ошибка: Сервиса с пространством имен = "http://schemas.microsoft.com/dynamics/2008/01/services" и внешним именем = "InventItemService не существует. Причина: в таблице AifService по критерию: X++: select firstonly * from aifService where aifService.ExternalName == 'InventItemService' && aifService.Namespace == 'http://schemas.microsoft.com/dynamics/2008/01/services'; Решение: Значение атрибута ExternalName в таблице AifService привёл к значению InventItemService вместо ItemService 2) Ошибка: Пользователь не авторизован для этой конечной точки. Причина: так надо Класс: AifRequestProcessor X++: // Verifies that the current user has access to the service operation static private void verifyRequestIsAllowed(AifMessage message) { // #48319 - the sourceEndpointUser should always be equal to the currently logged in user. if(!isValidUser || ( message.sourceEndpointAxUserId() != curuserid())) //User is not authorized for this Endpoint. throw error(strfmt('SYS89826')); } Добавил пользователя к конечной точке: 3) Ошибка: Политика действий конечной точки не существует. Причина: Из 1 Ошибки видно, что имя запрашиваемого сервиса было ItemService вместо InventItemService, то соответственно и Действия называются ItemService.find вместо InventItemService.find Решение: Привел значения атрибута Name таблицы AifAction в соответствие к требуемым, тоесть вместо ItemService.find написал InventItemService.find и так далее. |
|
27.04.2011, 13:39 | #17 |
Участник
|
Теперь мне не понятно как в выгружаемом xml документе:
X++: <?xml version="1.0" encoding="UTF-8" ?> <Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message"> <Header> <MessageId>{03BC7142-4A2F-47BA-B9C5-0A748C3A97FA}</MessageId> <SourceEndpoint>In</SourceEndpoint> <DestinationEndpoint>Out</DestinationEndpoint> <Action>http://schemas.microsoft.com/dynamics/2008/01/services/InventItemService/find</Action> </Header> выгружать, со значением: <Action>http://schemas.microsoft.com/dynamics/2008/01/services/InventItemService/create</Action> так как, в AX 2009 №2 требуется импортировать выгруженую номенклатуру и требуется имено InventItemService/create И соответственно получаю следущую ошибку: Элемент "QueryCriteria" с пространством имен "http://schemas.microsoft.com/dynamic.../QueryCriteria" не найден. Строка 1, позиция 2. Причина: InventItemService/find требует в загаловке первый элемент QueryCriteria Решение: Подскажите пожалуйста решение |
|
28.04.2011, 07:43 | #18 |
Участник
|
Решение найдено:
Прекрыл find в AX 2009 №1 (где выгружаем номенклатуру) вот этой строкой: <Action>http://schemas.microsoft.com/dynamics/2008/01/services/InventItemService/create</Action> |
|
28.04.2011, 09:42 | #19 |
Участник
|
Всё вроде как работает, документ перемещается между двумя системами, но я наткнулся на удивительное по моему мнению исключение:
Получается, что я должен настроеть Номерную серию, но при этом смысл импорта теряется напрочь, какой смысл импортированой номенклатуры, если они будет иметь отличные значения от выгружаемых номенклатур. Помогите разобраться с этим исключением, существуют ли способы обхода? P.S. Конечно можно переписать проверку на номерную серию, но хочеться всё настроить с минимальной правкой кода. Последний раз редактировалось Sergikrus; 28.04.2011 в 10:04. |
|
28.04.2011, 10:17 | #20 |
Участник
|
По поводу перекрытия внешнего кода писал раньше.
Ругается на номерную серию именно из-за несоответствия форматов - они-то как раз должны быть одинаковыми. Единственное что меня смущает - это поле Следующий (NumberSequenceTable.Next) оно не обновится при импорте номенклатуры. Т.е. возможна ситуация, когда при импорте номенклатуры с ItemId = 000005 при текущем значении NumberSequenceTable.Next == ItemId, при создании номенклатуры в импортирующей базе будет вылезать ошибка = "...запись уже существует". Это будет продолжаться до тех пор, пока NumberSequenceTable.Next не станет больше ItemId - что, однако, произойдет при следующей попытке создания номенклатуры. Впринципе это не критично, но об этом не стоит забывать. |
|
Теги |
aif, ax2009, как правильно, настройка |
|
|