业务需求
要求通过执行程序ukm_rfdkli20,将跑出来的交货单下发给外围系统
实现思路
SUBMIT ukm_rfdkli20程序的时候,会弹出一些屏幕,所以需要利用后台作业去跑,因为跑出来数据在另一个子屏幕里面,所以我们没办法直接通过SUBMIT获取到数据,最后发现程序跑完之后,系统会更新v_ukm_item表,所以我的想法是,利用UUID生成后台作业名,然后判断此UUID的后台作业已经实行完毕,再查v_ukm_item表进行数据下发。
具体逻辑参考代码
DATA lo_uuid TYPE REF TO if_system_uuid.
DATA lv_uuid_x16 TYPE sysuuid_x16. "
DATA lv_uuid_c26 TYPE sysuuid_c26.
LOOP AT gt_kunnr ASSIGNING FIELD-SYMBOL(<fs_kunnr>) .
TRY.
lo_uuid = cl_uuid_factory=>create_system_uuid( ).
lv_uuid_x16 = lo_uuid->create_uuid_x16( ).
lo_uuid->convert_uuid_x16(
EXPORTING
uuid = lv_uuid_x16
IMPORTING
uuid_c26 = lv_uuid_c26 ).
CATCH cx_uuid_error.
ENDTRY.
<fs_kunnr>-uuid = lv_uuid_c26 .
ENDLOOP .
LOOP AT gt_kunnr INTO gs_kunnr .
CALL FUNCTION 'ZSD001' "STARTING NEW TASK gs_kunnr-kunnr
* PERFORMING frm_task_end ON END OF TASK
EXPORTING
kunnr = gs_kunnr-kunnr
uuid = gs_kunnr-uuid
EXCEPTIONS
communication_failure = 1
system_failure = 2
resource_failure = 3.
* WAIT UNTIL gt_vukm IS NOT INITIAL.
PERFORM frm_task_end USING gs_kunnr-kunnr .
CLEAR : gs_kunnr .
ENDLOOP .
FUNCTION zsd001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(KUNNR) TYPE KUNNR OPTIONAL
*" VALUE(UUID) TYPE CHAR26 OPTIONAL
*"--------------------------------------------------------------------
DATA : lr_alv_data TYPE REF TO data .
FIELD-SYMBOLS <lt_alv_data> TYPE ANY TABLE .
DATA: number TYPE tbtcjob-jobcount,
name TYPE tbtcjob-jobname,
print_parameters TYPE pri_params.
DATA: it_seltab TYPE TABLE OF rsparams,
iw_seltab LIKE LINE OF it_seltab.
RANGES:r_kunnr FOR knvv-kunnr,
r_kkber FOR knvv-kkber.
name = uuid .
r_kunnr-sign = 'I'.
r_kunnr-option = 'EQ'.
r_kunnr-low = kunnr.
APPEND r_kunnr.
r_kkber-sign = 'I'.
r_kkber-option = 'EQ'.
r_kkber-low = '1000'.
APPEND r_kkber .
cl_salv_bs_runtime_info=>set(
display = abap_true
metadata = abap_false
data = abap_true ).
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = name
IMPORTING
jobcount = number
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
SUBMIT ukm_rfdkli20
WITH sdchd = 'X'
WITH testlauf = ''
WITH pkunnr IN r_kunnr
WITH pkkber IN r_kkber
TO SAP-SPOOL
SPOOL PARAMETERS print_parameters
WITHOUT SPOOL DYNPRO
VIA JOB name NUMBER number
AND RETURN.
IF sy-subrc = 0.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = number
jobname = name
strtimmed = 'X'
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
IF sy-subrc = 0.
ENDIF.
ENDIF .
ENDIF.
ENDFUNCTION.
FORM frm_task_end USING gv_kunnr.
DATA : ls_likpvb TYPE likpvb,
lt_likpvb TYPE TABLE OF likpvb.
READ TABLE gt_kunnr INTO DATA(ls_kunnr) WITH KEY kunnr = gv_kunnr .
IF sy-subrc = 0 .
DO 50 TIMES.
SELECT SINGLE COUNT(*) FROM tbtco WHERE jobname = ls_kunnr-uuid AND status = 'F' .
IF sy-subrc = 0 .
SELECT * FROM v_ukm_item INTO TABLE @gt_vukm WHERE partner = @gv_kunnr AND objtype = 'LIKP' .
LOOP AT gt_vukm INTO gs_vukm .
gs_vbeln-vbeln = gs_vukm-objkey+0(10) .
APPEND gs_vbeln TO gt_vbeln .
CLEAR : gs_vukm ,gs_vbeln .
ENDLOOP .
LOOP AT gt_vbeln ASSIGNING FIELD-SYMBOL(<fs_vbeln>) .
SELECT SINGLE * FROM likp INTO @DATA(ls_likp) WHERE vbeln = @<fs_vbeln>-vbeln AND cmgst = 'A' AND wbstk <> 'C' .
MOVE-CORRESPONDING ls_likp TO ls_likpvb .
APPEND ls_likpvb TO lt_likpvb .
CLEAR : ls_likpvb .
IF sy-subrc = 0 . "下发全域
CALL FUNCTION 'ZPOFM_OUTB_DLV_STATUS_SEND'
EXPORTING
im_type = '02'
TABLES
it_likp = lt_likpvb.
APPEND <fs_vbeln> TO gt_alv .
ENDIF .
CLEAR : lt_likpvb ,ls_likpvb ,ls_likp .
ENDLOOP .
EXIT .
ELSE .
WAIT UP TO 2 SECONDS .
ENDIF .
ENDDO.
ENDIF .
ENDFORM.