EXTRACT_TABLE_DATA:FR连接SAP sql函数

楼主
我是社区第820702位番薯,欢迎点我头像关注我哦~

       FR连接SAP数据集帆软给出的函数有部分功能未能实现,提问了帆软的工程师说需要给SAP数据集插件做而开,想想就头痛,算了在函数里自己修改吧。修改功能点如下:

       1、在做简单数据集的时候往往需要“代码”+“描述”作为下拉框给用户做勾选,原先的FR是不支持拼接写法的,突发奇想在SAP里可以这样的写法怎么到FR上就不行了:( A && '-' && B ) AS STRING,debug后发现,FR在传参的时候会在 ')'后面空格的字符串截取掉;修改了之后的代码:( A && '-' && B )^AS^STRING,并在代码处做相关的处理就可以实现拼接的写法了(包括不局限于拼接,只要是空格都可以用'^'符号代替)。注意,AS别名后的字段必须要是数据元素类型,否则查询会不生效,这是因为动态获取table时需要该字段的类型以及长度,例如:字段werks 的 数据元素是 werks_d,这时候我们需要给到的正确别名就是 werks^AS^werks_d,当然也可以用自建一个zstring数据元素,这样就不用麻烦了。

     2、在做COUNT(*)^AS^INT8_LEW语法统计条数时,搭配的语句要加GROUP BY,但是SAP数据集插件是不支持GROUP BY的,所以修改了函数在Where条件框出也能进行按组统计。例: GROUP BY 字段A, 字段B......

     3、ORDER BY 排序语法与上面类似。例:ORDER BY 字段A, 字段B...... (ASCENDING/DESCENDING)

       

如果各位大顾们有什么更好的解决方案在下非常愿意学习~谢谢。分享出来是看看有没有相同苦恼的,相同也想学习一下大家的方法。

 

  TYPE-POOLS: abap.

* SELECT
  DATA: columnname        TYPE so_text,
        rowstructdescr    TYPE REF TO cl_abap_structdescr,
        rowreference      TYPE REF TO data,
        fieldsrow         TYPE zsql_clause_elements,
        fielddatadescrref TYPE REF TO abap_componentdescr,
        fielddescr        TYPE abap_componentdescr,
        fieldname         TYPE string,
        fielddescrtab     TYPE abap_component_tab.

* FROM
  DATA: fromclauserow    TYPE zsql_clause_elements,
        fromclausestring TYPE string.

* WHERE/ ORDER BY
  DATA: whereclauserow    TYPE zsql_clause_elements,
        whereclausestring TYPE string.

* TABLE
  DATA: returnrowstring TYPE string,
        datafieldstring TYPE string,
        dataline        LIKE data,
        numberfields    TYPE i.

* 动态内表
  FIELD-SYMBOLS: <datarow>      TYPE any,
                 <datarowtable> TYPE STANDARD TABLE,
                 <fs_struct>    TYPE any,
                 <datafield>    TYPE any.

* 拆分字符串
  DATA: ls_txt  TYPE string,
        lt_txt  TYPE TABLE OF string,
        lv_line TYPE i,       "统计条数
        lv_txt1 TYPE string,  "拆分Where
        lv_txt2 TYPE string,  "拆分GROUP BY
        lv_txt3 TYPE string.  "拆分ORDER BY

* 转换动态参数
  DATA: lr_struct TYPE REF TO data,
        lr_table  TYPE REF TO data.

* 处理 Select
  DESCRIBE TABLE fields LINES numberfields. "计算select 条数
  LOOP AT fields INTO fieldsrow.
*   分配动态参数
    fieldname = sy-tabix.
    CONCATENATE 'string' fieldname INTO fieldname.
    CONDENSE fieldname.

*   替换'_'为' ';例:( A && B )_AS_C—> ( A && B ) AS C
    DO 100 TIMES.
      SEARCH fieldsrow-text FOR '^'.
      IF sy-subrc EQ 0.
        REPLACE '^' WITH ' ' INTO fieldsrow-text."将 ^ 符号转换为 空格
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
    fielddescr-name = fieldname.

*   拆分空格,并取最后一个字符为动态参数;例 ( A && B ) AS C—> C
    SPLIT fieldsrow-text AT ' ' INTO TABLE lt_txt.
    lv_line = lines( lt_txt ).
    READ TABLE lt_txt INTO ls_txt INDEX lv_line.
    columnname = ls_txt.
    REPLACE FIRST OCCURRENCE OF SUBSTRING '~' IN columnname WITH '-' RESPECTING CASE. "将 ~ 符号转换为 - 符号

    fielddescr-type ?= cl_abap_typedescr=>describe_by_name( columnname ). "获取字段类型
    APPEND fielddescr TO fielddescrtab.

