SAP-HR人事

REPORT zhr001.

*&---------------------------------------------------------------------*
* Module Name       : HR
* Program ID        : ZHR001
* Program Name      : 人员信息报表
* Transaction Code  : ZHR001
*&---------------------------------------------------------------------*
* <Process Note>
*
*&---------------------------------------------------------------------*
* <Update Record>
* Update Date     Update MNo.   Modifier       Update Text
* -----------     ----           ------------   -----------------------*
*
*&---------------------------------------------------------------------*
TYPE-POOLS: slis.
TABLES: t001w,mara,vbak,vbap,kna1,likp,lips,vbkd,t001l,mcha,pa0001.
TABLES: yhr_pa_0001,pa0000,pa0016,pa0002,echevg.

*&---------------------------------------------------------------------*
*   类型定义
*&---------------------------------------------------------------------*

TYPES: BEGIN OF typ_output.
TYPES:  chx TYPE char1.
TYPES:  usrid TYPE pa0105-usrid,                   " 就餐卡号
        pernr TYPE pa0000-pernr,                   " 工号
        werks TYPE pa0001-werks,                   " 人事范围
        name1 TYPE t500p-name1,                    " 人事范围描述
        zegid TYPE yhr_pa_0000-zegid,              " 族群
        zenam TYPE yhr_pa_0000-zegname,            " 族群名称
        orgeh TYPE pa0001-orgeh,                   " 部门
        ortxt TYPE stext,                          " 部门名称
        zname TYPE char30,                         " 姓名
        docnm TYPE pa0533-docnm,                   " 档案编号
        zlevl TYPE yhr_pa_0001-zeglevel,           " 岗位定级
        plans TYPE pa0001-plans,                   "岗位编号
        stext TYPE hrp1000-stext,                  " 岗位
        racky TYPE pa0529-racky,                   " 民族

        cdate TYPE pa0000-endda,                   " 调动时间
        oorgh TYPE pa0001-orgeh,                   " 原-部门
        oortt TYPE stext,                          " 原-部门名称
        ozlel TYPE yhr_pa_0001-zeglevel,           " 原-岗位定级
        ostxt TYPE hrp1000-stext,                  " 原-岗位
        oplans TYPE pa0001-plans,                   "原岗位编号

        ltext TYPE text50,                   " 民族描述
        icnum TYPE pa0185-icnum,                   " 身份证号
        zzage TYPE cmp_loval,                          " 年龄
        gbdat TYPE pa0002-gbdat,                   " 出生日期
        dat04 TYPE pa0041-dat04,                   " 退休日期
        gesch TYPE pa0002-gesch,                   " 性别
        slart TYPE pa0022-slart,                   " 学历
        slext TYPE sltxt,                   " 学历文本
        insti TYPE pa0022-insti,                   " 毕业院校
        endda TYPE pa0022-endda,                   " 毕业时间
        zmaor TYPE pa0022-zmajor,                  " 专业
        pcode TYPE pa0529-pcode,                   " 政治面貌
        ptext TYPE pcn_ptext,                   " 政治面貌描述
        famst TYPE pa0002-famst,                   " 婚姻
        fatxt TYPE fatxt,                          " 婚姻描述
        ztile TYPE pa0529-zjtitle,                 " 职称
        zusid TYPE pa0105-usrid,                   " 联系电话
        musid TYPE pa0105-usrid,                   " 邮箱
        dat01 TYPE pa0041-dat01,                   " 集团入职日
*        dat1z TYPE pa0041-dat01,                   " 集团年限
        dat1z TYPE i,                   " 集团年限
        dat02 TYPE pa0041-dat02,                   " 公司入职日
        dat2z TYPE i,                   " 工龄年限
*        prbzt TYPE pa0016-prbzt,                   " 试用截止日
        prbzt TYPE begda,                   " 试用截止日
        cttyp TYPE pa0016-cttyp,                   " 合同期限
        cttxt TYPE cttxt,                   " 合同期限描述
        ctedt TYPE pa0016-ctedt,                   " 合同截止日
        zznum TYPE char5,                          " 合同次数
        zhkxz TYPE pa0002-zhkxz,                   " 本地/外地户口性质
        dtext TYPE val_text,                   " 本地/外地户口性质描述
        gbdep TYPE pa0002-gbdep,                   " 籍贯
        bezei TYPE bezei20,                   " 籍贯描述
        locat TYPE pa0006-locat,                   " 家庭住址
        loatz TYPE pa0006-locat,                   " 现居住地址
        zzflg TYPE char1,                          " 是否入住宿舍
        useto TYPE pa0185-useto,                   " 身份证期限
        ustoe TYPE pa0185-useto,                   "暂住证期限
        bankl TYPE pa0009-bankl ,                  " 银行
        banka TYPE banka ,                  " 银行名称
        bannk TYPE char30 ,                        " 账户
        begda TYPE pa0000-begda ,                  " 离职时间
        begdz TYPE pa0000-begda ,                  " 退休时间
        zlzyy TYPE pa9000-zlzyy ,                  " 离职原因
        zsbgj TYPE pa9000-zsbgj,                   " 离职社保公积金说明
        stat2 TYPE pa0000-stat2 ,                  " 状态
        s2txt TYPE t529u-text1 ,                   " 状态描述
        zzrq  TYPE pa0000-begda.                   "转正日期

TYPES:  zflg TYPE char1.
TYPES: END OF typ_output.



DATA: lt_pa0001 TYPE STANDARD TABLE OF pa0001,
      ls_pa0001 TYPE pa0001,
      lt_pa0002 TYPE STANDARD TABLE OF pa0002,
      ls_pa0002 TYPE pa0002,
      lt_pa0000 TYPE STANDARD TABLE OF pa0000,
      ls_pa0000 TYPE pa0000,
      lt_pa0006 TYPE STANDARD TABLE OF pa0006,
      ls_pa0006 TYPE pa0006,
      lt_pa0009 TYPE STANDARD TABLE OF pa0009,
      ls_pa0009 TYPE pa0009,
      lt_pa0016 TYPE STANDARD TABLE OF pa0016,
      ls_pa0016 TYPE pa0016,
      lt_pa0022 TYPE STANDARD TABLE OF pa0022,
      ls_pa0022 TYPE pa0022,
      lt_pa0041 TYPE STANDARD TABLE OF pa0041,
      ls_pa0041 TYPE pa0041,
      lt_pa0529 TYPE STANDARD TABLE OF pa0529,
      ls_pa0529 TYPE pa0529,
      lt_pa0533 TYPE STANDARD TABLE OF pa0533,
      ls_pa0533 TYPE pa0533,
      lt_pa9000 TYPE STANDARD TABLE OF pa9000,
      ls_pa9000 TYPE pa9000,
      lt_pa0185 TYPE STANDARD TABLE OF pa0185,
      ls_pa0185 TYPE pa0185,
      lt_pa0105 TYPE STANDARD TABLE OF pa0105,
      ls_pa0105 TYPE pa0105.
DATA: lt_hrp1000 TYPE STANDARD TABLE OF hrp1000,
      ls_hrp1000 TYPE hrp1000.
DATA: ls_yhr_pa_0001 TYPE yhr_pa_0001,
      lt_yhr_pa_0001 TYPE STANDARD TABLE OF yhr_pa_0001,
      ls_yhr_pa_0000 TYPE yhr_pa_0000,
      lt_yhr_pa_0000 TYPE STANDARD TABLE OF yhr_pa_0000.
DATA: lt_t529u  TYPE STANDARD TABLE OF t529u,
      ls_t529u  TYPE t529u,
      lt_t505s  TYPE STANDARD TABLE OF t505s,
      ls_t505s  TYPE t505s,
      lt_t502t  TYPE STANDARD TABLE OF t502t,
      ls_t502t  TYPE t502t,
      lt_t005u  TYPE STANDARD TABLE OF t005u,
      ls_t005u  TYPE t005u,
      lt_t517t  TYPE STANDARD TABLE OF t517t,
      ls_t517t  TYPE t517t,
      lt_t7cn5r TYPE STANDARD TABLE OF t7cn5r,
      ls_t7cn5r TYPE t7cn5r,
      lt_t547s  TYPE STANDARD TABLE OF t547s,
      ls_t547s  TYPE t547s,
      lt_t500p  TYPE STANDARD TABLE OF t500p,
      ls_t500p  TYPE t500p.
DATA: lt_bnka TYPE STANDARD TABLE OF bnka,
      ls_bnka TYPE bnka.
DATA: lt_pa0001_tmp TYPE STANDARD TABLE OF pa0001,
      ls_pa0001_tmp TYPE pa0001,
      lt_pa0000_tmp TYPE STANDARD TABLE OF pa0000,
      ls_pa0000_tmp TYPE pa0000.
DATA: lt_pa0001_new TYPE STANDARD TABLE OF pa0001,
      ls_pa0001_new TYPE pa0001,
      lt_pa0000_new TYPE STANDARD TABLE OF pa0000,
      ls_pa0000_new TYPE pa0000,
      lt_pa0000_no3 TYPE STANDARD TABLE OF pa0000,
      ls_pa0000_no3 TYPE pa0000,
      lt_pa0001_no3 TYPE STANDARD TABLE OF pa0001,
      ls_pa0001_no3 TYPE pa0001.
DATA: lf_massn_cts  TYPE i.
DATA: lf_dlydy TYPE dlydy.

DATA: ls_taba TYPE dd07v.
DATA: lt_taba TYPE STANDARD TABLE OF dd07v,
      lt_tabb TYPE STANDARD TABLE OF dd07v.

DATA: lt_pa0000_own TYPE STANDARD TABLE OF pa0000,
      ls_pa0000_own TYPE pa0000,
      lt_pa0001_own TYPE STANDARD TABLE OF pa0001,
      ls_pa0001_own TYPE pa0001.
DATA: lf_leave_num  TYPE sy-tabix.

DATA: lf_leave_flg  TYPE char1.    " 离职退休标识

*&---------------------------------------------------------------------*
*   变量定义
*&---------------------------------------------------------------------*
DATA: gf_counts TYPE char1,
      gf_cdays  TYPE int1,
      gf_names  TYPE char15,
      gr_grid   TYPE REF TO cl_gui_alv_grid.

CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.
    DATA: ucomm TYPE sy-ucomm.

    METHODS handle_data_changed
                  FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed.
    METHODS handle_data_changed_finished
                  FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.
  PRIVATE SECTION.
ENDCLASS.                    "lcl_event_receiver DEFINITION

CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_data_changed.
    PERFORM data_changed USING er_data_changed.
    DATA: ls_stbl TYPE lvc_s_stbl.
    CLEAR: ls_stbl.
    ls_stbl-row = 'X'." 基于行的稳定刷新
    ls_stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD gr_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl.
  ENDMETHOD.                    "handle_data_changed

  METHOD handle_data_changed_finished.
    PERFORM data_changed_finished USING e_modified et_good_cells.
    DATA: ls_stbl TYPE lvc_s_stbl.
    CLEAR: ls_stbl.
    ls_stbl-row = 'X'." 基于行的稳定刷新
    ls_stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD gr_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl.
  ENDMETHOD.                    "handle_data_changed_finished

ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

DATA: go_event_receiver TYPE REF TO lcl_event_receiver.


DATA: gt_tools         TYPE ui_functions WITH HEADER LINE,
      gt_cellcolor     TYPE lvc_t_scol,
      gs_cellcolor     TYPE lvc_s_scol,
      gt_events        TYPE slis_t_event,
      gs_events        TYPE slis_alv_event,
      gs_grid_settings TYPE lvc_s_glay,
      gt_fieldcat      TYPE lvc_t_fcat, "FCAT 定义ALV控件显示的字段
      gs_fieldcat      TYPE lvc_s_fcat,
      gs_layout        TYPE lvc_s_layo, "LAYO  定义ALV控件的布局和样式
      gt_sort          TYPE lvc_t_sort,
      gw_sort          TYPE lvc_s_sort. "所需参数,用以自定义ALV控件
DATA: gt_output TYPE STANDARD TABLE OF typ_output,
      gs_output TYPE typ_output.


