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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.12.2011, 11:23   #1  
Deza is offline
Deza
Участник
 
28 / 10 (1) +
Регистрация: 21.06.2010
! .NET Business Connector for Dynamics AX и C#
Версия AX 4.0

появилась необходимость использовать .NET Business Connector for Dynamics AX
Использовать простой select не вариант. так как должен быть метод (в AX) который принимает SID пользователя и выдает таблицу.
И появился следующий вопрос, возможно ли передать из AX уже сформированную таблицу (dataset) или что то наподобие, что б в C# можно было принять набор данных, а не единичную запись.
Подскажите где почитать или посмотреть пример.

Последний раз редактировалось Deza; 26.12.2011 в 11:36.
Старый 26.12.2011, 11:29   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я знаю только способ с построчным перебором через axRecord.Next()
http://msdn.microsoft.com/en-us/libr...(v=AX.10).aspx

Если принципиально перебор требуется оставить на стороне аксапты и в Net отправлять уже все строки скопом, то тогда наверное (гипотетически) можно пробовать формировать структуру ADO или даже XML средствами аксапты и затем уже её пресылать

Последний раз редактировалось S.Kuskov; 26.12.2011 в 11:35.
Старый 26.12.2011, 11:35   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
В AX2009 в справке разработчика работе с .Net Business Connector посвящен целый раздел.
Конечно там все на английском, но думаю при желании необходимую инфу можно от туда выцепить.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 26.12.2011, 11:36   #5  
Deza is offline
Deza
Участник
 
28 / 10 (1) +
Регистрация: 21.06.2010
jonny, S.Kuskov
проще тогда уже на прямую с Сиклом работать,
хотелось бы, что б вся выборка делалась в Аксапте, а она уже возвращала готовый набор данных
Старый 26.12.2011, 11:37   #6  
Deza is offline
Deza
Участник
 
28 / 10 (1) +
Регистрация: 21.06.2010
Цитата:
Сообщение от lev Посмотреть сообщение
В AX2009 в справке разработчика работе с .Net Business Connector посвящен целый раздел.
Конечно там все на английском, но думаю при желании необходимую инфу можно от туда выцепить.
забыл указать, аксапта 4
Старый 26.12.2011, 11:40   #7  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Deza Посмотреть сообщение
появилась необходимость использовать .NET Business Connector for Dynamics AX
Использовать простой select не вариант. так как должен быть метод (в AX) который принимает SID пользователя и выдает таблицу.
И появился следующий вопрос, возможно ли передать из AX уже сформированную таблицу (dataset) или что то наподобие, что б в C# можно было принять набор данных, а не единичную запись.
Подскажите где почитать или посмотреть пример.
Если немного отвлечься от работы .NET Business Connector, и поговорить о решении задачи, я пошел бы немного другим путем.
1. Создал бы отдельно новую базу (если такой нету) с нужной табличкой для внешнего приложения.
2. В аксапте написал бы класс по заполнению этой таблицы нужной информацией. По результатам работы класс возвращал бы значения true или false, в зависимости от успешности выполнения.
3. Во внешнем приложении вызывал бы аксаптовский класс, и если он вернул true, то спокойно уже использовал заполненную табличку (о которой написал в 1-м пункте) для своих нужд.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 26.12.2011, 11:46   #8  
Deza is offline
Deza
Участник
 
