sql语句在数据库上执行没问题,但在做delphi时就报错了,请问该怎么办啊,很急!!各位大神求助!先谢谢大家了!

解决方案 »

  1.   

    相关代码如下:procedure TForm8.Button1Click(Sender: TObject);
    begin
      DBGrid1.Visible:=true;
      if radiobutton1.Checked=true then
      with ADOQuery1 do
      begin
        close;
        sql.Clear;
        sql.add('select 仓库编号,D.钢材编号,钢材名称,钢材规格,钢材单价,钢材质量等级,期初库存,总入库量,总出库量,期初库存+总入库量-总出库量 as 当前库存');
        sql.add('from(select 仓库编号,A.钢材编号,钢材名称,钢材规格,钢材单价,钢材质量等级,期初库存');
        sql.add('from 钢材 as A inner join 期初库存1 as B');
        sql.add('on A.钢材编号=B.钢材编号');
        sql.add('where 仓库编号=:a and A.钢材编号=:b)as C inner join(select 钢材编号,SUM(入库数量)as 总入库量');
        sql.add('from 入库1');
        sql.add('group by 钢材编号');
        sql.add('having 钢材编号=:b)as D');
        sql.add('on D.钢材编号=C.钢材编号 inner join');
        sql.add('(select 钢材编号,SUM(出库数量)as 总出库量');
        sql.add('from 出库1');
        sql.add('group by 钢材编号');
        sql.add('having 钢材编号=:b)as E on D.钢材编号=E.钢材编号');
        Parameters.ParseSQL(SQL.Text, True);
        parameters.ParamByName('a').Value:=edit1.Text;
        parameters.ParamByName('b').Value:=edit2.Text;
        open;
      end;
      if radiobutton2.Checked=true then
      with ADOQuery1 do
      begin
        close;
        sql.Clear;
        sql.add('select 仓库编号,D.钢材编号,钢材名称,钢材规格,钢材单价,钢材质量等级,期初库存,总入库量,总出库量,期初库存+总入库量-总出库量 as 当前库存');
        sql.add('from(select 仓库编号,A.钢材编号,钢材名称,钢材规格,钢材单价,钢材质量等级,期初库存');
        sql.add('from 钢材 as A inner join 期初库存2 as B');
        sql.add('on A.钢材编号=B.钢材编号');
        sql.add('where 仓库编号=:c and A.钢材编号=:d)as C inner join(select 钢材编号,SUM(入库数量)as 总入库量');
        sql.add('from 入库2');
        sql.add('group by 钢材编号');
        sql.add('having 钢材编号=:d)as D');
        sql.add('on D.钢材编号=C.钢材编号 inner join');
        sql.add('(select 钢材编号,SUM(出库数量)as 总出库量');
        sql.add('from 出库2');
        sql.add('group by 钢材编号');
        sql.add('having 钢材编号=:d)as E on D.钢材编号=E.钢材编号');
        Parameters.ParseSQL(SQL.Text, True);
        parameters.ParamByName('c').Value:=edit1.Text;
        parameters.ParamByName('d').Value:=edit2.Text;
        open;
      end;
    end;
      

  2.   

    其实你用事件探查器跟踪一下delphi生成的sql语句就明白了,难道你的a,b,c,d都是字符串类型的?
      

  3.   

    Add()函数2行间没加空格。或者每个Add()字符串后加#13。你显示下你的SQL文本就知道了
      

  4.   

    不知道怎么回事,我用XE5,拷贝了你代码进去,观看 ADOQuery1.SQL.Text  的时候,你每个ADD进去的字符串后,都会多出这么个东西  “  #$D#$A  ”   建议你连接字符串就直接用widestring 连接好了。然后在直接赋值给 ADOQuery1.SQL.Text
        SqlStr := 'select 仓库编号,D.钢材编号,钢材名称,钢材规格,钢材单价,钢材质量等级,期初库存,总入库量,总出库量,期初库存+总入库量-总出库量 as 当前库存 ';
        SqlStr := SqlStr + 'from(select 仓库编号,A.钢材编号,钢材名称,钢材规格,钢材单价,钢材质量等级,期初库存 ';
        SqlStr := SqlStr + 'from 钢材 as A inner join 期初库存1 as B ';
        SqlStr := SqlStr + 'on A.钢材编号=B.钢材编号 ';
        SqlStr := SqlStr + 'where 仓库编号=''%s'' and A.钢材编号=''%s'')as C inner join(select 钢材编号,SUM(入库数量)as 总入库量 ';
        SqlStr := SqlStr + 'from 入库1 ';
        SqlStr := SqlStr + 'group by 钢材编号 ';
        SqlStr := SqlStr + 'having 钢材编号=''%s'')as D ';
        SqlStr := SqlStr + 'on D.钢材编号=C.钢材编号 inner join ';
        SqlStr := SqlStr + '(select 钢材编号,SUM(出库数量)as 总出库量 ';
        SqlStr := SqlStr + 'from 出库1 ';
        SqlStr := SqlStr + 'group by 钢材编号 ';
        SqlStr := SqlStr + 'having 钢材编号=''%s'')as E on D.钢材编号=E.钢材编号 ';
       
        SqlStr := Format(SqlStr, [edit1.Text, edit2.Text, edit2.Text, edit2.Text]);    ADOQuery1.sql.Clear;
        ADOQuery1.SQL.Text  :=  SqlStr ;
        ADOQuery1.Open;
      

  5.   

    为防止输入的   edit1.Text, edit2.Text   参数带单引号,最好是格式化一下,如果参数出现单引号,则添加一个单引号,变成  “‘’” 形式。否则,带单引号的参数是会出错的。
      

  6.   


        parameters.ParamByName('a').Value:=quotedstr(edit1.Text);
        parameters.ParamByName('b').Value:=quotedstr(edit2.Text);