*&---------------------------------------------------------------------*
*   选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk1  WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_werks  FOR  pa0001-werks MODIF ID m1.
SELECT-OPTIONS: s_stat2  FOR  pa0000-stat2 NO INTERVALS  MODIF ID m1 NO-DISPLAY.

*PARAMETERS: p_werks TYPE pa0001-werks OBLIGATORY MODIF ID m1,
*            p_stat2 TYPE pa0000-stat2 MODIF ID m1.
SELECT-OPTIONS: s_pernr  FOR  pa0001-pernr MODIF ID m1,
                s_level  FOR  yhr_pa_0001-zeglevel MODIF ID m1,
                s_orgeh  FOR  pa0001-orgeh MODIF ID m1,
                s_cdate  FOR  pa0000-endda MODIF ID m1,
                s_ldate  FOR  pa0000-endda MODIF ID m1,
                s_gbdat  FOR  pa0002-gbdat MODIF ID m2,
                s_mthflg  FOR  echevg-mthflg NO INTERVALS   MODIF ID m2,
                s_prbzt  FOR  pa0016-endda MODIF ID m2.

SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF BLOCK blk2  WITH FRAME TITLE text-002.

PARAMETERS: p_cr RADIOBUTTON GROUP a1 DEFAULT 'X' USER-COMMAND f1,
            p_qr RADIOBUTTON GROUP a1,
            p_er RADIOBUTTON GROUP a1."退休
SELECTION-SCREEN END OF BLOCK blk2.
SELECTION-SCREEN END OF BLOCK blk1.
*SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE text-002.
*PARAMETERS: p_cr RADIOBUTTON GROUP a1 DEFAULT 'X' USER-COMMAND f1,
*            p_qr RADIOBUTTON GROUP a1.
*SELECTION-SCREEN END OF BLOCK b02.


*&---------------------------------------------------------------------*
*   初始化
*&---------------------------------------------------------------------*
INITIALIZATION.

  PERFORM frm_init.

*&---------------------------------------------------------------------*
*   PBO
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

*  IF p_cr IS NOT INITIAL.
*    LOOP AT SCREEN.
*      IF screen-group1 = 'M2'.
*        screen-active = 0.
*        MODIFY SCREEN.
*      ENDIF.
*    ENDLOOP.
*  ENDIF.
*  IF p_qr IS NOT INITIAL.
*    LOOP AT SCREEN.
**      IF screen-group1 = 'MXY'.
*      screen-active = 1.
*      MODIFY SCREEN.
**      ENDIF.
*    ENDLOOP.
*  ENDIF.



*&---------------------------------------------------------------------*
*   PAI
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.

  PERFORM frm_screenpara_check.

  DATA: lf_chkflg TYPE char1.
  CLEAR:lt_t500p,ls_t500p,lf_chkflg.
  SELECT * FROM t500p INTO TABLE lt_t500p WHERE persa IN s_werks.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t500p BY persa.
  LOOP AT lt_t500p INTO ls_t500p.
    AUTHORITY-CHECK OBJECT 'P_ORGIN'
         ID 'INFTY' DUMMY
         ID 'SUBTY' DUMMY
         ID 'AUTHC' DUMMY
         ID 'PERSA' FIELD ls_t500p-persa
         ID 'PERSG' DUMMY
         ID 'PERSK' DUMMY
         ID 'VDSK1' DUMMY.
    IF sy-subrc <> 0.
      lf_chkflg = 'X'.
      EXIT.
    ENDIF.
    CLEAR: ls_t500p.
  ENDLOOP.
  IF lf_chkflg IS NOT INITIAL.
    MESSAGE e398(00) WITH '您没有人事范围 ' ls_t500p-persa ' 的查看权限' ''.
*    return.
  ENDIF.

  CLEAR: s_stat2[].
  IF p_cr IS NOT INITIAL.
    CLEAR: s_stat2.
    s_stat2-sign = 'I'.
    s_stat2-option = 'EQ'.
    s_stat2-low = '3'.
    APPEND s_stat2.
  ELSEIF p_qr IS NOT INITIAL.
       CLEAR: s_stat2.
    s_stat2-sign = 'I'.
    s_stat2-option = 'EQ'.
    s_stat2-low = '0'.
    APPEND s_stat2.
    ELSE.
    CLEAR: s_stat2.
    s_stat2-sign = 'I'.
    s_stat2-option = 'EQ'.
    s_stat2-low = '2'.
    APPEND s_stat2.
  ENDIF.

* MAIN program

*&---------------------------------------------------------------------*
*   选择开始
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*  PERFORM frm_getdata.      " 取数
*  IF p_cr IS NOT INITIAL.
*    PERFORM frm_getdata.      " 取数
*  ELSE.
  PERFORM frm_getdata_new2.      " 取数
*  PERFORM frm_getdata_new.      " 取数
*  ENDIF.
  IF gt_output[] IS INITIAL.
    MESSAGE s208(00) WITH '未找到数据'.
    RETURN.
  ENDIF.
*--------------数据处理---------max--------------------20190829------------------*
  PERFORM EDIT_DATA.
*--------------数据处理---------max--------------------20190829------------------*
  PERFORM frm_display_alv.  " 展示

*&---------------------------------------------------------------------*
*   选择屏幕参数检查
*&---------------------------------------------------------------------*
FORM frm_screenpara_check.

*  DATA: lf_startdate TYPE sy-datum,
*        lf_enddate   TYPE sy-datum.
*
*  IF p_werks IS INITIAL.
*    MESSAGE e208(00) WITH '工厂不允许为空,请检查'.
*  ELSE.
*    CLEAR: gf_counts.
*    SELECT COUNT( * ) FROM t001w INTO gf_counts WHERE werks = p_werks.
*    IF sy-subrc <> 0.
*    ENDIF.
*    IF gf_counts <= 0.
*      CLEAR: gf_names.
*      gf_names = 'P_WERKS'.
*      SET CURSOR FIELD gf_names.
*      MESSAGE e208(00) WITH '输入的工厂无效,请检查'.
*    ENDIF.
*  ENDIF.
*  IF s_aedat-low IS INITIAL OR s_aedat-high IS INITIAL.
*    MESSAGE e208(00) WITH '查询日期区间不能为空,请检查'.
*  ELSE.
*    CLEAR: lf_startdate,lf_enddate.
*    lf_startdate = s_aedat-low.
*    lf_enddate   = s_aedat-high.
*    CLEAR: gf_cdays.
*    gf_cdays = lf_enddate - lf_startdate + 1.
*    IF gf_cdays > 31.
*      CLEAR: gf_names.
*      gf_names = 'S_AEDAT-HIGH'.
*      SET CURSOR FIELD gf_names.
*      MESSAGE e208(00) WITH '查询日期区间不能超过31天,请重新选择日期区间...'.
*    ENDIF.
*  ENDIF.
*  IF s_matkl[] IS INITIAL.
*    MESSAGE e208(00) WITH '物料组不能为空,请检查'.
*  ELSE.
*    SELECT * FROM t023 INTO TABLE gt_t023 WHERE matkl IN s_matkl.
*    IF sy-subrc <> 0.
*    ENDIF.
*    IF gt_t023 IS INITIAL.
*      CLEAR: gf_names.
*      gf_names = 'S_MATKL-LOW'.
*      SET CURSOR FIELD gf_names.
*      MESSAGE e208(00) WITH '物料组为空,请检查'.
*    ENDIF.
*    SORT gt_t023 BY matkl.
*  ENDIF.

  IF s_werks[] IS INITIAL.
    MESSAGE e208(00) WITH '人事范围不能为空,请检查'.
  ENDIF.

ENDFORM.


FORM frm_getdata_new2.

  DATA: lf_rs TYPE char1.
  DATA: ls_pa0001_own_2 TYPE pa0001.
  DATA: ls_pa0000_own_2 TYPE pa0000.

  CLEAR: lt_pa0001,ls_pa0001,gt_output,gs_output,lt_pa0000,ls_pa0000.
  CLEAR: lt_pa9000,ls_pa9000,lt_hrp1000,ls_hrp1000,lt_yhr_pa_0001,ls_yhr_pa_0001.
  CLEAR: lt_pa0105,ls_pa0105,lt_pa0002,ls_pa0002.
  CLEAR: lt_pa0041,ls_pa0041,lt_pa0022,ls_pa0022,lt_pa0529,ls_pa0529.
  CLEAR: lt_pa0006,ls_pa0006,lt_pa0009,ls_pa0009,lt_pa0185,ls_pa0185.
  CLEAR: lt_pa0016,ls_pa0016,lt_pa0533,ls_pa0533.
  CLEAR: ls_bnka,lt_pa0001_tmp,ls_pa0001_tmp.
  CLEAR: lt_pa0001_new,ls_pa0001_new,lt_pa0000_new,ls_pa0000_new,lf_massn_cts.
  CLEAR: lt_pa0000_no3,ls_pa0000_no3,lt_pa0001_no3,ls_pa0001_no3.

  CLEAR: lf_leave_flg,
  lt_pa0001_own,ls_pa0001_own,lt_pa0000_own,ls_pa0000_own.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_pa0001 FROM pa0001
      WHERE pernr IN s_pernr
      AND   orgeh IN s_orgeh
      AND   werks IN s_werks
*      and   endda >= sy-datum
*      and   begda <= sy-datum.
      .
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  IF lt_pa0001 IS INITIAL.
    RETURN.
  ENDIF.

  SELECT * FROM pa0000 INTO TABLE lt_pa0000
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    .
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0000 BY pernr.

  SELECT * FROM pa0002 INTO TABLE lt_pa0002
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND   gbdat IN s_gbdat.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0002 BY pernr endda DESCENDING.

  IF lt_pa0000 IS NOT INITIAL.
    SELECT * FROM pa9000 INTO TABLE lt_pa9000
      FOR ALL ENTRIES IN lt_pa0000
      WHERE pernr = lt_pa0000-pernr
      AND   begda = lt_pa0000-begda.
    IF sy-subrc <> 0.
    ENDIF.
    SORT lt_pa9000 BY pernr.
  ENDIF.

  SELECT * FROM hrp1000 INTO TABLE lt_hrp1000
    FOR ALL ENTRIES IN lt_pa0001
    WHERE objid = lt_pa0001-orgeh
    AND   otype IN ('O').
  IF sy-subrc <> 0.
  ENDIF.
  SELECT * FROM hrp1000 APPENDING CORRESPONDING FIELDS OF TABLE lt_hrp1000
    FOR ALL ENTRIES IN lt_pa0001
    WHERE objid = lt_pa0001-plans
    AND   otype IN ('S').
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_hrp1000 BY objid otype endda DESCENDING.

  SELECT * FROM yhr_pa_0001 INTO TABLE lt_yhr_pa_0001
    FOR ALL ENTRIES IN lt_pa0001
    WHERE plans = lt_pa0001-plans.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_yhr_pa_0001 BY plans.
  IF lt_yhr_pa_0001 IS NOT INITIAL.
    SELECT * FROM yhr_pa_0000 INTO TABLE lt_yhr_pa_0000
      FOR ALL ENTRIES IN lt_yhr_pa_0001
      WHERE zegid = lt_yhr_pa_0001-zegid.
    IF sy-subrc <> 0.
    ENDIF.
    SORT lt_yhr_pa_0000 BY zegid.
  ENDIF.

  SELECT * FROM pa0105 INTO TABLE lt_pa0105
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND subty IN ('0031','0020','0010').
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0105 BY pernr subty begda DESCENDING.

  SELECT * FROM pa0041 INTO TABLE lt_pa0041
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0041 BY pernr endda DESCENDING.

  SELECT * FROM pa0022 INTO TABLE lt_pa0022
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0022 BY pernr ASCENDING endda DESCENDING.

  SELECT * FROM pa0529 INTO TABLE lt_pa0529
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0529 BY pernr endda DESCENDING.

  SELECT * FROM pa0006 INTO TABLE lt_pa0006
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND   subty IN ('3','2  ').
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0006 BY pernr subty.

  SELECT * FROM pa0009 INTO TABLE lt_pa0009
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0009 BY pernr.

  SELECT * FROM pa0185 INTO TABLE lt_pa0185
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND   subty  IN ('01','04  ')."增加暂住证期限
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0185 BY pernr subty endda DESCENDING.

  SELECT * FROM pa0016 INTO TABLE lt_pa0016
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    .
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0016 BY pernr endda DESCENDING.

  SELECT * FROM pa0533 INTO TABLE lt_pa0533
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0533 BY pernr.


  lt_pa0001_tmp = lt_pa0001.
  SORT lt_pa0001_tmp BY  pernr ASCENDING endda DESCENDING.
  SORT lt_pa0001 BY pernr ASCENDING endda DESCENDING.

  lt_pa0000_tmp = lt_pa0000.
  SORT lt_pa0000_tmp BY  pernr ASCENDING endda DESCENDING.
  SORT lt_pa0000 BY pernr ASCENDING endda DESCENDING.

  LOOP AT lt_pa0001 INTO ls_pa0001.
    CLEAR: ls_pa0001_new.
    MOVE-CORRESPONDING ls_pa0001 TO ls_pa0001_new.
    AT NEW pernr.
      APPEND ls_pa0001_new TO lt_pa0001_new.
    ENDAT.
    CLEAR: ls_pa0001.
  ENDLOOP.

  DATA: lf_tabix TYPE sy-tabix.

  LOOP AT lt_pa0000 INTO ls_pa0000.
    CLEAR: ls_pa0000_new.
    lf_tabix = sy-tabix.
    MOVE-CORRESPONDING ls_pa0000 TO ls_pa0000_new.
    AT NEW pernr.
      APPEND ls_pa0000_new TO lt_pa0000_new.
    ENDAT.
    CLEAR: ls_pa0001.
