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

  • 1、原代码
  • 2、调整后代码
  • 3、对比

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_bukrsID '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  rbukrsgjahrbelnrdoclnracctkunnrlifnrrwcurdrcrkwslhslINTO CORRESPONDING FIELDS OF TABLE t_acdoca1FROM acdocaWHERE rbukrs = p_bukrsAND   ( gjahr < p_gjahr )AND   racct IN s_racctAND   bttype <> 'RFBC'AND   blart  <> 'AB' AND   kunnr IN s_kunnrAND   lifnr IN s_lifnrAND   ( augdt = '00000000' OR augdt >= lv_start ).ELSE.SELECT  rbukrsgjahrbelnrdoclnracctkunnrlifnrrwcurdrcrkwslhslINTO CORRESPONDING FIELDS OF TABLE t_acdoca1FROM acdocaWHERE rbukrs = p_bukrsAND   ( gjahr < p_gjahr OR ( gjahr = p_gjahr  AND   poper < s_poper-low ) )AND   bttype <> 'RFBC'AND   blart  <> 'AB' AND   racct IN s_racctAND   kunnr IN s_kunnrAND   lifnr IN s_lifnrAND   ( augdt = '00000000' OR augdt >= lv_start ).ENDIF.
*******查询借方数据*******SELECT rbukrsgjahrbelnrdoclnracctkunnrlifnrrwcurdrcrkwslhslINTO CORRESPONDING FIELDS OF TABLE t_acdoca2FROM acdocaWHERE rbukrs =  p_bukrsAND gjahr = p_gjahrAND blart  <> 'AB'AND racct IN s_racctAND kunnr IN s_kunnrAND lifnr IN s_lifnrAND poper IN s_poperAND drcrk = 'S'.******查询贷方数据********SELECT rbukrsgjahrbelnrdoclnracctkunnrlifnrrwcurdrcrkwslhslINTO CORRESPONDING FIELDS OF TABLE t_acdoca3FROM acdocaWHERE rbukrs =  p_bukrsAND gjahr = p_gjahrAND blart  <> 'AB'AND racct IN s_racctAND kunnr IN s_kunnrAND lifnr IN s_lifnrAND poper IN s_poperAND 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.SELECTsaknrtxt20INTO CORRESPONDING FIELDS OF TABLE t_skatFROM skatFOR ALL ENTRIES IN t_acdocaWHERE saknr = t_acdoca-racctAND ktopl = '1000'AND spras = '1'.SORT t_skat BY saknr.SELECTkunnrname1 AS name1_kINTO CORRESPONDING FIELDS OF TABLE t_kna1FROM kna1FOR ALL ENTRIES IN t_acdocaWHERE kunnr = t_acdoca-kunnr.SORT t_kna1 BY kunnr.SELECTlifnrname1 AS name1_lINTO CORRESPONDING FIELDS OF TABLE t_lfa1FROM lfa1FOR ALL ENTRIES IN t_acdocaWHERE 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  USINGfu_keyfu_checkboxfu_editfu_hotspotfu_justfu_fieldnamefu_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'EXPORTINGi_callback_program       = sy-repidi_callback_pf_status_set = 'FRM_PF_STATUS'is_layout                = w_layoutit_fieldcat              = t_fieldcati_default                = 'X'i_save                   = 'A'TABLESt_outtab                 = t_alvEXCEPTIONSprogram_error            = 1OTHERS                   = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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'EXPORTINGinput  = fc_alphaIMPORTINGoutput = 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'EXPORTINGinput    = fc_cunitlanguage = sy-languIMPORTINGoutput   = 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_bukrsID '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 (SELECTracct, kunnr, lifnr, rwcur, SUM( wsl ) AS wsl, SUM( hsl ) AS hslFROM acdocaWHERE rbukrs = @p_bukrsAND ( gjahr < @p_gjahr OR ( gjahr = @p_gjahr AND poper < @s_poper-low ) )AND racct IN @s_racctAND kunnr IN @s_kunnrAND lifnr IN @s_lifnrAND 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 (SELECTracct, kunnr, lifnr, rwcur, SUM( wsl ) AS wsl, SUM( hsl ) AS hsl, drcrkFROM acdocaWHERE rbukrs = @p_bukrsAND gjahr = @p_gjahrAND poper IN @s_poperAND racct IN @s_racctAND kunnr IN @s_kunnrAND lifnr IN @s_lifnrAND 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 t1UNIONSELECT 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_EFROM +header_list AS hLEFT JOIN +acdoca_qc AS qc ON qc~racct = h~racct AND qc~kunnr = h~kunnrAND qc~lifnr = h~lifnr AND qc~rwcur = h~rwcurLEFT JOIN +acdoca_bq AS bq_jf ON bq_jf~racct = h~racct AND bq_jf~kunnr = h~kunnrAND 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~kunnrAND 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_EFROM +data_list AS aLEFT 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 ) ) > 0INTO 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  USINGfu_keyfu_checkboxfu_editfu_hotspotfu_justfu_fieldnamefu_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'EXPORTINGi_callback_program       = sy-repidi_callback_pf_status_set = 'FRM_PF_STATUS'is_layout                = w_layoutit_fieldcat              = t_fieldcati_default                = 'X'i_save                   = 'A'TABLESt_outtab                 = t_alvEXCEPTIONSprogram_error            = 1OTHERS                   = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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'EXPORTINGinput  = fc_alphaIMPORTINGoutput = 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'EXPORTINGinput    = fc_cunitlanguage = sy-languIMPORTINGoutput   = fc_cunit.
ENDFORM.                " CONVERSION_EXIT_CUINT_OUTPut

