ZMM_参考物料凭证过账程序(开发笔记)

本文详细介绍了SAP ABAP环境下报表ZMMR102与ZMMR104的开发过程,包括程序类型、描述、包含文件、使用的表格与类型池等。重点解析了ALV输出所需变量的定义,以及程序的初始化、屏幕输出、设置、获取数据、显示等功能模块。同时,展示了如何通过FORM子例程实现数据处理、筛选与展示,并提供了完整的ABAP代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2019-05-27
*& Program Type        :  Report
*& Description         :  参考物料凭证过账
*&---------------------------------------------------------------------*
REPORT ZMMR104.

*&---------------------------------------------------------------------*
*& 包含               YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:TVKO,MARC,EKKO,MSEG,MATDOC.

TYPE-POOLS:SLIS.

"定义ALV输出所需变量
DATAS_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

DATA GOODSMVT_HEADER  LIKE BAPI2017_GM_HEAD_01 .
DATA GOODSMVT_CODE    LIKE BAPI2017_GM_CODE .
DATA GOODSMVT_HEADRET LIKE BAPI2017_GM_HEAD_RET .
DATA MATERIALDOCUMENT LIKE BAPI2017_GM_HEAD_RET-MAT_DOC .
DATA MATDOCUMENTYEAR  LIKE BAPI2017_GM_HEAD_RET-DOC_YEAR .
DATA GOODSMVT_ITEM    LIKE BAPI2017_GM_ITEM_CREATE OCCURS WITH HEADER LINE.
DATA RETURN           LIKE BAPIRET2 OCCURS WITH HEADER LINE.
DATA METY TYPE C .
DATA MATNR TYPE MATNR .
TYPESBEGIN OF GTS_DATA,

         CKBOX TYPE  C,                      "标记字段
         MBLNR TYPE  MATDOC-MBLNR,           "物料凭证编号
         ZEILE TYPE  MATDOC-ZEILE,           "物料凭证中的项目
         MATNR TYPE  MATDOC-MATNR,           "物料编码
         MAKTX TYPE  MAKT-MAKTX,             "物料描述
         WERKS TYPE  MATDOC-WERKS,           "工厂
         MENGE TYPE  MATDOC-MENGE,           "收货数量
         BWART TYPE  MATDOC-BWART,           "移动类型
         RKNGE TYPE  MATDOC-MENGE,           "入库数量
         MEINS TYPE  MATDOC-MEINS,           "单位
         XSINS TYPE  MATDOC-MEINS,           "单位
         CHARG TYPE  MATDOC-CHARG,           "批次
         LGORT TYPE  MATDOC-LGORT,           "入库仓库
         BLDAT TYPE  MATDOC-BLDAT,           "凭证日期
         BUDAT TYPE  MATDOC-BUDAT,           "过账日期

       END OF GTS_DATA.

DATAGT_DATA   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGV_TOP    TYPE SDYDO_TEXT_ELEMENT.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONSS_MBLNR  FOR   MATDOC-MBLNR  MODIF ID C1 OBLIGATORY.             "物料凭证
PARAMETERSP_BLDAT TYPE MATDOC-BLDAT MODIF ID C1 OBLIGATORY,                    "凭证日期
            P_BUDAT TYPE  MATDOC-BUDAT  MODIF ID C1 OBLIGATORY.                  "过账日期
PARAMETERSCH_01 AS CHECKBOX DEFAULT ''.                                        "品检入库
PARAMETERSCH_02 AS CHECKBOX DEFAULT ''.                                        "仝达实业外发物料博罗入库
SELECTION-SCREEN END OF BLOCK B1.
*&---------------------------------------------------------------------*
*& 包含               ZMMR104_CLASS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*       CLASS DEMO DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS DEMO DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      MAIN.
ENDCLASS.

CLASS DEMO IMPLEMENTATION.
  METHOD MAIN.
    DATA(OUT) = CL_DEMO_OUTPUT=>NEW( ).

    OUT->BEGIN_SECTION`报错信息回执`
      )->WRITERETURN[] ).

    OUT->DISPLAY( ).
  ENDMETHOD.
