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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.11.2007, 10:41   #1  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
while select ... group by dimension[i]
Подскажите, как реализовать такой код? Если вводить просто цифру - все нормально. Если вводишь переменную типа int - ошибка. Нужно сделать селект по сгруппированным значениям в каждом виде аналитик.
Через поиск нашла кучу тем про аналитики, но к моей проблеме ничего близкого (ИМХО)
__________________
MBS-Axapta 3.0 CIS SP3
Старый 28.11.2007, 11:25   #2  
NeveB is offline
NeveB
Участник
 
60 / 16 (1) ++
Регистрация: 14.11.2003
Адрес: Mosсow
навскидку - использовать QueryRun
Старый 28.11.2007, 11:26   #3  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
То же на вскидку
А может указывать не int а EDT?
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)
Старый 28.11.2007, 11:29   #4  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Например писать dimension(SysDimension::...)
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 28.11.2007, 11:34   #5  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
С QueryRun точно работает. Вот джоб:
X++:
static void Job10(Args _args)
{
    InventTable     inventTable;
    Query           query = new Query();
    QueryRun        queryRun;
    QueryBuildDataSource    qbds;
    int                     i = 2;
    ;
    qbds = query.addDataSource(tableNum(InventTable));
    qbds.orderMode(OrderMode::GroupBy);
    qbds.addSortField(fieldId2ext(fieldNum(InventTable, Dimension), i));
    qbds.addSelectionField(fieldNum(InventTable, RecId), SelectionField::Count);
    queryRun = new QueryRun(query);
    while (queryRun.next())
    {
        inventTable = queryRun.getNo(1);
        info(strFmt("%1  %2", inventTable.Dimension[i], inventTable.RecId));
    }
}
__________________
Андрей.
За это сообщение автора поблагодарили: Gustav (10), Tiruvileijadal' (1).
Старый 28.11.2007, 11:38   #6  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Цитата:
Сообщение от Weez Посмотреть сообщение
Например писать dimension(SysDimension::...)
Так тоже не работает. Надо использовать QueryRun + fieldId2ext как описал Dron AKA andy.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 28.11.2007, 12:07   #7  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Да, прошу прощения, написал не проверив..
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 28.11.2007, 15:49   #8  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Объясните почему всегда i = 2?
__________________
MBS-Axapta 3.0 CIS SP3
Старый 28.11.2007, 16:17   #9  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Dron AKA andy, спасибо, работает
__________________
MBS-Axapta 3.0 CIS SP3
Старый 28.11.2007, 16:35   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Tiruvileijadal'

Ну и выдумала имя себе

Итак, вы делаете распространенную ошибку, предполагая, что while select - это обычный себе цикл, в котором вы что-то можете менять.
Это не так!
while select - это ОДИН запрос, который возвращает набор записей. Но запрос выполняется лишь единажды (отсылается на сервер). Видимо в первый раз значение вашей переменной == 2. Но потом, пытаясь изменять ее в цикле, вы не получите "ожидаемого" результата. Потому как запрос уже исполнился.

