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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.06.2012, 23:39   #1  
nicknk is offline
nicknk
Участник
 
7 / 10 (1) +
Регистрация: 26.06.2012
Проблема с .NET Business Connector (AX 2009)
Пишется получение данных из аксапты для отдельной системы.
Используется .net business connector.

Есть непонятная проблема следующего характера - не работает стандартный запрос

X++:
AxaptaRecord flat = _axapta.Connection.CreateAxaptaRecord("FlatAccountTable");
string q = string.Format("select * from %1 where %1.DataAreaId=='{0}' && %1.AccountNum=='{1}'", _curDataAreaId, accNum);
Console.WriteLine("Query = {0}", q.ToString());                 
flat.ExecuteStmt(q);
Никаких ошибок, ничего, только flat.Found всегда false. Все логины пройдены без проблем.
Экперимент запроса без where тоже выдает пустой результат.

Аналогичный запрос в самой БД дает то что нужно.
Не понимаю где искать косяк
Старый 27.06.2012, 01:04   #2  
Alexanderis.ua is offline
Alexanderis.ua
Участник
 
53 / 40 (2) +++
Регистрация: 25.12.2008
Адрес: Киев, Украина
Давно коннектором не пользовался и посмотреть сейчас нет возможности.
Но непонятна конструкция
X++:
_axapta.Connection.CreateAxaptaRecord()
Если _axapta это объект типа Microsoft.Dynamics.BusinessConnectorNet.Axapta, то вроде как
X++:
_axapta.CreateAxaptaRecord()
Но возможно это всё просто происки вынесенного после 6-ти часов дебага мозга
__________________
If it ain't broke, take it apart and find out why (с)
Старый 27.06.2012, 07:17   #3  
nicknk is offline
nicknk
Участник
 
7 / 10 (1) +
Регистрация: 26.06.2012
Alexanderis.ua, все Вы правильно пишете. Действительно вызывает вопросы =)
Поясняю:
_axapta - это обертка вокруг Microsoft.Dynamics.BusinessConnectorNet.Axapta, упрощающее некоторые утилитарные функции.
А свойство Connection возвращает собственно объект Microsoft.Dynamics.BusinessConnectorNet.Axapta
Старый 27.06.2012, 07:56   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
RLS на FlatAccountTable не настроено?

Коннектор нужную конфигурацию использует? А то может он на другой AOS смотрит

X++:
AxaptaObject SqlSystem = _axapta.Connection.CreateAxaptaObject("SqlSystem");
AxaptaObject loginProperty = SqlSystem.Call("createLoginProperty");
string SQLServer = loginProperty.Call("getServer");
string SQLDatabase = loginProperty.Call("getDatabase");
Console.WriteLine("SQLServer = {0}; SQLDatabase = {1}", SQLServer, SQLDatabase);

Последний раз редактировалось S.Kuskov; 27.06.2012 в 08:18.
За это сообщение автора поблагодарили: nicknk (1).
Старый 27.06.2012, 08:32   #5  
nicknk is offline
nicknk
Участник
 
7 / 10 (1) +
Регистрация: 26.06.2012
Наверное задам глупый вопрос - RLS это что?
Поясню - я не разработчик на аксапте, а разработчик сторонней системы. мне были предоставлены необходимые запросы по запрошенному перечню данных и дано как получить доступ к этим данным (через .Net BC). Часть запросов работает на ура (даже с join), а вот такой вот примитивный (даже без всяких where) - не работает...
AOS используется тот, что нужен - некоторые выборки работают корректно.
Старый 27.06.2012, 08:44   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Record level security (RLS)

Под каким пользователем работает коннектор?
Под каким пользователем проверяли работоспособность запроса в аксапте?

Для разных пользователей аксапта умеет выполнять запрос по разному. Если настроен доступ на уровне записей (RLS) аксапта может добавлять дополнительные фильтры, что бы скрыть данные от пользователей, которым они не предназначены.
Старый 27.06.2012, 09:36   #7  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
RLS по умолчанию на обычных селектах не включается, в отличие от Query. Так что думаю, что дело не в этом. Советую Вам все запросы строить в аксапте через Query. Сделать класс со статическим методом, который вовращает уже нужный Вам квери. Дергайте этот метод через BC. Создавйте quryRun и пробегайтесь по query. В общем я к тому, что вся логика должна быть на стороне AX, а через BC Вы просто будете дергать эту логику.
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 27.06.2012, 11:12   #8  
nicknk is offline
nicknk
Участник
 
7 / 10 (1) +
Регистрация: 26.06.2012
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
RLS на FlatAccountTable не настроено?

Коннектор нужную конфигурацию использует? А то может он на другой AOS смотрит

X++:
AxaptaObject SqlSystem = _axapta.Connection.CreateAxaptaObject("SqlSystem");
AxaptaObject loginProperty = SqlSystem.Call("createLoginProperty");
string SQLServer = loginProperty.Call("getServer");
string SQLDatabase = loginProperty.Call("getDatabase");
Console.WriteLine("SQLServer = {0}; SQLDatabase = {1}", SQLServer, SQLDatabase);
Спасибо за код - проверил! Еще раз подтвердилось, что все нормально, все как и должно быть.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Под каким пользователем работает коннектор?
Под каким пользователем проверяли работоспособность запроса в аксапте?

