【ABAP】从表中取特性,与函数取值相同的尝试

*&---------------------------------------------------------------------*
*& Report  ZDEMO_TX
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zdemo_tx.
TABLES vbap.

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,
  END OF itab.

DATA lt_vbap LIKE TABLE OF itab WITH HEADER LINE.
DATA itabs   LIKE TABLE OF itab WITH HEADER LINE.

DATA:BEGIN OF lt_compare OCCURS 0,
  vbelns LIKE vbap-vbeln,
  posnrs LIKE vbap-posnr,
  vbelnf LIKE vbap-vbeln,
  posnrf LIKE vbap-posnr,
  atinns LIKE cabn-atinn,
  atinnf LIKE cabn-atinn,
  atnams LIKE cabn-atnam,
  atnamf LIKE cabn-atnam,
  atbezs LIKE cabnt-atbez,
  atbezf LIKE cabnt-atbez,
  atwrts LIKE ibsymbol-atwrt,
  atwrtf LIKE ibsymbol-atwrt,
  atwtbs LIKE cawnt-atwtb,
  atwtbf LIKE cawnt-atwtb,
  END OF lt_compare.

DATA:configuration LIKE TABLE OF conf_out WITH HEADER LINE.

DATA:lt_cabnt      LIKE TABLE OF cabnt    WITH HEADER LINE.
DATA:lt_cawnt      LIKE TABLE OF cawnt    WITH HEADER LINE.
DATA:lt_ibsymbol   LIKE TABLE OF ibsymbol WITH HEADER LINE.

SELECT-OPTIONS s_vbeln FOR vbap-vbeln.
SELECT-OPTIONS s_posnr FOR vbap-posnr.
PARAMETERS hs      RADIOBUTTON GROUP r DEFAULT 'X' USER-COMMAND rclk.
PARAMETERS sjk     RADIOBUTTON GROUP r .
PARAMETERS compare RADIOBUTTON GROUP r .

START-OF-SELECTION.
  IF hs = 'X'.
    PERFORM functionmod.
    PERFORM write.
  ELSEIF sjk = 'X'.
    PERFORM sqlmod.
    PERFORM write.
  ELSEIF compare = 'X'.
    PERFORM functionmod.
    PERFORM sqlmod.
    PERFORM compare.
  ENDIF.



*&---------------------------------------------------------------------*
*&      Form  sqlmod
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sqlmod.
  SELECT   vbap~vbeln
           vbap~posnr
           vbap~cuobj
           cabn~atinn"内部特性
           cabn~atnam"特性名称
*           ibsymbol~atwrt"特性值
           cabnt~atbez
*           cawnt~atwtb
           ibinvalues~symbol_id
           cabn~msehi
     APPENDING CORRESPONDING FIELDS OF TABLE itab
     FROM vbap
     INNER JOIN ibin ON ibin~instance = vbap~cuobj
     INNER JOIN ibinvalues ON ibinvalues~in_recno = ibin~in_recno
     INNER JOIN ibsymbol ON ibsymbol~symbol_id = ibinvalues~symbol_id
     INNER JOIN cabn ON cabn~atinn = ibsymbol~atinn
     INNER JOIN cabnt ON cabnt~atinn = cabn~atinn
*     INNER JOIN cawnt ON cawnt~atinn = ibsymbol~atinn
*                     AND cawnt~atzhl = ibsymbol~atwrt
     WHERE vbap~vbeln IN s_vbeln
     AND   vbap~posnr IN s_posnr
     AND   ibin~valto  = '99991231235959'.
*
*  SELECT * INTO TABLE lt_cabnt FROM cabnt
*    FOR ALL ENTRIES IN itab
*    WHERE atinn = itab-atinn.

  SELECT * INTO TABLE lt_ibsymbol FROM ibsymbol
    FOR ALL ENTRIES IN itab
    WHERE symbol_id = itab-symbol_id.

  SELECT * INTO TABLE lt_cawnt FROM cawnt
    FOR ALL ENTRIES IN itab
    WHERE atinn = itab-atinn.

  SORT lt_cawnt BY atinn atzhl.
  SORT lt_ibsymbol BY symbol_id.

  DATA:atzhl LIKE cawnt-atzhl.
  DATA:atflv LIKE cha_class_view-sollwert.
  DATA:dzero TYPE p DECIMALS 0.

  LOOP AT itab.
    READ TABLE lt_ibsymbol WITH KEY symbol_id = itab-symbol_id
                                       BINARY SEARCH.
    IF sy-subrc = 0.
      IF lt_ibsymbol-atwrt = ''.

        IF itab-msehi = 'M2'.
          CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
           EXPORTING
              i_number_of_digits             = 3
              i_fltp_value                   = lt_ibsymbol-atflv
