一个关于数据库两个表之间存储的问题,请高手进 ( 积分: 100 )

  • 主题发起人 主题发起人 sdjxmikill
  • 开始时间 开始时间
S

sdjxmikill

Unregistered / Unconfirmed
GUEST, unregistred user!
现有两个表:
A:fid 药品名称 有效日期 单价 数量
1 book 2005 1 10
2 desk 2006 2 15
3 book 2007 6 20

B: fid 药品名称 有效日期 单价 数量
1 book 2007 6 30
2 desk 2006 2 15
注:A表为入库明细表,有多条入库记录。
B表为库存统计表,我想把A表的当前最新的更新到B表,并对同产品数量做累计,结果如上B表所示。
 
现有两个表:
A:fid 药品名称 有效日期 单价 数量
1 book 2005 1 10
2 desk 2006 2 15
3 book 2007 6 20

B: fid 药品名称 有效日期 单价 数量
1 book 2007 6 30
2 desk 2006 2 15
注:A表为入库明细表,有多条入库记录。
B表为库存统计表,我想把A表的当前最新的更新到B表,并对同产品数量做累计,结果如上B表所示。
 
1. 很简单的问题, 你必须在A表(明细表)中增加一个标记字段: stat (是否已经统计);
2. 每次入库, set stat=false // 或者0
3. 在操作统计转存的时候, 将所有的stat=false的入库统计到B表中,
并置A表中的记录的stat = true // 或者 1
 
TO 天河流星:
能否给写一下实现代码.麻烦了
 
我来帮你写下代码吧,不知道行不行啊,呵呵!:
var AdoQA,AdoQB:TAdoQuery;
begin
AdoQA:=TAdoQuery.create(nil);
AdoQA.connection:=con1;
AdoQB:=TAdoQuery.create(nil);
AdoQB.connection:=con1;
with AdoQA do
begin
close;
sql.clear;
sql.add('Select * from A where Flag=true');
open;
while not eof do
begin
AdoQB.close;
AdoQB.sql.clear;
AdoQb.sql.add('update B set Shuliang=Shuliang+:Shuliang where Name=:name and YouXiaoQi=YouxiaoQi');
AdoQb.parameters.parameterbyname('Shuliang').value:=fieldvalues['Shuliang'];
AdoQb.parameters.parameterbyname('name').value:=fieldvalues['name'];
AdoQb.parameters.parameterbyname('YouxiaoQi').value:=fieldvalues['YouxiaoQi'];
AdoQb.Execsql;
next;
end;
end;
end;

这些代码没有经过调试,你自己放上去试一下看啊!
Flag就是天河流星说的A表里添加的一个是否统计的标志
 
现有两个表:
A:fid 药品名称 有效日期 单价 数量 标记
1 book 2005 1 10 1 //1表示已统计
2 desk 2006 2 15 0 //0表示未统计
3 book 2007 6 20 0

B: fid 药品名称 有效日期 单价 数量
1 book 2007 6 30
2 desk 2006 2 15

A表入时,让标记写入0
B表统计时,A表找标记为0的字段.如:ADOQuery1.SQL.Add(Select * From... where 标记='0');
对A表ADOQuery1循环,用ADOQuery2.Locate('药品名称',''+ADOQuery1['药品名称']+'',[]);ADOQuery2(B表)找一下是否有这个品名,为True(有)就更新,并对数量累计ADOQuery2['数量']:=ADOQuery2['数量']+ADOQuery1['数量'],如找不到,就创建一条新记录,(表示是新加入的药品).同时统计后要对A表的标记写为1,ADOQuery1['标记']:='1';
以上是思路,具体代码不写了.
 
首先定义3个视图
1. Create View View1 as
Select 药品名称 Name, Sum(数量) S
from A
group by 药品名称;
2. Create View View2 as
Select 药品名称 , Max(Fid) Id
From A
group by 药品名称;
3. Create View View3 as
Select 药品名称 Name, 有效日期, 单价
from A
where fid in (Select ID From View2)

最后就可以得到你想看到的东西 B表
Select View1.Name 药品名称,View3.有效日期,View3.单价,View1.S 数量
form View1,View3
where View1.Name=View3.Name

就是这个思想,没有调试,你再试一试
 
自由界面和报表的完美解决方案!
http://www.anylib.com
 
我觉得最好用触发器,让数据库系统进行更新的好,这样的话程序在数据量大的情况下可以得到较高的执行速度
 
用标记操作我试了,效果不好。在数据库中我用下面的语句试验成功了:
UPDATE B
SET 单价 =
(SELECT MAX(单价)
FROM A
WHERE (A.药品名称 = B.药品名称)
GROUP BY 药品名称)
UPDATE B
SET 有效日期 =
(SELECT MAX(有效日期)
FROM A
WHERE (A.药品名称 = B.药品名称)
GROUP BY 药品名称)


但是要移植到delphi中就有点困难了,因为adoquery不支持UPdate
,我想应该要把他写到存储过程里,这个我不是太会,希望大家给于指导,谢谢!
 
update b set (b.有效日期 ,b.单价 ,b.数量)=(select x.有效日期 ,x.单价 ,x.数量
from (select a.fid,max(a.有效日期) as 有效日期,
max(a.单价) as 单价,
sum(a.数量) as 数量
from a group by a.fid
) x where x.fid=b.fid)
 
谢谢大家的帮助,这个问题我还是自己解决了,把处理过程放到了存储过程里面,然后在程序里调用就行了。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部