PD org comparison between datain and target(分批处理数据,异步调用多线程处理)


FUNCTION /NSL/_ICM_ORG_COMPARISON_P.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(P_DATE) TYPE  DATS
*"  TABLES
*"      TT_EFF_CONT STRUCTURE  ZDM_EFF_CONT_FM
*"      TT_HRP1000 STRUCTURE  ZDM_HRP_FM
*"      GT_EXCEL STRUCTURE  ZDM_EXCEL_FM
*"  EXCEPTIONS
*"      INPUT_PARAMETER_EMPTY
*"----------------------------------------------------------------------
TYPES:
  BEGIN OF TY_SHOW,
    CTRTBU_ID       TYPE ISIS_CONTRACT_ID,
    CTRTST_ID       TYPE CACS_CTRTST_ID,
    CTRTBU_ID_UP    TYPE ISIS_CONTRACT_ID,
    SHORT           TYPE SHORT_D,
    BUSI_BEGIN      TYPE CHAR20,
    BUSI_END        TYPE CHAR20,
*    BUSI_BEGIN      TYPE CACS_BUSITIME_B,
*    BUSI_END        TYPE CACS_BUSITIME_E,
  END OF TY_SHOW,
  TT_SHOW TYPE STANDARD TABLE OF TY_SHOW,

  BEGIN OF TY_EXCEL,
    AGT_AGY_NO      TYPE CHAR10,
    START_DT        TYPE CHAR20,
    REL_AGY_NO      TYPE CHAR5,
    REL_AGY_LEADER  TYPE CHAR10,
  END OF TY_EXCEL,
  TT_EXCEL TYPE SORTED TABLE OF TY_EXCEL WITH UNIQUE KEY
                                         AGT_AGY_NO
                                         START_DT,
  BEGIN OF TY_ALV,
    MANDT           TYPE  MANDT,
    AGT_AGY_NO      TYPE  ISIS_CONTRACT_ID,
    CTRTST_ID       TYPE  CACS_CTRTST_ID,
    CTRTBU_ID_UP    TYPE  HROBJID,
    SHORT           TYPE  SHORT_D,
*    BUSI_BEGIN      TYPE  BEGDATUM,
    BUSI_BEGIN      TYPE  CHAR20,
    BUSI_END        TYPE  ENDDATUM,
    REL_AGY_NO      TYPE  CHAR5,
    REL_AGY_LEADER  TYPE  CHAR10,
  END OF TY_ALV,
  TT_ALV TYPE STANDARD TABLE OF TY_ALV.

  DATA:
   LV_CURSOR         TYPE CURSOR,
   LT_SHOW           TYPE TT_SHOW,
   LS_SHOW           TYPE TY_SHOW,
   LS_CTRTBU_TMP     TYPE CACS_CTRTBU,
   LS_HRP1000        TYPE ZDM_HRP_FM,
   LV_TEMP_C         TYPE CHAR20,
   LV_C              TYPE CHAR10,
   LV_TEMP_T         TYPE CHAR20,
   LV_YEAR           TYPE CHAR4,
   LV_MM             TYPE CHAR4,
   LV_DD             TYPE CHAR4,

   lt_test           TYPE TT_EXCEL,
   LT_EXCEL          TYPE TABLE OF TY_EXCEL,
   LT_EXCEL_SORT     TYPE TT_EXCEL,
   LT_ALV            TYPE STANDARD TABLE OF TY_ALV,
   LS_ALV            TYPE TY_ALV.


  FIELD-SYMBOLS:
    <FS_EFF_CONT>    TYPE ZDM_EFF_CONT_FM,

    <FS_TARGET>   TYPE TY_SHOW,
    <FS_EXCEL>    TYPE TY_EXCEL.

  CLEAR:
    LV_CURSOR,
    LT_SHOW,
    LS_SHOW,
    LV_TEMP_C,
    LV_C,
    LV_TEMP_T,
    LV_YEAR,
    LV_MM,
    LV_DD,
    LT_EXCEL,
    LT_EXCEL_SORT,
    LT_ALV,
    LS_ALV.


  UNASSIGN:
    <FS_EFF_CONT>,
    <FS_TARGET>,
    <FS_EXCEL>.

  LOOP AT TT_EFF_CONT[] ASSIGNING <FS_EFF_CONT>.
   READ TABLE TT_HRP1000[] INTO LS_HRP1000
      WITH KEY OBJID = <FS_EFF_CONT>-OBJID.