*           I_VALUE_NOT_INITIAL_FLAG       = 'X'
*           I_SCREEN_FIELDLENGTH           = 16
           IMPORTING
              e_char_field                   = atflv
                  .
          CONDENSE atflv.
          DATA:len TYPE i .
          len = STRLEN( atflv ).
          len  = len - 1.
          IF atflv+len(1) = '0'.
            atflv = atflv+0(len).
          ENDIF.

        ELSE.
          CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
               EXPORTING
                   i_number_of_digits             = 2
                   i_fltp_value                   = lt_ibsymbol-atflv
*           I_VALUE_NOT_INITIAL_FLAG       = 'X'
*           I_SCREEN_FIELDLENGTH           = 16
                IMPORTING
                   e_char_field                   = atflv
                            .
          CONDENSE atflv.
        ENDIF.

        itab-atwrt = atflv.

* 按atbez处理数字
        IF itab-atbez = 'LA值'.
          PERFORM round USING '1'.
        ELSEIF itab-atbez = '电梯设备基本代码'
            OR itab-atbez = '扶梯设备基本代码'.
          PERFORM round USING '0'.
        ELSE.

* 按单位处理数字
          IF   itab-msehi ='KWH'
            OR itab-msehi = 'DEG'.
            PERFORM round USING '1'.
          ELSEIF itab-msehi = 'MM'.
            PERFORM round USING '0'.
            PERFORM thousandth.
          ELSEIF itab-msehi = 'M2'.
          ELSEIF  itab-msehi NE 'A'
               AND itab-msehi NE 'KW'
               AND itab-msehi NE 'HZ'
               AND itab-msehi NE 'M'
               AND itab-msehi NE 'RPM'.
            PERFORM thousandth.
          ENDIF.
        ENDIF.

*  处理单位名称
        IF itab-msehi = ''.
          itab-atwtb = itab-atwrt.
        ELSE.
          IF itab-msehi = 'CHE'.
            itab-msehi = '层'.
          ELSEIF itab-msehi = 'KW'.
            itab-msehi = 'kW'.
          ELSEIF itab-msehi = 'A'.
          ELSEIF itab-msehi = 'HZ'.
            itab-msehi = '赫兹'.
          ELSEIF itab-msehi = 'RPM'.
          ELSEIF itab-msehi = 'PC'.
          ELSE.
            TRANSLATE itab-msehi TO LOWER CASE..
          ENDIF.
          CONCATENATE itab-atwrt itab-msehi INTO itab-atwtb SEPARATED BY ' '.
          itab-atwrt = itab-atwtb.
        ENDIF.

      ELSE.
        itab-atwrt = lt_ibsymbol-atwrt.

        IF itab-atwrt BETWEEN '0000' AND '9999'.
          atzhl = itab-atwrt.
*>>>    特殊情况
          IF itab-atnam = 'KLK_TUHAO'.
            atzhl = atzhl + 1.
          ELSEIF itab-atnam = 'KLK1_1000_0130'.
            atzhl = atzhl - 1.
          ENDIF.
*<<<
          READ TABLE lt_cawnt WITH KEY atinn = itab-atinn
                                             atzhl = atzhl
                                             BINARY SEARCH.
          IF sy-subrc = 0.
            itab-atwtb = lt_cawnt-atwtb.
          ELSE.
            itab-atwtb = itab-atwrt.
          ENDIF.
        ELSE.
          itab-atwtb = itab-atwrt.
        ENDIF.
      ENDIF.
      MODIFY itab.
    ENDIF.
  ENDLOOP.

  IF sjk = 'X'.
    itabs[] = itab[].
  ENDIF.