ENDCLASS.

FORM FRM_EXCLUDE_OPTION .

** Define the object to be passed to the RESTRICTION parameter
*DATA RESTRICT TYPE SSCR_RESTRICT.
*
** Auxiliary objects for filling RESTRICT
*DATA : OPTLIST TYPE SSCR_OPT_LIST,
*           ASS TYPE SSCR_ASS.
*
** 限制MATNR参数只能使用‘EQ’ ‘BT’.
*  OPTLIST-NAME = 'OBJECTKEY1'.
*  OPTLIST-OPTIONS-EQ = 'X'.
*  OPTLIST-OPTIONS-BT = 'X'.
*  APPEND OPTLIST TO RESTRICT-OPT_LIST_TAB.
*
*  ASS-KIND = 'S'.
*  ASS-NAME = 'S_MONAT'.
*  ASS-SG_MAIN = 'I'.
*  ASS-SG_ADDY = SPACE.
*  ASS-OP_MAIN = 'OBJECTKEY1'.
*  APPEND ASS TO RESTRICT-ASS_TAB.
*
*  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
*   EXPORTING
*    RESTRICTION                  = RESTRICT
*   EXCEPTIONS
*     TOO_LATE                     = 1
*     REPEATED                     = 2
*     SELOPT_WITHL_OUTPUT_OPTIONSS       = 3
*     SELOPT_WITHOUT_SIGNS         = 4
*     INVALID_SIGN                 = 5
*     EMPTY_OPTION_LIST            = 6
*     INVALID_KIND                 = 7
*     REPEATED_KIND_A              = 8
*     OTHERS                       = 9
*            .
*
*  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 SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SCREEN_OUTPUT .
  LOOP AT SCREEN.
    CASE SCREEN-GROUP1.
      WHEN 'M1'.
        SCREEN-INPUT '0'.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .

  IF CH_01 IS INITIAL AND CH_02 IS INITIAL.
    MESSAGE '请选择功能!TYPE 'E'DISPLAY LIKE 'W' .
  ENDIF.
  IF CH_01 IS NOT INITIAL AND CH_02 IS NOT INITIAL.
    MESSAGE '功能不可多选!TYPE 'E' .
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  DATA GV_ZMATDOCUMENT TYPE ZMATDOCUMENT .
  CLEAR GT_DATA[] .
  IF CH_01 IS NOT INITIAL.
    SELECT INTO CORRESPONDING FIELDS OF TABLE GT_DATA[] FROM MATDOC
      
WHERE MBLNR IN S_MBLNR
        
.
  ELSE .
    SELECT INTO CORRESPONDING FIELDS OF TABLE GT_DATA[] FROM MATDOC
      
WHERE SOBKZ ''
        AND MBLNR IN S_MBLNR
        
.
  ENDIF .

  LOOP AT GT_DATA.
    GT_DATA-BLDAT P_BLDAT.
    GT_DATA-BUDAT P_BUDAT.

    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
      EXPORTING
        INPUT  GT_DATA-MEINS
      
IMPORTING
        OUTPUT GT_DATA-XSINS.
    SELECT SINGLE MAKTX INTO GT_DATA-MAKTX FROM MAKT
      
WHERE MATNR GT_DATA-MATNR
        
AND SPRAS 1
        .

    IF CH_01 IS NOT INITIAL.
      GT_DATA-BWART '321'.
    ELSE .
      GT_DATA-BWART '501'.
      GT_DATA-WERKS '1202'.
      CLEAR GT_DATA-LGORT .
    ENDIF.
    CLEAR GV_ZMATDOCUMENT .
    SELECT SINGLE INTO CORRESPONDING FIELDS OF GV_ZMATDOCUMENT FROM ZMATDOCUMENT
      
WHERE MBLNR  GT_DATA-MBLNR
        
AND ZEILE  GT_DATA-ZEILE
        
