SAP ABAP 人事报表案例

一、前言

根据员工工号和身份证号,查询员工操作状态是入职和在入职的员工信息
查询字段:工号,姓名,操作类型(文本),组织单位(文本),职位(文本),职务(文本),身份证号
数据表:PA0000、PA0001、PA0185(身份证号)、PA0002(民族,省份,籍贯)

二、编码

1、主报表

*&---------------------------------------------------------------------*
*& Report ZDEMO_ZLM
*&---------------------------------------------------------------------*
*&PA0000PA0001PA0185(身份证号)PA0002(民族、省份、籍贯)
*&入职01、在入职09
*&工号、操作类型、操作类型文本、组织单位、职位、职务、转文本,身份证号
*&查询条件:工号、身份证、人事范围、员工子组、人事子范围、员工组
*&---------------------------------------------------------------------*
REPORT zdemo_zlm01.

INCLUDE zdemo_zlm01_top.
*INCLUDE zdemo_zlm_top."数据定义
INCLUDE zdemo_zlm01_scr.
*INCLUDE zdemo_zlm_scr."选择屏幕
INCLUDE zdemo_zlm01_frm.
*INCLUDE zdemo_zlm_frm."功能定义

START-OF-SELECTION.

*** 取数方式一
  PERFORM frm_get_data.  " 表连接取数

  PERFORM frm_alv_display.

END-OF-SELECTION.

2、数据定义

*&---------------------------------------------------------------------*
*& 包含               ZDEMO_ZLM_TOP
*&工号、操作类型、操作类型文本、组织单位、职位、职务、身份证号、PA0002(民族、省份、籍贯)
*&---------------------------------------------------------------------*

TABLES:
  pa0000,pa0001,pa0185,pa0002.

*** 报表结构定义
DATA:
  BEGIN OF gs_item,
    sel      TYPE c,
    pernr    TYPE pa0000-pernr,   "工号
    sname    TYPE pa0001-sname,   "员工姓名
    massn    TYPE pa0000-massn,   "操作类型
    massntxt TYPE string,         "操作类型文本
    orgeh    TYPE pa0001-orgeh,   "组织单位
    orgehtxt TYPE string,         "组织单位文本
    plans    TYPE pa0001-plans,   "职位
    planstxt TYPE string,         "职位文本
    stell    TYPE pa0001-stell,   "职务
    stelltxt TYPE string,         "职务文本
    icnum    TYPE pa0185-icnum,   "身份证号
    zmzwb    TYPE pa0002-zmzwb,   "民族
    zhrsfwb  TYPE pa0002-zhrsfwb, "省份
    zhrdjswb TYPE pa0002-zhrdjswb,"籍贯
  END OF gs_item.

DATA:
    gt_item LIKE TABLE OF gs_item.

**** alv *
DATA:
  gs_layout  TYPE lvc_s_layo,
  gs_variant TYPE disvariant,
  gt_fcat    TYPE lvc_t_fcat,
  gs_fcat    LIKE LINE OF gt_fcat.

DEFINE m_range.
  &1-sign   = 'I'.
  &1-option = &2.
  &1-low    = &3.
  &1-high   = &4.
  APPEND &1.
END-OF-DEFINITION.

3、选择屏幕

*  &---------------------------------------------------------------------*
*  & 包含               ZDEMO_ZLM_SCR
*  &查询条件:工号、身份证、人事范围、员工子组、人事子范围、员工组
*  &---------------------------------------------------------------------*

  SELECTION-SCREEN BEGIN OF BLOCK b1k0 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:

                s_pernr FOR pa0001-pernr NO INTERVALS, "员工号
                s_werks FOR pa0001-werks NO INTERVALS, "人事范围
                s_btrtl FOR pa0001-btrtl NO INTERVALS, "人事子范围
                s_persg FOR pa0001-persg NO INTERVALS, "员工组
                s_persk FOR pa0001-persk NO INTERVALS, "员工子组
                s_icnum FOR pa0185-icnum NO INTERVALS. "身份证号

  SELECTION-SCREEN END OF BLOCK b1k0.

