AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 04.12.2007, 14:23   #21  
Tiruvileijadal' ist offline
Tiruvileijadal'
Участник
Benutzerbild von Tiruvileijadal'
 
92 / 10 (1) +
Registriert seit: 15.03.2007
Ort: Сургут
Слушайте, ну не могу я одна это сообразить... Уже мозги в рекурсию вошли
Вот есть у меня контейнер, в котором лежат номера отмеченных пользователем аналитик. Превый номер - самая главная аналитика, последний - самая участвующая. С помощью кода, любезно предоставленного Dron AKA andy, я смогу создать запрос с первой цифрой из контейнера. И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем? Чтоб при последней цифре контейнера это был последний цикл рекурсии? (По-моему, это я все для себя написала, но от помощи не откажусь)
__________________
MBS-Axapta 3.0 CIS SP3
Alt 04.12.2007, 14:40   #22  
Tiruvileijadal' ist offline
Tiruvileijadal'
Участник
Benutzerbild von Tiruvileijadal'
 
92 / 10 (1) +
Registriert seit: 15.03.2007
Ort: Сургут
Нда, а еще нужно, чтобы табличные переменные были разные... Засада.
__________________
MBS-Axapta 3.0 CIS SP3
Alt 04.12.2007, 14:53   #23  
Peter Savintsev ist offline
Peter Savintsev
Участник
 
246 / 124 (5) +++++
Registriert seit: 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]);
        }
    }
}
Alt 04.12.2007, 14:57   #24  
blokva ist offline
blokva
Пенсионер
Benutzerbild von blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Registriert seit: 04.06.2003
Ort: Беларусь
Zitat:
Zitat von Tiruvileijadal' Beitrag anzeigen
Слушайте, ну не могу я одна это сообразить... Уже мозги в рекурсию вошли
Вот есть у меня контейнер, в котором лежат номера отмеченных пользователем аналитик. Превый номер - самая главная аналитика, последний - самая участвующая. С помощью кода, любезно предоставленного Dron AKA andy, я смогу создать запрос с первой цифрой из контейнера. И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем? Чтоб при последней цифре контейнера это был последний цикл рекурсии? (По-моему, это я все для себя написала, но от помощи не откажусь)
Нпример удалять первый элемент каждый раз после запуска рекурсии и так до тех пора, пока контейнер не пустой
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Alt 04.12.2007, 15:20   #25  
Silence ist offline
Silence
Участник
Benutzerbild von Silence
 
287 / 27 (1) +++
Registriert seit: 29.09.2004
Ort: г. Москва, Зеленоград
Zitat:
Zitat von Tiruvileijadal' Beitrag anzeigen
И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем?
Это не "вечный двигатель", это прогрессия
Зачем вызывать из цикла рекурсию? Рекурсия запускается один раз и работает пока не изживет себя. Именно в момент ее работы у Вас и должен построиться запрос.
Zitat:
Zitat von blokva Beitrag anzeigen
Нпример удалять первый элемент каждый раз после запуска рекурсии и так до тех пора, пока контейнер не пустой
...и в рекурсивном методе проверять: если контейнер не пустой, то еще цикл.

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

Geändert von Tiruvileijadal' (05.12.2007 um 09:17 Uhr) Grund: орфография
Alt 06.12.2007, 09:22   #27  
Tiruvileijadal' ist offline
Tiruvileijadal'
Участник
Benutzerbild von Tiruvileijadal'
 
92 / 10 (1) +
Registriert seit: 15.03.2007
Ort: Сургут
Все, силы иссякли, нервов нет, не могу понять почему не выбирает. В таблице 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
Alt 06.12.2007, 09:25   #28  
Tiruvileijadal' ist offline
Tiruvileijadal'
Участник
Benutzerbild von Tiruvileijadal'
 
92 / 10 (1) +
Registriert seit: 15.03.2007
Ort: Сургут
Попробовала в Range вместо значения _sysdim вставить цифру any2int(_sysdim)+1 (по аналогии с SortField), думала в этом проблема - вообще ерунду выдает. Идеи кончились.
__________________
MBS-Axapta 3.0 CIS SP3
Alt 06.12.2007, 09:39   #29  
kashperuk ist offline
kashperuk
Участник
Benutzerbild von kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.361 / 2084 (78) +++++++++
Registriert seit: 30.05.2004
Ort: Atlanta, GA, USA
Перед qr.next() делайте
box::info(qr.query().datasourceNo(1).toString());

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

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Разница 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 02:31 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.