• SAP 生产成本明细报表


    1.背景

    前台事务代码CO03时,进行订单的成本分析,需要开发报表实现批量操作
    在这里插入图片描述
    在这里插入图片描述

    2.实现

    2.1 通过增强获取标准报表数据

    此处无隐式增强,同时通过标准方法无法获取内表数据。故通过memory id 实现。插入代码如下:
    在这里插入图片描述

    2.2 程序处理

    核心代码如下:
    利用函数K_KKB_KKBCS_ORDER_REPORT读取数据
    标准报表的输出字段为结构KKBCS_OUT+结构KKBCS_OUT_KEY中字段的文本(比如HKTYP_TEXT)
    在这里插入图片描述
    全部代码如下:
    &---------------------------------------------------------------------
    *& Report ZFIR028
    &---------------------------------------------------------------------
    &---------------------------------------------------------------------
    *& DEVELOPER < 开 发>:
    *& CREATE ON <创建日期>:
    *& FS NUMBER <FS 编号>:
    *& FUNCTIONAL CONSULTANT<功能顾问>:
    *& DESCRIPTION <FS 中业务需求概述>:
    *&
    &---------------------------------------------------------------------

    •          MODIFICATION LOG<程序修改日志,创建时不要填写>
      
      • 1

    *<版本> <日期> <开发者> <功能顾问> 任务编号 <请求号>
    *VERSION DATE PROGRAMMER CORR. # IL# TRANSPORT

    • 1 YYYY/MM/DD
      *DESCRIPTION<程序逻辑修改 版本1> :

    *DESCRIPTION<程序逻辑修改 版本2> :
    *
    &---------------------------------------------------------------------

    REPORT zfir028
    MESSAGE-ID zfico01
    LINE-COUNT 50 "行 MIN=35
    LINE-SIZE 132 "列 MIN=124
    NO STANDARD PAGE HEADING.

    ----------------------------------------------------------------------

    • <1.1-声明 包含程序> INCLUDE PROGRAMS *
      ----------------------------------------------------------------------
      《所有全局变量、类都写在 DEFINE INCLUDE 程序中》***
      INCLUDE zfir028_define.
      《所有查询条件都写在 SEL INCLUDE 程序中》******
      INCLUDE zfir028_sel.
      《所有逻辑代码都写在 F0 INCLUDE 程序中》*******
      INCLUDE zfir028_f01.

    •         <第二部分---声明 过程:即事件>  PROCESSING                *
      
      • 1

    ----------------------------------------------------------------------

    • <2.1-用于程序的初始化,在显示选择屏前触发,> *
    • INITIAL PROCESS BEFORE THE STANDARD SELECTION SCREEN IS CALLED *
      ----------------------------------------------------------------------
      INITIALIZATION.
      "初始化处理
      PERFORM frm_intial.
      ----------------------------------------------------------------------
    • <2.2-选择屏幕事件> *
    • EVENTS THAT OCCUR WHILE THE SELECTION SCREEN IS BING PROCESSED *
      ----------------------------------------------------------------------
    • 所有选择屏幕数据传送到程序中之后触发的事件
      AT SELECTION-SCREEN.

    *选择屏幕PBO事件,在显示选择屏幕前触发
    AT SELECTION-SCREEN OUTPUT.

    • 当对SELECT-OPTIONS变量有多值输入时
      *AT SELECTION-SCREEN ON END OF S_MATKL.

    • 当选择屏幕的BLOCK向程序传递值时触发{如点击执行,点击多选弹出其它窗口)
      *AT SELECTION-SCREEN ON BLOCK BL01.

    • 按指定字段按F4触发
      *AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_MATNR.

    • 按指定字段按F1触发
      *AT SELECTION-SCREEN ON HELP-REQUEST FOR S_MATKL.

    • 当选择屏幕的RADIOBUTTON GROUP向程序传递值时触发
      *AT SELECTION-SCREEN ON RADIOBUTTON GROUP RG1.

    • 触发了 FUNCTIONS BACK, EXIT, OR CANCEL
      AT SELECTION-SCREEN ON EXIT-COMMAND.

    ----------------------------------------------------------------------

    • <2.3-在选择屏幕被处理后触发的事件,程序默认的开始事件> *
    • EVENT OCCURS AFTER THE SELECTION SCREEN HAS BEEN PROCESSED *
      ----------------------------------------------------------------------
      START-OF-SELECTION.
      "权限检查
      PERFORM frm_authority_check.
      "输入数据合法性检查
      PERFORM frm_validate_check.
      "获取数据
      PERFORM frm_get_data.
      "处理数据
      PERFORM frm_process_data.
      "调用屏幕
      PERFORM frm_call_screen.

    ----------------------------------------------------------------------

    • <2.4-最后被触发的事件> *
    • THE LAST OF THE EVENTS CALLED BY THE RUNTIME ENVIRONMENT TO OCCUR *
      ----------------------------------------------------------------------
      END-OF-SELECTION.
      "展示数据
      PERFORM frm_show_data.
      "保存数据
      PERFORM frm_save_data.
      "清空所有全局变量
      PERFORM frm_clear_global_data.

    &---------------------------------------------------------------------
    *& 包含 ZFIR028_F01
    &---------------------------------------------------------------------
    &---------------------------------------------------------------------

    •          MODIFICATION LOG<程序修改日志,创建时不要填写>
      
      • 1

    *<版本> <日期> <开发者> <功能顾问> 任务编号 <请求号>
    *VERSION DATE PROGRAMMER CORR. # IL# TRANSPORT

    • 1 YYYY/MM/DD
      *DESCRIPTION<程序逻辑修改 版本1> :

    *DESCRIPTION<程序逻辑修改 版本2> :
    *
    &---------------------------------------------------------------------
    &---------------------------------------------------------------------
    *& Form FRM_GET_DATA
    &---------------------------------------------------------------------
    *& 获取数据
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_get_data .
    RANGES:r_status FOR bsvx-sttxt.
    DATA:lt_status TYPE TABLE OF ty_status.
    DATA:lv_line TYPE bsvx-sttxt.
    DATA:lt_cat_lvc TYPE lvc_t_fcat.
    DATA:lr_data TYPE REF TO data.
    DATA:ls_varia TYPE disvariant.
    DATA:lv_matnr TYPE mara-matnr.
    DATA:lv_index TYPE i.
    FIELD-SYMBOLS:<lfs_table> TYPE table.

    CLEAR:gt_out[].

    SELECT aaufnr,aobjnr,auart,gamng,gstri,gltri,
    CAST( ’ ’ AS CHAR( 50 ) ) AS status
    FROM aufk AS a
    INNER JOIN afko AS b ON a~aufnr = b~aufnr
    WHERE werks IN @s_werks
    AND a~aufnr IN @s_aufnr
    AND plnbez IN @s_matnr
    AND auart IN @s_auart
    AND gstrp IN @s_gstrp
    AND gltrp IN @s_gltrp
    INTO TABLE @DATA(lt_aufk).

    "取符合屏幕输入条件的工单状态
    "将系统状态输入条件拆分到内表中
    SPLIT s_stat-low AT ‘/’ INTO TABLE lt_status.
    LOOP AT lt_status INTO DATA(ls_status).
    r_status[] = VALUE #( BASE r_status[] ( sign = ‘I’ option = ‘EQ’ low = ls_status-status ) ).
    ENDLOOP.

    LOOP AT lt_aufk INTO DATA(ls_aufk).

    "取系统状态和用户状态
    CLEAR:lv_line,lt_status[].
    CALL FUNCTION 'STATUS_TEXT_EDIT'
      EXPORTING
        objnr            = ls_aufk-objnr
    
    • 1
    • 2
    • 3
    • 4
    • 5
    •   ONLY_ACTIVE      = 'X'
        spras            = sy-langu
      
      • 1
      • 2
    •   BYPASS_BUFFER    = ' '
      IMPORTING
      
      • 1
      • 2
    •   ANW_STAT_EXISTING       =
      
      • 1
    •   E_STSMA          =
        line             = lv_line
      
      • 1
      • 2
    •   user_line        =
      
      • 1
    •   STONR            =
      EXCEPTIONS
        object_not_found = 1
        OTHERS           = 2.
      
      • 1
      • 2
      • 3
      • 4

      "筛选符合条件的系统状态
      SPLIT lv_line AT space INTO TABLE lt_status.
      LOOP AT lt_status INTO ls_status.
      IF ls_status-status IN r_status[].
      DATA(lv_ok) = ‘X’.
      EXIT.
      ENDIF.
      ENDLOOP.
      IF sy-subrc = 0.
      IF lv_ok IS INITIAL.
      DELETE lt_aufk.
      CONTINUE.
      ENDIF.
      ENDIF.
      CLEAR:lv_ok.

      ls_aufk-status = lv_line.
      MODIFY lt_aufk FROM ls_aufk.

      ENDLOOP.

      IF lt_aufk[] IS INITIAL.
      MESSAGE s001 WITH ‘找不到符合条件的数据’ DISPLAY LIKE ‘E’.
      LEAVE LIST-PROCESSING.
      ENDIF.

      SORT lt_aufk BY aufnr.

      SELECT a~aufnr,SUM( wemng ) AS wemng
      FROM afpo AS a
      INNER JOIN @lt_aufk AS b ON a~aufnr = b~aufnr
      GROUP BY a~aufnr
      INTO TABLE @DATA(lt_afpo).
      SORT lt_afpo BY aufnr.

      "调用标准函数取报表内表数据
      LOOP AT lt_aufk INTO ls_aufk.

      ls_varia-variant = ‘1SAP02’. "成本趋势 布局
      CALL FUNCTION ‘K_KKB_KKBCS_ORDER_REPORT’
      EXPORTING
      i_aufnr = ls_aufk-aufnr

    •   I_CONTAINER      =
      
      • 1
    •   I_TIME_RANGE     =
      
      • 1
    •   I_PIVOT          =
      
      • 1
    •   I_ROLLD          =
      
      • 1
    •   I_POSNR          =
      
      • 1
    •   I_NINCL          =
        i_varia          = ls_varia
      
      • 1
      • 2
    •   I_WIP            =
      
      • 1
    •   I_HEADER         =
      EXCEPTIONS
        object_not_found = 1
        no_data          = 2
        no_authority     = 3
        OTHERS           = 4.
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      AT FIRST.
      "仅仅在第一次调用取fieldcat,原因为取用标准报表字段样式固定,不需要取多次,同时生成动态内表的方法多次调用会ABAP DUMP
      IMPORT fieldcat = lt_cat_lvc[] FROM MEMORY ID ‘ZFI028_FIELDCAT’.
      CALL METHOD cl_alv_table_create=>create_dynamic_table
      EXPORTING
      it_fieldcatalog = lt_cat_lvc
      IMPORTING
      ep_table = lr_data.
      ASSIGN lr_data->* TO <lfs_table>.
      ENDAT.

      IMPORT outtab = <lfs_table> FROM MEMORY ID ‘ZFI028_TABLE’.

      "根据标准报表数据,转换成当前报表字段
      LOOP AT <lfs_table> ASSIGNING FIELD-SYMBOL(<lfs_line>).
      APPEND INITIAL LINE TO gt_out ASSIGNING FIELD-SYMBOL(<lfs_out>).
      <lfs_out>-aufnr = ls_aufk-aufnr.
      <lfs_out>-auart = ls_aufk-auart.
      ASSIGN COMPONENT ‘BEWEG_TEXT’ OF STRUCTURE <lfs_line> TO FIELD-SYMBOL(<lfs_value>).
      IF <lfs_value> IS ASSIGNED.
      <lfs_out>-zfylx = <lfs_value>. "业务类型
      UNASSIGN:<lfs_value>.
      ENDIF.

      ASSIGN COMPONENT 'WERKS' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-werks = <lfs_value>.
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'HERKU' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        SPLIT <lfs_value> AT  '/' INTO DATA(lv_value1) DATA(lv_value2).
        <lfs_out>-matnr = lv_value2.
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'HERKU_TEXT' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-maktx = <lfs_value>.
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      "物料组和物料组描述
      lv_matnr = <lfs_out>-matnr.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          input        = lv_matnr
        IMPORTING
          output       = lv_matnr
        EXCEPTIONS
          length_error = 1
          OTHERS       = 2.
      
      SELECT SINGLE a~matkl,zspec,b~wgbez FROM mara AS a
                                INNER JOIN t023t AS b ON a~matkl = b~matkl AND b~spras = @sy-langu
                                INTO @DATA(ls_mara)
                                WHERE matnr = @lv_matnr.
      IF sy-subrc = 0.
        <lfs_out>-zspec = ls_mara-zspec.
        <lfs_out>-wgbez = ls_mara-wgbez.
      ENDIF.
      CLEAR:ls_mara.
      
      <lfs_out>-status = ls_aufk-status.  "工单状态
      
      <lfs_out>-menge = ls_aufk-gamng.  "总数量
      
      IF line_exists( lt_afpo[ aufnr = ls_aufk-aufnr ] ).
        <lfs_out>-menge_sh = lt_afpo[ aufnr = ls_aufk-aufnr ]-wemng."收货数量
      ENDIF.
      
      ASSIGN COMPONENT 'MEINH' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-meins = <lfs_value>.  "单位
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      <lfs_out>-gstri = ls_aufk-gstri.
      <lfs_out>-gltri = ls_aufk-gltri.
      
      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-matnr1 = <lfs_value>.  "费用编码
        SELECT SINGLE a~matkl,zspec,b~wgbez,c~maktx FROM mara AS a
                        INNER JOIN t023t AS b ON a~matkl = b~matkl AND b~spras = @sy-langu
                        INNER JOIN makt AS c ON a~matnr = c~matnr AND c~spras = @sy-langu
                        INTO @DATA(ls_mara1)
                        WHERE a~matnr = @<lfs_out>-matnr1.
        IF sy-subrc = 0.
          <lfs_out>-maktx1 = ls_mara1-maktx.
          <lfs_out>-wgbez1 = ls_mara1-wgbez.
          <lfs_out>-zspec1 = ls_mara1-zspec.
        ENDIF.
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'KSTAR' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-kstar = <lfs_value>.  "成本要素
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'KSTAR_TEXT' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-kstar_txt = <lfs_value>.  "成本要素描述
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'LSTAR' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-zylx = <lfs_value>.  "作业类型
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'PLANMENG_G' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-menge_jh = <lfs_value>.  "计划数量
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'PLANKOST_G' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-dmbtr_jh = <lfs_value>.  "计划金额
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'ISTMENG_G' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-menge_sj = <lfs_value>. "实际数量
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'ISTKOST_G' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-dmbtr_sj = <lfs_value>. "实际金额
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'SOLLMENG_G' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-menge_mb = <lfs_value>.  "目标数量(标准成本)
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      ASSIGN COMPONENT 'SOLLKOST_G' OF STRUCTURE <lfs_line> TO <lfs_value>.
      IF <lfs_value> IS ASSIGNED.
        <lfs_out>-dmbtr_mb = <lfs_value>. "目标金额(标准成本)
        UNASSIGN:<lfs_value>.
      ENDIF.
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126

    *PRICE_JHCB 计划成本单价 =计划金额/计划数量
    IF <lfs_out>-menge_jh <> 0.
    <lfs_out>-price_jhcb = <lfs_out>-dmbtr_jh / <lfs_out>-menge_jh.
    ENDIF.

    *PRICE_SJCB 实际成本单价
    IF <lfs_out>-menge_sj <> 0.
    <lfs_out>-price_sjcb = <lfs_out>-dmbtr_sj / <lfs_out>-menge_sj.
    ENDIF.
    *PRICE_MBCB 目标成本单价
    IF <lfs_out>-menge_mb <> 0.
    <lfs_out>-price_sjcb = <lfs_out>-dmbtr_mb / <lfs_out>-menge_mb.
    ENDIF.

    *MENGE_CY 计划与实际数量差异
    <lfs_out>-menge_cy = <lfs_out>-menge_jh - <lfs_out>-menge_sj.

    *RATE_CY 计划与实际数量差异%
    IF <lfs_out>-menge_sj <> 0.
    <lfs_out>-rate_cy = <lfs_out>-menge_cy / <lfs_out>-menge_sj * 100.
    ENDIF.

    *DMBTR_CY 计划与实际金额差异
    <lfs_out>-dmbtr_cy = <lfs_out>-dmbtr_jh - <lfs_out>-dmbtr_sj.

    *DMBTR_RATE_CY 计划与实际金额差异%
    IF <lfs_out>-dmbtr_sj <> 0.
    <lfs_out>-dmbtr_rate_cy = <lfs_out>-dmbtr_cy / <lfs_out>-dmbtr_sj * 100…
    ENDIF.

    *MENGE1_CY 目标与实际数量差异
    <lfs_out>-menge1_cy = <lfs_out>-menge_mb - <lfs_out>-menge_sj.

    *RATE1_CY 目标与实际数量差异%
    IF <lfs_out>-menge_sj <> 0.
    <lfs_out>-rate1_cy = <lfs_out>-menge1_cy / <lfs_out>-menge_sj * 100…
    ENDIF.

    *DMBTR1_CY 目标与实际金额差异
    <lfs_out>-dmbtr1_cy = <lfs_out>-dmbtr_mb - <lfs_out>-dmbtr_sj.

    *DMBTR1_RATE_CY 目标与实际金额差异%
    IF <lfs_out>-dmbtr_sj <> 0.
    <lfs_out>-dmbtr1_rate_cy = <lfs_out>-dmbtr1_cy / <lfs_out>-dmbtr_sj * 100…
    ENDIF.

    ENDLOOP.
    
    FREE MEMORY ID 'ZFI028_FIELDCAT'.
    FREE MEMORY ID 'ZFI028_TABLE'.
    IF <lfs_table> IS ASSIGNED.
      CLEAR:<lfs_table>.
    ENDIF.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ENDLOOP.

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_PROCESS_DATA
    &---------------------------------------------------------------------
    *& 处理数据
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_process_data .

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_AUTHORITY_CHECK
    &---------------------------------------------------------------------
    *& 权限检查
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_authority_check .

    ENDFORM.
    &---------------------------------------------------------------------
    *& FORM FRM_VALIDATE_CHECK
    &---------------------------------------------------------------------
    *& 数据合法性检查
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_validate_check .

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_SHOW_DATA
    &---------------------------------------------------------------------
    *& 展示数据
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_show_data .

    gs_layout-zebra = ‘X’ .
    gs_layout-cwidth_opt = ‘X’.
    CLEAR gt_fieldcat[].

    PERFORM frm_generate_field_catalogu.

    CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’
    EXPORTING
    i_callback_program = sy-repid
    i_bypassing_buffer = ‘X’
    i_save = ‘A’
    is_layout_lvc = gs_layout

    • i_callback_pf_status_set = 'FRM_SET_PF'
      
      • 1
    • i_callback_user_command  = 'FRM_USER_COM'
      it_fieldcat_lvc    = gt_fieldcat[]
      i_default          = 'X'
      
      • 1
      • 2
      • 3
      TABLES
      t_outtab = gt_out[]
      EXCEPTIONS
      program_error = 1.
      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_SAVE_DATA
    &---------------------------------------------------------------------
    *& 保存数据
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_save_data .

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_CLEAR_GLOBAL_DATA
    &---------------------------------------------------------------------
    *& 清空所有全局变量
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_clear_global_data .

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_CALL_SCREEN
    &---------------------------------------------------------------------
    *& 调用屏幕
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_call_screen .

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_INTIAL
    &---------------------------------------------------------------------
    *& 初始化处理
    &---------------------------------------------------------------------
    *& --> p1 text
    *& <-- p2 text
    &---------------------------------------------------------------------
    FORM frm_intial .

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_GENERATE_FIELD_CATALOGU
    &---------------------------------------------------------------------

    •   text
      
      • 1

    ----------------------------------------------------------------------

    • –> p1 text
    • <-- p2 text
      ----------------------------------------------------------------------
      FORM frm_generate_field_catalogu.

    PERFORM frm_get_fieldcat TABLES gt_fieldcat USING ‘ZSFI028’.

    LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<lfs_fieldcat>).

    IF <lfs_fieldcat>-fieldname = 'MAKTX'.
      <lfs_fieldcat>-coltext = '产品描述'.
    ENDIF.
    
    IF <lfs_fieldcat>-fieldname = 'MENGE'.
      <lfs_fieldcat>-coltext = '总数量'.
    ENDIF.
    
    IF <lfs_fieldcat>-fieldname = 'MENGE_SH'.
      <lfs_fieldcat>-coltext = '已交货数量'.
    ENDIF.
    
    IF <lfs_fieldcat>-fieldname = 'MATNR1'.
      <lfs_fieldcat>-coltext = '费用编码'.
    ENDIF.
    
    IF <lfs_fieldcat>-fieldname = 'MAKTX1'.
      <lfs_fieldcat>-coltext = '费用描述'.
    ENDIF.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ENDLOOP.

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form FRM_GET_FIELDCAT
    &---------------------------------------------------------------------

    •   text
      
      • 1

    ----------------------------------------------------------------------

    • –> p1 text
    • <-- p2 text
      ----------------------------------------------------------------------
      FORM frm_get_fieldcat TABLES ft_fieldcat_out USING fu_name.
      DATA:lt_fieldcat TYPE slis_t_fieldcat_alv.
      DATA:ls_fieldcat_out TYPE lvc_s_fcat.

    CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE’
    EXPORTING

    • I_PROGRAM_NAME         =
      
      • 1
    • I_INTERNAL_TABNAME     =
      i_structure_name       = fu_name
      
      • 1
      • 2
    • I_CLIENT_NEVER_DISPLAY = 'X'
      
      • 1
    • I_INCLNAME             =
      
      • 1
    • I_BYPASSING_BUFFER     =
      
      • 1
    • I_BUFFER_ACTIVE        =
      
      • 1

      CHANGING
      ct_fieldcat = lt_fieldcat[]
      EXCEPTIONS
      inconsistent_interface = 1
      program_error = 2
      OTHERS = 3.
      IF sy-subrc <> 0.

    • Implement suitable error handling here
      ENDIF.

      LOOP AT lt_fieldcat[] INTO DATA(ls_fieldcat).
      MOVE-CORRESPONDING ls_fieldcat TO ls_fieldcat_out.
      ls_fieldcat_out-coltext = ls_fieldcat-seltext_l.
      ls_fieldcat_out-ref_field = ls_fieldcat-fieldname.
      ls_fieldcat_out-ref_table = ls_fieldcat-ref_tabname.
      APPEND ls_fieldcat_out TO ft_fieldcat_out.
      ENDLOOP.

    ENDFORM.
    &---------------------------------------------------------------------
    *& Form frm_alv_field
    &---------------------------------------------------------------------

    •   text
      
      • 1

    ----------------------------------------------------------------------

    • –> p1 text
    • <-- p2 text
      ----------------------------------------------------------------------
      FORM frm_alv_field USING my_fieldcat TYPE lvc_t_fcat
      VALUE(p_reftable)
      VALUE(p_tabname)
      VALUE(p_reffield)
      VALUE(p_fieldname)
      VALUE(p_stext)
      VALUE(p_ltext)
      VALUE(p_zero)
      VALUE(p_outlenid)
      VALUE(p_outlen)
      VALUE(p_pos)
      VALUE(p_chk)
      VALUE(p_edit)
      VALUE(p_fixed).

    gs_fieldcat-col_pos = p_pos.
    gs_fieldcat-ref_table = p_reftable.
    gs_fieldcat-tabname = p_tabname.
    gs_fieldcat-ref_field = p_reffield.
    gs_fieldcat-fieldname = p_fieldname.
    gs_fieldcat-seltext = p_stext.
    gs_fieldcat-seltext = p_ltext.
    gs_fieldcat-seltext = p_ltext.
    gs_fieldcat-reptext = p_stext.
    gs_fieldcat-no_zero = p_zero .
    gs_fieldcat-checkbox = p_chk.
    gs_fieldcat-edit = p_edit.
    gs_fieldcat-fix_column = p_fixed.
    IF p_outlenid = ‘X’ .
    gs_fieldcat-outputlen = p_outlen.
    ENDIF.
    APPEND gs_fieldcat TO my_fieldcat.
    CLEAR gs_fieldcat.
    ENDFORM. " frm_alv_field_COLUMN

    &---------------------------------------------------------------------
    *& 包含 ZFIR028_DEFINE
    &---------------------------------------------------------------------
    &---------------------------------------------------------------------

    •          MODIFICATION LOG<程序修改日志,创建时不要填写>
      
      • 1

    *<版本> <日期> <开发者> <功能顾问> 任务编号 <请求号>
    *VERSION DATE PROGRAMMER CORR. # IL# TRANSPORT

    • 1 YYYY/MM/DD
      *DESCRIPTION<程序逻辑修改 版本1> :

    *DESCRIPTION<程序逻辑修改 版本2> :
    *
    &---------------------------------------------------------------------


    •        <第一部分---声明程序变量和类>  DECLARATION                 *
      
      • 1

    ----------------------------------------------------------------------

    • <1.1-声明常数> CONSTANTS DECLARATION *
      ----------------------------------------------------------------------
      TYPE-POOLS:slis,icon.
      ----------------------------------------------------------------------
    • <1.2-声明用户自定义数据类型> LOCAL DATA TYPES IN PROGRAM *
      ----------------------------------------------------------------------
      TYPES:BEGIN OF ty_status,
      status TYPE char20,
      END OF ty_status.
      ----------------------------------------------------------------------
    • <1.3-声明内表、工作区> GLOBAL INTERNAL TABLES 、WORK AREA DECLARATION *
      ----------------------------------------------------------------------
      DATA:gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat LIKE LINE OF gt_fieldcat,
      gs_layout TYPE lvc_s_layo.

    DATA:gt_out TYPE TABLE OF zsfi028.

    ----------------------------------------------------------------------

    • <1.4-声明全局变量> GLOBAL VARIANTS DECLARATION *
      ----------------------------------------------------------------------

    ----------------------------------------------------------------------

    • <1.5-声明字段符号> FIELD-SYMBOLS DECLARATION *
      ----------------------------------------------------------------------

    ----------------------------------------------------------------------

    • <1.6-声明控件 OO对象> ALV TABLECONTRL *
      ----------------------------------------------------------------------
      DATA:
      gcl_alvgrid TYPE REF TO cl_gui_alv_grid,
      gcl_container TYPE REF TO cl_gui_container,
      gcl_splitter TYPE REF TO cl_gui_splitter_container.

    ----------------------------------------------------------------------

    • <1.7-类定义> *
      ----------------------------------------------------------------------
      &---------------------------------------------------------------------
      *& LCL_CLASS1 *
      &---------------------------------------------------------------------
      *& 类功能说明
      &---------------------------------------------------------------------

    ----------------------------------------------------------------------

    • <1.8-类实现> *
      ----------------------------------------------------------------------

    &---------------------------------------------------------------------
    *& 包含 ZFIR028_SEL
    &---------------------------------------------------------------------
    &---------------------------------------------------------------------

    •          MODIFICATION LOG<程序修改日志,创建时不要填写>
      
      • 1

    *<版本> <日期> <开发者> <功能顾问> 任务编号 <请求号>
    *VERSION DATE PROGRAMMER CORR. # IL# TRANSPORT

    • 1 YYYY/MM/DD
      *DESCRIPTION<程序逻辑修改 版本1> :

    *DESCRIPTION<程序逻辑修改 版本2> :
    *
    &---------------------------------------------------------------------
    ----------------------------------------------------------------------

    • <1-声明表工作区> TABLE_WORK_AREAS DECLARATION*
      ----------------------------------------------------------------------
      TABLES:aufk,caufvd,afko.

    *----------------------------------------------------------------------
    ** <2-声明选择屏幕> SELECTION SCREEN *
    ----------------------------------------------------------------------

    "<定义选择屏幕的编号和标题文字>
    SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-001.
    SELECT-OPTIONS:s_werks FOR aufk-werks OBLIGATORY,
    s_aufnr FOR aufk-aufnr OBLIGATORY,
    s_matnr FOR afko-plnbez,
    s_auart FOR aufk-auart,
    s_gstrp FOR afko-gstrp,
    s_gltrp FOR afko-gltrp,
    s_stat FOR caufvd-ktext NO INTERVALS NO-EXTENSION.
    SELECTION-SCREEN END OF BLOCK bl01.

    ALV结构如下:
    Table: ZSFI028
    Description: 生产成本明细表-ALV结构
    Row Field name Position Key Data element Domain Datatype Length Lowercase Domain text
    1 AUART 1 AUFART AUFART CHAR 4 订单类型
    2 AUFNR 2 AUFNR AUFNR CHAR 12 订单编号
    3 ZFYLX 3 ZE_ZFYLX TEXT30 CHAR 30 X 费用类型
    4 WERKS 4 WERKS_D WERKS CHAR 4 工厂
    5 MATNR 5 ZE_MATNR TEXT60 CHAR 60 X 产品编码
    6 MAKTX 6 MAKTX TEXT40 CHAR 40 X 物料描述
    7 WGBEZ 7 WGBEZ TEXT20 CHAR 20 X 物料组描述
    8 ZSPEC 8 ZE_ZSPEC ZD_ZSPEC CHAR 120 规格型号
    9 STATUS 9 ZE_SYSTEM_STATUS TEXT100 CHAR 100 X 工单的系统状态
    10 MENGE 10 MENGE_D MENG13 QUAN 13 数量
    11 MENGE_SH 11 MENGE_D MENG13 QUAN 13 数量
    12 MEINS 12 MEINS MEINS UNIT 3 X 基本计量单位
    13 GSTRI 13 CO_GSTRI DATUM DATS 8 实际开始日期
    14 GLTRI 14 CO_GLTRI DATUM DATS 8 实际结束日期
    15 MATNR1 15 MATNR MATNR CHAR 40 物料编号
    16 MAKTX1 16 MAKTX TEXT40 CHAR 40 X 物料描述
    17 WGBEZ1 17 WGBEZ TEXT20 CHAR 20 X 物料组描述
    18 ZSPEC1 18 ZE_ZSPEC ZD_ZSPEC CHAR 120 规格型号
    19 KSTAR 19 KSTAR KSTAR CHAR 10 成本要素
    20 KSTAR_TXT 20 ZE_KSTAR_TXT TEXT80 CHAR 80 X 成本要素描述
    21 ZYLX 21 ZE_ZYLX TXT20 CHAR 20 X 作业类型
    22 MENGE_JH 22 ZE_MENGE_JH MENGE QUAN 13 计划数量
    23 DMBTR_JH 23 ZE_DMBTR_JH AFLE13D2O16N_TO_23D2O30N CURR 23 计划金额
    24 MENGE_SJ 24 ZE_MENGE_SJ MENGE QUAN 13 实际数量
    25 DMBTR_SJ 25 ZE_DMBTR_SJ AFLE13D2O16N_TO_23D2O30N CURR 23 实际金额
    26 MENGE_MB 26 ZE_MENGE_MB MENGE QUAN 13 目标数量(标准成本)
    27 DMBTR_MB 27 ZE_DMBTR_MB AFLE13D2O16N_TO_23D2O30N CURR 23 目标金额(标准成本)
    28 PRICE_JHCB 28 ZE_PRICE_JHCB AFLE13D2O16N_TO_23D2O30N CURR 23 计划成本单价
    29 PRICE_SJCB 29 ZE_PRICE_SJCB AFLE13D2O16N_TO_23D2O30N CURR 23 实际成本单价
    30 PRICE_MBCB 30 ZE_PRICE_MBCB AFLE13D2O16N_TO_23D2O30N CURR 23 目标成本单价
    31 MENGE_CY 31 ZE_MENGE_CY MENGE QUAN 13 计划与实际数量差异
    32 RATE_CY 32 ZE_RATE_CY KKB_PROZABW DEC 15 计划与实际数量差异%
    33 DMBTR_CY 33 ZE_DMBTR_CY AFLE13D2O16N_TO_23D2O30N CURR 23 计划与实际金额差异
    34 DMBTR_RATE_CY 34 ZE_RATE1_CY1 KKB_PROZABW DEC 15 计划与实际金额差异%
    35 MENGE1_CY 35 ZE_MENGE1_CY MENGE QUAN 13 目标与实际数量差异
    36 RATE1_CY 36 ZE_RATE2_CY KKB_PROZABW DEC 15 目标与实际数量差异%
    37 DMBTR1_CY 37 ZE_DMBTR1_CY AFLE13D2O16N_TO_23D2O30N CURR 23 目标与实际金额差异
    38 DMBTR1_RATE_CY 38 ZE_DMBTR1_RATE_CY KKB_PROZABW DEC 15 目标与实际金额差异%
    .

  • 相关阅读:
    vue项目中实际封装DateRangePicker组件使用
    【华为机试真题 JAVA】最长连续子序列-100
    LabVIEW如何获取波形图上游标所在位置的数值
    计算机毕业设计 | springboot养老院管理系统 老人社区管理(附源码)
    redis深度历险 千帆竞发 —— 分布式锁
    【无标题】
    vite+vue-router4.x配置动态路由
    OpenGL教程(四)
    如何通过JoinQuant实现一个最简单的策略?
    博客园商业化之路-商业模式:帮助开发者用代码改变口袋
  • 原文地址:https://blog.csdn.net/HAND_YS/article/details/125533655