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