十进制字段在 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 的窗口上显示为负数的主要内容,如果未能解决你的问题,请参考以下文章

将 PHP 连接到 IBM i (AS/400)

通过 JBDC 获取在 IBM DB2 V6R1 (AS400) 上插入的行数

java.lang.NoClassDefFoundError:com / ibm / as400 / access / AS400 [关闭]

历史上的今天:XML 之父诞生;第一台存储程序计算机首次运行;IBM 推出 AS/400...

IBM iSeries / AS 400中的DB2连接字符串

无法在 AS400 中运行 SQL 查询,遇到 Invalid Token 错误