关于HR组织架构用visio来展现

这个博客讲述了如何利用SAP_BASIS报告RHSTRU00以及Visio来创建和展现HR组织架构。通过ABAP代码,实现了从SAP系统中获取数据并生成Visio图表,包括错误处理、数据结构和用户交互选项。此外,还提供了选择Visio导出的选项。

*&---------------------------------------------------------------------*
*& Report  rhstru00                                                    *
*&---------------------------------------------------------------------*
*& From SAP_BASIS Releases 6.20 report RHSTRU00 uses alv tree control. *
*& Old report is available under the name RHSTRU00_OLD.                *
*&---------------------------------------------------------------------*
REPORT  Y_TEST_HR_01 MESSAGE-ID PP                                .

TYPE-POOLS: ICON.

TABLES: OBJEC, T77EO, GDSTR, GDSET, PDSTR.

TYPES:  BEGIN OF T_NODE ,
           ID LIKE STRUC-SEQNR,
           PARENT LIKE STRUC-SEQNR,
           TREE_ID TYPE LVC_NKEY,
           TEXT(25),
           TEXT4(40),
           SHORT(14),
           OTYPE(2),
           REALO TYPE REALO,
           ISTAT(1),
           BEGDA(10),
           ENDDA(10),
           VISTAT(1),
           VBEGDA(10),
           VENDDA(10),
           PROZT(8),
           OBJID LIKE OBJEC-OBJID,
         END OF T_NODE.

TYPES:  BEGIN OF TYPE_TREC,
           KEY TYPE LVC_NKEY,
           ID  LIKE STRUC-SEQNR,
        END OF TYPE_TREC.

TYPES: BEGIN OF PARENT_STACK_LINE,
         LEVEL TYPE STRUC-LEVEL,
         ID LIKE STRUC-SEQNR,
       END OF PARENT_STACK_LINE.

*----------------------------------------------------------------------*
* error handling (for internal errors)
*----------------------------------------------------------------------*
* type for ABAP callstack
TYPES: BEGIN OF T_S_ABAP_CALLSTACK,
         MAINPROGRAM LIKE SY-REPID,
         INCLUDE LIKE SY-REPID,
         LINE TYPE I,
         EVENTTYPE LIKE ABDBG-LEVENTTYPE,
         EVENT LIKE ABDBG-LEVENT,
         FLAG_SYSTEM,
       END OF T_S_ABAP_CALLSTACK.

* variable for ABAP callstack
DATA: G_CALLSTACK TYPE STANDARD TABLE OF T_S_ABAP_CALLSTACK,
      G_CALLSTACK_WA TYPE T_S_ABAP_CALLSTACK.

* macro should never be called ;-)
DEFINE INTERNAL_ERROR.   "&1 action that lead to error
* get callstack
  CALL 'ABAP_CALLSTACK' ID 'DEPTH' FIELD 99
                        ID 'CALLSTACK' FIELD G_CALLSTACK.
* get current form/event
  READ TABLE G_CALLSTACK INTO G_CALLSTACK_WA INDEX 1.

  MESSAGE I001(AQ_AD_HOC) WITH G_CALLSTACK_WA-EVENT
                                   &1. "action.
END-OF-DEFINITION.


DATA: IT_NODE TYPE STANDARD TABLE OF T_NODE,
      IT_TAB  TYPE STANDARD TABLE OF T_NODE,
      WA_NODE TYPE T_NODE.

DATA: BEGIN OF WAOBJEC,
        STEXT LIKE OBJEC-STEXT,
        SHORT LIKE OBJEC-SHORT,
        REALO LIKE OBJEC-REALO,
        PLVAR LIKE OBJEC-PLVAR,
        OTYPE LIKE OBJEC-OTYPE,
        OBJID LIKE OBJEC-OBJID,
        BEGDA LIKE OBJEC-BEGDA,
        ENDDA LIKE OBJEC-ENDDA,
        ISTAT LIKE OBJEC-ISTAT,
        SEQNR LIKE STRUC-SEQNR,
      END OF WAOBJEC.

DATA: OK_CODE LIKE SY-UCOMM,
      SAVE_OK LIKE SY-UCOMM.

CLASS CL_GUI_OBJECT DEFINITION LOAD.

DATA: CONTROL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      ALV_TREE_CONTROL  TYPE REF TO CL_GUI_ALV_TREE,
      ALV_HTML_HEADER   TYPE REF TO CL_GUI_HTML_VIEWER,
      FIELDCATALOG      TYPE  STANDARD TABLE OF LVC_S_FCAT,
      HIERARCHY_HEADER  TYPE TREEV_HHDR.

DATA: LT_LIST_COMMENTARY TYPE SLIS_T_LISTHEADER,
      GS_VARIANT         TYPE DISVARIANT.

DATA: S_NODE TYPE LVC_NKEY.

DATA: OTYPE TYPE OTYPE.

DATA: ANSWER(1).

DATA: IT_TOOLBAR_EXCLUDING TYPE UI_FUNCTIONS.

DATA: EXCL_TAB TYPE TABLE OF SY-UCOMM.

DATA: IT_RECURSIONS TYPE STANDARD TABLE OF TYPE_TREC,
      EXIST_REC     TYPE FLAG_X.

DATA: REPID     LIKE SY-REPID,
      SEL_TABLE TYPE TABLE OF RSPARAMS.

DATA: G_OPTIMIZE_FLAG  TYPE FLAG VALUE ' ',               "note 768405
      G_OPTIMIZE_BUTTON TYPE SMP_DYNTXT.                    "#EC NEEDED

* parent handling
DATA: G_PARENT_STACK TYPE STANDARD TABLE OF PARENT_STACK_LINE,
      G_PARENT_STACK_WA TYPE PARENT_STACK_LINE.

DATA: LV_STRING TYPE STRING.
DATA: GX_ACC_MODE_ON TYPE ABAP_BOOL.

* Change On 2011-2-15
TYPES: BEGIN OF T_DATA,
        ID TYPE STRUC-SEQNR,
        PARENT TYPE STRUC-SEQNR,
        ONAME TYPE HRP1000-SHORT,
        SNAME TYPE HRP1000-SHORT,
        PNAME TYPE HRP1000-SHORT,
        ORGID TYPE HRP1000-OBJID,
        POSID TYPE HRP1000-OBJID,
        PERID TYPE HRP1000-OBJID,
        KNAME TYPE HRP1000-SHORT,
        KCCID TYPE HRP1000-OBJID,
        GRAPH TYPE I,
        IMAGEFILE TYPE CHAR40,
      END OF T_DATA.

DATA: GT_DATA TYPE STANDARD TABLE OF T_DATA.
DATA: WA_DATA TYPE T_DATA.

DATA: GV_VISIO_PATH TYPE STRING,
      GV_VISIO_PARA TYPE STRING.

* Objetos OLE
DATA: GV_APLICACION    TYPE OLE2_OBJECT. "Aplicacion Visio
DATA: GV_DOCUMENTOS    TYPE OLE2_OBJECT. "Coleccion de Documentos Visio
DATA: GV_DOCUMENTO     TYPE OLE2_OBJECT. "Documento Visio
DATA: GV_ADDON         TYPE OLE2_OBJECT. "Addon
DATA: GV_ADDONS        TYPE OLE2_OBJECT. "Addons
DATA: GV_SISTEMA       TYPE OLE2_OBJECT. "Addons

DATA: GV_TEMPLATE_PATH TYPE STRING.
DATA: GV_TEMPLATE_FILE TYPE STRING.
DATA: GV_DATA_FILE TYPE STRING.
DATA: GV_WORKDIR TYPE STRING.

DATA: GV_PARAMETRO_MACRO TYPE STRING,
      GV_ORGWIZ TYPE STRING VALUE 'OrgCWIZ'.

*----------------------------------------------------------------------*
*    SELECTION SCREEN                                                  *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1
                 WITH FRAME
                 TITLE TEXT-001.

* technical depth
PARAMETERS : TDEPTH LIKE GDSTR-TDEPTH.

* recursion check
PARAMETERS: RECURS LIKE PPPCH-RECURS DEFAULT ' ' AS CHECKBOX.

* perform rhstru00_old
PARAMETERS: OLD_REP TYPE FLAG_X  DEFAULT ' ' AS CHECKBOX.

* Change On 2011-2-15
PARAMETERS: VISIO TYPE FLAG_X  DEFAULT ' ' AS CHECKBOX.
PARAMETERS: VISIO_T TYPE FLAG_X  DEFAULT ' ' AS CHECKBOX.
PARAMETERS: DEMO_D TYPE FLAG_X  DEFAULT ' ' AS CHECKBOX.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 10.
PARAMETERS: VISIO_C1 RADIOBUTTON GROUP RA1. "###
SELECTION-SCREEN COMMENT 12(30) TEXT-901.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 10.
PARAMETERS: VISIO_C2 RADIOBUTTON GROUP RA1. "#####
SELECTION-SCREEN COMMENT 12(30) TEXT-902.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 10.
PARAMETERS: VISIO_D1 RADIOBUTTON GROUP RA1. "#######
SELECTION-SCREEN COMMENT 12(30) TEXT-903.
SELECTION-SCREEN END OF LINE.


SELECTION-SCREEN END OF BLOCK BLOCK1.

*PARAMETERS: ORG_PATH TYPE STRING DEFAULT 'C:\Program Files\Microsoft Office\Office12\ORGWIZ.EXE'.


*----------------------------------------------------------------------*
*    INITIALIZATION                                                    *
*----------------------------------------------------------------------*
INITIALIZATION.

* Structured evaluation
  $PCH$-ACCES = $STRUCTURED$.
  PCHTIMED = 'D'.

* initialize variables
  CLEAR: WAOBJEC,
         IT_NODE[].

  REPID = SY-REPID.

*----------------------------------------------------------------------*
*    START-OF-SELECTION                                                *
*----------------------------------------------------------------------*
START-OF-SELECTION.

* call rhstru00_old
  IF NOT OLD_REP IS INITIAL.
    CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
      EXPORTING
        CURR_REPORT     = REPID
      TABLES
        SELECTION_TABLE = SEL_TABLE
      EXCEPTIONS
        NOT_FOUND       = 1
        NO_REPORT       = 2
        OTHERS          = 3.
    IF SY-SUBRC <> 0.
      INTERNAL_ERROR 'FUNCTION RS_REFRESH_FROM_SELECTOPTIONS'. "#EC NOTEXT
    ENDIF.

    SUBMIT RHSTRU00_OLD
           WITH SELECTION-TABLE SEL_TABLE
           AND RETURN.
    EXIT.
  ENDIF.

