【SAP Abap】SAP S/4 ABAP OPEN SQL中WITH的应用案例

SAP S/4 ABAP OPEN SQL中WITH的应用案例

1、原代码

以HD实施开发的报表《往来交易与余额表》代码为例,原代码如下:

REPORT zfir_028.
TYPE-POOLS:slis.
TABLES:t001w,skb1,acdoca,kna1,lfa1.

TYPES:BEGIN OF ty_alv,
        racct   TYPE acdoca-racct,               "科目
        txt20   TYPE skat-txt20,                 "科目描述
        kunnr   TYPE acdoca-kunnr,               "客户编码
        name1_k TYPE kna1-name1,                 "客户名称
        lifnr   TYPE acdoca-lifnr,               "供应商
        name1_l TYPE  lfa1-name1,                "供应商编码
        rwcur   TYPE acdoca-rwcur,               "币别
        wsl_q   TYPE acdoca-wsl,                 "期初余额-原币
        hsl_q   TYPE acdoca-hsl,                 "期初余额-本位币
        wsl_s   TYPE acdoca-wsl,                 "借方发生额-原币
        hsl_s   TYPE acdoca-hsl,                 "借方发生额-本位币
        wsl_h   TYPE acdoca-wsl,                 "贷方发生额-原币
        hsl_h   TYPE acdoca-hsl,                 "贷方发生额-本位币
        wsl_e   TYPE acdoca-wsl,                 "期末余额-原币
        hsl_e   TYPE acdoca-hsl,                 "期末余额-本位币
      END OF ty_alv.

TYPES: BEGIN OF ty_acdoca,
         rbukrs TYPE acdoca-rbukrs,               "公司代码
         gjahr  TYPE acdoca-gjahr,                "会计凭证号
         belnr  TYPE acdoca-belnr,                "会计年度
         docln  TYPE acdoca-docln,                "凭证行项目
*         POPER  TYPE ACDOCA-POPER,               "期间
         kunnr  TYPE acdoca-kunnr,                "客户
         lifnr  TYPE acdoca-lifnr ,               "供应商
         rwcur  TYPE acdoca-rwcur,                "币别
*         AUGDT  TYPE ACDOCA-AUGDT,               "清算日期
         drcrk  TYPE acdoca-drcrk,                "借贷项标识
         racct  TYPE acdoca-racct,                "科目
         wsl    TYPE acdoca-wsl,                  "凭证金额
         hsl    TYPE acdoca-hsl,                  "本位币金额
       END OF ty_acdoca.
TYPES: BEGIN OF ty_kna1,
         kunnr   TYPE kna1-kunnr,
         name1_k TYPE kna1-name1,
       END OF ty_kna1.

TYPES: BEGIN OF ty_lfa1,
         lifnr   TYPE lfa1-lifnr,
         name1_l TYPE lfa1-name1,
       END OF ty_lfa1,

       BEGIN OF ty_skat,
         saknr TYPE skat-saknr,
         txt20 TYPE skat-txt20,
       END OF ty_skat.

DATA:
  t_acdoca1c TYPE STANDARD TABLE OF ty_acdoca,
  w_acdoca1c TYPE ty_acdoca,
  t_acdoca2c TYPE STANDARD TABLE OF ty_acdoca,
  w_acdoca2c TYPE ty_acdoca,
  t_acdoca3c TYPE STANDARD TABLE OF ty_acdoca,
  w_acdoca3c TYPE ty_acdoca,
  t_acdoca   TYPE STANDARD TABLE OF ty_acdoca,
  w_acdoca   TYPE ty_acdoca,
  t_acdoca1  TYPE STANDARD TABLE OF ty_acdoca,
  w_acdoca1  TYPE ty_acdoca,
  t_acdoca2  TYPE STANDARD TABLE OF ty_acdoca,
  w_acdoca2  TYPE ty_acdoca,
  t_acdoca3  TYPE STANDARD TABLE OF ty_acdoca,
  w_acdoca3  TYPE ty_acdoca,
  t_lfa1     TYPE STANDARD TABLE OF ty_lfa1,
  w_lfa1     TYPE ty_lfa1,
  t_kna1     TYPE STANDARD TABLE OF ty_kna1,
  w_kna1     TYPE ty_kna1,
  t_alv      TYPE STANDARD TABLE OF ty_alv,
  w_alv      TYPE ty_alv,
  t_skat     TYPE STANDARD TABLE OF ty_skat,
  w_skat     TYPE ty_skat,
  t_fieldcat TYPE slis_t_fieldcat_alv,
  w_fieldcat TYPE slis_fieldcat_alv,
  w_layout   TYPE slis_layout_alv.

SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_bukrs TYPE t001-bukrs  OBLIGATORY DEFAULT '1000',
              p_gjahr TYPE acdoca-gjahr OBLIGATORY DEFAULT sy-datum+0(4).
  SELECT-OPTIONS: s_poper FOR acdoca-poper OBLIGATORY DEFAULT sy-datum+4(2),
                  s_racct FOR skb1-saknr OBLIGATORY,
                  s_kunnr FOR kna1-kunnr ,
                  s_lifnr FOR lfa1-lifnr .
SELECTION-SCREEN END OF BLOCK blk.

AT SELECTION-SCREEN ON p_bukrs.
  PERFORM check_purview.  "检查公司代码

START-OF-SELECTION.
* 读取数据
  PERFORM frm_get_data.
* 处理数据
  PERFORM frm_handle_data.