*   get short
    IF SY-SUBRC = 0.
      <FS_EFF_CONT>-SHORT = LS_HRP1000-SHORT.
    ENDIF.
    CLEAR: LS_HRP1000.

*   get CTRTBU_ID
    CALL FUNCTION '/NSL/ICM_GET_REP_MANAGER'
      EXPORTING
       IV_OTYPE               = 'S'
       IV_OBJID               = <FS_EFF_CONT>-OBJID
       IV_BEGDA               = P_DATE
       IV_CCTR_ID             = <FS_EFF_CONT>-CTRTBU_ID
     IMPORTING
        E_MGR_CONTRACT        = LS_CTRTBU_TMP
     EXCEPTIONS
       INVALID_INPUT          = 1
       ERROR_OCCURED          = 2
       OTHERS                 = 3
              .
    IF SY-SUBRC <> 0.

    ELSE.
      IF <FS_EFF_CONT>-CTRTBU_ID IS NOT INITIAL OR
         <FS_EFF_CONT>-BEGDA     IS NOT INITIAL.

*       Change the format
        LV_TEMP_C         = <FS_EFF_CONT>-CTRTBU_ID.
        LV_C              = LV_TEMP_C+10(10).
        LS_SHOW-CTRTBU_ID = LV_C.

*       change time
*        LV_TEMP_T    = <FS_EFF_CONT>-BEGDA.
        LV_YEAR           = <FS_EFF_CONT>-BEGDA+0(4).
        LV_MM             = <FS_EFF_CONT>-BEGDA+4(2).
        LV_DD             = <FS_EFF_CONT>-BEGDA+6(2).
        CONCATENATE LV_YEAR'/'LV_MM'/'LV_DD INTO LV_TEMP_T.
        LS_SHOW-BUSI_BEGIN   = LV_TEMP_T.

      ENDIF.

*      LS_SHOW-CTRTBU_ID    = <FS_EFF_CONT>-CTRTBU_ID.
      LS_SHOW-CTRTST_ID    = <FS_EFF_CONT>-CTRTST_ID.
      LS_SHOW-CTRTBU_ID_UP = LS_CTRTBU_TMP-CTRTBU_ID+10(10).
      LS_SHOW-SHORT        = <FS_EFF_CONT>-SHORT.
*      LS_SHOW-BUSI_BEGIN   = <FS_EFF_CONT>-BEGDA.
      LS_SHOW-BUSI_END     = <FS_EFF_CONT>-ENDDA.
      APPEND LS_SHOW TO LT_SHOW.
      CLEAR:
        LS_SHOW,
        LS_CTRTBU_TMP,
        LV_TEMP_C,
        LV_C,
        LV_TEMP_T,
        LV_YEAR,
        LV_MM,
        LV_DD.
    ENDIF.

  ENDLOOP.

  SORT GT_EXCEL BY AGT_AGY_NO
                   START_DT.

  LT_EXCEL_SORT[]  = gt_excel[].
  FREE: GT_EXCEL.

