今天在修改项目上批量导入PM任务清单程序时,发现目前系统中使用BDC录屏方式进行批量导入,当然BDC导入的弊端想必大家很清楚的,那么是否有BAPI可以使用?(抱歉,废话有点多,直接上代码)
LOOP AT t_zspmrp006.
"新任务清单
AT END OF itemno.
DATA(lv_end) = 'X'.
ENDAT.
AT NEW groupid.
CLEAR:lv_plnnr,lv_plnal.
ENDAT.
AT NEW itemno.
DATA(lv_new) = 'X'.
ENDAT.
IF lv_new = 'X'.
CLEAR lv_new.
CLEAR ls_header.
ls_header-plnty = 'A'.
IF lv_plnnr IS NOT INITIAL.
ls_header-plnnr = lv_plnnr.
ENDIF.
ls_header-plnal = CONV numc2( t_zspmrp006-itemno )."lv_plnal.
ls_header-datuv = sy-datum.
ls_header-ktext = t_zspmrp006-ktext.
ls_header-iwerk = ls_header-werks = t_zspmrp006-werks.
IF t_zspmrp006-arbpl IS NOT INITIAL.
ls_header-arbpl_werk = t_zspmrp006-werks.
ls_header-arbpl = t_zspmrp006-arbpl.
ENDIF.
ls_header-vagrp = t_zspmrp006-vagrp.
ls_header-statu = '4'.
ls_header-strat = t_zspmrp006-strat.
ENDIF.
l_vornr = l_vornr + 10.
CLEAR:lt_options.
lt_options-plnty = 'A'.
lt_options-plnal = CONV numc2( t_zspmrp006-itemno ).
lt_options-vornr = l_vornr.
lt_options-arbpl = t_zspmrp006-arbpl_d.
lt_options-werks = t_zspmrp006-werks.
lt_options-ltxa1 = t_zspmrp006-ltxa1.
lt_options-ltxa1 = sy-langu.
APPEND lt_options.
CLEAR:lt_stream,lt_stream[],lt_itf[].
IF t_zspmrp006-ltext IS NOT INITIAL.
lt_stream = t_zspmrp006-ltext.
APPEND lt_stream.
CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT'
TABLES
text_stream = lt_stream
itf_text = lt_itf.
ENDIF.
IF lt_itf[] IS NOT INITIAL.
CLEAR lt_text.
lt_text-plnty = 'A'.
lt_text-plnal = CONV numc2( t_zspmrp006-itemno ).
lt_text-vornr = l_vornr.
lt_text-langu = sy-langu.
lt_text-textstart = lines( lt_text_lines ) + 1.
lt_text-textend = lt_text-textstart + lines( lt_itf ) - 1.
APPEND lt_text.
ENDIF.
APPEND LINES OF lt_itf TO lt_text_lines.
IF lv_end = 'X'.
CALL FUNCTION 'EAM_TASKLIST_CREATE'
EXPORTING
is_header = ls_header
IMPORTING
ev_plnnr = lv_plnnr
ev_plnal = lv_plnal
TABLES
it_operations = lt_options
et_return = lt_return
it_text = lt_text
it_text_lines = lt_text_lines.
sy-subrc = 4.
LOOP AT lt_return INTO DATA(ls_return) WHERE type CA 'AEX'.
CHECK ls_return-id <> 'BAPI'.
MESSAGE ID ls_return-id TYPE ls_return-type
NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2
ls_return-message_v3 ls_return-message_v4
INTO DATA(lv_msg).
t_zspmrp006-mesag = |{ t_zspmrp006-mesag }{ lv_msg };|.
ENDLOOP.
IF sy-subrc = 0.
t_zspmrp006-icon = icon_incomplete.
ELSE.
t_zspmrp006-icon = icon_checked.
CLEAR lt_return.
CALL FUNCTION 'EAM_TASKLIST_POST'
EXPORTING
iv_plnty = 'A'
iv_plnnr = lv_plnnr
IMPORTING
et_return = lt_return[].
sy-subrc = 4.
LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'.
CHECK ls_return-id <> 'BAPI'.
MESSAGE ID ls_return-id TYPE ls_return-type
NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2
ls_return-message_v3 ls_return-message_v4
INTO lv_msg.
t_zspmrp006-mesag = |{ t_zspmrp006-mesag }{ lv_msg };|.
ENDLOOP.
IF sy-subrc = 0 .
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
t_zspmrp006-icon = icon_incomplete.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
t_zspmrp006-icon = icon_checked.
t_zspmrp006-plnnr = lv_plnnr.
ENDIF.
ENDIF.
t_zspmrp006-plnal = lv_plnal.
MODIFY t_zspmrp006 FROM t_zspmrp006 TRANSPORTING mesag icon plnnr plnal WHERE groupid = t_zspmrp006-groupid AND itemno = t_zspmrp006-itemno.
CLEAR:l_vornr,lv_end,lt_return[],lt_options[],lt_text[],lt_text_lines[],ls_header."lv_plnnr,lv_plnal.
ENDIF.
ENDLOOP.
主要适用的FM:EAM_TASKLIST_CREATE、EAM_TASKLIST_POST。
代码上完了,说一下注意事项:
1、通常来讲我们调用EAM_TASKLIST_POST函数,会认为不需要进行Commit Work,但是对于任务清单来讲,Commit Work还是少不了的。
2、如果不调用EAM_TASKLIST_POST,而直接调用BAPI_TRANSACTION_COMMIT是否可行?
不可以,系统直接会提示ABAP DUMP,所以以上两个FM是配合使用的。
3、EAM_TASKLIST_CREATE创建任务清单时,每次只可创建一个计数器清单,不可多条创建。
4、对于同一个任务清单的多个计数器来讲,以上代码中均通过EAM_TASKLIST_CREATE来进行创建而没有使用EAM_TASKLIST_CHANGE进行修改原任务清单来增加计数器(不确定通过EAM_TASKLIST_CHANGE可以实现,大家可以自行试一下)。
5、在创建同一个任务清单的多个计数器时,需要先创建任务清单,并提交,然后创建下一计数器。