26.12.2011, 11:23 | #1 |
Участник
|
.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:27 | #2 |
Участник
|
|
|
26.12.2011, 11:29 | #3 |
Участник
|
Я знаю только способ с построчным перебором через 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 |
Ищущий знания...
|
В AX2009 в справке разработчика работе с .Net Business Connector посвящен целый раздел.
Конечно там все на английском, но думаю при желании необходимую инфу можно от туда выцепить.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.12.2011, 11:36 | #5 |
Участник
|
jonny, S.Kuskov
проще тогда уже на прямую с Сиклом работать, хотелось бы, что б вся выборка делалась в Аксапте, а она уже возвращала готовый набор данных |
|
26.12.2011, 11:37 | #6 |
Участник
|
|
|
26.12.2011, 11:40 | #7 |
Ищущий знания...
|
Цитата:
Сообщение от Deza
появилась необходимость использовать .NET Business Connector for Dynamics AX
Использовать простой select не вариант. так как должен быть метод (в AX) который принимает SID пользователя и выдает таблицу. И появился следующий вопрос, возможно ли передать из AX уже сформированную таблицу (dataset) или что то наподобие, что б в C# можно было принять набор данных, а не единичную запись. Подскажите где почитать или посмотреть пример. 1. Создал бы отдельно новую базу (если такой нету) с нужной табличкой для внешнего приложения. 2. В аксапте написал бы класс по заполнению этой таблицы нужной информацией. По результатам работы класс возвращал бы значения true или false, в зависимости от успешности выполнения. 3. Во внешнем приложении вызывал бы аксаптовский класс, и если он вернул true, то спокойно уже использовал заполненную табличку (о которой написал в 1-м пункте) для своих нужд.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.12.2011, 11:46 | #8 |
Участник
|
Цитата:
Сообщение от lev
Если немного отвлечься от работы .NET Business Connector, и поговорить о решении задачи, я пошел бы немного другим путем.
1. Создал бы отдельно новую базу (если такой нету) с нужной табличкой для внешнего приложения. 2. В аксапте написал бы класс по заполнению этой таблицы нужной информацией. По результатам работы класс возвращал бы значения true или false, в зависимости от успешности выполнения. 3. Во внешнем приложении вызывал бы аксаптовский класс, и если он вернул true, то спокойно уже использовал заполненную табличку (о которой написал в 1-м пункте) для своих нужд. |
|
26.12.2011, 11:46 | #9 |
Участник
|
Зачем еще одна база? Сделайте отдельную табличку в аксе, одним из полей которой будет GUID. Из C# вызывайте статический метод, который будет возвращать таблицу, в качестве одного из параметров будет принимать GUID. Возвращенную из аксы табличку загоняйте в DataSet. После обработки данных вызывайте delete с передачей ему GUID`а, это если вам больше не нужны данные в этой таблице.
|
|
26.12.2011, 11:47 | #10 |
Участник
|
Изначально для чего вам эти данные? Отчет?
|
|
26.12.2011, 11:52 | #11 |
Ищущий знания...
|
Цитата:
Сообщение от greench
Зачем еще одна база? Сделайте отдельную табличку в аксе, одним из полей которой будет GUID. Из C# вызывайте статический метод, который будет возвращать таблицу, в качестве одного из параметров будет принимать GUID. Возвращенную из аксы табличку загоняйте в DataSet. После обработки данных вызывайте delete с передачей ему GUID`а, это если вам больше не нужны данные в этой таблице.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.12.2011, 11:54 | #12 |
Ищущий знания...
|
Цитата:
Цитата:
Сообщение от greench
Зачем еще одна база? Сделайте отдельную табличку в аксе, одним из полей которой будет GUID. Из C# вызывайте статический метод, который будет возвращать таблицу, в качестве одного из параметров будет принимать GUID. Возвращенную из аксы табличку загоняйте в DataSet. После обработки данных вызывайте delete с передачей ему GUID`а, это если вам больше не нужны данные в этой таблице.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.12.2011, 11:54 | #13 |
Участник
|
По сути, создание AxRecord - это и есть создание (конструирование) выборки. Т.е. здесь будут учтены все нюансы бизнесс-логики (права, RLS, configurationKey), которые были бы недоступны при использовании прямого запроса SQL. Для работы с описанной выборкой используется курсор. BusinessConnector умеет передавать упраление таким курсор внешнему приложению.
|
|
26.12.2011, 11:57 | #14 |
Участник
|
Не хватает количество лицензий для работы с аксаптой, для просмотра данных и формирования отчетов было решено использовать NET Business Connector,
Планируется работа так, есть сервис который держит одно лицензионное соединение, и пользователи работают через этот отделенный сервис, это глобально(встроенный веб портал не подходит). Локально: 1. вызвать метод с АХ передать ему доменный SID пользователя - решено 2. в АХ обработать сид с учетом настроек безопастности - решено 3. Вернуть в C# результат выборки, по сути таблица и в C# ее принять - поиск решения |
|
26.12.2011, 12:01 | #15 |
Участник
|
Цитата:
Сообщение от S.Kuskov
По сути, создание AxRecord - это и есть создание (конструирование) выборки. Т.е. здесь будут учтены все нюансы бизнесс-логики (права, RLS, configurationKey), которые были бы недоступны при использовании прямого запроса SQL. Для работы с описанной выборкой используется курсор. BusinessConnector умеет передавать упраление таким курсор внешнему приложению.
|
|
26.12.2011, 12:23 | #16 |
Участник
|
Вот как-то так можно:
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 |
Ищущий знания...
|
Не знаю применимо это в Вашей ситуации или нет... Но все равно, думаю информация лишней не бывает
З.Ы. Может кто сведущий расскажет про класс AxaptaBuffer из пространства имен Microsoft.Dynamics.BusinessConnectorNet, а то поссылке как то скудно написано...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.12.2011, 12:30 | #18 |
Участник
|
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 }); |
|
26.12.2011, 12:48 | #19 |
Участник
|
Цитата:
Вот рабочий пример использования 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 |
Участник
|
Цитата:
Сообщение от 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 }); |
|
Теги |
business connector |
|
|