* compare
  LOOP AT LT_SHOW ASSIGNING <FS_TARGET>.
    READ TABLE LT_EXCEL_SORT[] ASSIGNING <FS_EXCEL>
     WITH TABLE KEY AGT_AGY_NO    = <FS_TARGET>-CTRTBU_ID
                    START_DT      = <FS_TARGET>-BUSI_BEGIN.
    IF SY-SUBRC = 0.

      IF <FS_TARGET>-CTRTBU_ID_UP <> <FS_EXCEL>-REL_AGY_LEADER OR
         <FS_TARGET>-SHORT        <> <FS_EXCEL>-REL_AGY_NO.

        LS_ALV-AGT_AGY_NO         = <FS_TARGET>-CTRTBU_ID    .
        LS_ALV-CTRTST_ID          = <FS_TARGET>-CTRTST_ID    .
        LS_ALV-CTRTBU_ID_UP       = <FS_TARGET>-CTRTBU_ID_UP .
        LS_ALV-SHORT              = <FS_TARGET>-SHORT        .
        LS_ALV-BUSI_BEGIN         = <FS_TARGET>-BUSI_BEGIN   .
        LS_ALV-BUSI_END           = <FS_TARGET>-BUSI_END     .
        LS_ALV-REL_AGY_NO         = <FS_EXCEL>-REL_AGY_NO    .
        LS_ALV-REL_AGY_LEADER     = <FS_EXCEL>-REL_AGY_LEADER.
        APPEND LS_ALV TO LT_ALV.
        CLEAR:LS_ALV.
      ENDIF.

    ELSE.

      LS_ALV-MANDT                = SY-MANDT.
      LS_ALV-AGT_AGY_NO           = <FS_TARGET>-CTRTBU_ID    .
      LS_ALV-CTRTST_ID            = <FS_TARGET>-CTRTST_ID    .
      LS_ALV-CTRTBU_ID_UP         = <FS_TARGET>-CTRTBU_ID_UP .
      LS_ALV-SHORT                = <FS_TARGET>-SHORT        .
      LS_ALV-BUSI_BEGIN           = <FS_TARGET>-BUSI_BEGIN   .
      LS_ALV-BUSI_END             = <FS_TARGET>-BUSI_END     .
      LS_ALV-REL_AGY_NO           = 'none'   .
      LS_ALV-REL_AGY_LEADER       = 'none'.
      APPEND LS_ALV TO LT_ALV.
      CLEAR:LS_ALV.

    ENDIF.

  ENDLOOP.

  IF LT_ALV IS NOT INITIAL.
    MODIFY ZDM_RESULT FROM TABLE LT_ALV.
    IF sy-subrc = 0.
      COMMIT WORK.
    ELSE.
      ROLLBACK WORK.
      MESSAGE 'have error when save to db!' TYPE 'E'.
    ENDIF.
  ENDIF.

ENDFUNCTION.


*&---------------------------------------------------------------------*
*& Report  ZDM_ICM_PD_ORG_COMPARISON_TEST
*&---------------------------------------------------------------------*
*&Created by James on 2018/06/22
*&---------------------------------------------------------------------*
*& PD org comparison between datain and target
*&---------------------------------------------------------------------*
REPORT ZDM_ICM_PD_ORG_COMPARISON_P.
TYPE-POOLS TRUXS.
*&---------------------------------------------------------------------*
*&  DATA DEFINE
*&---------------------------------------------------------------------*
TYPES:
  BEGIN OF TY_SHOW,
    CTRTBU_ID       TYPE ISIS_CONTRACT_ID,
    CTRTST_ID       TYPE CACS_CTRTST_ID,
    CTRTBU_ID_UP    TYPE ISIS_CONTRACT_ID,
    SHORT           TYPE SHORT_D,
    BUSI_BEGIN      TYPE CHAR20,
    BUSI_END        TYPE CHAR20,
  END OF TY_SHOW,
  TT_SHOW TYPE STANDARD TABLE OF TY_SHOW,

  BEGIN OF TY_EFF_CONT,
    CTRTBU_ID       TYPE ISIS_CONTRACT_ID,
    CTRTST_ID       TYPE CACS_CTRTST_ID,
    OBJID           TYPE HROBJID,
    SHORT           TYPE SHORT_D,
    BEGDA           TYPE BEGDATUM,
    ENDDA           TYPE ENDDATUM,
  END OF TY_EFF_CONT,
  TT_EFF_CONT TYPE STANDARD TABLE OF TY_EFF_CONT,

  BEGIN OF TY_HRP1000,
  OBJID             TYPE HROBJID,
  SHORT             TYPE SHORT_D,
  END OF TY_HRP1000,
  TT_HRP1000 TYPE STANDARD TABLE OF TY_HRP1000,

  BEGIN OF TY_EXCEL,
    AGT_AGY_NO      TYPE CHAR10,
    START_DT        TYPE CHAR20,
    REL_AGY_NO      TYPE CHAR5,
    REL_AGY_LEADER  TYPE CHAR10,
  END OF TY_EXCEL,
  TT_EXCEL TYPE SORTED TABLE OF TY_EXCEL WITH UNIQUE KEY
                                         AGT_AGY_NO
                                         START_DT,
  BEGIN OF TY_ALV,
    AGT_AGY_NO      TYPE  ISIS_CONTRACT_ID,
    CTRTST_ID       TYPE  CACS_CTRTST_ID,
    CTRTBU_ID_UP    TYPE  HROBJID,
    SHORT           TYPE  SHORT_D,
    BUSI_BEGIN      TYPE  CHAR20,
    BUSI_END        TYPE  ENDDATUM,
    REL_AGY_NO      TYPE  CHAR5,
    REL_AGY_LEADER  TYPE  CHAR10,
  END OF TY_ALV,
  TT_ALV TYPE STANDARD TABLE OF TY_ALV.

