我正在阅读一个具有以下结构的csv文件:
Nr;Name;Name;Nr;Name
14;Doe;John;0838;test
15;Doe;John;0835;test2
16;Doe;John;1008;test3
我把数据读入一个结构类型:
types:
begin of ty_dbstr,
Nr TYPE p_pernr, "char 10
Nachname TYPE nachname, "char 25
Vorname TYPE vorname, "char 25
ProdZeit TYPE ZXXX_hours, "dec length 4 decimals 2
Datum TYPE datum, "char 8
end OF ty_dbstr.
使用函数'GUI_UPLOAD'
,我得到一个结果表lt_raw_data
(TYPE truxs_t_text_data
)
现在我正在处理数据,并希望将它们写入前面声明的结构体的表中,使用:
LOOP AT lt_raw_data INTO DATA(ls_csv_line).
CALL METHOD lo_csv_converter->csv_to_structure
EXPORTING
i_data = ls_csv_line
IMPORTING
e_s_data = <fs_wa>.
.
.
.
ENDLOOP.
这对于前2个条目很好,但是第三个条目产生了转储,因为它说转换1008时溢出
看起来1008不适合长度为4和2位小数的dec,这怎么可能?
1条答案
按热度按时间nfzehxib1#
字典数据类型:
DEC长度4小数位数2
表示总长度为4,即2位用于数字的整数部分,2位用于小数部分。
这意味着要存储在此类型中的最大值为:99.99
在文档中,它不是那么明显:
DEC用于打包号码这种类型以BCD格式描述一般打包号码。使用时,必须向类型中添加长度和小数位数。
当ABAP字典类型(即DEC 4)用于abap中的类型定义时,环境执行到abap类型的Map,在这种情况下从DEC到p,并且p的长度将基于DEC的长度计算:
DEC(长度1-31)->到p(length_of_DEC DIV 2 + 1)
在上述情况下,DEC长度为4的小数2被Map到[P(3)DEC 2],并且3位的整个部分不足以存储1008,这导致溢出。因此,在这种情况下,Dictionary类型应该至少是DEC长度6(6 DIV 2 + 1 = P(4))来存储数字。
还值得一提的是,在基于预定义类型DEC的数据类型定义中,应该使用奇数个位置。由于值以BCD格式存储,因此在数据类型p中,只有奇数个位置是可能的,因为半字节用于符号。如果数据类型DEC具有偶数个字符,则相关联的ABAP类型p的长度被向上舍入,因此包含下一个最高奇数个位置。此可能导致溢出和异常。