1、下图为SQL SERVER 2000中的表定义
2、下图为对该表进行SUM求和后的结果,在SQL查询分析器中正常
3、下图为不正常的客户端显示,使用:Delphi7及ListView显示这是怎么回事,请高手指点一下,为什么整数值显示正确,而浮点数却不正常呢?

解决方案 »

  1.   

          with ClientDataSet do
          begin
            lvStatResult.Columns.Clear;
            for i:=0 to FieldCount-1 do
            begin
              newColumn:= lvStatResult.Columns.Add;
              newColumn.Caption:=Fields.Fields[i].FieldName;
              newColumn.Width:=80;
            end;
            lvStatResult.Items.Clear;
            while not Eof do
            begin
              newItem:=lvStatResult.Items.Add;
              newItem.Caption:=Fields.Fields[0].AsString;
              for i:=1 to FieldCount-1 do
              begin
                newItem.SubItems.Add(Fields.Fields[i].AsString);
              end;
              Next;
            end;
          end;这是相关代码,看上去也没错误呀
      

  2.   

    检查一下是不是Fields[i]是不是你想要的字段,改成FieldByName试试
      

  3.   

    先取出求和的值ShowMessage显示看一下对不对,如果对说明你ListView设置有问题。
      

  4.   

    為什么這樣寫---Fields.Fields[i]?直接Fields[i]就可以訪問了啊。從你的代碼看,浮點數字段是有select出來的,問題應該不是樓上所說的。先修改成直接訪問Fields[i]看看。      with ClientDataSet do
          begin
            lvStatResult.Columns.Clear;
            for i:=0 to FieldCount-1 do
            begin
              newColumn:= lvStatResult.Columns.Add;
              newColumn.Caption:=Fields[i].FieldName;
              newColumn.Width:=80;
            end;
            lvStatResult.Items.Clear;
            while not Eof do
            begin
              newItem:=lvStatResult.Items.Add;
              newItem.Caption:=Fields.Fields[0].AsString;
              for i:=1 to FieldCount-1 do
              begin
                newItem.SubItems.Add(Fields[i].AsString);
              end;
              Next;
            end;
          end;
      

  5.   

    numeric   ,你改为FLOAT或DOUBLE (18,2) 应该就解决了.=================
    猜想.NUMERIC对应到DELPHI字段类型值的时候出问题了.
    ====
      

  6.   


          with ClientDataSet do
          begin
            lvStatResult.Columns.Clear;
            for i:=0 to FieldCount-1 do
            begin
              newColumn:= lvStatResult.Columns.Add;
              newColumn.Caption:=Fields[i].FieldName;
              newColumn.Width:=80;
            end;
            lvStatResult.Items.Clear;
            while not Eof do
            begin
              newItem:=lvStatResult.Items.Add;
              newItem.Caption:= Fields[0].AsString;
              for i:=1 to FieldCount-1 do
              begin
                newItem.SubItems.Add(Fields[i].AsString);
              end;
              Next;
            end;
          end;
      

  7.   

    字段类型改为money,然后到控制面板里找到"区域语言选项",自定义,再改一下货币类型,小数点后几位。设置一下。这是微软设置就是显示什么样的。
      

  8.   

    非常感谢各位热心帮助,但问题仍未解决
    1、回复3楼兄弟:ShowMessage显示过,值为0,不是ListView的问题,另外已经试过使用DBGrid,值也是0;
    2、回复4楼兄弟:将Fields.Fields[0].AsString改为Fields[0].AsString 效果是一样的;
    3、回复6楼兄弟:你的办法我没测试,不过可以肯定的是DOUBLE (18,2)是不正确的,因为没有这个类型,而Float类型精度不够,所以未去尝试;
    4、回复7楼兄弟:暂不说你的回答COPY别人的,论说以阁下两个勋章的资历不应该认为这是答案呀,希望认真帮助;
    5、回复8楼兄弟:代码已经跟踪了N遍,客户端得到的浮点值就是0,整数值是正确的。SQL语句为一个不带参数的存储过程,因此保证了客户端与SQL查询分析器所执行SQL命令是一致的,但为什么结果却不一样呢?
    6、回复10楼兄弟:你的办法我没测试,感觉不正确。请各们高手继续帮忙解决
      

  9.   

    别用字段索引,用FieldByName('字段名').AsString试试
      

  10.   

    真的很怪,帮忙想想,会不会是因为存储过程中SUM(numeric类型)之后的结果Delphi不认啊,晕死我了这个问题已经用DBGrid测试过,结果是一样的,所以与用字段索引还是字段名无关
      

  11.   

    現在才看清楚,有一段不見了。  我暈死。首先聲明這種問題我還真不會拷貝別人的,你可看我回的貼子,我技術差但人品沒那麼差。你的問題如10樓所說,可翠出現了像日期格式一樣的問題。建議 newItem.SubItems.Add(Trim(format('%6.2f',Fields[i].AsFloat)));
     要是再說,別再說我不認真了,因為現在沒有開發環境。
      

  12.   

    另外 clientDataset  的各個字段是靜態化過來的還是動態通ADD來加的,如果是動態加的很有可能是精度沒有設置。目前能想到的就這麼多。只能等你解決沒有繼續了唉
      

  13.   

    TO:starluck
    不好意思,是我误解了,遇到这种奇怪问题心烦,你别往心里去,你在16楼和17楼的方法我试过也不行,让我奇怪的是:客户端代码不变,把存储过程中求和去掉,浮点数显示正常,SUM之后客户端显示就是0,怪事
      

  14.   


    唉,只要您老人家,不說我拷貝就行。因為我真沒。
    今天陪你走到底。 繼續。1.直接把存儲過程貼出來吧( 你的 ClientdataSet 執行的哪一個)2. 你的問題中的查詢分析器執行的代碼是什麼?? 拿出來
      

  15.   

    谢谢starluck的支持,问题解决了。解决办法如下:任何代码都没动,只是把字段类型由numeric改为money就正常了,正如10楼哥们儿所说,唉,真该死,人家给了正确答案我却没去试。不过,这是为什么呢,如果不对numeric类型字段进行求和的话,一切正常,难道说numeric类型以后不能用了???还请高手指点迷津
      

  16.   

    靜態設定字段看看,象這種delphi中沒有對應的類型,最好自己add字段,并設定好兼容類型
      

  17.   


     沒有不能用。相反我很多時候用DEC ,numeric  . MONEY有也有缺點的,不過不是程序方面的,是統計方面有不好的地方。 你解決了就好。呵呵
      

  18.   

    本帖明天结,大家别着急,我会本着“来者有份,重点给分”的原则,主要还想听听高手对“decimal 和 numeric”数据类型的使用心得
      

  19.   

    decimal(numeric )           同义,用于精确存储数值转换 decimal 和 numeric 数据
    对于 decimal 和 numeric 数据类型,Microsoft® SQL Server™ 将精度和小数位数的每个特定组合看作是不同的数据类型。例如,decimal(5,5) 和 decimal(5,0) 被当作不同的数据类型。在 Transact-SQL 语句中,带有小数点的常量自动转换为 numeric 数据值,且必然使用最小的精度和小数位数。例如,常量 12.345 被转换为 numeric 值,其精度为 5,小数位为 3。从 decimal 或 numeric 向 float 或 real 转换会导致精度损失。从 int、smallint、tinyint、float、real、money 或 smallmoney 向 decimal 或 numeric 转换会导致溢出。默认情况下,在将数字转换为较低精度和小数位数的 decimal 或 numeric 值时,SQL Server 使用舍入法。然而,如果 SET ARITHABORT 选项为 ON,当发生溢出时,SQL Server 会出现错误。若仅损失精度和小数位数,则不会产生错误。当定义一个NUMERIC型字段时,你需要同时指定整数部分的大小和小数部分的大小。如:MUNERIC(23,0) 一个 NUMERIC型数据的整数部分最大只能有28位,小数部分的位数必须小于或等于整数部分的位数,小数部分可以是零。 以上仅供参考
      

  20.   

    谢谢楼上的哥们儿,这些在SQL帮助里有,能说说在Delphi中统计时如何用吗?