*    READ TABLE lt_pa0001 INTO ls_pa0001 WITH KEY pernr = ls_pa0000-pernr endda = ls_pa0000-endda begda = ls_pa0000-begda.
*    IF sy-subrc <> 0.
*
*      delete lt_pa0000 index lf_tabix.
*    ENDIF.
    CLEAR: ls_pa0000.
  ENDLOOP.
  CLEAR: lf_tabix.

  LOOP AT lt_pa0001_new INTO ls_pa0001_new.
    CLEAR: gs_output,ls_pa0000_new,lf_leave_flg,lt_pa0001_own,lt_pa0000_own.
    CLEAR: lf_leave_num,lf_rs.

    READ TABLE lt_pa0000 INTO ls_pa0000 WITH KEY pernr = ls_pa0001_new-pernr endda = '99991231'.
    IF sy-subrc <> 0.
      CONTINUE.
    ENDIF.
*    IF s_stat2[] IS NOT INITIAL.
*      IF ls_pa0000-stat2 NOT IN s_stat2.
*        CONTINUE.
*      ENDIF.
*    ENDIF.
    ls_pa0000_new = ls_pa0000.   " 备份pa0000记录

*   取当前人员的所有PA0000记录
    CLEAR: lt_pa0000_own,ls_pa0000.
    LOOP AT lt_pa0000 INTO ls_pa0000 WHERE pernr = ls_pa0001_new-pernr.
      CLEAR: ls_pa0000_own.
      IF ls_pa0000-massn = 'Z8' OR ls_pa0000-massn = 'Z9'.
        lf_leave_flg = 'X'.
        lf_leave_num = lf_leave_num + 1.
      ENDIF.
      MOVE ls_pa0000 TO ls_pa0000_own.
      APPEND ls_pa0000_own TO lt_pa0000_own.
      CLEAR: ls_pa0000.
    ENDLOOP.


    SORT lt_pa0000_own BY begda ASCENDING.

*   取当前人员的所有PA0001记录
    CLEAR: lt_pa0001_own,ls_pa0001.
    LOOP AT lt_pa0001 INTO ls_pa0001 WHERE pernr = ls_pa0001_new-pernr.
      CLEAR: ls_pa0001_own.
      MOVE ls_pa0001 TO ls_pa0001_own.
      APPEND ls_pa0001_own TO lt_pa0001_own.
      CLEAR: ls_pa0001.
    ENDLOOP.

    SORT lt_pa0001_own BY endda DESCENDING.
    CLEAR: ls_pa0001.
    READ TABLE lt_pa0001_own INTO ls_pa0001 INDEX 1.
    IF NOT ( ls_pa0001-endda >= sy-datum AND ls_pa0001-begda <= sy-datum ).
      CONTINUE.
    ENDIF.
    CLEAR: ls_pa0001.


    PERFORM frm_subdata_get
                USING
                   ls_pa0001_new
                   ls_pa0000_new
                CHANGING
                   lf_rs.
    IF lf_rs IS NOT INITIAL.
      CONTINUE.
    ENDIF.

    SORT lt_pa0000_own BY begda ASCENDING.


    APPEND gs_output TO gt_output.


    CLEAR: ls_pa0001_own_2,ls_pa0000_own_2.
    IF lf_leave_num >= 1.
*    IF lf_leave_num >= 1.
      SORT lt_pa0000_own BY endda DESCENDING.
      SORT lt_pa0001_own BY endda DESCENDING.
      IF gs_output-stat2 = 3.
        CLEAR: ls_pa0000_own_2.
        LOOP AT lt_pa0000_own INTO ls_pa0000_own_2 WHERE massn = 'Z8' OR massn = 'Z9'.
          CLEAR: gs_output,ls_pa0001_own_2.
          READ TABLE lt_pa0001_own INTO ls_pa0001_own_2 WITH KEY pernr = ls_pa0000_own_2-pernr endda = ls_pa0000_own_2-endda.
          PERFORM frm_subdata_get
            USING
               ls_pa0001_own_2
               ls_pa0000_own_2
            CHANGING
               lf_rs.
          SORT lt_pa0000_own BY endda DESCENDING.
          SORT lt_pa0001_own BY endda DESCENDING.
          IF lf_rs IS NOT INITIAL.
            CONTINUE.
          ENDIF.
          APPEND gs_output TO gt_output.
          CLEAR: ls_pa0000_own_2.
        ENDLOOP.
      ELSE.
        CLEAR: ls_pa0000_own_2.
        LOOP AT lt_pa0000_own INTO ls_pa0000_own_2 WHERE ( massn = 'Z8' OR massn = 'Z9' ) AND endda <> ls_pa0000_new-endda.
          CLEAR: gs_output,ls_pa0001_own_2.
          READ TABLE lt_pa0001_own INTO ls_pa0001_own_2 WITH KEY pernr = ls_pa0000_own_2-pernr endda = ls_pa0000_own_2-endda.
          PERFORM frm_subdata_get
            USING
               ls_pa0001_own_2
               ls_pa0000_own_2
            CHANGING
               lf_rs.
          SORT lt_pa0000_own BY endda DESCENDING.
          SORT lt_pa0001_own BY endda DESCENDING.
          IF lf_rs IS NOT INITIAL.
            CONTINUE.
          ENDIF.
          APPEND gs_output TO gt_output.
          CLEAR: ls_pa0000_own_2.
        ENDLOOP.
      ENDIF.
    ENDIF.

    CLEAR: ls_pa0001_new.
  ENDLOOP.

  DATA: lt_output_tmp TYPE STANDARD TABLE OF typ_output.
  CLEAR: lt_output_tmp.
  lt_output_tmp = gt_output.
  CLEAR: gt_output.
  LOOP AT lt_output_tmp INTO gs_output WHERE stat2 IN s_stat2.
    APPEND gs_output TO gt_output.
    CLEAR: gs_output.
  ENDLOOP.

  DATA: lf_totalnum TYPE char10.
  CLEAR: lf_totalnum.
  lf_totalnum = lines( gt_output ).
  CONDENSE lf_totalnum NO-GAPS.
  MESSAGE s398(00) WITH '共命中 ' lf_totalnum ' 条数据' ''.

ENDFORM.

FORM frm_getdata_new.

  DATA: lf_rs TYPE char1.
  DATA: ls_pa0001_own_2 TYPE pa0001.
  DATA: ls_pa0000_own_2 TYPE pa0000.

  CLEAR: lt_pa0001,ls_pa0001,gt_output,gs_output,lt_pa0000,ls_pa0000.
  CLEAR: lt_pa9000,ls_pa9000,lt_hrp1000,ls_hrp1000,lt_yhr_pa_0001,ls_yhr_pa_0001.
  CLEAR: lt_pa0105,ls_pa0105,lt_pa0002,ls_pa0002.
  CLEAR: lt_pa0041,ls_pa0041,lt_pa0022,ls_pa0022,lt_pa0529,ls_pa0529.
  CLEAR: lt_pa0006,ls_pa0006,lt_pa0009,ls_pa0009,lt_pa0185,ls_pa0185.
  CLEAR: lt_pa0016,ls_pa0016,lt_pa0533,ls_pa0533.
  CLEAR: ls_bnka,lt_pa0001_tmp,ls_pa0001_tmp.
  CLEAR: lt_pa0001_new,ls_pa0001_new,lt_pa0000_new,ls_pa0000_new,lf_massn_cts.
  CLEAR: lt_pa0000_no3,ls_pa0000_no3,lt_pa0001_no3,ls_pa0001_no3.

  CLEAR: lf_leave_flg,
  lt_pa0001_own,ls_pa0001_own,lt_pa0000_own,ls_pa0000_own.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_pa0001 FROM pa0001
      WHERE pernr IN s_pernr
      AND   orgeh IN s_orgeh
      AND   werks IN s_werks
*      and   endda >= sy-datum
*      and   begda <= sy-datum.
      .
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  IF lt_pa0001 IS INITIAL.
    RETURN.
  ENDIF.

  SELECT * FROM pa0000 INTO TABLE lt_pa0000
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    .
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0000 BY pernr.

  SELECT * FROM pa0002 INTO TABLE lt_pa0002
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND   gbdat IN s_gbdat.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0002 BY pernr.

  IF lt_pa0000 IS NOT INITIAL.
    SELECT * FROM pa9000 INTO TABLE lt_pa9000
      FOR ALL ENTRIES IN lt_pa0000
      WHERE pernr = lt_pa0000-pernr
      AND   begda = lt_pa0000-begda.
    IF sy-subrc <> 0.
    ENDIF.
    SORT lt_pa9000 BY pernr.
  ENDIF.

  SELECT * FROM hrp1000 INTO TABLE lt_hrp1000
    FOR ALL ENTRIES IN lt_pa0001
    WHERE objid = lt_pa0001-orgeh
    AND   otype IN ('O').
  IF sy-subrc <> 0.
  ENDIF.
  SELECT * FROM hrp1000 APPENDING CORRESPONDING FIELDS OF TABLE lt_hrp1000
    FOR ALL ENTRIES IN lt_pa0001
    WHERE objid = lt_pa0001-plans
    AND   otype IN ('S').
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_hrp1000 BY objid otype endda DESCENDING.

  SELECT * FROM yhr_pa_0001 INTO TABLE lt_yhr_pa_0001
    FOR ALL ENTRIES IN lt_pa0001
    WHERE plans = lt_pa0001-plans.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_yhr_pa_0001 BY plans.
  IF lt_yhr_pa_0001 IS NOT INITIAL.
    SELECT * FROM yhr_pa_0000 INTO TABLE lt_yhr_pa_0000
      FOR ALL ENTRIES IN lt_yhr_pa_0001
      WHERE zegid = lt_yhr_pa_0001-zegid.
    IF sy-subrc <> 0.
    ENDIF.
    SORT lt_yhr_pa_0000 BY zegid.
  ENDIF.

  SELECT * FROM pa0105 INTO TABLE lt_pa0105
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND subty IN ('0031','0020','0010').
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0105 BY pernr subty endda DESCENDING.

  SELECT * FROM pa0041 INTO TABLE lt_pa0041
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0041 BY pernr.

  SELECT * FROM pa0022 INTO TABLE lt_pa0022
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0022 BY pernr ASCENDING endda DESCENDING.

  SELECT * FROM pa0529 INTO TABLE lt_pa0529
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0529 BY pernr.

  SELECT * FROM pa0006 INTO TABLE lt_pa0006
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND   subty IN ('3','2  ').
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0006 BY pernr subty.

  SELECT * FROM pa0009 INTO TABLE lt_pa0009
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0009 BY pernr.

  SELECT * FROM pa0185 INTO TABLE lt_pa0185
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    AND   subty IN ('01','04 ')."增加暂住证期限
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0185 BY pernr subty endda DESCENDING.

  SELECT * FROM pa0016 INTO TABLE lt_pa0016
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr
    .
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0016 BY pernr.

  SELECT * FROM pa0533 INTO TABLE lt_pa0533
    FOR ALL ENTRIES IN lt_pa0001
    WHERE pernr = lt_pa0001-pernr.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_pa0533 BY pernr.


  lt_pa0001_tmp = lt_pa0001.
  SORT lt_pa0001_tmp BY  pernr ASCENDING endda DESCENDING.
  SORT lt_pa0001 BY pernr ASCENDING endda DESCENDING.

  lt_pa0000_tmp = lt_pa0000.
  SORT lt_pa0000_tmp BY  pernr ASCENDING endda DESCENDING.
  SORT lt_pa0000 BY pernr ASCENDING endda DESCENDING.

  LOOP AT lt_pa0001 INTO ls_pa0001.
    CLEAR: ls_pa0001_new.
    MOVE-CORRESPONDING ls_pa0001 TO ls_pa0001_new.
    AT NEW pernr.
      APPEND ls_pa0001_new TO lt_pa0001_new.
    ENDAT.
    CLEAR: ls_pa0001.
  ENDLOOP.

  DATA: lf_tabix TYPE sy-tabix.

  LOOP AT lt_pa0000 INTO ls_pa0000.
    CLEAR: ls_pa0000_new.
    lf_tabix = sy-tabix.
    MOVE-CORRESPONDING ls_pa0000 TO ls_pa0000_new.
    AT NEW pernr.
      APPEND ls_pa0000_new TO lt_pa0000_new.
    ENDAT.
    CLEAR: ls_pa0001.
