SAP简单报表开发

本文介绍了在SAP系统中利用ABAP进行二次开发,创建一个出口货物保险费对账单报表的过程。从理解SAP和ABAP基本语法开始,通过查询透明表、定义数据结构、编写报表程序、处理数据和展示ALV报表,详细阐述了报表开发的步骤。最终实现自动化的数据查询和报表展示,提高了工作效率。
摘要由CSDN通过智能技术生成

在公司摸鱼了一个多月,上周有开发任务了,在SAP里二次开发,做一个简单报表

1.需求简介

以前出口货物保险费对账单是由保险公司提供,审单员进行打印张贴于OA进行提需审批;现保险公司不提供出口货物保险费对账单,需在SAP中开发相应出口货物保险费对账单报表。

2.熟悉表和相关事务码

来了公司才了解SAP是什么,之前可谓一无所知,对公司的业务完全不了解,但是好在使用ABAP开发报表不是很难,在导师简单介绍基本语法后,基本就可以上手。

T-CODE:se16n 查询透明表

首先先熟悉要使用到的几个表,了解字段

3.报表开发
1>.se38创建程序

类型和状态是自己情况选择.

2>.大致框架

主程序大致框架

首先定义好数据类型, 程序在屏幕的展示情况以及处理函数,建议新建三个子程序.

定义好子程序名,双击可建立.

perform 函数道理类似

REPORT ztest_0902.
INCLUDE ztest_0902_data.       "定义数据类型
INCLUDE ztest_0902_screen.     "定义屏幕
INCLUDE ztest_0902_form.       "函数处理

START-OF-SELECTION.

  PERFORM frm_get_data.        "获取数据

  PERFORM frm_handle_data.     "处理数据

  IF t_result IS NOT INITIAL.  
    PERFORM frm_alv_show.      "不为空,展示报表
  ELSE.
    MESSAGE '没有符合的数据,请重新查询' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
3>. ztest_0902_data
  • 一般先定义输出表结构, 即需要展示的字段都放在一个结构里.

  • 同时定义内表和工作区, 内表是临时的, 不会影响数据库中内容, 内表临时存放数据;

    工作区只能存放一条数据, 般在循环中处理.

  • types自定义结构, 字段可以来自不同的表, 需要什么就声明什么

TABLES: zxdtpo,zxdtko,zxdtfe,zxdtgn.   "需要的表
TYPE-POOLS:slis.                       "类型池,里面有很多的类型

TYPES:BEGIN OF ty_result,             
  xdnum TYPE zxdtpo-xdnum,            "XDNUM  装箱单号
  matnr TYPE zxdtpo-matnr,            "matnr  物料号
  so_no TYPE zxdtko-so_no,            "SO_NO  SO号
  vouch TYPE zxdtko-vouch,            "VOUCH  单证员
  sport TYPE zxdtko-sport,            "sport  起运港
  bezei type tvknt-bezei,             "beizei 起运港中卫描述
  magrv TYPE zxdtko-magrv,            "MAGRV  柜型
  awert TYPE zxdtfe-awert,            "awert  实际金额
  waers TYPE zxdtfe-waers,            "waers  货币币种
  prodh TYPE zprodh_text-prodh,       "prodh  产品层次
  prodh_1 TYPE char200,
  vtext_1 TYPE char300,
  prodh_2 TYPE char200,
  vtext_2 TYPE char300,
  prodh_3 TYPE char200,
  vtext_3 TYPE char300,
  prodh_4 TYPE char200,
  vtext_4 TYPE char300,
END OF ty_result.

DATA:t_result TYPE TABLE OF ty_result.
DATA:w_result TYPE ty_result.

DATA:t_fieldcat TYPE slis_t_fieldcat_alv,
     w_fieldcat TYPE LINE OF slis_t_fieldcat_alv,
     t_layout TYPE slis_layout_alv.