TYPES:
  BEGIN OF gty_pol,
    batch       TYPE i,
    tb_EFF_CONT TYPE REF TO data,
  END OF gty_pol.

CONSTANTS:
  C_SPACE           TYPE CHAR1 VALUE ' ',
  C_TPE_S           TYPE CHAR1 VALUE 'S',
  C_TPE_O           TYPE CHAR1 VALUE 'O',
  C_01              TYPE CHAR2 VALUE '01',
  C_ZICNSL          TYPE CHAR6 VALUE 'ZICNSL'.

DATA:
  GV_HAVE_ERROR     TYPE CHAR1,
  GT_RAW            TYPE TRUXS_T_TEXT_DATA,
  GT_EXCEL          TYPE TABLE OF TY_EXCEL,
  GS_EXCEL          TYPE TY_EXCEL,
  GT_FIELDCAT       TYPE lVC_T_FCAT,
  GS_FIELDCAT       TYPE lVC_S_FCAT,
  GS_LAYOUT         TYPE lVC_S_LAYO,
  GT_EFF_CONT       TYPE STANDARD TABLE OF TY_EFF_CONT.

DATA:
  BEGIN OF it_field OCCURS 0 ,
    field(100),
  END OF it_field.

DATA:
  gv_lines    TYPE i,
  gv_batch    TYPE i,
  lv_batch    TYPE i,
  gt_pol      TYPE STANDARD TABLE OF gty_pol,
  gs_pol      TYPE gty_pol,
  s_date1     TYPE datum.

DATA:
  r_pol          TYPE RANGE OF cacs_ctrtbu-ctrtbu_id,
  r_pol_line     LIKE LINE OF r_pol,
  lv_cursor      TYPE cursor,
  g_running      TYPE i,
  g_taskno       TYPE string,
  lv_packet_size TYPE i.
*&---------------------------------------------------------------------*
*&  INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.
  CLEAR:
    GV_HAVE_ERROR,
    GT_RAW,
    GT_EXCEL,
    GS_EXCEL,
    GT_FIELDCAT,
    GS_FIELDCAT,
    GS_LAYOUT.
*&---------------------------------------------------------------------*
*&  PARAMETERS DEFINITION
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-b01.
PARAMETERS:
  P_INTER RADIOBUTTON GROUP RD1 TYPE CHAR1,
  P_EXTER RADIOBUTTON GROUP RD1 TYPE CHAR1 DEFAULT 'X',
  FILEPATH TYPE STRING DEFAULT 'C:/TEST.XLS',
  P_DATE   TYPE DATS DEFAULT SY-DATUM,
  P_DOW    TYPE CHAR1 AS CHECKBOX.
*  P_COM    TYPE CHAR1 AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b01.

SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE text-b02.
PARAMETERS:
*  P_COM    TYPE CHAR1 AS CHECKBOX,
  P_FILE   LIKE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b02.

SELECTION-SCREEN BEGIN OF BLOCK bk3 WITH FRAME.
PARAMETERS: p_pll    AS CHECKBOX,
            p_prcno  TYPE i DEFAULT 50 OBLIGATORY,
            p_maxpol TYPE i DEFAULT 2000 OBLIGATORY,
            p_pksz   TYPE i DEFAULT '2000000' OBLIGATORY.
