BW通过函数调用Query,设置传入参数,动态设置输出维度

REPORT zcfo_update_bs MESSAGE-ID zfi03.
TYPE-POOLS: rrx1,rsrds .

DATA: gt_return LIKE bapiret2 OCCURS WITH HEADER LINE .

DATA:gs_repdir TYPE rsrrepdir,
     g_date    TYPE sy-datum,
     g_month   TYPE /bi0/oicalmonth,
     g_tlevel  TYPE /bi0/oirf_tlevel.
DATA:g_request TYPE REF TO cl_rsr_request.
DATA:g_dataset TYPE REF TO cl_rsr_data_set.

DATA : gt_dim    TYPE rrx1_t_dim,
       gs_dim    TYPE rrx1_s_dim,
       gt_prptys TYPE  rrx1_t_prptys,
       gt_atr    TYPE  rrx1_t_atr,
       gt_mem    TYPE  rrx1_t_mem,
       gt_cel    TYPE  rrx1_t_cel,
       gt_con    TYPE  rrx1_t_con,
       gt_fac    TYPE  rrx1_t_fac.


DATA:g_cx_message   TYPE REF TO cx_rsr_x_message,
     g_cx_root      TYPE REF TO cx_root,
     g_error_string TYPE string.

DATA: gs_var  TYPE rrx1_s_var,
      gt_var  TYPE rrx1_t_var,
      gt_cell TYPE rrws_t_cell,
      gs_cell TYPE rrws_s_cell,
      gt_axis TYPE rrws_thx_axis_data,
      gs_axis TYPE rrws_sx_axis_data,
      gt_set  TYPE rrws_tx_set,
      gs_set  TYPE rrws_sx_tuple.

DATA:g_tabix TYPE i,
     g_lines TYPE i,
     g_times TYPE i,
     g_count TYPE i,
     g_i     TYPE i,
     g_j     TYPE i.
DATA:g_tablename TYPE ddobjname,
     g_condition TYPE string,
     g_field     TYPE char100,
     gt_table    TYPE TABLE OF dfies,
     gs_table    TYPE dfies,
     gt_key      TYPE TABLE OF dfies.

DATA:gt_varconfg TYPE TABLE OF zhr_kpi_varconfg,
     gs_varconfg TYPE zhr_kpi_varconfg.

DATA:dyn_table TYPE REF TO data,
     dyn_wa    TYPE REF TO data.

FIELD-SYMBOLS: <dyn_table> TYPE table,
               <dyn_wa>    TYPE any,
               <fs_field>  TYPE any.

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS:p_query  TYPE rszcompid OBLIGATORY,
           p_keynum TYPE /bic/oizkeynum OBLIGATORY,
           p_dso    TYPE rsdodsobject OBLIGATORY.
SELECTION-SCREEN END OF BLOCK blk1.

*SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE text-002.
*PARAMETERS:p_lzlx1 RADIOBUTTON GROUP g1,
*           p_lzlx2 RADIOBUTTON GROUP g1,
*           p_lzlx3 RADIOBUTTON GROUP g1.
*SELECTION-SCREEN END OF BLOCK blk2.

SELECTION-SCREEN BEGIN OF BLOCK blk3 WITH FRAME TITLE text-003.
PARAMETERS:p_org2 AS CHECKBOX,
           p_org3 AS CHECKBOX,
           p_org4 AS CHECKBOX,
           p_org5 AS CHECKBOX,
           p_org6 AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK blk3.

*SELECTION-SCREEN BEGIN OF BLOCK blk4 WITH FRAME TITLE text-004.
*PARAMETERS:p_yx AS CHECKBOX,
*           p_ex AS CHECKBOX,
*           p_sx AS CHECKBOX.
*SELECTION-SCREEN END OF BLOCK blk4.