* perform report for all objects?
  IF PCHOBJID[] IS INITIAL AND PCHSOBID[] IS INITIAL.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        TITLEBAR              = 'Information'(027)
        TEXT_QUESTION         = 'Programm ausf黨ren f黵 alle Objekte?'(015)
        DISPLAY_CANCEL_BUTTON = ' '
      IMPORTING
        ANSWER                = ANSWER
      EXCEPTIONS
        TEXT_NOT_FOUND        = 1
        OTHERS                = 2.
    IF SY-SUBRC <> 0.
      INTERNAL_ERROR 'FUNCTION POPUP_TO_CONFIRM' .          "#EC NOTEXT
    ENDIF.

*   back to selection screen
    IF ANSWER = '2'.
      CLEAR SEL_TABLE[].
      CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
        EXPORTING
          CURR_REPORT     = REPID
        TABLES
          SELECTION_TABLE = SEL_TABLE
        EXCEPTIONS
          NOT_FOUND       = 1
          NO_REPORT       = 2
          OTHERS          = 3.
      IF SY-SUBRC <> 0.
        INTERNAL_ERROR 'RS_REFRESH_FROM_SELECTOPTIONS'.     "#EC NOTEXT
      ENDIF.

      SUBMIT RHSTRU00
             VIA SELECTION-SCREEN
             WITH SELECTION-TABLE SEL_TABLE.
    ENDIF.
  ENDIF.

* Branchwise authority
  $PCH$-STRU_AUTHY = 'A'.
* Check recursions
  IF RECURS = 'X'.
    $PCH$-RECURS = 'X'.
  ENDIF.
* technical depth
  $PCH$-TDEPTH = TDEPTH.
  $PCH$-REFRE  = $OFF$.


*----------------------------------------------------------------------*
*    GET OBJEC                                                         *
*----------------------------------------------------------------------*
GET OBJEC.

  CLEAR WAOBJEC.

  MOVE-CORRESPONDING OBJEC TO WAOBJEC.
  WAOBJEC-SEQNR = STRUC-SEQNR.

* set the current id of the node
  WA_NODE-ID = STRUC-SEQNR.

* determine the correct parent id
  IF STRUC-PUP = 0.
*   there is no parent as this is the topmost node
    CLEAR: G_PARENT_STACK, G_PARENT_STACK_WA.
    WA_NODE-PARENT = STRUC-PUP.
*   add the current node as parent to the stack
    G_PARENT_STACK_WA-LEVEL = STRUC-LEVEL.
    G_PARENT_STACK_WA-ID = STRUC-SEQNR.
    INSERT G_PARENT_STACK_WA INTO G_PARENT_STACK
                             INDEX 1.
  ELSE.
*   there was a parent
    READ TABLE G_PARENT_STACK
         INDEX 1
         INTO G_PARENT_STACK_WA.
    IF SY-SUBRC = 0.
*there is a parent in the stack available now check if the levels match
      IF G_PARENT_STACK_WA-LEVEL >= STRUC-LEVEL.
*       delete the entries that are deeper in the structure
*       as they can not be the parents
        DELETE G_PARENT_STACK
               WHERE LEVEL >= STRUC-LEVEL.
      ENDIF.
*     read again the topmost entry from the stack
      READ TABLE G_PARENT_STACK
           INDEX 1
           INTO G_PARENT_STACK_WA.
      IF SY-SUBRC = 0.
*       there is a parent
        WA_NODE-PARENT = G_PARENT_STACK_WA-ID.
*       add the current node as parent to the stack
        G_PARENT_STACK_WA-LEVEL = STRUC-LEVEL.
        G_PARENT_STACK_WA-ID = STRUC-SEQNR.
        INSERT G_PARENT_STACK_WA INTO G_PARENT_STACK
                                 INDEX 1.
      ELSE.
*       there is no parent this is the topmost node others where skipped
        WA_NODE-PARENT = STRUC-PUP.
*       add the current node as parent to the stack
        G_PARENT_STACK_WA-LEVEL = STRUC-LEVEL.
        G_PARENT_STACK_WA-ID = STRUC-SEQNR.
        INSERT G_PARENT_STACK_WA INTO G_PARENT_STACK
                                 INDEX 1.
      ENDIF.
    ELSE.
*     there is no parent this is the topmost node others where skipped
      WA_NODE-PARENT = STRUC-PUP.
*     add the current node as parent to the stack
      G_PARENT_STACK_WA-LEVEL = STRUC-LEVEL.
      G_PARENT_STACK_WA-ID = STRUC-SEQNR.
      INSERT G_PARENT_STACK_WA INTO G_PARENT_STACK
                               INDEX 1.
    ENDIF.
  ENDIF.


* node text
  IF NOT WAOBJEC-STEXT IS INITIAL.
    WA_NODE-TEXT4 = WAOBJEC-STEXT.
  ELSE.
    WA_NODE-TEXT4 = WAOBJEC-SHORT.
  ENDIF.
  WA_NODE-SHORT = WAOBJEC-SHORT.

* Object key
  WA_NODE-OTYPE = WAOBJEC-OTYPE.
  WA_NODE-REALO = WAOBJEC-REALO.

* Status validity
  WA_NODE-ISTAT = WAOBJEC-ISTAT .
  WRITE WAOBJEC-BEGDA TO WA_NODE-BEGDA.
  WRITE WAOBJEC-ENDDA TO WA_NODE-ENDDA.

* Relation
  IF STRUC-VISTAT IS NOT INITIAL.
    WA_NODE-VISTAT = STRUC-VISTAT .
    WRITE STRUC-VBEGDA TO WA_NODE-VBEGDA.
    WRITE STRUC-VENDDA TO WA_NODE-VENDDA.
  ENDIF.

* Percentage
  IF STRUC-VISTAT IS NOT INITIAL AND STRUC-VPROZT IS NOT INITIAL.
    WRITE STRUC-VPROZT TO WA_NODE-PROZT(6) RIGHT-JUSTIFIED .
    WRITE ' %' TO  WA_NODE-PROZT+6(2).
  ENDIF.
  WA_NODE-OBJID = WAOBJEC-OBJID.

* Add icon when recursion
  IF NOT RECURS IS INITIAL AND
    STRUC-RFLAG = 'X'.
    WA_NODE-TEXT = TEXT-014.
    EXIST_REC = 'X'.
  ENDIF.

  APPEND WA_NODE TO IT_NODE.
  CLEAR  WA_NODE.
  CLEAR WAOBJEC.


*----------------------------------------------------------------------*
*    END-OF-SELECTION
*
*----------------------------------------------------------------------*
END-OF-SELECTION.

  IF VISIO = 'X'.

    PERFORM SUB_CREATE_DIR.

    IF VISIO_C1 = 'X'.
      IF DEMO_D = 'X'.
        PERFORM SUB_FILL_DEMO_DATA_C1.
      ELSE.
        PERFORM SUB_FILL_DATA_C1.
      ENDIF.
      PERFORM SUB_SET_PARAMETRO_MACRO2 USING GV_PARAMETRO_MACRO.
    ENDIF.

    IF VISIO_C2 = 'X'.
      IF DEMO_D = 'X'.
        PERFORM SUB_FILL_DEMO_DATA_C2.
      ELSE.
        PERFORM SUB_FILL_DATA_C2. "to do
      ENDIF.
      PERFORM SUB_SET_PARAMETRO_MACRO3 USING GV_PARAMETRO_MACRO.
    ENDIF.

    IF VISIO_D1 = 'X'.
      IF DEMO_D = 'X'.
        PERFORM SUB_FILL_DEMO_DATA. "to do
      ELSE.
        PERFORM SUB_FILL_DATA. "to do
      ENDIF.
      PERFORM SUB_SET_PARAMETRO_MACRO USING GV_PARAMETRO_MACRO.
    ENDIF.

*      PERFORM SUB_GET_TEMPLATE USING 'ORGCHART'.
    IF VISIO_D1 = 'X'.
      PERFORM SUB_DOWNLOAD_PHOTO.
    ENDIF.
*      PERFORM SUB_RUN_TEMPLATE. "delete by david because the photo can't be update automate
    PERFORM SUB_DOWNLOAD_DATA.
    PERFORM SUB_OPEN_DOCUMENT.

  ELSE.
    CALL SCREEN 100.
  ENDIF.


*---------------------------------------------------------------------*
*  MODULE STATUS_0100 OUTPUT
*---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.

* structural graphic is not available in web gui
  CALL FUNCTION 'GET_ACCESSIBILITY_MODE'
    IMPORTING
      ACCESSIBILITY = GX_ACC_MODE_ON
    EXCEPTIONS
      OTHERS        = 1.
  IF SY-SUBRC <> 0 OR
     GX_ACC_MODE_ON = ABAP_TRUE OR
     CL_GUI_OBJECT=>WWW_ACTIVE = 'X'.
    APPEND 'GSTR' TO EXCL_TAB.
  ENDIF.

* show button for recursions ?
  IF RECURS NE 'X'.
    APPEND 'SHRE' TO EXCL_TAB.
  ENDIF.

  PERFORM SET_OPTIMIZATION_TEXT.

  SET PF-STATUS 'MAIN' EXCLUDING EXCL_TAB.

  SET TITLEBAR 'MAINTITLE'.

*  CALL METHOD CL_GUI_HTML_VIEWER=>set_accdescription
*    EXPORTING
*      accdescription    = 'Header Data'
**    EXCEPTIONS
**      CNTL_ERROR        = 1
**      CNTL_SYSTEM_ERROR = 2
**      others            = 3
*          .
*  IF sy-subrc <> 0.
**   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
**              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  ENDIF.
*

ENDMODULE.                    "STATUS_0100 OUTPUT


*---------------------------------------------------------------------*
*  MODULE init_tree OUTPUT
*---------------------------------------------------------------------*
MODULE INIT_TREE OUTPUT.

* create container for alv_tree_control
  IF CONTROL_CONTAINER IS INITIAL.
    CREATE OBJECT CONTROL_CONTAINER
      EXPORTING
        CONTAINER_NAME    = 'CUSTOM_CONTROL'
      EXCEPTIONS
        CNTL_ERROR        = 1
        CNTL_SYSTEM_ERROR = 2
        CREATE_ERROR      = 3
        LIFETIME_ERROR    = 4
        OTHERS            = 5.
    IF SY-SUBRC <> 0.
      INTERNAL_ERROR 'CREATE OBJECT control_container' .    "#EC NOTEXT
    ENDIF.

    IF ALV_TREE_CONTROL IS INITIAL.
*     initialization-fieldcatalog
      PERFORM BUILD_FIELDCATALOG
              CHANGING FIELDCATALOG.
*     create info-table for html-header
      PERFORM BUILD_COMMENT
              USING LT_LIST_COMMENTARY.
*     create alv_tree control
      CREATE OBJECT ALV_TREE_CONTROL
        EXPORTING
          PARENT                      = CONTROL_CONTAINER
          NODE_SELECTION_MODE         = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
          ITEM_SELECTION              = 'X'
        EXCEPTIONS
          CNTL_ERROR                  = 1
          CNTL_SYSTEM_ERROR           = 2
          CREATE_ERROR                = 3
          LIFETIME_ERROR              = 4
          ILLEGAL_NODE_SELECTION_MODE = 5
          FAILED                      = 6
          ILLEGAL_COLUMN_NAME         = 7
          OTHERS                      = 8.
      IF SY-SUBRC <> 0.
        INTERNAL_ERROR 'CREATE OBJECT alv_tree_control' .   "#EC NOTEXT
      ENDIF.
