对为 4 个内部连接的外部表创建的内部表使用字段符号



据称使用字段符号可能会导致更好的性能,但是我对指针的经验非常稀少,并且不太了解指针的概念。

我有这个程序,它根据 2 个用户输入 (carrid1) 从spflisflightsbooktravelagINNER JOIN创建的表格中选择CC_1、connidfldatebookid和旅行社name

  • cityFrom
  • cityTo

基本上,我希望用户从他想要起飞的地方以及他想降落的城市插入。之后,程序将显示所有可以预订的航班。

这是我的代码(工作正常),我想使用字段符号进行重构:

TABLES spfli.
DATA: BEGIN OF wa,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
fldate TYPE sflight-fldate,
bookid TYPE sbook-bookid,
name TYPE stravelag-name,
END OF wa,
itab LIKE SORTED TABLE OF wa
WITH UNIQUE KEY carrid connid fldate bookid.
PARAMETERS: fromLoc TYPE spfli-cityfrom,
toLoc TYPE spfli-cityto.
SELECT  p~carrid p~connid f~fldate b~bookid a~name
INTO  CORRESPONDING FIELDS OF TABLE itab
FROM  ( ( (
spfli AS p
INNER JOIN sflight AS f ON p~carrid = f~carrid AND
p~connid = f~connid
)
INNER JOIN sbook AS b ON b~carrid = f~carrid AND
b~connid = f~connid AND
b~fldate = f~fldate
) 
INNER JOIN stravelag AS a ON b~agencynum = a~agencynum
)
WHERE p~cityfrom = fromLoc AND
p~cityto   = toLoc  AND
f~seatsmax > f~seatsocc.
LOOP AT itab INTO wa.
AT NEW fldate.
ULINE.
WRITE: / .
WRITE: 'FLIGHT' COLOR 4.
ULINE.
WRITE: / wa-carrid COLOR 3, wa-connid COLOR 3, wa-fldate COLOR 3.
WRITE: / .
WRITE: 'Booking ID' COLOR 3, 30 'Carrier ID' COLOR 3, 60 'Air Connection ID' COLOR 3, 90 'Travel Agency' COLOR 3.
ULINE.
ENDAT.
WRITE: / wa-bookid, 30 wa-carrid, 60 wa-connid, 90 wa-name.
ENDLOOP.

我首先声明我认为我需要的字段符号,然后将它们分配给表。之后,我尝试声明PARAMETERS并根据新创建的字段符号指定它们的类型,但它不起作用 - 程序说:"Type <FS_SPFLI>" is unknown.

DATA: BEGIN OF wa,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
fldate TYPE sflight-fldate,
bookid TYPE sbook-bookid,
name TYPE stravelag-name,
END OF wa,
itab LIKE SORTED TABLE OF wa
WITH UNIQUE KEY carrid connid fldate bookid.
FIELD-SYMBOLS: <fs_spfli> TYPE any,
<fs_wa> TYPE any.
ASSIGN: spfli TO <fs_spfli>,
wa TO <fs_wa>.
PARAMETERS: fromLoc TYPE <fs_spfli>-cityfrom,
toLoc TYPE <fs_spfli>-cityto.

我将不胜感激如何使我的程序使用字段符号的指导

字段符号不是一种类型,它是运行时分配的数据对象(变量)的一种别名(它是一种引用变量)。

所以,你不能写:

PARAMETERS: fromLoc TYPE <fs_spfli>-cityfrom,
toLoc TYPE <fs_spfli>-cityto.

相反,使用实际类型(SPFLI是ABAP字典中定义的类型,通过事务代码SE11):

PARAMETERS: fromLoc TYPE spfli-cityfrom,
toLoc TYPE spfli-cityto.

字段符号应尽可能精确地键入,而不是一般地键入。

在您的情况下,您应该编写(此处,我使用LIKE variable,因为没有明确定义的"独立类型",而不是使用通用 ANY 类型):

FIELD-SYMBOLS: <fs_spfli> LIKE wa.

注意:无需在字段符号前面加上fs,由于尖括号(<spfli>),它们被清楚地标识出来。

可以使用以下语句之一分配字段符号:

  • 分配。。。自。。。
  • 循环...分配。。。
  • 读表...分配。。。
  • 附加。。。自。。。分配
  • 插入。。。到。。。分配
  • 修改。。。从。。。分配

可以使用以下语句分配字段符号:

  • 取消分配

您将字段符号声明为类型ANY,这就像 C++ 中的void *(指向空白,编译器期望某些东西会从那里开始,但不知道它到底是什么)。编译器绝对无法知道这些字段符号实际上具有spfli类型或wa类型,直到运行时。

这个会编译。

FIELD-SYMBOLS: <fs_spfli> TYPE spfli,
<fs_wa> LIKE wa.
ASSIGN: spfli TO <fs_spfli>,
wa TO <fs_wa>.
PARAMETERS: fromLoc LIKE <fs_spfli>-cityfrom,
toLoc LIKE <fs_spfli>-cityto.

这里是完整的可编译程序。

REPORT ZZZ.
TABLES spfli.
DATA: BEGIN OF wa,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
fldate TYPE sflight-fldate,
bookid TYPE sbook-bookid,
name TYPE stravelag-name,
END OF wa,
itab LIKE SORTED TABLE OF wa
WITH UNIQUE KEY carrid connid fldate bookid.
FIELD-SYMBOLS: <fs_spfli> TYPE spfli,
<fs_wa> LIKE wa.
ASSIGN: spfli TO <fs_spfli>,
wa TO <fs_wa>.
PARAMETERS: fromLoc LIKE <fs_spfli>-cityfrom,
toLoc LIKE <fs_spfli>-cityto.
SELECT  p~carrid p~connid f~fldate b~bookid a~name
INTO  CORRESPONDING FIELDS OF TABLE itab
FROM  ( ( (
spfli AS p
INNER JOIN sflight AS f ON p~carrid = f~carrid AND
p~connid = f~connid
)
INNER JOIN sbook AS b ON b~carrid = f~carrid AND
b~connid = f~connid AND
b~fldate = f~fldate
)
INNER JOIN stravelag AS a ON b~agencynum = a~agencynum
)
WHERE p~cityfrom = fromLoc AND
p~cityto   = toLoc  AND
f~seatsmax > f~seatsocc.
LOOP AT itab INTO wa.
AT NEW fldate.
ULINE.
WRITE: / .
WRITE: 'FLIGHT' COLOR 4.
ULINE.
WRITE: / wa-carrid COLOR 3, wa-connid COLOR 3, wa-fldate COLOR 3.
WRITE: / .
WRITE: 'Booking ID' COLOR 3, 30 'Carrier ID' COLOR 3, 60 'Air Connection ID' COLOR 3, 90 'Travel Agency' COLOR 3.
ULINE.
ENDAT.
WRITE: / wa-bookid, 30 wa-carrid, 60 wa-connid, 90 wa-name.
ENDLOOP.

如果你在 4.70 或更高,你可以写。

LOOP AT itab ASSIGNING FIELD-SYMBOL(<wa>).
WRITE: / <wa>-bookid, 30 <wa>-carrid, 60 <wa>-connid, 90 <wa>-name.
ENDLOOP.

然后ABAP将自行处理正确的打字。如果您不理解指针,那么您可以假装字段符号只是它所指向的结构的别名。

相关内容

  • 没有找到相关文章

最新更新