Обнаружилось странное поведение команды REDUCE, которая появилась в 7.40
Понадобилось сложить значения в таблице
1 2 3 4 5 6 |
TYPES: BEGIN OF ts_data, file_size TYPE sdok_fsize, END OF ts_data, tt_data TYPE STANDARD TABLE OF ts_data WITH DEFAULT KEY. DATA(mt_files) = VALUE tt_data( ( file_size = 2147483646 ) ( file_size = 120105271 ) ). |
Конечно можно было использовать цикл по таблице и суммировать записи по одному, но новый оператор должен работать быстрее. На первый взгляд решалось несложно и суммы рассчитывались нормально
1 2 3 4 |
DATA: lv_totalfilesize TYPE int8. lv_totalfilesize = REDUCE #( INIT lv_file_size = 0 FOR ls_files IN mt_files NEXT lv_file_size = lv_file_size + ls_files-file_size ). |
Однако в тестовой системе с реальными данные выпадает в ошибку с переполнением.
Оказалось, что переменную lv_file_size создается не INT8 и надо её объявлять явно
1 2 3 |
lv_totalfilesize = REDUCE #( INIT lv_file_size = VALUE int8( ) FOR ls_files IN mt_files NEXT lv_file_size = lv_file_size + ls_files-file_size ). |