none
Recursividade, como mostrar ? RRS feed

  • Pergunta

  • Pessoal, não sei se o termo é exatamente este "recursividade", mas o que eu preciso é o seguinte.

    tenho uma tabela com itens assim:

    - Código(autonumeração)
    - Item
    - Código vinculado

    Ela seria populada assim:

    1 - Menu 1 - 0
    2 - Menu 2 - 0
    3 - Menu 3 - 0
    4 - SubMenu 1 - 1
    5 - SubMenu 2 - 1

    Isto significa que tenho 3 menus principais e dois submenus vinculados ao menu de código "1", ou seja o "menu 1"

    Tentei montar isto num tree view mas não deu certo pq ele precisa de um xml

    Isto é a minha idéia se alguém tiver uma idéia melhor me fale pois estou aberto a sugestões..

    Em asp eu tinha algumas funções que usava, para mostrar os menus recursivos:

    public function STRedMenuVt

    redim MenuVt(0,5)

    sqlTemp = "select count(*) as total from STMenus"

    set rsTEMP = connTEMP.execute(sqlTemp)

    redim MenuVt(rsTEMP("total"),5)

    end function

     

     

    public function STMontMenu(codigo)

    sqlTEMP = "select STCodMenu, STCodMenuRel, STCodMenuIdioma, STCodTemplate, "

    sqlTEMP = sqlTEMP & " (select STMenuIdioma from STMenusIdioma where STCodMenuIdioma=STMenus.STCodMenuIdioma) as STMenuIdioma, "

    sqlTEMP = sqlTEMP & " STMenu,STMenuOrd, STMenuAtivo, logData,STMenuLogado,STMenuLayout, STMenuEstatico "

    sqlTEMP = sqlTEMP & " from STMenus "

    sqlTEMP = sqlTEMP & " where STCodMenuRel="& codigo

    if STCodMenuTemp <> "" then

    sqlTEMP = sqlTEMP & " and STCodMenu <> "& STCodMenuTemp

    end if

    sqlTEMP = sqlTEMP & " order by STMenuOrd "

    set rsTEMP = connTEMP.execute(sqlTEMP)

    if not rsTEMP.eof then

    do while not rsTEMP.eof

    MenuVt(STContadorMenu,0) = rsTEMP("STMenu")

    MenuVt(STContadorMenu,1) = rsTEMP("STCodMenu")

    if cdbl( rsTEMP("STCodMenuRel") ) = 0 then

    MenuVt(STContadorMenu,2) = 1

    else

    session("STWidth") = 1

    call STContMenu(rsTEMP("STCodMenuRel"), session("STWidth"))

    MenuVt(STContadorMenu,2) = session("STWidth")

    end if

    MenuVt(STContadorMenu,3) = rsTEMP("STMenuOrd")

    MenuVt(STContadorMenu,4) = rsTEMP("STCodMenuRel")

    MenuVt(STContadorMenu,5) = rsTEMP("STCodTemplate")

    STContadorMenu = STContadorMenu + 1

    call STMontMenu(rsTEMP("STCodMenu"))

    rsTEMP.MoveNext

    Loop

    end if

    end function

    public function STContMenu(codigo,x)

    SET connTEMP = Server.CreateObject("ADODB.connection")

    connTEMP.Open session("DSNCliente")

    sqlTEMP = "select STcodMenuRel from STMenus where STCodMenu="& codigo

    if STCodMenuTemp <> "" then

    sqlTEMP = sqlTEMP & " and STCodMenu <> "& STCodMenuTemp

    end if

    sqlTEMP = sqlTEMP & " order by STMenuOrd"

    set rsTEMP = connTEMP.execute(sqlTEMP)

    if not rsTEMP.eof then

    do while not rsTEMP.eof

    x = x + 1

    session("STWidth") = x

    call STContMenu(rsTEMP("STCodMenuRel"),x)

    rsTEMP.MoveNext

    Loop

    end if

    end function

     

    segunda-feira, 15 de janeiro de 2007 19:40

Respostas

  • Alex,

    Recursividade é a ação de uma função chamar a si mesma, algo assim:


    void CriaMenu(){
      Menu objMenu = new Menu();

      for(int index = 0; index < dv.Tables.Rows.Count; index++){
        if( Convert.ToInt32(linha["CodigoVinculado"]) == 0){
            ItemMenu objItemMenu = new ItemMenu();
            objMenu.Id = Convert.ToInt32(dv[index]["codigo"]);
            .
            .
            .
            objMenu.Add(objItemMenu);
        }
        else{
            ItemMenu objItemMenu = new ItemMenu();
            objMenu.Id = Convert.ToInt32(dv[index]["codigo"]);
            .
            .
            .
           objMenu[Convert.ToInt32(dv[index]["codigo"])].Add(objItemNenu);
       }
      }
    }

    Dessa forma vc não precisa usar recursividade pq sua select é bem simples.
    Eu tive que fazer algo parecido por isso o código agora o exemplo supoe que vc tenha um objeto Menu onde neste objeto vc tenha uma collection de itensMenu onde cada objeto de itens Menu tenha um objeto itemMenu.

    Dessa forma funciona para menu de um nivel como oq seu exemplo, para funcionar para N niveis ai sim vc teria q usar uma recursividade. Para utilizar a recursividade vc teria q ter uma funcao recursiva q busca na collection objetos ItemMenu um objeto especifico ItemMenu e adiciona nele o item novo.


    Espero ter ajudado.
    terça-feira, 16 de janeiro de 2007 12:21

Todas as Respostas

  • Alex,

    Recursividade é a ação de uma função chamar a si mesma, algo assim:


    void CriaMenu(){
      Menu objMenu = new Menu();

      for(int index = 0; index < dv.Tables.Rows.Count; index++){
        if( Convert.ToInt32(linha["CodigoVinculado"]) == 0){
            ItemMenu objItemMenu = new ItemMenu();
            objMenu.Id = Convert.ToInt32(dv[index]["codigo"]);
            .
            .
            .
            objMenu.Add(objItemMenu);
        }
        else{
            ItemMenu objItemMenu = new ItemMenu();
            objMenu.Id = Convert.ToInt32(dv[index]["codigo"]);
            .
            .
            .
           objMenu[Convert.ToInt32(dv[index]["codigo"])].Add(objItemNenu);
       }
      }
    }

    Dessa forma vc não precisa usar recursividade pq sua select é bem simples.
    Eu tive que fazer algo parecido por isso o código agora o exemplo supoe que vc tenha um objeto Menu onde neste objeto vc tenha uma collection de itensMenu onde cada objeto de itens Menu tenha um objeto itemMenu.

    Dessa forma funciona para menu de um nivel como oq seu exemplo, para funcionar para N niveis ai sim vc teria q usar uma recursividade. Para utilizar a recursividade vc teria q ter uma funcao recursiva q busca na collection objetos ItemMenu um objeto especifico ItemMenu e adiciona nele o item novo.


    Espero ter ajudado.
    terça-feira, 16 de janeiro de 2007 12:21
  • Olá Diego

    Ajudou sim.. era mais ou menos isto que eu queria fazer.. vou tentar fazer uns testes e ai eu volto a postar se tiver dúvidas novamente.

     

    Abraço
    Alex

    terça-feira, 16 de janeiro de 2007 12:27