TYPES: BEGIN OF ty_xdnum,
  xdnum TYPE zxdtpo-xdnum,
  matnr TYPE zxdtpo-matnr,
  so_no TYPE zxdtko-so_no,
  vouch TYPE zxdtko-vouch,
  sport TYPE zxdtko-sport,
  magrv TYPE zxdtko-magrv,
  awert TYPE zxdtfe-awert, "AWERT 出口货物平安险
  bezei TYPE tvknt-bezei,
  azdat TYPE zxdtgn-azdat, "AZDAT 实际装柜日期
END OF ty_xdnum.

DATA: t_xdnum TYPE STANDARD TABLE OF ty_xdnum,
      w_xdnum TYPE ty_xdnum.

TYPES: BEGIN OF ty_azdat,
  xdnum TYPE zxdtko-xdnum,
  azdat	TYPE zxdtgn-azdat,
END OF ty_azdat.

DATA: t_azdat TYPE TABLE OF ty_azdat,
      w_azdat TYPE ty_azdat.

TYPES: BEGIN OF ty_awert,
  xdnum TYPE zxdtko-xdnum,
  awert	TYPE zxdtfe-awert,
  waers TYPE zxdtfe-waers,
END OF ty_awert.

DATA:t_awert TYPE STANDARD TABLE OF ty_awert.
DATA:w_awert TYPE ty_awert.

*----装箱单对应所有物料
TYPES: BEGIN OF ty_prdha,
  xdnum TYPE zxdtko-xdnum,
  prdha TYPE mara-prdha,                  "prdha 产品层次
  prodh_1 TYPE zprodh_text-prodh_1,
  vtext_1 TYPE zprodh_text-vtext_1,
  prodh_2 TYPE zprodh_text-prodh_2,
  vtext_2 TYPE zprodh_text-vtext_2,
  prodh_3 TYPE zprodh_text-prodh_3,
  vtext_3 TYPE zprodh_text-vtext_3,
  prodh_4 TYPE zprodh_text-prodh_4,
  vtext_4 TYPE zprodh_text-vtext_4,
END OF ty_prdha.

DATA: t_prdha TYPE TABLE OF ty_prdha.
DATA: w_prdha TYPE ty_prdha.
4>.ztest_0902_screen

定义选择屏幕, 这一步就很简单了

  • 多值查询用SELECT-OPTIONS
  • 单值查询 parameters
SELECTION-SCREEN:BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_xdnum FOR zxdtpo-xdnum OBLIGATORY, "装箱单号  必填
                s_azdat FOR zxdtgn-azdat.            "实际装柜日期
SELECTION-SCREEN:END OF BLOCK a1.
  • 选择屏幕的文本元素

    image-20210902113421186 image-20210902113442213
  • 查询页面

5>.ztest_0902_form
  • 展示ALV, 创建子程序frm_alv_show,

    • frm_init_layout 初试化ALV布局, 可以自动根据数据长度调整列宽

    • frm_set_fieldset 设置ALV字段, 字段名必须大写

      • 里面的frm_init_fieldcat通过using传递参数
    • frm_output_alv 调用 [ REUSE_ALV_GRID_DISPLAY ]输出

      需要填的参数对应填写即可

    image-20210902114329375
*&---------------------------------------------------------------------*
*&      Form  frm_alv_show
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_alv_show .
  PERFORM frm_init_layout.  "
  PERFORM frm_set_fieldset.
  PERFORM frm_output_alv.
ENDFORM.                    "frm_alv_show

*&---------------------------------------------------------------------*
*&      Form  frm_init_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_init_layout .
  t_layout-colwidth_optimize = 'x'.
  t_layout-zebra = 'x'.

ENDFORM.                    "frm_init_layout

*&---------------------------------------------------------------------*
*&      Form  frm_set_fieldset
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_set_fieldset .
  PERFORM frm_init_fieldcat USING 'XDNUM' '装箱单号'.
  PERFORM frm_init_fieldcat USING 'SO_NO' 'SO号'.
  PERFORM frm_init_fieldcat USING 'VOUCH' '单证员'.
