str1:='select iif(isnull(sum(enterwh.入库数量)),0,sum(enterwh.入库数量)) as 存量1 from enterwh where 编码="'+Trim(edit1.Text)+'"';
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add(str1);
ADOQuery2.Open;
if ADOQuery2.RecordCount>0 then
s1:=ADOQuery2.fieldbyname('存量1').asString; str2:='select iif(isnull(sum(outwh.出库数量)),0,sum(outwh.出库数量)) as 存量2 from outwh where 编码="'+Trim(edit1.Text)+'"';
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add(str2);
ADOQuery2.Open;
if ADOQuery2.RecordCount>0 then
s2:=ADOQuery2.fieldbyname('存量2').asString; str3:='select 编码,名称,规格型号,数量 as 库存量 from stock where 编码="'+Trim(edit1.Text)+'"';
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add(str3);
ADOQuery2.Open;
if ADOQuery2.RecordCount>0 then
begin
temp:=ADOQuery2.fieldbyname('库存量').asString;
Edit5.Text:=IntToStr(StrToInt(temp)+StrToInt(s1)-StrToInt(s2));
end;两头省有语句,主要意思就是把入库表和出库表对应编码的数量合计下,然后拿基本表里同一编码的数量+入库表的数量和-出库表的数量和=这个编码物品的现存量,希望一句求出来
我原来是这样写的:
str:='select stock.名称,stock.规格型号,stock.编码,'
+'(stock.数量+iif(isnull(sum(enterwh.入库数量)),0,sum(enterwh.入库数量))-iif(isnull(sum(outwh.出库数量)),0,sum(outwh.出库数量))) as 库存量'
+' from (stock LEFT JOIN outwh ON (stock.编码=outwh.编码))'
+' LEFT JOIN enterwh ON (stock.编码=enterwh.编码)'
+' where 编码="'+Trim(edit1.Text)+'"'
GROUP BY stock.编码,stock.名称,stock.规格型号,stock.数量';
这样的话如果出入库里都是对应一条记录的话还可以,要是对应多条就会出错,会出现重复加减操作
麻烦各位了
delphi+access
第二种想法是,设个实时表,出时直接在对应的上面减去,入时直接在对应的上面加上,实时表始终显的就是库存但这两种方法都有些问题不好解决,第一种是在出入库数据N多的情况下,统计就显的慢了很多,每次打开库存查询就越来越慢,第二种呢,如果我有次出入库错了,要修改出入库的数据时,要么要删除某一条出入库数据,就得实现更新实时表,这样就难免出错不知道大家对以上两种方法有没有更好的解决办法,本人新手,希望大家给个思路,代码均可
但出错是难免的,要看你如何统计了,只要保证正常操作下正确即可,有错就根据第1个报表去检查了
2 实时库存表,看数据量大小和操作频率, 可以通过出入库表或台账建视图, 或独立建表