segunda-feira, 11 de abril de 2011

DbTree recursiva 2


Na última postagem falei sobre a DbTree baseada em uma única tabela mas que tem infinitas hierarquias. Hoje irei postar a estrutura da tabela e o código principal para poder gerar a árvore.
Primeiramente temos a estrutura da tabela, a qual chamei de ZRA. Eu a fiz para funcionar no Protheus mas ela pode ser usada para qualquer linguagem:

ZRA_COD -> Caracter tamanho 6. Irá guarda o ID único do registro.(Tem que ser auto-incremento. No caso do Protheus eu uso o GetSXEnum("ZRA","ZRA_COD") )

ZRA_DESCRI -> Caracter tamnho 20. Terá a descrição do registro.

ZRA_PAI -> Caracter tamanho 6. Irá guarda o ID único do nó pai. É extremamente importante que este campo tenha as mesmas características do campo ZRA_COD.

ZRA_ATIVO -> Caracter tamanho 1. Criei esse campo como um tipo de "flag" que terá a letra "S" se o nó estiver ativo e "N" caso não. Possibilita desativar um nó sem ter que exclui-lo.

ZRA_BMP1 -> Caracter de tamanho 10. Guarda o nome do ícone que o nó terá.

ZRA_BMP2 -> Caracter de tamanho 10. Guarda o nome do ícone que o nó terá quando estiver aberto, ou seja, exibindo os nós filhos.


ZRA_NIVEL -> Numérico. No caso do Protheus, esse campo será preenchido com 1 caso seja um nó raiz ou 2 caso seja um nó filho de outro nó.

A figura tenta ilustrar genericamente o algoritmo da função principal e abaixo o código em advpl.

Static Function LoadTree(lAt)
Local cATivo := iif(lAt,"S / N","S")
Local aGetArea := GetArea()



if(Empty(ZRA->ZRA_PAI))
Return
EndIf
oTree1:BeginUpdate()
if(AllTrim(ZRA->ZRA_PAI) == "000000" .and. Alltrim(ZRA->ZRA_ATIVO) $ cAtivo )

if(oTree1:Total()>0 .and. nContNo > 0)
oTree1:EndTree()
EndIf

if(! oTree1:TreeSeek(ZRA->ZRA_COD))
oTree1:AddTree(ZRA->ZRA_DESCRI + iif(Alltrim(ZRA->ZRA_ATIVO)=="N"," [DESATIVADO]","")+Space(24),.T.,"FOLDER5","FOLDER6",,,ZRA->ZRA_COD)
EndIf

Elseif(Alltrim(ZRA->ZRA_ATIVO) $ cAtivo)
if(! oTree1:TreeSeek(ZRA->ZRA_COD))
if oTree1:TreeSeek(ZRA->ZRA_PAI)
oTree1:AddItem(ZRA->ZRA_DESCRI + iif(Alltrim(ZRA->ZRA_ATIVO)=="N"," [DESATIVADO]","")+Space(24),ZRA->ZRA_COD,iif(Alltrim(ZRA->ZRA_ATIVO)=="N","F5_VERM","GEOTRECHO"),,,,2)
EndIf
EndIf

EndIf


nContNo++
ZRA->(DbSkip())
if(ZRA->(EOF()))
nContNo := 0
oTree1:EndTree()
RestArea(aGetArea)
oTree1:EndUpdate()
Return
EndIf
LoadTree(lShowDe)

Return

Nenhum comentário:

Postar um comentário