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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.01.2002, 10:27   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Еще раз о Query
Чем больше разбираюсь с запросами, тем все непонятнее становится. (

Если с созданием запросов в АОТ еще все более-менее понятно то при создании из кода уже не все так гладко.

1. Куда возвращается результат выражений типа: select * from CustTable;

В документации сказано: The result will always be returned in the table variable. Тогда почему следующий код вызывает ошибку:

<pre> CustTable ct;
ct = select * from CustTable;

Eсли я делаю так:

CustTable ct;
select * from ct where .....;

</pre>
&nbsp;
как я понимаю, результат сохраняется в ct.

А что происходит в случае выборки из двух таблиц ? То есть, если я пишу:

CustTable ct;
VendTable vt;

select * from ct,vt where .....

Где в данном случае сохранится результат ?

2. В Аксапте есть классы: Query, QueryBuildDataSource, QueryBuildRange, QueryBuildLink, QueryBuildDynalink, QueryRun. Почему я не вижу их в АОТ ?

3.<pre> QueryRun qr;
Query NewQuery;
QueryBuildDataSource bb;
QueryBuildRange br;

NewQuery = new Query ("MyQuery");
bb = NewQuery.AddDataSource (TableNum(CustTable));
br = bb.AddRange (fieldNum(CustTable, AccountNum));
br.value ("1500..2000");
qr = new QueryRun (NewQuery);

</pre>
&nbsp;
Как я понимаю, выполнив этот код я должен получить в qr искомый набор данных. Почему же если я пытаюсь затем сделать следующее:
<pre>if (qr.prompt())
{
while (qr.next())
{
print qr.AccountNum; // !!! Ошибка !!!
}
}
</pre>
&nbsp;
компилятор сообщает об ошибке. Как обратиться к определенному полю в выборке? А как узнать количество записей возвращенных запросом ?


Еще больше удивляет то, что запросы реализованны именно так и не иначе. ((

Насколько я помню в рекламных проспектах Аксапты сообщалось о возможности использования SQL напрямую в коде программы. Вышеприведенный код, который, кстати, взят из справочной системы, свидетельсвует об обратном.

Извините за столь обширный вопрос, но на службу поддержки особой надежды нет (((

<hr>

<i>Отредактировал Роман Кошелев, используя тег &lt;pre&gt;
см. http://www.axforum.info/forums/showt...=&threadid=177
Старый 21.01.2002, 11:44   #2  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
->
_______
QueryRun qr;
Query NewQuery;
QueryBuildDataSource bb;
QueryBuildRange br;
// Slava, 21/01-02, -->
CustTable cT;
// Slava, 21/01-02, <--
;
NewQuery = new Query ();
bb = NewQuery.AddDataSource (TableNum(CustTable));
br = bb.AddRange (fieldNum(CustTable, AccountNum));
br.value ("*");
qr = new QueryRun (NewQuery);


if (qr.prompt())
{
while (qr.next())
{
// Slava, 21/01-02, -->
cT = qr.get(tableNum(CustTable));
// Slava, 21/01-02, <--
print ct.AccountNum; // !!! Уже не ошибка !!!
}
}
______
Напрямую SQL - запрос можно выполнить вот так:

Connection Con = new Connection();
Statement Stmt = Con.createStatement();
ResultSet R = Stmt.executeQuery('Select * From inventTable');

while ( R.next() )
{
print R.getString(1);
}
Правда обращение к результату выборки только по номеру столбика
_______
А вот такой код:

CustTable ct;
VendTable vt;

select * from ct,vt where .....
... мне повторить не удалось. Насколько я знаю синтаксис select'a не предусматривает такой конструкции, и компилятор справедливо ругается
_______
А документацию по Query,QueryRun и т.д. в AOT можно посмотреть по адресу: AOT\System documentation\Classes\"интересующий тебя класс"
Узнать бы где они спрятаны в AOT\Classes.
__________________
С уважением, Вячеслав.
Старый 21.01.2002, 15:43   #3  
dchered is offline
dchered
Участник
 
10 / 10 (1) +
Регистрация: 21.01.2002
Re: Еще раз о Query
Цитата:
ct = select * from CustTable;
Увы, синтаксис Аксапты не поддерживает такое присваивание.

Цитата:
select * from ct where .....;
Можно проще:

select ct where ....;

Цитата:
select * from ct,vt where .....
Синтаксис встроенного SQL в Аксапте сильно отличается от привычного.
Надо писать так:

select ct join vt where ...

Результат сохранится в табличных переменных ct и vt, если это inner join (по умолчанию) или outer join.

Цитата:
2. В Аксапте есть классы: Query, QueryBuildDataSource, QueryBuildRange, QueryBuildLink, QueryBuildDynalink, QueryRun. Почему я не вижу их в АОТ ?
Это системные классы, которые невозможно модифицировать. Поэтому их
нет в AOT. Кажется, так...

Цитата:
Еще больше удивляет то, что запросы реализованны именно так и не иначе. ((
В Аксапте многое поначалу удивляет. Но постепенно привыкаешь.
Старый 21.01.2002, 20:19   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Re: Еще раз о Query
Вроде уже ответили на все вопросы.
Хотелось бы добавить

Цитата:
Изначально опубликовано Андре
2. В Аксапте есть классы: Query, QueryBuildDataSource, QueryBuildRange, QueryBuildLink, QueryBuildDynalink, QueryRun. Почему я не вижу их в АОТ ?
В Аксапте есть системные классы и системные таблицы. Они скрыты в дереве AOT. Но они есть. Список всех классов можно получить в разделе документация.

Кроме того, бывают таблицы, которые не хранятся на сервере и не показаны в дереве AOT.

Кстати, через этот раздел можно добраться до браузера у системных таблиц.
Очень бывает интересно посмотреть на таблицы utilElements, utilIDElements. Это АОТ во внутреннем виде.

Кроме того, тем кто пишет запросы напрямую к SQL будет полезна системная таблица SqlDictionary
__________________
полезное на axForum, github, vk, coub.
Старый 23.01.2002, 00:49   #5  
Andrew is offline
Andrew
Участник
 
9 / 10 (1) +
Регистрация: 23.01.2002
Адрес: Минск
Привет!
1.
В данном примере table variable это ct а CustTable это описание типа. В документации сказано правильно. Можно использовать:
CustTable ct;

select ct index AccountIdx
where ct.AccountNum == "001"; // стиль используемый Navision

2. Они расположены в AOT/System Documentation/Classes. Правда, описания там очень мало, практически нет ничего

3. Результирующий набор записей можно обработать таким способом
while (qr.next())
{
ct = gr.get(tablenum(CustTable));
print ct.AccountNum; // Ok
// print qr.AccountNum; // !!! Ошибка !!!
}
Количество записей : Counter total = SysQuery::CountTotal(qr);
Прямой SQL можно использовать через CLS UserConnection но не удобно.
Старый 24.01.2002, 11:22   #6  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Во первых спасибо за помощь.

Хотелось бы уточнить несколько моментов:

1. Как я понял при создании Query из АОТ он будет возвращать все поля таблицы. По моему это не есть хорошо. А можно ли как-то ограничить количество возвращаемых полей.

2. Хотелось бы уточнить про выборку из двух и более связанных таблиц.

Цитата:
Синтаксис встроенного SQL в Аксапте сильно отличается от привычного.

Надо писать так:
select ct join vt where ...

Результат сохранится в табличных переменных ct и vt, если это inner join (по умолчанию) или outer join.
При выполнении данного запроса я ожидаю получить ОДИН результатирующий набор данных и мне не совсем понятно как "результат может сохраниться в двух переменных". Если Вас не затруднит, не могли бы Вы объяснить мне в чем здесь дело.
Старый 24.01.2002, 16:55   #7  
dchered is offline
dchered
Участник
 
10 / 10 (1) +
Регистрация: 21.01.2002
Цитата:
При выполнении данного запроса я ожидаю получить ОДИН результатирующий набор данных и мне не совсем понятно как "результат может сохраниться в двух переменных". Если Вас не затруднит, не могли бы Вы объяснить мне в чем здесь дело.
Все просто, хоть и не очевидно. Строка результирующей выборки состоит из всех полей таблицы CustTable и всех полей таблицы VendTable. При выполнении оператора "select" считывается первая строка выборки, при этом в переменную cT попадут поля таблицы CustTable, а в переменную vT - соответственно поля таблицы VendTable.

Чтобы "пробежаться" по всей выборке, используется оператор "while select":

<pre>
while select cT join vT where ...
{
// при каждом входе в тело цикла переменные cT и vT
// принимают очередное значение из выборки
}
</pre>
Старый 24.01.2002, 17:21   #8  
dchered is offline
dchered
Участник
 
10 / 10 (1) +
Регистрация: 21.01.2002
Цитата:
1. Как я понял при создании Query из АОТ он будет возвращать все поля таблицы. По моему это не есть хорошо. А можно ли как-то ограничить количество возвращаемых полей.
Можно. В датасоурсе надо выбрать узел "Fields", вызвать окошко свойств, установить значение свойства "Dynamic" в "No", после чего удалить из списка все лишние поля.
__________________
Дмитрий Чередниченко.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Установка условия ИЛИ (OR) в Query Zeratul DAX: Программирование 3 22.06.2006 14:28
Проблема с составлением Query axaLearner DAX: Программирование 10 01.12.2005 15:00

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

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

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