ENDFORM.                    "sqlmod

*&---------------------------------------------------------------------*
*&      Form  functionmod
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM functionmod.
  SELECT vbeln posnr cuobj INTO CORRESPONDING FIELDS OF TABLE lt_vbap FROM vbap
    WHERE vbeln IN s_vbeln
    AND   posnr IN s_posnr.



  LOOP AT lt_vbap.
    CLEAR configuration.
    REFRESH configuration.
    CALL FUNCTION 'VC_I_GET_CONFIGURATION'        "调用函数"
       EXPORTING
         instance      = lt_vbap-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.
      LOOP AT configuration.
        itabs-vbeln = lt_vbap-vbeln.
        itabs-posnr = lt_vbap-posnr.
        itabs-cuobj = lt_vbap-cuobj.
        itabs-atinn = configuration-atinn.
        itabs-atnam = configuration-atnam.
        itabs-atbez = configuration-atbez.
        itabs-atwrt = configuration-atwrt.
        itabs-atwtb = configuration-atwtb.
        APPEND itabs.
        CLEAR itabs.
        CLEAR configuration.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

ENDFORM.                    "functionmod

*&---------------------------------------------------------------------*
*&      Form  write
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write.
  SORT itabs BY atinn.
  LOOP AT itabs.
    WRITE:/ itabs-vbeln,itabs-posnr,itabs-atinn,itabs-atnam,itabs-atbez,itabs-atwrt,itabs-atwtb.
  ENDLOOP.
ENDFORM.                    "write
*&---------------------------------------------------------------------*
*&      Form  CHANGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_ITAB_ATWRT  text
*----------------------------------------------------------------------*
FORM thousandth.
  DATA: atwrt    LIKE ibsymbol-atwrt,
        zero(3),
        len      TYPE i,
        lenx     TYPE i,
        n        TYPE i.

  atwrt = itab-atwrt.
  SPLIT atwrt AT '.' INTO atwrt zero.

  IF zero = '00' OR zero = ''.
    len = STRLEN( atwrt ).
    lenx = 3.
    WHILE len > 3.
      len = len - 3.
      CONCATENATE atwrt+0(len) ',' atwrt+len(lenx) INTO atwrt.
      lenx = lenx + 4.
    ENDWHILE.
    itab-atwrt = atwrt.
  ENDIF.

ENDFORM.                    " CHANGE

*&---------------------------------------------------------------------*
*&      Form  compare
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM compare.
  DATA tabix TYPE i.

  SORT itabs BY vbeln posnr atinn atnam atbez atwrt atwtb.
  SORT itab  BY vbeln posnr atinn atnam atbez atwrt atwtb.

  LOOP AT itab.
    tabix = sy-tabix.
    READ TABLE itabs INDEX tabix.
    IF sy-subrc = 0.