*    READ TABLE lt_pa0001 INTO ls_pa0001 WITH KEY pernr = ls_pa0000-pernr endda = ls_pa0000-endda begda = ls_pa0000-begda.
*    IF sy-subrc <> 0.
*
*      delete lt_pa0000 index lf_tabix.
*    ENDIF.
    CLEAR: ls_pa0000.
  ENDLOOP.
  CLEAR: lf_tabix.

  LOOP AT lt_pa0001_new INTO ls_pa0001_new.
    CLEAR: gs_output,ls_pa0000_new,lf_leave_flg,lt_pa0001_own,lt_pa0000_own.
    CLEAR: lf_leave_num,lf_rs.

    READ TABLE lt_pa0000 INTO ls_pa0000 WITH KEY pernr = ls_pa0001_new-pernr endda = '99991231'.
    IF sy-subrc <> 0.
      CONTINUE.
    ENDIF.
    IF s_stat2[] IS NOT INITIAL.
      IF ls_pa0000-stat2 NOT IN s_stat2.
        CONTINUE.
      ENDIF.
    ENDIF.
    ls_pa0000_new = ls_pa0000.   " 备份pa0000记录

*   取当前人员的所有PA0000记录
    CLEAR: lt_pa0000_own,ls_pa0000.
    LOOP AT lt_pa0000 INTO ls_pa0000 WHERE pernr = ls_pa0001_new-pernr.
      CLEAR: ls_pa0000_own.
      IF ls_pa0000-massn = 'Z8' OR ls_pa0000-massn = 'Z9'.
        lf_leave_flg = 'X'.
        lf_leave_num = lf_leave_num + 1.
      ENDIF.
      MOVE ls_pa0000 TO ls_pa0000_own.
      APPEND ls_pa0000_own TO lt_pa0000_own.
      CLEAR: ls_pa0000.
    ENDLOOP.

    SORT lt_pa0000_own BY begda ASCENDING.

*   取当前人员的所有PA0001记录
    CLEAR: lt_pa0001_own,ls_pa0001.
    LOOP AT lt_pa0001 INTO ls_pa0001 WHERE pernr = ls_pa0001_new-pernr.
      CLEAR: ls_pa0001_own.
      MOVE ls_pa0001 TO ls_pa0001_own.
      APPEND ls_pa0001_own TO lt_pa0001_own.
      CLEAR: ls_pa0001.
    ENDLOOP.

    SORT lt_pa0001_own BY endda DESCENDING.
    CLEAR: ls_pa0001.
    READ TABLE lt_pa0001_own INTO ls_pa0001 INDEX 1.
    IF NOT ( ls_pa0001-endda >= sy-datum AND ls_pa0001-begda <= sy-datum ).
      CONTINUE.
    ENDIF.
    CLEAR: ls_pa0001.

    PERFORM frm_subdata_get
                USING
                   ls_pa0001_new
                   ls_pa0000_new
                CHANGING
                   lf_rs.
    IF lf_rs IS NOT INITIAL.
      CONTINUE.
    ENDIF.

    SORT lt_pa0000_own BY begda ASCENDING.


    APPEND gs_output TO gt_output.


    CLEAR: ls_pa0001_own_2,ls_pa0000_own_2.
    IF lf_leave_num >= 1.
      SORT lt_pa0000_own BY endda DESCENDING.
      SORT lt_pa0001_own BY endda DESCENDING.
      IF gs_output-stat2 = 3.
        CLEAR: ls_pa0000_own_2.
        LOOP AT lt_pa0000_own INTO ls_pa0000_own_2 WHERE massn = 'Z8' OR massn = 'Z9'.
          CLEAR: gs_output,ls_pa0001_own_2.
          READ TABLE lt_pa0001_own INTO ls_pa0001_own_2 WITH KEY pernr = ls_pa0000_own_2-pernr endda = ls_pa0000_own_2-endda.
          PERFORM frm_subdata_get
            USING
               ls_pa0001_own_2
               ls_pa0000_own_2
            CHANGING
               lf_rs.
          IF lf_rs IS NOT INITIAL.
            CONTINUE.
          ENDIF.
          APPEND gs_output TO gt_output.
          CLEAR: ls_pa0000_own_2.
        ENDLOOP.
      ELSE.
        CLEAR: ls_pa0000_own_2.
        LOOP AT lt_pa0000_own INTO ls_pa0000_own_2 WHERE ( massn = 'Z8' OR massn = 'Z9' ) AND endda <> ls_pa0000_new-endda.
          CLEAR: gs_output,ls_pa0001_own_2.
          READ TABLE lt_pa0001_own INTO ls_pa0001_own_2 WITH KEY pernr = ls_pa0000_own_2-pernr endda = ls_pa0000_own_2-endda.
          PERFORM frm_subdata_get
            USING
               ls_pa0001_own_2
               ls_pa0000_own_2
            CHANGING
               lf_rs.
          IF lf_rs IS NOT INITIAL.
            CONTINUE.
          ENDIF.
          APPEND gs_output TO gt_output.
          CLEAR: ls_pa0000_own_2.
        ENDLOOP.
      ENDIF.
    ENDIF.

    CLEAR: ls_pa0001_new.
  ENDLOOP.


  DATA: lf_totalnum TYPE char10.
  CLEAR: lf_totalnum.
  lf_totalnum = lines( gt_output ).
  CONDENSE lf_totalnum NO-GAPS.
  MESSAGE s398(00) WITH '共命中 ' lf_totalnum ' 条数据' ''.

ENDFORM.

FORM frm_subdata_get USING ls_pa0001_new TYPE pa0001 ls_pa0000_new TYPE pa0000
                  CHANGING c_rs TYPE char1.

  DATA: lf_year  TYPE i,
        lf_tabix TYPE sy-tabix.
*  DATA: ls_pa0000_new TYPE pa0000.
  DATA: lf_datez      TYPE sy-datum. " 日期中间变量

  CLEAR: lf_datez,lf_year,lf_tabix.


*   人员、
  gs_output-pernr = ls_pa0001_new-pernr.

*   当前状态、当前状态描述
  gs_output-stat2 = ls_pa0000_new-stat2.


  CLEAR: ls_t529u.
  READ TABLE lt_t529u INTO ls_t529u WITH KEY statv = gs_output-stat2 BINARY SEARCH.
  IF ls_t529u IS NOT INITIAL.
    gs_output-s2txt = ls_t529u-text1.
  ENDIF.

*   人事范围、人事范围描述
  gs_output-werks = ls_pa0001_new-werks.
  CLEAR: ls_t500p.
  READ TABLE lt_t500p INTO ls_t500p WITH KEY persa = ls_pa0001_new-werks BINARY SEARCH.
  IF ls_t500p IS NOT INITIAL.
    gs_output-name1 = ls_t500p-name1.
  ENDIF.

*   族群 、族群名称、岗位定级
  CLEAR: ls_yhr_pa_0001.
  READ TABLE lt_yhr_pa_0001 INTO ls_yhr_pa_0001 WITH KEY plans = ls_pa0001_new-plans BINARY SEARCH.
  IF ls_yhr_pa_0001 IS NOT INITIAL.
    gs_output-zegid = ls_yhr_pa_0001-zegid.
    gs_output-zlevl = ls_yhr_pa_0001-zeglevel.
    IF ls_yhr_pa_0001-zeglevel NOT IN s_level.
*      CONTINUE.
      c_rs = 1.
      RETURN.
    ENDIF.
    CLEAR: ls_yhr_pa_0000.
    READ TABLE lt_yhr_pa_0000 INTO ls_yhr_pa_0000 WITH KEY zegid = ls_yhr_pa_0001-zegid  BINARY SEARCH.
    IF ls_yhr_pa_0000 IS NOT INITIAL.
      gs_output-zenam = ls_yhr_pa_0000-zegname.
    ENDIF.
  ENDIF.

* 原岗位定级、调动时间、原部门、原岗位 (不包含跨公司调动)
  DATA: lf_findflg TYPE char1.
  CLEAR: ls_pa0000_own,lf_findflg.
  SORT lt_pa0000_own BY begda DESCENDING.
  LOOP AT lt_pa0000_own INTO ls_pa0000_own WHERE massn = 'Z4' AND massg BETWEEN '00' AND '05'. "( MASSG = '00' or MASSG = '01' or MASSG = '02' or MASSG = '03' or MASSG = '04' or MASSG = '05' ).
    lf_findflg = 'X'.
    EXIT.
  ENDLOOP.

  IF lf_findflg IS NOT INITIAL.
    CLEAR: lf_tabix.

    gs_output-cdate = ls_pa0000_own-begda.  " 调动时间
    READ TABLE lt_pa0001_own INTO ls_pa0001_own WITH KEY begda = ls_pa0000_own-begda.
    lf_tabix = sy-tabix.
    lf_tabix = lf_tabix + 1.
    CLEAR: ls_pa0001_own.
    READ TABLE lt_pa0001_own INTO ls_pa0001_own INDEX lf_tabix.
    gs_output-oorgh = ls_pa0001_own-orgeh.   " 原-部门

    CLEAR: ls_hrp1000.
    READ TABLE lt_hrp1000 INTO ls_hrp1000 WITH KEY objid = ls_pa0001_own-orgeh otype = 'O' BINARY SEARCH.
    IF ls_hrp1000 IS NOT INITIAL.
      gs_output-oortt = ls_hrp1000-stext.   " 原-部门名称
    ENDIF.

    CLEAR: ls_hrp1000.
    READ TABLE lt_hrp1000 INTO ls_hrp1000 WITH KEY objid = ls_pa0001_own-plans otype = 'S' BINARY SEARCH.
    IF ls_hrp1000 IS NOT INITIAL.
      gs_output-ostxt = ls_hrp1000-stext.    " 原-岗位
      gs_output-oplans = ls_hrp1000-objid.    " 原-岗位编号
    ENDIF.

    CLEAR: ls_yhr_pa_0001.
    READ TABLE lt_yhr_pa_0001 INTO ls_yhr_pa_0001 WITH KEY plans = ls_pa0001_own-plans BINARY SEARCH.
    IF ls_yhr_pa_0001 IS NOT INITIAL.
      gs_output-ozlel = ls_yhr_pa_0001-zeglevel.    " 原-岗位定级
    ENDIF.

    CLEAR: lf_tabix,ls_pa0001_own.
  ENDIF.

  IF s_cdate[] IS NOT INITIAL.
    IF gs_output-cdate NOT IN s_cdate.
      c_rs = 1.
      RETURN.
    ENDIF.
  ENDIF.

  SORT lt_pa0000_own BY begda ASCENDING.