28 / 10 (1) +
Регистрация: 21.06.2010
Цитата:
Сообщение от lev Посмотреть сообщение
Если немного отвлечься от работы .NET Business Connector, и поговорить о решении задачи, я пошел бы немного другим путем.
1. Создал бы отдельно новую базу (если такой нету) с нужной табличкой для внешнего приложения.
2. В аксапте написал бы класс по заполнению этой таблицы нужной информацией. По результатам работы класс возвращал бы значения true или false, в зависимости от успешности выполнения.
3. Во внешнем приложении вызывал бы аксаптовский класс, и если он вернул true, то спокойно уже использовал заполненную табличку (о которой написал в 1-м пункте) для своих нужд.
не хотелось бы реализовывать еще один уровень безопасности вне аксапты, так как аксапта по SID уже сама формирует нужные данные
Старый 26.12.2011, 11:46   #9  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Зачем еще одна база? Сделайте отдельную табличку в аксе, одним из полей которой будет GUID. Из C# вызывайте статический метод, который будет возвращать таблицу, в качестве одного из параметров будет принимать GUID. Возвращенную из аксы табличку загоняйте в DataSet. После обработки данных вызывайте delete с передачей ему GUID`а, это если вам больше не нужны данные в этой таблице.
Старый 26.12.2011, 11:47   #10  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Изначально для чего вам эти данные? Отчет?
Старый 26.12.2011, 11:52   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от greench Посмотреть сообщение
Зачем еще одна база? Сделайте отдельную табличку в аксе, одним из полей которой будет GUID. Из C# вызывайте статический метод, который будет возвращать таблицу, в качестве одного из параметров будет принимать GUID. Возвращенную из аксы табличку загоняйте в DataSet. После обработки данных вызывайте delete с передачей ему GUID`а, это если вам больше не нужны данные в этой таблице.
Ну можно и табличку из самой аксапты, просто исходя из первого сообщения. я предположил, что использовать аксаптовскую базу (по каким то причинам) автор темы не может поэтому и вариант с отдельной базой. А так конечно, проще всего отдельная таблица в аксапте
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 26.12.2011, 11:54   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Deza Посмотреть сообщение
не хотелось бы реализовывать еще один уровень безопасности вне аксапты, так как аксапта по SID уже сама формирует нужные данные
ага, есть такой нюанс. тогда может задуматься над сообщением от greench?
Цитата:
Сообщение от greench
Зачем еще одна база? Сделайте отдельную табличку в аксе, одним из полей которой будет GUID. Из C# вызывайте статический метод, который будет возвращать таблицу, в качестве одного из параметров будет принимать GUID. Возвращенную из аксы табличку загоняйте в DataSet. После обработки данных вызывайте delete с передачей ему GUID`а, это если вам больше не нужны данные в этой таблице.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 26.12.2011, 11:54   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Deza Посмотреть сообщение
jonny, S.Kuskov
проще тогда уже на прямую с Сиклом работать,
хотелось бы, что б вся выборка делалась в Аксапте, а она уже возвращала готовый набор данных
По сути, создание AxRecord - это и есть создание (конструирование) выборки. Т.е. здесь будут учтены все нюансы бизнесс-логики (права, RLS, configurationKey), которые были бы недоступны при использовании прямого запроса SQL. Для работы с описанной выборкой используется курсор. BusinessConnector умеет передавать упраление таким курсор внешнему приложению.
Старый 26.12.2011, 11:57   #14  
Deza is offline
Deza
Участник
 
28 / 10 (1) +
Регистрация: 21.06.2010
Цитата:
Сообщение от greench Посмотреть сообщение
Изначально для чего вам эти данные? Отчет?
Не хватает количество лицензий для работы с аксаптой, для просмотра данных и формирования отчетов было решено использовать NET Business Connector,
Планируется работа так, есть сервис который держит одно лицензионное соединение, и пользователи работают через этот отделенный сервис, это глобально(встроенный веб портал не подходит).
Локально:
1. вызвать метод с АХ передать ему доменный SID пользователя - решено
2. в АХ обработать сид с учетом настроек безопастности - решено
3. Вернуть в C# результат выборки, по сути таблица и в C# ее принять - поиск решения
Старый 26.12.2011, 12:01   #15  
Deza is offline
Deza
Участник
 
28 / 10 (1) +
Регистрация: 21.06.2010
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
По сути, создание AxRecord - это и есть создание (конструирование) выборки. Т.е. здесь будут учтены все нюансы бизнесс-логики (права, RLS, configurationKey), которые были бы недоступны при использовании прямого запроса SQL. Для работы с описанной выборкой используется курсор. BusinessConnector умеет передавать упраление таким курсор внешнему приложению.
т.е если я передам в АХ select * empltable, то если пользователь не имеет туда доступ, то выдаст ошибку?
Старый 26.12.2011, 12:23   #16  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Вот как-то так можно:
X++:
DataTable                         table = new DataTable();
IDictionary<string, object> myRange = new Dictionary<string, object>();
 
