AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.12.2012, 21:56   #1  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Опыт: синхронизация справочников через AIF в AX2012
Поделюсь опытом: задача синхронизации справочников поставщиков и клиентов через AIF (в моем случае - из AX 4.0 в AX 2012) ... в общем случае не решается без интерактивной работы и адаптации ведущей программы (CRM итд.) к ведомой (AX2012). Кое-чего, однако, можно добиться с минимумом программирования.

Пусть ведущая система (здесь: AX 4.0) ничего не знает о ведомой. Сразу возникает вопрос: когда новая запись в справочнике достигает той степени полноты, чтобы передать его в ведомую систему? В худшем случае над записью работает несколько отделов. Можно запускать пересылку в конце рабочего дня, можно проверять заполнение обязательных полей.

Так или иначе, ведущая система дает толчок и размещает файл с клиентом/поставщиков в заданном каталоге сети. Для этого в AX 4.0 есть классический код из \Data Dictionary\Tables\CustInvoiceJour\Methods\sendElectronically(). Учетная запись процесса, записывающего файл, должна быть именованной и быть Owner-ом файла: http://msdn.microsoft.com/en-us/libr...=ax.10%29.aspx

В AX2012 создается входящий порт, который читает каталог и передает файл сервису CustCustomerService.create, CustCustomerService.update. В параметрах порта добавляем в Pipeline входящее преобразование XSLT к схеме AX2012 (см. ниже).

Создается batch job, в котором вручную (!) прописываются классические 2 процесса для чтения:
- AifGatewayReceiveService
- AifInboundProcessingService

Запускаем batch job, и после 100 проб и ошибок получаем первую запись.
Характерно, что можно создать CustTable, DirPartyTable и все до единой связанные таблицы, даже стандартную аналитику. Ключевое слово здесь - это "создать".

Вслепую обновить удастся только саму CustTable, поскольку AX2012 требует <EntityKeys> того, что надо обновлять. В качестве этих Keys можно взять Primary Key или RecId таблицы. Если для CustTable есть натуральный ключ AccountNum, то для DirPartyTable есть только PartyId = RecId, который внешней программе не известен без дополнительного запроса getKeys и целой программной машинерии для обработки этого запроса. Впрочем, и без этого есть пара подводных камней:

1) При запросе на обновление система требует текущую RecVersion записи или Hash записи, который опять-таки надо получать интерактивным запросом. Тем самым система пытается предотвратить конкурентные обновления. Можно вырвать системе ядовитые зубы, закомментировав все проверки на Hash в классе AxdBaseUpdate.

2) Для обновления AX требует дату и время документа в элементе <ValidAsOfDateTime>. Если ведущая система такой информации не дает, то приходится извращаться, ибо .NET не поддерживает стандарт XSL/XPath 2.0 и, в частности, такую функцию как fn:current-DateTime()

3) Если в атрибуте action не указать "update", чтобы ввести систему в режим "инкрементного обновления", то AX2012 попытается стереть связанные таблицы типа DirPartyTable. Т.е. в XML файле должно стоять <CustTable class="entity" action="update">

А теперь привожу плод бессонных ночей - трансформацию XSLT, которая преобразует "плоскую" запись в формат AX2012, включая адреса и телефоны. Это преобразование реагирует на сигнал <DocPurpose>Duplicate</DocPurpose> и переходит из режима полного create в частичный update:

CustTable_AX40_to_AX2012.zip

Последний раз редактировалось EVGL; 03.12.2012 в 22:21.
За это сообщение автора поблагодарили: Ruff (5), belugin (10).
Старый 04.12.2012, 07:04   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Очень интересно и познавательно, но где же обещанный плод бессонных ночей?

PS. Вообще, когда возникает идея из одной системы обновлять данные другой так, чтобы система-публикатор про систему-подписчика не знала, на ум приходит идея информационной шины данных. Впрочем, ее реализация может оказаться более трудоемкой, нежели написание хитровывернутой трансформации XSLT, но чудес ведь не бывает...