* 报表显示
  PERFORM frm_show_data.
*&---------------------------------------------------------------------*
* END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.

*----------------------------------------------------------------------*
FORM check_purview .
*******************权限检查
  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
                     ID 'BUKRS' FIELD p_bukrs
                     ID 'ACTVT' FIELD '03'.

  IF sy-subrc <> 0.
    MESSAGE '没有该公司代码的权限!' TYPE 'E' .
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
* 读取数据
*----------------------------------------------------------------------*

FORM frm_get_data .

  DATA: lv_start TYPE sy-datum.

  CONCATENATE p_gjahr s_poper-low+1(2) '01' INTO lv_start.

  IF s_poper-low  = '01'.
*****查询期初数据*******
    SELECT  rbukrs
          gjahr
          belnr
          docln
          racct
          kunnr
          lifnr
          rwcur
          drcrk
          wsl
          hsl
    INTO CORRESPONDING FIELDS OF TABLE t_acdoca1
    FROM acdoca
    WHERE rbukrs = p_bukrs
    AND   ( gjahr < p_gjahr )
    AND   racct IN s_racct
    AND   bttype <> 'RFBC'
    AND   blart  <> 'AB' 
    AND   kunnr IN s_kunnr
    AND   lifnr IN s_lifnr
    AND   ( augdt = '00000000' OR augdt >= lv_start ).

  ELSE.
    SELECT  rbukrs
            gjahr
            belnr
            docln
            racct
            kunnr
            lifnr
            rwcur
            drcrk
            wsl
            hsl
      INTO CORRESPONDING FIELDS OF TABLE t_acdoca1
      FROM acdoca
      WHERE rbukrs = p_bukrs
      AND   ( gjahr < p_gjahr OR ( gjahr = p_gjahr  AND   poper < s_poper-low ) )
      AND   bttype <> 'RFBC'
      AND   blart  <> 'AB' 
      AND   racct IN s_racct
      AND   kunnr IN s_kunnr
      AND   lifnr IN s_lifnr
      AND   ( augdt = '00000000' OR augdt >= lv_start ).
  ENDIF.
*******查询借方数据*******

  SELECT rbukrs
         gjahr
         belnr
         docln
         racct
         kunnr
         lifnr
         rwcur
         drcrk
         wsl
         hsl
  INTO CORRESPONDING FIELDS OF TABLE t_acdoca2
  FROM acdoca
  WHERE rbukrs =  p_bukrs
    AND gjahr = p_gjahr
    AND blart  <> 'AB'
    AND racct IN s_racct
    AND kunnr IN s_kunnr
    AND lifnr IN s_lifnr
    AND poper IN s_poper
    AND drcrk = 'S'.

******查询贷方数据********
  SELECT rbukrs
        gjahr
        belnr
        docln
        racct
        kunnr
        lifnr
        rwcur
        drcrk
        wsl
        hsl
 INTO CORRESPONDING FIELDS OF TABLE t_acdoca3
 FROM acdoca
 WHERE rbukrs =  p_bukrs
   AND gjahr = p_gjahr
   AND blart  <> 'AB'
   AND racct IN s_racct
   AND kunnr IN s_kunnr
   AND lifnr IN s_lifnr
   AND poper IN s_poper
   AND drcrk = 'H'.


********期初按照客户&供应商&币别&科目合计*****

  LOOP AT t_acdoca1 INTO w_acdoca1.
    w_acdoca1c-kunnr = w_acdoca1-kunnr.
    w_acdoca1c-lifnr = w_acdoca1-lifnr.
    w_acdoca1c-rwcur = w_acdoca1-rwcur.
    w_acdoca1c-racct = w_acdoca1-racct.
    w_acdoca1c-wsl = w_acdoca1-wsl.
    w_acdoca1c-hsl = w_acdoca1-hsl.
    COLLECT w_acdoca1c INTO t_acdoca1c.
  ENDLOOP.

  SORT t_acdoca1c BY racct kunnr lifnr rwcur .

*******借方发生合计*******
  LOOP AT t_acdoca2 INTO w_acdoca2.
    w_acdoca2c-kunnr = w_acdoca2-kunnr.
    w_acdoca2c-lifnr = w_acdoca2-lifnr.
    w_acdoca2c-rwcur = w_acdoca2-rwcur.
    w_acdoca2c-racct = w_acdoca2-racct.
    w_acdoca2c-wsl = w_acdoca2-wsl.
    w_acdoca2c-hsl = w_acdoca2-hsl.
    COLLECT w_acdoca2c INTO t_acdoca2c.
  ENDLOOP.

  SORT t_acdoca2c BY racct kunnr lifnr rwcur .
*******贷方发生合计*******
  LOOP AT t_acdoca3 INTO w_acdoca3.
    w_acdoca3c-kunnr = w_acdoca3-kunnr.
    w_acdoca3c-lifnr = w_acdoca3-lifnr.
    w_acdoca3c-rwcur = w_acdoca3-rwcur.
    w_acdoca3c-racct = w_acdoca3-racct.
    w_acdoca3c-wsl = 0 - w_acdoca3-wsl.
    w_acdoca3c-hsl = 0 - w_acdoca3-hsl.
    COLLECT w_acdoca3c INTO t_acdoca3c.
  ENDLOOP.

  SORT t_acdoca3c BY racct kunnr lifnr rwcur .