在这里插入图片描述

4、功能定义(重点)

*&---------------------------------------------------------------------*
*& 包含               ZDEMO_ZLM_FRM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*

FORM frm_get_data .

  SELECT
    p0~pernr"员工号
    p0~massn"操作类型
    p1~icnum"身份证号
  INTO CORRESPONDING FIELDS OF TABLE gt_item
  FROM pa0000 AS p0
  INNER JOIN pa0185 AS p1 ON p0~pernr = p1~pernr
  WHERE p0~massn IN ('01' , '09')
  AND p0~endda = '99991231'
  AND p1~icnum IN s_icnum
  AND p0~pernr IN s_pernr.

  SORT gt_item BY pernr."排序

  IF gt_item[] IS NOT INITIAL."检查gt_item的内部表或数组是否为空或未初始化

**** 组织单位、职位、职务(编码)、姓名 *
    SELECT pernr,subty,objps,sprps,endda,begda,seqnr,orgeh,plans,stell,sname INTO TABLE @DATA(lt_pa0001)
     FROM pa0001 FOR ALL ENTRIES IN @gt_item "将内部表的条目作为条件应用于数据检索
     WHERE pernr = @gt_item-pernr
     AND endda = '99991231'.

**** 查询组织单位名称
    SELECT stext,objid
    INTO TABLE @DATA(lt_orgeh)
    FROM hrp1000
    FOR ALL ENTRIES IN @lt_pa0001
    WHERE otype = 'O'"对象类型
    AND   objid =  @lt_pa0001-orgeh"对象标识
    AND endda = '99991231'.

**** 查询职位名称
    SELECT stext,objid
    INTO TABLE @DATA(lt_plans)
    FROM hrp1000
    FOR ALL ENTRIES IN @lt_pa0001
    WHERE otype = 'S'
    AND   objid = @lt_pa0001-plans
    AND endda = '99991231'.

**** 查询职务名称
    SELECT stext,objid
    INTO TABLE @DATA(lt_stell)
    FROM hrp1000
    FOR ALL ENTRIES IN @lt_pa0001
    WHERE otype = 'C'
    AND   objid = @lt_pa0001-stell
    AND endda = '99991231'.

**** 民族、省份、籍贯 *
    SELECT pernr,subty,objps,sprps,endda,begda,seqnr,zmzwb,zhrsfwb,zhrdjswb INTO TABLE @DATA(lt_pa0002)
      FROM pa0002 FOR ALL ENTRIES IN @gt_item
     WHERE pernr = @gt_item-pernr
     AND endda = '99991231'.

*使用 BINARY SEARCH 之前,需要对数据进行排序
    SORT lt_pa0001 BY pernr.
    SORT lt_pa0002 BY pernr.

  ENDIF.

  LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<gs_item>)."遍历gt_item中的元素并使用字段符号<gs_item>来访问每个元素的字段值

**** 操作类型描述赋值 *
    IF <gs_item>-massn = '01'.
      <gs_item>-massntxt = '入职'.
    ELSEIF <gs_item>-massn = '02'.
      <gs_item>-massntxt = '转正'.
    ELSEIF <gs_item>-massn = '03'.
      <gs_item>-massntxt = '调动'.
    ELSEIF <gs_item>-massn = '04'.
      <gs_item>-massntxt = '离职'.
    ELSEIF <gs_item>-massn = '05'.
      <gs_item>-massntxt = '退休'.
    ELSEIF <gs_item>-massn = '06'.
      <gs_item>-massntxt = '返聘'.
    ELSEIF <gs_item>-massn = '07'.
      <gs_item>-massntxt = '不在岗'.
    ELSEIF <gs_item>-massn = '08'.
      <gs_item>-massntxt = '返岗'.
    ELSEIF <gs_item>-massn = '09'.
      <gs_item>-massntxt = '在入职'.
    ELSE.
      <gs_item>-massntxt = '退休'.
    ENDIF.