*     define hierarchy header
      PERFORM DEFINE_HIERARCHY_HEADER
              CHANGING HIERARCHY_HEADER.
*     excluding function from toolbar
      APPEND CL_ALV_TREE_BASE=>MC_FC_CALCULATE
             TO IT_TOOLBAR_EXCLUDING.

      GS_VARIANT-REPORT = SY-REPID.

      CALL METHOD ALV_TREE_CONTROL->SET_TABLE_FOR_FIRST_DISPLAY
        EXPORTING
          IS_VARIANT           = GS_VARIANT
          I_SAVE               = 'A'
          I_DEFAULT            = 'X'
          IS_HIERARCHY_HEADER  = HIERARCHY_HEADER
          IT_LIST_COMMENTARY   = LT_LIST_COMMENTARY
          IT_TOOLBAR_EXCLUDING = IT_TOOLBAR_EXCLUDING
        CHANGING
          IT_OUTTAB            = IT_TAB
          IT_FIELDCATALOG      = FIELDCATALOG.
*     create hierarchy
      PERFORM FILL_COL_TREE .

*     Get Header Object
      CALL METHOD ALV_TREE_CONTROL->GET_HTML_HEADER_OBJECT
        CHANGING
          ER_HTML_HEADER = ALV_HTML_HEADER.

*     Set description
      IF ALV_HTML_HEADER IS BOUND.
        LV_STRING = 'Kopfdaten'(026).
        CALL METHOD ALV_HTML_HEADER->SET_ACCDESCRIPTION
          EXPORTING
            ACCDESCRIPTION    = LV_STRING
          EXCEPTIONS
            CNTL_ERROR        = 1
            CNTL_SYSTEM_ERROR = 2
            OTHERS            = 3.
        IF SY-SUBRC <> 0.
          INTERNAL_ERROR 'SET_ACCDESCRIPTION alv_html_header' . "#EC NOTEXT
        ENDIF.
      ELSE.
        INTERNAL_ERROR 'GET_HTML_HEADER_OBJECT alv_tree_control' . "#EC NOTEXT
      ENDIF.

      CALL METHOD ALV_TREE_CONTROL->FRONTEND_UPDATE.
      CALL METHOD CL_GUI_CFW=>FLUSH.
    ENDIF.
  ENDIF.

ENDMODULE.                    "init_tree


*---------------------------------------------------------------------*
*  MODULE user_command_0100 INPUT
*---------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.

  CALL METHOD CL_GUI_CFW=>DISPATCH.
  PERFORM GET_SEL_ITEM CHANGING S_NODE.

  CASE SAVE_OK.
    WHEN 'DESC'.
      PERFORM SHOW_OBJECT USING S_NODE.
    WHEN 'MAIN'.
      PERFORM MAINTENANCE_OBJECT USING S_NODE.
    WHEN 'SHRE'.
      PERFORM SHOW_RECURSION.
    WHEN 'STRU'.                       "New evaluation path
      PERFORM NEW_PATH USING S_NODE.
    WHEN 'TICK'.                       "New with same depth
      PERFORM NEW_LIST USING S_NODE.
    WHEN 'GSTR'.                       "Structural graphic
      PERFORM SHOW_GRAPHICHS USING S_NODE.
    WHEN 'OPTI'.
      PERFORM OPTIMIZATION_COLUMNS.
    WHEN 'OPTIHEAD'.
      PERFORM OPTIMIZATION_WITH_HEADER.
    WHEN 'OPTICONT'.
      PERFORM OPTIMIZATION_WITH_CONTENT.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
    WHEN 'RW'.
      LEAVE PROGRAM.
    WHEN OTHERS.
      OK_CODE = SAVE_OK.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT


*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
*       build table for FIELDCATALOG
*----------------------------------------------------------------------*
FORM BUILD_FIELDCATALOG
     CHANGING FIELDCATALOG TYPE LVC_T_FCAT.

  DATA: LS_FIELDCATALOG TYPE LVC_S_FCAT.

  CLEAR FIELDCATALOG[].

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'SHORT'.
  LS_FIELDCATALOG-REF_FIELD  = 'SHORT'.
  LS_FIELDCATALOG-REF_TABLE  = 'OBJEC'.
  LS_FIELDCATALOG-COLDDICTXT = 'R'.
  LS_FIELDCATALOG-COL_POS    = 1.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'OTYPE'.
  LS_FIELDCATALOG-REF_FIELD  = 'OTYPE'.
  LS_FIELDCATALOG-REF_TABLE  = 'OBJEC'.
  LS_FIELDCATALOG-COLDDICTXT = 'L'.
  LS_FIELDCATALOG-COL_POS    = 2.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'REALO'.
  LS_FIELDCATALOG-REF_FIELD  = 'REALO'.
  LS_FIELDCATALOG-REF_TABLE  = 'OBJEC'.
  LS_FIELDCATALOG-COLDDICTXT = 'L'.
  LS_FIELDCATALOG-COL_POS    = 3.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'ISTAT'.
  LS_FIELDCATALOG-REPTEXT    = 'Status (Objekt)'(002).
  LS_FIELDCATALOG-COLDDICTXT = 'R'.
  LS_FIELDCATALOG-TOOLTIP    = 'Status des Objekts'(023).
  LS_FIELDCATALOG-COL_POS    = 4.
  LS_FIELDCATALOG-JUST       = 'R'.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'BEGDA'.
  LS_FIELDCATALOG-REPTEXT    = 'Beginndatum (Objekt)'(003).
  LS_FIELDCATALOG-TOOLTIP    = 'Beginndatum des Objekts'(022).
  LS_FIELDCATALOG-COLDDICTXT = 'R'.
  LS_FIELDCATALOG-COL_POS    = 5.
  LS_FIELDCATALOG-JUST       = 'R'.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'ENDDA'.
  LS_FIELDCATALOG-REPTEXT  = 'Endedatum (Objekt)'(006).
  LS_FIELDCATALOG-TOOLTIP    = 'Endedatum des Objekts'(017).
  LS_FIELDCATALOG-COLDDICTXT = 'R'.
  LS_FIELDCATALOG-COL_POS    = 6.
  LS_FIELDCATALOG-JUST       = 'R'.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'VISTAT'.
  LS_FIELDCATALOG-REPTEXT    = 'Status (Verkn黳fung)'(005).
  LS_FIELDCATALOG-TOOLTIP    = 'Status der Verkn黳fung'(004).
  LS_FIELDCATALOG-COLDDICTXT = 'R'.
  LS_FIELDCATALOG-COL_POS    = 7.
  LS_FIELDCATALOG-JUST       = 'R'.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'VBEGDA'.
  LS_FIELDCATALOG-REPTEXT    = 'Beginndatum (Verkn黳fung)'(018).
  LS_FIELDCATALOG-TOOLTIP    = 'Beginndatum der Verkn黳fung'(019).
  LS_FIELDCATALOG-COLDDICTXT = 'R'.
  LS_FIELDCATALOG-COL_POS    = 8.
  LS_FIELDCATALOG-JUST       = 'R'.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'VENDDA'.
  LS_FIELDCATALOG-REPTEXT    = 'Endedatum (Verkn黳fung)'(020).
  LS_FIELDCATALOG-TOOLTIP    = 'Endedatum der Verkn黳fung'(021).
  LS_FIELDCATALOG-COLDDICTXT = 'R'.
  LS_FIELDCATALOG-COL_POS    = 9.
  LS_FIELDCATALOG-JUST       = 'R'.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-FIELDNAME  = 'PROZT'.
  LS_FIELDCATALOG-REF_FIELD  = 'VPROZT'.
  LS_FIELDCATALOG-REF_TABLE  = 'STRUC'.
  LS_FIELDCATALOG-COLDDICTXT = 'L'.
  LS_FIELDCATALOG-COL_POS    = 10.
  LS_FIELDCATALOG-JUST       = 'R'.
  APPEND LS_FIELDCATALOG TO FIELDCATALOG.

* append column recurs only if recursion exist
  IF NOT RECURS IS INITIAL.
    IF EXIST_REC = 'X'.
      CLEAR LS_FIELDCATALOG.
      LS_FIELDCATALOG-FIELDNAME   = 'TEXT'.
      LS_FIELDCATALOG-REPTEXT     = 'Rekursion'(007).
      LS_FIELDCATALOG-COLDDICTXT  = 'R'.
      LS_FIELDCATALOG-COL_POS     = 11.
      LS_FIELDCATALOG-OUTPUTLEN   = 30.
      APPEND LS_FIELDCATALOG TO FIELDCATALOG.
      CLEAR EXIST_REC.
    ENDIF.
  ENDIF.

ENDFORM.                               " BUILD_FIELDCATALOG


*&---------------------------------------------------------------------*
*&      Form  define_hierarchy_header
*&---------------------------------------------------------------------*
*       define hierarchy-header-information
*----------------------------------------------------------------------*
*      -->P_L_HIERARCHY_HEADER  structure for hierarchy-header
*----------------------------------------------------------------------*
FORM DEFINE_HIERARCHY_HEADER CHANGING
                               P_HIERARCHY_HEADER TYPE TREEV_HHDR.

  P_HIERARCHY_HEADER-HEADING = 'Objektbezeichner'(300).
  P_HIERARCHY_HEADER-TOOLTIP = 'Objektbezeichner'(300).
  P_HIERARCHY_HEADER-WIDTH = 48.
  P_HIERARCHY_HEADER-WIDTH_PIX = ' '.

ENDFORM.                               " define_hierarchy_header


*&---------------------------------------------------------------------*
*&      Form  build_header
*&---------------------------------------------------------------------*
*       define header
*----------------------------------------------------------------------*
FORM BUILD_COMMENT USING PT_LIST_COMMENTARY TYPE SLIS_T_LISTHEADER.

  DATA: LS_LINE TYPE SLIS_LISTHEADER,
        L_OBEG(24),
        WEGIDTX(50).

* planversion
  LS_LINE-TYP  = 'S'.
  LS_LINE-KEY  = 'Planvariante:'(008).
  LS_LINE-INFO = PCHPLVAR.
  APPEND LS_LINE TO PT_LIST_COMMENTARY.

* evaluation path
  LS_LINE-KEY  = 'Auswertungsweg:'(009).

  SELECT SINGLE WTEXT INTO WEGIDTX FROM T77AT
                WHERE LANGU = SY-LANGU AND
                WEGID = PCHWEGID.
  CONCATENATE PCHWEGID ' (' WEGIDTX ')' INTO LS_LINE-INFO.
  APPEND LS_LINE TO PT_LIST_COMMENTARY.