*******合并所有的客户与供应商清单+币别*科目*****
  LOOP AT t_acdoca1c INTO w_acdoca1c.
    w_acdoca-kunnr = w_acdoca1c-kunnr.
    w_acdoca-lifnr = w_acdoca1c-lifnr.
    w_acdoca-racct = w_acdoca1c-racct.
    w_acdoca-rwcur = w_acdoca1c-rwcur.
    APPEND w_acdoca TO t_acdoca.
    CLEAR w_acdoca.
  ENDLOOP.
  LOOP AT t_acdoca2c INTO w_acdoca2c.
    w_acdoca-kunnr = w_acdoca2c-kunnr.
    w_acdoca-lifnr = w_acdoca2c-lifnr.
    w_acdoca-racct = w_acdoca2c-racct.
    w_acdoca-rwcur = w_acdoca2c-rwcur.
    APPEND w_acdoca TO t_acdoca.
    CLEAR w_acdoca.
  ENDLOOP.
  LOOP AT t_acdoca3c INTO w_acdoca3c.
    w_acdoca-kunnr = w_acdoca3c-kunnr.
    w_acdoca-lifnr = w_acdoca3c-lifnr.
    w_acdoca-racct = w_acdoca3c-racct.
    w_acdoca-rwcur = w_acdoca3c-rwcur.
    APPEND w_acdoca TO t_acdoca.
    CLEAR w_acdoca.
  ENDLOOP.

  SORT t_acdoca BY racct kunnr lifnr rwcur.

  DELETE ADJACENT DUPLICATES FROM t_acdoca COMPARING ALL FIELDS.

********读取科目描述、客户描述、供应商描述*&***********
  IF t_acdoca[] IS NOT INITIAL.
    SELECT
      saknr
      txt20
    INTO CORRESPONDING FIELDS OF TABLE t_skat
    FROM skat
    FOR ALL ENTRIES IN t_acdoca
    WHERE saknr = t_acdoca-racct
      AND ktopl = '1000'
      AND spras = '1'.

    SORT t_skat BY saknr.

    SELECT
      kunnr
      name1 AS name1_k
    INTO CORRESPONDING FIELDS OF TABLE t_kna1
    FROM kna1
    FOR ALL ENTRIES IN t_acdoca
    WHERE kunnr = t_acdoca-kunnr.

    SORT t_kna1 BY kunnr.

    SELECT
      lifnr
      name1 AS name1_l
    INTO CORRESPONDING FIELDS OF TABLE t_lfa1
    FROM lfa1
    FOR ALL ENTRIES IN t_acdoca
    WHERE lifnr = t_acdoca-lifnr.

    SORT t_lfa1 BY lifnr.
  ENDIF.
**********
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_HANDLE_DATA
*&---------------------------------------------------------------------*
*      处理数据
*----------------------------------------------------------------------*
FORM frm_handle_data.

*****循环读数赋值*******
  LOOP AT t_acdoca INTO w_acdoca.
    w_alv-racct = w_acdoca-racct.
    w_alv-kunnr = w_acdoca-kunnr.
    w_alv-lifnr = w_acdoca-lifnr.
    w_alv-rwcur = w_acdoca-rwcur.
    READ TABLE t_acdoca1c INTO w_acdoca1c WITH KEY racct  =  w_acdoca-racct kunnr = w_acdoca-kunnr lifnr = w_acdoca-lifnr rwcur = w_acdoca-rwcur BINARY SEARCH.
    IF sy-subrc = 0.
      w_alv-wsl_q = w_acdoca1c-wsl.
      w_alv-hsl_q = w_acdoca1c-hsl.
    ENDIF.
    READ TABLE t_acdoca2c INTO w_acdoca2c WITH KEY racct  =  w_acdoca-racct kunnr = w_acdoca-kunnr lifnr = w_acdoca-lifnr rwcur = w_acdoca-rwcur BINARY SEARCH.
    IF sy-subrc = 0.
      w_alv-wsl_s = w_acdoca2c-wsl.
      w_alv-hsl_s = w_acdoca2c-hsl.
    ENDIF.
    READ TABLE t_acdoca3c INTO w_acdoca3c WITH KEY racct  =  w_acdoca-racct kunnr = w_acdoca-kunnr lifnr = w_acdoca-lifnr rwcur = w_acdoca-rwcur BINARY SEARCH.
    IF sy-subrc = 0.
      w_alv-wsl_h = w_acdoca3c-wsl.
      w_alv-hsl_h = w_acdoca3c-hsl.
    ENDIF.
    w_alv-wsl_e = w_alv-wsl_q + w_alv-wsl_s - w_alv-wsl_h.
    w_alv-hsl_e = w_alv-hsl_q + w_alv-hsl_s - w_alv-hsl_h.
*    IF W_ALV-RACCT >='2000000000'.
*      W_ALV-WSL_Q = 0 - W_ALV-WSL_Q .
*      W_ALV-HSL_Q = 0 - W_ALV-HSL_Q .
*      W_ALV-WSL_S = 0 - W_ALV-WSL_S .
*      W_ALV-HSL_S = 0 - W_ALV-HSL_S .
    w_alv-wsl_h = 0 - w_alv-wsl_h .
    w_alv-hsl_h = 0 - w_alv-hsl_h .
