|  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 | 
|  | 
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
| 
 |