.
    IF SY-SUBRC 0.
      DELETE GT_DATA .
    ELSE .
    MODIFY GT_DATA .
    ENDIF.
    CLEAR GT_DATA .
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
  DATA TEXT TYPE LVC_TITLE .
  CLEAR S_LAYOUT.
  S_LAYOUT-ZEBRA 'X'.
  S_LAYOUT-COLWIDTH_OPTIMIZE 'X'.
*  S_LAYOUT-GRID_TITLE = '26'.
*  s_layout-box_fieldname    = 'BOX'.
  PERFORM FRM_FILL_FIELD .
  IF CH_01 IS NOT INITIAL..
    TEXT '品检入库:.
  ELSE .
    TEXT '仝达金属对仝达实业外发物料收货:' .
  ENDIF.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      IS_LAYOUT                S_LAYOUT
      IT_FIELDCAT              
GT_FIELDCAT
      I_CALLBACK_PROGRAM       
SY-REPID
      I_GRID_TITLE             
TEXT
      I_CALLBACK_PF_STATUS_SET 'PF_STATUS_SET'
      I_CALLBACK_USER_COMMAND  'USER_COMMAND'
*     I_CALLBACK_HTML_TOP_OF_PAGE = 'HTML_TOP_OF_PAGE'
*     I_HTML_HEIGHT_TOP        = 5                             "指定ALV表头宽度
    TABLES
      T_OUTTAB                 GT_DATA[].
ENDFORM.

FORM FRM_FILL_FIELD .
  DATA:  WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
  DATA:  F_TEXT TYPE SLIS_FIELDCAT_ALV-SELTEXT_L.
  IF CH_01 IS NOT INITIAL..
    F_TEXT '收货数量.
  ELSE .
    F_TEXT '发货数量.
  ENDIF.
  DEFINE FILL_FIELD.
    wa_fieldcat-fieldname &1.
    wa_fieldcat-seltext_l &2.
*    IF wa_fieldcat-fieldname =  'MSLJH' or wa_fieldcat-fieldname =  'WCBJH'.
*      wa_fieldcat-EMPHASIZE = 'C600'. "设置字段的颜色
*    ENDIF.
*
    IF wa_fieldcat-fieldname =  'CKBOX' .
      wa_fieldcat-CHECKBOX 'X'.
      wa_fieldcat-EDIT 'X'.
    ENDIF.

   IF wa_fieldcat-fieldname =  'LGORT'
       .
      wa_fieldcat-EDIT 'X'.
    ENDIF.
    IF wa_fieldcat-fieldname =  'RKNGE' .
      wa_fieldcat-ref_tabname 'MATDOC'.
      wa_fieldcat-ref_fieldname 'MENGE'.
      wa_fieldcat-EDIT 'X'.
    ENDIF .
*
    IF wa_fieldcat-fieldname 'PLNBEZ' OR wa_fieldcat-fieldname 'MATNR' .
      wa_fieldcat-ref_tabname 'MARA'.
      wa_fieldcat-ref_fieldname 'MATNR'.
    ENDIF.

    IF wa_fieldcat-fieldname 'ARKTX' OR wa_fieldcat-fieldname 'WAKTX' .
      wa_fieldcat-ref_tabname 'VBAP'.
      wa_fieldcat-ref_fieldname 'ARKTX'.
    ENDIF.

    IF wa_fieldcat-fieldname 'AUFNR' .
      wa_fieldcat-ref_tabname 'AUFK'.
      wa_fieldcat-ref_fieldname 'AUFNR'.
    ENDIF.

    APPEND wa_fieldcat TO gt_fieldcat.
    CLEAR wa_fieldcat.
  END-OF-DEFINITION.
  FILL_FIELD :
        'CKBOX'    '选择列',
        'MBLNR'    '物料凭证',
        'ZEILE'    '凭证项目',
        'MATNR'    '物料编码',
        'MAKTX'    '物料描述',
        'WERKS'    '工厂',
        'MENGE'    F_TEXT,
        'BWART'    '移动类型',
        'RKNGE'    '入库数量',
        'XSINS'    '单位',
        'CHARG'    '批次',
        'LGORT'    '入库仓库',
        'BLDAT'    '凭证日期',
        'BUDAT'    '过账日期'.
