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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.01.2012, 12:33   #1  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
AX 2012 Создание сервиса по шагам
Выделено из AX2012: сервисы и чудеса системного метода DictMethod.parameterCnt()

Я тоже тут столкнулся с граблями. Мануал написан не очень корректно.
Но я дошел до конца и получил рабочий пример.
Суть: Есть класс, публикуемый как сервис. В данном примере - это AddressUtility.
Есть класс, который является типом возвращаемого значения одного из методов публикуемого класса. В данном примере - это AddressFinder.

Идея данного примера: Из Visual Studio (внешнего приложения) идет запрос к АХ (т.е. АХ получает некоторые входящие данные, о которых в данном примере почему-то не упоминается).
Затем АХ как-то должна вернуть эти данные. Так вот, АХ инициализирует тут класс AddressFinder и в него "напихивает" данные (аналогично оператору Struct в С++ / классу Struct в Х++).

За количество параметров отвечает "волшебная" фраза [DataMemberAttribute] перед началом метода. Это класс в Х++. Я так понимаю - что именно оттуда тянется "лишний" параметр.
UPD: Зачеркнул некорректную фразу.
Однако, стоит заметить, что выражение, указываемое в квадратных скобках действительно является классом в Х++.

Соответственно, как было бы правильно написать в мануале:
0. Задача: Получить по коду клиента его имя (в связи с тем, что поле CustTable.Name теперь "уехало" в DirPartyTable и чтобы получить имя клиента - теперь нужно сделать джойн CustTable и DirPartyTable).
1. Создаем класс Tutorial_ServiceData, который будет состоять из двух переменных с их parm-методами:
X++:
[DataContractAttribute]
class Tutorial_ServiceData
{
    CustName    custName;
    CustAccount custAccount;
}
[DataMemberAttribute]
public CustAccount parmCustAccount(CustAccount _custAccount = custAccount)
{
    custAccount = _custAccount;

    return custAccount;
}
[DataMemberAttribute]
public CustName parmCustName(CustName _custName = custName)
{
    custName = _custName;
    return custName;
}
2. Создаем класс Tutorial_Service и его метод getCustData(), который будет публиковаться как сервис. В методе getCustData() над методом помимо класса SysEntryPointAttribute, который добавляет нам один аргумент (что-то типа Args у main()), нужно с помощью класса AifCollectionTypeAttribute перечислить все дополнительные входящие параметры, по аналогии, как я указал.
X++:
class Tutorial_Service
{
}
[SysEntryPointAttribute,
AifCollectionTypeAttribute('_custAccount', Types::String, extendedtypestr(CustAccount))]
public Tutorial_ServiceData getCustData(CustAccount _custAccount)
{
    Tutorial_ServiceData tutorial_ServiceData;
    CustTable            custTable;
    ;
    custTable = CustTable::find(_custAccount);
    tutorial_ServiceData = new Tutorial_ServiceData();
    tutorial_ServiceData.parmCustAccount(custTable.AccountNum);
    tutorial_ServiceData.parmCustName(custTable.name());

    return tutorial_ServiceData;
}
3. Создаем сервис Tutorial_Service (в свойствах указываем класс Tutorial_Service и добавляем подчиненный узел, где указываем метод getCustData) и группу сервисов Tutorial_ServiceGroup (в нее добавляем только что созданный сервис Tutorial_Service)
Название: Service.PNG
Просмотров: 4190

Размер: 16.1 Кб
У сервиса нужно указать ExternalName - его название "снаружи". В моем случае - это Tutorial_LabService
4. Публикуем группу сервисов Tutorial_ServiceGroup (щелкаем правой кнопкой мыши по группе и выбираем пункт Deploy Service Group). По сути - это и есть процедура генерации CIL. Теперь наш сервис доступен по пути _http://localhost:8101/DynamicsAx/Services/Tutorial_ServiceGroup (это если порт "Services WDSL" в настройках АОСа указан 8101).
5. В проект Visual Studio (я создавал новый - типа консольное приложение) добавляем ссылку на нашу группу сервисов. В узел Service References добавляем новую ссылку и указываем что наша группа сервисов будет внутри консольного приложения называться Tutorial_Reference:
Нажмите на изображение для увеличения
Название: ServiceREf.PNG
Просмотров: 459
Размер:	33.0 Кб
ID:	7498
6. По добавленной ссылке в проекте кликаем правой кнопкой мыши и смотрим ее в Object Browser:
Название: ObjBrowser.PNG
Просмотров: 3482

