0

我正在为 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”引入的控制结构必须以“ENDFUNCTION”结束。

显然有一个公开的声明。但我不太熟悉这种语言,不知道在哪里需要句号,或者我是否放错了任何结束语。我在网上看到的其他方法是使用构造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.

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

“对应”字段未知。它既不在指定的表之一中,也不由“DATA”语句定义。字段“WA_BKPF-CHKEY”未知。它既不在指定的表之一中,也不由“DATA”语句定义。字段“WA_BKPF”未知。它既不在指定的表之一中,也不由“DATA”语句定义。

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

编辑:最终代码如下所示:

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.
4

2 回答 2

3

年度人物。

让我知道这是否适合您:

*** 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.

干杯。

于 2018-01-10T18:20:03.133 回答
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.
于 2019-03-18T13:52:57.447 回答