*   为单一动态参数添加逗号作为查询参数,并忽略最后一条
    IF sy-tabix NE numberfields.
      fieldsrow-text = fieldsrow-text && ','.
    ENDIF.
    MODIFY fields FROM fieldsrow.
  ENDLOOP.
  rowstructdescr = cl_abap_structdescr=>create( fielddescrtab ).
  CREATE DATA rowreference TYPE HANDLE rowstructdescr.
  ASSIGN rowreference->* TO <datarow>.

* 处理 From
  fromclausestring = ''.
  LOOP AT fromclause INTO fromclauserow.
    CONCATENATE fromclausestring fromclauserow-text INTO fromclausestring SEPARATED BY space. "换行拼接时增加空格
*    CONCATENATE fromclausestring fromclauserow-text INTO fromclausestring RESPECTING BLANKS. "换行拼接时保留空格
  ENDLOOP.

* 处理 Where
  whereclausestring = ''.
  LOOP AT whereclause INTO whereclauserow.
    CONCATENATE whereclausestring whereclauserow-text INTO whereclausestring SEPARATED BY space. "换行拼接时增加空格
*    CONCATENATE whereclausestring whereclauserow-text INTO whereclausestring RESPECTING BLANKS. "换行拼接时保留空格
  ENDLOOP.

* 转换动态参数
  DATA(lo_table) = cl_abap_tabledescr=>create( rowstructdescr ).
  CREATE DATA lr_struct TYPE HANDLE rowstructdescr.
  CREATE DATA lr_table TYPE HANDLE lo_table.
  ASSIGN lr_struct->* TO <fs_struct>.
  ASSIGN lr_table->*  TO <datarowtable>.

* 处理特殊语句
  SEARCH whereclausestring FOR 'GROUP BY'.  "判断有无GROUP BY
  IF sy-subrc EQ 0.
    SPLIT whereclausestring AT 'GROUP BY' INTO TABLE lt_txt.
    READ TABLE lt_txt INTO ls_txt INDEX 1.  "Where 条件
    lv_txt1 = ls_txt.
    READ TABLE lt_txt INTO ls_txt INDEX 2.  "GROUP BY 条件
    lv_txt2 = ls_txt.

    SEARCH whereclausestring FOR 'ORDER BY'. "判断是否同时存在ORDER BY
    IF sy-subrc EQ 0.
      CLEAR: lt_txt[].
      SPLIT lv_txt2 AT 'ORDER BY' INTO TABLE lt_txt.
      READ TABLE lt_txt INTO ls_txt INDEX 1.  "Where 条件
      lv_txt2 = ls_txt.
      READ TABLE lt_txt INTO ls_txt INDEX 2.  "ORDER BY 条件
      lv_txt3 = ls_txt.
      SELECT (fields) FROM (fromclausestring) INTO TABLE @<datarowtable> WHERE (lv_txt1) GROUP BY (lv_txt2) ORDER BY (lv_txt3). "GROUP BY + ORDER BY
    ELSE.
      SELECT (fields) FROM (fromclausestring) INTO TABLE @<datarowtable> WHERE (lv_txt1) GROUP BY (lv_txt2).  "GROUP BY
    ENDIF.
  ELSE.
    SEARCH whereclausestring FOR 'ORDER BY'. "判断有无ORDER BY
    IF sy-subrc EQ 0.
      SPLIT whereclausestring AT 'ORDER BY' INTO TABLE lt_txt.
      READ TABLE lt_txt INTO ls_txt INDEX 1.  "Where 条件
      lv_txt1 = ls_txt.
      READ TABLE lt_txt INTO ls_txt INDEX 2.  "ORDER BY 条件
      lv_txt3 = ls_txt.
      SELECT (fields) FROM (fromclausestring) INTO TABLE @<datarowtable> WHERE (lv_txt1) ORDER BY (lv_txt3).  "ORDER BY
    ELSE.
      SELECT (fields) FROM (fromclausestring) INTO TABLE @<datarowtable> WHERE (whereclausestring). "普通查询
    ENDIF.
  ENDIF.

* 拼接为BI接收格式
  LOOP AT <datarowtable> ASSIGNING <fs_struct>.
    CLEAR: returnrowstring.
    DO numberfields TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struct> TO <datafield>.
      datafieldstring = <datafield>.
      CONCATENATE returnrowstring '^' datafieldstring INTO returnrowstring.
    ENDDO.
    dataline = returnrowstring.
    INSERT dataline INTO TABLE data.
  ENDLOOP.
ENDFUNCTION.
分享扩散:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表