Последний раз редактировалось gl00mie; 04.12.2012 в 07:20.
Старый 04.12.2012, 11:06   #3  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от gl00mie Посмотреть сообщение
...на ум приходит идея информационной шины данных.
Всегда интересовало - что под этим понимают? Но примеров реализации почему-то нигде не видел и не читал ;-(
__________________
Axapta 3.0 sp - хз какой, kr2
Старый 04.12.2012, 11:30   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от egorych Посмотреть сообщение
Всегда интересовало - что под этим понимают? Но примеров реализации почему-то нигде не видел и не читал ;-(
Это абстракция. Реализовать которую можно различными способами. Самый простой - это наверное через файловую систему.
Идею gl00mie уже изложил. Как интегрировать Систему1 и Систему2, так чтобы они друг о друге не знали? Нужно взять Систему3 и интегрировать с ней обе наши Системы 1 и 2. Система3 в таком случае и будет выполнять роль шины данных.
Старый 04.12.2012, 11:51   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Это абстракция. Реализовать которую можно различными способами. Самый простой - это наверное через файловую систему.
Идею gl00mie уже изложил. Как интегрировать Систему1 и Систему2, так чтобы они друг о друге не знали? Нужно взять Систему3 и интегрировать с ней обе наши Системы 1 и 2. Система3 в таком случае и будет выполнять роль шины данных.
и такие системы (Система3), действительно есть и внедряются. причем они поддерживают множество интерфейсов передачи данных (запросы в базу, веб-сервисы, передачи файлов и др)

Последний раз редактировалось ice; 04.12.2012 в 11:55.
Старый 05.12.2012, 09:30   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от egorych Посмотреть сообщение
Всегда интересовало - что под этим понимают? Но примеров реализации почему-то нигде не видел и не читал ;-(
Есть BizTalk (дорогой собака), есть open source системы..
__________________
-ТСЯ или -ТЬСЯ ?
Старый 14.12.2012, 19:19   #7  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Мне удалось малой кровью запрограммировать "слепое" обновление имени и адреса клиента/поставщика:
DirParty@action = update
DirPartyPostalAddressView@action = create

\Classes\AxDirPartyTable\parmName
X++:
public DirPartyName parmName(DirPartyName _name = '')
{
    DirPartyTable   itself;
    AxVendTable     axVendTable;

    if (!prmisDefault(_name))
    {
        this.setField(fieldNum(DirPartyTable, Name), _name);

        // BEGIN
        if (_name && parentAxBc && parentAxBc.recordAction() == AxdRecordAction::Update)
        {
            switch (classIdGet(parentAxBc))
            {
                case classNum(AxCustTable):
                    itself = parentAxBc.currentRecord().dirPartyTable_FK();
                    break;
                case classNum(AxVendTable):
                    axVendTable = parentAxBc;
                    itself = DirPartyTable::findRec(axVendTable.parmParty());
                    break;
            }
            if (itself)
            {
                this.parmRecId(itself.RecId);
            }
        }
        // END    
    }

    return dirPartyTable.Name;
}
\Classes\AxDirPartyPostalAddressView\parmIsPrimary
X++:
public LogisticsIsPrimaryAddress parmIsPrimary(LogisticsIsPrimaryAddress _isPrimary = NoYes::No)
{
    LogisticsPostalAddress  itself;

    if (!prmisdefault(_isPrimary))
    {
        this.setField(fieldnum(DirPartyPostalAddressView, IsPrimary), _isPrimary);

        // BEGIN
        if (_isPrimary && parentAxBc && parentAxBc.parentAxBC() && parentAxBc.parentAxBC().recordAction() == AxdRecordAction::Update)
        {
            switch (classIdGet(parentAxBc.parentAxBC()))
            {
                case classNum(AxCustTable):
                case classNum(AxVendTable):
                    itself = parentAxBc.parentAxBC().currentRecord().postalAddress();
                    break;
            }
            if (itself)
            {
                itself = LogisticsPostalAddress::findRecId(itself.RecId, true, itself.ValidFrom, itself.ValidTo);
                itself.delete();
            }
        }
        // END
    }

    return dirPartyPostalAddressView.IsPrimary;
}

Последний раз редактировалось EVGL; 14.12.2012 в 20:26.
За это сообщение автора поблагодарили: gl00mie (1).
Старый 04.12.2012, 22:07   #8  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Очень интересно и познавательно, но где же обещанный плод бессонных ночей?
Так приложил же ZIP-файл?
Старый 05.12.2012, 09:21   #9  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от EVGL Посмотреть сообщение
В AX2012 создается входящий порт, который читает каталог
На всякий случай - у файлового адаптера в четверке есть забавная фича. Он при генерации файла в качестве его имени использует GUID (кажется, MessageId). Если принимающая сторона сканирует каталог используя findFirst()..findnext(), есть неплохая вероятность того что для одной и той же сущности изменения будут накатываться в произвольном порядке, например:

- поменяли примечание
- заблокировали клиента

накатилось как
- заблокировали клиента
- поменяли примечание (и разблокировали клиента)



В качестве workaround-а добавляли timestamp в начало имени файла

P.S. В 2012 это похоже пофиксили
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: gl00mie (5).
Старый 10.01.2013, 15:30   #10  
dalyet is offline
dalyet
Moderator
Аватар для dalyet
Дети Юза
 
143 / 17 (1) ++
Регистрация: 14.03.2002
Адрес: Киев
Прошу прощения, если пропустил такую информацию. Но вопрос -
есть ли возможность сгенерированный AIF в 2012 xml файл назвать по своему (например CustTable*)?
Старый 10.01.2013, 16:06   #11  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
В стандарте - нет.
Старый 28.08.2020, 08:12   #12  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
У нас в AX 4.0 появилось требование воскресить работу по превращению данных из накладной в XML-файл посредством кнопки Send XML > Original/Copy. Проблема в том, что AIF мы нигде ни разу не использовали. Поэтому вопрос такой: как настроить механизмы AIF именно для работы данной функциональности? Речь идет о простом сохранении в shared-папку, из которой файл будет извлекаться другой системой (EDI). Видимо надо прописать некие Действия (Actions) и Конечные точки (EndPoints) и скорее всего еще что-то. Поделитесь, у кого есть данный опыт?
__________________
// no comments

Последний раз редактировалось dech; 28.08.2020 в 09:12.
Старый 28.08.2020, 13:22   #13  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Поиском по AIF в принципе много чего находиться должно. Например, вот это
__________________
-ТСЯ или -ТЬСЯ ?
Старый 28.08.2020, 17:52   #14  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от dech Посмотреть сообщение
...Поэтому вопрос такой: как настроить механизмы AIF именно для работы данной функциональности?
Как-то отдельно именно для отсылки электронной накладной в общем-то никак. В любом случае придется полноценно настраивать AIF "как по книжке", даже если нужно использовать только эту возможность.
Старый 28.08.2020, 14:08   #15  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Для 4-ки как-то сложно уже искать. Даже MSDN отказался поддерживать документацию ниже 2012. Нашел такую весчь: https://ellipsesolutions.com/microso...oice-journals/
Довольно подробно, правда для 2009, но с 4-кой много общего, вполне подойдет.
__________________
// no comments
Теги
aif, ax2012

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX2012 AIF services error - The maximum number of joins allowed (99) is exceeded in the statement. Blog bot DAX Blogs 1 03.07.2012 08:13
Был ли у вас практический опыт интеграции AX c Biztalk через AIF IKA DAX: Программирование 2 03.02.2011 11:20
daxdilip: How to: Configure Dynamics AX AIF Services to listen for SSL Requests (https) Blog bot DAX Blogs 0 23.01.2011 10:12
Dianne Siebold: AIF Top Ten Blog bot DAX Blogs 1 22.04.2008 11:19
Синхронизация справочников Bars DAX: Программирование 5 05.05.2005 00:12

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:25.