Я правильно выразил вашу ошибку?
Старый 30.11.2007, 20:22   #11  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Нет, Иван Но это не от того, что вы неверно что-то объяснили, это от того, что я так неопределенно написала Я спрашивала про i, который пишут в примерах-кодах на тему Dimension умные люди этого форума. Эта переменная всегда изначально = 2. Простите, это был риторический вопрос
У меня i меняется в цикле for в другом методе, и в этом цикле уже вызывается метод с обработкой запроса. И все здорово работает, кроме одной вещи: я не могу вытащить Description ;(
select description from dim where dim.num == mytable.dimension[i]
&& dim.DimensionCode == i;
Не работает Не подскажите, почему? Сразу скажу - код написала по-памяти, поэтому если перепутала поля - это память подводит.
__________________
MBS-Axapta 3.0 CIS SP3
Старый 30.11.2007, 23:36   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
часть выделена сюда Имя Tiruvileijadal'
__________________
полезное на axForum, github, vk, coub.
Старый 03.12.2007, 09:56   #13  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Цитата:
Сообщение от Tiruvileijadal' Посмотреть сообщение
Нет, Иван Но это не от того, что вы неверно что-то объяснили, это от того, что я так неопределенно написала Я спрашивала про i, который пишут в примерах-кодах на тему Dimension умные люди этого форума. Эта переменная всегда изначально = 2. Простите, это был риторический вопрос
У меня i меняется в цикле for в другом методе, и в этом цикле уже вызывается метод с обработкой запроса. И все здорово работает, кроме одной вещи: я не могу вытащить Description ;(
select description from dim where dim.num == mytable.dimension[i]
&& dim.DimensionCode == i;
Не работает Не подскажите, почему? Сразу скажу - код написала по-памяти, поэтому если перепутала поля - это память подводит.
Дело в том, что первый элемент в массиве Dimension имеет значение 1, а первый элемент енума SysDimension (на котором основано поле Dimensions.DimensionCode) - 0. Поэтому ваш код должен выглядеть так:

X++:
select description from dim where dim.num == mytable.dimension[i]
                                             && dim.DimensionCode == i - 1;
За это сообщение автора поблагодарили: Tiruvileijadal' (1).
Старый 03.12.2007, 11:41   #14  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Ура!!! Заработало!!! Знаете, Peter Savintsev, я и сама до этого дошла (но Вам спасибо за образный тычок в лоб), но у нас к таблице Dimensions был написан другими программистами метод как раз для поиска описания. И вот, когда я в этот метод вставляла эти данные - ну нифига!!! А вот сделала простым селектом (это как раз тычок в лоб) - ВСЕ ЗДОРОВО!!! Туплю...
__________________
MBS-Axapta 3.0 CIS SP3
Старый 04.12.2007, 12:08   #15  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
А сейчас такая проблема (может кто сталкивался):
нужно сделать выборку типа
MyTable t1, t2, t3, t4, ..., t14;

while select t1 group by dim[x]
{
while select t2 group by dim[y] where t2.dim[x] == t1.dim[x]
{
while select t3 group by dim[z] where t3.dim[x] == t1.dim[x] && t3.dim[y] == t2.dim[y]
{
...
}
}
}
сколько таких циклов заранее не известно (это зависит от того, возле скольких аналитик пользователь поставит галочки). У меня такое ощущение, что это невыполнимо. Пока никаких вариантов не вижу.
__________________
MBS-Axapta 3.0 CIS SP3

Последний раз редактировалось Tiruvileijadal'; 04.12.2007 в 12:09. Причина: орфография
Старый 04.12.2007, 12:24   #16  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
Цитата:
Сообщение от Tiruvileijadal' Посмотреть сообщение
А сейчас такая проблема (может кто сталкивался):
нужно сделать выборку типа
MyTable t1, t2, t3, t4, ..., t14;

while select t1 group by dim[x]
{
while select t2 group by dim[y] where t2.dim[x] == t1.dim[x]
{
while select t3 group by dim[z] where t3.dim[x] == t1.dim[x] && t3.dim[y] == t2.dim[y]
{
...
}
}
}
сколько таких циклов заранее не известно (это зависит от того, возле скольких аналитик пользователь поставит галочки). У меня такое ощущение, что это невыполнимо. Пока никаких вариантов не вижу.
"QueryBuildDataSource"
И в условия их. Выполняется условие генериться QueryBuildDataSource.
Ренжи так же.

ЗЫ.Только код получится страшный
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)
Старый 04.12.2007, 12:51   #17  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Используйте рекурсивный метод, который будет строить запрос с помощью Query и выполнять его с помощью QueryRun. Тогда код будет не очень страшным.
Старый 04.12.2007, 13:16   #18  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
Цитата:
Сообщение от Peter Savintsev Посмотреть сообщение
Используйте рекурсивный метод, который будет строить запрос с помощью Query и выполнять его с помощью QueryRun. Тогда код будет не очень страшным.
+1
Нда, поспешил. Не подумал
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)
Старый 04.12.2007, 13:27   #19  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Я, конечно же, попрошу мёд да ещё и ложкой... А примерно как это может выглядеть не подскажете? Вообще ничего в голову не приходит
__________________
MBS-Axapta 3.0 CIS SP3
Старый 04.12.2007, 13:47   #20  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
Возможно, как то так:
X++:
void method(QueryBuildDataSource _qbds, common _table, QueryBuildRange _qbr)
{
    ;
    _qbds.addDataSource(_table);
    ...
    ...
    ...

    if (bla-bla-bla)
    {
        ...
        ...
        this.method(_qbds, Table, Range);
    }
}
Сильно не пинать, писал в блокноте

Там наверняка будет косяк с "_table", "TableNum" наверное не пройдет, но смысл таков


ЗЫ. Полезно!
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)

Последний раз редактировалось Silence; 04.12.2007 в 13:50.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
Фильтр по пустому Dimension[x] в select Yprit DAX: Программирование 3 05.03.2008 15:11
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
select group by listener DAX: Программирование 10 18.11.2003 12:19
group , но не by slava DAX: Программирование 9 21.05.2003 19:05

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

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

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