*      W_ALV-WSL_E = 0 - W_ALV-WSL_E .
*      W_ALV-HSL_E = 0 - W_ALV-HSL_E .
*    ENDIF.
    READ TABLE t_skat INTO w_skat WITH KEY saknr = w_acdoca-racct BINARY SEARCH.
    IF sy-subrc = 0.
      w_alv-txt20 = w_skat-txt20.
    ENDIF.
    READ  TABLE t_kna1 INTO w_kna1 WITH KEY kunnr = w_acdoca-kunnr BINARY SEARCH.
    IF sy-subrc = 0.
      w_alv-name1_k = w_kna1-name1_k.
    ENDIF.
    READ TABLE t_lfa1 INTO w_lfa1 WITH KEY lifnr = w_acdoca-lifnr BINARY SEARCH.
    IF sy-subrc = 0.
      w_alv-name1_l = w_lfa1-name1_l.
    ENDIF.
    PERFORM conversion_exit_alpha_output CHANGING w_alv-kunnr.
    PERFORM conversion_exit_alpha_output CHANGING w_alv-lifnr.
    APPEND w_alv TO t_alv.
    CLEAR w_alv.
  ENDLOOP.
  DELETE t_alv WHERE  wsl_q = '0.00' AND hsl_q = '0.00' AND wsl_s = '0.00' AND hsl_s = '0.00' AND wsl_h = '0.00' AND hsl_h = '0.00' AND wsl_e = '0.00' AND hsl_e = '0.00'.
  SORT t_alv BY racct kunnr lifnr rwcur.


ENDFORM.                    " FRM_HANDLE_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*       显示数据
*----------------------------------------------------------------------*

FORM frm_show_data .

* 设置显示目录
  PERFORM frm_fieldcat USING:
*--------------------------------------------------------------------*
* 关键字  复选框  编辑  单击  对齐  字段名  字段描述
*--------------------------------------------------------------------*
   ' '     ' '    ' '    ' '  'R'   'RACCT'   '总账科目',
   ' '     ' '    ' '    ' '  'L'   'TXT20'   '科目描述',
   ' '     ' '    ' '    ' '  'R'   'KUNNR'   '客户编号',
   ' '     ' '    ' '    ' '  'L'   'NAME1_K'   '客户描述',
   ' '     ' '    ' '    ' '  'R'   'LIFNR'   '供应商编码',
   ' '     ' '    ' '    ' '  'R'   'NAME1_L'   '供应商描述',
   ' '     ' '    ' '    ' '  'R'   'RWCUR'   '币别',
   ' '     ' '    ' '    ' '  'R'   'WSL_Q'   '期初原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_Q'   '期初本币',
   ' '     ' '    ' '    ' '  'R'   'WSL_S'   '期间借方发生额-原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_S'   '期间借方发生额-本位币',
   ' '     ' '    ' '    ' '  'R'   'WSL_H'   '期间贷方发生额-原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_H'   '期间贷方发生额-本位币',
   ' '     ' '    ' '    ' '  'R'   'WSL_E'   '期末原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_E'   '期末本位币'
   .

* 设置显示格式
  PERFORM frm_layout.
* ALV显示
  PERFORM frm_alv_show.
ENDFORM.                    " FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_FIELDCAT
*&---------------------------------------------------------------------*
*       设置目录
*----------------------------------------------------------------------*
FORM frm_fieldcat  USING
                         fu_key
                         fu_checkbox
                         fu_edit
                         fu_hotspot
                         fu_just
                         fu_fieldname
                         fu_seltext.
  CLEAR w_fieldcat.

  w_fieldcat-key           = fu_key.
  w_fieldcat-checkbox      = fu_checkbox.
  w_fieldcat-edit          = fu_edit.
  w_fieldcat-hotspot       = fu_hotspot.
  w_fieldcat-just          = fu_just.
  w_fieldcat-fieldname     = fu_fieldname.
  w_fieldcat-seltext_s     = fu_seltext.
  w_fieldcat-seltext_m     = fu_seltext.
  w_fieldcat-seltext_l     = fu_seltext.

  APPEND w_fieldcat TO t_fieldcat.
ENDFORM.                    "frm_fieldcat
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT
*&---------------------------------------------------------------------*
*      设置数据格式
*----------------------------------------------------------------------*

FORM frm_layout .
  w_layout-zebra = 'X'.
  w_layout-colwidth_optimize = 'X'.
ENDFORM.                    " FRM_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_SHOW
*&---------------------------------------------------------------------*
*       alv显示
*----------------------------------------------------------------------*

FORM frm_alv_show .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_PF_STATUS'
      is_layout                = w_layout
      it_fieldcat              = t_fieldcat
      i_default                = 'X'
      i_save                   = 'A'
    TABLES
      t_outtab                 = t_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " FRM_ALV_SHOW
*&---------------------------------------------------------------------*
*&      Form  PF_STATUS
*&---------------------------------------------------------------------*
*       设置工具栏
*----------------------------------------------------------------------*
FORM frm_pf_status USING fu_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' EXCLUDING fu_extab.
ENDFORM.                    "frm_pf_status
*&---------------------------------------------------------------------*
*&      Form  CONVERSION_EXIT_ALPHA_OUTPUT
*&---------------------------------------------------------------------*
*       前置零转出
*----------------------------------------------------------------------*
FORM conversion_exit_alpha_output CHANGING fc_alpha.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      input  = fc_alpha
    IMPORTING
      output = fc_alpha.
