我是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中的任何数据吗?
答案 0 :(得分:0)
如果使用JOIN,则会导致性能问题。请尝试BINARY SEARCH。然后将所有数据附加到FINAL TABLE。
答案 1 :(得分:0)
我只是将Jagger有价值的评论转化为未来访客的答案。
您正在混淆ABAP中不同类型的表格数据:内部表和透明表。
因此,SELECT / JOIN仅用于以ABAP Sql语言编写的数据库查询,而LOOP和其他语句则用于查询内部表。
因此,主要的困惑是:您为功能模块的参数命名与DB表完全相同。您的意图是联接并查询在前两个SELECT中形成的两个表Z588B
和Z588T
,但是实际上您查询了具有相同名称 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.