order by 在SQL查询中的错误 |
答題得分者是:malanlk
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
代码如下,ACCESS中运行正常 begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * From tb_sf Where 应收金额<>0'); if CheckBox1.Checked then begin ADOQuery1.SQL.Add(' and 病人姓名=''' edit1.Text ''''); end; ...........//中间还有六个CHECKBOX,其中一个是票据号, if CheckBox8.Checked then begin ADOQuery1.SQL.Add(' and 收费日期 between :Date1 and :Date2'); ADOQuery1.Parameters.ParamByName('Date1').Value := formatdatetime('yy-m-d',DateTimePicker1.Date); ADOQuery1.Parameters.ParamByName('Date2').Value := formatdatetime('yy-m-d',DateTimePicker2.Date); end; ADOQuery1.SQL.Add('order by 票据号'); ADOQuery1.Open; if ADOQUERY1.RecordCount=0 then showmessage('没有找到相符的记录'); end;SQL中出错如下: 除非设定了TOP,否则不能在SQL子查询......中使用ORDER BY语句
------
我的编程起步于ktop,我将永远支持ktop |
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
问题找出来了,上面这一段代码本身其实没有问题,是下面的一段代码的问题
procedure Tsfcxform.ADOQuery1AfterOpen(DataSet: TDataSet); begin {if not adoquery1.IsEmpty then begin ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Text := 'Select Sum(应收金额) From (' ADOQuery1.SQL.Text ')'; if checkbox7.Checked then begin ADOQuery2.Parameters.ParamByName('Number1').Value := StrToInt(Edit5.Text); ADOQuery2.Parameters.ParamByName('Number2').Value := StrToInt(Edit6.Text); end; if checkbox8.Checked then begin ADOQuery2.Parameters.ParamByName('Date1').Value := formatdatetime('yy-m-d',DateTimePicker1.Date); ADOQuery2.Parameters.ParamByName('Date2').Value := formatdatetime('yy-m-d',DateTimePicker2.Date); end; ADOQuery2.Open; statusbar1.Panels [0].Text:= '符合查询条件的记录共有' IntToStr(DBGrid1.DataSource.DataSet.RecordCount) '条'; StatusBar1.Panels[1].Text := '合计金额' FloatToStr(ADOQuery2.Fields[0].Value); end; } end;我把上面的代码屏蔽掉就没有错误产生了,那么有没有其他方法得到ADOQUERY1中的应收金额字段的合计呢?
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
WhereStr := 'Where 應收金額<>0'; if CheckBox1.Checked then begin WhereStr := WhereStr ' and 病人姓名=''' edit1.Text ''''; end; if CheckBox2.Checked then begin WhereStr := WhereStr ' and 醫生姓名=''' edit2.Text ''''; end; if CheckBox4.Checked then begin WhereStr := WhereStr ' and 收費員=''' combobox3.Text ''''; end; if CheckBox6.Checked then WhereStr := WhereStr ' and 醫生科室=''' combobox2.Text ''''; end; if CheckBox7.Checked then begin WhereStr := WhereStr Format(' and 票據號 between %s and %s',[Edit5.Text,Edit6.Text]); end; if CheckBox8.Checked then begin WhereStr := WhereStr Format(' and 收費日期 between %s and %s',,[formatdatetime('yy-m-d',DateTimePicker1.Date),formatdatetime('yy-m-d',DateTimePicker2.Date)]); end; .... begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * From tb_sf '); ADOQuery1.SQL.Add(WhereStr); ADOQuery1.SQL.Add(' order by 票據號'); ADOQuery1.Open; if ADOQUERY1.RecordCount=0 then showmessage('沒有找到相符的記錄'); end; procedure Tsfcxform.ADOQuery1AfterOpen(DataSet: TDataSet); begin if not adoquery1.IsEmpty then begin ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Text := 'Select Sum(應收金額) From tb_sf ' WhereStr); ADOQuery2.Open; statusbar1.Panels [0].Text:= '符合查詢條件的記錄共有' IntToStr(DBGrid1.DataSource.DataSet.RecordCount) '條'; StatusBar1.Panels[1].Text := '合計金額' FloatToStr(ADOQuery2.Fields[0].Value); end; end;ntjrr 兄, 變通一下吧, 山不轉路轉.... |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
之所以要用 ADOQuery2 的主要原因是 有時候我們不希望所有的資料一口氣都讀到Client端, 特別是在頻寬有限資料量又大的時候. 如果等太久, 就會讓使用者反感...ADOQuery 的CacheSize, MaxRecords 就是用來控制讀取的數量. 在這種情況下, ADOQuery1不會一次將所有資料都抓回來, 自然不會在 Client 端計算總和, 而採取 ADOQuery2 再下Query的方式. 你如果想在 Client 端計算可以 這樣寫
procedure Tsfcxform.ADOQuery1AfterOpen(DataSet: TDataSet); var iSum: Double; //iStart,iEnd: Cardinal; begin if not adoquery1.IsEmpty then begin //iStart := GetTickCount; ADOQuery1.DisableControls try iSum := 0; ADOQuery1.First; while not ADOQuery1.Eof do begin iSum := iSum ADOQuery1.FieldByName('應收金額').AsFloat; ADOQuery1.Next; end; // iEnd := GetTickCount; // 花的時間等於 iEnd-iStart (單位: 千分之ㄧ秒) ADOQuery1.First; finally ADOQuery1.DisableControls; end; statusbar1.Panels [0].Text:= '符合查詢條件的記錄共有' IntToStr(ADOQuery1.RecordCount) '條'; StatusBar1.Panels[1].Text := '合計金額' FloatToStr(iSum); end; end;你可以用 GetTickCount 函數, 來測量一下哪一種較快, 調整 CacheSize 再比較一下...... 發表人 - malanlk 於 2005/08/26 00:59:03 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
前辈的方法我试过了,运行正常,速度我没有测,因为我不懂千分之一秒如何转换成STRING类型,不过感觉速度不慢,还可以,其中有一个问题在ADOQuery1.DisableControls这一句,这一句如果用的话,查询结果就不好往上往下拉了,在查询结果多的时候想看哪一条不好看了,如果没有这一句的话,查询时光标就会从第一条依次往下滚动,变得慢了,也不必要。我想可不可以先DisableControls,再收回控制,如果可以的话,如何重让ADOQUERY能够controls,代码插入哪一行?
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |