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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.02.2007, 11:46   #1  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Lightbulb Выбрать все элементы рекурсией
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  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
для получения списка служит функция:
X++:
 ListSub = (ZG_HRMOrganization::getOrganizationChildren(ZG_HRMOrganizationType::Line, emplTableFind.hrmOrganizationId) );
В ней нужно менять тоько emplTableFind.hrmOrganizationId, для выбора по новой ветви
Старый 09.02.2007, 13:30   #3  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
если пригодится... мы создали свою функцию, которая учитывала вложенность подразделений
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  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Блин комп глючит...
Тему создал, а ответы вот до 14:30 не мог просмотреть...
Так, что надеятся неначто было... Сам с алгоритмом тупил сидел...
Но в итоге сделал всетаки...
Старый 09.02.2007, 14:44   #5  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
но не повторяющиеся...
как реализовал?
Старый 09.02.2007, 14:56   #6  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
ща немного подправлю и скину...
Старый 09.02.2007, 15:04   #7  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,252 / 980 (37) +++++++
Регистрация: 03.04.2002
Вы осторожнее с рекурсией. В аксапте есть ограничение на количество вложенных вызовов. Начнет вылетать без указания причины, замучаетесь дебагером 400 итераций проходить
__________________
Isn't it nice when things just work?
Старый 09.02.2007, 15:14   #8  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Короче получилось так... но так нельзя програмить... Если списки очень большие, то будет долго выполняться...Но для относительно небольших сойдет пока...
Возможно еще где-то переменные лишние висят...Да и работу с массивом можно оптимизировать...
Вообщем вот этот громоздкий код:
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:17   #9  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Если info раскоментировать, то получится подробный анализ, кто - откуда
Старый 09.02.2007, 15:17   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
действительно,
X++:
    int i;
    void iter()
    {
        i++;
        if (i<1000)
        iter();
    }
    ;
    iter();
    print i;
    pause;
выдает "переполнение во внутреннем стеке исполнения кода" причем как раз i = 400. С чего бы это?
Старый 09.02.2007, 15:20   #11  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Кстати там в конце самом нужно поставить еще одну "}"
Старый 09.02.2007, 15:35   #12  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Короче получилось так...
точно подмечено
Старый 09.02.2007, 18:48   #13  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Ну да... зато результат нужный выдает...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
HRM,склонение ФИО и все все все OmenSore DAX: Функционал 22 09.02.2009 17:08
Как скрыть лишние DataSource у кнопки "Выбрать" Poleax DAX: Программирование 14 24.07.2008 11:43
как посмотреть все weblet'ы в системе (3.0)? yooshi DAX: Функционал 3 08.11.2005 17:10
Крякозябры в Аксапте! Все уже перепробовал((( StoneRoller DAX: Администрирование 28 22.09.2003 16:30
Основные элементы КИС Rafael DAX: Прочие вопросы 1 27.12.2001 15:03
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:41.