使用为 4 个内部连接的外部 table 创建的内部 table 的字段符号
Using Field-Symbols for the internal table that was created for 4 inner joined external tables
据称使用字段符号可能会带来更好的性能,但是我对指针的经验非常少,不太了解指针的概念。
我有这个程序,它从创建的 table 中选择 carrid
、connid
、fldate
、bookid
和旅行社的 name
通过 table 的 INNER JOIN
spfli
、sflight
、sbook
和 travelag
,基于 2 个用户输入 (parameters
):
cityFrom
cityTo
基本上,我希望用户输入他想从哪里起飞以及他想在哪个城市降落。之后程序会显示所有可以预订的航班。
这是我的代码(工作正常),我想使用 FIELD-SYMBOLS 进行重构:
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.
我首先声明我认为需要的字段符号,然后将它们分配给 tables。之后我尝试声明 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.
我将不胜感激关于如何使我的程序使用字段符号的指导
A field symbol 不是类型,它是在运行时分配的数据对象(变量)的一种别名(它是一种引用变量)。
所以,你不能写:
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 类型,因为没有明确定义 "standalone type"):
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 将自行处理正确的输入。如果您不理解指针,那么您可能会假装字段符号只是它所指向的结构的别名。
据称使用字段符号可能会带来更好的性能,但是我对指针的经验非常少,不太了解指针的概念。
我有这个程序,它从创建的 table 中选择 carrid
、connid
、fldate
、bookid
和旅行社的 name
通过 table 的 INNER JOIN
spfli
、sflight
、sbook
和 travelag
,基于 2 个用户输入 (parameters
):
cityFrom
cityTo
基本上,我希望用户输入他想从哪里起飞以及他想在哪个城市降落。之后程序会显示所有可以预订的航班。
这是我的代码(工作正常),我想使用 FIELD-SYMBOLS 进行重构:
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.
我首先声明我认为需要的字段符号,然后将它们分配给 tables。之后我尝试声明 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.
我将不胜感激关于如何使我的程序使用字段符号的指导
A field symbol 不是类型,它是在运行时分配的数据对象(变量)的一种别名(它是一种引用变量)。
所以,你不能写:
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 类型,因为没有明确定义 "standalone type"):
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 将自行处理正确的输入。如果您不理解指针,那么您可能会假装字段符号只是它所指向的结构的别名。