对应关系看子例程subatwtb的数据库操作。
由于cuobj不是vbap的主键,按这个字段查询太慢,所以把整个VBAP的4个四段放在内表中。
并且在测试机比较慢,用了rfc异步并行的方式来操作。
*&---------------------------------------------------------------------*
*& Report ZDEMO_TXFC
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zdemo_txfc.
TABLES:vbap,vbak.
DATA:BEGIN OF itab OCCURS 0,
vbeln LIKE vbap-vbeln,
posnr LIKE vbap-posnr,
cuobj LIKE vbap-cuobj,
atinn LIKE cabn-atinn,
atnam LIKE cabn-atnam,
atbez LIKE cabnt-atbez,
atwrt LIKE ibsymbol-atwrt,
atwtb LIKE cawnt-atwtb,
symbol_id LIKE ibinvalues-symbol_id,
msehi LIKE cabn-msehi,
werks LIKE vbap-werks,
atzhl LIKE cawnt-atzhl,
atflv LIKE ibsymbol-atflv,
END OF itab.
DATA:atwrt LIKE ibsymbol-atwrt.
DATA:atinn LIKE cabn-atinn.
DATA:atzhl LIKE cawnt-atzhl.
DATA:symbol_id LIKE ibsymbol-symbol_id.
DATA:atwtb LIKE cawnt-atwtb.
DATA:lt_cawn LIKE TABLE OF itab WITH HEADER LINE.
DATA:lt_cawnt LIKE TABLE OF itab WITH HEADER LINE.
*DATA:lt_vbap LIKE TABLE OF itab WITH HEADER LINE.
DATA:lt_ibsymbol LIKE TABLE OF itab WITH HEADER LINE.
*DATA:lt_cuobj LIKE TABLE OF itab WITH HEADER LINE.
DATA:taskname(50).
DATA:lv_finished TYPE i.
DATA:msg(50).
DATA:mess TYPE c LENGTH 80.
DATA:start LIKE sy-uzeit,
end LIKE sy-uzeit,
time(20).
DATA:BEGIN OF lt_vbap OCCURS 0,
vbeln LIKE vbap-vbeln,
posnr LIKE vbap-posnr,
auart LIKE vbak-auart,
werks LIKE vbap-werks,
erdat LIKE vbap-erdat,
cuobj LIKE vbap-cuobj,
del,
END OF lt_vbap.
DATA:lt_vbapx LIKE TABLE OF lt_vbap WITH HEADER LINE.
DATA:BEGIN OF lt_vbak OCCURS 0,
vbeln LIKE vbak-vbeln,
auart LIKE vbak-auart,
END OF lt_vbak.
FIELD-SYMBOLS:<itab> LIKE itab,
<vbap> LIKE lt_vbap,
<cawnt> LIKE lt_cawnt,
<ibsymbol> LIKE lt_ibsymbol,
<vbak> LIKE lt_vbak.
DATA:error.
DATA:configuration LIKE TABLE OF conf_out WITH HEADER LINE.
SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME.
PARAMETERS p_atnam LIKE cabn-atnam OBLIGATORY.
PARAMETERS p_atwtb LIKE cawnt-atwtb OBLIGATORY.
SELECT-OPTIONS s_erdat FOR vbap-erdat.
SELECT-OPTIONS s_werks FOR vbap-werks.
SELECT-OPTIONS s_auart FOR vbak-auart NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b.
START-OF-SELECTION.
start = sy-uzeit.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 99
text = 'processing...'.
PERFORM subatwtb.
PERFORM subdata.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form subatwtb
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM subatwtb.
CONDENSE p_atnam NO-GAPS.
CONDENSE p_atwtb.
CONCATENATE '%' p_atwtb '%' INTO p_atwtb .
SELECT SINGLE atinn INTO atinn FROM cabn
WHERE atnam = p_atnam.
IF atinn IS INITIAL.
MESSAGE '请检查特性名称!' TYPE 'I'.
ELSE.
CLEAR atzhl.
SELECT SINGLE atzhl INTO atzhl FROM cawnt
WHERE atinn = atinn
AND atwtb LIKE p_atwtb.
IF atzhl IS NOT INITIAL.
CLEAR atwrt.
SELECT SINGLE atwrt INTO atwrt FROM cawn
WHERE atinn = atinn
AND atzhl = atzhl.
IF sy-subrc = 0.
SELECT atinn atwrt symbol_id INTO CORRESPONDING FIELDS OF TABLE lt_ibsymbol FROM ibsymbol
WHERE atinn = atinn
AND atwrt = atwrt.
ENDIF.
ELSE.
SELECT atinn atwrt symbol_id INTO CORRESPONDING FIELDS OF TABLE lt_ibsymbol FROM ibsymbol
WHERE atinn = atinn
AND atwrt LIKE p_atwtb.
IF sy-subrc NE 0.
PERFORM specialsolution.
ENDIF.
ENDIF.
ENDIF.
IF lt_ibsymbol[] IS INITIAL.
MESSAGE '特性值不存在!' TYPE 'I'.
ELSE.
*>>> 异步操作
CONCATENATE 'ZDEMO_TXFC' sy-uname sy-datum sy-uzeit INTO taskname.
CALL FUNCTION 'ZSEARCH_CUOBJ'
STARTING NEW TASK taskname
DESTINATION IN GROUP DEFAULT
PERFORMING callback ON END OF TASK
EXCEPTIONS
system_failure = 1 MESSAGE mess
communication_failure = 2 MESSAGE mess
resource_failure = 3.
*<<<
IF sy-subrc = 0.
SORT lt_ibsymbol BY symbol_id.
SELECT cabn~atinn
cabn~atnam"特性名称
cabnt~atbez
ibsymbol~atwrt
ibin~instance AS cuobj
ibinvalues~symbol_id
INTO CORRESPONDING FIELDS OF TABLE itab FROM ibsymbol
INNER JOIN ibinvalues ON ibsymbol~symbol_id = ibinvalues~symbol_id
INNER JOIN ibin ON ibinvalues~in_recno = ibin~in_recno
INNER JOIN cabn ON cabn~atinn = ibsymbol~atinn
INNER JOIN cabnt ON cabnt~atinn = cabn~atinn
FOR ALL entries IN lt_ibsymbol
WHERE ibsymbol~symbol_id = lt_ibsymbol-symbol_id
AND ibin~valto = '99991231235959'.
ENDIF.
ENDIF.
ENDFORM. "subatwtb
FORM callback USING p_task.
*同步调用数据取出 >>>
RECEIVE RESULTS FROM FUNCTION 'ZSEARCH_CUOBJ'
TABLES
lt_vbap = lt_vbap
EXCEPTIONS
system_failure = 1 message mess
communication_failure = 2 message mess.
IF sy-subrc = 0.
ADD 1 TO lv_finished.
ENDIF.
*<<<
ENDFORM. "rfc_info
*&---------------------------------------------------------------------*
*& Form subdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM subdata.
WAIT UNTIL lv_finished = 1.
IF itab[] IS NOT INITIAL.
SORT lt_vbap BY cuobj.
SORT itab BY cuobj.
LOOP AT lt_vbap ASSIGNING <vbap>.
READ TABLE itab WITH KEY cuobj = <vbap>-cuobj BINARY SEARCH.
IF sy-subrc NE 0.
<vbap>-del = 'X'.
ENDIF.
IF s_werks[] IS NOT INITIAL.
IF <vbap>-werks NOT IN s_werks.
<vbap>-del = 'X'.
ENDIF.
ENDIF.
IF s_erdat[] IS NOT INITIAL.
IF <vbap>-erdat NOT IN s_erdat.
<vbap>-del = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
SORT lt_vbap BY del.
DELETE lt_vbap WHERE del = 'X'.
IF s_auart[] IS NOT INITIAL.
SORT lt_vbap BY vbeln.
SELECT vbeln auart INTO CORRESPONDING FIELDS OF TABLE lt_vbak FROM vbak
FOR ALL ENTRIES IN lt_vbap
WHERE vbeln = lt_vbap-vbeln
AND auart IN s_auart.
SORT lt_vbak BY vbeln.
LOOP AT lt_vbap ASSIGNING <vbap>.
READ TABLE lt_vbak ASSIGNING <vbak> WITH KEY vbeln = <vbap>-vbeln BINARY SEARCH.
IF sy-subrc = 0.
<vbap>-auart = <vbak>-auart.
ELSE.
<vbap>-del = 'X'.
ENDIF.
ENDLOOP.
SORT lt_vbap BY del.
DELETE lt_vbap WHERE del = 'X'.
ENDIF.
* 取特性文本
PERFORM getatwtb.
SORT lt_vbap BY cuobj.
SORT lt_ibsymbol BY symbol_id.
LOOP AT itab ASSIGNING <itab>.
READ TABLE lt_vbap ASSIGNING <vbap> WITH KEY cuobj = <itab>-cuobj BINARY SEARCH.
IF sy-subrc = 0.
<itab>-vbeln = <vbap>-vbeln.
<itab>-posnr = <vbap>-posnr.
<itab>-werks = <vbap>-werks.
ENDIF.
IF <itab>-atwrt IS INITIAL.
<itab>-atwrt = atwrt.
ENDIF.
<itab>-atwtb = atwtb.
ENDLOOP.
SORT itab BY vbeln.
DELETE itab WHERE vbeln = ''.
SORT itab BY vbeln DESCENDING posnr.
DATA lv_lines(8).
DESCRIBE TABLE itab LINES lv_lines.
LOOP AT itab.
WRITE:/ itab-vbeln+2(8),itab-posnr+3(3),itab-werks,itab-atnam,itab-atbez,itab-atwrt,itab-atwtb,itab-cuobj+11(7).
ENDLOOP.
end = sy-uzeit.
time = end - start.
CONDENSE time.
CONDENSE lv_lines.
CONCATENATE '用时 ' time 's 共' lv_lines '条数据' INTO msg.
MESSAGE msg TYPE 'S'.
ENDIF.
ENDFORM. "subdata
*&---------------------------------------------------------------------*
*& Form specialsolution
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM specialsolution.
DATA:unit(10),
len(2),
msehi LIKE cabn-msehi.
DATA:atflv LIKE cha_class_view-sollwert.
REPLACE '%' WITH '' INTO p_atwtb.
REPLACE '%' WITH '' INTO p_atwtb.
CONDENSE p_atwtb NO-GAPS.
len = STRLEN( p_atwtb ).
DO len TIMES.
len = len - 1.
IF p_atwtb+len(1) CO '0123456789'.
len = len + 1.
p_atwtb = p_atwtb+0(len).
EXIT.
ENDIF.
ENDDO.
WHILE p_atwtb CS ','.
REPLACE ',' WITH '' INTO p_atwtb.
CONDENSE p_atwtb NO-GAPS.
ENDWHILE.
CLEAR len.
len = STRLEN( p_atwtb ).
len = len - 1.
DATA:n TYPE i.
n = 0.
DO len TIMES.
IF p_atwtb+n(1) CO '0123456789.'.
n = n + 1.
ELSE.
RETURN.
ENDIF.
ENDDO.
SELECT atinn symbol_id atwrt atflv INTO CORRESPONDING FIELDS OF TABLE lt_ibsymbol FROM ibsymbol
WHERE atinn = atinn
AND atflv = p_atwtb.
ENDFORM. "specialsolution
*&---------------------------------------------------------------------*
*& Form check
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getatwtb.
CLEAR atwrt.
CLEAR atwtb.
READ TABLE itab INDEX 1.
CLEAR configuration.
REFRESH configuration.
CALL FUNCTION 'VC_I_GET_CONFIGURATION' "调用函数"
EXPORTING
instance = itab-cuobj
TABLES
configuration = configuration
EXCEPTIONS
instance_not_found = 1
internal_error = 2
no_class_allocation = 3
instance_not_valid = 4
OTHERS = 5.
IF sy-subrc = 0.
READ TABLE configuration WITH KEY atinn = atinn.
IF sy-subrc = 0.
atwrt = configuration-atwrt.
atwtb = configuration-atwtb.
ENDIF.
ENDIF.
ENDFORM. "check