table = AxQuery.ExecuteQuery("SELECT * FROM table1", myRange);
Старый 26.12.2011, 12:23   #17  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Не знаю применимо это в Вашей ситуации или нет... Но все равно, думаю информация лишней не бывает

З.Ы. Может кто сведущий расскажет про класс AxaptaBuffer из пространства имен Microsoft.Dynamics.BusinessConnectorNet, а то поссылке как то скудно написано...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 26.12.2011, 12:30   #18  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
X++:
AxaptaWrapper axSession = SessionManager.GetSession();
DataTable dtQueryBind = new DataTable();
Guid guid = System.Guid.NewGuid();
        //Fills in temporary storage in AX with data that is used by query
axSession.CallStaticClassMethod("HelpClass", "fillTable", new object[] {_fromDate, _toDate, guid });
Ну а потом дергаете Query, которая заполнит ваш DataTable
Старый 26.12.2011, 12:48   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
З.Ы. Может кто сведущий расскажет про класс AxaptaBuffer из пространства имен Microsoft.Dynamics.BusinessConnectorNet, а то поссылке как то скудно написано...
На сколько я себе это представляю, этот тип AxaptaBuffer ввели дополнительно к AxaptaContainer для того чтобы поддержать BLOB данные. В аксапте типы BLOB и Container - одно и тоже, а по сути то это же разные вещи.

Вот рабочий пример использования Microsoft.Dynamics.BusinessConnectorNet.AxaptaBuffer:
X++:
static container testImage()
{
    Image Image = new Image();
    FilePath filename = @"c:\Users\Public\Pictures\Sample Pictures\Tulips.jpg";
    ;

    if (!Image::canLoad(filename))
        throw error::wrongUseOfFunction(funcname());

    Image.loadImage(filename);

    return Image.getData();
}
Код:
    Object obj;
    Microsoft.Dynamics.BusinessConnectorNet.AxaptaContainer axc;
    Microsoft.Dynamics.BusinessConnectorNet.AxaptaBuffer axb;
    byte[] byteArray;
    System.IO.MemoryStream ms;
    System.Drawing.Image testImage;

    obj = DynAx.CallStaticClassMethod("testAxaptaBuffer", "testImage");
    axc = (Microsoft.Dynamics.BusinessConnectorNet.AxaptaContainer)obj;
    axb = (Microsoft.Dynamics.BusinessConnectorNet.AxaptaBuffer)axc.get_Item(1);
    byteArray = axb.GetData();
    ms = new System.IO.MemoryStream(byteArray);
    testImage = System.Drawing.Image.FromStream(ms);
    testImage.Save(@"c:\Users\Public\Pictures\Sample Pictures\Tulips2.jpg");

Последний раз редактировалось S.Kuskov; 26.12.2011 в 12:50.
За это сообщение автора поблагодарили: lev (5).
Старый 26.12.2011, 12:48   #20  
Deza is offline
Deza
Участник
 
28 / 10 (1) +
Регистрация: 21.06.2010
Цитата:
Сообщение от greench Посмотреть сообщение
X++:
AxaptaWrapper axSession = SessionManager.GetSession();
DataTable dtQueryBind = new DataTable();
Guid guid = System.Guid.NewGuid();
        //Fills in temporary storage in AX with data that is used by query
axSession.CallStaticClassMethod("HelpClass", "fillTable", new object[] {_fromDate, _toDate, guid });
Ну а потом дергаете Query, которая заполнит ваш DataTable
уменя аксапта 4, там этого нет
Теги
business connector

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: New Content for Microsoft Dynamics AX 2012 : October 2011 Blog bot DAX Blogs 0 27.10.2011 17:11
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47
Inside Dynamics AX 4.0: Working with the .NET Business Connector Blog bot DAX Blogs 0 04.10.2007 05:15
Inside Dynamics AX 4.0: Inside the Business Connector Blog bot DAX Blogs 0 04.10.2007 05:15

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

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

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