* evaluation depth
  LS_LINE-KEY  = 'Tiefe:'(010).
  LS_LINE-INFO = GDSTR-DEPTH.
  APPEND LS_LINE TO PT_LIST_COMMENTARY.

* status
  LS_LINE-KEY  = 'Statusvektor:'(011).
  LS_LINE-INFO = PC-SVECT.
  APPEND LS_LINE TO PT_LIST_COMMENTARY.

* evaluation period
  IF PCHOBEG = PCHOEND.
    LS_LINE-KEY  = 'Stichtag'(012).
    WRITE PCHOBEG TO L_OBEG.
    LS_LINE-INFO = L_OBEG.
  ELSE.
    LS_LINE-KEY  = 'Auswertungszeitraum:'(013).
    WRITE PCHOBEG TO L_OBEG.
    WRITE '-' TO L_OBEG+12(1).
    WRITE PCHOEND TO L_OBEG+14(10).
    LS_LINE-INFO = L_OBEG.
  ENDIF.
  APPEND LS_LINE TO PT_LIST_COMMENTARY.

ENDFORM.                    "build_comment


*&---------------------------------------------------------------------*
*&      Form  Fill_col_Tree
*&---------------------------------------------------------------------*
FORM FILL_COL_TREE.

  TYPES:  BEGIN OF T_ICON,
            ICON TYPE TV_IMAGE,
            OTYPE TYPE OTYPE,
           END OF T_ICON.

  DATA: WA_PARENT   TYPE T_NODE,
        WA_NODE     TYPE T_NODE,
        PARENT_ID   TYPE LVC_NKEY,
        HTABIX      LIKE SY-TABIX,
        L_NODE_TEXT TYPE LVC_VALUE,
        L_NEW_KEY   TYPE LVC_NKEY.

  DATA: LT_LAYOUT_ITEM TYPE LVC_T_LAYI,
        LS_LAYOUT_ITEM TYPE LVC_S_LAYI,
        ICON_STRING    TYPE TV_IMAGE,
        LS_NODE_LAYOUT TYPE LVC_S_LAYN .

  DATA: L_NODE_KEY TYPE TV_NODEKEY,
        L_OTYPE    TYPE OTYPE.


  DATA: LT_ICON TYPE STANDARD TABLE OF T_ICON,
        LS_ICON TYPE T_ICON,
        WA_REC  TYPE TYPE_TREC.

* create the recursion icon
  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      NAME                  = 'ICON_FAILURE'
    IMPORTING
      RESULT                = ICON_STRING
    EXCEPTIONS
      ICON_NOT_FOUND        = 1
      OUTPUTFIELD_TOO_SHORT = 2
      OTHERS                = 3.
  IF SY-SUBRC <> 0.
    INTERNAL_ERROR 'FUNCTION ICON_CREATE' .                 "#EC NOTEXT
  ENDIF.


  LOOP AT IT_NODE INTO WA_NODE.

    HTABIX = SY-TABIX.
    MOVE WA_NODE-OTYPE TO L_OTYPE.
* read parent node
    READ TABLE IT_NODE
         INTO WA_PARENT
         WITH KEY ID = WA_NODE-PARENT.
    IF SY-SUBRC <> 0.
      PARENT_ID = ' '.
    ELSE.
      PARENT_ID = WA_PARENT-TREE_ID.
    ENDIF.
    L_NODE_TEXT = WA_NODE-TEXT4.

    IF NOT WA_NODE-TEXT IS INITIAL.

      LS_NODE_LAYOUT-N_IMAGE = ICON_STRING.
      LS_NODE_LAYOUT-STYLE   = '5'.

      CLEAR LS_LAYOUT_ITEM.
      LS_LAYOUT_ITEM-FIELDNAME = 'TEXT4'.
      LS_LAYOUT_ITEM-T_IMAGE = ICON_STRING.
      APPEND LS_LAYOUT_ITEM TO LT_LAYOUT_ITEM.
    ELSE.
*     read icon from it_table
      CLEAR LS_ICON.
      READ TABLE LT_ICON INTO LS_ICON WITH KEY OTYPE = L_OTYPE .
      IF LS_ICON-ICON IS INITIAL.

        CALL FUNCTION 'OM_GET_ICON_OF_OTYPE'
          EXPORTING
            OTYPE           = L_OTYPE
          IMPORTING
            ICON            = LS_ICON-ICON
          EXCEPTIONS
            NO_ICON_FOUND   = 1
            OTYPE_NOT_FOUND = 2
            OTHERS          = 3.
        IF SY-SUBRC > 1.
          INTERNAL_ERROR 'FUNCTION OM_GET_ICON_OF_OTYPE' .  "#EC NOTEXT
        ENDIF.

        LS_ICON-OTYPE = L_OTYPE.
        APPEND LS_ICON TO LT_ICON.
      ENDIF.
      LS_NODE_LAYOUT-N_IMAGE   = LS_ICON-ICON.
      LS_NODE_LAYOUT-EXP_IMAGE = LS_ICON-ICON.

      CLEAR LS_LAYOUT_ITEM.
      LS_LAYOUT_ITEM-FIELDNAME = 'TEXT4'.
      LS_LAYOUT_ITEM-T_IMAGE = LS_ICON-ICON.
      APPEND LS_LAYOUT_ITEM TO LT_LAYOUT_ITEM.
    ENDIF.

*   add new node
    CALL METHOD ALV_TREE_CONTROL->ADD_NODE
      EXPORTING
        I_RELAT_NODE_KEY     = PARENT_ID
        I_RELATIONSHIP       = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
        I_NODE_TEXT          = L_NODE_TEXT
        IS_OUTTAB_LINE       = WA_NODE
        IT_ITEM_LAYOUT       = LT_LAYOUT_ITEM
        IS_NODE_LAYOUT       = LS_NODE_LAYOUT
      IMPORTING
        E_NEW_NODE_KEY       = L_NEW_KEY
      EXCEPTIONS
        RELAT_NODE_NOT_FOUND = 1
        NODE_NOT_FOUND       = 2
        OTHERS               = 3.
    IF SY-SUBRC <> 0.
      INTERNAL_ERROR 'METHOD alv_tree_control->add_node' .  "#EC NOTEXT
    ENDIF.

    WA_NODE-TREE_ID = L_NEW_KEY.

    MODIFY IT_NODE FROM WA_NODE INDEX HTABIX.

*   collect all nodes with a recursion
    IF NOT WA_NODE-TEXT IS INITIAL.
      WA_REC-KEY = WA_NODE-TREE_ID.
      WA_REC-ID = WA_NODE-ID.
      APPEND WA_REC TO IT_RECURSIONS.
      CLEAR WA_REC.
    ENDIF.
    CLEAR WA_NODE.
    CLEAR LS_LAYOUT_ITEM.
    CLEAR LS_NODE_LAYOUT.

  ENDLOOP.

  READ TABLE IT_NODE INTO WA_NODE
                     INDEX 1.
  L_NODE_KEY = WA_NODE-TREE_ID .

* check if the id has a child
  READ TABLE IT_NODE
       WITH KEY PARENT = WA_NODE-ID
       TRANSPORTING NO FIELDS.
  IF SY-SUBRC = 0.
* expand node if there is a child
    CALL METHOD ALV_TREE_CONTROL->EXPAND_NODE
      EXPORTING
        I_NODE_KEY          = L_NODE_KEY
        I_EXPAND_SUBTREE    = 'X'
      EXCEPTIONS
        FAILED              = 1
        ILLEGAL_LEVEL_COUNT = 2
        CNTL_SYSTEM_ERROR   = 3
        NODE_NOT_FOUND      = 4
        CANNOT_EXPAND_LEAF  = 5
        OTHERS              = 6.
    IF SY-SUBRC <> 0.
      INTERNAL_ERROR 'METHOD alv_tree_control->expand_node' . "#EC NOTEXT
    ENDIF.
  ENDIF.
* optimize column-width
  CALL METHOD ALV_TREE_CONTROL->COLUMN_OPTIMIZE
    EXPORTING
      I_INCLUDE_HEADING      = 'X'
    EXCEPTIONS
      START_COLUMN_NOT_FOUND = 1
      END_COLUMN_NOT_FOUND   = 2
      OTHERS                 = 3.
  IF SY-SUBRC <> 0.
    INTERNAL_ERROR 'METHOD alv_tree_control->column_optimize'. "#EC NOTEXT
  ENDIF.

  G_OPTIMIZE_FLAG = ' '.                                    "note 768405
ENDFORM.                    "Fill_col_Tree


*&---------------------------------------------------------------------*
*&      Form  get_sel_item
*&---------------------------------------------------------------------*
*     form  get selected item
*----------------------------------------------------------------------*
FORM GET_SEL_ITEM CHANGING SELECTED_NODE TYPE LVC_NKEY .

  DATA: SELECTED_NODES TYPE LVC_T_NKEY.

  CLEAR SELECTED_NODE.

* get all selected items, should only be one at all
  CALL METHOD ALV_TREE_CONTROL->GET_SELECTED_NODES
    CHANGING
      CT_SELECTED_NODES = SELECTED_NODES
    EXCEPTIONS
      CNTL_SYSTEM_ERROR = 1
      DP_ERROR          = 2
      FAILED            = 3
      OTHERS            = 4.
  IF SY-SUBRC <> 0.
    INTERNAL_ERROR
    'METHOD alv_tree_control->get_selected_nodes'.          "#EC NOTEXT
  ENDIF.

* get the first entry
  READ TABLE SELECTED_NODES INTO SELECTED_NODE
                            INDEX 1.

ENDFORM.                    " get_sel_item


*&---------------------------------------------------------------------*
*&      Form  show_object
*&---------------------------------------------------------------------*
*        call transaction show object
*----------------------------------------------------------------------*
*      -->P_S_NODE
*----------------------------------------------------------------------*
FORM SHOW_OBJECT USING P_S_NODE TYPE LVC_NKEY.

  DATA: L_OTYPE TYPE OTYPE,
        LS_NODE TYPE T_NODE.

  READ TABLE IT_NODE INTO LS_NODE
           WITH KEY TREE_ID = P_S_NODE.

  MOVE LS_NODE-OTYPE TO L_OTYPE.
* nothing is selected
  IF L_OTYPE IS INITIAL.
    MESSAGE S085(5A).
    EXIT.
  ENDIF.

* look for external object
  SELECT SINGLE * FROM T77EO
       WHERE OTYPE = L_OTYPE.
  IF SY-SUBRC EQ 0.
    PERFORM SET_TRANSACTION IN PROGRAM (T77EO-PROG)
            USING 'DISP' LS_NODE-REALO IF FOUND.
  ELSE.
    PERFORM CTL(RHCLUC00) USING PCHPLVAR 'ORGP'
            L_OTYPE LS_NODE-OBJID 'DESC'.
  ENDIF.

ENDFORM.                    " show_object


