【SAP Abap】SAP S/4 ABAP OPEN SQL中WITH的应用案例
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的应用案例相关推荐
- spring mvc 用注解和在sql中格式化时间的案例
spring mvc 用注解和在sql中式化时间的案例: 我们用spring mvc框架做项目的时候从数据库里面取出的时间经常是一串数字(如:1357826031724),比较让人头痛: 下面介绍中方 ...
- SQL中with recursive用法案例详解
SQL提供了递归查询,可将当前查询结果作为下一次的查询集合进行再次查询,最后得到我们想要的结果. 关键字 with recursive 准备 假设我们有一张机构表org,如下: 列名 描述 id 机构 ...
- SQL中limit用法
SQL中limit的使用案例 - limit的实际使用案例- 实际SQL代码 一:实际案例解读 描述:有一个员工表employees,字段有员工ID(id).员工姓名(name).员工部门(depar ...
- SAP系统的开发语言--ABAP简介
这是我给公司内部杂志投稿的一篇文章,目的在于向不了解SAP开发的同事介绍SAP的开发技术.发在这里,希望对各位希望学习SAP开发技术的朋友有帮助. ABAP的全称是Advanced Business ...
- 什么是 SAP ABAP? 类型、ABAP 完整形式和含义
转载地址:https://www.guru99.com/what-is-abap.html ABAP 是一种由 SAP 创建的高级编程语言,可帮助大型企业定制 SAP ERP. ABAP 可以帮助定制 ...
- SAP ABAP 因系统维护使ABAP语法不再被支持导致使用很久的程序报错问题之分析
SAP ABAP 因系统维护使ABAP语法不再被支持导致使用很久的程序报错问题之分析 所在项目客户的一家工厂上线已经超过半年,其业务部门提出一个使用了半年的RF枪程序,突然不能使用了.程序直接Dump ...
- 【MM系列】SAP ABAP 编辑字段出现:对象编辑中的错误
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 编辑字段出现: ...
- 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- SAP UI5 应用开发教程之三十五 - 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
最新文章
- 极客新闻——11、程序员需要避免的10个坏习惯
- <Module>的类型初始值设定项引发异常
- python爬取微博指定内容_python3.5爬虫-爬取微博某博主微博内容
- php+mysql文件上传,使用PHP将文件上传到MySql DB
- 如何移除项目中无用的 console.log 代码
- 谷歌guava_Google Guava:您永远不会知道的5件事
- python爬虫什么网站都能爬吗_python如何爬取动态网站
- idea快捷键之记录
- 什么为java运行时的环境_什么是JRE?Java运行时环境简介(一)
- windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
- 软考网络管理员学习笔记6之第六章互联网技术
- 单片机按键使用程序 (51单片机)
- 最便宜的855旗舰了,可惜是它
- Tcp keepalive详解
- Mysql 导出导入
- Windows上 IE10 最快,Mac上Chrome 19最快
- 画直线的算法之DDA算法+代码实现(法一)
- matlab导入txt数据画图
- win7去除快捷方式箭头
- 【Pytorch深度学习实战】(4)前馈神经网络(FNN)
热门文章
- 均值滤波及中值滤波的区别
- 7种将字符串反转的 Java 方法
- nodejs文件服务器
- alter table *** add constraint *** 用法
- 复习专栏之---面试总结
- python键盘键值表_Python怎么记录键盘鼠标敲击次数|Python统计鼠标点击次数 - PS下...
- 21 | 良心中间商:HTTP的代理服务
- nginx 根据IP转发到指定的后端服务器
- 如涵控股完成私有化交易:赴美上市刚满两年,市值已缩水超七成
- 聋人大学生终于开通了CNSD博客,CNSD在这里记录自己成长