*  PERFORM frm_init_fieldcat USING 'SPORT' '起运港'.
  PERFORM frm_init_fieldcat USING 'BEZEI' '起运港名称'.
  PERFORM frm_init_fieldcat USING 'MAGRV' '柜型'.
  PERFORM frm_init_fieldcat USING 'AWERT' '出口货物平安险'.
  PERFORM frm_init_fieldcat USING 'WAERS' '币种'.
  PERFORM frm_init_fieldcat USING 'PRODH_1' '产品层次1编码'.
  PERFORM frm_init_fieldcat USING 'VTEXT_1' '产品层次1名称'.
  PERFORM frm_init_fieldcat USING 'PRODH_2' '产品层次2编码'.
  PERFORM frm_init_fieldcat USING 'VTEXT_2' '产品层次2名称'.
  PERFORM frm_init_fieldcat USING 'PRODH_3' '产品层次3编码'.
  PERFORM frm_init_fieldcat USING 'VTEXT_3' '产品层次3名称'.
  PERFORM frm_init_fieldcat USING 'PRODH_4' '产品层次4编码'.
  PERFORM frm_init_fieldcat USING 'VTEXT_4' '产品层次4名称'.
*  PERFORM frm_init_fieldcat USING 'PRODH' '产品层次'.

ENDFORM.                    "frm_set_fieldset

*&---------------------------------------------------------------------*
*&      Form  frm_init_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0022     text
*      -->P_0023     text
*----------------------------------------------------------------------*
FORM frm_init_fieldcat  USING  p_0022
                                p_0023.
  w_fieldcat-fieldname = p_0022.
  w_fieldcat-seltext_m = p_0023.
  APPEND w_fieldcat TO t_fieldcat.
ENDFORM.                    "frm_init_fieldcat

*&---------------------------------------------------------------------*
*&      Form  frm_output_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_output_alv .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
     i_callback_program                = sy-repid
*     i_callback_pf_status_set          = 'F_STATUS'
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
     is_layout                         = t_layout
     it_fieldcat                       = t_fieldcat
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS                 =
*     IT_SORT                           =
*     IT_FILTER                         =
*     IS_SEL_HIDE                       =
     i_default                         = 'X'
     i_save                            = 'A'
*     IS_VARIANT                        =
*     IT_EVENTS                         =
*     IT_EVENT_EXIT                     =
*     IS_PRINT                          =
*     IS_REPREP_ID                      =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     I_HTML_HEIGHT_TOP                 = 0
*     I_HTML_HEIGHT_END                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK                      =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab                          = t_result  "需要输出的表
   EXCEPTIONS
     program_error                     = 1
     OTHERS                            = 2
            .
  IF sy-subrc <> 0.
*Implement suitable error handling here
  ENDIF.
ENDFORM.                    " FRM_OUTPUT_ALV

*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_get_data .
  SELECT MAX( azdat ) AS azdat     "实际装箱日期
          xdnum
    FROM zxdtgn
    INTO CORRESPONDING FIELDS OF TABLE t_azdat
      WHERE xdnum IN s_xdnum
        GROUP BY xdnum.
  IF sy-subrc = 0.
    SORT t_azdat.
    IF s_azdat IS NOT INITIAL.
      DELETE t_azdat WHERE azdat NOT IN s_azdat.
    ENDIF.
  ENDIF.

  SELECT xdnum  "装箱单号
         so_no
         vouch  "单证员
         sport  "起运港
         magrv  "柜型
    FROM zxdtko
     INTO CORRESPONDING FIELDS OF TABLE t_xdnum
    WHERE xdnum IN s_xdnum.

  DATA:l_index TYPE sy-tabix.
  LOOP AT t_xdnum INTO w_xdnum.
    CLEAR:l_index.
    l_index = sy-tabix.
    READ TABLE t_azdat WITH KEY xdnum = w_xdnum-xdnum TRANSPORTING NO FIELDS.
    IF sy-subrc <> 0.
      DELETE t_xdnum INDEX l_index.
    ENDIF.
  ENDLOOP.

