当前位置:文档之家› SAP采购申请屏幕增强

SAP采购申请屏幕增强

SAP采购申请屏幕增强
SAP采购申请屏幕增强

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: TYPE LINE OF MMPUR_REQUISITION_ITEMS. FIELD-SYMBOLS: TYPE LINE OF MMPUR_ACCOUNTING_LIST. *抬头

CALL METHOD IM_HEADER->GET_ITEMS

RECEIVING

RE_ITEMS = LT_REQUISITION_ITEMS.

LOOP AT LT_REQUISITION_ITEMS ASSIGNING .

* AFCE号EBAN

CALL METHOD -ITEM->GET_DATA“AFCE号EBAN

RECEIVING

RE_DATA = LS_MEREQITEM.

*WBS取数EBkn

*Accounting Data:

CALL METHOD -ITEM->IF_ACCT_CONTAINER_MM~GET_ITEM

RECEIVING

RE_ITEMS = MMPUR_ACCOUNTING_LIST.

* From IF_PURCHASE_REQUISITION_ITEM

* .

LOOP AT MMPUR_ACCOUNTING_LIST ASSIGNING .

CALL METHOD -MODEL->GET_EXKN

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.

最后效果

相关主题
文本预览
相关文档 最新文档