*&---------------------------------------------------------------------*
*&      Form  maintenance_object
*&---------------------------------------------------------------------*
*       call transaction maintenance_object
*----------------------------------------------------------------------*
*      -->P_S_NODE
*----------------------------------------------------------------------*
FORM MAINTENANCE_OBJECT USING P_S_NODE TYPE LVC_NKEY.

  DATA: L_OTYPE TYPE OTYPE,
        LS_NODE TYPE T_NODE.

  READ TABLE IT_NODE INTO LS_NODE
             WITH KEY TREE_ID = P_S_NODE.
  MOVE LS_NODE-OTYPE TO L_OTYPE.
  IF L_OTYPE IS INITIAL.
    MESSAGE S085(5A).
    EXIT.
  ENDIF.

* look for external object
  SELECT SINGLE * FROM T77EO
       WHERE OTYPE = L_OTYPE.
  IF SY-SUBRC EQ 0.
    PERFORM SET_TRANSACTION IN PROGRAM (T77EO-PROG)
            USING 'AEND' LS_NODE-REALO IF FOUND.
  ELSE.
    PERFORM CTL(RHCLUC00) USING PCHPLVAR 'ORGP'
            L_OTYPE LS_NODE-OBJID 'MAIN'.
  ENDIF.

ENDFORM.                    " maintenance_object


*&---------------------------------------------------------------------*
*&      Form  show_recursion
*&---------------------------------------------------------------------*
*      if recursion exist show it on the top of page
*----------------------------------------------------------------------*
FORM SHOW_RECURSION .

  DATA: REC_NR TYPE SY-TABIX,
        WA_REC TYPE TYPE_TREC.

  STATICS: REC_INDEX TYPE I.

  REC_INDEX = REC_INDEX + 1.

  DESCRIBE TABLE IT_RECURSIONS LINES REC_NR.
* recursion does not exist
  IF REC_NR = 0.
    MESSAGE I899(5A) WITH 'Es sind keine Rekursione vorhanden.'(016).
  ELSE.
*   show first recursion again
    IF REC_INDEX > REC_NR.
      REC_INDEX = 1.
    ENDIF.

    CLEAR WA_REC.
    READ TABLE IT_RECURSIONS INTO WA_REC INDEX REC_INDEX.

    CALL METHOD ALV_TREE_CONTROL->SET_TOP_NODE
      EXPORTING
        I_NODE_KEY        = WA_REC-KEY
      EXCEPTIONS
        CNTL_SYSTEM_ERROR = 1
        NODE_NOT_FOUND    = 2
        FAILED            = 3
        OTHERS            = 4.
    IF SY-SUBRC <> 0.
      INTERNAL_ERROR 'METHOD alv_tree_control->set_top_node'. "#EC NOTEXT
    ENDIF.
  ENDIF.

ENDFORM.             " show_recursion


*&---------------------------------------------------------------------*
*&      Form  show_graphichs
*&---------------------------------------------------------------------*
*       graphics mainteince for object
*----------------------------------------------------------------------*
*      -->P_S_NODE
*----------------------------------------------------------------------*
FORM SHOW_GRAPHICHS  USING   P_S_NODE TYPE LVC_NKEY.

  DATA: LS_NODE TYPE T_NODE.

  READ TABLE IT_NODE INTO LS_NODE
                     WITH KEY TREE_ID = P_S_NODE.
  IF  LS_NODE-ID NE 0.
    CALL FUNCTION 'PD_STRUCTURAL_GRAPHICS'
      EXPORTING
        CONTEXT_ID           = 'GENERAL'
        INDEX                = LS_NODE-ID
        LOAD_PD_TOOLBOX      = 'X'
        LOAD_PD_PROFILES     = 'X'
      EXCEPTIONS
        NO_OBJECTS_AVAILABLE = 1
        OTHERS               = 2.
    IF SY-SUBRC <> 0.
      INTERNAL_ERROR 'FUNCTION PD_STRUCTURAL_GRAPHICS'.
    ENDIF.
  ELSE.
    MESSAGE S085(5A).
  ENDIF.

ENDFORM.                    " show_graphichs


*&---------------------------------------------------------------------*
*&      Form  new_path
*&---------------------------------------------------------------------*
*      show structur with a new path
*----------------------------------------------------------------------*
*      -->P_S_NODE
*----------------------------------------------------------------------*
FORM NEW_PATH  USING    P_S_NODE TYPE LVC_NKEY.

  DATA: LS_NODE TYPE T_NODE.

* nothing is selected
  IF P_S_NODE IS INITIAL.
    MESSAGE S085(5A).
    EXIT.
  ENDIF.

  READ TABLE IT_NODE INTO LS_NODE
                     WITH KEY TREE_ID = P_S_NODE.
  IF SY-SUBRC <> 0.
    INTERNAL_ERROR 'READ TABLE it_node'.                    "#EC NOTEXT
  ELSE.
    CLEAR: PDSTR.

    PDSTR-SVECT = PC-SVECT.
    PDSTR-ACTIV = PC-ACTIV.
    PDSTR-RSTEXT = LS_NODE-TEXT4.

    CALL SCREEN 5000 STARTING AT 20 7.
  ENDIF.

ENDFORM.                    " new_path


*&---------------------------------------------------------------------*
*&      Module  STATUS_5000  OUTPUT
*&---------------------------------------------------------------------*
MODULE STATUS_5000 OUTPUT.

  CLEAR OK_CODE.
  SET PF-STATUS 'NWAY'.

ENDMODULE.                 " STATUS_5000  OUTPUT


*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
MODULE EXIT INPUT.

  CASE OK_CODE.
    WHEN 'EBBR'.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.                 " EXIT  INPUT


*&---------------------------------------------------------------------*
*&      Module  CHECK_SVECT  INPUT
*&--------------------------------------------------------------------*
*       Check status vector                                           *
*---------------------------------------------------------------------*
MODULE CHECK_SVECT INPUT.

  IF PDSTR-SVECT CN '12345 '.
    MESSAGE E182(5A)
*     'Statusvektor'(STV) PDSTR-SVECT 'nicht erlaubt'(NEL).
      WITH PDSTR-SVECT.
  ENDIF.

ENDMODULE.                 " CHECK_SVECT  INPUT


*&---------------------------------------------------------------------*
*&      Module  user_command_5000  INPUT
*&---------------------------------------------------------------------*
MODULE USER_COMMAND_5000 INPUT.

  CASE OK_CODE.
    WHEN 'STAR'.
      CLEAR WA_NODE.
      READ TABLE IT_NODE INTO WA_NODE WITH KEY TREE_ID = S_NODE.
      MOVE WA_NODE-OTYPE TO OTYPE.

      SUBMIT RHSTRU00 AND RETURN
        WITH PCHPLVAR EQ PCHPLVAR
        WITH PCHOTYPE EQ OTYPE
        WITH PCHSOBID EQ WA_NODE-OBJID
        WITH PCHOBEG  EQ PCHOBEG
        WITH PCHOEND  EQ PCHOEND
        WITH PCHOSTAT EQ PCHOSTAT
        WITH PCHBEGDA EQ PCHBEGDA
        WITH PCHENDDA EQ PCHENDDA
        WITH PCHISTAT EQ PCHISTAT
        WITH PCHWEGID EQ PDSTR-WEGID
        WITH PCHACTIV EQ PDSTR-ACTIV
        WITH PCHDEPTH EQ PDSTR-DEPTH
        WITH PCHSVECT EQ PDSTR-SVECT
        WITH PCHSETGD IN PCHSETGD
        WITH TDEPTH   EQ PDSTR-TDEPTH
        WITH RECURS   EQ RECURS.
      LEAVE TO SCREEN 0.

    WHEN 'EBBR'.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.                 " user_command_5000  INPUT


*&---------------------------------------------------------------------*
*&      Form  new_list
*&---------------------------------------------------------------------*
*      show structur with the same depth
*----------------------------------------------------------------------*
*      -->P_S_NODE
*----------------------------------------------------------------------*
FORM NEW_LIST  USING    P_S_NODE TYPE LVC_NKEY.

  DATA: OTYPE TYPE OTYPE,
        L_OTYPE(50),
        L_PCHWEGID(50),
        LS_NODE TYPE T_NODE.

  READ TABLE IT_NODE INTO LS_NODE WITH KEY TREE_ID = P_S_NODE.
  MOVE LS_NODE-OTYPE TO OTYPE.
* nothing is selected
  IF LS_NODE-ID IS INITIAL.
    MESSAGE S085(5A).
  ELSE.
* evaluation path does not contain selected object type
    IF OTYPE NE PCHOTYPE.
      WRITE OTYPE TO L_OTYPE.
      WRITE PCHWEGID TO L_PCHWEGID.
      CALL FUNCTION 'POPUP_DISPLAY_MESSAGE'
        EXPORTING
          MSGID = 'PP'
          MSGTY = 'S'
          MSGNO = '011'
          MSGV1 = L_OTYPE
          MSGV2 = L_PCHWEGID.
    ELSE.
      SUBMIT RHSTRU00 AND RETURN
           WITH PCHPLVAR EQ PCHPLVAR
           WITH PCHOTYPE EQ OTYPE
           WITH PCHSOBID EQ LS_NODE-OBJID
           WITH PCHOBEG  EQ PCHOBEG
           WITH PCHOEND  EQ PCHOEND
           WITH PCHOSTAT EQ PCHOSTAT
           WITH PCHBEGDA EQ PCHBEGDA
           WITH PCHENDDA EQ PCHENDDA
           WITH PCHISTAT EQ PCHISTAT
           WITH PCHWEGID EQ PCHWEGID
           WITH PCHACTIV EQ PCHACTIV
           WITH PCHDEPTH EQ PCHDEPTH
           WITH PCHSVECT EQ PCHSVECT
           WITH PCHSETGD IN PCHSETGD
           WITH TDEPTH   EQ TDEPTH
           WITH RECURS   EQ RECURS.
    ENDIF.
  ENDIF.

ENDFORM.                    " new_list


*&---------------------------------------------------------------------*
*&      Form  optimization_columns
*&---------------------------------------------------------------------*
*        optimization columns width
*----------------------------------------------------------------------*
FORM OPTIMIZATION_COLUMNS .

  DATA L_INCLUDE_HEADING TYPE FLAG.

  CASE G_OPTIMIZE_FLAG.
    WHEN 'X'.
      G_OPTIMIZE_FLAG = ' '.
      L_INCLUDE_HEADING = 'X'.
    WHEN ' '.
      G_OPTIMIZE_FLAG = 'X'.
      L_INCLUDE_HEADING = ' '.
  ENDCASE.

  CALL METHOD ALV_TREE_CONTROL->COLUMN_OPTIMIZE
    EXPORTING
      I_INCLUDE_HEADING      = L_INCLUDE_HEADING
    EXCEPTIONS
      START_COLUMN_NOT_FOUND = 1
      END_COLUMN_NOT_FOUND   = 2
      OTHERS                 = 3.
  IF SY-SUBRC <> 0.
    INTERNAL_ERROR 'METHOD alv_tree_control->column_optimize'. "#EC NOTEXT
  ENDIF.

