*&---------------------------------------------------------------------*
*& 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输出所需变量
DATA: S_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 0 WITH HEADER LINE.
DATA RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA METY TYPE C .
DATA MATNR TYPE MATNR .
TYPES: BEGIN 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.
DATA: GT_DATA TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GV_TOP TYPE SDYDO_TEXT_ELEMENT.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONS: S_MBLNR FOR MATDOC-MBLNR MODIF ID C1 OBLIGATORY. "物料凭证
PARAMETERS: P_BLDAT TYPE MATDOC-BLDAT MODIF ID C1 OBLIGATORY, "凭证日期
P_BUDAT TYPE MATDOC-BUDAT MODIF ID C1 OBLIGATORY. "过账日期
PARAMETERS: CH_01 AS CHECKBOX DEFAULT ''. "品检入库
PARAMETERS: CH_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( `报错信息回执`
)->WRITE( RETURN[] ).
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. "刷新稳定性
RANGES: L_WERKS FOR T001W-WERKS.
RANGES: L_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 = 0 .
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.
ZMM_参考物料凭证过账程序(开发笔记)
最新推荐文章于 2024-02-03 00:45:00 发布