1

我创建了三个表Z588B,我想在函数生成器中使用 SQL 填充它们Z588TZFINALTABLE

首先,我尝试加入这些表,但出现错误

对于池表集群表和投影视图连接是不允许的

所以我创建了临时表来存储来自表的数据T588BT588T这样我就可以使用临时表将它们加入到我需要的输出字段的 ZFINALTABLE 中。

我能够用我需要的数据填充Z588BZ588T 但使用这些临时表的 JOIN 没有返回任何数据。

我的步骤:

  1. Z_BAPI_TESTP_FM使用 SE37创建功能模块

  2. 在导入选项卡中,我定义了参数。

     MANDT   TYPE    ZTESTPA30-MANDT   Client
     USERG   TYPE    ZTESTPA30-USERG   User group
    
  3. 声明了我使用 se11 创建的临时表

    Z588B   LIKE    Z588B   Temp Structure for T588B
    Z588T   LIKE    Z588T   Temp Structure for T588T
    Z582S   LIKE    Z582S   Temp Structure for T582S
    
    ZFINALTABLE LIKE Z588BTEST Temp Structure for ZFINALTABLE
    
  4. 在源码中输入我的sql查询。

    
    FUNCTION Z_BAPI_TEST_FM.
       *"----------------------------------------------------------------------
       *"*"Local Interface:
       *"  IMPORTING
       *"     VALUE(MANDT) TYPE  ZTESTPA30-MANDT
       *"     VALUE(USERG) TYPE  ZTESTPA30-USERG
       *"  EXPORTING
       *"     VALUE(RETRUN) TYPE  BAPIRET2
       *"  TABLES
       *"      ZPA30 STRUCTURE  ZPA30
       *"      Z588B STRUCTURE  Z588B
       *"      Z588T STRUCTURE  Z588T
       *"      Z582S STRUCTURE  Z582S
       *"      Z588BTEST STRUCTURE  Z588BTEST
       *"----------------------------------------------------------------------
    
    TABLES: Z588B, Z588T, ZFINALTABLE.
    
       select MANDT USERG MNTYP MENUE INFTY  INTO CORRESPONDING FIELDS OF TABLE Z588B 
       from T588B CLIENT SPECIFIED
       WHERE MANDT = MANDT AND USERG = USERG AND MNTYP = 'I'.
    
       select MANDT SPRSL MNTYP MENUE DTEXT INTO CORRESPONDING FIELDS OF TABLE Z588T
       from T588T CLIENT SPECIFIED
       WHERE MANDT = MANDT AND MNTYP = 'I' AND SPRSL = 'EN'.
    
       Select a~MANDT AS MANDT  a~USERG AS USERG a~MNTYP AS MNTYP a~MENUE AS MENUE 
       a~INFTY AS INFTY b~SPRSL AS SPRSL b~DTEXT As DTEXT
       INTO CORRESPONDING FIELDS OF TABLE ZFINALTABLE
       FROM Z588B  AS a LEFT JOIN Z588T AS b ON a~MNTYP = b~MNTYP.
    
    ENDFUNCTION.
    

能够为给定的参数加载 Z588B、Z588T 上的数据,但连接的最终 sql 未返回 ZFINALTABLE 表中的数据。

你能告诉为什么最后一个使用 JOIN 的 sql 没有返回 ZFINALTABLE 中的任何数据吗?

4

1 回答 1

0

我只是将 Jagger 有价值的评论转换为未来访问者的答案。

您在 ABAP 中混淆了不同类型的表格数据:内部表和透明表。

  1. 内部表存储在内存中,仅在程序运行时相关,之后它们被刷新并永远消失。
  2. 透明表(也称为 DB 表)驻留在 RDBMS 中,在不同的 SAP 安装之间可能会有所不同,但 SAP 使用统一的 OpenSQL 语言来访问这些数据,因此 DB 后端并不重要。

所以SELECTs/JOINs只用于ABAP Sql语言编写的DB查询,LOOPs等语句用于查询内部表。

所以主要的混淆点是:你将功能模块的参数命名为与数据库表完全相同。您的意图是连接和查询两个表Z588BZ588T在前两个 SELECT 中形成,但实际上您查询了具有相同名称Z588BZ588T的 DB 表,并且未满足 JOIN 条件。

您需要的是加入在前两个步骤中找到的两个 itab。连接内部表比较棘手,可以通过并行游标技术实现,以保持与通常的 LOOP 不同的良好性能。考虑这个样本:

" Note: two itabs must be sorted by the same key which they joined by

sort: lt_vbpa by kunnr,  "Sorting by key is very important
      lt_kna1 by kunnr.  "Same key which is used for where condition is used here
loop at lt_vbpa into wa_vbpa.
  read lt_kna1 into wa_kna1     " This sets the sy-tabix
       with key kunnr = wa_vbpa-kunnr
       binary search.
  if sy-subrc = 0.              "Does not enter the inner loop
    v_kna1_index = sy-tabix.
    loop at lt_kna1 into wa_kna1 from v_kna1_index. "Avoiding Where clause
      if wa_kna1-kunnr <> wa_vbpa-kunnr.  "This checks whether to exit out of loop
        exit.
      endif.

****** Filling your final itab  ZFINALTABLE******

   endloop. "KNA1 Loop
  endif.
endloop.  " VBPA Loop

只有在那之后,您才能使用新构建的内部表的行更新您的数据库表,如下所示:

UPDATE ZFINALTABLE FROM TABLE @zfinaltable.
于 2020-04-20T14:42:21.290 回答