ENDFORM.

FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.

FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
                    IS_SELFIELD 
TYPE SLIS_SELFIELD.
  DATA:   REF TYPE REF TO CL_GUI_ALV_GRID.
  DATA :  LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性
  RANGESL_WERKS FOR T001W-WERKS.
  RANGESL_MATNR FOR MARA-MATNR.
  DATA:   L_BUKRS TYPE T001K-BUKRS.
  DATA:   NUM     TYPE I  .
  DATA:   TEMP    TYPE I  .
  DATA:   TEMP_Z  TYPE I  .

  LV_STABLE-ROW '1'.
  LV_STABLE-COL '1'.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID REF.
  CALL METHOD REF->CHECK_CHANGED_DATA.

  CASE I_UCOMM.
    WHEN 'CREATE'."创建凭证

      CLEAR METY .
      PERFORM GOODSMVT_CREATE.
      LOOP AT RETURN WHERE TYPE 'E'.
      ENDLOOP.

      IF SY-SUBRC 0.
        DEMO=>MAIN( ).
      ELSEIF METY 'A' .
        MESSAGE MATNR && '物料在工厂1202财务视图MBEW中无记录,请检查!TYPE 'S' DISPLAY LIKE 'E'.
      ELSEIF METY 'B' .
        MESSAGE MATNR && '物料是客供料,价格应为0,请让财务同事修正价格!TYPE 'S' DISPLAY LIKE 'E'.
      ELSEIF METY 'C' .
        IF CH_01 IS NOT INITIAL.
          MESSAGE  '入库数量不能大于收货数量,请检查!TYPE 'S' DISPLAY LIKE 'E'.
        ELSE .
          MESSAGE  '入库数量不能大于发货数量,请检查!TYPE 'S' DISPLAY LIKE 'E'.
        ENDIF.

      ELSE .
        MESSAGE'物料凭证:'&& MATERIALDOCUMENT && '创建成功!' TYPE 'S'.
      ENDIF.

    WHEN 'ALL'.
      LOOP AT GT_DATA.
        GT_DATA-CKBOX 'X' .
        MODIFY GT_DATA .
        CLEAR GT_DATA .
      ENDLOOP.
    WHEN 'SAL'.
      LOOP AT GT_DATA.
        GT_DATA-CKBOX '' .
        MODIFY GT_DATA .
        CLEAR GT_DATA .
      ENDLOOP.
  ENDCASE.
  CALL METHOD REF->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form GOODSMVT_CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM GOODSMVT_CREATE .
  DATA MBEW TYPE MBEW .
  DATA GT_ZMATDOCUMENT TYPE TABLE OF ZMATDOCUMENT WITH HEADER LINE.
  CLEAR GOODSMVT_ITEM[] .
  LOOP AT GT_DATA WHERE CKBOX IS NOT INITIAL .

    IF CH_02 IS NOT INITIAL.
      CLEAR MBEW .
      CLEAR METY .
      CLEAR MATNR .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF MBEW FROM MBEW
        
WHERE BWKEY '1202'
          AND MATNR GT_DATA-MATNR
          