ENDFORM.                " CONVERSION_EXIT_ALPHA_OUTPut
*&---------------------------------------------------------------------*
*&      Form  CONVERSION_EXIT_CUNIT_OUTPUT
*&---------------------------------------------------------------------*
*       内外部单位转换
*----------------------------------------------------------------------*
FORM conversion_exit_cunit_output CHANGING fc_cunit.
  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
    EXPORTING
      input    = fc_cunit
      language = sy-langu
    IMPORTING
      output   = fc_cunit.
ENDFORM.                " CONVERSION_EXIT_CUINT_OUTPut

2、调整后代码

保持逻辑不变,主要对其中的两个FORM(frm_get_data和frm_handle_data)进行改造,合并为一个FORM(frm_get_data),调整后代码如下:

REPORT zfir_028n.
TYPE-POOLS:slis.
TABLES:skb1,acdoca,kna1,lfa1.

TYPES:BEGIN OF ty_alv,
        racct   TYPE acdoca-racct,               "科目
        txt20   TYPE skat-txt20,                 "科目描述
        kunnr   TYPE acdoca-kunnr,               "客户编码
        name1_k TYPE kna1-name1,                 "客户名称
        lifnr   TYPE acdoca-lifnr,               "供应商
        name1_l TYPE  lfa1-name1,                "供应商编码
        rwcur   TYPE acdoca-rwcur,               "币别
        wsl_q   TYPE acdoca-wsl,                 "期初余额-原币
        hsl_q   TYPE acdoca-hsl,                 "期初余额-本位币
        wsl_s   TYPE acdoca-wsl,                 "借方发生额-原币
        hsl_s   TYPE acdoca-hsl,                 "借方发生额-本位币
        wsl_h   TYPE acdoca-wsl,                 "贷方发生额-原币
        hsl_h   TYPE acdoca-hsl,                 "贷方发生额-本位币
        wsl_e   TYPE acdoca-wsl,                 "期末余额-原币
        hsl_e   TYPE acdoca-hsl,                 "期末余额-本位币
      END OF ty_alv.

DATA:
  t_alv      TYPE STANDARD TABLE OF ty_alv,
  t_fieldcat TYPE slis_t_fieldcat_alv,
  w_fieldcat TYPE slis_fieldcat_alv,
  w_layout   TYPE slis_layout_alv.

SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_bukrs TYPE t001-bukrs  OBLIGATORY DEFAULT '1000',
              p_gjahr TYPE acdoca-gjahr OBLIGATORY DEFAULT sy-datum+0(4).
  SELECT-OPTIONS: s_poper FOR acdoca-poper OBLIGATORY DEFAULT sy-datum+4(2),
                  s_racct FOR skb1-saknr OBLIGATORY,
                  s_kunnr FOR kna1-kunnr ,
                  s_lifnr FOR lfa1-lifnr .
SELECTION-SCREEN END OF BLOCK blk.

AT SELECTION-SCREEN ON p_bukrs.
  PERFORM check_purview.  "检查公司代码

START-OF-SELECTION.
* 读取数据
  PERFORM frm_get_data.
* 报表显示
  PERFORM frm_show_data.

END-OF-SELECTION.