SELECTION-SCREEN END OF BLOCK bk3.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
 EXPORTING
   PROGRAM_NAME        = SYST-REPID
   DYNPRO_NUMBER       = SYST-DYNNR
   STATIC              = 'X'
   MASK                = ',*.XLS,*.XLS'
  CHANGING
    FILE_NAME          = P_FILE
 EXCEPTIONS
   MASK_TOO_LONG       = 1
   OTHERS              = 2.

  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
    MESSAGE 'have error when reading excel!' TYPE 'E'.
    EXIT.
  ENDIF.

CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
  EXPORTING
*   I_FIELD_SEPERATOR          =
    I_LINE_HEADER              = 'X'
    I_TAB_RAW_DATA             = GT_RAW
    I_FILENAME                 = P_FILE
  TABLES
    I_TAB_CONVERTED_DATA       = GT_EXCEL
 EXCEPTIONS
   CONVERSION_FAILED          = 1
   OTHERS                     = 2.

  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
    MESSAGE 'have error when reading excel!' TYPE 'E'.
    EXIT.
  ENDIF.
*&---------------------------------------------------------------------*
*&  START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*内勤
IF P_INTER = ABAP_TRUE.

*外勤
ELSEIF P_EXTER = ABAP_TRUE.

  PERFORM SET_EFFICTIVE_CONTRACT.

  IF GV_HAVE_ERROR = ABAP_TRUE.
    MESSAGE ' CAN NOT FOUND ANY DATA IN TABLE!' TYPE 'E'.
  ENDIF.

  PERFORM ALV_SHOW.