START-OF-SELECTION.
  SELECT SINGLE * FROM rsrrepdir INTO gs_repdir
       WHERE compid  = p_query
          AND objvers  'A'.

  IF sy-subrc <> 0.
    MESSAGE e001 WITH '查询不存在,请重新输入'.
  ENDIF.

  CONCATENATE '/BIC/A' p_dso '00' INTO g_tablename.
  CALL FUNCTION 'DDIF_FIELDINFO_GET'
    EXPORTING
      tabname        = g_tablename
      langu          = sy-langu
    TABLES
      dfies_tab      = gt_table
    EXCEPTIONS
      not_found      1
      internal_error 2
      OTHERS         3.
  IF sy-subrc <> 0.
    MESSAGE e001 WITH '数据存储对象不存在,请重新输入'.
  ENDIF.

  gt_key = gt_table.
  DELETE gt_key WHERE domname NE 'RSKYFNUM'.

*创建动态表结构
  CREATE DATA dyn_table TYPE TABLE OF (g_tablename).
*创建动态内表
  ASSIGN dyn_table->* TO <dyn_table>.
*创建动态工作区结构
  CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
*创建动态工作区
  ASSIGN dyn_wa->* TO <dyn_wa>.

  SELECT SINGLE calmonth INTO g_month
    FROM /bic/mzcrkzmx
    WHERE /bic/zcrkzmx 'Z1XTDQYHLS'
      AND objvers 'A'
      AND calday '99991231'.
  IF sy-subrc NE 0.
    g_date = sy-datum 1.
    g_month = g_date(6).
  ENDIF.

  IF p_org2 EQ 'X'.
    g_tlevel 2.
  ELSEIF p_org3 EQ 'X'.
    g_tlevel 3.
  ELSEIF p_org4 EQ 'X'.
    g_tlevel 4.
  ELSEIF p_org5 EQ 'X'.
    g_tlevel 5.
  ELSEIF p_org6 EQ 'X'.
    g_tlevel 6.
  ENDIF.

  CREATE OBJECT g_request
    EXPORTING
      i_genuniid = gs_repdir-genuniid.

  CALL FUNCTION 'RSZ_DB_QUERY_GET'
    EXPORTING
      i_compuid  = gs_repdir-compuid
      i_objvers  'A'
    IMPORTING
*     E_COMPUID  =
*     E_SUBRC    =
      e_t_prptys = gt_prptys
      e_t_dim    = gt_dim
      e_t_atr    = gt_atr
      e_t_mem    = gt_mem
      e_t_cel    = gt_cel
      e_t_con    = gt_con
      e_t_fac    = gt_fac.

  PERFORM frm_set_dim.
  PERFORM frm_set_variable.

  TRY.
      g_request->set_request( i_t_dim = gt_dim
                              i_t_mem = gt_mem
                              i_t_cel = gt_cel
                              i_t_atr = gt_atr
                              i_t_con = gt_con
                              i_t_fac = gt_fac
                              i_t_prptys = gt_prptys ).

      g_request->variables_set( i_t_var = gt_var ).
      g_request->variables_start).
      g_request->read_data).
      g_dataset = cl_rsr_data_set=>get( i_r_request = g_request ).
      g_dataset->refresh( i_version ).
    CATCH cx_rsr_x_message INTO g_cx_message.
    CATCH cx_root INTO g_cx_root.
      CLEAR g_error_string .

      g_error_string = g_cx_root->get_text).
      MESSAGE e001 WITH g_error_string.
  ENDTRY.

  gt_cell = g_dataset->n_sx_version_20a_1-cell_data.
  gt_axis = g_dataset->n_sx_version_20a_1-axis_data.

  CLEAR g_lines.
  READ TABLE gt_axis INTO gs_axis WITH KEY axis '000'.
  IF sy-subrc 0.
    gt_set = gs_axis-set.
    DESCRIBE TABLE gt_set LINES g_count.
  ENDIF.

  READ TABLE gt_axis INTO gs_axis WITH KEY axis '001'.   
IF sy-subrc 0.     gt_set 
= gs_axis-set.   
ENDIF.   g_i 

0.   