ENDFORM.                    " optimization_columns


*&---------------------------------------------------------------------*
*&      Form  set_optimization_text
*&---------------------------------------------------------------------*
FORM SET_OPTIMIZATION_TEXT.

  G_OPTIMIZE_BUTTON-ICON_ID = ICON_TABLE_SETTINGS.

  IF G_OPTIMIZE_FLAG = 'X'.
    G_OPTIMIZE_BUTTON-QUICKINFO = 'Spalten optimieren mit Titel'(024).
    G_OPTIMIZE_BUTTON-TEXT = 'Spalten optimieren mit Titel'(024).
  ELSE.
    G_OPTIMIZE_BUTTON-QUICKINFO = 'Spalten optimieren ohne Titel'(025).
    G_OPTIMIZE_BUTTON-TEXT = 'Spalten optimieren ohne Titel'(025).
  ENDIF.

ENDFORM.                    " set_optimization_text


*&---------------------------------------------------------------------*
*&      Form  optimization_with_header
*&---------------------------------------------------------------------*
FORM OPTIMIZATION_WITH_HEADER .

  CALL METHOD ALV_TREE_CONTROL->COLUMN_OPTIMIZE
    EXPORTING
      I_INCLUDE_HEADING      = 'X'
    EXCEPTIONS
      START_COLUMN_NOT_FOUND = 1
      END_COLUMN_NOT_FOUND   = 2
      OTHERS                 = 3.
  IF SY-SUBRC <> 0.
    INTERNAL_ERROR 'METHOD alv_tree_control->column_optimize'. "#EC NOTEXT
  ENDIF.

  G_OPTIMIZE_FLAG = 'X'.                             "note 768405

ENDFORM.                    " optimization_with_header


*&---------------------------------------------------------------------*
*&      Form  optimization_with_content
*&---------------------------------------------------------------------*
FORM OPTIMIZATION_WITH_CONTENT .

  CALL METHOD ALV_TREE_CONTROL->COLUMN_OPTIMIZE
    EXPORTING
      I_INCLUDE_HEADING      = ' '
    EXCEPTIONS
      START_COLUMN_NOT_FOUND = 1
      END_COLUMN_NOT_FOUND   = 2
      OTHERS                 = 3.
  IF SY-SUBRC <> 0.
    INTERNAL_ERROR 'METHOD alv_tree_control->column_optimize'. "#EC NOTEXT
  ENDIF.

  G_OPTIMIZE_FLAG = ' '.                            "note 768405

ENDFORM.                    " optimization_with_content
*&---------------------------------------------------------------------*
*&      Form  SUB_FILL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_FILL_DATA .
  DATA: LV_IS_MAN TYPE BOOLEAN.
  DATA: PA_NODE TYPE T_NODE.

  LOOP AT IT_NODE INTO WA_NODE.
    IF WA_NODE-OTYPE = 'O'.
      WA_DATA-ID = WA_NODE-ID.
      WA_DATA-PARENT = WA_NODE-PARENT.
      WA_DATA-ONAME = WA_NODE-SHORT.
      WA_DATA-ORGID = WA_NODE-OBJID.
      IF SY-TABIX = 1.
        WA_DATA-GRAPH = 0. "top manager
      ENDIF.
      APPEND WA_DATA TO GT_DATA.
      CLEAR WA_DATA.
    ENDIF.

    IF WA_NODE-OTYPE = 'S'.
      PERFORM SUB_CHECK_MAN USING WA_NODE-OBJID CHANGING LV_IS_MAN.
      IF LV_IS_MAN = 'X'.
        LOOP AT GT_DATA INTO WA_DATA WHERE ID = WA_NODE-PARENT.
          WA_DATA-SNAME = WA_NODE-SHORT.
          WA_DATA-POSID = WA_NODE-OBJID.
          WA_DATA-GRAPH = 1. "manager
          MODIFY GT_DATA FROM WA_DATA.
          CLEAR WA_DATA.
          EXIT.
        ENDLOOP.
      ELSE.
        WA_DATA-ID = WA_NODE-ID.
        WA_DATA-PARENT = WA_NODE-PARENT.
        WA_DATA-SNAME = WA_NODE-SHORT.
        WA_DATA-POSID = WA_NODE-OBJID.
        WA_DATA-GRAPH = 2. "employee
        APPEND WA_DATA TO GT_DATA.
        CLEAR WA_DATA.
      ENDIF.
    ENDIF.

    IF WA_NODE-OTYPE = 'P'.
      READ TABLE IT_NODE INTO PA_NODE WITH KEY ID = WA_NODE-PARENT.
      PERFORM SUB_CHECK_MAN USING PA_NODE-OBJID CHANGING LV_IS_MAN.
      IF LV_IS_MAN = 'X'.
        LOOP AT GT_DATA INTO WA_DATA WHERE ID = PA_NODE-PARENT.
          WA_DATA-PNAME = WA_NODE-SHORT.
          WA_DATA-PERID = WA_NODE-OBJID.
          MODIFY GT_DATA FROM WA_DATA.
          CLEAR WA_DATA.
          EXIT.
        ENDLOOP.
      ELSE.
        LOOP AT GT_DATA INTO WA_DATA WHERE ID = PA_NODE-ID.
          WA_DATA-PNAME = WA_NODE-SHORT.
          WA_DATA-PERID = WA_NODE-OBJID.
          MODIFY GT_DATA FROM WA_DATA.
          CLEAR WA_DATA.
          EXIT.
        ENDLOOP.
      ENDIF.
    ENDIF.
  ENDLOOP.

  LOOP AT GT_DATA INTO WA_DATA.
    CONCATENATE WA_DATA-PERID '.jpg' INTO WA_DATA-IMAGEFILE.
    IF WA_DATA-PERID IS INITIAL.
      WA_DATA-GRAPH = '4'. "vanacy
    ENDIF.
    MODIFY GT_DATA FROM WA_DATA.
  ENDLOOP.
ENDFORM.                    " SUB_FILL_DATA
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_MAN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_WA_NODE_OBJID  text
*      <--P_LV_IS_MAN  text
*----------------------------------------------------------------------*
FORM SUB_CHECK_MAN  USING    P_WA_NODE_OBJID
                    CHANGING P_LV_IS_MAN.
  DATA: I1001 TYPE HRP1001.
  SELECT SINGLE * FROM HRP1001 INTO I1001 WHERE PLVAR = '01'
                                            AND OTYPE = 'S'
                                            AND OBJID =  P_WA_NODE_OBJID
                                            AND RSIGN = 'A'
                                            AND RELAT = '012'
                                            AND ENDDA >= SY-DATUM.
  IF I1001 IS NOT INITIAL.
    P_LV_IS_MAN = 'X'.
  ELSE.
    CLEAR P_LV_IS_MAN.
  ENDIF.
ENDFORM.                    " SUB_CHECK_MAN
*&---------------------------------------------------------------------*
*&      Form  SUB_DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_DOWNLOAD_DATA .
  DATA: BEGIN OF GT_FIELDNAMES OCCURS 0,
          FIELDNAME(12),
        END OF GT_FIELDNAMES.

  GT_FIELDNAMES-FIELDNAME = 'ID'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'PARENT'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'ONAME'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'SNAME'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'PNAME'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'ORGID'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'POSID'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'PERID'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'KNAME'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'KCCID'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'GRAPH'.
  APPEND GT_FIELDNAMES.
  GT_FIELDNAMES-FIELDNAME = 'IMAGEFILE'.
  APPEND GT_FIELDNAMES.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      FILENAME                = GV_DATA_FILE
      FILETYPE                = 'ASC'
      WRITE_FIELD_SEPARATOR   = 'X'
    TABLES
      DATA_TAB                = GT_DATA
      FIELDNAMES              = GT_FIELDNAMES
    EXCEPTIONS
      FILE_WRITE_ERROR        = 1
      NO_BATCH                = 2
      GUI_REFUSE_FILETRANSFER = 3
      INVALID_TYPE            = 4
      NO_AUTHORITY            = 5
      UNKNOWN_ERROR           = 6
      HEADER_NOT_ALLOWED      = 7
      SEPARATOR_NOT_ALLOWED   = 8
      FILESIZE_NOT_ALLOWED    = 9
      HEADER_TOO_LONG         = 10
      DP_ERROR_CREATE         = 11
      DP_ERROR_SEND           = 12
      DP_ERROR_WRITE          = 13
      UNKNOWN_DP_ERROR        = 14
      ACCESS_DENIED           = 15
      DP_OUT_OF_MEMORY        = 16
      DISK_FULL               = 17
      DP_TIMEOUT              = 18
      FILE_NOT_FOUND          = 19
      DATAPROVIDER_EXCEPTION  = 20
      CONTROL_FLUSH_ERROR     = 21.

ENDFORM.                    " SUB_DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*&      Form  SUB_GET_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_GET_TEMPLATE USING P_TEMPLATE_FILENAME.

*  DATA EXT(10).
*  DATA L_FILENAME  TYPE STRING.
*  DATA LIN TYPE I.
*  DATA LENGTH TYPE I.
*
*  TYPES: BEGIN OF TESTLINE,
*          LINE(256) TYPE X,
*         END OF TESTLINE.
*  DATA: DATA_CONTAINER TYPE TABLE OF TESTLINE WITH HEADER LINE.
*  DATA: F(128),F1(10).
*
*  CLEAR DATA_CONTAINER.
*  REFRESH DATA_CONTAINER.
*  IMPORT DATA_CONTAINER FROM DATABASE ZHR_OFFICE(CN) ID P_TEMPLATE_FILENAME.
*  DESCRIBE TABLE DATA_CONTAINER LINES LIN.
*  SPLIT ZHR_OFFICE-FILENAME AT '.' INTO F F1.
*  EXT = F1.
*  TRANSLATE EXT TO UPPER CASE.
*
*  IF LIN = 0.
*    CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
*      EXPORTING
*        TITEL     = 'Download'
*        TEXTLINE1 = 'Database error!No template,please upload template!'
*      EXCEPTIONS
*        OTHERS    = 1.
*    EXIT.
*  ENDIF.
*
*  READ TABLE DATA_CONTAINER INDEX LIN.
*  LENGTH = DATA_CONTAINER-LINE.
*
*  CONCATENATE GV_TEMPLATE_PATH '\' ZHR_OFFICE-FILENAME INTO GV_TEMPLATE_FILE.
*
*  CALL FUNCTION 'GUI_DOWNLOAD'
*     EXPORTING
*       BIN_FILESIZE                    = LENGTH
*       FILENAME                        = GV_TEMPLATE_FILE
*       FILETYPE                        = 'BIN'
*     IMPORTING
*       FILELENGTH                      = LENGTH
*     TABLES
*       DATA_TAB                        = DATA_CONTAINER
**     FIELDNAMES                      =
*    EXCEPTIONS
*      FILE_WRITE_ERROR                = 1
*      NO_BATCH                        = 2
*      GUI_REFUSE_FILETRANSFER         = 3
*      INVALID_TYPE                    = 4
*      NO_AUTHORITY                    = 5
*      UNKNOWN_ERROR                   = 6
*      HEADER_NOT_ALLOWED              = 7
*      SEPARATOR_NOT_ALLOWED           = 8
*      FILESIZE_NOT_ALLOWED            = 9
*      HEADER_TOO_LONG                 = 10
*      DP_ERROR_CREATE                 = 11
*      DP_ERROR_SEND                   = 12
*      DP_ERROR_WRITE                  = 13
*      UNKNOWN_DP_ERROR                = 14
*      ACCESS_DENIED                   = 15
*      DP_OUT_OF_MEMORY                = 16
*      DISK_FULL                       = 17
*      DP_TIMEOUT                      = 18
*      FILE_NOT_FOUND                  = 19
*      DATAPROVIDER_EXCEPTION          = 20
*      CONTROL_FLUSH_ERROR             = 21
*      OTHERS                          = 22
*             .
*  IF SY-SUBRC NE 0.
*    CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
*      EXPORTING
*        TITEL     = 'Download'
*        TEXTLINE1 = 'Download failed!'
*      EXCEPTIONS
*        OTHERS    = 1.
*    EXIT.
*  ENDIF.

