我做了个管理系统,最后涉及到对数据库中数据的统计,我想用DateTimePicker控件按时间对数据库中的数据进行统计,
我的代码是:
if query1.Active then
query1.Close;
query1.ParamByName('start').AsDate:=DateTimePicker1.Date;
query1.ParamByName('end').AsDate:=DateTimePicker2.Date;
query1.SQL.Clear;
t1:=query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between :start and :end ');
query1.Open;
if query1.Fields[0].Value = varNull  then
edit3.Text:='0'
else
edit3.Text:=query1.Fields[0].AsString;但是这代码运行会出现:query1:Parameters'start' not found 的错误,不知道问题出在那了,麻烦高手们帮我看下问题出在什么地方。
谢谢!

解决方案 »

  1.   

    先赋SQL语句:query1.SQL.Clear;
    query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between :start and :end ');
    query1.ParamByName('start').AsDate:=DateTimePicker1.Date;
      

  2.   

    还是不行啊,
    出现的错误是:在关键字end附近有语法错误
      

  3.   

    再加一句
    query1.ParamByName('end').AsDate:=DateTimePicker2.Date;HsWong写了一句,楼主就不知再加一句了吗?
      

  4.   

    我加了的,
    我的代码是:
    if query1.Active then
    query1.Close;
    query1.SQL.Clear;
    t1:=query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between start and end ');
    query1.Open;
    query1.ParamByName('start').AsDate:=DateTimePicker1.Date;
    query1.ParamByName('end').AsDate:=DateTimePicker2.Date;
    if query1.Fields[0].Value = varNull  then
    edit3.Text:='0'
    else
    edit3.Text:=query1.Fields[0].AsString;这样也还是有错啊
    我觉得 start和end 定义有问题
    麻烦高手指点下
      

  5.   

    if query1.Active then
    query1.Close;
    query1.SQL.Clear;
    t1:=query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between :start and :end ');
    query1.Open;
    query1.ParamByName('start').AsDate:=DateTimePicker1.Date;
    query1.ParamByName('end').AsDate:=DateTimePicker2.Date;
    if query1.Fields[0].Value = varNull  then
    edit3.Text:='0'
    else
    edit3.Text:=query1.Fields[0].AsString;
      

  6.   

    query1.ParamByName('end').value:=DateTimePicker2.Date;
      

  7.   

    我试过了
    你说的query1.ParamByName('end').value:=DateTimePicker2.Date;
    也不行啊
      

  8.   

    query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between #'+datetostr(DateTimePicker1.Date)+'# and #' +datetostr(DateTimePicker2.Date)+'#');直接这样
      

  9.   

    或者
    if query1.Active then
    query1.Close;
    query1.SQL.Clear;
    t1:=query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between :start and :end ');
    query1.Open;
    query1.ParamByName('start').AsDate:=datetostr(DateTimePicker1.DateTime);
    query1.ParamByName('end').AsDate:=datetostr(DateTimePicker2.DateTime);
    if query1.Fields[0].Value = varNull  then
    edit3.Text:='0'
    else
    edit3.Text:=query1.Fields[0].AsString;
      

  10.   

    我直接用代码:
    query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between #'+datetostr(DateTimePicker1.Date)+'# and #' +datetostr(DateTimePicker2.Date)+'#');
    但是提示‘#’附近出错,
    不知道错在那了?
    麻烦在看下。谢谢!
      

  11.   

    用的SQL啊
    开始编译时没错,开始执行按钮事件就会出错
      

  12.   

    我把“#”改成“ ''' ”就不会出现#出错
    但是,就是运行后,如果选择的时间段之间没有数据,就会运行出错,错误是:'''is not a valid floating point value
    麻烦你在帮我看下
    谢谢!
      

  13.   

    是你的SQL语句有问题.if query1.Active then
    query1.Close;
    query1.SQL.Clear;
    query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''''购买'''' and 日期 between :start and :end ');
    query1.Open;
    query1.ParamByName('start').AsDate:=DateTimePicker1.Date;
    query1.ParamByName('end').AsDate:=DateTimePicker2.Date;
    if query1.Fields[0].Value = varNull  then
    edit3.Text:='0'
    else
    edit3.Text:=query1.Fields[0].AsString;
      

  14.   

    query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''''购买'''' and 日期 between start and end ');
      

  15.   

    不是SQL语句问题,我也试过你说的,也还是出错。
    错误是:'''is not a valid floating point value
    我觉得是判断是否存在出错了 ;
    if query1.Fields[0].Value = varNull  then
    edit3.Text:='0'
    我的想法是:数据库中在那个时间段没有记录,就让他等于零。
      

  16.   

    query1.ParamByName('start').AsString:=datetostr(DateTimePicker1.DateTime);
    query1.ParamByName('end').AsString:=datetostr(DateTimePicker2.DateTime);
      

  17.   

    我的代码是:if query1.Active then
    query1.Close;
    query1.SQL.Clear;
    query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''''购买'''' and 日期 between :start and :end ');
    query1.Open;
    if query1.Fields[0].Value = varNull  then
    edit3.Text:='0'
    else
    edit3.Text:=query1.Fields[0].AsString;没有要那两句了;
    还是有错
    麻烦在帮我看下
    谢谢!
      

  18.   

    query1.Close;
    query1.SQL.Clear;
    query1.SQL.Add('select isnull(sum([金额]),0) as [原材料进货成本] from [原材料] where [活动]=''购买''and [日期] between :startDate and :endDate ');
    //怀疑用中文作为表名和字段名出问题,所以加[]限制,怀疑end是关键字,所以改为enddatequery1.ParamByName('startdate').AsDate:=DateTimePicker1.Date;
    query1.ParamByName('enddate').AsDate:=DateTimePicker2.Date;
    //检查这两个参数有没有建立query1.Open;
    //在参数赋值之后,才open//if query1.Fields[0].Value = varNull  then
    //edit3.Text:='0'
    //else
    //在语句中用isnull处理过空值了,所以不用在这判断edit3.Text:=query1.Fields[0].AsString;祝楼主好运!
      

  19.   

    query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买'' and 日期 between :start and :end ');为什么是4个引号,应该是2个
      

  20.   

    请问下:怎么定义:startdate和enddate?
    谢谢!
      

  21.   

    我按照上面大侠的办法做了
    但是他说不知道startdate和enddate的类型
    应该怎么定义startdate和enddate呢?
    麻烦大侠在指点下
    谢谢!!!!!!!!
      

  22.   

    //在query1.SQL.Add('select ...这一句之后加如下建立参数的语句:query1.Parameters.Clear;      
    with query1.Parameters.AddParameter do
    begin
         name:='startdate';
         datatype:=ftDatetime;
    end;
    with query1.Parameters.AddParameter do
    begin
         name:='enddate';
         datatype:=ftDatetime;
    end;
      

  23.   

    我试了下,
    query1没有Parameters这个属性
    为什么呢?
    难道我其他地方还出错了吗?
      

  24.   

    你理解对了
    就是你说的那个意思:要是时间日期没有记录就赋值为0
    日期是datetime类型
    如果用上面那高手的办法做,出现的错误是:不知道startdate和enddate的类型
    而我的办法:
    if query1.Active then
    query1.Close;
    query1.SQL.Clear;
    t1:=query1.SQL.Add('select sum(金额)as 原材料进货成本 from 原材料 where 活动=''购买''and 日期 between '''+datetostr(DateTimePicker1.Date)+''' and '''+datetostr(DateTimePicker2.Date)+''' ');
    query1.Open;
    if query1.Fields[0].Value = varNull then
    edit3.Text:='0'
    else
    edit3.Text:=query1.Fields[0].AsString;
    这样出现的错误是:当时间段内没有记录时,运行就会出错,相反有的时候还不会出错,不知道是什么原因?
    错误是:'''is not a valid floating point value
      

  25.   

    日期 between '''+datetostr(DateTimePicker1.Date)+''' and '''+datetostr(DateTimePicker2.Date)这句改为
    日期 between TO_DATE('+QuotedStr(FORMATDATETIME('yyyy-MM-dd hh:mm:ss', DateTimePicker1.Date))+',''YYYY-MM-DD HH24:MI:SS'') ' and 'TO_DATE('+ QuotedStr(FORMATDATETIME('yyyy-MM-dd hh:mm:ss', DateTimePicker2.Date))+',''YYYY-MM-DD HH24:MI:SS'')'
      

  26.   

    DELPHI和ORACLE中时间格式比较麻烦,另外DateTimePicker控件只能支持一种格式,要么是日期,要么是时间,不能同时支持两种格式,所以,你要用日期时间的话,只能用两个DateTimePicker控件,一个的Kind属性设置为dtkDate,另一个Kind属性设置为dtkTime,最后运算的时候,把两个合起来
      

  27.   

    抱歉,上面的TO_DATE是ORACLE中的SQL函数,如果是SQL SERVER或ACCESS什么,得用它们自己的转换函数
      

  28.   


    你用的是ORACLE,
    我用的是SQL SERVER,
    那我应该怎么做呢?
    麻烦在指点下
    谢谢!
      

  29.   

    ORACLE中的TO_DATE()在SQLSERVER中用cast来代替,修改为日期 between cast('+QuotedStr(FORMATDATETIME('yyyy-MM-dd hh:mm:ss', DateTimePicker1.Date))+' as datetime) and cast('+ QuotedStr(FORMATDATETIME('yyyy-MM-dd hh:mm:ss', DateTimePicker2.Date))+' as datetime)'SQLSERVER我用的也不多,你试试,反正 就是要在SQL语句中统一类型,实在不行就用 >=和<=来弄,或者全转成字符串来比较
      

  30.   

    我觉得先声明两个string变量,把DateTimePicker的值formatdatetime或formatdate后再在SQL语句中使用。最好,整条SQL语句也用个string类型的变量来保存。这样即使有问题 设置断点后
    也能看到整条SQL很容易就看出错在哪里。
      

  31.   

    query1没有Parameters这个属性
    ==================================
    没可能,在属性窗中都可以找到,怎么会没有?