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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.09.2008, 12:36   #1  
vadimiron is offline
vadimiron
Участник
 
24 / 10 (1) +
Регистрация: 16.12.2007
While select.... и итерация
Такой вопрос для укрепления знаний

Например, я могу получить всех клиентов:
X++:
CustTable custTable;
;

select custTable;
Далее я хочу итерировать по полученному списку клиентов - как это сделать правильно без повторных запросов к базе данных?

Насколько я понимаю, если написать
X++:
while select custTable{}
то custTable будет опять браться из базы. Или всё же уже из самого ранее выбранного custTable??
Старый 03.09.2008, 12:40   #2  
crazysolntse is offline
crazysolntse
Участник
Аватар для crazysolntse
 
21 / 11 (1) +
Регистрация: 24.07.2006
Адрес: Москва
можно написать next custtable; - так нового запроса не будет

а "while select custtable" - Будет новый запрос к БД
За это сообщение автора поблагодарили: vadimiron (1).
Старый 03.09.2008, 12:50   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А еще лучше просто сразу написать
X++:
CustTable custTable;
;
while select custTable
{

}
За это сообщение автора поблагодарили: vadimiron (1).
Старый 03.09.2008, 13:02   #4  
vadimiron is offline
vadimiron
Участник
 
24 / 10 (1) +
Регистрация: 16.12.2007
А в случае "next custtable" нужно делать сбрасывание курсора, если я хочу с начала итерацию начать??

Дело в том, что запрос (select custTable where....) происходит в одной функции, а вот итерация по результату запроса происходит в нескольких других - то есть мне нужно несколько раз пройтись по результату запроса без повторного обращения к базе данным
Старый 03.09.2008, 13:02   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
можно конечно вот так:
X++:
CustTable custTable;
;
select custTable;

while(custTable)
{
print custTable.AccountNum;
next custTable;
}
Но в таком варианте:
1. Самое первое и главное можно забыть про NEXT и тогда уйдем в бесконечный цикл!
2. Менее читабельно.

Так что самый правильный вариант, это как советует kashperuk
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 03.09.2008, 13:06   #6  
vadimiron is offline
vadimiron
Участник
 
24 / 10 (1) +
Регистрация: 16.12.2007
lev - мне надо запрос и итерацию по результату разделить в разные функции
Старый 03.09.2008, 13:06   #7  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,295 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Цитата:
Сообщение от vadimiron Посмотреть сообщение
Дело в том, что запрос (select custTable where....) происходит в одной функции, а вот итерация по результату запроса происходит в нескольких других - то есть мне нужно несколько раз пройтись по результату запроса без повторного обращения к базе данным
А зачем так сделали? Ещё можно воспользоваться Query, если нужно какие-то параметры запроса использовать несколько раз. Но, чтобы чётко сказать, что лучше, нужно знать задачу.
__________________
Михаил Андреев
https://www.amand.ru
Старый 03.09.2008, 13:11   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от vadimiron Посмотреть сообщение
lev - мне надо запрос и итерацию по результату разделить в разные функции
В таком случае действительно нужно сделать так как я написал. Но одно но я не знаю как в таком синтаксисе сбросить курсор, и возможно ли вообще такое знаю как эту проблему решить чере query:
X++:
queryRun.reset();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 03.09.2008, 13:11   #9  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от vadimiron
...
Например, я могу получить всех клиентов:
X++:
CustTable custTable;
;

select custTable;
Так вы отправите в БД запрос.
Цитата:
Сообщение от vadimiron
...
Насколько я понимаю, если написать
X++:
while select custTable{}
то custTable будет опять браться из базы. Или всё же уже из самого ранее выбранного custTable??
Аксапта работает с БД с помощью так называемого механизма курсора.

Отправляя в БД запрос вы как-бы формируете множество записей, которые вам выдаст БД. По этому списку вы можете двигаться взад-вперед. Реально в СУБД создается некий объект, дергая который вы можете получать следующую запись, и, при необходимости, обновлять или удалять ее.

Данные из БД в Аксапте вы всегда получаете по одной записи. Между клиентом и АОСом действует уже иной механизм.

Т.о. получение следующей записи не порождает новый запрос, а работает с изначальным. Почитайте про механизм курсоров в документации по MS SQL Server.
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: vadimiron (1).
Старый 03.09.2008, 13:16   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Вот полный пример работы с query:
X++:
static void AEliz_test(Args _args)
{
    Query                   query = new Query();
    QueryRun                queryRun;
    QueryBuildDataSource    qbds;
    CustTable               custTable;
    ;

    qbds    = query.addDataSource(tableNum(CustTable));

    queryRun = new QueryRun(query);

    while(queryRun.next())
    {
        print custTable.AccountNum;
    }

    queryRun.reset();

    while(queryRun.next())
    {
        print custTable.AccountNum;
    }
}
соответственно в классе нужно объявить queryRun глобально (в ClassDeclaration) чтобы потом дёргать его отовсюду.

P.S. кстати, в случае с query не нужно думать про NEXT всё делается само автоматически, а это огромный плюс.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 03.09.2008 в 13:17. Причина: P.S.
Старый 03.09.2008, 13:28   #11  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Более правильная версия полного примера.

X++:
static server void glibs(Args _args)
{
    Query                   query = new Query();
    QueryRun                queryRun;
    QueryBuildDataSource    qbds;
    CustTable               custTable;
    ;

    qbds    = query.addDataSource(tableNum(CustTable));

    queryRun = new QueryRun(query);

    while(queryRun.next())
    {
        custTable = queryRun.get(tablenum(CustTable));
        print custTable.AccountNum;
    }

    queryRun.reset();

    while(queryRun.next())
    {
        custTable = queryRun.get(tablenum(CustTable));
        print custTable.AccountNum;
    }

    pause;

}
__________________
С уважением,
glibs®
Старый 03.09.2008, 13:34   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от glibs Посмотреть сообщение
Более правильная версия полного примера.
...
Да действительно, забыл про инициализацию таблицы, сорри
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 03.09.2008, 14:39   #13  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от vadimiron Посмотреть сообщение
хочу итерировать по полученному списку клиентов - как это сделать правильно без повторных запросов к базе данных?
посмотри RecordSortedList

http://msdn.microsoft.com/en-us/library/aa862829.aspx
Теги
select, запрос (query), как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
2 while select или join? _scorp_ DAX: Программирование 9 23.01.2009 16:02
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
gatesasbait: Reverse keyword on Select Statements Blog bot DAX Blogs 0 08.02.2008 00:10
Fred Shen: Always use recId to know if a select statement returns a record Blog bot DAX Blogs 0 28.10.2006 16:40
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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