viernes, 18 de marzo de 2016

BW - ABAP- CREAR JERARQUIA DINAMICA - Create Hierachy Dynamic BW

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 :


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).

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.









No hay comentarios:

Publicar un comentario