3、对比

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

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

  1. spring mvc 用注解和在sql中格式化时间的案例

    spring mvc 用注解和在sql中式化时间的案例: 我们用spring mvc框架做项目的时候从数据库里面取出的时间经常是一串数字(如:1357826031724),比较让人头痛: 下面介绍中方 ...

  2. SQL中with recursive用法案例详解

    SQL提供了递归查询,可将当前查询结果作为下一次的查询集合进行再次查询,最后得到我们想要的结果. 关键字 with recursive 准备 假设我们有一张机构表org,如下: 列名 描述 id 机构 ...

  3. SQL中limit用法

    SQL中limit的使用案例 - limit的实际使用案例- 实际SQL代码 一:实际案例解读 描述:有一个员工表employees,字段有员工ID(id).员工姓名(name).员工部门(depar ...

  4. SAP系统的开发语言--ABAP简介

    这是我给公司内部杂志投稿的一篇文章,目的在于向不了解SAP开发的同事介绍SAP的开发技术.发在这里,希望对各位希望学习SAP开发技术的朋友有帮助. ABAP的全称是Advanced Business ...

  5. 什么是 SAP ABAP? 类型、ABAP 完整形式和含义

    转载地址:https://www.guru99.com/what-is-abap.html ABAP 是一种由 SAP 创建的高级编程语言,可帮助大型企业定制 SAP ERP. ABAP 可以帮助定制 ...

  6. SAP ABAP 因系统维护使ABAP语法不再被支持导致使用很久的程序报错问题之分析

    SAP ABAP 因系统维护使ABAP语法不再被支持导致使用很久的程序报错问题之分析 所在项目客户的一家工厂上线已经超过半年,其业务部门提出一个使用了半年的RF枪程序,突然不能使用了.程序直接Dump ...

  7. 【MM系列】SAP ABAP 编辑字段出现:对象编辑中的错误

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 编辑字段出现: ...

  8. 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  9. SAP UI5 应用开发教程之三十五 - 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. 极客新闻——11、程序员需要避免的10个坏习惯
  2. <Module>的类型初始值设定项引发异常
  3. python爬取微博指定内容_python3.5爬虫-爬取微博某博主微博内容
  4. php+mysql文件上传,使用PHP将文件上传到MySql DB
  5. 如何移除项目中无用的 console.log 代码
  6. 谷歌guava_Google Guava:您永远不会知道的5件事
  7. python爬虫什么网站都能爬吗_python如何爬取动态网站
  8. idea快捷键之记录
  9. 什么为java运行时的环境_什么是JRE?Java运行时环境简介(一)
  10. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
  11. 软考网络管理员学习笔记6之第六章互联网技术
  12. 单片机按键使用程序 (51单片机)
  13. 最便宜的855旗舰了,可惜是它
  14. Tcp keepalive详解
  15. Mysql 导出导入
  16. Windows上 IE10 最快,Mac上Chrome 19最快
  17. 画直线的算法之DDA算法+代码实现(法一)
  18. matlab导入txt数据画图
  19. win7去除快捷方式箭头
  20. 【Pytorch深度学习实战】(4)前馈神经网络(FNN)

热门文章

  1. 均值滤波及中值滤波的区别
  2. 7种将字符串反转的 Java 方法
  3. nodejs文件服务器
  4. alter table *** add constraint *** 用法
  5. 复习专栏之---面试总结
  6. python键盘键值表_Python怎么记录键盘鼠标敲击次数|Python统计鼠标点击次数 - PS下...
  7. 21 | 良心中间商:HTTP的代理服务
  8. nginx 根据IP转发到指定的后端服务器
  9. 如涵控股完成私有化交易:赴美上市刚满两年,市值已缩水超七成
  10. 聋人大学生终于开通了CNSD博客,CNSD在这里记录自己成长