内表操作和错误处理

一、标准表排序

需要对内表排序时,并不一定要用排序表,标准表也支持排序。
声明标准表LT_FLIGHTSCARRIER_IDCONNECTION_IDFLIGHT_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_IDCONNECTION_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 ).

在这里插入图片描述


总结

打完收工。

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值