Размер: 24.0 Кб
7. Пишем в Visual Studio следующий код (здесь идет обращение к нашему сервису уже по External Name):
PHP код:
namespace ConsoleApplication1
{
    class 
Program
    
{
        static 
void Main(string[] args)
        {
            
Tutorial_Reference.Tutorial_LabServiceClient labService;
            
Tutorial_Reference.Tutorial_ServiceData  labData;

            
labService = new Tutorial_Reference.Tutorial_LabServiceClient();

            
labData labService.getCustData(null"1101");
            
Console.WriteLine(labData.parmCustAccount);
            
Console.WriteLine(labData.parmCustName);

            
labData labService.getCustData(null"1102");
            
Console.WriteLine(labData.parmCustAccount);
            
Console.WriteLine(labData.parmCustName);

            
Console.ReadLine();
        }
    }

8. Запускаем сей код на исполнение. Видим, что в переменной labData лежат те данные, которые туда положила АХ.

Небольшая подстава тут с суффиксом Client у переменной сервиса - с ходу не догадаешься.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 24.01.2012 в 18:12.
За это сообщение автора поблагодарили: mazzy (5), Logger (25), lev (13), AvrDen (1), MikeR (3), gl00mie (10), wojzeh (2), greench (1), kornix (1), AP-1055D (1),  (1).
Старый 24.01.2012, 16:54   #2  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
мегапример! думаю, всем пригодится. приеду на работу -- проверю.

пока могу точно сказать, что твоё предположение о том, что:

"За количество параметров отвечает "волшебная" фраза [DataMemberAttribute] перед началом метода. Это класс в Х++. Я так понимаю - что именно оттуда тянется "лишний" параметр."

неверно, если мы всё ещё говорим о DictMethod.ParamCnt().

после того, как я просто немного поменял имя "невалидного" метода, всё пошло без проблем.

подозреваю, что где-то в глубинах мироздания что-то вроде кеша мешает жить спокойно. (очистка стандартными SysFlush* на клиенте и сервере ничего не дала)
__________________
Felix nihil admirari
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 24.01.2012, 18:03   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от wojzeh Посмотреть сообщение
"За количество параметров отвечает "волшебная" фраза [DataMemberAttribute] перед началом метода. Это класс в Х++. Я так понимаю - что именно оттуда тянется "лишний" параметр."

неверно, если мы всё ещё говорим о DictMethod.ParamCnt().
Виноват. Спутал с SysEntryPointAttribute. Спасибо за замечание. Откорректировал исходный пост, чтобы не вводить в заблуждение последующих читателей.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 24.01.2012 в 18:13.
Старый 24.01.2012, 23:01   #4  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
а вот такой вопрос о мастере создания сервисов: нужно ли городить весь огород с генерацией на базе запроса всех этих классов, чтобы, например, просто изменить значения в той же таблице inventTable? (client.read(), client.update())
__________________
Felix nihil admirari
Старый 25.01.2012, 00:08   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от wojzeh Посмотреть сообщение
а вот такой вопрос о мастере создания сервисов: нужно ли городить весь огород с генерацией на базе запроса всех этих классов, чтобы, например, просто изменить значения в той же таблице inventTable? (client.read(), client.update())
Ну... ответ на вопрос зависит от ситуации. Ради разовой работы не стоит. Ради периодической - тут нужно смотреть. По-хорошему - без сервисов можно обойтись. Применительно к обновлению InventTable. С другой стороны - если мы хотим быть уверенным, что при изменении поля отрабатывала бы бизнес-логика, написанная в одном месте (в АХ), то нам надо вызвать метод, который в свою очередь вызовет эту бизнес-логику.
Т.е. для ситуации, когда интегрируются 2 системы в онлайн-режиме и инициатором интеграции является не АХ - то вариант сервисов - пожалуй будет наиболее удобен, нежели какие-либо другие варианты (опять-таки - тут вопрос авторизации и т.д.).
К примеру, интеграция АХ (2009) с Lotus в онлайн режиме - в моем случае после перебора всех возможных вариантов - свелась к единственному варианту - через веб-сервис. Ибо иные варианты не работали по тем или иным причинам.
__________________
Возможно сделать все. Вопрос времени
Старый 25.01.2012, 01:29   #6  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
да, у меня как раз такой случай, когда внешняя система хочет менять и создавать записи в таблице EcoResProduct, InventTable etc, и понятно, что веб-сервис в таком случае будет вполне уместен, но мой вопрос был о том, что стоит ли использовать визард для создания всех этих артефактов или проще руками всё нарисовать?
__________________
Felix nihil admirari
Старый 25.01.2012, 01:53   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от wojzeh Посмотреть сообщение
да, у меня как раз такой случай, когда внешняя система хочет менять и создавать записи в таблице EcoResProduct, InventTable etc, и понятно, что веб-сервис в таком случае будет вполне уместен, но мой вопрос был о том, что стоит ли использовать визард для создания всех этих артефактов или проще руками всё нарисовать?
Аа... Ну я-то обычно предпочитаю всегда все ручками делать. Хотя на определенном уровне (например, добавление финаналитик в АХ 4 / 2009) мастера помогают.
__________________
Возможно сделать все. Вопрос времени
Старый 14.11.2012, 12:44   #8  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
упп
Немного приподниму тему

DAX2012. Возникла идея добавить на корпоративный сайт формочку создания клиента. Ну т.е. сайн открывают, вбивают название и адрес клиента, нажимают "Подтвердить" - и в Аксапте генерится новый клиент (я упрощаю, конечно, но общий смысл такой).
Для этой цели был создан и успешно развёрнут сервис. Т.е. я дошёл до п.5. А вот что делать дальше? Как с веб-страницы запустить этот сервис, да ещё и с параметрами?

Возможно, вопрос глупый, но я никогда раньше веб-разработкой не занимался. Подскажите, плз.
__________________
С уважением,
Вячеслав
Старый 15.11.2012, 10:03   #9  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Если эта веб страница создана в VS, то надо добавить в проект ссылку на сервис, также как вы добавляете ссылки на другие сборки.
Старый 15.11.2012, 13:14   #10  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
а если на php?
__________________
С уважением,
Вячеслав
Старый 15.11.2012, 13:37   #11  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Не то?
PHP код:
require_once('SOAP/Client.php'); $wsdl = new SOAP_WSDL(‘http://ktdms/ktwebservice/webservice.php?wsdl’); $soapclient = $wsdl->getProxy(); $soapclient->setOpt('timeout', 30); // 30 seconds $kt_response = $soapclient->login(‘admin’,’123’,’1.1.1.1’); $session = $kt_response->message; $root = $soapclient->get_folder_detail($session, 1); 
Думаю если поискать в интернетах, то можно найти как приклеить сервис к вашей странице. В любом случае ссылка на сервис у Вас должна быть.
Старый 15.11.2012, 15:08   #12  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
спс за помощь. ссылка на сервис, конечно, есть
код попробую обязательно. сразу хочу уточнить - какая его часть параметризует вызов?

P.S. блин, как тяжело смотреть на незнакомый язык программирования...
__________________
С уважением,
Вячеслав
Старый 15.11.2012, 15:34   #13  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Цитата:
Сообщение от pitersky Посмотреть сообщение
какая его часть параметризует вызов?
В этом примере - никакая.

Вот здесь посмотрите, может быть и найдете что вам нужно.
Старый 25.08.2021, 11:56   #14  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Пункт 4.
У сервиса нужно указать ExternalName - его название "снаружи". В моем случае - это Tutorial_LabService
Проблема у меня в файле ХМL есть строка
<Action>http://tempuri.org/ExportSalesForecastService/read</Action>
Пространство имен + Сервис + Метод
Так вот интересует именно то что указан метод read хотя в этом сервисе нет этого метода. Там метод create, в ах 2009 есть настройка внешний код там указывается сервис и метод. Подскажите где эта настройка в ах 2012? В таблице AifAction есть запись там есть поле ExternalAction в нем указан метод read.
Старый 25.08.2021, 17:36   #15  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Nick42 Посмотреть сообщение
Пункт 4.
У сервиса нужно указать ExternalName - его название "снаружи". В моем случае - это Tutorial_LabService
Проблема у меня в файле ХМL есть строка
<Action>http://tempuri.org/ExportSalesForecastService/read</Action>
Пространство имен + Сервис + Метод
Так вот интересует именно то что указан метод read хотя в этом сервисе нет этого метода. Там метод create, в ах 2009 есть настройка внешний код там указывается сервис и метод. Подскажите где эта настройка в ах 2012? В таблице AifAction есть запись там есть поле ExternalAction в нем указан метод read.
Если речь идет про Document Service, то может попробовать обновить Вашу службу?
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 49
Размер:	36.2 Кб
ID:	13218
__________________
Возможно сделать все. Вопрос времени
Старый 26.08.2021, 11:54   #16  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Извиняюсь не проверил что написал а написал что попало(.
Речь идет о внешнем сервисе который указывается в свойствах сервиса поле ExternalName.
Так вот указываю имя сервиса который должен принять XML. Обновляю сервис появляется запись в таблице AifAction и в ней поле есть внешний код (ExternalAction) туда попадает значение Read. А из таблицы AifService берется значение сервиса AifService.Name и AifService.Namespase.
так собирается в ХМЛ строка ниже.
<Action>http://tempuri.org/ExportSalesForecastService/read</Action>
В ней записан сервис базы с которого идет отправка XML и метод его а мне нужен тот сервис что я указал в поле ExternalName и его метод.
Вопрос есть ли настройки этого или я их найти не могу?

Последний раз редактировалось Nick42; 26.08.2021 в 12:13.
Старый 26.08.2021, 12:26   #17  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Далее нашел в классе AifMessage метод initializeOperationContext в нем исправил(пока не знаю правильно или нет) код. Класс на sys слое изменил сервис на service.ExternalName и изменил поле в таблице AifAction.ExternalAction на create было read. но тут проблема после обновления сервиса в Регистрациях услуг поле это опять становится read.
После этих действий в ХМЛ вышла правильная строка которая мне нужна.
Изображения
 
Теги
aif, ax2012, dictmethod, web сервис, webservice, законченный пример

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: New Content for Microsoft Dynamics AX 2012 : October 2011 Blog bot DAX Blogs 0 27.10.2011 17:11
dynamics-ax: Interview with Microsoft's Lachlan Cash on his new role, AX 2012 and more Blog bot DAX Blogs 6 22.04.2011 14:55
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
daxdilip: Whats New in Dynamics AX 2012 (A brief extract from the recently held Tech Conf.) Blog bot DAX Blogs 7 31.01.2011 12:35
dynamics-ax: Modeling the world, with Microsoft Dynamics AX 2012 Blog bot DAX Blogs 0 25.01.2011 09:11

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

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

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