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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.12.2007, 14:23   #21  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Слушайте, ну не могу я одна это сообразить... Уже мозги в рекурсию вошли
Вот есть у меня контейнер, в котором лежат номера отмеченных пользователем аналитик. Превый номер - самая главная аналитика, последний - самая участвующая. С помощью кода, любезно предоставленного Dron AKA andy, я смогу создать запрос с первой цифрой из контейнера. И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем? Чтоб при последней цифре контейнера это был последний цикл рекурсии? (По-моему, это я все для себя написала, но от помощи не откажусь)
__________________
MBS-Axapta 3.0 CIS SP3
Старый 04.12.2007, 14:40   #22  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Нда, а еще нужно, чтобы табличные переменные были разные... Засада.
__________________
MBS-Axapta 3.0 CIS SP3
Старый 04.12.2007, 14:53   #23  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Что-то типа такого (в контейнере conDimensions хранятся номера нужных аналитик):

X++:
void start()
{
    this.action(this.initQuery(), 1);
}

Query initQuery()
{
    Query                   q = new Query();
    QueryBuildDataSource    qbds;

    qbds = q.addDataSource(tablenum(LedgerTrans));

    qbds.orderMode(OrderMode::GroupBy);

    return q;
}

void action(Query _q, int _idx, SysDimension _sysDim, SysDim _dimValue)
{
    QueryRun        qr = new QueryRun(this.initQuery());
    LedgerTrans     ledgerTrans;
    SysDImension    sysDimGroup;

    sysDimGroup = conPeek(conDimensions, _idx);

    qr.query().dataSourceTable(tablenum(LedgerTrans)).addSortField(fieldId2Ext(fieldnum(LedgerTrans, Dimension), sysDimGroup + 1));
    qr.query().dataSourceTable(tablenum(LedgerTrans)).addRange(fieldId2Ext(fieldnum(LedgerTrans, Dimension), _sysDim + 1)).value(queryValue(_dimValue));

    while (qr.next())
    {
        ledgerTrans = qr.get(tablenum(LedgerTrans));

        ....doSomething....

        if (_idx <= conLen(conDimensions))
        {
            this.action(qr.query(), _idx + 1, sysDimGroup, ledgerTrans.Dimension[sysDimGroup + 1]);
        }
    }
}
Старый 04.12.2007, 14:57   #24  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Сообщение от Tiruvileijadal' Посмотреть сообщение
Слушайте, ну не могу я одна это сообразить... Уже мозги в рекурсию вошли
Вот есть у меня контейнер, в котором лежат номера отмеченных пользователем аналитик. Превый номер - самая главная аналитика, последний - самая участвующая. С помощью кода, любезно предоставленного Dron AKA andy, я смогу создать запрос с первой цифрой из контейнера. И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем? Чтоб при последней цифре контейнера это был последний цикл рекурсии? (По-моему, это я все для себя написала, но от помощи не откажусь)
Нпример удалять первый элемент каждый раз после запуска рекурсии и так до тех пора, пока контейнер не пустой
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 04.12.2007, 15:20   #25  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
Цитата:
Сообщение от Tiruvileijadal' Посмотреть сообщение
И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем?
Это не "вечный двигатель", это прогрессия
Зачем вызывать из цикла рекурсию? Рекурсия запускается один раз и работает пока не изживет себя. Именно в момент ее работы у Вас и должен построиться запрос.
Цитата:
Сообщение от blokva Посмотреть сообщение
Нпример удалять первый элемент каждый раз после запуска рекурсии и так до тех пора, пока контейнер не пустой
...и в рекурсивном методе проверять: если контейнер не пустой, то еще цикл.

Цитата:
Сообщение от Tiruvileijadal' Посмотреть сообщение
Нда, а еще нужно, чтобы табличные переменные были разные... Засада.
Можно так же передавать их в контейнере...
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)
Старый 05.12.2007, 08:52   #26  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Peter Savintsev, спасибо за идею реализации Чуть-чуть подправила код и вроде как все работает
ВСЕМ огромное сенкс за участие!!! Толпой как-то приятнее думать
__________________
MBS-Axapta 3.0 CIS SP3

Последний раз редактировалось Tiruvileijadal'; 05.12.2007 в 09:17. Причина: орфография
Старый 06.12.2007, 09:22   #27  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Все, силы иссякли, нервов нет, не могу понять почему не выбирает. В таблице MyTable есть данные с аналитиками. Сделала небольшую группировку по аналитикам, чтоб хоть примерно преставлять - что должно выводится в отчет. Получилось следующее:
Depart Center Managment - аналитика
(0) (1) (3) - индекс в Enum
ogk-01 002025
sug-01 002025
sug-01 002035
sug-28 005041
sug-28 005036 600812
Код программы:
X++:
Query initQuery()
{
    Query                   q = new Query();
    QueryBuildDataSource    qbds;
    qbds = q.addDataSource(tablenum(SUG_LedgerTransDimentionsDetails));
    qbds.orderMode(OrderMode::GroupBy);
    return q;
}
 