Для разных пользователей аксапта умеет выполнять запрос по разному. Если настроен доступ на уровне записей (RLS) аксапта может добавлять дополнительные фильтры, что бы скрыть данные от пользователей, которым они не предназначены.
В аксапте работоспособность не проверялась, поскольку с самой аксаптой не работаем, только через BC.
Запрос проверялся напрямую в БД.
Повторюсь - часть запросов через BC (к другим таблицам) работает нормально. С этой таблицей целая проблема - даже выборка всей таблицы (select * from tablename) дает пустой результат.

_scorp_, спасибо за совет, уже видел такие предложения. Да, наверное соглашусь с Вами, что это более верный путь.
но в моем случае это неприменимо по ряду причин:
1 Нет опыта работы в аксапте и нет разработчиков на аксапте
2 Сама система на аксапте разрабатывалась другими разработчиками и была договоренность, что мы в саму аксапту не лезем.

Последний раз редактировалось nicknk; 27.06.2012 в 11:22.
Старый 27.06.2012, 11:34   #9  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Думаю проблема в том, что вы подключаетесь не к той компании. Проверьте в настройках пользователя, под которым Вы подключаетесь компанию по умолчанию и компанию в конфигурационном файле (если она там указана). Либо в методе LogonAs, при подключении через BC не ту компанию указываете. Посмотрите через SQL профайлер с каким фильтром по dataAreaId идут запросы к БД.

Последний раз редактировалось _scorp_; 27.06.2012 в 11:39.
За это сообщение автора поблагодарили: nicknk (1).
Старый 27.06.2012, 12:29   #10  
nicknk is offline
nicknk
Участник
 
7 / 10 (1) +
Регистрация: 26.06.2012
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Думаю проблема в том, что вы подключаетесь не к той компании. Проверьте в настройках пользователя, под которым Вы подключаетесь компанию по умолчанию и компанию в конфигурационном файле (если она там указана). Либо в методе LogonAs, при подключении через BC не ту компанию указываете. Посмотрите через SQL профайлер с каким фильтром по dataAreaId идут запросы к БД.
Да, действительно, сменил компанию в LogonAs на ту, которую указывал в запросе WHERE для поля DataAreaID - и все сразу нашлось.
Если я правильно понимаю, получается, что Аксапта сама добавляет фильтрацию по этому полю исходя из указанной в LogonAs и нет необходимости указывать его в запросах?
Тогда возникает вопрос - а можно ли каким-то образом указать LogonAs так, что бы работать с несколькими компаниями? У меня есть часть запросов, которые осуществляют join по другой компании... Правильно ли будет в LogonAs не указывать компанию вообще(пустую строку передавать)?

Последний раз редактировалось nicknk; 27.06.2012 в 12:32.
Старый 27.06.2012, 12:35   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от nicknk Посмотреть сообщение
Тогда возникает вопрос - а можно ли каким-то образом указать LogonAs так, что бы работать с несколькими компаниями? У меня есть часть запросов, которые осуществляют join по другой компании... Правильно ли будет в LogonAs не указывать компанию вообще(пустую строку передавать)?
http://blogs.msdn.com/b/x/archive/20...e-browser.aspx
Старый 27.06.2012, 12:39   #12  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Тяжело Вам будет без программиста аксапты Компанию всегда указывайте. Если хотите выбирать данные из нескольких компаний, то используйте в запросах crosscompany (Если у Вас конечно AX, с версией не ниже 2009).
Старый 27.06.2012, 12:59   #13  
nicknk is offline
nicknk
Участник
 
7 / 10 (1) +
Регистрация: 26.06.2012
S.Kuskov, _scorp_, очень помогли! Большое спасибо!

_scorp_, да я уже понял, что не все так просто, как выглядело изначально (получить sql запросы, реализовать их через Аксапту, сделать предметную обвязку и пару WCF-сервисов)

Поэтому есть вопрос общий - где взять нормальное описание команд для запросов на X++ - потому что довольно много пришлось ковыряться, что бы выяснить, почему не компилятся запросы с AND и что его нужно заменять на &&.
Сейчас столкнулся с тем, что не работает TOP 1...
И абсолютно не понимаю, как вызывать встроенные процедуры SQL-сервера.
И все через .net BC
Старый 27.06.2012, 13:29   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Обычно коннектор используют для того чтобы вызвать какой-нибудь уже готовый аксаптовский код. Или чтобы создать какой-нибудь аксаптовский документ, при этом корректно выполнив все сопровождающие создание документа операции. Ну или чтобы выполнить запрос с учётом разных внутренних аксаптовских политик безопасности.

Если вы точно знаете какой SQL запрос вам нужно выполнить, не проще ли работать не через сервер приложения (AOS), а напрямую c базой данных? К стати говоря, "вызывать встроенные процедуры SQL-сервера" только так и получится

"TOP 1" = "firstOnly"

Последний раз редактировалось S.Kuskov; 27.06.2012 в 13:43.
Старый 27.06.2012, 16:35   #15  
nicknk is offline
nicknk
Участник
 
7 / 10 (1) +
Регистрация: 26.06.2012
Получилось как обычно - простая задача, которая теоретически должна была решаться красиво требует извращения: часть запросов через БД, часть через BC - есть несколько запросов, для которых необходимо использовать статические методы аксапты, потому что через БД получается очень сложный многоэтажный запрос.

Спасибо за помощь, очень здорово помогли!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
fed: Net requirements update in MRP Module and Working Set of MRP Blog bot DAX Blogs 14 08.05.2012 13:09
EP Ax 2009: Не удалось найти сеанс .NET Business Connector. npokypatop DAX: Функционал 2 13.04.2012 14:35
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
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, время: 17:10.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.