Progress 4GL字符转十进制方法及代码报错排查请求
在Progress 4GL中解决字符转十进制的格式报错问题
嘿,我来帮你搞定这个问题!你遇到的"Value cannot be displayed using ->>>,>>>,>>9.999999"错误,根源其实很简单:你定义的TEMP-TABLE字段格式,根本装不下转换后的十进制数值长度。
咱们一步步拆解:
问题出在哪?
你的字符变量cDateTime值是"20191604121566",用DECIMAL()转换后得到的是20191604121566.00——这是一个14位的整数加两位小数。但你给tt_data.DateTime字段设置的格式"->>>,,>>9.99",整数部分最多只能容纳6位数字(>>>,,>>9的结构意味着最大能显示999,999),和你实际的14位数值比起来,空间差太多了,Progress自然没法用这个格式显示,就抛出错误了。
怎么解决?
1. 调整字段格式,匹配数值长度
你只需要修改TEMP-TABLE字段的FORMAT,让它能装下14位整数就行。推荐用支持千分位的格式,看起来更清晰:
DEFINE TEMP-TABLE tt_data NO-UNDO FIELD DateTime AS DECIMAL FORMAT ">>>,>>>,>>>,>>9.99".
要是觉得千分位没必要,也可以直接用足够多的占位符:
DEFINE TEMP-TABLE tt_data NO-UNDO FIELD DateTime AS DECIMAL FORMAT "->>>>>>>>>>>>>>9.99".
改完之后,转换后的数值就能正常显示了。
2. 额外提个醒:检查日期时间字符串的合理性
另外,你的cDateTime值"20191604121566"看起来像是日期时间拼起来的,但这里面有不太合理的地方:
- 秒数是
66,正常秒数范围是0-59,这明显不对 - 如果是
YYYYMMDD的日期格式,20191604里的16是月份,这显然无效;如果是YYYYDDMM,那16是日期、04是月份,这倒是合理,但还是得确认你的格式逻辑
要是这个字符串是用来处理日期时间的,建议先把格式捋顺,避免后续出现其他逻辑错误。
修改后的完整代码示例
DEFINE VARIABLE cDateTime AS CHARACTER NO-UNDO. DEFINE TEMP-TABLE tt_data NO-UNDO FIELD DateTime AS DECIMAL FORMAT ">>>,>>>,>>>,>>9.99". ASSIGN cDateTime = "20191604121566". CREATE tt_data. ASSIGN tt_data.DateTime = DECIMAL(cDateTime). /* 测试一下转换结果 */ MESSAGE "转换后的十进制值:" tt_data.DateTime VIEW-AS ALERT-BOX.
内容的提问来源于stack exchange,提问作者Thiru
相关产品推荐
相关产品推荐

