DEC数据类型不在ABAP中溢出,但在SQL中溢出

2020-08-19 02:01发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我遇到了一个不寻常的情况,我有一个数据库表,其中一列的数据类型为DEC(长度6个小数3)

使用相同的代码,我为DEC字段创建了一个报告程序和参数。

 REPORT ydec_test。

 表ydec_test。

 参数:p1类型ydec_test-seqno强制性,
             p2类型ydec_test-dec63强制性。

 ydec_test-seqno = p1。
 ydec_test-dec63 = p2。
 ydec_test-dec63 = ydec_test-dec63 * 10."此处应溢出,DEC63> 999.999

 尝试。
     从ydec_test修改ydec_test。
     写:'完成'。
   捕获cx_sy_open_sql_db INTO DATA(lo_ref)。
     写:/lo_ref-> get_text()。
 ENDTRY。

我可以在选择屏幕中输入的最大值是" 999.999"

当我执行报告时,我应该在将值乘以10时得到溢出异常,结果将变为" 9999.990"。 这很奇怪,因为该字段在小数点前不应有4位数字。 修改数据库表时,出现溢出异常。

数据库返回了SQL代码314。错误文本:数字溢出:无法将值转换为DECIMAL(6,3):type_code = 5,index = 1

我想在计算值时不对DB执行操作时进行错误处理。 任何人都可以提出为什么系统会以这种方式运行。 为什么字段长度在ABAP中不同而在DB中不同?

谢谢,
Nooruddin Bohra

