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

好奇怪的问题查询显示问题

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-04 16:19:07 IP:222.184.xxx.xxx 未訂閱
查询部份代码如下: if (CheckBox1.Checked or CheckBox2.Checked or CheckBox3.Checked or checkbox4.Checked or checkbox5.Checked or checkbox6.Checked or checkbox7.Checked or checkbox8.Checked) = False then Application.MessageBox('至少选择一个查询条件','提示',MB_OK) else 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;      ...........       if CheckBox7.Checked then       begin       ADOQuery1.SQL.Add('and 票据号 between :Number1 and :Number2');       ADOQuery1.Parameters.ParamByName('Number1').Value := StrToInt(Edit5.Text);       ADOQuery1.Parameters.ParamByName('Number2').Value := StrToInt(Edit6.Text);     end;   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.Open;     if ADOQUERY1.IsEmpty 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 (' + ADOQuery1.SQL.Text + ')';   ADOQuery2.Open;   statusbar1.Panels [0].Text:= '符合查询条件的记录共有'+IntToStr(DBGrid1.DataSource.DataSet.RecordCount)+'条';  // StatusBar1.Panels[1].Text := '合计金额'+FloatToStr(ADOQuery2.Fields[0].Value);   end;   end;     错误现象,如果上述代码中最后一条屏蔽掉的话,一切正常。 如果不屏蔽掉最后一条,在执行 CheckBox1-6(共八个,我只写了三个)时,所有功能正常,在执行第七和第八个查询时出现错误:如图
------
我的编程起步于ktop,我将永远支持ktop
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-04 16:51:24 IP:202.62.xxx.xxx 未訂閱
您好!    發現您的程式碼中SQL語法部分在末句時少了一個空格,如下: ADOQuery1.SQL.Add('_and 病人姓名='''+edit1.Text+''''); //以上紅色下劃線處爲一個空格。 將您的程式碼修改如下:
begin
  if Not ((CheckBox1.Checked) or (CheckBox2.Checked) or (CheckBox3.Checked) or (checkbox4.Checked) or (checkbox5.Checked) or (checkbox6.Checked) or (checkbox7.Checked) or (checkbox8.Checked))  then
    Application.MessageBox('至少選擇一個查詢條件','提示',MB_OK)
  else
    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;
        ...........
      if CheckBox7.Checked then
        begin
          ADOQuery1.SQL.Add('_and 票據號 between :Number1 and :Number2');
          //以上紅色下劃線處爲一個空格
          ADOQuery1.Parameters.ParamByName('Number1').Value := StrToInt(Edit5.Text);
          ADOQuery1.Parameters.ParamByName('Number2').Value := StrToInt(Edit6.Text);
        end;
      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.Open;
      if ADOQUERY1.IsEmpty then
        showmessage('沒有找到相符的記錄');
end;
另外﹐從錯誤信息來看﹐在程式Run的時候可能有出現Null值的不符合資料表架構(數值類型字段不允許Null值)的現象﹐檢查一下這部分的問題﹒ 供參考! ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/06/04 17:12:45
------
忻晟
ntjrr
高階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-04 18:14:47 IP:222.184.xxx.xxx 未訂閱
and空格全部加上了,不过好象还是出现同样的错误,您所说的不允许 null值,我在ADOQUEY1中已经有了Where 应收金额<>0',照理说AQOQUEY1查询出的结果中不会有0的,更不会有没数字的,不知道该如何再修改一下
------
我的编程起步于ktop,我将永远支持ktop
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-04 18:23:55 IP:202.62.xxx.xxx 未訂閱
您好﹗    請問您之前說的"如果上述代碼最后一條屏蔽掉的話"﹐是指哪一句﹖如果是StatusBar1.Panels[1].Text := '合计金额'+FloatToStr(ADOQuery2.Fields[0].Value);這句話﹐請檢查在StatusBar1的Panels屬性中﹐是否有存在兩個Panel﹐分別為Panel[0]和Panel[1]﹖如果只有Panel[0]的話﹐再新增一個試試﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
ntjrr
高階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-04 18:30:01 IP:222.184.xxx.xxx 未訂閱
是您说的这一句话,我查了一下,我有三个panles,另外一个是固定的提示文本。最后一句不用,什么都好运行,最后一句用了,也不是全部不好运行,上面的六个查询都好用的,而且统计的金额都对的,只有最下面两个中的哪一个条件一用就有那个错误提示
------
我的编程起步于ktop,我将永远支持ktop
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-04 18:38:55 IP:202.62.xxx.xxx 未訂閱
您好﹗    原來是這樣﹐這是因為您在CheckBox7和CheckBox8的程式碼部分有使用:Number1, :Number2, :Date1, :Date2等變數﹐在使用ADOQuery2的SQL語法時﹐其中的子查詢部分就是ADOQuery1的SQL內容﹐但沒有賦值給以上四個變數﹐增加如下紅色處程式碼即可﹕
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 + ')';
      ADOQuery2.Parameters.ParamByName('Number1').Value := StrToInt(Edit5.Text);
      ADOQuery2.Parameters.ParamByName('Number2').Value := StrToInt(Edit6.Text);
      ADOQuery2.Parameters.ParamByName('Date1').Value := formatdatetime('yy-m-d',DateTimePicker1.Date);
      ADOQuery2.Parameters.ParamByName('Date2').Value := formatdatetime('yy-m-d',DateTimePicker2.Date);
      ADOQuery2.Open;
      statusbar1.Panels [0].Text:= '符合查询条件的记录共有'+IntToStr(DBGrid1.DataSource.DataSet.RecordCount)+'条';
      StatusBar1.Panels[1].Text := '合计金额'+FloatToStr(ADOQuery2.Fields[0].Value);
    end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
系統時間:2024-06-26 20:56:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!