问题是这样的,有三个表,一个是进货表,一个是销售表,一个是库存表,库存表里面要求出进仓数,出仓数,和结仓数,进仓数就是进货的配件数,问题出在出仓数,在输入库存表后,查找出销售表中配件编号和库存表中配件编号相同的销售表的记录,这个是用adotable的locate语句求出,但是同一配件可以不同的时间销售出,这样出仓数就不能仅仅等于对应配件的销售数量,应该等于同一个配件不同时间销售处的数量的和。下面是代码
if adotable3.Locate('配件编号',ADOTable2.FieldByName('配件编号').Value,[lopartialkey])then begin
sum:=0 ;
if adotable3.RecordCount<>1 then begin
for   i:=0  to   ADOTable3.RecordCount-1   do
     sum:=sum+ADOTable3.FieldByName('数量').Value;
end  else   begin
     sum:=ADOTable3.FieldByName('数量').Value;
end;
ADOTable2.FieldByName('出仓数').Value:=sum;
上面ADOTABLE3 是销售表,ADOTABLE2是库存表;
如果这里面的adotable3.RecordCount数等于用LOCATE查询出的记录数的话,就能运行成功了,可是adotable3.RecordCount是整个表没有查询前记录的数目,这个用LOCATE查询出的记录数怎么求呢?
请各位高手帮帮忙!最好能给出代码,谢谢了。在线等。

解决方案 »

  1.   

    这个不能用统计函数去完成的么?怎么会用到LOCATE去统计匹配结果。
      

  2.   

    应该用一条语句就可以搞定。试试下面的语句:select sum(销售表.数量) as outnum,m.配件编号  from  销售表 m,库存表 d 
       where m.配件编号=d.配件编号  group by m.配件编号
      

  3.   

    怎么用在编程里面呢?好像用ADOquery才能用这个语句,然后如何将算出的数导出,负值给库存表中的出仓号呢?因为用程序是,用指针一条条将进货表的信息输入到库存表中,然后再将销售表中符合配件编号的数量相加后得到出仓数付给库存的出仓数字段。我把程序都发上吧。请大家帮看看。就是上面题目那里的程序出问题,算不出要的出仓数。
      

  4.   

    procedure TForm11.BitBtn2Click(Sender: TObject);
    var i:integer;
    begin
    adotable1.Close;
    adotable1.Open;
    adotable3.Close;
    adotable3.Open;
    adotable2.Close;
    adotable2.Open;
    for   i:=0   to   ADOTable2.Recordset.RecordCount-1   do
          ADOTable2.Delete;
    adotable1.first;
    while not adotable1.Eof do begin
    ADOTable2.insert;
    ADOTable2.FieldByName('批次号').Value:=ADOTable1.FieldByName('批次号').Value;
    ADOTable2.FieldByName('配件编号').Value:=ADOTable1.FieldByName('配件编号').Value;
    ADOTable2.FieldByName('配件名称').Value:=ADOTable1.FieldByName('配件名称').Value;
    ADOTable2.FieldByName('配件型号').Value:=ADOTable1.FieldByName('配件型号').Value;
    ADOTable2.FieldByName('单位').Value:=ADOTable1.FieldByName('单位').Value;
    ADOTable2.FieldByName('进货公司').Value:=ADOTable1.FieldByName('进货公司').Value;
    ADOTable2.FieldByName('车型').Value:=ADOTable1.FieldByName('车型').Value;
    ADOTable2.FieldByName('品种类型').Value:=ADOTable1.FieldByName('品种类型').Value;
    ADOTable2.FieldByName('进仓数').Value:=ADOTable1.FieldByName('数量').Value;
    ADOTable2.FieldByName('零售价').Value:=ADOTable1.FieldByName('零售价格').Value;
    ADOTable2.FieldByName('成本价').Value:=ADOTable1.FieldByName('批发价格').Value;
    if adotable3.Locate('配件编号',ADOTable2.FieldByName('配件编号').Value,[lopartialkey])then begin
    sum:=0 ;
    if adotable3.RecordCount<>1 then begin
    for   i:=0  to  adotable3.RecordCount-1   do
         sum:=sum+ADOTable3.FieldByName('数量').Value;
    end  else   begin
        sum:=ADOTable3.FieldByName('数量').Value;
    end;
    ADOTable2.FieldByName('出仓数').Value:=sum;
    ADOTable2.FieldByName('结仓数').Value:=ADOTable1.FieldByName('数量').Value-ADOTable3.FieldByName('数量').Value;
    ADOTable2.FieldByName('销售日期').Value:=ADOTable3.FieldByName('销售时间').Value;
    end;
    ADOTable2.Post;
    adotable1.Next;
    end;
    adotable2.close;
    adotable2.open;
    adotable2.First;
    while not adotable2.Eof do begin
    if ADOTable2.FieldByName('销售日期').asstring = '' then begin
    adotable2.edit;
    ADOTable2.FieldByName('结仓数').Value:=ADOTable2.FieldByName('进仓数').Value;
    adotable2.post;
    end;
    //if adotable2.State=dsEdit then adotable2.Post;
    adotable2.Next;
    end;
    messagedlg('库存表信息输入成功!',mtinformation,[mbok],0);
    //ADOTable2.Refresh;
    end;
      

  5.   

    上面程序中ADOtable1是公司进货表,ADOtable2是库存表,ADOtable3是销售表。
      

  6.   

    这个应该是完全不需要在程序中计算的。一条SQL语句或一个存储过程应该就可以了。
    试试下面的语句:
    insert into mytable (配件编号,outnum,innum)
    select i.配件编号,sum(i.outnum) as outnum ,sum(i.innum) as innum  from
      (select sum(销售表.数量) as outnum,m.配件编号  from  销售表 m,库存表 d 
       where m.配件编号=d.配件编号  group by m.配件编号
      union
      select sum(销售表.数量) as innum,m.配件编号  from  进货表 m,库存表 d 
       where m.配件编号=d.配件编号  group by m.配件编号) i  group by i.配件编号