LOOP AT gt_set INTO gs_set.     
READ TABLE gt_table INTO gs_table WITH KEY fieldname 'CALMONTH'.     
IF sy-subrc 0.       
CONCATENATE '<DYN_WA>-' 'CALMONTH' INTO g_field.       
ASSIGN (g_fieldTO <fs_field>.       <fs_field> 
= g_month.     
ENDIF.     

READ TABLE gt_table INTO gs_table WITH KEY fieldname '/BIC/ZKEYNUM'.     
IF sy-subrc 0.       
CONCATENATE '<DYN_WA>-' '/BIC/ZKEYNUM' INTO g_field.       
ASSIGN (g_fieldTO <fs_field>.       <fs_field> 
= p_keynum.     
ENDIF.     

READ TABLE gt_table INTO gs_table WITH KEY fieldname 'RF_TLEVEL'.     
IF sy-subrc 0.       
CONCATENATE '<DYN_WA>-' 'RF_TLEVEL' INTO g_field.       
ASSIGN (g_fieldTO <fs_field>.       <fs_field> 
= g_tlevel.     
ENDIF.     

READ TABLE gt_table INTO gs_table WITH KEY fieldname 'ORGUNIT'.     
IF sy-subrc 0.       
CONCATENATE '<DYN_WA>-' 'ORGUNIT' INTO g_field.       
ASSIGN (g_fieldTO <fs_field>.       <fs_field> 
= gs_set-chavl.     
ENDIF.     g_j 

1.     
DO g_count TIMES.       
CLEAR:gs_cell.       
READ TABLE gt_cell INTO gs_cell INDEX ( g_i * g_count + g_j ).       

READ TABLE gt_key INTO gs_table INDEX g_j.       
IF sy-subrc 0.         
CONCATENATE '<DYN_WA>-' gs_table-fieldname INTO g_field.         
ASSIGN (g_fieldTO <fs_field>.         <fs_field> 
= gs_cell-value.       
ENDIF.       g_j 

= g_j + 1.     
ENDDO.     

AT END OF tuple_ordinal.       g_i 
= g_i + 1.     
ENDAT.     

APPEND <dyn_wa> TO <dyn_table>.   
ENDLOOP.   

PERFORM frm_update_db.



*&---------------------------------------------------------------------*
*&      Form  FRM_SET_DIM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_dim .   

CLEAR:gs_dim.   
READ TABLE gt_dim INTO gs_dim WITH KEY iobjnm 'ZCORGLVL2'.   
IF sy-subrc 0.     g_tabix 
= sy-tabix.     
IF p_org2 EQ 'X'.       gs_dim
-axis 'Y'.     
ELSE.       
CLEAR gs_dim-axis.     
ENDIF.     
MODIFY gt_dim FROM gs_dim INDEX g_tabix.   
ENDIF.   


CLEAR gs_dim.   
READ TABLE gt_dim INTO gs_dim WITH KEY iobjnm 'ZCORGLVL3'.   
IF sy-subrc 0.     g_tabix 
= sy-tabix.     
IF p_org3 EQ 'X'.       gs_dim
-axis 'Y'.     
ELSE.       
CLEAR gs_dim-axis.     
ENDIF.     
MODIFY gt_dim FROM gs_dim INDEX g_tabix.   
ENDIF.   

CLEAR gs_dim.   
READ TABLE gt_dim INTO gs_dim WITH KEY iobjnm 'ZCORGLVL4'.   
IF sy-subrc 0.     g_tabix 
= sy-tabix.     
IF p_org4 EQ 'X'.       gs_dim
-axis 'Y'.     
ELSE.       
CLEAR gs_dim-axis.     
ENDIF.     
MODIFY gt_dim FROM gs_dim INDEX g_tabix.   
ENDIF.   

CLEAR gs_dim.   
READ TABLE gt_dim INTO gs_dim WITH KEY iobjnm 'ZCORGLVL5'.   
IF sy-subrc 0.     g_tabix 
= sy-tabix.     
IF p_org5 EQ 'X'.       gs_dim
-axis 'Y'.     
ELSE.       
CLEAR gs_dim-axis.     
ENDIF.     
MODIFY gt_dim FROM gs_dim INDEX g_tabix.   
ENDIF.   

CLEAR gs_dim.   
READ TABLE gt_dim INTO gs_dim WITH KEY iobjnm 'ZCORGLVL6'.   
IF sy-subrc 0.     g_tabix 
= sy-tabix.     
IF p_org6 EQ 'X'.       gs_dim
-axis 'Y'.     
ELSE.       
CLEAR gs_dim-axis.     
ENDIF.     
MODIFY gt_dim FROM gs_dim INDEX g_tabix.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_UPDATE_DB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_update_db .   
CONCATENATE '/BIC/ZKEYNUM = ' 'P_KEYNUM' 'AND RF_TLEVEL =' 'G_TLEVEL' INTO g_condition SEPARATED BY space.   

DO TIMES.     
DELETE FROM (g_tablenameWHERE (g_condition).     

INSERT (g_tablenameFROM TABLE <dyn_table>.     
IF sy-subrc 0.       
COMMIT WORK AND WAIT.       
MESSAGE s001 WITH '数据更新成功'.       
EXIT.     
ELSE.       
WAIT UP TO 5 SECONDS.     
ENDIF.   
ENDDO.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_VARIABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_variable .   

SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_varconfg     
FROM zhr_kpi_varconfg     
WHERE keynum = p_keynum.   

CLEAR:gs_var,gt_var.   
LOOP AT gt_varconfg INTO gs_varconfg.     
MOVE-CORRESPONDING gs_varconfg TO gs_var.     
APPEND gs_var TO gt_var.   
ENDLOOP.



*  IF p_lzlx1 = 'X'.
*    gs_var-vnam = 'ZCLZLX_V01'.
*    gs_var-sign = 'I'.
*    gs_var-opt = 'EQ'.
*    gs_var-low = 'A'.
*    CLEAR gs_var-high.
*    APPEND gs_var TO gt_var.
*
*    gs_var-vnam = 'ZCLZLX_V01'.
*    gs_var-sign = 'I'.
*    gs_var-opt = 'EQ'.
*    gs_var-low = 'B'.
*    CLEAR gs_var-high.
*    APPEND gs_var TO gt_var.
*  ENDIF.
*
*  IF p_lzlx2 = 'X'.
*    gs_var-vnam = 'ZCLZLX_V01'.
*    gs_var-sign = 'I'.
*    gs_var-opt = 'EQ'.
*    gs_var-low = 'A'.
*    CLEAR gs_var-high.
*    APPEND gs_var TO gt_var.
*  ENDIF.
*
*  IF p_lzlx3 = 'X'.
*    gs_var-vnam = 'ZCLZLX_V01'.
*    gs_var-sign = 'I'.
*    gs_var-opt = 'EQ'.
*    gs_var-low = 'B'.
*    CLEAR gs_var-high.
*    APPEND gs_var TO gt_var.
*  ENDIF.
*
*
*  IF p_yx EQ 'X'.
*    gs_var-vnam = 'ZCGWSX_M'.
*    gs_var-sign = 'I'.
*    gs_var-opt = 'EQ'.
*    gs_var-low = '0010'.
*    CLEAR gs_var-high.
*    APPEND gs_var TO gt_var.
*  ENDIF.
*
*  IF p_ex EQ 'X'.
*    gs_var-vnam = 'ZCGWSX_M'.
*    gs_var-sign = 'I'.
*    gs_var-opt = 'EQ'.
*    gs_var-low = '0020'.
*    CLEAR gs_var-high.
*    APPEND gs_var TO gt_var.
*  ENDIF.
*
*  IF p_sx EQ 'X'.
*    gs_var-vnam = 'ZCGWSX_M'.
*    gs_var-sign = 'I'.
*    gs_var-opt = 'EQ'.
*    gs_var-low = '0030'.
*    CLEAR gs_var-high.
*    APPEND gs_var TO gt_var.
*  ENDIF.

ENDFORM.

原文地址:https://www.cnblogs.com/xmqlv20081008/p/8359735.html