04.12.2007, 14:23 | #21 |
Участник
|
Слушайте, ну не могу я одна это сообразить... Уже мозги в рекурсию вошли
Вот есть у меня контейнер, в котором лежат номера отмеченных пользователем аналитик. Превый номер - самая главная аналитика, последний - самая участвующая. С помощью кода, любезно предоставленного Dron AKA andy, я смогу создать запрос с первой цифрой из контейнера. И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем? Чтоб при последней цифре контейнера это был последний цикл рекурсии? (По-моему, это я все для себя написала, но от помощи не откажусь)
__________________
MBS-Axapta 3.0 CIS SP3 |
|
04.12.2007, 14:40 | #22 |
Участник
|
Нда, а еще нужно, чтобы табличные переменные были разные... Засада.
__________________
MBS-Axapta 3.0 CIS SP3 |
|
04.12.2007, 14:53 | #23 |
Участник
|
Что-то типа такого (в контейнере 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 |
Пенсионер
|
Цитата:
Сообщение от Tiruvileijadal'
Слушайте, ну не могу я одна это сообразить... Уже мозги в рекурсию вошли
Вот есть у меня контейнер, в котором лежат номера отмеченных пользователем аналитик. Превый номер - самая главная аналитика, последний - самая участвующая. С помощью кода, любезно предоставленного Dron AKA andy, я смогу создать запрос с первой цифрой из контейнера. И дальше в while я должна вызывать уже свой рекурсивный метод с какими-то параметрами, и в нем еще эти параметры менять следуя параметрам запроса и цифрам из контейнера. А как сделать, чтоб это не было вечным двигателем? Чтоб при последней цифре контейнера это был последний цикл рекурсии? (По-моему, это я все для себя написала, но от помощи не откажусь)
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
04.12.2007, 15:20 | #25 |
Участник
|
Цитата:
Зачем вызывать из цикла рекурсию? Рекурсия запускается один раз и работает пока не изживет себя. Именно в момент ее работы у Вас и должен построиться запрос. Цитата:
Можно так же передавать их в контейнере...
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) |
|
05.12.2007, 08:52 | #26 |
Участник
|
Peter Savintsev, спасибо за идею реализации Чуть-чуть подправила код и вроде как все работает
ВСЕМ огромное сенкс за участие!!! Толпой как-то приятнее думать
__________________
MBS-Axapta 3.0 CIS SP3 Последний раз редактировалось Tiruvileijadal'; 05.12.2007 в 09:17. Причина: орфография |
|
06.12.2007, 09:22 | #27 |
Участник
|
Все, силы иссякли, нервов нет, не могу понять почему не выбирает. В таблице 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, но есть Managment - вот тут цикл точно проскочит выборку и ничего не выдаст, а как сделать чтоб не проскочил? Я уже подумываю о том, чтоб для каждого счета жестко забить аналитики и только по ним делать выборку и плевать на все... Вообще невозможно предусмотреть все ситуации.
__________________
MBS-Axapta 3.0 CIS SP3 |
|
06.12.2007, 09:25 | #28 |
Участник
|
Попробовала в Range вместо значения _sysdim вставить цифру any2int(_sysdim)+1 (по аналогии с SortField), думала в этом проблема - вообще ерунду выдает. Идеи кончились.
__________________
MBS-Axapta 3.0 CIS SP3 |
|
06.12.2007, 09:39 | #29 |
Участник
|
Перед qr.next() делайте
box::info(qr.query().datasourceNo(1).toString()); и сразу поймете, почему в 3 случае не работает |
|
06.12.2007, 10:41 | #30 |
Участник
|
Иван, спасибо
Как я и думала - выбирается значение не из того вида аналитики (мое предыдущее сообщение). Но сейчас уже другая проблема возникла Не бывает, чтоб сразу раз и получилось
__________________
MBS-Axapta 3.0 CIS SP3 |
|
06.12.2007, 12:11 | #31 |
Участник
|
Пыталась искать на форуме, но не знаю как правильно сформулировать вопрос. В коде выше у меня в цикле запроса есть условие. Мне нужно сделать чтобы при else запрос возвращался на шаг назад (в предыдущие параметры выборки). Как это сделать?
__________________
MBS-Axapta 3.0 CIS SP3 |
|
06.12.2007, 12:25 | #32 |
Участник
|
Оказалось, что не с этим проблема...
__________________
MBS-Axapta 3.0 CIS SP3 |
|
06.12.2007, 12:56 | #33 |
Участник
|
Все зашибись работает (это уже окончательно), но как я писала в своем огромном сообщении - если есть 1-ая и 3-я аналитики, а 2-ой нету, то запрос на 3-ю не пойдет, а нужно, чтоб шел. В общем буду писать заново, придумывать огроменные коды, чтоб учесть все ситуации
Всем спасибо за помощь (еще раз)
__________________
MBS-Axapta 3.0 CIS SP3 |
|
06.12.2007, 17:11 | #34 |
Участник
|
Если я правильно понял текущую проблему, то она возникает в случае, если в таблице SUG_LedgerTransDimentionsDetails аналитики 1 и 3 непустые, а 2-я пустая. Тогда в указанном выше коде при обработке 2-й аналитики цикл не выполняется и, соответственно, до 3-й аналитики не доходит. Так?
Попробуйте в цикле присваивать локальной булевой переменной true, а после цикла проверять ее. Если она false, значит, цикл не выполнился и тогда вызывать метод SelDimens с пустым 4-м параметром: X++: this.SelDimens(qr.query(), h, sysDimGroup, "", i); |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Разница NotInTTS и Found | 6 | |||
Фильтр по пустому Dimension[x] в select | 3 | |||
Вопрос про Demand Planner | 4 | |||
select group by | 10 | |||
group , но не by | 9 |
|