ENDIF.
*&---------------------------------------------------------------------*
*&      Form  SET_EFFICTIVE_CONTRACT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SET_EFFICTIVE_CONTRACT .
  DATA:
   LV_CURSOR         TYPE CURSOR,
   LT_EFF_CONT       TYPE STANDARD TABLE OF TY_EFF_CONT,
   LT_EFF_CONT_TEMP  TYPE STANDARD TABLE OF TY_EFF_CONT,
   LT_SHOW           TYPE TT_SHOW,
   LS_SHOW           TYPE TY_SHOW,
   LT_HRP1000        TYPE STANDARD TABLE OF TY_HRP1000,
   LS_HRP1000        TYPE TY_HRP1000,
   LS_CTRTBU_TMP     TYPE CACS_CTRTBU,
   LV_TEMP_C         TYPE CHAR20,
   LV_C              TYPE CHAR10,
   LV_TEMP_T         TYPE CHAR20,
   LV_YEAR           TYPE CHAR4,
   LV_MM             TYPE CHAR4,
   LV_DD             TYPE CHAR4.

  FIELD-SYMBOLS:
    <FS_EFF_CONT>    TYPE TY_EFF_CONT.

  CLEAR:
    LV_CURSOR,
    LT_EFF_CONT,
    LT_EFF_CONT_TEMP,
    LT_SHOW,
    LS_SHOW,
    LS_CTRTBU_TMP,
    LV_TEMP_C,
    LV_C,
    LV_TEMP_T,
    LV_YEAR,
    LV_MM,
    LV_DD.

  UNASSIGN:
    <FS_EFF_CONT>.

  OPEN CURSOR WITH HOLD LV_CURSOR FOR
  SELECT A~CTRTBU_ID
         A~CTRTST_ID
         B~OBJID
         B~BEGDA
         B~ENDDA
      FROM CACS_CTRTBU   AS A
     INNER JOIN HRVPADIC AS B
     ON   A~CTRTBU_ID       = B~CONTRACT_ID
    WHERE A~FLG_CANCEL_OBJ  = C_SPACE  AND
          A~FLG_CANCEL_VERS = C_SPACE  AND
          A~CTRTBU_ID       <> C_SPACE AND
          A~BUSI_BEGIN      <= P_DATE  AND
          A~BUSI_END        >= P_DATE  AND
          B~OTYPE           = C_TPE_S  AND
          B~PLVAR           = C_01     AND
          B~BEGDA           <= P_DATE  AND
          B~ENDDA           >= P_DATE  AND
          B~CONTRACT_APPL   = C_ZICNSL.

  CLEAR gv_batch.
  DO.
    FETCH NEXT CURSOR LV_CURSOR INTO CORRESPONDING FIELDS OF GT_EFF_CONT
     PACKAGE SIZE p_pksz.
    IF SY-SUBRC <> 0.
      CLOSE CURSOR LV_CURSOR.
      EXIT.
    ELSE.
      SORT GT_EFF_CONT BY CTRTBU_ID.
      DELETE ADJACENT DUPLICATES FROM GT_EFF_CONT COMPARING CTRTBU_ID .
    ENDIF.
    gv_batch = gv_batch + 1.
    CLEAR gs_pol.
    gs_pol-batch = gv_batch.
    CREATE DATA gs_pol-tb_EFF_CONT TYPE STANDARD TABLE OF TY_EFF_CONT.
    ASSIGN gs_pol-tb_EFF_CONT->* TO FIELD-SYMBOL(<lfs_tb>).
    <lfs_tb> = GT_EFF_CONT[].
    APPEND gs_pol TO gt_pol.
  ENDDO.

  CLEAR lv_batch.
  FIELD-SYMBOLS <lfs_temp> TYPE ANY TABLE.
  DO gv_batch TIMES.
    lv_batch = lv_batch + 1.
    CLEAR GT_EFF_CONT.
    READ TABLE gt_pol INTO gs_pol WITH KEY batch = lv_batch.
    IF sy-subrc = 0.
      ASSIGN gs_pol-tb_EFF_CONT->* TO <lfs_temp>.
      GT_EFF_CONT = <lfs_temp>.
    ENDIF.

    IF p_pll = 'X' AND GT_EFF_CONT IS NOT INITIAL.
      PERFORM parallel_processing.
    ELSE.
    ENDIF.
  ENDDO.

  IF GT_EFF_CONT IS INITIAL.
   GV_HAVE_ERROR = ABAP_TRUE.
   RETURN.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PARALLEL_PROCESSING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PARALLEL_PROCESSING .
  TYPES:
    BEGIN OF TY_HRP1000,
    OBJID             TYPE HROBJID,
    SHORT             TYPE SHORT_D,
    END OF TY_HRP1000,
    TT_HRP1000 TYPE STANDARD TABLE OF TY_HRP1000,

    BEGIN OF TY_HRP1001,
      SOBID TYPE HROBJID,
      objid TYPE HROBJID,
    END OF TY_HRP1001,
    TT_HRP1001 TYPE STANDARD TABLE OF TY_HRP1001,

    BEGIN OF TY_HRP1001_chan,
      SOBID TYPE SOBID,
      OBJID TYPE HROBJID,
    END OF TY_HRP1001_chan,
    TT_HRP1001_chan TYPE STANDARD TABLE OF TY_HRP1001_chan,

    BEGIN OF TY_HRP1001_temp,
      SOBID TYPE num8,
      OBJID TYPE HROBJID,
    END OF TY_HRP1001_temp,
    TT_HRP1001_temp TYPE STANDARD TABLE OF TY_HRP1001_temp.

  DATA: l_last,
        l_rec_cnt        TYPE i,
        l_task_idx(5)    TYPE n.

  DATA: lo_cx_root       TYPE REF TO cx_root,
        l_exception      TYPE        string,
        l_error_msg(100),
        ls_EFF_cont      TYPE TY_EFF_CONT.

  DATA: lt_contract_pall TYPE STANDARD TABLE OF TY_EFF_CONT,
        ls_contract_pall TYPE TY_EFF_CONT,
        lt_hrp1001       TYPE TABLE OF TY_HRP1001,
        lv_no_of_pp      TYPE i ,
        LT_HRP1000       TYPE STANDARD TABLE OF TY_HRP1000,
        LT_HRP1000_temp  TYPE STANDARD TABLE OF TY_HRP1000,
        LS_HRP1000       TYPE TY_HRP1000,
        lt_hrp1001_temp  TYPE TABLE OF TY_HRP1001_temp,
        ls_hrp1001_temp  TYPE TY_HRP1001_temp,
        lt_hrp1001_chan  TYPE TABLE OF TY_HRP1001_chan,
        LT_SHOW          TYPE TT_SHOW,
        LS_SHOW          TYPE TY_SHOW,
        LS_CTRTBU_TMP    TYPE CACS_CTRTBU,
        LV_TEMP_C        TYPE CHAR20,
        LV_C             TYPE CHAR10,
        LV_TEMP_T        TYPE CHAR20,
        LV_YEAR          TYPE CHAR4,
        LV_MM            TYPE CHAR4,
        LV_DD            TYPE CHAR4,
        lv_chan_forma    TYPE num8.

  FIELD-SYMBOLS:
    <FS_EFF_CONT>      TYPE TY_EFF_CONT,
    <fs_hrp1001>       TYPE TY_HRP1001,
    <fs_HRP1000>       TYPE TY_HRP1000,
    <fs_HRP1000_temp>  TYPE TY_HRP1000,
    <fs_hrp1001_temp>  TYPE TY_HRP1001_temp,
    <fs_HRP1001_chan>  TYPE TY_HRP1001_chan.

  CLEAR:
    l_rec_cnt,
    lt_contract_pall,
    ls_eff_cont.

  lv_no_of_pp  = p_prcno.

  LOOP AT GT_EFF_CONT INTO ls_eff_cont.
    APPEND ls_eff_cont TO lt_contract_pall.
    l_rec_cnt = l_rec_cnt + 1.

    AT LAST.
      l_last = 'X'.