*----------------------------------------------------------------------*
FORM check_purview .
*******************权限检查
  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
                     ID 'BUKRS' FIELD p_bukrs
                     ID 'ACTVT' FIELD '03'.

  IF sy-subrc <> 0.
    MESSAGE '没有该公司代码的权限!' TYPE 'E' .
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
* 读取数据
*----------------------------------------------------------------------*
FORM frm_get_data .

  DATA: lv_start TYPE sy-datum.
  CONCATENATE p_gjahr s_poper-low+1(2) '01' INTO lv_start.

   WITH
   "获取期初数据
   +acdoca_qc AS (
    SELECT
      racct, kunnr, lifnr, rwcur, SUM( wsl ) AS wsl, SUM( hsl ) AS hsl
    FROM acdoca
    WHERE rbukrs = @p_bukrs
      AND ( gjahr < @p_gjahr OR ( gjahr = @p_gjahr AND poper < @s_poper-low ) )
      AND racct IN @s_racct
      AND kunnr IN @s_kunnr
      AND lifnr IN @s_lifnr
      AND bttype <> 'RFBC'      "余额结转
      "AND blart  <> 'AB'       "调整仅本期剔除AB凭证类型,期初保留AB类型
      AND ( augdt = '00000000' OR augdt >= @lv_start )
      "AND RCLNT in ( 400, 710, 800 )
    GROUP BY racct, kunnr, lifnr, rwcur ),
    "获取本期数据,通过 drcrk 区分借方 S、贷方 H
    +acdoca_bq AS (
    SELECT
      racct, kunnr, lifnr, rwcur, SUM( wsl ) AS wsl, SUM( hsl ) AS hsl, drcrk
    FROM acdoca
    WHERE rbukrs = @p_bukrs
      AND gjahr = @p_gjahr
      AND poper IN @s_poper
      AND racct IN @s_racct
      AND kunnr IN @s_kunnr
      AND lifnr IN @s_lifnr
      AND bttype <> 'RFBC'
      AND blart  <> 'AB'
      AND drcrk IN ( 'S', 'H' )     "借方 S、贷方 H
      "AND RCLNT in ( 400, 710, 800 )
    GROUP BY racct, kunnr, lifnr, rwcur, drcrk ),
    "获取公共数据项
    +header_list AS (
      SELECT t1~racct, t1~kunnr, t1~lifnr, t1~rwcur FROM +acdoca_qc AS t1
      UNION
      SELECT t2~racct, t2~kunnr, t2~lifnr, t2~rwcur FROM +acdoca_bq AS t2
    ),
    "计算数据
    +data_list AS (
    SELECT h~racct, h~kunnr, h~lifnr, h~rwcur,
      coalesce( qc~wsl,0 ) AS wsl_q, coalesce( qc~hsl,0 ) AS hsl_q,
      coalesce( bq_jf~wsl,0 ) AS wsl_s, coalesce( bq_jf~hsl,0 ) AS hsl_S,
      coalesce( bq_df~wsl,0 ) AS wsl_h, coalesce( bq_df~hsl,0 ) AS hsl_H,
      coalesce( qc~wsl,0 ) + coalesce( bq_jf~wsl,0 ) + coalesce( bq_df~wsl,0 ) AS wsl_E,
      coalesce( qc~hsl,0 ) + coalesce( bq_jf~hsl,0 ) + coalesce( bq_df~hsl,0 ) AS hsl_E
    FROM +header_list AS h
    LEFT JOIN +acdoca_qc AS qc ON qc~racct = h~racct AND qc~kunnr = h~kunnr
      AND qc~lifnr = h~lifnr AND qc~rwcur = h~rwcur
    LEFT JOIN +acdoca_bq AS bq_jf ON bq_jf~racct = h~racct AND bq_jf~kunnr = h~kunnr
      AND bq_jf~lifnr = h~lifnr AND bq_jf~rwcur = h~rwcur AND bq_jf~drcrk = 'S'
    LEFT JOIN +acdoca_bq AS bq_df ON bq_df~racct = h~racct AND bq_df~kunnr = h~kunnr
      AND bq_df~lifnr = h~lifnr AND bq_df~rwcur = h~rwcur AND bq_df~drcrk = 'H' )
   "输出数据
   SELECT a~racct, skat~txt20, a~kunnr, kna1~name1 AS name1_k, a~lifnr, lfa1~name1 AS name1_l, a~rwcur,
   	  wsl_q, hsl_q, wsl_s, hsl_S, wsl_h, hsl_H, wsl_E, hsl_E
   FROM +data_list AS a
   LEFT JOIN skat ON skat~spras = '1' AND skat~ktopl = '1000' AND skat~saknr = a~racct "AND skat~mandt in ( 400, 710, 800 )
   LEFT JOIN kna1 ON kna1~kunnr = a~kunnr "AND kna1~mandt in ( 400, 710, 800 )
   LEFT JOIN lfa1 ON lfa1~lifnr = a~lifnr "AND lfa1~mandt in ( 400, 710, 800 )
   WHERE ( abs( wsl_q ) + abs( wsl_s ) + abs( wsl_h ) ) > 0
   INTO TABLE @t_alv.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*       显示数据
*----------------------------------------------------------------------*

FORM frm_show_data .

* 设置显示目录
  PERFORM frm_fieldcat USING:
*--------------------------------------------------------------------*
* 关键字  复选框  编辑  单击  对齐  字段名  字段描述
*--------------------------------------------------------------------*
   ' '     ' '    ' '    ' '  'R'   'RACCT'   '总账科目',
   ' '     ' '    ' '    ' '  'L'   'TXT20'   '科目描述',
   ' '     ' '    ' '    ' '  'R'   'KUNNR'   '客户编号',
   ' '     ' '    ' '    ' '  'L'   'NAME1_K'   '客户描述',
   ' '     ' '    ' '    ' '  'R'   'LIFNR'   '供应商编码',
   ' '     ' '    ' '    ' '  'R'   'NAME1_L'   '供应商描述',
   ' '     ' '    ' '    ' '  'R'   'RWCUR'   '币别',
   ' '     ' '    ' '    ' '  'R'   'WSL_Q'   '期初原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_Q'   '期初本币',
   ' '     ' '    ' '    ' '  'R'   'WSL_S'   '期间借方发生额-原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_S'   '期间借方发生额-本位币',
   ' '     ' '    ' '    ' '  'R'   'WSL_H'   '期间贷方发生额-原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_H'   '期间贷方发生额-本位币',
   ' '     ' '    ' '    ' '  'R'   'WSL_E'   '期末原币',
   ' '     ' '    ' '    ' '  'R'   'HSL_E'   '期末本位币'
   .

* 设置显示格式
  PERFORM frm_layout.
* ALV显示
  PERFORM frm_alv_show.
ENDFORM.                    " FRM_SHOW_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_FIELDCAT
*&---------------------------------------------------------------------*
*       设置目录
*----------------------------------------------------------------------*
FORM frm_fieldcat  USING
                         fu_key
                         fu_checkbox
                         fu_edit
                         fu_hotspot
                         fu_just
                         fu_fieldname
                         fu_seltext.
  CLEAR w_fieldcat.

  w_fieldcat-key           = fu_key.
  w_fieldcat-checkbox      = fu_checkbox.
  w_fieldcat-edit          = fu_edit.
  w_fieldcat-hotspot       = fu_hotspot.
  w_fieldcat-just          = fu_just.
  w_fieldcat-fieldname     = fu_fieldname.
  w_fieldcat-seltext_s     = fu_seltext.
  w_fieldcat-seltext_m     = fu_seltext.
  w_fieldcat-seltext_l     = fu_seltext.

  APPEND w_fieldcat TO t_fieldcat.
ENDFORM.                    "frm_fieldcat
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT
*&---------------------------------------------------------------------*
*      设置数据格式
*----------------------------------------------------------------------*

