|
09.02.2007, 11:46 | #1 |
Участник
|
Выбрать все элементы рекурсией
X++: EmplTable EmplTableFind; list ListSub = new list(types::String); listIterator it; EmplTableFind = EmplTable::findUserId("LMA"); ListSub = (ZG_HRMOrganization::getOrganizationChildren(ZG_HRMOrganizationType::Line, emplTableFind.hrmOrganizationId) ); //Выводим список it = new listIterator (ListSub); while (it.more()) { //вывод в текстовое поле it.next(); } AA ББ ВВ emplTableFind.hrmOrganizationId - изначально оно соделжит к примеру значение АБ. При выполнении этой процедуры в лист заносится список, который выглядит примерно так: AA ББ ВВ Потом нужно выполнить эту процедуру по каждому из занесенных значений в лист. т.е.: AA ББ ВВ Каждая из этих строк вернет еще какие-то комбинации слов, по ним тоже нужно пройтись. Нужно сделать так, чтобы был рекурсивный обход по каждому из полученных элементов до тех пор пока не будет возвращено пустое значение по всем конечным ветвям. В итоге лист должен содердать все элементы дерева, но не повторяющиеся... А теперь самое главное... Как это реализовать? |
|
09.02.2007, 11:50 | #2 |
Участник
|
для получения списка служит функция:
X++: ListSub = (ZG_HRMOrganization::getOrganizationChildren(ZG_HRMOrganizationType::Line, emplTableFind.hrmOrganizationId) ); |
|
09.02.2007, 13:30 | #3 |
MCTS
|
если пригодится... мы создали свою функцию, которая учитывала вложенность подразделений
X++: void organizationHierarchyOutput( RPayHRMOrganizationId _rpayHRMOrganization = "" ) { RHRMStaffList rhrmStaffList ; RPayHRMOrganization rPayHRMOrganization ; PersonTitleTable personTitleTable ; ; while select rPayHRMOrganization order by hrmOrganizationId asc where rPayHRMOrganization.parentOrganizationId == _rpayHRMOrganization { while select rhrmStaffList order by rhrmSortingCode asc where rhrmStaffList.startDate == staffListHeader.StartDate && rhrmStaffList.hrmOrganizationId == rPayHRMOrganization.hrmOrganizationId { staffListOutput( rhrmStaffList ) ; } organizationHierarchyOutput( rPayHRMOrganization.hrmOrganizationId ) ; } } |
|
09.02.2007, 14:33 | #4 |
Участник
|
Блин комп глючит...
Тему создал, а ответы вот до 14:30 не мог просмотреть... Так, что надеятся неначто было... Сам с алгоритмом тупил сидел... Но в итоге сделал всетаки... |
|
09.02.2007, 14:44 | #5 |
MCTS
|
Цитата:
но не повторяющиеся...
|
|
09.02.2007, 14:56 | #6 |
Участник
|
ща немного подправлю и скину...
|
|
09.02.2007, 15:14 | #7 |
Участник
|
Короче получилось так... но так нельзя програмить... Если списки очень большие, то будет долго выполняться...Но для относительно небольших сойдет пока...
Возможно еще где-то переменные лишние висят...Да и работу с массивом можно оптимизировать... Вообщем вот этот громоздкий код: X++: void clicked() { str arrSub[]; int a=1;//размерность массива int c=1,d=1; int b; int OutLoadArr,OutLoadArrF; EmplTable EmplTableFind; list ListSub, ListSub2 = new list(types::String); listIterator it, it2; ; super(); StaticTextPodch.text(""); EmplTableFind = EmplTable::findUserId("ZLD"); //************************************************************************************************************************* //************************************************** Получаем родительские списки ***************************************** ListSub = (ZG_HRMOrganization::getOrganizationChildren(ZG_HRMOrganizationType::Line, emplTableFind.hrmOrganizationId) ); //Выводим список it = new listIterator (ListSub); while (it.more()) { arrSub[a] = it.value(); a++; it.next(); } //info("первый обход выгрузили = "+ int2str(a)); //************************************************************************************************************************* //************************************************* Продвигаемся вниз по ветвям ******************************************* while (c > 0) { d = a; for (b=c; b<=d; b++) { //info("смотрим по списку " + ArrSub[b]); if (ArrSub[b] == "") { // info("ПУСТОЙ СИМВОЛ"); break; } ListSub2 = (ZG_HRMOrganization::getOrganizationChildren(ZG_HRMOrganizationType::Line, arrSub[b])); //Выводим список it2 = new listIterator (ListSub2); while (it2.more()) { arrSub[a] = it2.value(); // info("Находим " + ArrSub[a]); a++; it2.next(); } c=a-d;//на сколько увеличелся список c=a-c;//не обработанные элементы начинаются с этого значения } //info("Второй тоже = "+ int2str(a)); // убираем повторяющиеся записи for(OutLoadArr=1; OutLoadArr <= a-1; OutLoadArr++) { for(OutLoadArrF=OutLoadArr+1; OutLoadArrF <= a; OutLoadArrF++) { if(ArrSub[OutLoadArr] == ArrSub[OutLoadArrF]) { ArrSub[OutLoadArr] = ""; } } } //Выводим список for (OutLoadArr=1; OutLoadArr <= a; OutLoadArr++) { StaticTextPodch.text(StaticTextPodch.text() +", "+ arrSub[OutLoadArr]); } break; } |
|
09.02.2007, 15:04 | #8 |
NavAx
|
Вы осторожнее с рекурсией. В аксапте есть ограничение на количество вложенных вызовов. Начнет вылетать без указания причины, замучаетесь дебагером 400 итераций проходить
__________________
Isn't it nice when things just work? |
|
09.02.2007, 15:17 | #9 |
Участник
|
Если info раскоментировать, то получится подробный анализ, кто - откуда
|
|
09.02.2007, 15:17 | #10 |
MCTS
|
действительно,
X++: int i; void iter() { i++; if (i<1000) iter(); } ; iter(); print i; pause; |
|
09.02.2007, 15:20 | #11 |
Участник
|
Кстати там в конце самом нужно поставить еще одну "}"
|
|
09.02.2007, 15:35 | #12 |
MCTS
|
Цитата:
Короче получилось так...
|
|
09.02.2007, 18:48 | #13 |
Участник
|
Ну да... зато результат нужный выдает...
|
|