sql.Add('select * from overtime where convert(varchar,overtime_date,111) like '+'''%'+trim(edit_time.Text)+'%'+''''+' and overtime_id= '+#39+trim(edit2.Text)+#39);
這條語句adoquery1.是做查詢的.結果是:
overtime_date(日期) overtime_id(工號) overtime_totaltime(加班時間)         
2002/11/8              168                  3
2002/11/9              168                  3
而我現在另外做了一個adoquery.想在上面的基礎上算出這個員工加班的總時間.并把它把到edit3中.
我試了一下.下面的語句不行.請指教.
sql.Add('select sum(overtime_totaltime) as sumtime from overtime where convert(varchar,overtime_date,111) like '+'''%'+trim(edit_time.Text)+'%'+''''+' and overtime_id= '+#39+trim(edit2.Text)+#39);
edit3.text:=adoquery.fieldbyname('sumtime').asstring;

解决方案 »

  1.   

    with adoquery1 do
        begin
          close;
          sql.Clear;
          sql.Add('select * from danweibiao where dwmc like :dwmc');
          Parameters[0].Value:='%'+edit1.text+'%';
          open;
        end;
    用参数吧
      

  2.   

    sql.Add('select sum(overtime_totaltime) as sumtime from overtime')這樣可以算出所有的時間.加上后面的條件就不行了.
      

  3.   

    procedure TF_overtime.button2Click(Sender: TObject);
    begin
      with adoq_overtime do
      begin
        close;
        sql.Clear;
        sql.Add('select * from overtime where convert(varchar,overtime_date,111) like '+'''%'+trim(edit_time.Text)+'%'+''''+' and overtime_id= '+#39+trim(edit2.Text)+#39);
        open;
      end;
      //edit_time.Text:='';
      edit2.Text:='';
      edit2.SetFocus;
      ////////////////////////////////以下計算加班總時數
      with adoq_total do
      begin
        close;
        sql.Clear;
        sql.Add('select sum(overtime_totaltime) as sumtime from overtime where convert(varchar,overtime_date,111) like '+'''%'+trim(edit_time.Text)+'%'+''''+' and overtime_id= '+#39+trim(edit2.Text)+#39);
        prepared;
        open;
      end;
      //sbar1.Panels[0].Text:=adoq_total.fieldbyname('sumtime').asstring;
      edit3.Text:=adoq_total.fieldbyname('sumtime').AsString;
    end;
      

  4.   

    你跟踪一下看第一个查询有没有结果,记录数是否大于1
    再跟踪一下第二个查询,在open后看有没有记录被检索出
      

  5.   

    你的overtime_id是字符型 它的宽度是多少?
      

  6.   

    哎.我在Sql中試了一下.好象sql不能這樣寫.
    select sum(overtime_totaltime) as cnt 
    from overtime
    where overtime_date like '2002/11%' and overtime_id like'g%'
    go
      

  7.   

    这样确实怪怪的,我在SQL SERVER中模拟了以上的代码,能够达到统计目的。其实,你的目的是想在原有的 adoq_overtime 数据集中取得有关 OverTime_TotalTime 字段的所有行的总数。
    这样的话就干脆可以用另外一种方法来实现:在 adoq_overtime 控件的 AfterRefresh 事件中累加 OverTime_TotalTime 的值然后赋予 edit3.Text ,我觉得这样会更好,因为使用的控件少了一个,但又可以达到目的,效率也不会降低。试一试把。
    有空多交流啦...
      

  8.   

    如果 adoq_overtime 与一些数据敏感控件有关的话,就应该考虑到数据显示的问题,加些处理的代码即可。
      

  9.   

    select sum(overtime_totaltime) as cnt 
    from overtime
    where year(overtime_date)=2002 and month (overtime_date )=11 and overtime_id ='g057'
    這是我在數據庫版問到的結果.在SQL中能夠通過哦.可是在程序中怎樣做呢?
      

  10.   

    你在周六的时候加班写加班单的程序,是不是觉得有意思呢,我觉得软件设计这工作虽然还受人尊敬,但我们付出了比别人多的多的时间来干活。话说回来,如果没有挑战有怎么有提高呢?没有莫名其妙的东西又怎么会让生活更充实呢?
    另外,你为什么使用繁文版的WINDOWS呢?在哪里工作,我对考勤等企业管理方面的设计有兴趣,大家交个朋友,交流交流如何?
      

  11.   

    因為在我的程序中,只是用一個edit來輸入日期的.如果要改成兩個分別表示年月.那要改很多的.
      

  12.   

    我想可能是在 VCL 控件中存在着一些还不清楚的因素的原因,有空的话可以做试验来证明。
    其实,我上面说的方法应该更有效,只不过改一些代码而已,十来分钟就可以做到了。你没有注意到吗?
      

  13.   

    你的SQL没有错,我问你你报的什么错干吗不说?
      

  14.   

    procedure adoq_overtimeAfterRefresh(DataSet: TDataSet);
    var
      OverTime_Sum : Integer;
    begin
      OverTime_Sum := 0;
      with adoq_overtime do
      begin
        First;
        while not eof do
        begin
          OverTime_Sum := FieldByName('overtime_totaltime').AsInteger;
        end;
      end;
      edit3.text := IntToStr(OverTime_Sum);
    end;这个代码应该可以解决问题了,不过没有调试,请记得把结果通报给我们呐。
      

  15.   

    对不起,刚才急着回答,所以给出了错误的代码。现在更正如下(将代码写道 OnAfterOpen 事件中,还补上了 Next 语句,已经经过调试成功):procedure adoq_OverTimeAfterOpen(DataSet: TDataSet);
    var
      Amount_Sum : Integer;
    begin
      Amount_Sum := 0;
      with adoq_OverTime do
      begin
        First;
        while Not Eof do
        begin
          Amount_Sum := Amount_Sum + FieldValues['Amount'];
          Next;
        end;
      end;
    end;有空聊一聊啦,再见。
      

  16.   

    你有沒注意到在第一個查詢完之后.edit2已經被置為null
    應該是
      procedure TF_overtime.button2Click(Sender: TObject);
    begin
      with adoq_overtime do
      begin
        close;
        sql.Clear;
        sql.Add('select * from overtime where convert(varchar,overtime_date,111) like '+'''%'+trim(edit_time.Text)+'%'+''''+' and overtime_id= '+#39+trim(edit2.Text)+#39);
        open;
      end;
      //edit_time.Text:='';
      //edit2.Text:='';//注意這里
      //edit2.SetFocus;
      ////////////////////////////////以下計算加班總時數
      with adoq_total do
      begin
        close;
        sql.Clear;
        sql.Add('select sum(overtime_totaltime) as sumtime from overtime where convert(varchar,overtime_date,111) like '+'''%'+trim(edit_time.Text)+'%'+''''+' and overtime_id= '+#39+trim(edit2.Text)+#39);
        prepared;
        open;
      end;
      //sbar1.Panels[0].Text:=adoq_total.fieldbyname('sumtime').asstring;
      edit3.Text:=adoq_total.fieldbyname('sumtime').AsString;
    end;
    edit2.Text:='';
    edit2.SetFocus;
      

  17.   

    pandarus(冷雨) 观察得很细致,在第二个查询前已经改变了 edit2 的值,后一个查询再调用 edit2.text 的话,那就取得了空白的字符值,查询条件也就相应的变了。
    不过,我认为还是在原有的查询上进行字段累计的方法会更有效率,不知 pandarus(冷雨) 的意见如何。E - Mail : [email protected]