DATA: lo_dlv_db_read_prd TYPE REF TO /scwm/cl_dlv_db_read_prd,
lt_docid TYPE /scwm/dlv_docid_item_tab,
ls_docid TYPE LINE OF /scwm/dlv_docid_item_tab,
ls_read_options TYPE /scwm/dlv_query_contr_str,
ls_include_data TYPE /scwm/dlv_query_incl_str,
lt_items TYPE /scwm/dlv_item_out_prd_tab,
ls_item TYPE LINE OF /scwm/dlv_item_out_prd_tab,
ls_docflow TYPE LINE OF /scwm/dl_docflow_tab,
l_tabix TYPE sy-tabix.
CREATE OBJECT lo_dlv_db_read_prd.
ls_read_options-docflow_succ_1level_only = 'X'.
* LS_READ_OPTIONS-PARALLEL_PROCESSING = 'X'.
ls_include_data-item_docflow = 'X'.
ls_docid-docid = i_docid.
ls_docid-doccat = 'PDI'.
APPEND ls_docid TO lt_docid.
TRY.
CALL METHOD lo_dlv_db_read_prd->query(
EXPORTING
it_docid = lt_docid
is_read_options = ls_read_options
is_include_data = ls_include_data
IMPORTING
et_items = lt_items ).
CATCH /scdl/cx_delivery.
CLEAR lt_items.
ENDTRY.
***更全面的:
DATA:
lw_head TYPE zews2065h,
lw_item TYPE zews2065i,
gv_timezone TYPE tznzone,
lo_delivery TYPE REF TO /scwm/cl_dlv_management_prd,
lo_message TYPE REF TO /scwm/cl_dm_message_no,
lx_delivery TYPE REF TO /scdl/cx_delivery,
lt_selection TYPE TABLE OF /scwm/dlv_selection_str,
ls_selection TYPE /scwm/dlv_selection_str,
ls_read_options TYPE /scwm/dlv_query_contr_str,
ls_include TYPE /scwm/dlv_query_incl_str_prd,
lt_headers TYPE /scwm/dlv_header_out_prd_tab,
lt_items TYPE /scwm/dlv_item_out_prd_tab,
lt_items_tmp TYPE /scwm/dlv_item_out_prd_tab,
ls_header TYPE /scwm/dlv_header_out_prd_str,
ls_item TYPE /scwm/dlv_item_out_prd_str,
ls_addmeas TYPE /scdl/dl_addmeas_str,
ls_partyloc TYPE /scdl/dl_partyloc_str,
ls_refdoc TYPE /scdl/dl_refdoc_str,
lr_cretst TYPE /scwm/tt_timestamp_r,
ls_cretst TYPE /scwm/s_timestamp_r,
lt_doctype TYPE TABLE OF zewt3036_10,
ls_doctype TYPE zewt3036_10,
lv_index TYPE i.
* get timezone of warehouse
CALL FUNCTION '/SCWM/LGNUM_TZONE_READ'
EXPORTING
iv_lgnum = iv_lgnum
IMPORTING
ev_tzone = gv_timezone
EXCEPTIONS
interface_error = 1
data_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
REFRESH: et_head,et_item.
* get instance
lo_delivery = /scwm/cl_dlv_management_prd=>get_instance( ).
* build up range of select options
* 仓库号
ls_selection-fieldname = /scwm/if_dl_logfname_c=>sc_whno_pdo_i.
ls_selection-sign = 'I'.
ls_selection-option = 'EQ'.
ls_selection-low = iv_lgnum.
APPEND ls_selection TO lt_selection.
CLEAR ls_selection.
* ERP凭证
LOOP AT ir_docno INTO DATA(iw_docno).
ls_selection-fieldname = /scdl/if_dl_logfname_c=>sc_refdocno_erp_h.
ls_selection-sign = iw_docno-sign.
ls_selection-option = iw_docno-option.
ls_selection-low = iw_docno-low.
ls_selection-high = iw_docno-high.
APPEND ls_selection TO lt_selection.
CLEAR: ls_selection,iw_docno.
ENDLOOP.
* 凭证类型
SELECT * FROM zewt3036_10 INTO TABLE lt_doctype
WHERE lgnum = iv_lgnum.
LOOP AT lt_doctype INTO ls_doctype.
ls_selection-fieldname = /scdl/if_dl_logfname_c=>sc_doctype_h.
ls_selection-sign = 'I'.
ls_selection-option = 'EQ'.
ls_selection-low = ls_doctype-doctype.
APPEND ls_selection TO lt_selection.
CLEAR ls_selection.
ENDLOOP.
* 抬头拣配状态
ls_selection-fieldname = /scdl/if_dl_logfname_c=>sc_status_value_dgi_i.
ls_selection-sign = 'I'.
ls_selection-option = 'EQ'.
ls_selection-low = /scdl/if_dl_status_c=>sc_v_mfg_complete.
APPEND ls_selection TO lt_selection.
CLEAR ls_selection.
* set read options
ls_read_options-data_retrival_only = abap_true.
ls_read_options-mix_in_object_instances = /scwm/if_dl_c=>sc_mix_in_load_instance.
ls_read_options-parallel_processing = abap_true.
* ls_include-head_status = abap_true.
* ls_include-head_partyloc = abap_true.
* ls_include-item_addmeas = abap_true.
ls_include-item_refdoc = abap_true.
* call Outbound DLV query
TRY.
CALL METHOD lo_delivery->query
EXPORTING
iv_whno = iv_lgnum "并行取数据时用来读并行相关配置信息,不用来过滤交货单
iv_doccat = /scdl/if_dl_c=>sc_doccat_out_prd
it_selection = lt_selection
is_read_options = ls_read_options
is_include_data = ls_include
IMPORTING
et_headers = lt_headers
et_items = lt_items
eo_message = lo_message.
* 取出的交货单数据要把已在任务池中的数据排除掉
IF lt_items[] IS NOT INITIAL.
SORT lt_headers BY docid.
SORT lt_items BY docid.
* 整理交货单数据
CLEAR:lv_index.
LOOP AT lt_headers INTO ls_header.
" 交货单创建日期
CONVERT TIME STAMP ls_header-admin-cretst
TIME ZONE gv_timezone
INTO DATE lw_head-erdat.
LOOP AT lt_items INTO ls_item FROM lv_index. "从上次读取的位置的查找数据
IF ls_item-docid NE ls_header-docid.
lv_index = sy-tabix.
EXIT.
ENDIF.
IF ls_item-product-batchno IS INITIAL.
CONTINUE.
ENDIF.
"ERP交货单号
READ TABLE ls_item-refdoc INTO ls_refdoc WITH KEY refdoccat = 'ERP'.
IF sy-subrc = 0.
lw_head-vbeln = ls_refdoc-refdocno.
lw_item-vbeln = ls_refdoc-refdocno.
lw_item-posnr = ls_item-itemno+4(6)."ls_refdoc-refitemno.
lw_item-matnr = ls_item-product-productno+22(18).
lw_item-batchno = ls_item-product-batchno.
lw_item-qty = ls_item-qty-qty.
lw_item-uom = ls_item-qty-uom.
ENDIF.
APPEND lw_item TO et_item.
CLEAR:lw_item,ls_refdoc.
ENDLOOP.
IF sy-subrc = 0.
APPEND lw_head TO et_head.
ENDIF.
CLEAR :lw_head,ls_header.
ENDLOOP.
ENDIF.
CATCH /scdl/cx_delivery INTO lx_delivery.
IF lx_delivery->mo_message IS BOUND.
lo_message->add( lx_delivery->mo_message ).
ENDIF.
ENDTRY.