ENDFORM.                    " SUB_GET_TEMPLATE
*&---------------------------------------------------------------------*
*&      Form  SUB_OPEN_DOCUMENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_OPEN_DOCUMENT .

  CREATE OBJECT GV_APLICACION 'Visio.Application'.
  SET PROPERTY OF GV_APLICACION 'Visible' = 1.

  CALL METHOD OF GV_APLICACION 'Addons' = GV_ADDON
    EXPORTING #1 = GV_ORGWIZ.

  CALL METHOD OF GV_ADDON 'Run'
    EXPORTING #1 = '/S-INIT'.

  CONCATENATE '/S-ARGSTR' GV_PARAMETRO_MACRO INTO GV_PARAMETRO_MACRO SEPARATED BY SPACE.

  CALL METHOD OF GV_ADDON 'Run'
    EXPORTING #1 = GV_PARAMETRO_MACRO.

  CALL METHOD OF GV_ADDON 'Run'
    EXPORTING #1 = '/S-RUN'.

  IF VISIO_D1 = 'X'.
    CALL METHOD OF GV_APLICACION 'Run'
      EXPORTING #1 = 'RefreshOrgChartImages'.
  ENDIF.

  FREE OBJECT GV_APLICACION.
  FREE OBJECT GV_ADDON.

*  CL_GUI_FRONTEND_SERVICES=>EXECUTE(
*    EXPORTING
*      APPLICATION            = GV_VISIO_PATH
*      PARAMETER              = GV_VISIO_PARA
*    EXCEPTIONS
*      CNTL_ERROR             = 1
*      ERROR_NO_GUI           = 2
*      BAD_PARAMETER          = 3
*      FILE_NOT_FOUND         = 4
*      PATH_NOT_FOUND         = 5
*      FILE_EXTENSION_UNKNOWN = 6
*      ERROR_EXECUTE_FAILED   = 7
*      SYNCHRONOUS_FAILED     = 8
*      NOT_SUPPORTED_BY_GUI   = 9
*         ).
ENDFORM.                    " SUB_OPEN_DOCUMENT
*&---------------------------------------------------------------------*
*&      Form  SUB_FILL_DATA_C1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_FILL_DATA_C1 .
  DATA: LV_IS_STAFF TYPE FLAG.

  LOOP AT IT_NODE INTO WA_NODE.
    IF WA_NODE-OTYPE = 'O' OR WA_NODE-OTYPE = 'S'.
      WA_DATA-ID = WA_NODE-ID.
      WA_DATA-PARENT = WA_NODE-PARENT.
      WA_DATA-ONAME = WA_NODE-SHORT.
      WA_DATA-ORGID = WA_NODE-OBJID.
      IF SY-TABIX = 1.
        WA_DATA-GRAPH = 0. "top manager
      ELSE.
        IF WA_NODE-OTYPE = 'S'.
          WA_DATA-GRAPH = 2.
        ELSE.
          WA_DATA-GRAPH = 1.
        ENDIF.
      ENDIF.
      APPEND WA_DATA TO GT_DATA.
      CLEAR WA_DATA.
    ENDIF.
  ENDLOOP.

  LOOP AT GT_DATA INTO WA_DATA. "skip staff
    LOOP AT IT_NODE INTO WA_NODE WHERE ID = WA_DATA-PARENT.
      PERFORM SUB_CHECK_STAFF USING WA_NODE-OBJID CHANGING LV_IS_STAFF.
      IF LV_IS_STAFF = 'X'.
        WA_DATA-PARENT = WA_NODE-PARENT.
        CONTINUE.
      ELSE.
        EXIT.
      ENDIF.
    ENDLOOP.
    MODIFY GT_DATA FROM WA_DATA.
  ENDLOOP.

  LOOP AT GT_DATA INTO WA_DATA.
    PERFORM SUB_CHECK_STAFF USING WA_DATA-ORGID CHANGING LV_IS_STAFF.
    IF LV_IS_STAFF = 'X'.
      DELETE GT_DATA.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " SUB_FILL_DATA_C1
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_STAFF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LV_IS_STAFF  text
*----------------------------------------------------------------------*
FORM SUB_CHECK_STAFF  USING P_OBJID TYPE HRP1000-OBJID
                      CHANGING P_IS_STAFF.

  DATA: I1003 TYPE P1003 OCCURS 0,
        WA_1003 TYPE P1003.

  CLEAR: P_IS_STAFF.

  CALL FUNCTION 'RH_READ_INFTY'
    EXPORTING
      AUTHORITY            = 'DISP'
      WITH_STRU_AUTH       = 'X'
      PLVAR                = '01'
      OTYPE                = 'O'
      OBJID                = P_OBJID
      INFTY                = '1003'
      ISTAT                = '1'
      BEGDA                = PC-OBEG
      ENDDA                = PC-OEND
    TABLES
      INNNN                = I1003
    EXCEPTIONS
      ALL_INFTY_WITH_SUBTY = 1
      NOTHING_FOUND        = 2
      NO_OBJECTS           = 3
      WRONG_CONDITION      = 4
      WRONG_PARAMETERS     = 5.
  READ TABLE I1003 INTO WA_1003 INDEX 1.
  IF SY-SUBRC = 0 AND WA_1003-STABS = 'X'.
    P_IS_STAFF = 'X'.
  ENDIF.

ENDFORM.                    " SUB_CHECK_STAFF
*&---------------------------------------------------------------------*
*&      Form  SUB_FILL_DEMO_DATA_C1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_FILL_DEMO_DATA_C1 .

  WA_DATA-ID = 1.
  WA_DATA-PARENT = 0.
  WA_DATA-ONAME = 'SPD##'.
  WA_DATA-ORGID = '50000001'.
  WA_DATA-GRAPH = 0.
  WA_DATA-KNAME = 'SPD##'.
  WA_DATA-KCCID = '99990001'.
  WA_DATA-PNAME = '###'.
  WA_DATA-PERID = '00000001'.
  APPEND WA_DATA TO GT_DATA.

  WA_DATA-ID = 2.
  WA_DATA-PARENT = 1.
  WA_DATA-ONAME = '###'.
  WA_DATA-ORGID = '50000002'.
  WA_DATA-GRAPH = 1.
  WA_DATA-KNAME = '###'.
  WA_DATA-KCCID = '99990002'.
  WA_DATA-PNAME = 'L##'.
  WA_DATA-PERID = '00000002'.
  APPEND WA_DATA TO GT_DATA.

  WA_DATA-ID = 3.
  WA_DATA-PARENT = 1.
  WA_DATA-ONAME = '###'.
  WA_DATA-ORGID = '50000003'.
  WA_DATA-GRAPH = 1.
  WA_DATA-KNAME = '###'.
  WA_DATA-KCCID = '99990003'.
  WA_DATA-PNAME = 'W##'.
  WA_DATA-PERID = '00000003'.
  APPEND WA_DATA TO GT_DATA.

ENDFORM.                    " SUB_FILL_DEMO_DATA_C1
*&---------------------------------------------------------------------*
*&      Form  SUB_FILL_DEMO_DATA_C2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_FILL_DEMO_DATA_C2 .

  WA_DATA-ID = 1.
  WA_DATA-PARENT = 0.
  WA_DATA-ONAME = 'SPD Consulting'.
  WA_DATA-ORGID = '50000001'.
  WA_DATA-GRAPH = 0.
  WA_DATA-KNAME = 'CC 0001'.
  WA_DATA-KCCID = 'CC 0001'.
  WA_DATA-PNAME = 'Jack'.
  WA_DATA-PERID = '00000001'.
  APPEND WA_DATA TO GT_DATA.

  WA_DATA-ID = 2.
  WA_DATA-PARENT = 1.
  WA_DATA-ONAME = 'Beijing Office'.
  WA_DATA-ORGID = '50000002'.
  WA_DATA-GRAPH = 1.
  WA_DATA-KNAME = 'CC 0002'.
  WA_DATA-KCCID = 'CC 0002'.
  WA_DATA-PNAME = 'Michael'.
  WA_DATA-PERID = '00000002'.
  APPEND WA_DATA TO GT_DATA.

  WA_DATA-ID = 3.
  WA_DATA-PARENT = 1.
  WA_DATA-ONAME = 'Shanghai Office'.
  WA_DATA-ORGID = '50000003'.
  WA_DATA-GRAPH = 1.
  WA_DATA-KNAME = 'CC 0003'.
  WA_DATA-KCCID = 'CC 0003'.
  WA_DATA-PNAME = 'Tom'.
  WA_DATA-PERID = '00000003'.
  APPEND WA_DATA TO GT_DATA.

  WA_DATA-ID = 4.
  WA_DATA-PARENT = 1.
  WA_DATA-ONAME = 'Financial'.
  WA_DATA-ORGID = '50000002'.
  WA_DATA-GRAPH = 5.
  WA_DATA-KNAME = 'CC 0001'.
  WA_DATA-KCCID = 'CC 0001'.
  WA_DATA-PNAME = 'Lily'.
  WA_DATA-PERID = '00000002'.
  APPEND WA_DATA TO GT_DATA.

  WA_DATA-ID = 5.
  WA_DATA-PARENT = 1.
  WA_DATA-ONAME = 'Human Resource'.
  WA_DATA-ORGID = '50000003'.
  WA_DATA-GRAPH = 5.
  WA_DATA-KNAME = 'CC 0001'.
  WA_DATA-KCCID = 'CC 0001'.
  WA_DATA-PNAME = 'Grace'.
  WA_DATA-PERID = '00000003'.
  APPEND WA_DATA TO GT_DATA.

  WA_DATA-ID = 6.
  WA_DATA-PARENT = 1.
  WA_DATA-ONAME = 'Guangzhou Office'.
  WA_DATA-ORGID = '50000002'.
  WA_DATA-GRAPH = 1.
  WA_DATA-KNAME = 'CC 0004'.
  WA_DATA-KCCID = 'CC 0004'.
  WA_DATA-PNAME = 'Jones'.
  WA_DATA-PERID = '00000002'.
  APPEND WA_DATA TO GT_DATA.

