線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1162
推到 Plurk!
推到 Facebook!

栏位1/栏位2,分母为0

尚未結案
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-03 08:38:47 IP:61.164.xxx.xxx 未訂閱
各位高手: 小弟又有问题麻烦各位,我想将栏位1/栏位2并形成栏位3,但栏位2中有些cell有可能为0或null,我希望当栏位2中的cell为0或null值时在相应的栏位3的cell中秀出“分母为0或空”,请教该如何实现?(如果一条条record进行判断好象会影响speed?),小弟用delphi和sql server. Thank you very much!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-03 09:28:44 IP:210.65.xxx.xxx 未訂閱
Hi:    你可以使用計算欄位,並於 OnCalcFields 欄位中,計算出 filed3 的值
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
    if dataset.FieldByName('Field2').AsInteger = 0 then
        DataSet.FieldByName('Field3').AsString := '分母為0或空'
    else
        DataSet.FieldByName('Field3').AsString := FloatToStr(DataSet.FieldByName('Field1').AsInteger / DataSet.FieldByName('Field2').AsInteger);
end;
或是可以直接在 SQL 語法中使用 Case 指令 [code] select Filed1, Filed2 case when Filed2 = 0 then 'filed2 為零' when Filed2 is null then 'Field2 為空' else convert(char,Filed1/Filed2) end from Table [/cdeo] -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-03 21:26:31 IP:218.160.xxx.xxx 未訂閱
有一陣子沒碰SQL了, 試一下 Select F1, F2, (Case when ISNULL(F2, 0) = 0 then '分母为0或空' else F1/F2 end) as F3 from Table 我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/02/03 21:27:13
------


我不是高手, 高手是正在銀幕前微笑的人.
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-03 21:53:53 IP:61.164.xxx.xxx 未訂閱
您好!    感谢您的回应,我试了一下,只要分母为'0',就会出现以下错误,还请大大再帮帮忙!   
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-04 08:18:52 IP:210.65.xxx.xxx 未訂閱
Hi:    問題應該出在你的第三個欄位值(DZPJE),因為 '分母為0或空' 為VARCHAR 而 (XHZEJ / THZJE) 則為 FLOAT,因此建議將 (XHZEJ / THZJE) CONVERT 為字串,讓前後之指定型態一致     -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-04 17:40:07 IP:218.72.xxx.xxx 未訂閱
引言: Hi: 問題應該出在你的第三個欄位值(DZPJE),因為 '分母為0或空' 為VARCHAR 而 (XHZEJ / THZJE) 則為 FLOAT,因此建議將 (XHZEJ / THZJE) CONVERT 為字串,讓前後之指定型態一致 --------------------------------
谢谢各位大大,我已试出来了,如下: Select xhzje, thzje, (Case when ISNULL(thzje, 0) = 0 then '分母为0或空' else convert(char,xhzje/thzje) end) as F3 from xsrbb 另:fishman大大第一篇回应中"select field1,field2"后面忘了加“,”,这样才能使用 由于我入行还短,我还想再问一下,fishman大大第一种方法中"OnCalcFields"的含义是什么?我只用了adotable和adoquery,,我平时没用过OnCalcFields,查了资料写得不太明白,我试不出来,谢谢!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-05 08:49:38 IP:210.65.xxx.xxx 未訂閱
Hi:    luowy651,打錯字,應該是 你可以使用計算欄位,並於 OnCalcFields 事件中,計算出 filed3 的值 此用法事先行定義 DataSet 的各個 Field,並增加一個 Calculated Field,然後在DataSet 的 OnCalcFields 事件中,以 Delphi 的語法,將 Calculated Field 的值計算出來
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
    if Dataset.FieldByName('THZJE').AsInteger = 0 then
        DataSet.FieldByName('THZJE').AsString := '分母為0或空'
    else
        DataSet.FieldByName(DZPJE').AsString := FloatToStr(DataSet.FieldByName('XHZEJ').AsInteger / DataSet.FieldByName('THZJE').AsInteger);
end;
-------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-05 09:42:28 IP:218.72.xxx.xxx 未訂閱
感谢Fishman大大和Miles大大,两位的方法都很好用! 衷心感谢!
系統時間:2024-11-23 7:24:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!