采购订单屏幕BADI增强Word文档下载推荐.docx
《采购订单屏幕BADI增强Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《采购订单屏幕BADI增强Word文档下载推荐.docx(26页珍藏版)》请在冰点文库上搜索。
on
the
Header
tab
5.
CHECK
im_application
=
'
PO'
.
6.
im_element
HEADER'
7.
8.
CLEAR
lw_subscribers.
9.
lw_subscribers-name
subscreen1.
10.
lw_subscribers-dynpro
0100'
11.
lw_subscribers-program
SAPLZCI_EKKODB'
12.
lw_subscribers-struct_name
CI_EKKODB'
13.
lw_subscribers-label
Zero
test2'
14.
lw_subscribers-position
11.
15.
lw_subscribers-height
8.
16.
APPEND
TO
re_subscribers.
17.ENDMETHOD.
METHODif_ex_me_gui_po_cust~subscribe.
DATA:
lw_subscribersTYPEmepo_subscribers.
*wewanttoaddacustomersubscreenontheHeadertab
CHECKim_application='
CHECKim_element='
CLEARlw_subscribers.
lw_subscribers-name=subscreen1.
lw_subscribers-dynpro='
lw_subscribers-program='
lw_subscribers-struct_name='
lw_subscribers-label='
Zerotest2'
lw_subscribers-position=11.
lw_subscribers-height=8.
APPENDlw_subscribersTOre_subscribers.
ENDMETHOD.
Step5:
在IF_EX_ME_GUI_PO_CUST~MAP_DYNPRO_FIELDS,加入代码,使fieldname和它的数字编号关联起来
1.FIELD-SYMBOLS:
<
mapping>
LIKE
LINE
OF
ch_mapping.
3.LOOP
AT
ch_mapping
ASSIGNING
4.
CASE
-fieldname.
WHEN
LV_TEST1'
-metafield
mmmfd_cust_01.
LV_TEST2'
mmmfd_cust_02.
LV_TEST3'
mmmfd_cust_03.
ENDCASE.
9.ENDLOOP.
FIELD-SYMBOLS:
<
LIKELINEOFch_mapping.
LOOPATch_mappingASSIGNING<
CASE<
-fieldname.
WHEN'
.<
-metafield=mmmfd_cust_01.
-metafield=mmmfd_cust_02.
-metafield=mmmfd_cust_03.
ENDCASE.
ENDLOOP.
Custom的field估计只能加9个,因为我在TYPE-POOLS
mmmfd看到最大的是mmfd_cust_09,
这里也可以把一些standardfield弄到customsubscreen上.
经过以上五步,我们可以在ME23N看到customsubscreen,但在ME21N和ME22N依然是看不到的...这个是为什么,我还搞不清楚.
Step6:
给BADIME_PROCESS_PO_CUST建一个implementation
在PublicSection加入TYPE-POOLS
Step7:
在MethodIF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER加入代码,改变表ch_fieldselection的fieldstatus
-'
代表hidden,'
+'
或'
.'
表示editable,'
*'
代表display
if_ex_me_process_po_cust~fieldselection_header.
lv_persistent
mmpur_bool.
FIELD-SYMBOLS:
fs>
ch_fieldselection.
DEFINE
set_input.
read
table
ch_fieldselection
assigning
with
key
metafield
&
1.
if
sy-subrc
0.
im_header->
is_changeable(
)
mmpur_yes.
-fieldstatus
else.
endif.
END-OF-DEFINITION.
16.*
item
is
already
database,
disallow
change
field
badi_bsgru
17.
is_persistent(
).
18.
19.
set_input
20.
21.
22.
23.ENDMETHOD.
METHODif_ex_me_process_po_cust~fieldselection_header.
lv_persistentTYPEmmpur_bool.
LIKELINEOFch_fieldselection.
DEFINEset_input.
readtablech_fieldselectionassigning<
withtablekeymetafield=&
1.
ifsy-subrc=0.
ifim_header->
is_changeable()=mmpur_yes.
-fieldstatus='
else.
endif.
END-OF-DEFINITION.
*iftheitemisalreadyonthedatabase,wedisallowtochangefieldbadi_bsgru
lv_persistent=im_header->
is_persistent().
set_inputmmmfd_cust_01.
set_inputmmmfd_cust_02.
set_inputmmmfd_cust_03.
这里有两点注意下:
1.im_header->
is_changeable()可以判断当前这些field是不是处于可编辑状态,如果是则为'
X'
.比如刚进TCODEME21N,ME22N它们是可编辑的,但当按save保存成功后,它们暂时是不可以编辑的,要再按
把它改回编辑状态才可以编辑,这里就实现了这个功能.
2.im_header->
is_persistent()可以判断当这些field在数据库里有值了,它就是'
当我们把数据写进表里就不想它被修改时,可以用这个来判断,比如把某个field设置成ME21N可编辑,ME22N不可编辑.
经过这七步,ME21N/ME22N/ME23N都可以看到这个customsubscreen,但所有自建field都是可编辑状态,必需做完第八步,才能正常显示
Step8:
在screen中调用2个module
这两个module存放在下图的程序里
注意:
如果不调用这两个module,BADI
ME_GUI_PO_CUST下面的4个method都不会触发
TRANSPORT_FROM_MODEL
TRANSPORT_TO_DYNP
TRANSPORT_FROM_DYNP
TRANSPORT_TO_MODEL
Step9:
在MethodIF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_MODEL加入代码
把header的三个自建field传到attributedynp_data_pho里
if_ex_me_gui_po_cust~transport_from_model.
lw_header
REF
if_purchase_order_mm,
lw_mepoheader
mepoheader,
lw_customer
ci_ekkodb.
5.*--------------------------------------------------------------------*
6.*
system
asks
transport
data
from
business
logic
into
view
7.*--------------------------------------------------------------------*
IF
im_name
10.*
it
an
Header?
im_model
can
be
header
or
item.
mmpur_dynamic_cast
im_model.
NOT
IS
INITIAL.
13.*
standard
fields
lw_header->
get_data(
15.*
store
info
for
later
use
MOVE-CORRESPONDING
dynp_data_pbo.
ENDIF.
19.ENDMETHOD.
METHODif_ex_me_gui_po_cust~transport_from_model.
lw_headerTYPEREFTOif_purchase_order_mm,
lw_mepoheaderTYPEmepoheader,
lw_customerTYPEci_ekkodb.
*--------------------------------------------------------------------*
*systemaskstotransportdatafromthebusinesslogicintotheview
IFim_name=subscreen1.
*isitanHeader?
im_modelcanbeheaderoritem.
mmpur_dynamic_castlw_headerim_model.
CHECKNOTlw_headerISINITIAL.
*transportstandardfields
lw_mepoheader=lw_header->
get_data().
*storeinfoforlateruse
MOVE-CORRESPONDINGlw_mepoheaderTOdynp_data_pbo.
ENDIF.
Step10:
在MethodIF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_DYNP加入代码
通过调用FM:
ZCI_EKKODB_PUSH把attribute
if_ex_me_gui_po_cust~transport_to_dynp.
CALL
FUNCTION
ZCI_EKKODB_PUSH'
EXPORTING
im_dynp_data
8.ENDMETHOD.
METHODif_ex_me_gui_po_cust~transport_to_dynp.
CALLFUNCTION'
EXPORTING
im_dynp_data=dynp_data_pbo.
Step11:
在IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_DYNP加入代码
PAI事件时,把屏幕的值传到attribute
dynp_data_pai,并且比较dynp_data_pbo和dynp_data_pai,确定自建field的值有所改变,把re_changed置为'
这样IF_EX_ME_PROCESS_PO_CUST~PROCESS_HEADER就会触发.
if_ex_me_gui_po_cust~transport_from_dynp.
ZCI_EKKODB_POP'
IMPORTING
ex_dynp_data
dynp_data_pai.
dynp_data_pai
>
something
has
changed
therefor
have
notify
framework
11.*
model
re_changed
14.ENDMETHOD.
METHODif_ex_me_gui_po_cust~transport_from_dynp.
IMPORTING
ex_dynp_data=dynp_data_pai.
IFdynp_data_pai<
dynp_data_pbo.
*somethinghaschangedthereforwehavetonotifytheframework
*totransportdatatothemodel
re_changed=mmpur_yes.
Step12:
在IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_MODEL加入代码,把修改后的数据传到bussinessobject里
if_ex_me_gui_po_cust~transport_to_model.
ci_ekkodb,
lw_po_header_handle
cl_po_header_handle_mm.
8.*
transported
9.*--------------------------------------------------------------------*
12.*
item?
changed?
dynp_data_pbo-lv_test1
dynp_data_pai-lv_test1
OR
dynp_data_pbo-lv_test2
dynp_data_pai-lv_test2
dynp_data_pbo-lv_test3
dynp_data_pai-lv_test3.
20.*
update
lw_mepoheader-lv_test1
dynp_data_pai-lv_test1.
lw_mepoheader-lv_test2
dynp_data_pai-lv_test2.
23.
lw_mepoheader-lv_test3
24.
25.
METHOD
set_data
26.
27.
im_data
lw_mepoheader.
28.
29.
30.
31.ENDMETHOD.
METHODif_ex_me_gui_po_cust~transport_to_model.
lw_customerTYPEci_ekkodb,
lw_po_header_handleTYPEREFTOcl_po_header_handle_mm.
*-----------------