【ABAP】用特性反查销售订单

21 篇文章 2 订阅

对应关系看子例程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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值