我做的是一个用Delphi做为开发软件,Delphi自带数据库为后台的简单石油油料数据维护模块.在油料的出售和购买这个模块中代码编写和数据库维护中出现了这样的问题:我用的油料编号(bianhao)作为数据表(YLSJ)的主键,根据编号来完成对油料数量(shuliang)的购买和出售,我用的是query组件连接数据库,在购买的时候我应该用什么样的语句来完成对数据表中编号全部查看一片,如果数据表中有此编号就提示"购买库存油料成功",而如果没此编号则提示"购买新品油料成功"???
在购买库存油料的时候,购买后的数据表油料数量(shuliang)应该是'库存的油料数量+新购的油料数量',这个功能的实现应该用哪些代码来完成呢????
   还望详细指点为谢!!

解决方案 »

  1.   

    query.close;
    query.sql.add('select * from YLSJ where bianhao=:A');
    query.parambyname('A').value:='edit1.text';
    query.prepare;
    query.open;//如果有这编号,返回记录应该为1,为0 说明没有
    if query.recordcount=1  
       ............//成功
       else
        .......//失败购买库存油料的时候,购买后的数据表油料数量(shuliang)应该是'库存的油料数量+新购的油料数量',
    //加个确认购买按钮
    直接加就是了..
      

  2.   

    请问下上面的仁兄,你的参数A怎么定义的??       购买库存油料的时候,购买后的数据表油料数量(shuliang)应该是'库存的油料数量+新购的油料数量',
    //加个确认购买按钮
    直接加就是了..直接加好象只是新买该编号的油的数量,原来库存的此编号的油料数量没加进去吧???帮我看下这些代码该怎么改下才能实现:
    //(YLSJ表中包括:bianhao(edit1),pinzhong(edit2),shuliang(edit3),gongsi(edit4))
    var 
    i: integer;
     query1.Close;
          query1.SQL.Clear ;
          query1.sql.add('select shuliang from YLSJ where bianhao=i');
          query1.parambyname('i').value:='edit1.text';
          query1.ExecSQL ;
       if query1.recordcount=1     then
          begin     query1.SQL.Add('update YLSJ set shuliang='''+query1.FieldValues['shuliang']+strtoint(edit3.Text)+''' ');
        showmessage('购买库存油料成功!')
        end
       else
        begin     query1.SQL.Add('insert into YLSJ values('''+edit1.Text+''','''+edit2.text+''','''+edit3.text+''','''+edit4.text+''')');               
        showmessage('购买新品油料成功!')
      望高手多多指点,谢谢!!!
      

  3.   

    这一句好象有点问题:query1.SQL.Clear ;
          query1.sql.add('select shuliang from YLSJ where bianhao=i');
          query1.parambyname('i').value:='edit1.text';
          query1.ExecSQL 参数前面应该加 ":"还有select 语句应该用open
      

  4.   

    to  ljq7560181(群英) 
    你这样加显然是不对的.首先编码就不规范.
    query1.ExecSQL ; 可以运行SQL脚本,但是它不返回结果集,也就是是说在query1中不存在数据,当执行到query1.SQL.Add('update YLSJ set shuliang='''+query1.FieldValues['shuliang']+strtoint(edit3.Text)+''' ');会出错.把query1.ExecSQL ;改为:query1.Open;再说说你代码的问题,不规范,看起来杂乱无章没逻辑,
    可以定义个变量存储对应编号的油量,再进行修改,我的代码如下,仅供参考:
    var 
       p,i: integer;  //p用于存储对应编号的原有油量
       with query1 do
          begin
             Close;
             SQL.Clear;
             SQL.Add('select shuliang from YLSJ where bianhao = :i');
             Parameters.ParamByName('i').AsString:=Edit1.Text;
             Open;
             p:=FieldValues['shuliang'];
             if not IsEmpty then
                begin
                   p:=p + strtoint(Edit3.Text);
                   Close;
                   SQL.Clear;
                   SQL.Add('update YLSJ set shuliang = :i');
                   Parameters.ParamByName('i').AsString:=IntToStr(p);
                   ExecSQL;
                   MessageBox(Handle,'购买库存油料成功!','系统提示',MB_OK+MB_INFORMATION);
                end
            else
                begin  
                   Close;
                   SQL.Clear;
                   SQL.Add('insert into YLSJ values'''+edit1.Text+''','''+edit2.text+''','''+edit3.text+''','''+edit4.text+''')');
                   ExecSQL;
                   MessageBox(Handle,'购买新品油料成功!','系统提示',MB_OK+MB_INFORMATION);
                end;
             end;
      

  5.   

    非常感谢上面仁兄的指正,指正的很详细,教诲的也很有道理!
    我是初学者所以希望各位多多指教~~~~~~ to lyhsprite(孤独求爱)就上面的代码我想提个问,在变量类型转换的时候好象NULL不能转变成INTEGER吧所以我在运行的时候有个错误提示就如上述,该怎么改正,怎么加写代码来控制空的变量转变成整形的变量呢???
      

  6.   

    先判断变量是不是NULL.不是在转,
      

  7.   

    谢谢仁兄指教,问题基本解决了!还在调试一个小的BUG,就是在出售油料的时候要限制出售的油料数量不能超过库存的
    不然就不现实,呵呵~~~~~
      

  8.   

    高手请指点,在如下代码中:
    var 
       p: integer;begin  if edit1.Text ='' then
      begin
       showmessage('请输入油料编号!');
       edit1.SetFocus;
       exit;
      end;
      if edit2.Text ='' then
      begin
       showmessage('请输入油料品种名称!');
       edit2.SetFocus;
       exit;
      end;  if edit3.Text ='' then
      begin
       showmessage('请输入油料的数量值!');
       edit3.SetFocus;
       exit;
      end;   with query1 do
          begin
             Close;
             SQL.Clear;
             SQL.Add('select shuliang from YLSJ where bianhao = '''+edit1.text+'''');
             Open;         if not IsEmpty then
                begin
                   p:=strtoint(FieldValues['shuliang']);
                   p:=p + strtoint(Edit3.Text);
                   Close;
                   SQL.Clear;
                   SQL.Add('update YLSJ set shuliang = :p where bianhao='''+edit1.text+'''');
                   ParamByName('p').AsString:=IntToStr(p);
                   ExecSQL;
                   showMessage('购买库存油料成功!')
                end
            else
                begin  
                   Close;
                   SQL.Clear;
                   SQL.Add('insert into YLSJ values ('''+edit1.Text+''','''+edit2.text+''','''+edit3.text+''')');
                   ExecSQL;
                   showMessage('购买新品油料成功!')
                end;
             end;end;该用什么样的语句来限制当'油料编号和品种不匹配'的时候提示:无此油料品种!
    又用什么样的语句来限制下输入的油料数量只能是数值,而不是字符型的变量呢?还望高手在以上代码中详细指正为谢!!!
      

  9.   

    楼主,给你一个函数,用来来限制下输入的油料数量只能是数值。function TForm.isInteger(s: string): boolean;
    var
       i:integer;
    begin
       i:=1;
       if length(s)=0 then
       begin
          result:=false;
          exit;
       end;
       while i<=length(s) do
       begin
          if (isNumeric(s[i])=false) then
          begin
             result:=false;
             exit;
          end;
          i:=i+1;
       end;
       result:=true;
    end;
      

  10.   

    不好意思,现在还有个问题还没解决,不能结帖,等问题解决一定高分结帖谢!TO Breakc0de(学无止境):
      '油料编号和品种不匹配'的时候提示:无此油料品种'这句话的意思是:油料编号(bianhao)在数据表(YLSJ)中是主键,也就是说是唯一的.在此油料更新窗体中:Edit1.Text输入的是油料编号,Edit2.Text输入的是油料品种,Edit3.Text输入的是油料数量.当Edit1.Text输入的油料编号和Edit2.Text输入的油料品种在数据表中不对应时(假如编号1在原始数据表中对应品种是"原油",而在Edit2.Text输入的油料品种不是"原油",就出现不对应.),而此编号1已被占用,所以"显示编号和品种不对应',这项功能的实现该用些什么代码来实现呢??请各位指教~~~~~