*   部门 、部门名称、岗位
  gs_output-orgeh = ls_pa0001_new-orgeh.
  gs_output-plans = ls_pa0001_new-plans.
  CLEAR: ls_hrp1000.
  READ TABLE lt_hrp1000 INTO ls_hrp1000 WITH KEY objid = ls_pa0001_new-orgeh otype = 'O' BINARY SEARCH.
  IF ls_hrp1000 IS NOT INITIAL.
    gs_output-ortxt = ls_hrp1000-stext.
  ENDIF.
  CLEAR: ls_hrp1000.
  READ TABLE lt_hrp1000 INTO ls_hrp1000 WITH KEY objid = ls_pa0001_new-plans otype = 'S' BINARY SEARCH.
  IF ls_hrp1000 IS NOT INITIAL.
    gs_output-stext = ls_hrp1000-stext.
  ENDIF.

*   就餐卡号、联系电话、邮箱
  CLEAR: ls_pa0105.
  READ TABLE lt_pa0105 INTO ls_pa0105 WITH KEY pernr = ls_pa0001_new-pernr subty = '0031' .
  IF ls_pa0105 IS NOT INITIAL.
    gs_output-usrid = ls_pa0105-usrid.
  ENDIF.
  CLEAR: ls_pa0105.
  READ TABLE lt_pa0105 INTO ls_pa0105 WITH KEY pernr = ls_pa0001_new-pernr subty = '0010' .
  IF ls_pa0105 IS NOT INITIAL.
    gs_output-musid = ls_pa0105-usrid_long.
  ENDIF.
  CLEAR: ls_pa0105.
  READ TABLE lt_pa0105 INTO ls_pa0105 WITH KEY pernr = ls_pa0001_new-pernr subty = '0020'.
  IF ls_pa0105 IS NOT INITIAL.
    gs_output-zusid = ls_pa0105-usrid.
  ENDIF.

*   婚姻、性别、出生日期、本地/外地户口性质、籍贯
  CLEAR: ls_pa0002.
  READ TABLE lt_pa0002 INTO ls_pa0002 WITH KEY pernr = ls_pa0001_new-pernr.
  IF ls_pa0002 IS NOT INITIAL.
    gs_output-zname = ls_pa0002-nachn && ls_pa0002-vorna.  " 姓名
    gs_output-gbdat = ls_pa0002-gbdat.  " 出生日期
    IF ls_pa0002-gbdat+4(2) NOT IN s_mthflg.
*      CONTINUE.
      c_rs = 1.
      RETURN.
    ENDIF.
    gs_output-zhkxz = ls_pa0002-zhkxz.  " 本地/外地户口性质
    gs_output-gbdep = ls_pa0002-gbdep.  " 籍贯
    gs_output-famst = ls_pa0002-famst.  " 婚姻
    CLEAR: ls_t502t.
    READ TABLE lt_t502t INTO ls_t502t WITH KEY famst = ls_pa0002-famst BINARY SEARCH.
    IF ls_t502t IS NOT INITIAL.
      gs_output-fatxt = ls_t502t-ftext.
    ENDIF.
    CLEAR: ls_taba.
    READ TABLE lt_taba INTO ls_taba WITH KEY valpos = ls_pa0002-zhkxz BINARY SEARCH.
    IF ls_taba IS NOT INITIAL.
      gs_output-dtext = ls_taba-ddtext.
    ENDIF.
    CLEAR: ls_t005u.
    READ TABLE lt_t005u INTO ls_t005u WITH KEY bland = ls_pa0002-gbdep BINARY SEARCH.
    IF ls_t005u IS NOT INITIAL.
      gs_output-bezei = ls_t005u-bezei.
    ENDIF.
    CLEAR: lf_year.

    CASE ls_pa0002-gesch.               " 性别
      WHEN '1'.
        gs_output-gesch = '男'.
*        IF u_pa0000_old-massn = 'Z9'.
*          gs_output-begdz = u_pa0000_old-begda.
        CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
          EXPORTING
            date      = gs_output-gbdat
            days      = 0
            months    = 0
            signum    = '+'
            years     = 60
          IMPORTING
*           calc_date = gs_output-begdz.
            calc_date = gs_output-dat04.
*        ENDIF.
      WHEN '2'.
        gs_output-gesch = '女'.
        CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
          EXPORTING
            date      = gs_output-gbdat
            days      = 0
            months    = 0
            signum    = '+'
            years     = 50
          IMPORTING
            calc_date = gs_output-dat04.
*            calc_date = gs_output-begdz.
      WHEN OTHERS.
    ENDCASE.

  ELSE.
*    CONTINUE.
    c_rs = 1.
    RETURN.
  ENDIF.

  IF s_ldate[] IS NOT INITIAL.
    IF gs_output-dat04 NOT IN s_ldate.
      c_rs = 1.
      RETURN.
    ENDIF.
  ENDIF.

*   学历、毕业院校、毕业时间、专业
  CLEAR: ls_pa0022.
  READ TABLE lt_pa0022 INTO ls_pa0022 WITH KEY pernr = ls_pa0001_new-pernr.
  IF ls_pa0022 IS NOT INITIAL.
    gs_output-slart = ls_pa0022-slart.  " 学历
    gs_output-insti = ls_pa0022-insti.  " 毕业院校
    gs_output-endda = ls_pa0022-endda.  " 毕业时间
    gs_output-zmaor = ls_pa0022-zmajor.  " 专业
    CLEAR: ls_t517t.
    READ TABLE lt_t517t INTO ls_t517t WITH KEY slart = ls_pa0022-slart BINARY SEARCH.
    IF ls_t517t IS NOT INITIAL.
      gs_output-slext = ls_t517t-stext.
    ENDIF.
  ENDIF.

*   政治面貌、职称、民族
  CLEAR: ls_pa0529.
  READ TABLE lt_pa0529 INTO ls_pa0529 WITH KEY pernr = ls_pa0001_new-pernr BINARY SEARCH.
  IF ls_pa0529 IS NOT INITIAL.
    gs_output-pcode = ls_pa0529-pcode.    " 政治面貌
    gs_output-ztile = ls_pa0529-zjtitle.  " 职称
    gs_output-racky = ls_pa0529-racky.    " 民族
    CLEAR: ls_t505s.
    READ TABLE lt_t505s INTO ls_t505s WITH KEY racky = ls_pa0529-racky BINARY SEARCH.
    IF ls_t505s IS NOT INITIAL.
      gs_output-ltext = ls_t505s-ltext.
    ENDIF.
    CLEAR: ls_t7cn5r.
    READ TABLE lt_t7cn5r INTO ls_t7cn5r WITH KEY pcode = ls_pa0529-pcode BINARY SEARCH.
    IF ls_t7cn5r IS NOT INITIAL.
      gs_output-ptext = ls_t7cn5r-ptext.
    ENDIF.
  ENDIF.

*   年龄
  CALL FUNCTION 'HR_AUPBS_AGE'
    EXPORTING
      pernr            = ls_pa0001_new-pernr
      bsdte            = sy-datum
*     REACTION         = ' '
    IMPORTING
      value            = gs_output-zzage
    EXCEPTIONS
      record_not_found = 1
      OTHERS           = 2.
  IF sy-subrc <> 0.
  ENDIF.

*   身份证号、身份证期限
  CLEAR: ls_pa0185.
  READ TABLE lt_pa0185 INTO ls_pa0185 WITH KEY pernr = ls_pa0001_new-pernr subty = '01' BINARY SEARCH.
  IF ls_pa0185 IS NOT INITIAL.
    gs_output-icnum = ls_pa0185-icnum.    " 身份证号
    gs_output-useto = ls_pa0185-useto.    " 身份证期限
  ENDIF.
*暂住证期限
 CLEAR: ls_pa0185.
  READ TABLE lt_pa0185 INTO ls_pa0185 WITH KEY pernr = ls_pa0001_new-pernr subty = '04' BINARY SEARCH.
  IF ls_pa0185 IS NOT INITIAL.
  gs_output-ustoe = ls_pa0185-useto.    " 暂住证期限
  ENDIF.
*   家庭住址、现居住地址
  CLEAR: ls_pa0006.
  READ TABLE lt_pa0006 INTO ls_pa0006 WITH KEY pernr = ls_pa0001_new-pernr subty = '3' BINARY SEARCH.
  IF ls_pa0006 IS NOT INITIAL.
    gs_output-locat = ls_pa0006-locat.    " 家庭住址
  ENDIF.
  CLEAR: ls_pa0006.
  READ TABLE lt_pa0006 INTO ls_pa0006 WITH KEY pernr = ls_pa0001_new-pernr subty = '2' BINARY SEARCH.
  IF ls_pa0006 IS NOT INITIAL.
    gs_output-loatz = ls_pa0006-locat.    " 现居住地址
    IF ls_pa0006-wkwng = 'X'.             " 是否入住宿舍
      gs_output-zzflg = '是'.
    ELSE.
      gs_output-zzflg = '否'.
    ENDIF.
  ENDIF.

*   银行、账户
  CLEAR: ls_pa0009.
  READ TABLE lt_pa0009 INTO ls_pa0009 WITH KEY pernr = ls_pa0001_new-pernr BINARY SEARCH.
  IF ls_pa0009 IS NOT INITIAL.
    gs_output-bankl = ls_pa0009-bankl.    " 银行
    gs_output-bannk = ls_pa0009-bankn && ls_pa0009-bkref.    " 账户
    CLEAR: ls_bnka.
    READ TABLE lt_bnka INTO ls_bnka WITH KEY bankl = ls_pa0009-bankl BINARY SEARCH.
    IF ls_bnka IS NOT INITIAL.
      gs_output-banka = ls_bnka-banka.
    ENDIF.
  ENDIF.

*   试用截止日、合同期限、合同次数、合同截至日
*   取PA0016_PRBZT 和PA0016_PRBEH(时间单位)
*   试用期时间=PA0016_BEGDA+PA0016_PRBZT(这是日期的计算,所以要注意单位)
  CLEAR: ls_pa0016,lf_dlydy.
  READ TABLE lt_pa0016 INTO ls_pa0016 WITH KEY pernr = ls_pa0001_new-pernr.
  IF ls_pa0016 IS NOT INITIAL.
    CASE ls_pa0016-prbeh.
      WHEN '010'.
        CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
          EXPORTING
            date      = ls_pa0016-begda
            days      = ls_pa0016-prbzt
            months    = ''
            signum    = '+'
            years     = ''
          IMPORTING
            calc_date = ls_pa0016-begda.
      WHEN '011'.
        ls_pa0016-prbzt = ls_pa0016-prbzt * 7.
        CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
          EXPORTING
            date      = ls_pa0016-begda
            days      = ls_pa0016-prbzt
            months    = 0
            signum    = '+'
            years     = 0
          IMPORTING
            calc_date = ls_pa0016-begda.
      WHEN '012'.
        lf_dlydy = ls_pa0016-prbzt.
        CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
          EXPORTING
            date      = ls_pa0016-begda
            days      = 0
            months    = lf_dlydy
            signum    = '+'
            years     = 0
          IMPORTING
            calc_date = ls_pa0016-begda.
      WHEN '013'.
        CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
          EXPORTING
            date      = ls_pa0016-begda
            days      = ''
            months    = ''
            signum    = '+'
            years     = ls_pa0016-prbzt
          IMPORTING
            calc_date = ls_pa0016-begda.
      WHEN OTHERS.
    ENDCASE.
    gs_output-prbzt = ls_pa0016-begda.    " 试用截止日
    IF gs_output-prbzt NOT IN s_prbzt.
*      CONTINUE.
      c_rs = 1.
      RETURN.
    ENDIF.
    gs_output-cttyp = ls_pa0016-cttyp.    " 合同期限
    gs_output-ctedt = ls_pa0016-ctedt.    " 合同截至日
    CLEAR: ls_t547s.
    READ TABLE lt_t547s INTO ls_t547s WITH KEY cttyp = ls_pa0016-cttyp BINARY SEARCH.
    IF ls_t547s IS NOT INITIAL.
      gs_output-cttxt = ls_t547s-cttxt.
    ENDIF.
  ELSE.
*    CONTINUE.
    c_rs = 1.
    RETURN.
  ENDIF.

