测试环境中,ZRFC_GETORDKEY自开发函数,用于读取计划订单相关数据。输入参数为时间段喝工厂,输出数据为: 计划订单的订单、工艺时间、班次。 图片显示有9223条订单数据,每一条订单数据应该对应4条生产线的工艺时间,但RFC中只取了第一条工艺数据,所以也有9223条工艺数据。SHIFT是系统中的工作班次,有722个。
FUNCTION ZRFC_GETORDKEY.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(GV_CONFIG_BEGIN) TYPE /SAPAPO/STARTTI
*" VALUE(GV_CONFIG_END) TYPE /SAPAPO/ENDTI
*" VALUE(WERKS) TYPE CHAR4
*" TABLES
*" GT_ORDKEY STRUCTURE /SAPAPO/ORDKEY
*" GT_ACT STRUCTURE ZSPP_GETACT
*" GT_SHIFT STRUCTURE ZSPP_GETSHIFT1
*"----------------------------------------------------------------------
CONSTANTS: gc_active_version TYPE /sapapo/om_vrsioid VALUE /sapapo/cl_om_c=>active_version ##needed.
DATA:
gv_simid TYPE /sapapo/vrsioid VALUE gc_active_version,
gs_gen_params TYPE /sapapo/om_gen_params,
gv_simsession TYPE /sapapo/om_simsession,
gt_cap_reqs TYPE /sapapo/om_cap_req_pt_tab,
lt_ordid TYPE /sapapo/om_tab_ordid,
ls_ordid type /SAPAPO/OM_ORDERUID,
gt_outputs TYPE /sapapo/om_io_pp_tab, "#EC NEEDED
gt_ACTIVITIES TYPE /SAPAPO/OM_TAB_ACT.
DATA gt_pegkey TYPE SORTED TABLE OF /SAPAPO/PEGKEY WITH NON-UNIQUE KEY pegid. "大表一次抓
DATA gs_pegkey TYPE /SAPAPO/PEGKEY.
DATA GT_MATKEY TYPE SORTED TABLE OF /SAPAPO/MATKEY WITH NON-UNIQUE KEY MATID.
DATA GS_MATKEY TYPE /SAPAPO/MATKEY.
DATA GT_ACCKEY TYPE SORTED TABLE OF /SAPAPO/ACCKEY WITH NON-UNIQUE KEY ACCID.
DATA GS_ACCKEY TYPE /SAPAPO/ACCKEY.
DATA gt_cawn TYPE SORTED TABLE OF CAWN WITH NON-UNIQUE KEY ATINN ATZHL ADZHL. "大表一次抓
DATA gs_cawn TYPE CAWN.
DATA gt_cawnt TYPE SORTED TABLE OF CAWNT WITH NON-UNIQUE KEY ATINN ATZHL SPRAS. "大表一次抓
DATA gs_cawnt TYPE CAWNT.
DATA gt_periodext TYPE /sapapo/seq_period_ext_tab . "#EC NEEDED
DATA gs_line_plng TYPE /sapapo/seq_line_str.
"1000工厂 : 051MbrXE7kYkoUx2z4bRMW
"1002工厂 : 051MiFlB7johvRhOsk83b0
"----------按工厂得到locid---------
SELECT SINGLE * FROM /SAPAPO/LOC WHERE LOCTYPE = '1001' and LOCNO = @WERKS INTO @DATA(gs_loc).
"--------得到LC中的全部订单--------
select * INTO TABLE GT_ORDKEY FROM /SAPAPO/ORDKEY WHERE ORDTYPE = '20' and OUTPUT_FIXED = '' and locid = gs_loc-locid .
LOOP AT GT_ORDKEY INTO DATA(GS_ORDKEY).
append gs_ordkey-ordid TO lt_ordid. "后面函数的参数
ENDLOOP.
"------------创建一个事件---------------
gs_gen_params-simversion = '000'.
CALL FUNCTION '/SAPAPO/RRP_SIMSESSION_CREATE'
EXPORTING
iv_simid = gv_simid
IMPORTING
ev_simsession = gv_simsession
EXCEPTIONS
error_message = 1.
"-----------------取得班次------------------
"gs_line_plng-PNAME = '1000_LINE_BS'.
"gs_line_plng-RESID = '051MbrXE7kYlZhLoub4RjW'. "这里资源名称在表中叫:1000_RES_BS
gs_line_plng-PNAME = WERKS && '_LINE_BS'.
DATA gv_res type char40.
gv_res = WERKS && '_RES_BS'.
SELECT SINGLE * FROM /SAPAPO/RES_HEAD WHERE name = @gv_res INTO @DATA(gs_res).
gs_line_plng-RESID = gs_res-RESUID.
gs_line_plng-TZONE = 'UTC+8'.
CALL FUNCTION '/SAPAPO/SEQM_PERIODSEXT_GET'
EXPORTING
iv_simid = gv_simid
iv_simsession = gv_simsession
is_line = gs_line_plng
"iv_start_time = '20220101010101'
"iv_end_time = '20221231235959'
iv_start_time = GV_CONFIG_BEGIN
iv_end_time = GV_CONFIG_end
IMPORTING
et_periodext = gt_periodext
EXCEPTIONS
internal_error = 1
no_shift_stamp = 2
no_periods = 3
OTHERS = 4.
MOVE-CORRESPONDING gt_periodext[] TO GT_SHIFT[].
"-------------------获取订单的工艺-------------------
CALL FUNCTION '/SAPAPO/OM_ACT_GET_BY_ORDER'
EXPORTING
is_gen_params = gs_gen_params
iv_simsession = gv_simsession
it_order = lt_ordid
" iv_start_time = '19970101010101'
" iv_end_time = '20991231235959'
iv_start_time = GV_CONFIG_BEGIN
iv_end_time = GV_CONFIG_end
IMPORTING
et_cap_reqs = gt_cap_reqs
EXCEPTIONS
lc_connect_failed = 1
lc_com_error = 2
lc_appl_error = 3
OTHERS = 4.
"-----------保留第一个工艺-------------------
DATA gs_act LIKE LINE OF GT_ACT.
LOOP AT gt_cap_reqs INTO DATA(gs_cap_reqs).
IF gs_cap_reqs-MODE_NO = 1.
MOVE-CORRESPONDING gs_cap_reqs TO GS_ACT.
APPEND GS_ACT TO GT_ACT.
ENDIF.
ENDLOOP.
"--------------加工工艺时间--------------------
FIELD-SYMBOLS <gs_act> like gs_act .
LOOP AT gt_act ASSIGNING <gs_act>.
READ TABLE gt_ordkey WITH KEY ordid = <gs_act>-orderid INTO gs_ordkey.
IF sy-subrc = 0.
<gs_act>-ordno = gs_ordkey-ordno. "填充ordno
ENDIF.
"时间搓转为日期时间
PERFORM timestamp_to_date using <gs_act>-STARTTI SY-ZONLO CHANGING <gs_act>-START_DATE <gs_act>-START_TIME.
ENDLOOP.
"---------------得到成品物料,再通过PEGID得到后续数据-------------
CALL FUNCTION '/SAPAPO/OM_ORDER_GET_DATA'
EXPORTING
is_gen_params = gs_gen_params
iv_simsession = space
it_order = lt_ordid
IMPORTING
et_ext_outputs = gt_outputs
" ET_ACTIVITIES = gt_ACTIVITIES
EXCEPTIONS
lc_connect_failed = 1
lc_com_error = 2
lc_appl_error = 3
OTHERS = 4.
SELECT * INTO TABLE gt_pegkey FROM /SAPAPO/PEGKEY.
SELECT * INTO TABLE gt_MATKEY FROM /SAPAPO/MATKEY.
SELECT * INTO TABLE gt_ACCKEY FROM /SAPAPO/ACCKEY.
SELECT * INTO TABLE gt_CAWN FROM CAWN.
SELECT * INTO TABLE gt_CAWNT FROM CAWNT.
LOOP AT gt_act ASSIGNING <gs_act>.
"填充物料
READ TABLE gt_outputs WITH KEY orderid = <gs_act>-orderid INTO DATA(gs).
IF sy-subrc = 0.
<gs_act>-PEGID = gs-PEGID. "填充ordno
READ TABLE gt_pegkey WITH KEY pegid = <gs_act>-pegid INTO DATA(tmp).
IF sy-subrc = 0.
<gs_act>-matid = tmp-matid.
<gs_act>-accid = tmp-accid.
READ TABLE gt_matkey WITH KEY matid = <gs_act>-matid INTO DATA(oth).
IF sy-subrc = 0.
<gs_act>-matnr = oth-matnr.
ENDIF.
ENDIF.
ENDIF.
"填充销售订单
READ TABLE gt_ACCKEY WITH KEY accid = <gs_act>-accid INTO DATA(f4).
IF sy-subrc = 0.
<gs_act>-KDAUF = f4-sskey(10).
<gs_act>-KDPOS = f4-sskey+10(6).
ENDIF.
"填充销售订单批次和VSN
DATA: lv_name TYPE thead-tdname,
lt_line TYPE TABLE OF tline.
CONCATENATE <gs_act>-KDAUF <gs_act>-KDPOS INTO lv_name.
REFRESH lt_line.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = '0001'
language = '1'
name = lv_name
object = 'VBBP'
TABLES
lines = lt_line
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF lt_line[] IS INITIAL.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = '0001'
language = 'E'
name = lv_name
object = 'VBBP'
TABLES
lines = lt_line
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
ENDIF.
READ TABLE lt_line ASSIGNING FIELD-SYMBOL(<ls_line>) INDEX 1.
IF sy-subrc = 0.
SPLIT <ls_line>-tdline AT '_' INTO TABLE DATA(lt_lines).
READ TABLE lt_lines ASSIGNING FIELD-SYMBOL(<ls_lines>) INDEX 1.
IF sy-subrc = 0.
<gs_act>-VSN = <ls_lines>.
ENDIF.
READ TABLE lt_lines ASSIGNING <ls_lines> INDEX 4.
IF sy-subrc = 0.
<gs_act>-PC = <ls_lines>.
ENDIF.
ENDIF.
"填充配置
"定义结构体
TYPES: BEGIN OF ty_sub,
ATINN TYPE ATINN,
ATNAM TYPE ATNAM,
ATWRT TYPE ATWRT,
ATWTB TYPE ATWTB,
END OF ty_sub.
"定义
DATA gs_sub TYPE ty_sub.
DATA:
lv_matnr TYPE matnr,
lv_char TYPE char10,
ls_data1 TYPE zspd0006_ord_alv,
ls_data3 TYPE zspd0006_bom_alv,
ls_values TYPE ibco2_value_rec,
lt_values TYPE ibco2_value_tab.
REFRESH: lt_values .
CALL FUNCTION 'CUCB_GET_VALUES_FROM_INSTANCE'
EXPORTING
iv_instance = gs-cuobj
IMPORTING
et_values = lt_values
EXCEPTIONS
invalid_instance = 1
instance_is_a_classification = 2
OTHERS = 3.
IF sy-subrc = 0.
LOOP AT lt_values INTO ls_values. "下面200个配置,每个都要处理一次
gs_sub-ATINN = ls_values-ATINN. "1、 放特征编号 0000000811
CALL FUNCTION 'MMRP_ATINN_2_ATNAM'
EXPORTING
iv_atinn = ls_values-ATINN
IMPORTING
ev_atnam = gs_sub-ATNAM "2、放特征文本 ZMANRT
EXCEPTIONS
characteristic_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
gs_sub-ATWRT = ls_values-ATWRT. " 3、放特征值 F517等等
DATA:l_atzhl LIKE cawn-atzhl.
CLEAR:l_atzhl.
READ TABLE gt_cawn WITH KEY atinn = ls_values-ATINN atwrt = ls_values-ATWRT INTO gs_cawn.
IF sy-subrc = 0.
l_atzhl = gs_cawn-atzhl.
ENDIF.
* SELECT SINGLE atzhl
* INTO l_atzhl
* FROM cawn
* WHERE atinn = ls_values-ATINN
* AND atwrt = ls_values-ATWRT .
CLEAR:gs_sub-atwtb.
READ TABLE gt_cawnt WITH KEY atinn = ls_values-ATINN atzhl = l_atzhl spras = sy-langu INTO gs_cawnt.
IF sy-subrc = 0.
gs_sub-ATWTB = gs_cawnt-ATWTB.
ENDIF.
* SELECT SINGLE ATWTB
* INTO gs_sub-ATWTB
* FROM cawnt
* WHERE atinn = ls_values-ATINN
* AND atzhl = l_atzhl
* AND spras = sy-langu.
SPLIT gs_sub-ATNAM AT '_' INTO lv_matnr lv_char.
CASE lv_char.
WHEN 'PM' OR 'BPACK'.
<gs_act>-zbpack = gs_sub-atwrt.
<gs_act>-zbpack_txt = gs_sub-atwtb.
WHEN 'PKG0' OR 'SPACK'.
CONCATENATE <gs_act>-zspack gs_sub-atwrt INTO <gs_act>-zspack SEPARATED BY space.
CONCATENATE <gs_act>-zspack_txt gs_sub-atwtb INTO <gs_act>-zspack_txt SEPARATED BY space.
WHEN 'PA00' OR 'INNER'.
<gs_act>-zint_trim = gs_sub-atwrt.
<gs_act>-zint_trim_txt = gs_sub-atwtb.
WHEN 'CC00' OR 'EXTOR'.
<gs_act>-zext_color = gs_sub-atwrt.
<gs_act>-zext_color_txt = gs_sub-atwtb.
ENDCASE.
IF gs_sub-ATNAM = 'ZWERKS'.
<gs_act>-PLANT = ls_values-ATWRT.
ENDIF.
ENDLOOP.
* CLEAR:ls_data2-atbez.
*
* SELECT SINGLE atbez
* INTO CORRESPONDING FIELDS OF ls_data2
* FROM cabnt
* WHERE atinn = ls_values-atinn
* AND spras = sy-langu.
*
* DATA:l_atzhl LIKE cawn-atzhl.
* CLEAR:l_atzhl.
*
* SELECT SINGLE atzhl
* INTO l_atzhl
* FROM cawn
* WHERE atinn = ls_values-atinn
* AND atwrt = ls_values-atwrt.
*
* CLEAR:ls_data2-atwtb.
*
* SELECT SINGLE atwtb
* INTO CORRESPONDING FIELDS OF ls_data2
* FROM cawnt
* WHERE atinn = ls_values-atinn
* AND atzhl = l_atzhl
* AND spras = sy-langu.
*
* ls_data2-atwrt = ls_values-atwrt.
* Provide characters to order data
* SPLIT ls_data2-atnam AT '_' INTO lv_matnr lv_char.
*
* CASE lv_char.
*
* WHEN 'PM' OR 'BPACK'.
* <gs_act>-zbpack = ls_data2-atwrt.
* <gs_act>-zbpack_txt = ls_data2-atwtb.
*
* WHEN 'PKG0' OR 'SPACK'.
* CONCATENATE <gs_act>-zspack ls_data2-atwrt INTO <gs_act>-zspack SEPARATED BY space.
* CONCATENATE <gs_act>-zspack_txt ls_data2-atwtb INTO <gs_act>-zspack_txt SEPARATED BY space.
*
* WHEN 'PA00' OR 'INNER'.
* <gs_act>-zint_trim = ls_data2-atwrt.
* <gs_act>-zint_trim_txt = ls_data2-atwtb.
*
* WHEN 'CC00' OR 'EXTOR'.
* <gs_act>-zext_color = ls_data2-atwrt.
* <gs_act>-zext_color_txt = ls_data2-atwtb.
* ENDCASE.
endif.
ENDLOOP.
*
*
*
*
*TYPES:
* BEGIN OF ty_pegkey,
* pegid TYPE /sapapo/pegid,
* locid TYPE /sapapo/locid,
* locno TYPE /sapapo/locno,
* matid TYPE /sapapo/matid,
* matnr TYPE /sapapo/matnr,
* meins TYPE /sapapo/meins,
* sskey TYPE /sapapo/acckey-sskey,
* planner_pps TYPE /sapapo/matloc-planner_pps,
* END OF ty_pegkey.
*
*
* DATA:
* lt_pegid TYPE TABLE OF /sapapo/pegid,
* gt_pegkey TYPE HASHED TABLE OF ty_pegkey
* WITH UNIQUE KEY pegid.
*
*
* LOOP AT gt_outputs INTO DATA(ls).
* APPEND ls-PEGID TO lt_pegid.
* ENDLOOP.
*
*
*
*
*
* IF lt_pegid IS NOT INITIAL.
* SELECT a~pegid
* a~locid
* c~locno
* a~matid
* b~matnr
* b~meins
* d~sskey
* e~planner_pps
* FROM /sapapo/pegkey AS a
* JOIN /sapapo/matkey AS b
* ON a~matid = b~matid
* JOIN /sapapo/loc AS c
* ON a~locid = c~locid
* LEFT JOIN /sapapo/acckey AS d
* ON a~accid = d~accid
* JOIN /sapapo/matloc AS e
* ON a~matid = e~matid
* AND a~locid = e~locid
* INTO TABLE gt_pegkey
* FOR ALL ENTRIES IN lt_pegid
* WHERE a~pegid = lt_pegid-table_line.
*
*
* endif.
ENDFUNCTION.
* &---------------------------------------------------------------------*
* & Form date_to_timestamp
* &---------------------------------------------------------------------*
* 日期+时间+时区 转变为 时间戳
* ----------------------------------------------------------------------*
FORM date_to_timestamp USING i_date LIKE sy-datum
i_time LIKE sy-uzeit
i_tzone LIKE tzonref-tzone
CHANGING o_tstamp LIKE tzonref-tstamps .
CONVERT DATE i_date TIME i_time INTO TIME STAMP o_tstamp TIME ZONE i_tzone.
CASE sy-subrc.
WHEN 8.
MESSAGE e000(oo) WITH '时区错'.
WHEN 12.
MESSAGE e000(oo) WITH '时间戳错误'.
WHEN OTHERS.
ENDCASE.
ENDFORM. "date_to_timestamp
* &---------------------------------------------------------------------*
* & Form TIMESTAMP_TO_DATE
* &---------------------------------------------------------------------*
* 时间戳+时区 转变为 日期和时间
* ----------------------------------------------------------------------*
FORM timestamp_to_date USING i_tstamp LIKE tzonref-tstamps
i_tzone LIKE tzonref-tzone
CHANGING o_date LIKE sy-datum
o_time LIKE sy-uzeit.
DATA: w_tzone LIKE tzonref-tzone.
w_tzone = i_tzone.
CONVERT TIME STAMP i_tstamp TIME ZONE w_tzone INTO DATE o_date TIME o_time.
CASE sy-subrc.
WHEN 8.
MESSAGE e000(oo) WITH '时区错'.
WHEN 12.
MESSAGE e000(oo) WITH '时间戳错误'.
WHEN OTHERS.
ENDCASE.
ENDFORM. "TIMESTAMP_TO_DATE