一、标准表排序
需要对内表排序时,并不一定要用排序表,标准表也支持排序。
声明标准表LT_FLIGHTS
,CARRIER_ID
,CONNECTION_ID
,FLIGHT_DATE
为keys,填充数据。
TYPES: T_FLIGHTS TYPE TABLE OF /DMO/FLIGHT WITH NON-UNIQUE KEY CARRIER_ID CONNECTION_ID FLIGHT_DATE.
DATA LT_FLIGHTS TYPE T_FLIGHTS.
LT_FLIGHTS = VALUE #(
( client = sy-mandt carrier_id = 'LH' connection_id = '0400' flight_date = '20230201' plane_type_id = '747-400' price = '600' currency_code = 'EUR' )
( client = sy-mandt carrier_id = 'LH' connection_id = '0400' flight_date = '20230115' plane_type_id = '747-400' price = '600' currency_code = 'EUR' )
( client = sy-mandt carrier_id = 'QF' connection_id = '0006' flight_date = '20230112' plane_type_id = 'A380' price = '1600' currency_code = 'AUD' )
( client = sy-mandt carrier_id = 'AA' connection_id = '0017' flight_date = '20230110' plane_type_id = '747-400' price = '600' currency_code = 'USD' )
( client = sy-mandt carrier_id = 'UA' connection_id = '0900' flight_date = '20230201' plane_type_id = '777-200' price = '600' currency_code = 'USD' )
).
OUT->WRITE( LT_FLIGHTS ).
1.默认排序-SORT
SORT LT_FLIGHTS.
OUT->WRITE( LT_FLIGHTS ).
2.按指定字段排序
SORT LT_FLIGHTS BY CURRENCY_CODE PLANE_TYPE_ID.
OUT->WRITE( LT_FLIGHTS ).
3.指定正序和倒序
SORT LT_FLIGHTS BY CARRIER_ID ASCENDING FLIGHT_DATE DESCENDING.
OUT->WRITE( LT_FLIGHTS ).
二、删除重复记录
使用语句DELETE ADJACENT DUPLICATES FROM XXXXX
可以删除内表中重复的数据,当key相同时则数据被认为是重复。
DELETE ADJACENT DUPLICATES FROM LT_FLIGHTS.
OUT->WRITE( LT_FLIGHTS ).
执行删除操作后内表数据并未发生变化,两条LH-0400记录依然在。如果语句中不指定字段,系统默认使用内表key来判断数据是否重复,key中FLIGHT_DATE值不相同,系统未能检测到重复数据。
SORT LT_FLIGHTS BY CARRIER_ID CONNECTION_ID.
DELETE ADJACENT DUPLICATES FROM LT_FLIGHTS COMPARING CARRIER_ID CONNECTION_ID.
OUT->WRITE( LT_FLIGHTS ).
COMPARING
可以传递指定参数,用来判断数据重复的条件,这里根据CARRIER_ID
和CONNECTION_ID
两个字段去重,LH-0400还剩一条记录。
*
注意,使用DELETE ADJACENT DUPLICATES
去重前,需要对内表进行排序。
三、内表填充
VALUE #( )方法不紧支持批量显示填充内表,也可以使用表达式隐示填充。
准备数据,基于标准表connection和airport声明内表connections和airports,结果表result_table。从标准表中查询数据,填充到对应内表中。
TYPES: BEGIN OF T_CONNECTION,
CARRIER_ID TYPE /DMO/CARRIER_ID,
CONNECTION_ID TYPE /DMO/CONNECTION_ID,
DEPARTURE_AIRPORT TYPE /DMO/AIRPORT_FROM_ID,
DEPARTURE_AIRPORT_NAME TYPE /DMO/AIRPORT_NAME,
END OF T_CONNECTION.
TYPES T_CONNECTIONS TYPE SORTED TABLE OF T_CONNECTION WITH NON-UNIQUE KEY CARRIER_ID CONNECTION_ID.
DATA CONNECTIONS TYPE TABLE OF /DMO/CONNECTION.
DATA AIRPORTS TYPE TABLE OF /DMO/AIRPORT.
DATA RESULT_TABLE TYPE T_CONNECTIONS.
SELECT FROM /DMO/CONNECTION FIELDS * INTO TABLE @CONNECTIONS.
SELECT FROM /DMO/AIRPORT FIELDS * INTO TABLE @AIRPORTS.
使用for…in…关键字,循环connections表,并查询对应的airport name,填充到结果表。
RESULT_TABLE = VALUE #(
FOR LINE IN CONNECTIONS (
CARRIER_ID = LINE-CARRIER_ID
CONNECTION_ID = LINE-CONNECTION_ID
DEPARTURE_AIRPORT = LINE-AIRPORT_FROM_ID
DEPARTURE_AIRPORT_NAME = AIRPORTS[ AIRPORT_ID = LINE-AIRPORT_FROM_ID ]-NAME
)
).
OUT->WRITE( RESULT_TABLE ).
运行结果为空,debug后,右下角报错,点击show查看错误详情。
错误提示数据没找到,并指出了发生错误的语句。分析错误,应该是使用airport_from_id查找name的时候,存在未匹配到name的情况。查看/DMO/CONNECTION和/DMO/AIRPORT两个表的数据,FRA在/DMO/AIRPORT表中不存在,引起错误。
调整connections的数据源,指定机场SFO。
SELECT FROM /DMO/CONNECTION FIELDS * WHERE AIRPORT_FROM_ID = 'SFO' INTO TABLE @CONNECTIONS.
四、REDUCE
REDUCE用于内表数据的汇总操作。
DATA(RESULT) = REDUCE TYPE(
INIT VAR
FOR ITEM IN ITEMS
NEXT XXX
).
TYPE
:返回值类型
INIT
:初始化汇总用到的局部变量
FOR IN
:内表数据的循环体
NEXT
:汇总逻辑
TYPES: BEGIN OF T_RESULTS,
OCCUPIED TYPE /DMO/PLANE_SEATS_OCCUPIED,
MAXIMUM TYPE /DMO/PLANE_SEATS_MAX,
END OF T_RESULTS.
TYPES: BEGIN OF T_RESULTS_AVG,
OCCUPIED TYPE /DMO/PLANE_SEATS_OCCUPIED,
MAXIMUM TYPE /DMO/PLANE_SEATS_MAX,
AVERAGE TYPE P LENGTH 16 DECIMALS 2,
END OF T_RESULTS_AVG.
DATA FLIGHTS TYPE TABLE OF /DMO/FLIGHT.
SELECT FROM /DMO/FLIGHT FIELDS * INTO TABLE @FLIGHTS.
1.求和
DATA(TOTAL_OCCUPIED) = REDUCE I(
INIT TOTAL = 0
FOR ITEM IN FLIGHTS
NEXT TOTAL += ITEM-SEATS_OCCUPIED
).
OUT->WRITE( TOTAL_OCCUPIED ).
汇总所有航班已售出座位,返回值类型为I
,局部加总变量为TOTAL
,循环所有航班,加总航班的SEATS_OCCUPIED
字段,保存在TOTAL
,并在循环结束后返回给TOTAL_OCCUPIED
。
2.对多个字段求和
DATA(TOTAL_OCC_MAX) = REDUCE T_RESULTS(
INIT TOTAL_OM TYPE T_RESULTS
FOR ITEM IN FLIGHTS
NEXT
TOTAL_OM-OCCUPIED += ITEM-SEATS_OCCUPIED
TOTAL_OM-MAXIMUM += ITEM-SEATS_MAX
).
OUT->WRITE( TOTAL_OCC_MAX ).
3.求平均值
DATA(TOTAL_AVERAGE) = REDUCE T_RESULTS_AVG(
INIT
TOTAL_AVG TYPE T_RESULTS_AVG
COUNT = 1
FOR ITEM IN FLIGHTS
NEXT
TOTAL_AVG-OCCUPIED += ITEM-SEATS_OCCUPIED
TOTAL_AVG-MAXIMUM += ITEM-SEATS_MAX
TOTAL_AVG-AVERAGE = TOTAL_AVG-OCCUPIED / COUNT
COUNT += 1
).
OUT->WRITE( TOTAL_AVERAGE ).
总结
打完收工。