.
      IF SY-SUBRC <> 0.
        METY 'A' .
        MATNR GT_DATA-MATNR .
        EXIT .
      ELSEIF MBEW-STPRS IS INITIAL AND MBEW-VERPR IS INITIAL .
      ELSE .
        METY 'B' .
        MATNR GT_DATA-MATNR .
        EXIT .
      ENDIF.
    ENDIF.

    IF GT_DATA-MENGE < GT_DATA-RKNGE .
      METY 'C' .
    ENDIF.

    GOODSMVT_ITEM-MATERIAL_LONG   GT_DATA-MATNR.  "物料编码
    GOODSMVT_ITEM-PLANT           GT_DATA-WERKS.  "工厂
    GOODSMVT_ITEM-STGE_LOC        GT_DATA-LGORT.  "入库仓库
    GOODSMVT_ITEM-MOVE_TYPE       GT_DATA-BWART.  "移动类型
    GOODSMVT_ITEM-ENTRY_QNT       GT_DATA-RKNGE.  "入库数量
    GOODSMVT_ITEM-ENTRY_UOM       GT_DATA-MEINS.  "单位
    GOODSMVT_ITEM-MOVE_PLANT      GT_DATA-WERKS.  "物料编码
    GOODSMVT_ITEM-BATCH           GT_DATA-CHARG.  "批次

    APPEND GOODSMVT_ITEM .
    CLEAR GOODSMVT_ITEM .
    CLEAR GT_DATA .
  ENDLOOP.

  IF  SY-SUBRC 0.
    IF METY IS INITIAL.
      CLEAR GOODSMVT_HEADER .
      CLEAR GOODSMVT_CODE .
      GOODSMVT_HEADER-PSTNG_DATE P_BUDAT.    "过账日期
      GOODSMVT_HEADER-DOC_DATE   P_BLDAT.    "凭证日期
      GOODSMVT_HEADER-PR_UNAME   SY-UNAME.   "用户名
      IF CH_01 IS NOT INITIAL.
        GOODSMVT_CODE '04' .
      ELSE .
        GOODSMVT_CODE '01' .
      ENDIF.

      CLEAR GOODSMVT_ITEM .
      CLEAR MATERIALDOCUMENT .
      CLEAR MATDOCUMENTYEAR .
      CLEAR RETURN[] .
      CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
        EXPORTING
          GOODSMVT_HEADER  GOODSMVT_HEADER
          GOODSMVT_CODE    
GOODSMVT_CODE
        
IMPORTING
          GOODSMVT_HEADRET GOODSMVT_HEADRET
          MATERIALDOCUMENT 
MATERIALDOCUMENT
          MATDOCUMENTYEAR  
MATDOCUMENTYEAR
        
TABLES
          GOODSMVT_ITEM    GOODSMVT_ITEM
          
RETURN           RETURN.

      LOOP AT RETURN WHERE TYPE 'E'.
      ENDLOOP.

      IF SY-SUBRC .
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT 'X'.

        CLEAR GT_ZMATDOCUMENT[] .
        LOOP AT GT_DATA WHERE CKBOX IS NOT INITIAL.
          GT_ZMATDOCUMENT-MBLNR   GT_DATA-MBLNR .
          GT_ZMATDOCUMENT-ZEILE   GT_DATA-ZEILE .
          GT_ZMATDOCUMENT-MAT_DOC MATERIALDOCUMENT .
          GT_ZMATDOCUMENT-UNAME   SY-UNAME .
          APPEND GT_ZMATDOCUMENT .
          CLEAR GT_ZMATDOCUMENT .
          DELETE GT_DATA .
          CLEAR GT_DATA .
        ENDLOOP.
        MODIFY ZMATDOCUMENT FROM TABLE GT_ZMATDOCUMENT[] .
      ENDIF.

      DELETE RETURN[] WHERE TYPE 'S' .

    ENDIF.

  ELSE .
    MESSAGE '请选择条目!TYPE 'S' DISPLAY LIKE 'W'.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  html_top_of_page
*&---------------------------------------------------------------------*
FORM HTML_TOP_OF_PAGE USING DOCUMENT TYPE REF TO CL_DD_DOCUMENT.

  CALL METHOD DOCUMENT->ADD_TEXT(
      TEXT         'TEXT01'
      SAP_EMPHASIS '往来供应商对帐明细表).

ENDFORM.                    "HTML_TOP_OF_PAGE

INITIALIZATION .
  PERFORM FRM_EXCLUDE_OPTION.

AT SELECTION-SCREEN OUTPUT.
  PERFORM SCREEN_OUTPUT.

AT SELECTION-SCREEN.
  PERFORM SCREEN_SETTING.

START-OF-SELECTION.
  PERFORM FOM_GETDATA .
  PERFORM FRM_DISPLAY.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值