(39.0 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我遇到了一个不寻常的情况,我有一个数据库表,其中一列的数据类型为DEC(长度6个小数3)

使用相同的代码,我为DEC字段创建了一个报告程序和参数。

 REPORT ydec_test。

 表ydec_test。

 参数:p1类型ydec_test-seqno强制性,
             p2类型ydec_test-dec63强制性。

 ydec_test-seqno = p1。
 ydec_test-dec63 = p2。
 ydec_test-dec63 = ydec_test-dec63 * 10."此处应溢出,DEC63> 999.999

 尝试。
     从ydec_test修改ydec_test。
     写:'完成'。
   捕获cx_sy_open_sql_db INTO DATA(lo_ref)。
     写:/lo_ref-> get_text()。
 ENDTRY。

我可以在选择屏幕中输入的最大值是" 999.999"

当我执行报告时,我应该在将值乘以10时得到溢出异常,结果将变为" 9999.990"。 这很奇怪,因为该字段在小数点前不应有4位数字。 修改数据库表时,出现溢出异常。

数据库返回了SQL代码314。错误文本:数字溢出:无法将值转换为DECIMAL(6,3):type_code = 5,index = 1

我想在计算值时不对DB执行操作时进行错误处理。 任何人都可以提出为什么系统会以这种方式运行。 为什么字段长度在ABAP中不同而在DB中不同?

谢谢,
Nooruddin Bohra

(39.0 kB)
付费偷看设置
发送
8条回答
小熊yu生菜
1楼 · 2020-08-19 02:33.采纳回答

调试,并检查P2的实际内部类型。 您应该看到它是P类型,长度为4。

文档 DECm.n转换为P((m + n + 1)/2)

因此,您的 字段为6位数字。 因此,在abap中它将是类型为P的(6 + 1)/2 = 3.5个字节,四舍五入为4个字节。 一个字节的一半用于符号,因此每个数字留下7个半字节。 然后,ABAP中的限制为-9999.999至9999.999

TL; DR-DEC转换为ABAP类型P,该类型始终具有奇数个数字。

compass1988
2楼-- · 2020-08-19 02:39
Nooruddin Bohra >>因此,您要说的是,在这种情况下,ABAP不能采取任何措施来防止此类错误? 在下面检查我的答案。 该编码将帮助您防止此类转储。 但是另一方面,您必须问自己,是否正确选择了TYPE,是否仍然可以使用更大的值,当发现无法将值推入DB时该怎么办?# p#

下面的编码将对照数据库的数字值检查ABAP的数字值。 因为在从ABAP类型到数据库类型的某些映射中,可能的最小/最大值和值集并不相同。

在您的特定情况下,您将获得SY-SUBRC <> 0返回。 这样,您知道数据库更新也将失败。

我还将为计算和数字转换构建一个TRY CATCH,以便在ABAP类型已经溢出的情况下,可以相应地处理异常。

大多数 可能,您将不需要进行decfloat转换,但是就我而言,在将自定义数据从一个系统加载到另一个系统时,我对许多不同的数值数据类型使用了此功能,因此我检查了源数据和目标数据之间可能存在的错误。/p>

 ydec_test-dec63 = ydec_test-dec63 * 10."此处应溢出,DEC63> 999.999
                   "->但不是,因为ABAP类型的值集实际上大于其定义

 *根据可能的数据库值检查当前值
 DATA output_internal LIKE ydec_test-dec63。
 数据默认类型DEC34。
 DATA input_external TYPE C长度34。
 DATA table_field TYPE选项卡字段。

 " IF cl_abap_elemdescr => get_data_type_kind(ydec_test-dec63)CA'/aeFIbsN%P'。"数值
 decfloat = ydec_test-dec63。
 将decfloat写为input_external EXPONENT 0。
 CONDENSE input_external。
 table_field-tabname ='YDEC_TEST'。  "表
 table_field-fieldname ='DEC63'。  "字段
 通话功能'RS_CONV_EX_2_IN'
   出口
     输入外部=输入外部
     table_field = table_field
   输入
     output_internal = output_internal
   例外情况
     input_not_numerical = 1
     too_many_decimals = 2
     more_than_one_sign = 3
     ill_thousand_separator_dist = 4
     too_many_digits = 5
     sign_for_unsigned = 6
     too_large = 7
     too_small = 8
     invalid_date_format = 9
     invalid_date = 10
     invalid_time_format = 11
     invalid_time = 12
     invalid_hex_digit = 13
     意外错误= 14
     invalid_fieldname = 15
     field_and_descr_incompatible = 16
     input_too_long = 17
     no_decimals = 18
     invalid_float = 19
     conversion_exit_error = 20
     其他= 21。
 如果sy-subrc <> 0。

 万一。
 
四川大学会员
3楼-- · 2020-08-19 02:48

您好,Venkat,

谢谢您的答复。

您正在尝试在乘法时捕获异常。 事情是没有例外发生的。 该值乘以10。

请参阅下文。 这就是问题所在。 它应该引发溢出异常,但不是。

致谢,
Nooruddin Bohra

小熊yu生菜
4楼-- · 2020-08-19 02:28

好的Nooruddin,请尝试这种方式。 它应该可以正常工作

 CATCH SYSTEM-EXCEPTIONS COMPUTE_INT_TIMES_OVERFLOW = 1。
  ydec_test-dec63 = ydec_test-dec63 * 10。
 结束。
 如果sy-subrc = 1。
  您的消息带有"溢出错误"。
 万一。
 
Bunny_CDM
5楼-- · 2020-08-19 02:31

您好,Venkat,

感谢您的回复。 问题是乘法时不会溢出。 它不会用于CATCH块。

此致

Nooruddin

SAP德到
6楼-- · 2020-08-19 02:46

能否请您尝试以下两个步骤之一

选项1

数据v_temp类型 zdec63。
 v_temp = ydec_test-dec63 * 10。
 p_char = v_temp。
 尝试。
   ydec_test-dec63 = p_char。
 捕捉CX_SY_CONVERSION_OVERFLOW。
   写:/"溢出"。
 ENDTRY。

选项2

数据v_temp类型zdec63。
 v_temp = ydec_test-dec63 * 10。
 如果v_temp <= 999.99。
        从ydec_test修改ydec_test。
     写:'完成'。
 其他。
  您的异常处理
 万一。  
木偶小白
7楼-- · 2020-08-19 02:28

亲爱的Nooruddin,

您可以使用如下的try catch语句

 TRY。
       ydec_test-dec63 = ydec_test-dec63 * 10 .."
     捕获cx_sy_arithmatic_overflow。
          ....您的留言在这里
   ENDTRY。

关于此,

Venkat

一周热门 更多>