SAP采购申请ME51n,ME52n,ME53n屏幕增强
使用增强:MEREQ001 购买申请中的客户自有数据
1、如果需要向PR中加入自定义字段,事务码se11,打开透明表EBAN,双击include:CI_EBANDB,创建结构CI_EBANDB,维护自定义的字段。
2、事务码CMOD create project:ZMMpr001,在Enhancement assignment中添加增强MEREQ001,保存。
3、事务码smod:MEREQ001,打开如下图,
有三个function module,还有screen area,可知screen :0111便是预留的屏幕,可以在其函数组中创建screen 0111,然后在其上画一些需要的字段栏位就ok了。
双击其中一个function module,然后点击display object list按钮,显示如下图
在函数组XM02中create screen 0111,然后在其上画一些需要的字段栏位,注意0111设置为subscreen。
激活,CMOD中激活ZMMpr001,此时在事务码ME51n中就能看到多了一个客户数据tab页,相应me52n,me53n等也有。
到此为止,屏幕做好了,但是要在屏幕栏位上输入数据并能保存到透明表,及显示的时候能从透明表读出到屏幕栏位,就需要在上述三个function module中写代码。
4、在函数组XM02中,有include:ZXM02TOP,目前是空的,create it,添加代码:
data : gv_trtyp type aktvt.
DATA: FL_INPUT TYPE FLAG.
激活EXIT_SAPLMEREQ_001中的include添加如下代码:
TABLES : ci_ebandb.
DATA : i_mereq_item TYPE mereq_item.
CALL METHOD im_req_item->get_activity
RECEIVING
re_aktvt = gv_trtyp.
CASE gv_trtyp.
WHEN 'A'.
fl_input = space. "Output only
WHEN 'V'.
fl_input = 'X'. "Input/Output
ENDCASE.
IF im_req_item IS INITIAL.
CLEAR: ci_ebandb.
ELSE.
i_mereq_item = im_req_item->get_data( ).
MOVE-CORRESPONDING i_mereq_item TO ci_ebandb.
ENDIF.
激活EXIT_SAPLMEREQ_003中的include,添加下面代码:
DATA : i_mereq_item TYPE mereq_item.
IF NOT im_req_item IS INITIAL.
i_mereq_item = im_req_item->get_data( ).
MOVE-CORRESPONDING ci_ebandb TO i_mereq_item .
CALL METHOD im_req_item->set_data( i_mereq_item ).
ex_changed = 'X'.
ENDIF.
最后对上述建立的subscreen 0111添加PBO,如下代码:
*----------------------------------------------------------------------*
***INCLUDE ZXM02O01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0111 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0111 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
CHECK fl_input IS INITIAL.
LOOP AT SCREEN.
screen-input = 0.
MODIFY SCREEN.
ENDLOOP.
ENDMODULE. " STATUS_0111 OUTPUT
OK,到此为止,ME51n等的屏幕增强就完成了,屏幕0111上栏位可以保存到eban中,修改,显示等。这是比较简单的逻辑,如果有其他复杂的要求,可以对上述代码大做文章。
采购申请增强CODE:SMOD.CMOD
增强:MEREQ001
从SE11进入EBAN
双击CI_EBANDB
全局定义
*&---------------------------------------------------------------------* *& 包括 ZXM02TOP *
*&---------------------------------------------------------------------* DATA : I_EBKN TYPE MEREQ_ITEM.
DATA : GV_TRTYP TYPE AKTVT.
DATA: FL_INPUT TYPE FLAG.
DATA LT_EXKN TYPE EXKN.
DATA L_EXKN TYPE EXKN.
DATA : I_MEREQ_ITEM TYPE MEREQ_ITEM.
TABLES:ZCJ30.
DATA:TAB_G_EBKN LIKE STANDARD TABLE OF EBKN WITH HEADER LINE.
DATA:TAB_G_EBAN LIKE STANDARD TABLE OF EBAN WITH HEADER LINE.
DATA:TAB_G_EBKNNEW LIKE STANDARD TABLE OF EBKN WITH HEADER LINE. DATA:TAB_G_EBANNEW LIKE STANDARD TABLE OF EBAN WITH HEADER LINE. DATA:G_BADAT TYPE EXKN-AEDAT.
*WBS状态控制用
DATA: JSTAT LIKE STANDARD TABLE OF JSTAT WITH HEADER LINE.
DATA: G_OBJNR LIKE PRPS-OBJNR.
读取数据:EXIT_SAPLMEREQ_001.” INCLUDE ZXM02U01 .
*&---------------------------------------------------------------------* *& 包括 ZXM02U01 * *&---------------------------------------------------------------------* TABLES : CI_EBANDB.
DATA : I_MEREQ_ITEM TYPE MEREQ_ITEM.
DATA LT_ITEMS TYPE MMPUR_ACCOUNTING_LIST.
DATA WA_ITEMS LIKE LINE OF LT_ITEMS.
*获取输入输出状态
CALL METHOD IM_REQ_ITEM->GET_ACTIVITY
RECEIVING
RE_AKTVT = GV_TRTYP.
CASE GV_TRTYP.
WHEN 'A'.
FL_INPUT = SPACE. "Output only
WHEN 'V'.
FL_INPUT = 'X'. "Input/Output
WHEN 'H'.
IF SY-TCODE = 'ME51N'.
FL_INPUT = 'X'. "Input/Output
ENDIF.
ENDCASE.
IF IM_REQ_ITEM IS INITIAL.
CLEAR: CI_EBANDB.
ELSE.
*取出AFCE号
I_MEREQ_ITEM = IM_REQ_ITEM->GET_DATA( ).
MOVE-CORRESPONDING I_MEREQ_ITEM TO CI_EBANDB.
MOVE I_MEREQ_ITEM TO I_EBKN.
*取出WBS
LT_ITEMS = IM_REQ_ITEM->IF_ACCT_CONTAINER_MM~GET_ITEMS( ).
LOOP AT LT_ITEMS INTO WA_ITEMS.
LT_EXKN = WA_ITEMS-MODEL->GET_EXKN( ).
ENDLOOP.
ENDIF.
* IF SY-UNAME ='CHENHONGJIAO'.
* BREAK-POINT.
* DATA: LCL_REF_HEADER TYPE REF TO IF_PURCHASE_REQUISITION.
* DATA: L_MEREQ_HEADER TYPE MEREQ_HEADER.
* DATA: LCL_RELEASE_STRATEGY_MM TYPE REF TO IF_RELEASE_STRATEGY_MM. * DATA: LCL_RELEASE_STATE_MM TYPE REF TO IF_RELEASE_STATE_MM.
*取抬头数据
* LCL_REF_HEADER = IM_REQ_ITEM->GET_REQUISITION( ).
* L_MEREQ_HEADER = LCL_REF_HEADER->GET_DATA( ).
*
* CALL METHOD IM_REQ_ITEM->IF_RELEASABLE_MM~GET_DATA
* IMPORTING
* EX_STRATEGY = LCL_RELEASE_STRATEGY_MM
* EX_STATE = LCL_RELEASE_STATE_MM.
* ENDIF.
存取数据:EXIT_SAPLMEREQ_003.” INCLUDE ZXM02U03 .
*&---------------------------------------------------------------------* *& 包括 ZXM02U03 * *&---------------------------------------------------------------------* DATA : I_MEREQ_ITEM TYPE MEREQ_ITEM.
*保存AFCE数据
IF NOT IM_REQ_ITEM IS INITIAL.
I_MEREQ_ITEM = IM_REQ_ITEM->GET_DATA( ).
MOVE-CORRESPONDING CI_EBANDB TO I_MEREQ_ITEM .
CALL METHOD IM_REQ_ITEM->SET_DATA( I_MEREQ_ITEM ).
EX_CHANGED = 'X'.
ENDIF.
增强屏幕: SAPLXM02 0111
INCLUDE ZXM02ZZZ. " Subprograms and Modules
DATA:G_PSPID LIKE PROJ-PSPID,
G_PSPNR LIKE PRPS-PSPNR,
G_BUKRS LIKE T001-BUKRS,
ZAFCEDESCR LIKE ZCJ30-AFCEDESCR,"AFCE说明
ZZAMOUNT(20),
G_ZZAMOUNT LIKE ZCJ30-ZAMOUNT. "人民币金额
DATA: BEGIN OF TAB_G_ZZAFCEID OCCURS 0,
AFCEID LIKE ZCJ30-AFCEID, "存货号
END OF TAB_G_ZZAFCEID.
*--下拉列表定义
TYPE-POOLS VRM.
DATA:FNAME TYPE VRM_ID,
VVA TYPE VRM_VALUES,
LVVA LIKE LINE OF VVA.
DATA:L_T TYPE I.
*&---------------------------------------------------------------------* *& Module STATUS_0111 OUTPUT
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* MODULE STATUS_0111 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
*判断是否输出AFCE
*只有类型为Q,P/D,A三种类型时才输入AFCE号.
IF ( I_EBKN-KNTTP = 'Q' AND I_EBKN-PSTYP = '0' )
OR ( I_EBKN-KNTTP = 'P' AND I_EBKN-PSTYP = '9' )
OR ( I_EBKN-KNTTP = 'A' AND I_EBKN-PSTYP = '0' AND LT_EXKN-PS_PSP_PNR <> '00000000' )."
IF FL_INPUT IS INITIAL.
LOOP AT SCREEN.
SCREEN-INPUT = 0.
MODIFY SCREEN.
ENDLOOP.
PERFORM AFCE_DATA."AFCE帮助
ELSE.
*当数据删除时AFCE号不输入状态
IF I_EBKN-LOEKZ = 'X'.
LOOP AT SCREEN.
SCREEN-INPUT = 0.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
PERFORM AFCE_DATA."AFCE帮助
ENDIF.
ELSE.
LOOP AT SCREEN.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE. " STATUS_0111 OUTPUT
*&---------------------------------------------------------------------* *& Form AFCE_DATA
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* * --> p1 text
* <-- p2 text
*----------------------------------------------------------------------* FORM AFCE_DATA .
CLEAR:G_PSPID,G_PSPNR,TAB_G_ZZAFCEID,TAB_G_ZZAFCEID[],VVA,VVA[],
ZZAMOUNT,G_ZZAMOUNT,ZAFCEDESCR.
G_PSPNR = LT_EXKN-PS_PSP_PNR.
* 根据WBS查找项目
SELECT SINGLE PROJ~PSPID
INTO G_PSPID
FROM PROJ
INNER JOIN PRPS ON PRPS~PSPHI = PROJ~PSPNR
WHERE PRPS~PSPNR = G_PSPNR.
*根据分配预算项目表取出AFCE号
SELECT AFCEID
FROM ZCJ30
INTO CORRESPONDING FIELDS OF TABLE TAB_G_ZZAFCEID WHERE PSPID = G_PSPID
AND AFCEID <> ''.
L_T = 0.
LOOP AT TAB_G_ZZAFCEID.
L_T = L_T + 1.
FNAME = 'CI_EBANDB-ZZAFCEID'.
LVVA-KEY = L_T.
LVVA-KEY = TAB_G_ZZAFCEID-AFCEID.
APPEND LVVA TO VVA.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
ID = FNAME
VALUES = VVA.
*公司
IF I_EBKN-ZZAFCEID IS NOT INITIAL.
CLEAR:G_BUKRS.
IF G_PSPID+4(2) = '00'.
G_BUKRS = G_PSPID+2(2).
ELSE.
G_BUKRS = G_PSPID+2(4).
ENDIF.
*根据AFCE号取出描述,金额
SELECT SINGLE ZAMOUNT DESCR
FROM ZTAFCE
INTO (G_ZZAMOUNT,ZAFCEDESCR)
WHERE COMID = G_BUKRS
AND AFCEID = I_EBKN-ZZAFCEID.
IF SY-SUBRC = 0.
ZZAMOUNT = G_ZZAMOUNT.
CONDENSE ZZAMOUNT.
ENDIF.
ENDIF.
ENDFORM. " AFCE_DATA
检查数据: EXIT_SAPLMEREQ_005.” INCLUDE ZXM02U05 .
*&---------------------------------------------------------------------* *& 包括 ZXM02U05 * *&---------------------------------------------------------------------* *BREAK-POINT.
DATA LT_ITEMS TYPE MMPUR_ACCOUNTING_LIST.
DATA WA_ITEMS LIKE LINE OF LT_ITEMS.
DATA:G_PSPID1 LIKE PROJ-PSPID.
G_BADAT = '20110105'.
*Start of correction <2010/08/06> by
*取了WBS元素
LT_ITEMS = IM_REQ_ITEM->IF_ACCT_CONTAINER_MM~GET_ITEMS( ).
CLEAR: L_EXKN.
LOOP AT LT_ITEMS INTO WA_ITEMS.
L_EXKN = WA_ITEMS-MODEL->GET_EXKN( ).
ENDLOOP.
IF IM_DATA_NEW-BADAT >= G_BADAT.
*判断数据是否删除,删除时不检查AFCE号
IF IM_DATA_NEW-LOEKZ = ''.
*判断WBS是否为空,当WBS为空时不检查AFCE号;当WBS不为空时检查AFCE是否为空,
为空时报信息.
IF L_EXKN-PS_PSP_PNR <> '00000000'.
**检查WBS是否下达
IF ( SY-TCODE = 'ME51N' OR SY-TCODE = 'ME52N' OR SY-TCODE = 'ME53N') AND ( SY-UCOMM = 'MESAVE' OR SY-UCOMM = 'MECHECKDOC' ).
CLEAR:JSTAT,JSTAT[],G_OBJNR.
CONCATENATE 'PR' L_EXKN-PS_PSP_PNR INTO G_OBJNR.
CALL FUNCTION 'STATUS_READ'
EXPORTING
CLIENT = SY-MANDT
OBJNR = G_OBJNR
ONLY_ACTIVE = ''
TABLES
STATUS = JSTAT
EXCEPTIONS
OBJECT_NOT_FOUND = 1
OTHERS = 2.
READ TABLE JSTAT WITH KEY STAT = 'I0002'.
IF SY-SUBRC <> 0.
MESSAGE E001(00) WITH '请先WBS元素下达!'.
ENDIF.
*BREAK CHENHONGJIAO.
*只有类型为Q,P/D,A三种类型时才检查AFCE号.
IF ( IM_DATA_NEW-KNTTP = 'Q' AND IM_DATA_NEW-PSTYP = '0' )
OR ( IM_DATA_NEW-KNTTP = 'P' AND IM_DATA_NEW-PSTYP = '9' )
OR ( IM_DATA_NEW-KNTTP = 'A' AND IM_DATA_NEW-PSTYP = '0' ).
IF IM_DATA_NEW-ZZAFCEID = ''.
MESSAGE '请输入AFCE号码!' TYPE 'E'.
ELSE.
CLEAR:G_PSPID1.
* 根据WBS查找项目
SELECT SINGLE PROJ~PSPID
INTO G_PSPID1
FROM PROJ
INNER JOIN PRPS ON PRPS~PSPHI = PROJ~PSPNR
WHERE PRPS~PSPNR = L_EXKN-PS_PSP_PNR.
*根据分配预算项目表取出AFCE号
SELECT SINGLE *
FROM ZCJ30
WHERE PSPID = G_PSPID1
AND AFCEID = IM_DATA_NEW-ZZAFCEID.
IF SY-SUBRC <> 0.
CLEAR:CI_EBANDB-ZZAFCEID.
I_MEREQ_ITEM = IM_REQ_ITEM->GET_DATA( ).
MOVE-CORRESPONDING CI_EBANDB TO I_MEREQ_ITEM.
CALL METHOD IM_REQ_ITEM->SET_DATA( I_MEREQ_ITEM ).
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSEIF IM_DATA_NEW-ZZAFCEID <> '' AND L_EXKN-PS_PSP_PNR = '00000000'. CLEAR:CI_EBANDB-ZZAFCEID.
I_MEREQ_ITEM = IM_REQ_ITEM->GET_DATA( ).
MOVE-CORRESPONDING CI_EBANDB TO I_MEREQ_ITEM.
CALL METHOD IM_REQ_ITEM->SET_DATA( I_MEREQ_ITEM ).
ENDIF.
ENDIF.
ENDIF.
最后检查报MESSAGE使用BADI:ZME_PROCESS_REQ_CUST
METHOD IF_EX_ME_PROCESS_REQ_CUST~CHECK .
DATA: LT_REQUISITION_ITEMS TYPE MMPUR_REQUISITION_ITEMS.
DATA: MMPUR_ACCOUNTING_LIST TYPE MMPUR_ACCOUNTING_LIST,
RE_EXKN TYPE EXKN.
DATA: LS_MEREQITEM TYPE MEREQ_ITEM.
DATA:G_BADAT TYPE EBAN-BADAT.
G_BADAT = '20110105'.
FIELD-SYMBOLS:
CALL METHOD IM_HEADER->GET_ITEMS
RECEIVING
RE_ITEMS = LT_REQUISITION_ITEMS.
LOOP AT LT_REQUISITION_ITEMS ASSIGNING
* AFCE号EBAN
CALL METHOD
RECEIVING
RE_DATA = LS_MEREQITEM.
*WBS取数EBkn
*Accounting Data:
CALL METHOD
RECEIVING
RE_ITEMS = MMPUR_ACCOUNTING_LIST.
* From IF_PURCHASE_REQUISITION_ITEM
* .
LOOP AT MMPUR_ACCOUNTING_LIST ASSIGNING
CALL METHOD
RECEIVING
RE_EXKN = RE_EXKN.
*from IF_ACCOUNTING_MODEL_MM
ENDLOOP.
IF LS_MEREQITEM-BADAT >= G_BADAT.
*判断数据是否删除,删除时不检查AFCE号
IF LS_MEREQITEM-LOEKZ = ''.
*判断WBS是否为空,当WBS为空时不检查AFCE号;当WBS不为空时检查AFCE是否为空,
为空时报信息.
IF RE_EXKN-PS_PSP_PNR <> '00000000'.
IF ( SY-TCODE = 'ME51N' OR SY-TCODE = 'ME52N' OR SY-TCODE = 'ME53N') AND ( SY-UCOMM = 'MESAVE' OR SY-UCOMM = 'MECHECKDOC' ).
*只有类型为Q,P/D,A三种类型时才检查AFCE号.
IF ( LS_MEREQITEM-KNTTP = 'Q' AND LS_MEREQITEM-PSTYP = '0' ) OR ( LS_MEREQITEM-KNTTP = 'P' AND LS_MEREQITEM-PSTYP = '9' ) OR ( LS_MEREQITEM-KNTTP = 'A' AND LS_MEREQITEM-PSTYP = '0' ). IF LS_MEREQITEM-ZZAFCEID = ''.
MESSAGE '请输入AFCE号码!' TYPE 'E'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
最后效果