*   合同次数
  LOOP AT lt_pa0016 INTO ls_pa0016 WHERE pernr = ls_pa0001_new-pernr.
    gs_output-zznum = gs_output-zznum + 1.
  ENDLOOP.

*   档案编号
  CLEAR: ls_pa0533.
  READ TABLE lt_pa0533 INTO ls_pa0533 WITH KEY pernr = ls_pa0001_new-pernr BINARY SEARCH.
  IF ls_pa0533 IS NOT INITIAL.
    gs_output-docnm = ls_pa0533-docnm.
  ENDIF.

  " 集团入职日、集团年限、公司入职日、工龄年限
  CLEAR: ls_pa0041.
  READ TABLE lt_pa0041 INTO ls_pa0041 WITH KEY pernr = ls_pa0001_new-pernr BINARY SEARCH.
  IF ls_pa0041 IS NOT INITIAL.
*    IF ls_pa0041-dar01 = 'Z1'.
*      gs_output-dat01 = ls_pa0041-dat01.  " 集团入职日
*    ENDIF.
*    IF ls_pa0041-dar02 = 'Z2'.
*      gs_output-dat02 = ls_pa0041-dat02.  " 公司入职日
*    ENDIF.
*---集团入职日,公司入职日,12.26---*
     CASE ls_pa0041-dar01.
      when 'Z1'.
        gs_output-dat01 = ls_pa0041-dat01.
        when 'Z2'.
          gs_output-dat02 = ls_pa0041-dat01.
          endcase.
           CASE ls_pa0041-dar02.
      when 'Z1'.
        gs_output-dat01 = ls_pa0041-dat02.
        when 'Z2'.
          gs_output-dat02 = ls_pa0041-dat02.
          endcase.
*--------------------------------*
  ENDIF.

*   集团年限
*   非离职状态:如果操作类型里不存在离职、退休记录,用当前时间 和 第一条入职的开始时间比较,否则用当前时间 和上一个离职时间或者退休时间区间的下一个时间区间的开始时间比较;
*   离职状态:除了当前时间换成最近一条离职开始时间,其余逻辑一致。
*  CLEAR: lf_datez.
*  IF ls_pa0000_new-stat2 = 3.
*    IF lf_leave_flg IS INITIAL.
*      CLEAR: ls_pa0000_own.
*      READ TABLE lt_pa0000_own INTO ls_pa0000_own INDEX 1.
*      lf_datez = ls_pa0000_own-begda.
*    ELSE.
*      CLEAR: ls_pa0000_own.
*      SORT lt_pa0000_own BY endda DESCENDING.
*      LOOP AT lt_pa0000_own INTO ls_pa0000_own WHERE pernr = ls_pa0001_new-pernr AND ( massn = 'Z8' OR massn = 'Z9' ).
*        CLEAR: lf_tabix.
*        lf_tabix = sy-tabix.
*        EXIT.
*        CLEAR: ls_pa0000_own.
*      ENDLOOP.
*      CLEAR: ls_pa0000_own.
*      lf_tabix = lf_tabix - 1.
*      READ TABLE lt_pa0000_own INTO ls_pa0000_own INDEX lf_tabix.
*      lf_datez = ls_pa0000_own-begda.
*    ENDIF.
*  ELSE.
*    lf_datez = ls_pa0000_new-begda.
*  ENDIF.

  CALL FUNCTION 'HR_99S_INTERVAL_BETWEEN_DATES'
    EXPORTING
*     begda   = ls_pa0041-dat01
      begda   = gs_output-dat01
      endda   = sy-datum
*     TAB_MODE        = ' '
    IMPORTING
*     DAYS    =
*     C_WEEKS =
*     C_MONTHS        =
      c_years = gs_output-dat1z.
  IF sy-subrc <> 0.
  ENDIF.


*   工龄年限(公司年限)
*   非离职状态:用当前时间 和 最近一条入职的开始时间 或者 跨公司调动的开始时间 比较
*   离职状态:除了当前时间换成最近一条离职开始时间,其余逻辑一致。
*  CLEAR: lf_datez,lf_tabix.
*  IF ls_pa0000_new-stat2 = 3.
*    CLEAR: ls_pa0000_own.
*    SORT lt_pa0000_own BY endda DESCENDING.
*    LOOP AT lt_pa0000_own INTO ls_pa0000_own
*      WHERE pernr = ls_pa0001_new-pernr
*      AND ( massn = 'Z1' OR massn = 'Z0' OR massn = 'Z2' OR ( massn = 'Z4' AND ( massg = '06' OR massg = '07' OR massg = '08' ) ) ).
*      CLEAR: lf_tabix.
*      lf_tabix = sy-tabix.
*      EXIT.
*      CLEAR: ls_pa0000_own.
*    ENDLOOP.
*    CLEAR: ls_pa0000_own.
*    READ TABLE lt_pa0000_own INTO ls_pa0000_own INDEX lf_tabix.
*    lf_datez = ls_pa0000_own-begda.
*  ELSE.
*    lf_datez = ls_pa0000_new-begda.
*  ENDIF.

  CALL FUNCTION 'HR_99S_INTERVAL_BETWEEN_DATES'
    EXPORTING
*     begda   = ls_pa0041-dat02
      begda   = gs_output-dat02
      endda   = sy-datum
*     TAB_MODE        = ' '
    IMPORTING
*     DAYS    =
*     C_WEEKS =
*     C_MONTHS        =
      c_years = gs_output-dat2z.
  IF sy-subrc <> 0.
  ENDIF.

  IF ls_pa0000_new-stat2 = 3.
*    IF lf_leave_num = 1.
*      CLEAR: ls_pa0000_own.
*      READ TABLE lt_pa0000_own INTO ls_pa0000_own WITH KEY massn = 'Z9'.
*      gs_output-begdz = ls_pa0000_own-begda.
*      CLEAR: ls_pa0000_own.
*      READ TABLE lt_pa0000_own INTO ls_pa0000_own WITH KEY massn = 'Z8'.
*      gs_output-begda = ls_pa0000_own-begda.
*      CLEAR: ls_pa9000.
*      READ TABLE lt_pa9000 INTO ls_pa9000 WITH KEY pernr = ls_pa0000_own-pernr BINARY SEARCH. " 离职原因
*      gs_output-zlzyy = ls_pa9000-zlzyy.
*    ENDIF.
  ENDIF.


*   退休时间(实际退休时间)
  IF ls_pa0000_new-massn = 'Z9'.
    gs_output-begdz = ls_pa0001_new-begda.
  ENDIF.


*    离职时间、离职原因
  IF ls_pa0000_new-massn = 'Z8' OR ls_pa0000_new-massn = 'Z9'.
    IF ls_pa0000_new-massn = 'Z9'.
      gs_output-begdz = ls_pa0001_new-begda.
    ENDIF.
*    gs_output-begdz = ls_pa0001_new-begda.
    IF ls_pa0000_new-massn = 'Z8'.
      gs_output-begda = ls_pa0001_new-begda.
    ENDIF.
*    CLEAR: ls_pa9000,lf_tabix.
*    READ TABLE lt_pa9000 INTO ls_pa9000 WITH KEY pernr = ls_pa0001_new-pernr BINARY SEARCH. " 离职原因
*    gs_output-zlzyy = ls_pa9000-zlzyy.
  loop at lt_pa9000 INTO ls_pa9000 where pernr = ls_pa0001_new-pernr and begda = ls_pa0001_new-begda.
  gs_output-zlzyy = ls_pa9000-zlzyy.
  gs_output-zsbgj = ls_pa9000-zsbgj.
  endloop.
    " 当前状态为“离职”时,组织架构数据取离职前的组织架构(人事、簇群、部门、岗位)
    CLEAR: ls_pa0001_own,lf_tabix.
    SORT lt_pa0001_own BY endda DESCENDING.
*    READ TABLE lt_pa0001_own INTO ls_pa0001_own INDEX 2.
    READ TABLE lt_pa0001_own INTO ls_pa0001_own WITH KEY endda = ls_pa0001_new-endda begda = ls_pa0001_new-begda.
*    READ TABLE lt_pa0001_own INTO ls_pa0001_own WITH KEY endda = ls_pa0000_new-endda begda = ls_pa0000_new-begda.
    lf_tabix = sy-tabix.
    lf_tabix = lf_tabix + 1.
    CLEAR: ls_pa0001_own.
    READ TABLE lt_pa0001_own INTO ls_pa0001_own INDEX lf_tabix.

*     人事范围、人事范围描述
    IF gs_output-werks IS INITIAL.
      gs_output-werks = ls_pa0001_own-werks.
      CLEAR: ls_t500p.
      READ TABLE lt_t500p INTO ls_t500p WITH KEY persa = ls_pa0001_own-werks BINARY SEARCH.
      IF ls_t500p IS NOT INITIAL.
        gs_output-name1 = ls_t500p-name1.
      ENDIF.
    ENDIF.

*     族群 、族群名称、岗位定级
    CLEAR: ls_yhr_pa_0001.
    READ TABLE lt_yhr_pa_0001 INTO ls_yhr_pa_0001 WITH KEY plans = ls_pa0001_own-plans BINARY SEARCH.
    IF ls_yhr_pa_0001 IS NOT INITIAL.
      gs_output-zegid = ls_yhr_pa_0001-zegid.
      gs_output-zlevl = ls_yhr_pa_0001-zeglevel.
      IF ls_yhr_pa_0001-zeglevel NOT IN s_level.
*        CONTINUE.
        c_rs = 1.
        RETURN.
      ENDIF.
      CLEAR: ls_yhr_pa_0000.
      READ TABLE lt_yhr_pa_0000 INTO ls_yhr_pa_0000 WITH KEY zegid = ls_yhr_pa_0001-zegid  BINARY SEARCH.
      IF ls_yhr_pa_0000 IS NOT INITIAL.
        gs_output-zenam = ls_yhr_pa_0000-zegname.
      ENDIF.
    ENDIF.

*     部门 、部门名称、岗位
    IF gs_output-orgeh IS INITIAL.
      gs_output-orgeh = ls_pa0001_own-orgeh.
      gs_output-plans = ls_pa0001_new-plans.
      CLEAR: ls_hrp1000.
      READ TABLE lt_hrp1000 INTO ls_hrp1000 WITH KEY objid = ls_pa0001_own-orgeh otype = 'O' BINARY SEARCH.
      IF ls_hrp1000 IS NOT INITIAL.
        gs_output-ortxt = ls_hrp1000-stext.
      ENDIF.
    ENDIF.
    CLEAR: ls_hrp1000.
    READ TABLE lt_hrp1000 INTO ls_hrp1000 WITH KEY objid = ls_pa0001_own-plans otype = 'S' BINARY SEARCH.
    IF ls_hrp1000 IS NOT INITIAL.
      gs_output-stext = ls_hrp1000-stext.
    ENDIF.


  ENDIF.

* 人员状态永远都取人员的当前状态
*  DATA: ls_pa0000_tmp TYPE pa0000.
*  CLEAR: ls_pa0000_tmp.
*  READ TABLE lt_pa0000 INTO ls_pa0000_tmp WITH KEY pernr = ls_pa0001_new-pernr endda = '99991231'.
*  gs_output-stat2 = ls_pa0000_tmp-stat2.
*  CLEAR: ls_t529u.
*  READ TABLE lt_t529u INTO ls_t529u WITH KEY statv = gs_output-stat2 BINARY SEARCH.
*  IF ls_t529u IS NOT INITIAL.
*    gs_output-s2txt = ls_t529u-text1.
*  ENDIF.

ENDFORM.