ENDFORM.                    " SUB_FILL_DEMO_DATA_C2
*&---------------------------------------------------------------------*
*&      Form  SUB_FILL_DATA_C2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_FILL_DATA_C2 .

ENDFORM.                    " SUB_FILL_DATA_C2
*&---------------------------------------------------------------------*
*&      Form  SUB_FILL_DEMO_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_FILL_DEMO_DATA .

ENDFORM.                    " SUB_FILL_DEMO_DATA
*&---------------------------------------------------------------------*
*&      Form  sub_download_photo
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_DOWNLOAD_PHOTO .
  LOOP AT GT_DATA INTO WA_DATA WHERE PERID IS NOT INITIAL.
    PERFORM SUB_DOWNLOAD_PERNR_PHOTO USING WA_DATA-PERID.
  ENDLOOP.
ENDFORM.                    " sub_download_photo
*&---------------------------------------------------------------------*
*&      Form  sub_download_pernr_photo
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_DATA_PERID  text
*----------------------------------------------------------------------*
FORM SUB_DOWNLOAD_PERNR_PHOTO  USING    P_PERNR TYPE PERNR-PERNR.
  DATA : ZEXISTS.
  DATA : ZCONNECT_INFO LIKE TOAV0 .
  DATA : ZEX_DOCUMENT LIKE TBL1024 OCCURS 0 .
  DATA FILENAME TYPE  STRING.
  DATA : PICFILE LIKE  RLGRAP-FILENAME.
  CONCATENATE GV_TEMPLATE_PATH '\' P_PERNR '.JPG' INTO PICFILE.

  CALL FUNCTION 'GUI_DELETE_FILE'
    EXPORTING
      FILE_NAME = PICFILE
    EXCEPTIONS
      FAILED    = 1
      OTHERS    = 2.

  CALL FUNCTION 'HR_IMAGE_EXISTS'
    EXPORTING
      P_PERNR               = P_PERNR
      P_TCLAS               = 'A'
      P_BEGDA               = PC-OBEG
      P_ENDDA               = PC-OEND
    IMPORTING
      P_EXISTS              = ZEXISTS
      P_CONNECT_INFO        = ZCONNECT_INFO
    EXCEPTIONS
      ERROR_CONNECTIONTABLE = 1
      OTHERS                = 2.
  IF SY-SUBRC = 0.
    CLEAR: ZEX_DOCUMENT , ZEX_DOCUMENT[].
    CALL FUNCTION 'ALINK_RFC_TABLE_GET'
      EXPORTING
        IM_DOCID          = ZCONNECT_INFO-ARC_DOC_ID
        IM_CREPID         = ZCONNECT_INFO-ARCHIV_ID
*    IM_COMPID         =
*  IMPORTING
*    EX_LENGTH         =
*    EX_MESSAGE        =
      TABLES
        EX_DOCUMENT       = ZEX_DOCUMENT.

*    CONCATENATE g_workdir '\' pernr-pernr '.JPG' INTO filename.
    FILENAME = PICFILE.
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
*    BIN_FILESIZE                    =
        FILENAME                        =  FILENAME
        FILETYPE                        = 'BIN'
*    APPEND                          = ' '
*    WRITE_FIELD_SEPARATOR           = ' '
*    HEADER                          = '00'
*    TRUNC_TRAILING_BLANKS           = ' '
*    WRITE_LF                        = 'X'
*    COL_SELECT                      = ' '
*    COL_SELECT_MASK                 = ' '
*    DAT_MODE                        = ' '
*    CONFIRM_OVERWRITE               = ' '
*    NO_AUTH_CHECK                   = ' '
*    CODEPAGE                        = ' '
*    IGNORE_CERR                     = ABAP_TRUE
*    REPLACEMENT                     = '#'
*    WRITE_BOM                       = ' '
*    TRUNC_TRAILING_BLANKS_EOL       = 'X'
*    WK1_N_FORMAT                    = ' '
*    WK1_N_SIZE                      = ' '
*    WK1_T_FORMAT                    = ' '
*    WK1_T_SIZE                      = ' '
*    WRITE_EOL                       = ABAP_TRUE
*  IMPORTING
*    FILELENGTH                      =
      TABLES
        DATA_TAB                        = ZEX_DOCUMENT[]
*    FIELDNAMES                      =
     EXCEPTIONS
       FILE_WRITE_ERROR                = 1
       NO_BATCH                        = 2
       GUI_REFUSE_FILETRANSFER         = 3
       INVALID_TYPE                    = 4
       NO_AUTHORITY                    = 5
       UNKNOWN_ERROR                   = 6
       HEADER_NOT_ALLOWED              = 7
       SEPARATOR_NOT_ALLOWED           = 8
       FILESIZE_NOT_ALLOWED            = 9
       HEADER_TOO_LONG                 = 10
       DP_ERROR_CREATE                 = 11
       DP_ERROR_SEND                   = 12
       DP_ERROR_WRITE                  = 13
       UNKNOWN_DP_ERROR                = 14
       ACCESS_DENIED                   = 15
       DP_OUT_OF_MEMORY                = 16
       DISK_FULL                       = 17
       DP_TIMEOUT                      = 18
       FILE_NOT_FOUND                  = 19
       DATAPROVIDER_EXCEPTION          = 20
       CONTROL_FLUSH_ERROR             = 21
       OTHERS                          = 22
              .
  ENDIF.
ENDFORM.                    " sub_download_pernr_photo
*&---------------------------------------------------------------------*
*&      Form  SUB_SET_PARAMETRO_MACRO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_PARAMETRO_MACRO  text
*----------------------------------------------------------------------*
FORM SUB_SET_PARAMETRO_MACRO  USING  P_MACRO.

  CLEAR P_MACRO.
  CONCATENATE '/FILENAME='        GV_DATA_FILE
*              ' /PAGES='           lv_raiz
              ' /NAME-FIELD='     'pname'
              ' /MANAGER-FIELD='  'parent'
              ' /UNIQUEID-FIELD=' 'id'
              ' /DISPLAY-FIELDS=' 'sname' ','  'pname'
              ' /SHAPE-FIELD='    'graph'
              ' /CUSTOM-PROPERTY-FIELDS=' 'imagefile'
*              text-t01 ',' text-t04 ',' text-t05',' text-t06 ','
*              text-t09 ',' text-t10 ',' text-t11 ',' text-t12
               ' /SHOW-DIVIDER-LINE'
               INTO P_MACRO.

ENDFORM.                    " SUB_SET_PARAMETRO_MACRO
*&---------------------------------------------------------------------*
*&      Form  SUB_CREATE_DIR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_CREATE_DIR .

  DATA: LV_RESULT TYPE ABAP_BOOL.
  DATA: LV_RC TYPE I.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_SAPGUI_WORKDIR
    CHANGING
      SAPWORKDIR = GV_WORKDIR.

  CONCATENATE GV_WORKDIR '\' PCHOBJID-LOW INTO GV_TEMPLATE_PATH.
  CONCATENATE GV_TEMPLATE_PATH '\' 'org_data.xls' INTO GV_DATA_FILE.

  CL_GUI_FRONTEND_SERVICES=>DIRECTORY_EXIST(
    EXPORTING
      DIRECTORY            = GV_TEMPLATE_PATH
    RECEIVING
      RESULT               = LV_RESULT
         ).

  IF LV_RESULT IS INITIAL.
    CL_GUI_FRONTEND_SERVICES=>DIRECTORY_CREATE(
      EXPORTING
        DIRECTORY                = GV_TEMPLATE_PATH
      CHANGING
        RC                       = LV_RC
           ).
  ENDIF.

ENDFORM.                    " SUB_CREATE_DIR
*&---------------------------------------------------------------------*
*&      Form  SUB_SET_PARAMETRO_MACRO2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GV_PARAMETRO_MACRO  text
*----------------------------------------------------------------------*
FORM SUB_SET_PARAMETRO_MACRO2  USING    P_MACRO.

  CLEAR P_MACRO.
  CONCATENATE '/FILENAME='        GV_DATA_FILE
              '/NAME-FIELD=oname /MANAGER-FIELD=parent /UNIQUEID-FIELD=id /SHAPE-FIELD=graph /DISPLAY-FIELDS=oname,pname /SHOW-DIVIDER-LINE /CUSTOM-PROPERTY-FIELDS=kname HIDDEN,'
*              ' /PAGES='           lv_raiz
*              ' /NAME-FIELD='     'pname'
*              ' /MANAGER-FIELD='  'parent'
*              ' /UNIQUEID-FIELD=' 'id'
*              ' /DISPLAY-FIELDS=' 'sname' ','  'pname'
*              ' /SHAPE-FIELD='    'graph'
*              ' /CUSTOM-PROPERTY-FIELDS=' 'imagefile'
*              text-t01 ',' text-t04 ',' text-t05',' text-t06 ','
*              text-t09 ',' text-t10 ',' text-t11 ',' text-t12
*               ' /SHOW-DIVIDER-LINE'
               INTO P_MACRO.

ENDFORM.                    " SUB_SET_PARAMETRO_MACRO2
*&---------------------------------------------------------------------*
*&      Form  SUB_SET_PARAMETRO_MACRO3
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GV_PARAMETRO_MACRO  text
*----------------------------------------------------------------------*
FORM SUB_SET_PARAMETRO_MACRO3  USING    P_MACRO.

  CLEAR P_MACRO.
  CONCATENATE '/FILENAME='        GV_DATA_FILE
              '/NAME-FIELD=oname /MANAGER-FIELD=parent /UNIQUEID-FIELD=id /SHAPE-FIELD=graph /DISPLAY-FIELDS=oname,pname /SHOW-DIVIDER-LINE /CUSTOM-PROPERTY-FIELDS=kname HIDDEN,'
*              ' /PAGES='           lv_raiz
*              ' /NAME-FIELD='     'pname'
*              ' /MANAGER-FIELD='  'parent'
*              ' /UNIQUEID-FIELD=' 'id'
*              ' /DISPLAY-FIELDS=' 'sname' ','  'pname'
*              ' /SHAPE-FIELD='    'graph'
*              ' /CUSTOM-PROPERTY-FIELDS=' 'imagefile'
*              text-t01 ',' text-t04 ',' text-t05',' text-t06 ','
*              text-t09 ',' text-t10 ',' text-t11 ',' text-t12
*               ' /SHOW-DIVIDER-LINE'
               INTO P_MACRO.

ENDFORM.                    " SUB_SET_PARAMETRO_MACRO3

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值