*     get ID of Related Object from hrp1001
      SELECT SOBID OBJID INTO CORRESPONDING FIELDS OF TABLE LT_HRP1001_chan
        from HRP1001
        FOR ALL ENTRIES IN GT_EFF_CONT
        WHERE OBJID = GT_EFF_CONT-OBJID
        AND   PLVAR = '01'
        AND   RSIGN = 'A'
        AND   RELAT = '003'
        AND   SCLAS = 'O'
        AND   BEGDA <= P_DATE
        AND   ENDDA >  P_DATE.

      IF lt_hrp1001_chan IS INITIAL.
        RETURN.
      ENDIF.

      SORT lt_hrp1001_chan BY SOBID objid. "#EC CI_SORTLOOP
      DELETE ADJACENT DUPLICATES FROM lt_hrp1001_chan COMPARING SOBID objid.
      MOVE-CORRESPONDING lt_hrp1001_chan to lt_hrp1001.

*     get agency_code from hrp1000
      SELECT objid
             SHORT INTO CORRESPONDING FIELDS OF TABLE LT_HRP1000_temp
        FROM HRP1000
        FOR ALL ENTRIES IN LT_HRP1001
        WHERE OBJID = LT_HRP1001-SOBID
        AND   OTYPE = C_TPE_O
        AND   BEGDA <= P_DATE
        AND   ENDDA >  P_DATE.                      "CI_FAE_LINES_ENSURED

      IF SY-SUBRC = 0.
        SORT LT_HRP1000_temp BY OBJID SHORT . "#EC CI_SORTLOOP
        DELETE ADJACENT DUPLICATES FROM LT_HRP1000_temp COMPARING OBJID SHORT.

        LOOP AT lt_hrp1001 ASSIGNING <FS_HRP1001>.
          READ TABLE LT_HRP1000_temp ASSIGNING <FS_HRP1000_temp>
            WITH KEY objid = <FS_HRP1001>-sobid.
          IF  sy-subrc = 0.
            LS_HRP1000-objid = <FS_HRP1001>-objid.
            LS_HRP1000-short = <FS_HRP1000_temp>-short.
            APPEND LS_HRP1000 to LT_HRP1000.
            CLEAR:LS_HRP1000.
          ENDIF.
        ENDLOOP.

     ELSE.
       GV_HAVE_ERROR = ABAP_TRUE.
       RETURN.
      ENDIF.
    ENDAT.

    IF l_rec_cnt >= p_maxpol OR l_last = 'X'.
      l_task_idx = l_task_idx + 1.
      CONCATENATE 'ZDM_ICM_ACCBAL_TEST' l_task_idx INTO g_taskno.
      DO 1 TIMES.
        TRY.
           CALL FUNCTION '/NSL/_ICM_ORG_COMPARISON_P'
           STARTING NEW TASK g_taskno
           DESTINATION IN GROUP DEFAULT
           PERFORMING end_of_process ON END OF TASK
           EXPORTING
            P_DATE            = p_date
           TABLES
            TT_EFF_CONT       = lt_contract_pall
            TT_HRP1000        = LT_HRP1000
            GT_EXCEL          = GT_EXCEL
            EXCEPTIONS
                communication_failure = 1 MESSAGE l_error_msg
                system_failure        = 2 MESSAGE l_error_msg
                resource_failure      = 3
                other                 = 99.

            IF sy-subrc = 1.
            ELSEIF sy-subrc = 2.
            ELSEIF sy-subrc = 3.
            ENDIF.
          CATCH cx_root INTO lo_cx_root.
            l_exception = lo_cx_root->get_text( ).
        ENDTRY.
        CASE sy-subrc.
          WHEN 0.
            g_running = g_running + 1.
            EXIT.
          WHEN 1 OR 2 OR 99.
            IF l_exception NE space.
              l_error_msg = l_exception.
            ENDIF.

            IF l_error_msg IS INITIAL.
              MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                      INTO l_error_msg
                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ENDIF.
            WRITE:/ g_taskno, 'RFC call failed:', l_error_msg.
            EXIT.
          WHEN 3.
            WAIT UP TO 5 SECONDS.
            WAIT FOR ASYNCHRONOUS TASKS UNTIL g_running < lv_no_of_pp.
            IF sy-index = 10.
              WRITE:/ g_taskno, 'RFC call failed: Waited resource for more than 10 times'.
              EXIT.
            ENDIF.
