在SAP Query中连接字符串

时间:2018-01-10 16:17:15

标签: sql sap abap

我正在为SAP R / 3创建一个BAPI。我正在尝试编写的MSSQL中的等价物是:

select
    bkpf.BELNR,
    bkpf.BUKRS,
    bkpf.GJAHR,
    bkpf.AWKEY
into
    #tab
from
    bkpf
where
    exists ( select 1 from #n_tab n where CONCAT(n.BELNR, n.GJAHR) = bkpf.AWKEY )
;

但显然Open Sql不允许在查询中进行操作。因此,对于我研究的内容,我想要“加入”的表必须被检索到内存表中,在循环中创建一个新列,执行操作并与#tab表进行比较。但我正在努力学习语法。到目前为止我所拥有的是这样的:

FUNCTION ZBAPI_TEST.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"----------------------------------------------------------------------

select 
    bkpf~BELNR
    bkpf~BUKRS
    bkpf~GJAHR
    bkpf~AWKEY
into ITAB_BKPF
from bkpf.

loop at ITAB_BKPF.
ITAB_BKPF-chkey = CONCATENATE BELNR GJAHR.
modify ITAB_BKPF.
endloop.

ENDFUNCTION.

但我收到以下错误。

  

字段“ITAB_BKPF”未知。它既不属于其中之一   指定的表,也不是由“DATA”语句定义的。

     

字段“ITAB_BKPF-GJAHR”未知。它既不属于其中之一   指定的表,也不是由“DATA”语句定义。

     

嵌套错误:在语句“ENDFUNCTION”之前,   “SELECT”引入的控制结构必须以   “ENDSELECT”。

     

嵌套错误:在语句之前   “+ END-OF-INCLUDE”,由“FUNCTION”引入的控制结构必须   以“终结”结束。

显然有一个公开声明。但我并不熟悉这种语言,也不知道这段时间的位置,或者我是否放错了任何结束语。我在网上看到的其他方法是使用构造SELECT..ENDSELECT

FUNCTION ZBAPI_TEST.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"----------------------------------------------------------------------

select
    bkpf~belnr
    bkpf~bukrs
    bkpf~gjahr
    bkpf~awkey
into corresponding fields
    wa_bkpf
from bkpf.

wa_bkpf-chkey = concatenate belnr gjahr.
append wa_bkpf to itab_bkpf.
endselect.

ENDFUNCTION.

但这会产生一批新的错误:

  

字段“CORRESPONDING”未知。它既不属于其中之一   指定的表,也不是由“DATA”语句定义的。领域   “WA_BKPF-CHKEY”未知。它既不属于其中之一   指定的表,也不是由“DATA”语句定义的。字段“WA_BKPF”   不明。它既不在指定的表之一也不定义   通过“数据”声明。

我怀疑我在网上找到的解决方案和示例跳过某些部分,他们定义了一些他们使用的结构。但我真的不知道怎么做。有人可以帮忙吗?

编辑: 最终的代码如下:

types: begin of t_bkpf,
            belnr type belnr_d,
            bukrs type bukrs,
            gjahr type gjahr,
            awkey type awkey,
            chkey type string.
types: end of t_bkpf.
data: itab_bkpf type standard table of t_bkpf.
field-symbols: <wa> type t_bkpf.

    select
        BELNR
        BUKRS
        GJAHR
        AWKEY
    into corresponding fields of table ITAB_BKPF
    from bkpf.

    loop at ITAB_BKPF assigning <wa>.
      CONCATENATE <wa>-BELNR <wa>-GJAHR into <wa>-chkey.
    endloop.

2 个答案:

答案 0 :(得分:3)

manoftheyear。

请告诉我这是否适合您:

*** Definition of custom type.
TYPES: BEGIN OF ty_bkpf,
        belnr TYPE bukrs,
        bukrs TYPE belnr_d,
        gjahr TYPE gjahr,
        awkey TYPE awkey,
        chkey TYPE string,    " Replace with the type you need to use.
       END OF ty_bkpf.

*** Definition of internal table of custom type.
DATA lt_bkpf TYPE STANDARD TABLE OF ty_bkpf.

*** Definition of field symbol (pointer) of custom type.
FIELD-SYMBOLS <lfs_bkpf> TYPE ty_bkpf.


*** Extraction of data from BKPF database table.
SELECT belnr bukrs gjahr awkey
  FROM bkpf
  INTO CORRESPONDING FIELDS OF TABLE lt_bkpf.

*** Checks if extraction was succesful.
IF sy-subrc IS INITIAL.

  UNASSIGN <lfs_bkpf>.

*** Loop internal table...
  LOOP AT lt_bkpf ASSIGNING <lfs_bkpf>.

*** ...and create value for field CHKEY.
    CONCATENATE <lfs_bkpf>-belnr
                <lfs_bkpf>-gjahr
           INTO <lfs_bkpf>-chkey.  " By using a pointer, there's no need to use MODIFY sentence.

  ENDLOOP.

ENDIF.

干杯。

答案 1 :(得分:0)

您可以直接在QUERY上使用CONCAT。示例:

SELECT SINGLE CONCAT( CONCAT( a~name1, a~name2 ), a~name3 )
        FROM ( ( adrc AS a
             INNER JOIN j_1bbranch AS j ON a~addrnumber = j~adrnr )
             INNER JOIN t001w AS t ON j~cgc_branch = t~j_1bbranch
      AND j~bukrs = @i_postab-bukrs
      AND t~werks = @e_postab-prctr+4(4) )
      INTO @e_postab-company_name.