void SelDimens(Query _q, int _idx, SysDimension _sysDim, SysDim _dimValue, int  _i)
{
    QueryRun                qr = new QueryRun(this.initQuery());
    Dimensions              dim;
    SysDImension            sysDimGroup;
    ;
    num_count = 1;
   // numDomens - контейнер с номерами выбранных аналитик (1,2,4 в примере)
    sysDimGroup = conPeek(numDimens, _idx) - 1;
    // поле для выбора (как я понимаю)
    qr.query().dataSourceTable(tablenum(SUG_LedgerTransDimentionsDetails)).addSortField(fieldId2Ext(fieldnum(SUG_LedgerTransDimentionsDetails, Dimension), _i));
    // фильтр, по которому поле выше отбирают
    qr.query().dataSourceTable(tablenum(SUG_LedgerTransDimentionsDetails)).addRange(fieldId2Ext(fieldnum(SUG_LedgerTransDimentionsDetails, Dimension), _sysDim)).value(queryValue(_dimValue));
    while (qr.next())
    {
       ltvd1 = qr.get(tablenum(SUG_LedgerTransDimentionsDetails));
       select Description from dim where dim.Num == ltvd1.Dimension[_i]
                                      && dim.DimensionCode == sysDimGroup;
       medt.insertValue2(num_count, counter, dim.Description);
       medt.insertValue2(num_count+1, counter, int2str(_i));
       counter++;
        if (h <= conLen(numDimens))
        {
            h = _idx + 1;
            i = conPeek(numDimens, h);
            this.SelDimens(qr.query(), h, sysDimGroup, ltvd1.Dimension[_i], i);
        }
    }
}
Результатом работы этого кода - выбор только первый и второй уровень (т.е. Depart и Center). И даже если я знаю, что для определенных Depart и Center есть значение в Managment - while (qr.next()) проскакивает свой цикл, как буд-то там ничего не выбралось... Проверяю в дебагере значения переменных, получается, что SortField есть myTable.Dimension[4] и Range поле myTable.Dimension::Center = '005036'. Т.е. селект должен выполниться правильно, а он не выполняется
А еще бывают ситуации, когда у Depart нет Center, но есть Managment - вот тут цикл точно проскочит выборку и ничего не выдаст, а как сделать чтоб не проскочил?
Я уже подумываю о том, чтоб для каждого счета жестко забить аналитики и только по ним делать выборку и плевать на все... Вообще невозможно предусмотреть все ситуации.
__________________
MBS-Axapta 3.0 CIS SP3
Старый 06.12.2007, 09:25   #28  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Попробовала в Range вместо значения _sysdim вставить цифру any2int(_sysdim)+1 (по аналогии с SortField), думала в этом проблема - вообще ерунду выдает. Идеи кончились.
__________________
MBS-Axapta 3.0 CIS SP3
Старый 06.12.2007, 09:39   #29  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Перед qr.next() делайте
box::info(qr.query().datasourceNo(1).toString());

и сразу поймете, почему в 3 случае не работает
Старый 06.12.2007, 10:41   #30  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Иван, спасибо
Как я и думала - выбирается значение не из того вида аналитики (мое предыдущее сообщение). Но сейчас уже другая проблема возникла Не бывает, чтоб сразу раз и получилось
__________________
MBS-Axapta 3.0 CIS SP3
Старый 06.12.2007, 12:11   #31  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Пыталась искать на форуме, но не знаю как правильно сформулировать вопрос. В коде выше у меня в цикле запроса есть условие. Мне нужно сделать чтобы при else запрос возвращался на шаг назад (в предыдущие параметры выборки). Как это сделать?
__________________
MBS-Axapta 3.0 CIS SP3
Старый 06.12.2007, 12:25   #32  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Оказалось, что не с этим проблема...
__________________
MBS-Axapta 3.0 CIS SP3
Старый 06.12.2007, 12:56   #33  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Все зашибись работает (это уже окончательно), но как я писала в своем огромном сообщении - если есть 1-ая и 3-я аналитики, а 2-ой нету, то запрос на 3-ю не пойдет, а нужно, чтоб шел. В общем буду писать заново, придумывать огроменные коды, чтоб учесть все ситуации
Всем спасибо за помощь (еще раз)
__________________
MBS-Axapta 3.0 CIS SP3
Старый 06.12.2007, 17:11   #34  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Если я правильно понял текущую проблему, то она возникает в случае, если в таблице SUG_LedgerTransDimentionsDetails аналитики 1 и 3 непустые, а 2-я пустая. Тогда в указанном выше коде при обработке 2-й аналитики цикл не выполняется и, соответственно, до 3-й аналитики не доходит. Так?

Попробуйте в цикле присваивать локальной булевой переменной true, а после цикла проверять ее. Если она false, значит, цикл не выполнился и тогда вызывать метод SelDimens с пустым 4-м параметром:

X++:
this.SelDimens(qr.query(), h, sysDimGroup, "", i);
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Разница 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:05.