*出口货物平安险
  SELECT  xdnum
          awert   "实际金额
          waers   "货币
    FROM zxdtfe
    INTO CORRESPONDING FIELDS OF TABLE t_awert
    FOR ALL ENTRIES IN t_xdnum
     WHERE xdnum = t_xdnum-xdnum
       AND kscha = 'ZC62'.

*查物料
  LOOP AT t_xdnum INTO w_xdnum.
    SELECT DISTINCT
            b~xdnum
            a~prdha
            prodh_1
            vtext_1
            prodh_2
            vtext_2
            prodh_3
            vtext_3
            prodh_4
            vtext_4
      FROM mara AS a INNER JOIN zxdtpo AS b ON a~matnr = b~matnr
           LEFT JOIN zprodh_text AS c ON a~prdha = c~prodh
      APPENDING CORRESPONDING FIELDS OF TABLE t_prdha
      WHERE b~xdnum = w_xdnum-xdnum.
  ENDLOOP.

ENDFORM.                    "frm_get_data

*&---------------------------------------------------------------------*
*&      Form  frm_handle_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_handle_data .
  CLEAR w_xdnum.
  CLEAR w_azdat.
  LOOP AT t_xdnum INTO w_xdnum.
    w_result-xdnum = w_xdnum-xdnum.
    w_result-so_no = w_xdnum-so_no.
    w_result-vouch = w_xdnum-vouch.
*    w_result-sport = w_xdnum-sport.
    w_result-magrv = w_xdnum-magrv.


    SELECT SINGLE bezei
      FROM tvknt
      INTO w_xdnum-bezei
      WHERE knote = w_xdnum-sport
        AND spras = '1'.

    w_result-bezei = w_xdnum-bezei.

    LOOP AT t_prdha INTO w_prdha WHERE xdnum = w_xdnum-xdnum.
      CONCATENATE
        w_result-prodh_1 w_prdha-prodh_1  INTO w_result-prodh_1 SEPARATED BY '/'.
      CONCATENATE
        w_result-vtext_1 w_prdha-vtext_1  INTO w_result-vtext_1 SEPARATED BY '/'.
      CONCATENATE
        w_result-prodh_2 w_prdha-prodh_2  INTO w_result-prodh_2 SEPARATED BY '/'.
      CONCATENATE
        w_result-vtext_2 w_prdha-vtext_2  INTO w_result-vtext_2 SEPARATED BY '/'.
      CONCATENATE
        w_result-prodh_3 w_prdha-prodh_3  INTO w_result-prodh_3 SEPARATED BY '/'.
      CONCATENATE
        w_result-vtext_3 w_prdha-vtext_3  INTO w_result-vtext_3 SEPARATED BY '/'.
      CONCATENATE
        w_result-prodh_4 w_prdha-prodh_4  INTO w_result-prodh_4 SEPARATED BY '/'.
      CONCATENATE
        w_result-vtext_4 w_prdha-vtext_4  INTO w_result-vtext_4 SEPARATED BY '/'.
    ENDLOOP.

    LOOP AT t_awert INTO w_awert WHERE xdnum = w_xdnum-xdnum.
      w_result-awert = w_awert-awert.
      w_result-waers = w_awert-waers.
      APPEND w_result TO t_result.
      CLEAR:w_result-awert.
    ENDLOOP.

    IF sy-subrc  <> 0.
      APPEND w_result TO t_result.
    ENDIF.

    CLEAR w_result.
  ENDLOOP.

ENDFORM.                    "frm_handle_data
  • 获取数据 frm_get_data
    • INTO CORRESPONDING FIELDS OF TABLE XXX 把查询到的数据存放到内表中
    • IF sy-subrc = 0. 判断执行成功
  • 处理数据 frm_handle_data
    • 使用工作区前清空工作区
    • LOOP AT XXX INTO用来循环内表
    • APPEND w_result TO t_result 把工作区的内容添加到内表.
4.效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值