**** 部门编码、职位编码、职务编码、姓名赋值 *
*在内部表lt_pa0001中查找匹配pernr值的行,并将找到的行中的orgeh...等字段值赋给<gs_item>-orgeh等字段
    READ TABLE lt_pa0001 INTO DATA(ls_pa0001) WITH KEY pernr = <gs_item>-pernr BINARY SEARCH.
    IF sy-subrc = 0.
      <gs_item>-orgeh = ls_pa0001-orgeh.
      <gs_item>-plans = ls_pa0001-plans.
      <gs_item>-stell = ls_pa0001-stell.
      <gs_item>-sname = ls_pa0001-sname.
    ENDIF.

**** 部门描述字段赋值 *
    READ TABLE lt_orgeh INTO DATA(ls_orgeh) WITH KEY objid = <gs_item>-orgeh BINARY SEARCH.
    IF sy-subrc = 0.
      <gs_item>-orgehtxt = ls_orgeh-stext.
    ENDIF.

**** 职位描述字段赋值 *
    READ TABLE lt_plans INTO DATA(ls_plans) WITH KEY objid = <gs_item>-plans BINARY SEARCH.
    IF sy-subrc = 0.
      <gs_item>-planstxt = ls_plans-stext.
    ENDIF.

**** 职务描述字段赋值 *
    READ TABLE lt_stell INTO DATA(ls_stell) WITH KEY objid = <gs_item>-stell BINARY SEARCH.
    IF sy-subrc = 0.
      <gs_item>-stelltxt = ls_stell-stext.
    ENDIF.


**** 民族、省份、籍贯赋值 *
    READ TABLE lt_pa0002 INTO DATA(ls_pa0002) WITH KEY pernr = <gs_item>-pernr BINARY SEARCH.
    IF sy-subrc = 0.
      <gs_item>-zmzwb = ls_pa0002-zmzwb.
      <gs_item>-zhrsfwb = ls_pa0002-zhrsfwb.
      <gs_item>-zhrdjswb = ls_pa0002-zhrdjswb.
    ENDIF.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_SCR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
FORM frm_init_alv_fcat .

  DEFINE m_fcat.

    CLEAR gs_fcat.
    gs_fcat-fieldname = &1.   "内表的字段名
    gs_fcat-coltext   = &2.   "字段描述.
    gs_fcat-edit      = &3.

    gs_fcat-ref_table = &4.
    gs_fcat-ref_field = &5.


    APPEND gs_fcat TO gt_fcat.

  END-OF-DEFINITION.

*** 定义表头字段*
  CLEAR gt_fcat[].

  m_fcat:
        'PERNR' '员工工号' '' '' '',
        'SNAME' '姓名'     '' '' '',
        'MASSNTXT' '操作类型' '' '' '',
        'ORGEHTXT' '组织单位' '' '' '',
        'PLANSTXT' '职位' '' '' '',
        'STELLTXT' '职务' '' '' '',
        'ZMZWB' '民族' '' '' '',
        'ZHRSFWB' '省份' '' '' '',
        'ZHRDJSWB' '籍贯' '' '' '',
        'ICNUM' '身份证号' '' '' ''.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text  数据显示
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alv_display .
  DATA:i_grid_settings TYPE  lvc_s_glay.
  gs_layout-zebra = 'X'.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-box_fname = 'SEL'."add
  i_grid_settings-edt_cll_cb  = 'X'."

  PERFORM frm_init_alv_fcat.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_PF_STATUS_SET'
      i_callback_user_command  = 'FRM_USER_COMMAND'
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fcat[]
      i_default                = 'X'
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_item
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

ENDFORM.


FORM frm_pf_status_set USING t_ex_tcode TYPE slis_t_extab.
  DATA:
    lt_fcode TYPE TABLE OF sy-ucomm.


  SET PF-STATUS 'PF9000' EXCLUDING lt_fcode.

ENDFORM.                    "SET_PF_STATUS


FORM html_top_of_page USING document TYPE REF TO cl_dd_document.