* check number of available resource with SPBT_INITIALIZE
        ENDCASE.
      ENDDO.
      CLEAR: l_rec_cnt, lt_contract_pall.
    ENDIF.
    WAIT FOR ASYNCHRONOUS TASKS UNTIL g_running < lv_no_of_pp.
    CLEAR:
    ls_eff_cont.
  ENDLOOP.

* wait until all jobs finished
  WAIT FOR ASYNCHRONOUS TASKS UNTIL g_running = 0.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  END_OF_PROCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM end_of_process  USING    p_taskno.

  DATA: l_msg(100).

  RECEIVE RESULTS FROM FUNCTION '/NSL/_ICM_ORG_COMPARISON_P'
    EXCEPTIONS
      communication_failure = 1 MESSAGE l_msg
      system_failure        = 2 MESSAGE l_msg
      OTHERS                = 3.
  IF sy-subrc = 0.
  ELSE.
    WRITE:/ p_taskno, 'RFC call failed(Receive):', l_msg.
  ENDIF.
  g_running = g_running - 1.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  ALV_SHOW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ALV_SHOW .
  DATA:
    lt_alv TYPE STANDARD TABLE OF TY_ALV.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-ZEBRA      = 'X'.
  GS_LAYOUT-SEL_MODE   = 'D'.

  gs_fieldcat-fieldname = 'AGT_AGY_NO'.
  gs_fieldcat-coltext   = 'AGT_AGY_NO'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'CTRTST_ID'.
  gs_fieldcat-coltext   = 'CTRTST_ID'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'CTRTBU_ID_UP'.
  gs_fieldcat-coltext   = 'CTRTBU_ID_UP'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'SHORT'.
  gs_fieldcat-coltext   = 'SHORT'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'BUSI_BEGIN'.
  gs_fieldcat-coltext   = 'BUSI_BEGIN'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'BUSI_END'.
  gs_fieldcat-coltext   = 'BUSI_END'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'REL_AGY_NO'.
  gs_fieldcat-coltext   = 'REL_AGY_NO'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'REL_AGY_LEADER'.
  gs_fieldcat-coltext   = 'REL_AGY_LEADER'.
  gs_fieldcat-outputlen = '20'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.


  SELECT * FROM ZDM_RESULT INTO CORRESPONDING FIELDS OF TABLE LT_alv.  "#EC CI_NOWHERE

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      is_layout_lvc      = gs_layout
      it_fieldcat_lvc    = gt_fieldcat
     I_SAVE             = 'A'
    TABLES
      t_outtab           = LT_ALV
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.

The FM for

/NSL/_ICM_ORG_COMPARISON_P

原文地址:https://www.cnblogs.com/HARU/p/9294700.html