下面程序说明:
    下面程序为一个劳保用品领用的程序:软件说明
1:首先根据用户输入的’年’’月’,生成当前日期:cx_date,,
2:到’领用’表查询,该月数据是否已生成,如生成,提示推出,否则继续。
3:打开员工表,从第一个记录开始到最后一个记录,提取员工编号zhibongno1,姓名zhigongname1,工种编号gongzhongno1。
4:打开工种表,根据获得的工种编号,获得劳保用品编号laobao_no[I],领用周期lingyong_zq[I],并据此计算该劳保用品的上次领用时间beforetime。
5:打开劳保用品领用表,查找是否到领有周期,如果没有,则插入记录。故障现象:编译后,运行时提示:invalid field name.zhigongno_1,经调试判断出在???处语句,不知何故,领用表中字段名:zhigongno,zhigongname,baobaono,lingyongnum,lingyongtime,lingyongfeiyong .没有索引。procedure TForm8.BitBtn1Click(Sender: TObject);
var cx_date,zhigongname_1:string;
  zhigongno_1,gongzhongno_1:integer;
  laobao_no:array[1..14] of integer;
  lingyong_zq:array[1..14] of integer;
  lingyongnum1,i:integer;
  beforetime:string;
begin     {1}
    cx_date:=combobox1.Text+combobox2.Text;
    edit1.Text:=cx_date; {计算本次领用时间}
    with datamodule2.lingyongTable do
    begin {2}
    active:=true;
    if locate('lingyongtime',cx_date,[lopartialkey]) then {查找该月份是否已生生成}
      begin{11}
      showmessage('该月份已生成,请退出。');
      active:=false;
    {  close;}
      end  {11}
    else
      with datamodule2.renyuantable do  {已生成}  
      begin  {3}
      active:=true;
      while not eof do
        begin {10} {生成每个员工的领用单}
        zhigongno_1:=fieldbyname('zhigongno').AsInteger;{获取职工编号}
        edit4.text:=inttostr(zhigongno_1);
        zhigongname_1:=fieldbyname('zhigongname').AsString; {获取职工姓名}
        gongzhongno_1:=fieldbyname('gongzhongno').AsInteger; {获取工种编号}
 {查找该工种,获得相应的劳保用品编号}
        with datamodule2.gongzhongtable do
        begin   {4}
          active:=true;
          indexfieldnames:='gongzhongno';
          if findkey([gongzhongno_1]) then
          begin {5}
            for i:=1 to 14 do
            begin    {6}
              laobao_no[i]:=fieldbyname('laobaono'+inttostr(i)).asinteger; {获取该职工的劳保用品编号}
              if laobao_no[i]<>32 then{判断编号不为空}
                begin  {7}
                  lingyong_zq[i]:=fieldbyname('lingyongzq'+inttostr(i)).asinteger; {获取该劳保编号的领用周期}
                  lingyongnum1:=trunc(1/lingyong_zq[i]);
                  if lingyongnum1<=0 then
                  lingyongnum1:=1;   {计算上次领用时间}
                if strtoint(rightstr(cx_date,2))>lingyong_zq[i] then{现在月份大于领用周期}
                  begin {8}
                    if int(strtoint(rightstr(cx_date,2)))-lingyong_zq[i]<10  then { 小于10月}
                      beforetime:=leftstr(cx_date,4)+'0'+inttostr(trunc(strtoint(rightstr(cx_date,2))-lingyong_zq[i]))
                    else
                      beforetime:=leftstr(cx_date,4)+inttostr(trunc(strtoint(rightstr(cx_date,2))-lingyong_zq[i]))
                  end   {8}
                else{现在月份小于领用周期}
                  if  trunc(12+strtoint(rightstr(cx_date,2))-lingyong_zq[i])<10  then {小于10月}
                    beforetime:=inttostr(strtoint(leftstr(cx_date,4))-1)+'0'+inttostr(trunc(strtoint(rightstr(cx_date,2))-lingyong_zq[i]+12))
                  else
                    beforetime:=inttostr(strtoint(leftstr(cx_date,4))-1)+inttostr(trunc(strtoint(rightstr(cx_date,2))-lingyong_zq[i]+12)); {判断是否到领用周期}
                  with datamodule2.Query1 do
                     begin  {11}
                       datamodule2.Query1.databasename:='laobao';
                       datamodule2.Query1.datasource:=datamodule2.lingyongds;
                       datamodule2.Query1.close;
                       datamodule2.Query1.sql.Clear;