ENDFORM.                    "HTML_TOP_OF_PAGE

FORM frm_user_command USING p_ucomm     TYPE sy-ucomm     "响应功能代码
                            p_selfield  TYPE slis_selfield.
  DATA:
    lv_ucomm LIKE sy-ucomm.
  lv_ucomm = p_ucomm.

  DATA: l_result LIKE LINE OF gt_item.

  CLEAR p_ucomm.

  CASE lv_ucomm.
    WHEN '&QD'.


  ENDCASE.

ENDFORM.

三、测试

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: REPORT ZTEST.DATA: BEGIN OF ITAB OCCURS 0, VBELN LIKE VBAK-VBELN, VKBUR LIKE VBAK-VKBUR, END OF ITAB.SELECT * FROM VBAK INTO ITAB WHERE VBELN IN S_VBELN.LOOP AT ITAB. WRITE:/ ITAB-VBELN, ITAB-VKBUR. ENDLOOP. ### 回答2: SAP ABAP是一种流行的企业应用程序开发语言,用于在SAP系统中开发各种功能和报表。下面是一个示例的SAP ABAP数据报表代码: REPORT Z_MY_REPORT. DATA: lt_data TYPE STANDARD TABLE OF sflight, ls_data LIKE LINE OF lt_data. SELECT * FROM sflight INTO TABLE lt_data. WRITE: / 'FLIGHT', 'CARRIER', 'PRICE'. LOOP AT lt_data INTO ls_data. WRITE: / ls_data-fldate, ls_data-carrid, ls_data-seatsmax. ENDLOOP. 在这个示例中,我们首先定义了一个内表lt_data,类型为标准表(STANDARD TABLE),并声明了一个内表行ls_data,类型与lt_data的行相同。然后,我们使用SELECT语句从SFLIGHT表中选择所有数据,并将其存储在lt_data内表中。 接下来,我们使用LOOP AT语句循环遍历lt_data内表中的每一行,并将每一行的fldate、carrid和seatsmax字段值显示在屏幕上,使用WRITE语句实现输出功能。 这段代码会生成一个简单的报表,显示所有航班的日期、航空公司和座位最大数量。你可以根据需要修改代码来适应不同的数据源和显示要求。注意,SAP ABAP具有丰富的语法和功能,可以用于更复杂的报表开发和数据处理任务。 ### 回答3: SAP ABAP是一种用于编写SAP系统的应用程序的编程语言。数据报表SAP系统中经常用于显示和处理数据的工具。以下是一个简单的SAP ABAP数据报表代码的示例: REPORT ZDATA_REPORT. TABLES: ZEMPLOYEE. DATA: GT_EMPLOYEE TYPE TABLE OF ZEMPLOYEE, GS_EMPLOYEE TYPE ZEMPLOYEE. START-OF-SELECTION. SELECT * FROM ZEMPLOYEE INTO TABLE GT_EMPLOYEE. LOOP AT GT_EMPLOYEE INTO GS_EMPLOYEE. WRITE: / GS_EMPLOYEE-EMP_NAME, GS_EMPLOYEE-EMP_DEPARTMENT, GS_EMPLOYEE-EMP_SALARY. ENDLOOP. 上述代码首先声明了一个数据表ZEMPLOYEE,然后定义了两个数据结构:GT_EMPLOYEE和GS_EMPLOYEE。GT_EMPLOYEE是ZEMPLOYEE的内表类型,用于存储从数据库中检索到的数据。GS_EMPLOYEE是ZEMPLOYEE的一行数据。 代码的START-OF-SELECTION部分是数据报表的主体代码。它使用SELECT语句从数据库中选择所有的ZEMPLOYEE数据,并将其存储到GT_EMPLOYEE内表中。 然后,通过LOOP语句遍历GT_EMPLOYEE内表,并使用WRITE语句将每个员工的姓名、部门和薪资输出到屏幕上。 以上代码是一个简单的SAP ABAP数据报表示例,它可以根据具体的需求进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小钟不想敲代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值