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

order by 在SQL查询中的错误

答題得分者是:malanlk
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-22 18:41:59 IP:222.184.xxx.xxx 未訂閱
代码如下,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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-22 21:46:19 IP:211.74.xxx.xxx 未訂閱
order by 前面加空白... 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-23 07:11:37 IP:222.184.xxx.xxx 未訂閱
引言: order by 前面加空白... 星期一,星期二...星期日..星期一..無窮迴圈@@ < face="Verdana, Arial, Helvetica"> 加了空白没有用还是这么提示的
------
我的编程起步于ktop,我将永远支持ktop
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-23 17:00:34 IP:218.163.xxx.xxx 未訂閱
要不要將整段SQL貼上來, debug mode,游標停在ADOQuery1.SQL,按Ctrl+F7取得Sql內容 直接看你的sql應該就能找出問題 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-24 09:40:23 IP:222.184.xxx.xxx 未訂閱
编译后运行出错以后点下一步, 还是会有正常的查询结果出来的。我把ORDER BY 这一行去掉,运行时就提示 第三行‘)’附近有语法错误。一般情况下这就是输入)时输入法切换不好时产生的,但我不是输入的,我是拷贝来的,拷贝来的代码中ACCESS库中运行完全正常 發表人 - ntjrr 於 2005/08/24 21:08:45
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-25 08:55:47 IP:203.69.xxx.xxx 未訂閱
說老實話我完全看不懂樓上那篇的內容....
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-25 09:03:36 IP:222.184.xxx.xxx 未訂閱
那我就再换一种方式问,SQL数据库中,如何在SQL查询语句中根据CHECKBOX是否选中再加入查询条件后再排序呢?还有前辈指出对我哪个地方的意思不理解,我再仔细说明一下。
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-25 09:19:28 IP:203.69.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?topic_id=46042 該篇最後兩格可能就是答案 clientdataset1.close; clientdataset1.commandtext:='select * from "會員" order by "會員編號" desc'; clientdataset1.open;
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-25 15:39:13 IP:222.184.xxx.xxx 未訂閱
问题找出来了,上面这一段代码本身其实没有问题,是下面的一段代码的问题  
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-25 18:15:50 IP:203.69.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-25 20:33:01 IP:222.184.xxx.xxx 未訂閱
有没有这样一种方法的:就是不用ADOQUERY2了,直接根据DBGRID中的数据求和呢?比如说 StatusBar1.Panels[1].Text := '合計金額' SUM(DBGrid1.DataSource.DataSet.(然后加栏位名称))?
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-26 00:53:51 IP:61.219.xxx.xxx 未訂閱
之所以要用 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-08-26 07:31:00 IP:222.184.xxx.xxx 未訂閱
前辈的方法我试过了,运行正常,速度我没有测,因为我不懂千分之一秒如何转换成STRING类型,不过感觉速度不慢,还可以,其中有一个问题在ADOQuery1.DisableControls这一句,这一句如果用的话,查询结果就不好往上往下拉了,在查询结果多的时候想看哪一条不好看了,如果没有这一句的话,查询时光标就会从第一条依次往下滚动,变得慢了,也不必要。我想可不可以先DisableControls,再收回控制,如果可以的话,如何重让ADOQUERY能够controls,代码插入哪一行?
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-08-26 07:42:53 IP:203.69.xxx.xxx 未訂閱
    finally
      ADOQuery1.EnableControls;
    end;
Sorry! 隨手寫的, 寫錯了...
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-08-26 12:05:48 IP:222.184.xxx.xxx 未訂閱
前辈,测试基本成功了,顺便问一下,您觉得这两种方法,从理论上来讲应该是哪一种速度会快一点?另外能不能使用ADOQUERY中的COMPUTE这个功能,会不会还要简易快速?
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-08-26 18:14:59 IP:203.69.xxx.xxx 未訂閱
依你的需求, 你希望把資料一次抓完, 所以就在 Client 端計算吧. 如果要逐頁逐頁的抓, 再用 ADOQuery2 另下 query 的方式 快慢關乎連線方式及server,client主機能力,及負荷, 你可以自己測測吧... ADOQUERY COMPUTER 是什麼東西, 我不知道...
系統時間:2024-06-25 13:18:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!