ABAP Join Query不返回功能模块中的数据

时间:2015-03-16 13:45:30

标签: sap abap

我是ABAP的新手。我创建了四个表(Z588B,Z588T,ZFINALTABLE),我想用函数构建器中的sql填充它。

首先,我尝试将这些表连接到T588B,T588T并得到此错误“对于池表群集表并且不允许投影视图连接”。

所以我创建了临时表来存储来自T588B,T588T表的数据,所以我可以使用临时表Z588B,Z588T加入ZFINALTABLE,这是我需要的输出字段。

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

这就是我所做的。

1)使用SE37“Z_BAPI_TESTP_FM”创建功能模块

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中的任何数据吗?

2 个答案:

答案 0 :(得分:0)

如果使用JOIN,则会导致性能问题。请尝试BINARY SEARCH。然后将所有数据附加到FINAL TABLE。

答案 1 :(得分:0)

我只是将Jagger有价值的评论转化为未来访客的答案。

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

  1. enter image description here存储在内存中,并且仅在程序运行时才相关。此后,它们将被刷新并永远消失。
  2. Internal tables(又名DB表)驻留在RDBMS中,RDBMS在不同的SAP安装之间可能会有所不同,但是SAP使用统一的Transparent tables来访问此数据,因此DB后端并不重要。

因此,SELECT / JOIN仅用于以ABAP Sql语言编写的数据库查询,而LOOP和其他语句则用于查询内部表。

因此,主要的困惑是:您为功能模块的参数命名与DB表完全相同。您的意图是联接并查询在前两个SELECT中形成的两个表Z588BZ588T,但是实际上您查询了具有相同名称 Z588B 的DB表。 Z588T ,并且不满足JOIN条件。

您需要加入在前两个步骤中找到的两个Itab。连接内部表比较棘手,可以由OpenSQL language实现,以保持良好的性能,这与通常的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.