FORM frm_init.

  CLEAR: lt_taba,lt_tabb.
  CLEAR: lt_t529u,lt_t502t,lt_t505s,lt_t517t,lt_t7cn5r,lt_t547s,lt_t005u,lt_bnka.

  CALL FUNCTION 'DD_DOMA_GET'
    EXPORTING
      domain_name   = 'ZD_XZ'
      langu         = sy-langu
      withtext      = 'X'
    TABLES
      dd07v_tab_a   = lt_taba
      dd07v_tab_n   = lt_tabb
    EXCEPTIONS
      illegal_value = 1
      op_failure    = 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.
  SORT lt_taba BY valpos.

  SELECT * FROM t529u INTO TABLE lt_t529u WHERE sprsl = sy-langu AND statn = '2'.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t529u BY statv.

  SELECT * FROM t502t INTO TABLE lt_t502t WHERE sprsl = sy-langu.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t502t BY famst.

  SELECT * FROM t505s INTO TABLE lt_t505s WHERE sprsl = sy-langu AND molga = '28'.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t505s BY racky.

  SELECT * FROM t517t INTO TABLE lt_t517t WHERE sprsl = sy-langu.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t517t BY slart.

  SELECT * FROM t7cn5r INTO TABLE lt_t7cn5r WHERE langu = sy-langu.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t7cn5r BY pcode.

  SELECT * FROM t547s INTO TABLE lt_t547s WHERE sprsl = sy-langu.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t547s BY cttyp.

  SELECT * FROM t005u INTO TABLE lt_t005u WHERE spras = sy-langu AND land1 = 'CN'.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_t005u BY bland.

  SELECT * FROM bnka INTO TABLE lt_bnka WHERE banks = 'CN'.
  IF sy-subrc <> 0.
  ENDIF.
  SORT lt_bnka BY bankl.

ENDFORM.


FORM frm_getdata_d.


ENDFORM.

*&---------------------------------------------------------------------*
*   设定fieldcat参数
*&---------------------------------------------------------------------*
FORM frm_fieldcat.

  DATA: lf_fname TYPE char20,
        lf_date  TYPE sy-datum,
        lf_cts   TYPE i,
        lf_fkey  TYPE char10.

  PERFORM frm_fieldcat_set USING:
*          'CHX'   '选择' 'X' 'X' '' '' '5',
                                  'USRID' '就餐卡号' '' '' '' '' '30',
                                  'PERNR' '工号' '' '' '' '' '8',
                                  'WERKS' '人事范围' '' '' '' '' '4',
                                  'NAME1' '人事范围描述' '' '' '' '' '30',
                                  'ZEGID' '族群' '' '' '' '' '4',
                                  'ZENAM' '族群名称' '' '' '' '' '40',
                                  'ORGEH' '部门' '' '' '' '' '8',
                                  'ORTXT' '部门名称' '' '' '' '' '40',
                                  'ZNAME' '姓名' '' '' '' '' '30',
                                  'DOCNM' '档案编号' '' '' '' '' '30',
                                  'ZLEVL' '岗位定级' '' '' '' '' '4',
                                  'PLANS' '岗位编号' '' '' '' '' '8',
                                  'STEXT' '岗位' '' '' '' '' '40',

                                  'CDATE' '调动时间' '' '' '' '' '10',
                                  'OORGH' '原部门' '' '' '' '' '8',
                                  'OORTT' '原部门名称' '' '' '' '' '40',
                                  'OZLEL' '原岗位定级' '' '' '' '' '4',
                                  'OPLANS' '原岗位编号' '' '' '' '' '8',
                                  'OSTXT' '原岗位' '' '' '' '' '40',

                                  'RACKY' '民族' '' '' '' '' '2',
                                  'LTEXT' '民族描述' '' '' '' '' '50',
                                  'ICNUM' '身份证号' '' '' '' '' '30',
                                  'ZZAGE' '年龄' '' '' '' '' '15',
                                  'GBDAT' '出生日期' '' '' '' '' '',
                                  'DAT04' '退休日期' '' '' '' '' '',
                                  'ZZRQ' '转正日期' '' '' '' '' '',
                                  'GESCH' '性别' '' '' '' '' '',
                                  'SLART' '学历' '' '' '' '' '',
                                  'SLEXT' '学历文本' '' '' '' '' '20',
                                  'INSTI' '毕业院校' '' '' '' '' '80',
                                  'ENDDA' '毕业时间' '' '' '' '' '',
                                  'ZMAOR' '专业' '' '' '' '' '30',
                                  'PCODE' '政治面貌' '' '' '' '' '',
                                  'PTEXT' '政治面貌描述' '' '' '' '' '40',
                                  'FAMST' '婚姻' '' '' '' '' '',
                                  'FATXT' '婚姻描述' '' '' '' '' '',
                                  'ZTILE' '职称' '' '' '' '' '20',
                                  'ZUSID' '联系电话' '' '' '' '' '30',
                                  'MUSID' '邮箱' '' '' '' '' '30',
                                  'DAT01' '集团入职日' '' '' '' '' '',
                                  'DAT1Z' '集团期限(年)' '' '' '' '' '',
                                  'DAT02' '公司入职日' '' '' '' '' '',
                                  'DAT2Z' '入公司年限(年)' '' '' '' '' '',
                                  'PRBZT' '试用截止日' '' '' '' '' '',
                                  'CTTYP' '合同期限' '' '' '' '' '',
                                  'CTTXT' '合同期限描述' '' '' '' '' '',
                                  'CTEDT' '合同截止日' '' '' '' '' '',
                                  'ZZNUM' '合同次数' '' '' '' '' '',
                                  'ZHKXZ' '本地/外地户口性' '' '' '' '' '',
                                  'DTEXT' '本地/外地户口性描述' '' '' '' '' '60',
                                  'GBDEP' '籍贯' '' '' '' '' '',
                                  'BEZEI' '籍贯描述' '' '' '' '' '20',
                                  'LOCAT' '家庭住址' '' '' '' '' '40',
                                  'LOATZ' '现居住地址' '' '' '' '' '40',
                                  'ZZFLG' '是否入住宿舍' '' '' '' '' '',
                                  'USETO' '身份证期限' '' '' '' '' '',
                                  'USTOE' '暂住证期限' '' '' '' '' '',
                                  'BANKL' '银行' '' '' '' '' '15',
                                  'BANKA' '银行名称' '' '' '' '' '60',
                                  'BANNK' '账户' '' '' '' '' '30',
                                  'BEGDA' '离职时间' '' '' '' '' '',
                                  'BEGDZ' '退休时间' '' '' '' '' '',
                                  'ZLZYY' '离职原因' '' '' '' '' '20',
                                  'ZSBGJ' '离职社保公积金说明' '' '' '' '' '30',
                                  'STAT2' '当前状态' '' '' '' '' '',
                                  'S2TXT' '当前状态描述' '' '' '' '' '40'.

ENDFORM.

*&---------------------------------------------------------------------*
*   填充fieldcat
*&---------------------------------------------------------------------*
FORM frm_fieldcat_set  USING  p_name
                            p_text
                            p_cbox
                            p_edit
                            p_field
                            p_table
                            p_outlen.
  CLEAR: gs_fieldcat.
  gs_fieldcat-fieldname = p_name.   " 第一个参数fieldname必须是内表中的字段,未明确参考字段,必输项
  gs_fieldcat-scrtext_l = p_text.
  gs_fieldcat-scrtext_m = p_text.
  gs_fieldcat-scrtext_s = p_text.
  gs_fieldcat-checkbox  = p_cbox.
  gs_fieldcat-edit      = p_edit.   " 是否可以编辑,checkbox必须是可编辑的
  gs_fieldcat-ref_table = p_table.      " 另一种方式
  gs_fieldcat-ref_field = p_field.
*  gs_fieldcat-reptext   = &3.
  gs_fieldcat-outputlen = p_outlen. "定义输出长度
  IF gs_fieldcat-fieldname = 'MATNR' OR gs_fieldcat-fieldname = 'WXXH'.
    gs_fieldcat-no_zero    = 'X'.
  ENDIF.
  IF gs_fieldcat-fieldname = 'ZZAGE'.
    gs_fieldcat-decimals_o = '0'.
  ENDIF.
  APPEND gs_fieldcat TO gt_fieldcat.
ENDFORM.

*&---------------------------------------------------------------------*
*   设定layout参数
*&---------------------------------------------------------------------*
FORM frm_layout_set .
  gs_layout-zebra      = 'X'."可选行颜色,如果设置了,出现了间隔色带
  gs_layout-cwidth_opt = 'X'."最优化宽度
*  gs_layout-box_fname = 'CHX'.
* gs_layout-INFO_FNAME = 'COLOR'.a"带有简单行彩色代码的字段名称???
* gs_layout-STYLEFNAME = 'STYLE'."设置单元格,比如PUSHBUTTON
  gs_layout-sel_mode   = 'A'."选择模式,A:行和列的选择,无法选择单元格;'B':或space,默认设置,单选,不可以多选行,不可以多选单元格;C:多选,可以多选行,不可以多选单元格
*  gs_layout-ctab_fname = 'CELLCOLOR'. "单元格颜色内表字段
  gs_grid_settings-edt_cll_cb = 'X' .
ENDFORM.

*&---------------------------------------------------------------------*
*   ALV展示数据
*&---------------------------------------------------------------------*
FORM frm_display_alv .

  CLEAR: gt_fieldcat[],gs_layout,gt_events[].

  PERFORM frm_layout_set.

  PERFORM frm_events_set.

  PERFORM frm_fieldcat.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_interface_check        = ''
      i_callback_program       = sy-cprog
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      i_callback_user_command  = 'USER_COMMAND'
*     I_CALLBACK_HTML_TOP_OF_PAGE  = 'HTML_TOP_OF_PAGE'
      i_callback_pf_status_set = 'FRM_SET_PF'
      it_events                = gt_events
      i_grid_settings          = gs_grid_settings
      i_save                   = 'U' "
    TABLES
      t_outtab                 = gt_output
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.

FORM frm_set_pf USING rt_extab TYPE slis_t_extab.
  CLEAR: rt_extab.
  REFRESH: rt_extab.

  DATA: BEGIN OF lt_extab OCCURS 0,
          fcode LIKE sy-ucomm,
        END OF lt_extab.
  CLEAR: lt_extab,lt_extab[].
*  IF p_cr IS NOT INITIAL.
*    lt_extab-fcode = 'JCBD'.
*  ELSE.
*    lt_extab-fcode = 'BDXH'.
*  ENDIF.
*  APPEND lt_extab.
  SET PF-STATUS 'ZSTATUS' EXCLUDING lt_extab.
ENDFORM.

FORM frm_events_set.
  CLEAR: gs_events.
  gs_events-name = 'CALLER_EXIT'.   "slis_ev_caller_exit_at_start事件
  gs_events-form = 'FRM_ALVEVENTREGIST'.
  APPEND gs_events TO gt_events.
ENDFORM.

*&---------------------------------------------------------------------*
*   ALV用户交互事件
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
  DATA: ls_button   LIKE sy-ucomm.
  DATA:  lf_answer  TYPE c.
  DATA lo_grid TYPE REF TO cl_gui_alv_grid.

  rs_selfield-refresh = 'X'."刷新标识

*  DATA: lt_output TYPE STANDARD TABLE OF typ_output.
*  CLEAR: lt_output,gs_output.
*  lt_output = gt_output.
*  SORT lt_output BY chgflg.


  CASE r_ucomm.
    WHEN '&DATA_SAVE'.
*      IF gs_output IS INITIAL.
*        MESSAGE i208(00) WITH '数据未更改'.
*      ENDIF.
*      PERFORM frm_save.
    WHEN 'BDXH'.


      CLEAR: lf_answer.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          text_question         = '确定要绑定当前数据吗?'
          icon_button_1         = '是' "是
          icon_button_2         = '否' "否
          default_button        = '2'
          display_cancel_button = ''
          start_column          = 25
          start_row             = 6
        IMPORTING
          answer                = lf_answer
        EXCEPTIONS
          text_not_found        = 1
          OTHERS                = 2.
      IF sy-subrc <> 0.
      ENDIF.
      IF lf_answer <> 1.
*        SET SCREEN 0.
*        LEAVE SCREEN.
        MESSAGE s208(00) WITH '已取消'.
        RETURN.
      ELSE.
*        MESSAGE s208(00) WITH '已取消'.
      ENDIF.

      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_grid = lo_grid.
      CALL METHOD lo_grid->check_changed_data.