FORM frm_layout .
  w_layout-zebra = 'X'.
  w_layout-colwidth_optimize = 'X'.
ENDFORM.                    " FRM_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_SHOW
*&---------------------------------------------------------------------*
*       alv显示
*----------------------------------------------------------------------*

FORM frm_alv_show .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_PF_STATUS'
      is_layout                = w_layout
      it_fieldcat              = t_fieldcat
      i_default                = 'X'
      i_save                   = 'A'
    TABLES
      t_outtab                 = t_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " FRM_ALV_SHOW

*&---------------------------------------------------------------------*
*&      Form  PF_STATUS
*&---------------------------------------------------------------------*
*       设置工具栏
*----------------------------------------------------------------------*
FORM frm_pf_status USING fu_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' EXCLUDING fu_extab.
ENDFORM.                    "frm_pf_status

*&---------------------------------------------------------------------*
*&      Form  CONVERSION_EXIT_ALPHA_OUTPUT
*&---------------------------------------------------------------------*
*       前置零转出
*----------------------------------------------------------------------*
FORM conversion_exit_alpha_output CHANGING fc_alpha.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      input  = fc_alpha
    IMPORTING
      output = fc_alpha.
ENDFORM.                " CONVERSION_EXIT_ALPHA_OUTPut

*&---------------------------------------------------------------------*
*&      Form  CONVERSION_EXIT_CUNIT_OUTPUT
*&---------------------------------------------------------------------*
*       内外部单位转换
*----------------------------------------------------------------------*
FORM conversion_exit_cunit_output CHANGING fc_cunit.
  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
    EXPORTING
      input    = fc_cunit
      language = sy-langu
    IMPORTING
      output   = fc_cunit.
ENDFORM.                " CONVERSION_EXIT_CUINT_OUTPut

3、对比

