2015-10-22 99 views
1

我有一个场景,我在as400(DB2)上的一个表格上用绿色屏幕上的SQL做了一个选择,并且我使用windows SQL工具。Decimal Fields在来自IBM AS400的窗口上显示负数

在AS400(DB2): enter image description here

通知的undrelined值40229和41158.在DB2侧的场类型是DECIMAL 9.

现在当我在一个窗口运行相同的SQL

enter image description here

出于某种原因,当数据被返回-40229和-41158

:使用SQL工具(IBM(R)的Data Studio)PC

这感觉就像是一种溢出,但为什么和什么?

当我浏览到从SQL工具的数据库结构字段类型为:

enter image description here

所以在AS400的字段类型是DECIMAL 9和从Windows方十进制9 ..

为什么在Windows上这是否定的?与该类型有关?

的SQL窗口:select * from maxdtaclb.szciexp where TCNUOR ='129444'

的SQL AS400:select * from maxdtaclb/szciexp where TCNUOR ='129444'

难道全选,其中值小于0拿到了11行结果...

enter image description here

同样,如果我用绿色屏幕上的相同记录的键进行选择,它是负的?

东西我注意到的是,即使我用rpgiv程序从表中提取数据是在rpgiv程序藏汉负..

+0

我相信你可以在该工具中设置很多事物的格式,包括日期(你应该改为使用'* ISO')。我认为它也包含数字?我会先检查一下。我们是否可以看到声明?它只是这一套领域?它只是这一行(我们确定它是同一个,尽管看起来是这样)?你确定你碰到同一张桌子吗(没有在会话中设置'* LIBL'或其他东西)? –

+0

这是完全相同的表和同一行受到影响。唯一奇怪的是,如果我选择另一行的值是正确的(而不是负值),就像我的例子中那样,它只是一些偏离它们而不正确。我将检查* ISO格式.. – Renier

+0

一个正确的例子检查我的as400的第一个图像的值:18919在窗口显示正确的一面,但40229显示负面...这就是为什么我认为像溢出? – Renier

回答

4

如果该文件是从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关键字码。 (它适用于物理文件,即使标题提到了显示文件。)

+3

Dang..forgot所有关于编辑代码。另一个选择是源是不可用的是使用'显示文件字段描述 - (DSPFFD)'命令 – Charles

+0

哇我检查了它使用DSPFFD和猜测什么..这两个字段被定义为编辑代码4巫婆意味着如果值实际上是负面的,那么不要显示标志。谢谢分配!每天学习新事物。为什么会使用这个编辑代码来创建一个表?如果价值是否定的,你会想知道? – Renier

+0

阿格。我在寻找这个关于_display files_(但不记得它叫什么 - 我出去太久了)之前,注意到它是标准工具之一。 Shoulda一直在寻找... –

0

你用什么工具来看看从绿屏的结果?我假设STRSQL。

鉴于3个工具(Data Studio/RPG)中的2个显示为负值,我会说这个值是负值。

有一点要尝试,使用HEX()函数来查看数据的十六进制值。您应该看到“000040229D”为负值或“000040229F”为正值。

但是,'000040229B'是一个有效但很少使用的替代品。您使用的绿屏工具可能无法识别它。

但是,至少在我的系统(v7.1 TR 9)中,STRSQL至少会以负号正确显示两个版本的负值。
enter image description here