为什么csv_to_structure方法抛出溢出错误?

2w3kk1z5  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(90)

我正在阅读一个具有以下结构的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_dataTYPE 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,这怎么可能?

nfzehxib

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的长度被向上舍入,因此包含下一个最高奇数个位置。此可能导致溢出和异常。

相关问题