*      IF    itab-vbeln = itabs-vbeln
*        AND itab-posnr = itabs-posnr
      IF itab-atinn = itabs-atinn
      AND itab-atnam = itabs-atnam
      AND itab-atbez = itabs-atbez
      AND itab-atwrt = itabs-atwrt
      AND itab-atwtb = itabs-atwtb.
      ELSE.
        lt_compare-vbelns = itab-vbeln.
        lt_compare-vbelnf = itabs-vbeln.

        lt_compare-posnrs = itab-posnr.
        lt_compare-posnrf = itabs-posnr.

        lt_compare-atinns = itab-atinn.
        lt_compare-atinnf = itabs-atinn.

        lt_compare-atnams = itab-atnam.
        lt_compare-atnamf = itabs-atnam.

        lt_compare-atbezs = itab-atbez.
        lt_compare-atbezf = itabs-atbez.

        lt_compare-atwrts = itab-atwrt.
        lt_compare-atwrtf = itabs-atwrt.

        lt_compare-atwtbs = itab-atwtb.
        lt_compare-atwtbf = itabs-atwtb.
        APPEND lt_compare.
      ENDIF.
    ELSE.
      lt_compare-vbelns = itab-vbeln.
      lt_compare-posnrs = itab-posnr.

      lt_compare-atinns = itab-atinn.

      lt_compare-atnams = itab-atnam.

      lt_compare-atbezs = itab-atbez.

      lt_compare-atwrts = itab-atwrt.

      lt_compare-atwtbs = itab-atwtb.
      APPEND lt_compare.
    ENDIF.
  ENDLOOP.

  LOOP AT itabs.
    tabix = sy-tabix.
    READ TABLE itab INDEX tabix.
    IF sy-subrc = 0.
      IF itab-atinn = itabs-atinn
          AND itab-atnam = itabs-atnam
          AND itab-atbez = itabs-atbez
          AND itab-atwrt = itabs-atwrt
          AND itab-atwtb = itabs-atwtb.
      ELSE.
        lt_compare-vbelns = itab-vbeln.
        lt_compare-vbelnf = itabs-vbeln.

        lt_compare-posnrs = itab-posnr.
        lt_compare-posnrf = itabs-posnr.

        lt_compare-atinns = itab-atinn.
        lt_compare-atinnf = itabs-atinn.

        lt_compare-atnams = itab-atnam.
        lt_compare-atnamf = itabs-atnam.

        lt_compare-atbezs = itab-atbez.
        lt_compare-atbezf = itabs-atbez.

        lt_compare-atwrts = itab-atwrt.
        lt_compare-atwrtf = itabs-atwrt.

        lt_compare-atwtbs = itab-atwtb.
        lt_compare-atwtbf = itabs-atwtb.
        APPEND lt_compare.
      ENDIF.
    ELSE.
      lt_compare-vbelnf = itabs-vbeln.
      lt_compare-posnrf = itabs-posnr.

      lt_compare-atinnf = itabs-atinn.

      lt_compare-atnamf = itabs-atnam.

      lt_compare-atbezf = itabs-atbez.

      lt_compare-atwrtf = itabs-atwrt.

      lt_compare-atwtbf = itabs-atwtb.
      APPEND lt_compare.
    ENDIF.
  ENDLOOP.

  SORT lt_compare.
  DELETE ADJACENT DUPLICATES FROM lt_compare COMPARING ALL FIELDS.

  IF lt_compare[] IS INITIAL.
    MESSAGE '没有差异' TYPE 'S'.
  ELSE.
    LOOP AT lt_compare.
      WRITE:/ lt_compare-vbelns,lt_compare-vbelnf,
              lt_compare-posnrs,lt_compare-posnrf,
              lt_compare-atinns,lt_compare-atinnf,
              lt_compare-atnams,lt_compare-atnamf,
              lt_compare-atbezs,lt_compare-atbezf,
              lt_compare-atwrts,lt_compare-atwrtf,
              lt_compare-atwtbs,lt_compare-atwtbf.
    ENDLOOP.
  ENDIF.

ENDFORM.                    "compare
*&---------------------------------------------------------------------*
*&      Form  ROUND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0398   text
*----------------------------------------------------------------------*
FORM round USING decimal.
  DATA:p0  TYPE p LENGTH 10 DECIMALS 0.
  DATA:p1  TYPE p LENGTH 10 DECIMALS 1.
  DATA:p  TYPE p LENGTH 10 DECIMALS 2.
*  CASE decimal.
*    WHEN '0'.
*      p0 = itab-atwrt.
*      itab-atwrt = p0.
*    WHEN '1'.
*      p1 = itab-atwrt.
*      itab-atwrt = p1.
*  ENDCASE.
*  CONDENSE itab-atwrt NO-GAPS.

  p = itab-atwrt.

  CASE decimal.
    WHEN '0'.

      CALL FUNCTION 'ROUND'
        EXPORTING
          decimals = decimal
          input    = p
          sign     = 'X'
        IMPORTING
          output   = p0.

      IF sy-subrc = 0.
        itab-atwrt = p0.
        CONDENSE itab-atwrt NO-GAPS.
      ENDIF.

    WHEN '1'.
      CALL FUNCTION 'ROUND'
        EXPORTING
          decimals = decimal
          input    = p
          sign     = 'X'
        IMPORTING
          output   = p1.

      IF sy-subrc = 0.
        itab-atwrt = p1.
        CONDENSE itab-atwrt NO-GAPS.
      ENDIF.
  ENDCASE.

ENDFORM.                    " ROUND
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值