我编一个运算的程序,下面的[本期业务收入]有时是0,一运算后程序提示 遇到被0除的错误,这种问题得怎么屏蔽呢,我不知道怎么写屏蔽代码,请高手指教
    with ADOQuery1 do
     begin
        close;
        sql.Clear ;
        sql.Add('select [id号], [名称]',);
        sql.Add('[本期利润]/[本期业务收入] as 本期毛利率');
        sql.Add('from _table');
        open;
     end;

解决方案 »

  1.   

    加上SQL子句:where 本期业务收入<>0对不对?我没验证
      

  2.   

    可以用CASE语句来预防除0错误, SQL语句类似于:
    SELECT [id号], [名称],
    (CASE [本期业务收入]
      WHEN 0 THEN 0 
      ELSE [本期利润]/[本期业务收入]
    END) as 本期毛利率
    FROM _table
      

  3.   

    可以做一个陷阱,用以捕获异常:
            with   ADOQuery1   do 
              begin 
                    close; 
                    sql.Clear   ; 
                    sql.Add('select   [id号],   [名称]',); 
                    sql.Add('[本期利润]/[本期业务收入]   as   本期毛利率'); 
                    sql.Add('from   _table'); 
                    try
                      open; 
                    except
                      on e: exception do
                      begin
                        ShowMessage('ADOQuery1运行出错: '+e.Message);
                        ...  //可以加入自定义处理过程.
                      end;
                    end;
              end;
      

  4.   

    我写完后,提示“不允许数据类型从varchar 到money 的隐形转换,请用convert函数来运行此查询”为什么会提示这个?
    我的写法是,[本期业务收入]有的是没填数的是空值
    SELECT [id号], [名称],
    (CASE isnull([本期业务收入],0)
      WHEN 0 THEN 0 
      ELSE [本期利润]/[本期业务收入]
    END) as 本期毛利率
    FROM _table
      

  5.   

    我测试一下,没有出现你的问题
    create table tt(id号 int,名称 varchar(20),本期利润 numeric(16,3),本期业务收入 numeric(16,3))insert into tt values(1,'dd',2033,200);
    insert into tt values(2,'dda',2033,200);
    insert into tt values(3,'dd22',23,0);
    insert into tt(id号,名称,本期利润) values(4,'ddda',2033);SELECT [id号], [名称],
    (CASE [本期业务收入]
      WHEN 0 THEN 0 
      ELSE [本期利润]/[本期业务收入]
    END) as 本期毛利率
    FROM tt1 dd 10.16500000000000000000
    2 dda 10.16500000000000000000
    3 dd22 .00000000000000000000
    4 ddda NULL
      

  6.   

    上个帖子发错了,是我想让isnull([本期业务收入],0)=0的值查出来显示“错误”2个字,所以遇到了数据类型转换错误。
    得怎么显示字符呢我写完后,提示“不允许数据类型从varchar   到money   的隐形转换,请用convert函数来运行此查询”为什么会提示这个? 
    我的写法是,[本期业务收入]有的是没填数的是空值 
    SELECT   [id号],   [名称], 
    (CASE   isnull([本期业务收入],0) 
        WHEN   ''错误''  THEN   0   
        ELSE   [本期利润]/[本期业务收入] 
    END)   as   本期毛利率 
    FROM   _table 
      

  7.   

    下面这样写也没有问题,你检查一下你的表数据类型吧.
    SELECT [id号], [名称],
    (CASE convert(numeric(16,3),[本期业务收入]) 
      WHEN 0 THEN 0 
      ELSE [本期利润]/[本期业务收入]
    END) as 本期毛利率
    FROM ttSELECT [id号], [名称],
    (CASE isnull([本期业务收入],0) 
      WHEN 0 THEN 0 
      ELSE [本期利润]/[本期业务收入]
    END) as 本期毛利率
    FROM tt
      

  8.   

    "isnull([本期业务收入],0)=0的值查出来显示“错误”2个字"你如果想这样显示那就肯定会出错了,因为当<>0时,执行 [本期利润]/[本期业务收入] 是数字型的
    你只能这样写
    SELECT [id号], [名称],
    (CASE isnull([本期业务收入],0) 
      WHEN 0 THEN '错误'
      ELSE cast([本期利润]/[本期业务收入] as varchar(30))
    END) as 本期毛利率
    FROM tt显示结果:
    1 dd 10.16500000000000000000
    2 dda 10.16500000000000000000
    3 dd22 错误
    4 ddda 错误