????????       datamodule2.Query1.sql.add(' select * from lingyong where lingyong.zhigongno=zhigongno_1 and lingyong.laobaono=laobao_no[i] and lingyong.lingyongtime>beforetime') ;
                       datamodule2.Query1.open;
                     end;{11}
{到领用周期,在领用表中添加该领用单}
                       if eof  then
                         begin
                           datamodule2.lingyongTable.Open;
                           datamodule2.lingyongTable.appendrecord([zhigongno_1,zhigongname_1,laobao_no[i],cx_date,lingyongnum1,0]);
                         end;
                end;{7}
            end; {6}
          end;{5}
        end; {4}
       next;
    end;{10}
   end;{3}
   end;{2}
end; {1}

解决方案 »

  1.   

    datamodule2.Query1.sql.add(' select * from lingyong where lingyong.zhigongno=zhigongno_1 and lingyong.laobaono=laobao_no[i] and lingyong.lingyongtime>beforetime') ;
    这里需要参数传递,这样可不行
      

  2.   


    datamodule2.Query1.sql.add(' select * from lingyong where lingyong.zhigongno=zhigongno_1 and lingyong.laobaono=''' + laobao_no[i] + ''' and lingyong.lingyongtime>''' + beforetime+ '''') ;
      

  3.   

    datamodule2.Query1.sql.add(' select * from lingyong where lingyong.zhigongno=:p1 and lingyong.laobaono=:p2 and lingyong.lingyongtime>:p3') ;datamodule2.Query1.Parameters.ParamValues['p1']:= zhigongno_1;
    ......三个参数;
    datamodule2.Query1.Parameters.ParamValues['p2']:= 
      

  4.   

    ' select * from lingyong where lingyong.zhigongno=zhigongno_1 and lingyong.laobaono=laobao_no[i] and lingyong.lingyongtime>beforetime'
    应该改成:
    ' select * from lingyong where lingyong.zhigongno='+IntToStr(zhigongno_1)+' and lingyong.laobaono='+'IntToStr(laobao_no[i])+' and lingyong.lingyongtime>'+IntToStr(beforetime)
    都给放到字串里面他哪知道是什么呀。我没太仔细看你的变量定义,反正就把这些变量都转成字串型的然后相加就行了,不一定都是IntToStr()。
      

  5.   

    datamodule2.Query1.sql.add(' select * from lingyong where lingyong.zhigongno='''+zhigongno_1+''' and lingyong.laobaono=''' + laobao_no[i] + ''' and lingyong.lingyongtime>''' + beforetime+ '''') ;
      

  6.   

    zhigongno_1是什么东东啊。怎么能把变量直接放到SQL里呢?PB可以。Delphi不行啊。要用参数,要么笨一点的方法,用无数的“”自己拼起来。
      

  7.   

    select * from lingyong where lingyong.zhigongno='''+zhigongno_1 +''''+'and lingyong.laobaono='''+laobao_no[i]+''''+' and lingyong.lingyongtime>+'''+datetimstostr(beforetime)+''''你的变量是什么类型的?我全部当成字符了呀
      

  8.   

    我按照天兄的意思改了,但datamodule2.Query1.Parameters.ParamValues['p1']:= zhigongno_1;编译无法通过[Error] Unit8.pas(110): Undeclared identifier: 'Parameters'
      

  9.   

    解决了,多谢各位 datamodule2.Query1.sql.add('select * from lingyong where lingyong.zhigongno='+inttostr(zhigongno_1)+' and lingyong.laobaono='+inttostr(laobao_no[i])+ 'and lingyong.lingyongtime>'+beforetime);