比如:我有两个datetimepicker:datetimepickerFrom 和 datetimePickerTo,通过把日期格式化为YYYYMMDD形式的字符串作为条件加入到adoquery中。
szRQ1 := formatdatetime('yyyymmdd',datetimepickerFrom.date);
szRQ2 := formatdatetime('yyyymmdd',datetimepickerTo.date);adoquery1.sql.add('select * from tablename where fieldname between '''+szRQ1 + ''' and '''+szRQ2+'''');
adoquery1.open;现在发现在form创建时赋值的两个datetimepicker的日期不起作用,只有在两个上面分别点击一下(不需要修改),然后执行的结果才是正确的。请问这是为什么?

解决方案 »

  1.   

    看看你的SQL语句是写在什么事件中的,可能没有触发到该事件吧
      

  2.   

    把给datetimepickerFrom.date 和 datetimePickerTo.date赋值的语句写进OnCreate把szRQ1 := formatdatetime('yyyymmdd',datetimepickerFrom.date);
    szRQ2 := formatdatetime('yyyymmdd',datetimepickerTo.date);
    adoquery1.sql.add('select * from tablename where fieldname between '''+szRQ1 + ''' and '''+szRQ2+'''');
    adoquery1.open;写进Onshow再试试
      

  3.   

    程序要首先对datatimepicker初始化,就没问题了
      

  4.   

    geyobing(银翼天使):我就是在打开窗口的时候给datetimepicker赋值的。这两个组件是设计时就放在窗口上的,不是动态创建。
    cxz7531(cat):因为我查询是要更改条件的,我总不能每查一次就重新打开窗口一遍吧?
    zhusongdong(东):我当然是在事件触发时执行sql查询的,这一点我可以肯定,否则怎么会点击以后再查询就对了呢?我是用按钮触发查询的。语句都放在button的onclick里面。
      

  5.   

    你用什么数据库?我觉得szRQ1 := formatdatetime('yyyymmdd',datetimepickerFrom.date);不对
    改为szRQ1 := formatdatetime('yyyy-mm-dd',DateTimePicker1.date);
    那就把szRQ1 := formatdatetime('yyyymmdd',datetimepickerFrom.date);
    szRQ2 := formatdatetime('yyyymmdd',datetimepickerTo.date);
    adoquery1.sql.add('select * from tablename where fieldname between '''+szRQ1 + ''' and '''+szRQ2+'''');
    adoquery1.open;
    写进button的onclick
     
    要想在窗口刚显示出来的时候,也有查询结果,就把这段代码原封不动复制到onshow,至于给datetimepickerFrom.date 和 datetimePickerTo.date赋值的语句放在oncreate可以,放在onshow的最前面也可以
      

  6.   

    我上面说的oncreate和onshow只是为了答复上面的问题。
    我的实际情况是:
    1.日期格式因为我自定义的表结构就是yyyymmdd的,所以日期格式并不是个问题。
    2.我在界面上放了2个datetimepicker,一个button,我所写的条件赋值和adoquery操作都在button.click里面。datetimepicker在窗口创建时有初始赋值,在运行中可以更改datetimepicker的值,然后通过button.click进行查询。
    3.现在的问题是:如果我不点击两个datetimepicker,直接点击button的话就不会得到正确的结果,只有在两个picker里面点过之后,执行的结果才是正确的。
      

  7.   

    不可能吧,你是不是把szRQ1 := formatdatetime('yyyymmdd',datetimepickerFrom.date);
    szRQ2 := formatdatetime('yyyymmdd',datetimepickerTo.date);
    写到DateTimePicker.OnChange里去了??
      

  8.   

    另外把adoquery1.sql.add('select * from tablename where fieldname between '''+szRQ1 + ''' and '''+szRQ2+'''');的前面加上adoquery1.sql.clear
    或者干脆改成
    adoquery1.sql.Text:='select * from tablename where fieldname between '''+szRQ1 + ''' and '''+szRQ2+'''';
      

  9.   

    两个赋值语句是在button.click里面,放在adoquery.sql赋值之前。
    整个看起来就像这样:procedure button1.onclick(sender : TObject);
    var szRQ1,szRQ2 : string;
    begin
      szRQ1 := formatdatetime('yyyymmdd',datetimepickerFrom.date);
      szRQ2 := formatdatetime('yyyymmdd',datetimepickerTo.date);
      with adoquery1 do
      begin
        close;
        sql.clear;
        sql.add('select * from tablename where fieldname between '''+szRQ1 + ''' and '''+szRQ2+'''');
        Open;
      end;
    end;我当然会先把sql清掉
      

  10.   

    procedure TfrmZpGr.SpeedButtonRefreshClick(Sender: TObject);
    var szRq1,szRq2 : string;
    begin
      szRq1 := formatdatetime('yyyymmdd',Datetimepicker1.date);
      szRq2 := formatdatetime('yyyymmdd',Datetimepicker2.date);
      ReLoad(szRq1,szRq2);end;
    procedure TfrmZpGr.reload(ARq1,Arq2 : string);
    var szTemp : string;
    begin
      szTemp := 'select * from www_zpgr where Kdrq between '''+Arq1+''' and '''+Arq2+'''';
      with Q do
      begin
        close;
        sql.clear;
        sql.add(szTemp);
        try
          Open;
        except
          messagedlg('刷新支票购入记录时出错',mtError,[mbOk],0);
          exit;
        end;
      end;
    end;