各位大哥,小弟现在在练习一个人事管理的MIS,程序有个功能是
根据起止时间查询,有2个TMASKEDIT编辑框SEEK——START——TIME
和SEEK——END——TIME用于输入起止时间,BUTTON的ONCLICK事件
代码如下:
procedure TF_attendance.B_seek_ioClick(Sender: TObject);
var
  FilterStr:String;  start_time:string; end_time:string;
begin
  With DM_main.T_attendance do
  begin
    Close;
    FilterStr:='';
    start_time:='';
    end_time:='';
    if Seek_by_person.Checked then
    begin
      dbgrid1.datasource:= DM_main.ds_attendance;
      FilterStr:='PERSON='''+Seek_person_id.Text+'''';
      open;
    end;
    if Seek_by_time.Checked then
    begin
      dbgrid1.datasource:= DM_main.datasource1;
      with  DM_main.query1 do
        begin
          close;
          sql.Clear;
           sql.Add('select * from attendance where io_time>start_time and io_time<end_time');
           parambyname('start_time').AsString:=Seek_start_time.Text;
           parambyname('end_time').AsString:=Seek_end_time.Text;
           prepare;
          open;
        end;
      //if length(FilterStr)>0 then
       // FilterStr:=FilterStr+' AND ';
      //FilterStr:=FilterStr+'IO_TIME>'+Seek_start_time.Text;
      //FilterStr:=FilterStr+' AND IO_TIME<'+Seek_end_time.Text;
    end;
    if length(FilterStr)>0 then
    begin
      Filter:=FilterStr;
      Filtered:=True;
    end
    else
      Filtered:=False;
    //Open;
  end;
end;
其中io-time是datetime型的,执行时提示'query1:parameter 'start_time' not found'.
这是个随书带的练习程序,原来是通过filter使用的(即被注释掉的语句),执行时有错误,我便加了个
query1,通过query1查询,还是遇到问题了。程序其他部分应该是好的,把
sql.Add('select * from attendance where io_time>start_time and io_time<end_time');
           parambyname('start_time').AsString:=Seek_start_time.Text;
           parambyname('end_time').AsString:=Seek_end_time.Text;
           prepare;
换成 sql.Add('select * from attendance where io_time>"2002-11-01" and io_time<2002-12-06"'); 
执行能查出符合条件的记录。
请问是哪里有问题?应该怎么写sql语句?如果用filter,该怎样写?
小弟多谢了!!!

解决方案 »

  1.   

    最好不用Filter,直接写SQL语句      with  DM_main.query1 do
            begin
              close;
              sql.Clear;
               sql.Add('select * from attendance where io_time>:start_time and io_time<:end_time');
               parambyname('start_time').AsString:=Seek_start_time.Text;
               parambyname('end_time').AsString:=Seek_end_time.Text;
               prepare;
              open;
            end;
      

  2.   

    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
             with query1 do
          begin
          close;
          sql.clear;
         sql.add('select * from personnel_no.db where 進廠日期>:ri1 and 進廠日期<:ri2');
            query1.params[0].asdatetime:=DateTimePicker1.Date;
           query1.params[1].asdatetime:=DateTimePicker2.Date;
            open;       
          end;
    end;
      

  3.   

    sql.Add('select * from attendance where io_time>start_time and  io_time<end_time');
               parambyname('start_time').AsString:=Seek_start_time.Text;
               parambyname('end_time').AsString:=Seek_end_time.Text;
    prepare;--------------------
    Start_Time  和 End_Time 都是字符串变量,放在外边 
    时间与字符串的用法一样Sql.Text := 'select * from attendance where io_time >''' + Start_Time + '''' + 'and Io_Time < ''' + End_Time + '''' ;不用参数
      

  4.   

    即使用参数也要用   :ValueName 引入
      

  5.   

    ">:" 就是 ">=" 吗?