*      SORT gt_output BY chx.
*      CLEAR: gs_output.
*      READ TABLE gt_output INTO gs_output WITH KEY chx = 'X' BINARY SEARCH.
*      IF gs_output IS INITIAL.
*        SORT gt_output BY werks matnr lgort charg.
*        MESSAGE i208(00) WITH '请先选择要绑定外箱箱号的数据!'.
*        EXIT.
*      ENDIF.
*
*      SORT gt_output BY chx zflg.
*      CLEAR: gs_output.
*      READ TABLE gt_output INTO gs_output WITH KEY chx = 'X' zflg = 'Y' BINARY SEARCH.
*      IF gs_output IS NOT INITIAL.
*        SORT gt_output BY werks matnr lgort charg.
*        MESSAGE i208(00) WITH '选择的数据钟存在已经绑定的数据,请检查!'.
*        EXIT.
*      ENDIF.

      PERFORM frm_bd_save.
    WHEN 'JCBD'.

      CLEAR: lf_answer.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          text_question         = '确定要解除绑定数据吗?'
          icon_button_1         = '是' "是
          icon_button_2         = '否' "否
          default_button        = '2'
          display_cancel_button = ''
          start_column          = 25
          start_row             = 6
        IMPORTING
          answer                = lf_answer
        EXCEPTIONS
          text_not_found        = 1
          OTHERS                = 2.
      IF sy-subrc <> 0.
      ENDIF.
      IF lf_answer <> 1.
*        SET SCREEN 0.
*        LEAVE SCREEN.
        MESSAGE s208(00) WITH '已取消'.
        RETURN.
      ELSE.
*        MESSAGE s208(00) WITH '已取消'.
      ENDIF.

      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_grid = lo_grid.
      CALL METHOD lo_grid->check_changed_data.

*      SORT gt_output BY chx.
*      CLEAR: gs_output.
*      READ TABLE gt_output INTO gs_output WITH KEY chx = 'X' BINARY SEARCH.
*      IF gs_output IS INITIAL.
*        SORT gt_output BY werks matnr lgort charg.
*        MESSAGE i208(00) WITH '请先选择要解除绑定外箱箱号的数据!'.
*        EXIT.
*      ENDIF.
*
*      SORT gt_output BY chx zflg.
*      CLEAR: gs_output.
*      READ TABLE gt_output INTO gs_output WITH KEY chx = 'X' zflg = 'N' BINARY SEARCH.
*      IF gs_output IS NOT INITIAL.
*        SORT gt_output BY werks matnr lgort charg.
*        MESSAGE i208(00) WITH '选择的数据钟存在未绑定的数据,请检查!'.
*        EXIT.
*      ENDIF.

      PERFORM frm_jcbd_save.
    WHEN 'BACK1' OR 'CANCEL' OR 'EXIT'.
*      IF gs_output IS NOT INITIAL.
*        DATA:  lf_answer  TYPE c.
*        CALL FUNCTION 'POPUP_TO_CONFIRM'
*          EXPORTING
*            text_question         = '有未保存数据,确认离开吗?'
*            icon_button_1         = '是' "是
*            icon_button_2         = '否' "否
*            default_button        = '2'
*            display_cancel_button = ''
*            start_column          = 25
*            start_row             = 6
*          IMPORTING
*            answer                = lf_answer
*          EXCEPTIONS
*            text_not_found        = 1
*            OTHERS                = 2.
*        IF sy-subrc <> 0.
*        ENDIF.
*        IF lf_answer <> 2.
*          SET SCREEN 0.
*          LEAVE SCREEN.
*        ELSE.
*          MESSAGE s208(00) WITH '已取消'.
*        ENDIF.
*      ELSE.
*        SET SCREEN 0.
*        LEAVE SCREEN.
*      ENDIF.
      SET SCREEN 0.
      LEAVE SCREEN.
    WHEN OTHERS.

  ENDCASE.



ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  html_top_of_page
*&---------------------------------------------------------------------*

FORM html_top_of_page USING document TYPE REF TO cl_dd_document.

  DATA: text TYPE sdydo_text_element.
  DATA: m_p      TYPE i,
        m_buffer TYPE string.

  CONCATENATE  '<HTML><H5>' 'ALV_HTML表头' '测试' '</H5></HTML>' INTO m_buffer.  " 居中  <H1>设置字体格式
  CALL METHOD document->html_insert
    EXPORTING
      contents = m_buffer
    CHANGING
      position = m_p.

*   " 输出制表人和制表日期
*  CONCATENATE '<P ALIGN = CENTER >出表人: ' 'XX'
**            '                  '    ' '
**            '                  '
**            '                  '
**            '                  '
**            '                  '
**            '                  '
*            ' 出表日期:' sy-datum INTO m_buffer .
*
*  CALL METHOD document->html_insert
*    EXPORTING
*      contents = m_buffer
*    CHANGING
*      position = m_p.
*
*
*   CALL METHOD document->new_line.
*   CALL METHOD document->add_link
*    EXPORTING
**      NAME                   =
*      url                    = 'http://www.baidu.com'
*      tooltip                = '百度'
*      text                   = 'BaiDu连接'.
*  CALL METHOD document->new_line.
*
*  text =  'Company Code Data'.
*  CALL METHOD document->add_text
*    EXPORTING
*      text      = text
*      sap_style = 'HEADING'               " 显示文字的STYLE设置
*      sap_color = cl_dd_document=>list_total_int
*      sap_fontsize    = cl_dd_document=>large
*      sap_fontstyle   = cl_dd_document=>serif
*      sap_emphasis    = cl_dd_document=>emphasis
*      .
*
*  CALL METHOD document->new_line.      "换行
*  CALL METHOD document->new_line.
*
*  text = 'User Name : '.
*  CALL METHOD document->add_text      "插入文本
*    EXPORTING
*      text         = text
*      sap_emphasis = 'Strong'.
*
*  CALL METHOD document->add_gap      "插入位置
*    EXPORTING
*      width = 2.
*
*  text = sy-uname.
*  CALL METHOD document->add_text
*    EXPORTING
*      text      = text
*      sap_style = 'Key'.
*
*  CALL METHOD document->add_gap
*    EXPORTING
*      width = 10.
*
*  CALL METHOD document->add_icon     " 插入图片
*    exporting
*      sap_icon = 'ICON_DATE'.
*
*  text = 'Date : '.
*  CALL METHOD document->add_text
*    EXPORTING
*      text         = text
*      sap_emphasis = 'Strong'.
*
*  CALL METHOD document->add_gap
*    EXPORTING
*      width = 2.
*
*  text = sy-datum.
*  CALL METHOD document->add_text
*    EXPORTING
*      text      = text
*      sap_style = 'Key'.
*
*  CALL METHOD document->add_gap
*    EXPORTING
*      width = 10.
*
*  text = 'Time : '.
*  CALL METHOD document->add_text
*    EXPORTING
*      text         = text
*      sap_emphasis = 'Strong'.
*
*  CALL METHOD document->add_gap
*    EXPORTING
*      width = 2.
*
*  text = sy-uzeit.
*  CALL METHOD document->add_text
*    EXPORTING
*      text      = text
*      sap_style = 'Key'.
*
*  CALL METHOD document->new_line.
*
*  CALL METHOD document->underline.   "画一条横线
ENDFORM.                    "HTML_TOP_OF_PAGE

*&---------------------------------------------------------------------*
*   ALV用户交互事件
*&---------------------------------------------------------------------*
FORM frm_alveventregist USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = gr_grid.

  CALL METHOD gr_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
  ENDIF.
  CREATE OBJECT go_event_receiver.
  SET HANDLER   go_event_receiver->handle_data_changed FOR gr_grid.
  SET HANDLER   go_event_receiver->handle_data_changed_finished FOR gr_grid.

ENDFORM.

*&---------------------------------------------------------------------*
*   ALV用户交互事件
*&---------------------------------------------------------------------*
FORM data_changed  USING     p_er_data_changed
                   TYPE REF TO   cl_alv_changed_data_protocol.

*  DATA: ls_data  TYPE lvc_s_modi.
*  data: ls_output like gs_output.
*  data: lf_tabix type sy-tabix.
*
*  CLEAR: ls_data,gs_output.
*  READ TABLE p_er_data_changed->mt_good_cells INTO ls_data INDEX 1.
*  IF ls_data IS NOT INITIAL.
*    READ TABLE gt_output INTO gs_output INDEX ls_data-row_id.
*    ls_output = gs_output.
*    IF ls_output-wxxh is INITIAL.
*      return.
*    ENDIF.
*    LOOP AT gt_output INTO gs_output WHERE wxxh = ls_output-wxxh.
*      CLEAR: lf_tabix.
*      lf_tabix = sy-tabix.
*      gs_output-chx = 'X'.
*      modify gt_output FROM gs_output index lf_tabix TRANSPORTING chx.
*      CLEAR: gs_output.
*    ENDLOOP.
**    gs_output-chgflg = 'X'.
**    MODIFY gt_output FROM gs_output INDEX ls_data-row_id.
*  ENDIF.

ENDFORM.

FORM data_changed_finished USING e_modified et_good_cells TYPE lvc_t_modi.

*  DATA: ls_goodcells TYPE lvc_s_modi.
*  CLEAR: gs_output,ls_goodcells.
*  READ TABLE et_good_cells INTO ls_goodcells INDEX 1.
*  IF ls_goodcells-fieldname = 'ZTRQTY' OR ls_goodcells-fieldname = 'ORQTY'.
*    READ TABLE gt_output INTO gs_output INDEX ls_goodcells-row_id.
*    gs_output-kqty1 = gs_output-scqty * gs_output-orqty.
*    gs_output-tqty1 = gs_output-ztrqty * gs_output-orqty.
*    gs_output-amt02 = gs_output-scqty * gs_output-effpr.
*    MODIFY gt_output FROM gs_output INDEX ls_goodcells-row_id.
*  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*   设置单元格颜色
*&---------------------------------------------------------------------*
FORM frm_cellcolorset USING u_fname TYPE lvc_fname
                            u_col   TYPE lvc_col.
*  CLEAR: gs_cellcolor.
*  gs_cellcolor-fname = u_fname.
*  gs_cellcolor-color-col = u_col.
*  gs_cellcolor-color-int = 1.
*  gs_cellcolor-color-inv = 0.
*  APPEND gs_cellcolor TO gt_cellcolor.
*  gs_output-cellcolor = gt_cellcolor.
ENDFORM.

*&---------------------------------------------------------------------*
*   保存
*&---------------------------------------------------------------------*
FORM frm_save.
*  DATA: lt_zmmt011_up TYPE STANDARD TABLE OF zmmt011,
*        ls_zmmt011_up TYPE zmmt011.
*  CLEAR: lt_zmmt011_up,ls_zmmt011_up.
*  DATA: lf_tabix TYPE sy-tabix.
*  LOOP AT gt_output INTO gs_output WHERE chgflg = 'X'.
*    CLEAR: lf_tabix.
*    lf_tabix = sy-tabix.
*    CLEAR: ls_zmmt011_up.
*    MOVE-CORRESPONDING gs_output TO ls_zmmt011_up.
*    APPEND ls_zmmt011_up TO lt_zmmt011_up.
*    gs_output-chgflg = ''.
*    MODIFY gt_output FROM gs_output INDEX lf_tabix.
*    CLEAR: gs_output.
*  ENDLOOP.
*
*  IF lt_zmmt011_up IS NOT INITIAL.
*    CALL FUNCTION 'ZFM_ZMMT011_MODIFY' IN UPDATE TASK
*      TABLES
*        it_zmmt011 = lt_zmmt011_up.
*    COMMIT WORK AND WAIT.
*    MESSAGE s208(00) WITH '保存成功'.
*  ENDIF.

ENDFORM.

FORM frm_bd_save.




ENDFORM.

FORM frm_jcbd_save.



ENDFORM.

FORM frm_wxxhno_get CHANGING c_wxxh_no TYPE char20.



ENDFORM.


FORM EDIT_DATA.
  LOOP AT gt_output INTO GS_OUTPUT.
*------------------获取转正日期---------------------max-----------20190829------------------*
    SELECT SINGLE BEGDA INTO GS_OUTPUT-ZZRQ FROM PA0000 WHERE PERNR = GS_OUTPUT-PERNR AND MASSN = 'Z7'.
*------------------获取转正日期---------------------max-----------20190829------------------*
    MODIFY GT_OUTPUT FROM GS_OUTPUT.
    CLEAR:GS_OUTPUT.
  ENDLOOP.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值