十进制字段在 IBM AS400 的窗口上显示为负数
Posted
技术标签:
【中文标题】十进制字段在 IBM AS400 的窗口上显示为负数【英文标题】:Decimal Fields displays negative on windows from IBM AS400 【发布时间】:2015-10-22 10:32:55 【问题描述】:我有一个场景,我在绿色屏幕上从 as400(DB2) 上的表中使用 SQL 进行选择,然后我使用 SQL 工具从 Windows PC 中执行相同的 SQL 语句。
在 as400(DB2) 上:
请注意未定义的值 40229 和 41158。db2 端的字段类型是 DECIMAL 9。
现在,当我使用 Sql 工具(IBM(R) Data Studio)在 Windows PC 上运行相同的 SQL 时:
由于某种原因,当数据返回为 -40229 和 -41158
感觉像是某种溢出,但为什么和什么?
当我从 Sql 工具导航到数据库结构时,字段类型是:
因此,在 as400 上,字段类型为 DECIMAL 9,而在 Windows 端则为 DECIMAL 9..
为什么这在 Windows 上是负面的?与类型有关吗?
SQL 窗口:select * from maxdtaclb.szciexp where TCNUOR ='129444'
SQL AS400:select * from maxdtaclb/szciexp where TCNUOR ='129444'
选择了所有值小于 0 的地方,得到了 11 行的结果...
再次,如果我在绿屏上使用相同记录的键进行选择,则为负数???
我注意到,即使我使用 rpgiv 程序从表中获取数据,它在 rpgiv 程序中也是负数..
【问题讨论】:
我相信您可以在该工具中设置许多内容的格式,包括日期(您可能应该改为使用*ISO
)。我认为它还包括数字?我会先检查一下。我们可以看看声明吗?难道只有这组字段吗?是否只有这一行(我们确定它是同一行,尽管情况似乎如此)?你确定你打的是同一张桌子(在会话中没有设置*LIBL
或其他东西)?
受影响的是完全相同的表和同一行。唯一奇怪的是,如果我选择另一行,则该值是正确的(不是负数),就像我的示例中一样,它们中的一些不正确。我会检查 *ISO 格式..
正确示例检查我的 as400 的第一张图像的值:18919 在 windows 端显示正确,但 40229 显示为负数......这就是为什么我认为类似溢出的原因?跨度>
我和@Clockwork-Muse 在一起……你确定它是同一行吗?尝试将RRN()
添加到您的选择中,如下所示:select rrn(a), a.* from maxdtaclb.szciexp A where TCNUOR ='129444'
如果溢出,除了负数之外,它不太可能是相同的值。此外,压缩十进制不会像整数那样溢出。
【参考方案1】:
如果文件是从 DDS 源成员(而不是 SQL DDL CREATE TABLE
语句)创建的,则该字段可能是使用 EDTCDE
关键字定义的。编辑代码可用于控制数值如何在交互式会话的查询输出中显示。使用 1、2、3 或 4 的编辑代码将导致抑制负号。如果在表达式中使用该字段,SQL 将生成不再由编辑代码格式化的派生列。
DDS 源成员中的示例文件定义::
R RDMC001P
NUMFLD1 5P 0 EDTCDE(3)
示例 SQL 会话:
> insert into dmclib/dmc001p
values (-12345)
1 rows inserted in DMC001P in DMCLIB.
> select NUMFLD1 from dmclib/dmc001p
NUMFLD1
12345
> select decimal(numfld1,5,0) as NUMFLD2 from dmclib/dmc001p
NUMFLD2
12,345-
Here's a link 到 7.2 IBM 手册,描述可用于 EDTCDE DDS 关键字的代码。 (即使标题提到了显示文件,它也适用于物理文件。)
【讨论】:
当..忘了所有关于编辑代码的事情。另一种选择是源不可用是使用Display File Field Description - (DSPFFD)
命令
哇,我使用 DSPFFD 检查了它,猜猜看。这两个字段都定义为编辑代码 4,这意味着如果值实际上是负数,则不显示符号。谢谢分!每天学习新事物。为什么要使用此编辑代码来创建表格?如果该值为负数,您肯定想知道吗?
啊。在发现它是标准工具之一之前,我就 display files 去寻找它(但不记得它叫什么 - 我已经离开太久了)。应该继续寻找......
当您不希望有负号时,您可以使用其中一种符号抑制编辑代码。将字段放置在 5250 屏幕或报表上时,它将占用更少的字符。【参考方案2】:
您使用什么工具从绿屏查看结果?我假设是 STRSQL。
鉴于 3 个工具(Data Studio / RPG)中有 2 个将值显示为负数,我会说该值是负数。
尝试一件事,使用 HEX() 函数查看数据的十六进制值。您应该看到“000040229D”表示负值或“000040229F”表示正值。
但是,'000040229B' 是一个有效但很少使用的否定替代方案。您使用的绿屏工具可能无法识别它。
但是,至少在我的系统 (v7.1 TR 9) 上,STRSQL 至少可以正确显示带有负号的负值的两个版本。
【讨论】:
以上是关于十进制字段在 IBM AS400 的窗口上显示为负数的主要内容,如果未能解决你的问题,请参考以下文章
通过 JBDC 获取在 IBM DB2 V6R1 (AS400) 上插入的行数
java.lang.NoClassDefFoundError:com / ibm / as400 / access / AS400 [关闭]
历史上的今天:XML 之父诞生;第一台存储程序计算机首次运行;IBM 推出 AS/400...