FUNCTION ZHROM0002. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(I_PERNR) TYPE PERSNO OPTIONAL *" REFERENCE(I_UNAME) TYPE UNAME OPTIONAL *" REFERENCE(I_PLANS) TYPE PLANS OPTIONAL *" REFERENCE(I_ORGEH) TYPE ORGEH OPTIONAL *" REFERENCE(I_DATE) TYPE DATS DEFAULT SY-DATUM *" REFERENCE(I_LEVEL) TYPE TDEPTH DEFAULT '0' *" TABLES *" RESULT_CURRENT TYPE ZHROG OPTIONAL *" RESULT_SUPERIOR TYPE ZHROG OPTIONAL *" EXCEPTIONS *" ERROR_PARAMTER *" NO_STRUC_FOUND *"---------------------------------------------------------------------- DATA:LV_PERNR TYPE PERSNO, LV_TYPE TYPE OTYPE. DATA:LT_OBJEC TYPE STANDARD TABLE OF OBJEC, LT_OBJEC_TEMP TYPE STANDARD TABLE OF OBJEC, LT_STRUC TYPE STANDARD TABLE OF STRUC, LT_STRUC_TEMP TYPE STANDARD TABLE OF STRUC, LS_STRUC_TEMP TYPE STRUC, LS_OBJEC_TEMP TYPE OBJEC, LS_STRUC TYPE STRUC, LS_OBJEC TYPE OBJEC. DATA:LV_INDEX TYPE I, LV_LINE TYPE I. DATA:LS_CURRT_ORG TYPE ZHRLEVELORG, LS_SUP_ORG TYPE ZHRLEVELORG. CLEAR:LV_PERNR, LV_TYPE, LS_OBJEC, LS_STRUC, LV_LINE, LS_CURRT_ORG, LS_OBJEC_TEMP, LS_STRUC_TEMP, LS_SUP_ORG. REFRESH:LT_OBJEC, LT_STRUC, LT_OBJEC_TEMP, LT_STRUC_TEMP. IF I_PERNR IS INITIAL AND I_PLANS IS INITIAL AND I_ORGEH IS INITIAL AND I_UNAME IS INITIAL. MESSAGE E062(ZHR) RAISING ERROR_PARAMTER. "如果输入参数都为空报异常错误 ELSE. IF I_PERNR IS NOT INITIAL AND I_PLANS IS INITIAL AND I_ORGEH IS INITIAL AND I_UNAME IS INITIAL. LV_PERNR = I_PERNR. LV_TYPE = 'P'. ELSEIF I_PLANS IS NOT INITIAL AND I_PERNR IS INITIAL AND I_ORGEH IS INITIAL AND I_UNAME IS INITIAL. LV_PERNR = I_PLANS. LV_TYPE = 'S'. ELSEIF I_ORGEH IS NOT INITIAL AND I_PLANS IS INITIAL AND I_PERNR IS INITIAL AND I_UNAME IS INITIAL. LV_PERNR = I_ORGEH. LV_TYPE = 'O'. ELSEIF I_UNAME IS NOT INITIAL AND I_PERNR IS INITIAL AND I_ORGEH IS INITIAL AND I_PLANS IS INITIAL. SELECT SINGLE PERNR INTO LV_PERNR FROM PA0105 WHERE BEGDA <= I_DATE AND ENDDA >= I_DATE AND USRID = I_UNAME. IF SY-SUBRC = 0. LV_TYPE = 'P'. ENDIF. ELSE. MESSAGE E062(ZHR) RAISING ERROR_PARAMTER. "如果输入参数都为空报异常错误 ENDIF. *_获取组织层级信息 CALL FUNCTION 'RH_STRUC_GET' EXPORTING ACT_OTYPE = LV_TYPE ACT_OBJID = LV_PERNR ACT_WEGID = 'P-S-O-O' ACT_PLVAR = '01' ACT_BEGDA = I_DATE ACT_ENDDA = I_DATE " act_tdepth = i_level AUTHORITY_CHECK = '' TABLES RESULT_OBJEC = LT_OBJEC RESULT_STRUC = LT_STRUC EXCEPTIONS NO_PLVAR_FOUND = 1 NO_ENTRY_FOUND = 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. IF LT_OBJEC IS INITIAL. MESSAGE E064(ZHR) RAISING NO_STRUC_FOUND. ELSE. CLEAR:LS_STRUC, LS_OBJEC. *_获取指定层级的组织单位与描述 CLEAR:LV_INDEX, LS_STRUC_TEMP, LS_STRUC. IF I_ORGEH IS INITIAL. DELETE LT_STRUC WHERE OTYPE = 'P' "反向排序组织单元 OR OTYPE = 'S'. ENDIF. SORT LT_STRUC BY LEVEL DESCENDING. "lv_index = 1. LOOP AT LT_STRUC INTO LS_STRUC. LV_INDEX = LV_INDEX + 1. IF LV_INDEX = 1. LS_STRUC_TEMP = LS_STRUC. LS_STRUC_TEMP-LEVEL = LV_INDEX. APPEND LS_STRUC_TEMP TO LT_STRUC_TEMP. CLEAR LS_STRUC_TEMP. ELSE. LS_STRUC_TEMP = LS_STRUC. LS_STRUC_TEMP-LEVEL = LV_INDEX. APPEND LS_STRUC_TEMP TO LT_STRUC_TEMP. CLEAR LS_STRUC_TEMP. ENDIF. ENDLOOP. CLEAR LS_STRUC. *_获取所有上级组织单元 LOOP AT LT_STRUC_TEMP INTO LS_STRUC. READ TABLE LT_OBJEC INTO LS_OBJEC WITH KEY OBJID = LS_STRUC-OBJID. IF SY-SUBRC = 0. LS_SUP_ORG-LEVEL = LS_STRUC-LEVEL. LS_SUP_ORG-ORGEH = LS_STRUC-OBJID. LS_SUP_ORG-STEXT = LS_OBJEC-STEXT. APPEND LS_SUP_ORG TO RESULT_SUPERIOR. CLEAR LS_SUP_ORG. ENDIF. ENDLOOP. CLEAR LS_STRUC. *_判断层级参数是否输入 *_如果输入的参数是组织单元编号且指定了层级,则要取输入组织单元上一级组织单元 IF I_LEVEL IS NOT INITIAL AND I_ORGEH IS NOT INITIAL. DESCRIBE TABLE RESULT_SUPERIOR LINES LV_LINE. IF LV_LINE < I_LEVEL. LV_LINE = LV_LINE - 1. READ TABLE RESULT_SUPERIOR INTO LS_SUP_ORG "获取指定层级组织单元 WITH KEY LEVEL = LV_LINE . ELSEIF LV_LINE = I_LEVEL. LV_LINE = LV_LINE - 1. READ TABLE RESULT_SUPERIOR INTO LS_SUP_ORG WITH KEY LEVEL = LV_LINE . ELSEIF LV_LINE > I_LEVEL. READ TABLE RESULT_SUPERIOR INTO LS_SUP_ORG WITH KEY LEVEL = I_LEVEL . ENDIF. APPEND LS_SUP_ORG TO RESULT_CURRENT. CLEAR:LS_CURRT_ORG, LS_STRUC, LS_OBJEC. ELSEIF I_LEVEL IS INITIAL AND I_ORGEH IS NOT INITIAL. *_没有层级输入且输入组织单元参数 DESCRIBE TABLE RESULT_SUPERIOR LINES LV_LINE. LV_LINE = LV_LINE - 1. READ TABLE RESULT_SUPERIOR INTO LS_SUP_ORG WITH KEY LEVEL = LV_LINE . APPEND LS_SUP_ORG TO RESULT_CURRENT. CLEAR:LS_CURRT_ORG, LS_STRUC, LS_OBJEC. ELSEIF I_LEVEL IS NOT INITIAL AND I_ORGEH IS INITIAL. *_所选层级输入且没有指定组织单元参数输入 DESCRIBE TABLE RESULT_SUPERIOR LINES LV_LINE. IF LV_LINE <= I_LEVEL. READ TABLE RESULT_SUPERIOR INTO LS_SUP_ORG WITH KEY LEVEL = LV_LINE . ELSEIF LV_LINE > I_LEVEL. READ TABLE RESULT_SUPERIOR INTO LS_SUP_ORG WITH KEY LEVEL = I_LEVEL . ENDIF. APPEND LS_SUP_ORG TO RESULT_CURRENT. CLEAR:LS_CURRT_ORG, LS_STRUC, LS_OBJEC. ELSEIF I_LEVEL IS INITIAL AND I_ORGEH IS INITIAL . *_组织层级输入和组织单元输入都为空的时候取值 DESCRIBE TABLE RESULT_SUPERIOR LINES LV_LINE. READ TABLE RESULT_SUPERIOR INTO LS_SUP_ORG WITH KEY LEVEL = LV_LINE . APPEND LS_SUP_ORG TO RESULT_CURRENT. CLEAR:LS_CURRT_ORG, LS_STRUC, LS_OBJEC. ENDIF. ENDIF. CLEAR:LV_PERNR, LV_TYPE. ENDIF. ENDFUNCTION.