(1)原方法:
优点:逻辑分层,比较容易理解;代码可调试
缺点:代码冗长,多次访问数据库,多次循环操作,数据量大的时候代码效率低
(2)新方法:
优点:代码精简,一次访问数据库,减少循环操作,充分利用hana内存计算性能,能保证数据量大的时候代码效率
缺点:代码不好调试,需借助hana studio查询验证脚本

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Contents Foreword ...................................................................................... 15 Preface .......................................................................................... 17 Introduction ................................................................................. 19 PART I Basic Principles 1 Overview of SAP HANA ................................................ 29 1.1 Software Components of SAP HANA .............................. 29 1.1.1 SAP HANA Database ......................................... 31 1.1.2 SAP HANA Studio ............................................. 31 1.1.3 SAP HANA Client .............................................. 33 1.1.4 SAP HANA Function Libraries ........................... 34 1.1.5 Software for Data Replication ............................ 34 1.1.6 Software for Direct Data Access ........................ 35 1.1.7 Lifecycle Management Components .................. 36 1.2 Basic Principles of In-Memory Technology ..................... 37 1.2.1 Hardware Innovations ....................................... 37 1.2.2 Software Innovations ......................................... 41 1.3 Architecture of the In-Memory Database ....................... 51 1.4 Application Cases for SAP HANA ................................... 53 1.5 How SAP HANA Affects Application Development ........ 56 1.5.1 New Technical Options ..................................... 56 1.5.2 Code Pushdown ................................................ 57 1.5.3 Database as Whitebox ....................................... 59 1.5.4 Required Qualifications for Developers ............. 61 2 Introducing the Development Environment ................. 63 2.1 Overview of Eclipse ....................................................... 63 2.2 SAP’s Eclipse Strategy .................................................... 66 2.2.1 Unbundling of Eclipse and SAP Software ........... 67 2.2.2 Central Update Site ........................................... 67 2.3 Installing the Development Environment ....................... 69 2.3.1 Installing SAP HANA Studio .............................. 69 8 Contents 2.3.2 Installing the ABAP Development Tools for SAP NetWeaver ................................................. 70 2.4 Getting Started in the Development System ................... 72 2.4.1 Basic Principles of Eclipse .................................. 72 2.4.2 ABAP Development Tools for SAP NetWeaver ... 75 2.4.3 SAP HANA Studio ............................................. 85 3 Database Programming Using SAP NetWeaver AS ABAP ........................................................................ 103 3.1 SAP NetWeaver AS ABAP Architecture .......................... 105 3.1.1 Database Interface ............................................ 107 3.1.2 Role of the Database for the ABAP Application Server ............................................. 109 3.1.3 Data Types ........................................................ 110 3.2 ABAP Database Access .................................................. 116 3.2.1 ABAP Data Dictionary ....................................... 117 3.2.2 Open SQL ......................................................... 122 3.2.3 Database Views in the ABAP Data Dictionary .... 132 3.2.4 Database Access via Native SQL ........................ 133 3.2.5 Secondary Database Connections ...................... 139 3.3 Analyzing Database Accesses Using the SQL Trace ......... 143 3.3.1 Statement Transformations ................................ 143 3.3.2 Secondary Connections ..................................... 150 3.3.3 Native SQL ........................................................ 151 3.3.4 Buffer ................................................................ 152 PART II Introduction to ABAP Programming with SAP HANA 4 View Modeling in SAP HANA Studio ........................... 157 4.1 Attribute Views ............................................................. 160 4.1.1 Basic Principles ................................................. 161 4.1.2 Creating Attribute Views ................................... 164 4.1.3 Calculated Fields ............................................... 172 4.1.4 Hierarchies ........................................................ 174 4.1.5 Attribute Views for Time Values ........................ 176 9 Contents 4.1.6 Runtime Artifacts and SQL Access for Attribute Views ................................................. 179 4.2 Analytic Views ............................................................... 180 4.2.1 Basic Principles ................................................. 181 4.2.2 Creating Analytic Views ..................................... 183 4.2.3 Calculated Key Figures ...................................... 186 4.2.4 Currency Conversion and Unit Conversion ........ 187 4.2.5 Runtime Artifacts and SQL Access for Analytic Views .................................................. 191 4.3 Calculation Views .......................................................... 192 4.3.1 Basic Principles ................................................. 193 4.3.2 Graphical Modeling of Calculation Views .......... 195 4.3.3 Implementing Calculation Views via SQLScript .......................................................... 197 4.3.4 Runtime Artifacts and SQL Access for Calculation Views .............................................. 202 4.4 Accessing Column Views via Microsoft Excel .................. 203 4.5 Using SAP HANA Views in ABAP ................................... 205 4.5.1 Access via Native SQL ....................................... 205 4.5.2 External Views in the ABAP Data Dictionary ...... 207 4.5.3 Options for Accessing External Views ................ 210 4.5.4 Recommendations ............................................ 211 5 Programming Options in SAP HANA ............................ 215 5.1 Overview of SQLScript ................................................... 215 5.1.1 Qualities of SQLScript ....................................... 216 5.1.2 Processing SQLScript ......................................... 222 5.2 Implementing Database Procedures ............................... 223 5.2.1 Basic Principles of Database Procedures ............ 223 5.2.2 Creating Database Procedures ........................... 225 5.2.3 Using Variables .................................................. 237 5.2.4 Calculation Engine Plan Operator ..................... 239 5.2.5 Imperative Enhancements ................................. 250 5.2.6 Accessing System Fields .................................... 252 5.2.7 Error Handling ................................................... 254 5.3 Using Procedures in ABAP ............................................. 255 5.3.1 Access Using Native SQL ................................... 256 10 Contents 5.3.2 Defining Database Procedure Proxies ................ 263 5.3.3 Calling Database Procedure Proxies ................... 265 5.3.4 Adjusting Database Procedure Proxies ............... 267 6 Application Transport ................................................... 269 6.1 Basic Principles of the Transport System ......................... 271 6.1.1 Transport in SAP NetWeaver AS ABAP .............. 271 6.1.2 Transport in SAP HANA ..................................... 276 6.2 Combined ABAP/SAP HANA Transport .......................... 285 6.2.1 HANA Transport Container ................................ 286 6.2.2 Enhanced Transport System ............................... 292 7 Runtime and Error Analysis with SAP HANA ............... 293 7.1 Overview of the Tools Available ..................................... 294 7.2 Error Analysis ................................................................. 296 7.2.1 Unit Tests .......................................................... 296 7.2.2 Dump Analysis .................................................. 299 7.2.3 Tracing in SQLScript .......................................... 301 7.2.4 Debugging SQLScript ........................................ 302 7.3 ABAP Code Analysis ...................................................... 305 7.3.1 Checks and Check Variants ................................ 305 7.3.2 Checks in the Development Infrastructure ......... 309 7.3.3 Global Check Runs in the System ...................... 311 7.4 Runtime Statistics and Traces ......................................... 313 7.4.1 Runtime Statistics .............................................. 314 7.4.2 ABAP Trace and ABAP Profiler ........................... 318 7.4.3 SQL Trace ......................................................... 326 7.4.4 Single Transaction Analysis ............................... 330 7.4.5 Explain Plan ...................................................... 331 7.4.6 SAP HANA Plan Visualizer ................................ 333 7.5 System-Wide SQL Analyses ............................................ 337 7.5.1 DBA Cockpit .................................................... 338 7.5.2 SQL Monitor .................................................... 342 7.6 SQL Performance Optimization ...................................... 346
ABAP(Advanced Business Application Programming)是SAP的一种编程语言,用于开发企业级应用程序。在ABAP,可以直接执行SQL语句来操作数据库ABAP通过使用Open SQL语句来直接执行SQLOpen SQL是一种特殊的ABAP语法,可以在ABAP程序直接执行SQL语句,而不需要使用特定的数据库语言。 要在ABAP执行SQL语句,首先需要在ABAP程序定义一个数据库表类型或者内表,用于存储从数据库检索的数据。然后,可以使用SELECT语句从数据库检索数据,也可以使用INSERT、UPDATE和DELETE语句来对数据库进行插入、更新和删除操作。 通过在ABAP程序直接执行SQL,可以方便地访问和处理数据库的数据。由于ABAP内置了对数据库的访问和管理功能,因此执行SQL不需要额外的库或驱动程序。同时,在ABAP可以使用数据字典来定义和管理数据库表结构,使得执行SQL更加方便和灵活。 需要注意的是,在直接执行SQL时,需要保证代码的安全性和稳定性。为了防止SQL注入和其他安全问题,应该在执行SQL之前对输入数据进行验证和过滤。同时,在执行SQL之后,应该对返回的数据进行正确性和完整性的验证,以确保数据的一致性和正确性。 总而言之,ABAP可以直接执行SQL语句来操作数据库。通过使用Open SQL语句,可以方便地访问和处理数据库的数据,为企业级应用程序的开发提供了便利。同时,需要注意对输入数据和返回数据的验证,以保证代码的安全性和数据的正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值