Para Crear una Jerarquia Dinamica a partir de una tabla Z en R3 o BW , tiene que tener una estructura con el ID/TEXTO/NODO(es o no)/PADRE(ID) . Una vez que tenemos la tabla creamos la fuente Z en base a esa vista .
Ya en BW , creamos el DSO con la siguiente estructura :
La función la detallamos al final :
Una vez que llenamos el DSO , realizamos la Transformación a la JErarquia. Si dumpea es porque faltan activar objetos del sistema. Verificar con RSD5/6 y activar con el repositorio en la RSA1. Por debug se pueden ver los objetos que faltan activar .
La estructura debe quedar de la siguiente manera en BW :
La tabla inicial Z :
La función Z :
FUNCTION zbwbi010_jerar_multi.
*"----------------------------------------------------------------------
*"*"Interfase local
*" CHANGING
*" REFERENCE(T_TABLA)
*"----------------------------------------------------------------------
DATA : lt_table TYPE _ty_t_tg_1.
DATA : lt_aux TYPE _ty_t_tg_1..
FIELD-SYMBOLS : TYPE _ty_s_tg_1.
DATA : lv_nodeid TYPE i.
DATA : wa_aux TYPE _ty_s_tg_1.
break c04748.
*-----------------------------------------------------
lt_table = t_tabla.
SORT lt_table BY /bic/zparentc ASCENDING.
*1)NODEID
*2)MARCAR LOS HIERNODE Y OBJECT
LOOP AT lt_table ASSIGNING .
lv_nodeid = lv_nodeid + 1.
**--Auxiliares
* InfoObject: ZHIENM HIENM.
-/bic/zhienm = 'CONCEPTO_H'.
* InfoObject: ZNODEID NODEID.
-/bic/znodeid = lv_nodeid .
* InfoObject: ZINFOOBJE INFOOBJECT.
IF -/bic/zinfoobje IS NOT INITIAL.
-/bic/zinfoobje = '0HIER_NODE'.
ELSE.
-/bic/zinfoobje = 'ZCONCEPT1'.
ENDIF.
AT FIRST.
-/bic/zparentid = 0.
-/bic/zlevel = 1.
-/bic/znextid = 0.
-/bic/zchildid = 2.
ENDAT.
* TO
-/bic/zdateto = '99991231'.
* InfoObject: ZDATEFROM DATEFROM.
-/bic/zdatefrom = sy-datum.
-/bic/zlangu = 'S'.
* InfoObject: ZHIENM HIENM.
-/bic/zhienm = 'CONCEPTO_H'.
* InfoObject: ZNODEID NODEID.
-/bic/znodeid = lv_nodeid .
AT LAST.
-/bic/znextid = 0.
ENDAT.
* APPEND TO result_package .
ENDLOOP.
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/znodename ASCENDING.
*3)PARENTID: CON_TOT --> PONER EL PARENTID EN TODOS
LOOP AT lt_table ASSIGNING .
*---PARENTID
READ TABLE lt_aux INTO wa_aux
WITH KEY /bic/znodename = -/bic/zparentc
BINARY SEARCH.
IF sy-subrc EQ 0.
-/bic/zparentid = wa_aux-/bic/znodeid.
ELSE.
-/bic/zparentid = 0.
ENDIF.
ENDLOOP.
*4)CHILDID : POR QUIEN TIENE EL PARENTID , SOLO 1
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/zparentid /bic/znodeid ASCENDING.
LOOP AT lt_table ASSIGNING .
*---PARENTID
READ TABLE lt_aux INTO wa_aux
WITH KEY /bic/zparentid = -/bic/znodeid
BINARY SEARCH.
IF sy-subrc EQ 0.
-/bic/zchildid = wa_aux-/bic/znodeid.
ELSE.
-/bic/zchildid = 0.
ENDIF.
ENDLOOP.
*5)NEXTID : NEXTID
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/zparentid /bic/znodeid ASCENDING.
LOOP AT lt_table ASSIGNING .
*---NEXTID
LOOP AT lt_table INTO wa_aux WHERE /bic/zparentid EQ -/bic/zparentid AND
/bic/znodeid NE -/bic/znodeid AND
/bic/znextid EQ ''.
-/bic/znextid = wa_aux-/bic/znodeid.
EXIT.
ENDLOOP.
IF sy-subrc NE 0.
-/bic/znextid = 0.
ENDIF.
ENDLOOP.
*6)LEVEL : LEVEL
DO 5 TIMES. "5 NIVELES
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/znodeid ASCENDING.
LOOP AT lt_table ASSIGNING .
AT FIRST.
CONTINUE.
ENDAT.
*---LEVEL
READ TABLE lt_aux INTO wa_aux
WITH KEY /bic/znodeid = -/bic/zparentid
BINARY SEARCH.
IF sy-subrc EQ 0.
-/bic/zlevel = wa_aux-/bic/zlevel + 1.
ELSE.
-/bic/zlevel = 0.
ENDIF.
ENDLOOP.
ENDDO.
t_tabla = lt_table.
ENDFUNCTION.
Ya en BW , creamos el DSO con la siguiente estructura :
Luego conectamos la fuente y el DSO con una transformación , en la cual metemos una función Z para el llenado del DSO. La función soporta multinivel (hasta 5).
Una vez que llenamos el DSO , realizamos la Transformación a la JErarquia. Si dumpea es porque faltan activar objetos del sistema. Verificar con RSD5/6 y activar con el repositorio en la RSA1. Por debug se pueden ver los objetos que faltan activar .
La estructura debe quedar de la siguiente manera en BW :
La tabla inicial Z :
La función Z :
FUNCTION zbwbi010_jerar_multi.
*"----------------------------------------------------------------------
*"*"Interfase local
*" CHANGING
*" REFERENCE(T_TABLA)
*"----------------------------------------------------------------------
DATA : lt_table TYPE _ty_t_tg_1.
DATA : lt_aux TYPE _ty_t_tg_1..
FIELD-SYMBOLS : TYPE _ty_s_tg_1.
DATA : lv_nodeid TYPE i.
DATA : wa_aux TYPE _ty_s_tg_1.
break c04748.
*-----------------------------------------------------
lt_table = t_tabla.
SORT lt_table BY /bic/zparentc ASCENDING.
*1)NODEID
*2)MARCAR LOS HIERNODE Y OBJECT
LOOP AT lt_table ASSIGNING .
lv_nodeid = lv_nodeid + 1.
**--Auxiliares
* InfoObject: ZHIENM HIENM.
-/bic/zhienm = 'CONCEPTO_H'.
* InfoObject: ZNODEID NODEID.
-/bic/znodeid = lv_nodeid .
* InfoObject: ZINFOOBJE INFOOBJECT.
IF -/bic/zinfoobje IS NOT INITIAL.
-/bic/zinfoobje = '0HIER_NODE'.
ELSE.
-/bic/zinfoobje = 'ZCONCEPT1'.
ENDIF.
AT FIRST.
-/bic/zparentid = 0.
-/bic/zlevel = 1.
-/bic/znextid = 0.
-/bic/zchildid = 2.
ENDAT.
* TO
-/bic/zdateto = '99991231'.
* InfoObject: ZDATEFROM DATEFROM.
-/bic/zdatefrom = sy-datum.
-/bic/zlangu = 'S'.
* InfoObject: ZHIENM HIENM.
-/bic/zhienm = 'CONCEPTO_H'.
* InfoObject: ZNODEID NODEID.
-/bic/znodeid = lv_nodeid .
AT LAST.
-/bic/znextid = 0.
ENDAT.
* APPEND TO result_package .
ENDLOOP.
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/znodename ASCENDING.
*3)PARENTID: CON_TOT --> PONER EL PARENTID EN TODOS
LOOP AT lt_table ASSIGNING .
*---PARENTID
READ TABLE lt_aux INTO wa_aux
WITH KEY /bic/znodename = -/bic/zparentc
BINARY SEARCH.
IF sy-subrc EQ 0.
-/bic/zparentid = wa_aux-/bic/znodeid.
ELSE.
-/bic/zparentid = 0.
ENDIF.
ENDLOOP.
*4)CHILDID : POR QUIEN TIENE EL PARENTID , SOLO 1
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/zparentid /bic/znodeid ASCENDING.
LOOP AT lt_table ASSIGNING .
*---PARENTID
READ TABLE lt_aux INTO wa_aux
WITH KEY /bic/zparentid = -/bic/znodeid
BINARY SEARCH.
IF sy-subrc EQ 0.
-/bic/zchildid = wa_aux-/bic/znodeid.
ELSE.
-/bic/zchildid = 0.
ENDIF.
ENDLOOP.
*5)NEXTID : NEXTID
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/zparentid /bic/znodeid ASCENDING.
LOOP AT lt_table ASSIGNING .
*---NEXTID
LOOP AT lt_table INTO wa_aux WHERE /bic/zparentid EQ -/bic/zparentid AND
/bic/znodeid NE -/bic/znodeid AND
/bic/znextid EQ ''.
-/bic/znextid = wa_aux-/bic/znodeid.
EXIT.
ENDLOOP.
IF sy-subrc NE 0.
-/bic/znextid = 0.
ENDIF.
ENDLOOP.
*6)LEVEL : LEVEL
DO 5 TIMES. "5 NIVELES
lt_aux[] = lt_table[].
SORT lt_aux[] BY /bic/znodeid ASCENDING.
LOOP AT lt_table ASSIGNING .
AT FIRST.
CONTINUE.
ENDAT.
*---LEVEL
READ TABLE lt_aux INTO wa_aux
WITH KEY /bic/znodeid = -/bic/zparentid
BINARY SEARCH.
IF sy-subrc EQ 0.
-/bic/zlevel = wa_aux-/bic/zlevel + 1.
ELSE.
-/bic/zlevel = 0.
ENDIF.
ENDLOOP.
ENDDO.
t_tabla = lt_table.
ENDFUNCTION.











No hay comentarios:
Publicar un comentario