access数据库中,存在“临时表”和“药库”这样两个表,两个表结构是一样的,有这些字段
“序号”“ 药名” “类名”“药品数量”“药品单价”“药品总价” ……
我希望把“临时表”中的所有数据复制到“药库”表中,“药库”表中已经存在很多药的信息
要求是:
如果在“药库”中已存在这种药品,则只须把这种药的数量、总价加上去就好,
如果在“药库”中不存在这样药品名,则须把全部信息添加到“药库”表中;
请问具体语句怎么写呢,哪位好心人帮帮忙呢
如果有别的办法能达到这样结果也可以,
“序号”“ 药名” “类名”“药品数量”“药品单价”“药品总价” ……
我希望把“临时表”中的所有数据复制到“药库”表中,“药库”表中已经存在很多药的信息
要求是:
如果在“药库”中已存在这种药品,则只须把这种药的数量、总价加上去就好,
如果在“药库”中不存在这样药品名,则须把全部信息添加到“药库”表中;
请问具体语句怎么写呢,哪位好心人帮帮忙呢
如果有别的办法能达到这样结果也可以,
解决方案 »
- 怎么实现在一个dbgrid中显示两个table的部分内容
- IT书超多的网站!!! http://www.netyi.net/in.asp?id=netyi123456
- 请问CreateMutex(nil,False,'')函数是什么意思,nil、False参数是什么意思?
- 是不是只有用DBGRID,DBTEXT等类似的组件连接数据库时,更该信息才能用APPLYUPDATES?
- 请教高手!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 请教大侠:学delphi要c语言或其他语言基础吗?
- 在delphi中怎样写出错处理的语句
- adoquery clientdataset
- MediaPlay可以把光区弹开,怎样再把它合上呢,API是哪个
- TO 浪人:你在哪里呀!
- widechartostring对unicode代码操作异常,奇怪?
- 两个有难度的delphi开发问题﹐各位可能碰到过的…….
update 药库 a,临时表 b set a.数量=a.数量+b.数量,.... where a.序号=b.序号
insert into 药库 select * from 临时表 where 序号 not in (select 序号 from 药库)
update 药库 a set 药品数量=药品数量 + (select 药品数量 from 临时表 where 序号=a.序号),
药品总价 = 药品总价 + (select 药品总价 from 临时表 where 序号=a.序号)
where a.序号 in (select 序号 from 临时表)2.在药库中不存在
insert into 药库('序号','药名','类名','药品数量','药品单价','药品总价')
select '序号','药名','类名','药品数量','药品单价','药品总价' from 临时表
where 序号 not in (select 序号 from 药库)如果上面的代码不能在Access数据库中运行,见意用循环方式更新或增加!
with ADOQuery1 do //打开临时表
begin
Close;
SQL.Clear;
SQL.Add('select * from 临时表 ');
Open;
end;with ADOQuery2 do //打开药库表
begin
Close;
SQL.Clear;
SQL.Add('select * from 药库 ');
Open;
end;while not ADOQuery1.Eof do
begin
if ADOQuery2.Locate('序号', ADOQuery1.FieldByName('序号').AsString, []) then
begin
ADOQuery2.Edit;
ADOQuery2.FieldByName('药品数量').AsFloat := ADOQuery2.FieldByName('药品数量').AsFloat + ADOQuery1.FieldByName('药品数量').AsFloat; ADOQuery2.FieldByName('药品总价').AsFloat := ADOQuery2.FieldByName('药品总价').AsFloat + ADOQuery1.FieldByName('药品总价').AsFloat;
ADOQuery2.Post;
end
else begin
ADOQuery2.Append;
ADOQuery2.FieldByName('序号).AsString := ADOQuery1.FieldByName('序号).AsString;
ADOQuery2.FieldByName('药名).AsString := ADOQuery1.FieldByName('药名).AsString;
ADOQuery2.FieldByName('类名).AsString := ADOQuery1.FieldByName('类名).AsString;
ADOQuery2.FieldByName('药品数量').AsFloat := ADOQuery1.FieldByName('药品数量').AsFloat;
ADOQuery2.FieldByName('药品单价').AsFloat := ADOQuery1.FieldByName('药品单价').AsFloat; ADOQuery2.FieldByName('药品总价').AsFloat := ADOQuery1.FieldByName('药品总价').AsFloat;
ADOQuery2.Post;
end;
ADOQuery1.Next;
end;
当“药库”中没这个记录时是行的,可有相同药名时就不行了,我是希望在某种具体药中添加数量
比如说:
我“药库”中已经存在这样的记录
药名 数量 总价 单位
人丹 3 9 盒
鼻炎片 8 53 盒
当我临时表中也有“人丹”和“鼻炎片”记录,数量各7,2,我希望入库后“药库”中“人丹”、“鼻炎片”的数量变为10、10请问下面语句该如何修改下
while not ADOQuery1.Eof do
begin
if ADOQuery2.Locate('药名', ADOQuery1.FieldByName('药名'').AsString, []) then
begin
ADOQuery2.Edit;
ADOQuery2.FieldByName('药品数量').AsFloat := ADOQuery2.FieldByName('药品数量').AsFloat + ADOQuery1.FieldByName('药品数量').AsFloat; ADOQuery2.FieldByName('药品总价').AsFloat := ADOQuery2.FieldByName('药品总价').AsFloat + ADOQuery1.FieldByName('药品总价').AsFloat;
ADOQuery2.Post;
end
YKQry.Close;
YKQry.SQL.Clear;
//YKQry.Open;
ShowMessage('1');
YKQry.SQL.Add('update yaoku set 数量=数量 + (select 数量 from jinyaolinshibiao where 药名=yaoku.药名),总价 = 总价+ (select 总价 from jinyaolinshibiao where 药名=yaoku.药名)where yaoku.药名 in (select 药名 from jinyaolinshibiao)');
ShowMessage('2');
YKQry.SQL.Add('insert into yaoku values(select 类名,药名,规格,单价,数量,单位,总价 from jinyaolinshibiao where 药名 not in (select 药名 from yaoku))');
//JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
YKQry.ExecSQL;
那你们能该我改正下吗? hqhhh(枫叶) 我已经把序号换成药名,可就是添加不进去,
procedure TfrmYaopinLuru.Button2Click(Sender: TObject);
var
LSQry,YKQry: TADOQuery;
begin
if Application.MessageBox('确定要把表中药品录入药库中吗?','系统提示', MB_yesno + MB_ICONINFORMATION)=mryes then
begin
LSQry := TADOQuery.Create(nil);
YKQry := TADOQuery.Create(nil);
LSQry.Connection:=frmMain.ADOConnection1; //你的数据连接
YKQry.Connection:=frmMain.ADOConnection1;
try
frmMain.ADOConnection1.BeginTrans;
try
with LSQry do //打开临时表
begin
Close;
SQL.Clear;
SQL.Add('select * from jinyaolinshibiao ');
Open;
end;
with YKQry do //打开药库表
begin
Close;
SQL.Clear;
SQL.Add('select * from yaoku ');
Open;
end;
{//在药库中存在
YKQry.Close;
YKQry.SQL.Clear;
//YKQry.Open;
ShowMessage('1');
YKQry.SQL.Add('update yaoku set 数量=数量 + (select 数量 from jinyaolinshibiao where 药名=yaoku.药名),总价 = 总价+ (select 总价 from jinyaolinshibiao where 药名=yaoku.药名)where yaoku.药名 in (select 药名 from jinyaolinshibiao)');
ShowMessage('2');
YKQry.SQL.Add('insert into yaoku values(select 类名,药名,规格,单价,数量,单位,总价 from jinyaolinshibiao where 药名 not in (select 药名 from yaoku))');
//JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
YKQry.ExecSQL;
//在药库中不存在 } while not LSQry.Eof do
begin
if YKQry.Locate('药名', LSQry.FieldByName('药名').AsString, []) then
begin
//YKQry.SQL
//update yaoku set yaoku.数量=yaoku.数量+jinyaolinshibiao.药品数量 from
//jinyaolinshibiao where yaoku.药名=jinyaolinshibiao.药名
YKQry.Edit;
YKQry.FieldByName('数量').AsInteger := YKQry.FieldByName('数量').AsInteger+ LSQry.FieldByName('数量').AsInteger;
YKQry.FieldByName('总价').AsCurrency := YKQry.FieldByName('总价').AsCurrency+ LSQry.FieldByName('总价').AsCurrency;
YKQry.Post;
end
else begin
YKQry.Append;
YKQry.FieldByName('药名').AsString := LSQry.FieldByName('药名').AsString;
YKQry.FieldByName('规格').AsString := LSQry.FieldByName('规格').AsString;
YKQry.FieldByName('类名').AsString := LSQry.FieldByName('类名').AsString;
YKQry.FieldByName('单位').AsString := LSQry.FieldByName('单位').AsString;
YKQry.FieldByName('数量').AsInteger := LSQry.FieldByName('数量').AsInteger;
YKQry.FieldByName('单价').AsCurrency := LSQry.FieldByName('单价').AsCurrency;
YKQry.FieldByName('总价').AsCurrency := LSQry.FieldByName('总价').AsCurrency;
YKQry.Post;
end;
LSQry.Next;
Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
MB_ICONINFORMATION);
Exit;
end;
frmMain.ADOConnection1.CommitTrans;
except
frmMain.ADOConnection1.CommitTrans;
Application.MessageBox('录入失败,请仔细核查后再录入!','系统错误提示',MB_OK+
MB_ICONINFORMATION);
Exit;
end;
finally
LSQry.Free;
YKQry.Free;
end; {ADOQuery1.open;
for i:=0 to ADOQuery1.recordcount-1 do
begin
ADOQuery2.open;
ADOQuery2.insert; ADOQuery2.FieldByName('字段1').asinteger := ADOQuery1.FieldByName('字段1').asinteger ;
ADOQuery2.FieldByName('字段2').asinteger := ADOQuery1.FieldByName('字段2').asinteger ;
ADOQuery2.post;
ADOQuery1.next;
end;}
end
else
begin
ShowMessage('no');
end;end;
LSQry.Next;
// Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
// MB_ICONINFORMATION);
// Exit;
end;
//应放在循环这后
Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
MB_ICONINFORMATION);
Exit; frmMain.ADOConnection1.CommitTrans;
except
frmMain.ADOConnection1.CommitTrans;
Application.MessageBox('录入失败,请仔细核查后再录入!','系统错误提示',MB_OK+
MB_ICONINFORMATION);
Exit;
end;
try
insert into 药库 //不存在的直接insert
except
updata 药库 set 药品数量=xxxx //存在的就updata
end;在access中将总价设成:总价=数量*单价
frmMain.ADOConnection1.BeginTrans;
frmMain.ADOConnection1.CommitTrans;
frmMain.ADOConnection1.RollbackTrans;
这几句原因
我把它注释掉就可以了,不过我想问,为什么不能家事务回滚操作呢,
是不是一个模块里只能用一次的,我在别的地方也用了下,能行的
procedure TfrmYaopinLuru.BtnQuerenClick(Sender: TObject);
var
Price,Allprice,Num:Double;
LSQry,JYQry:TADOQuery;
begin
if EdtName.Text='' then
begin
Application.MessageBox('药品名不能为空!','提示',MB_OK+
MB_ICONINFORMATION);
ActiveControl:=EdtName;
Exit;
end
else
begin
//同时向进药临时表和进药表添加数据
LSQry:= TADOQuery.Create(nil);
JYQry:= TADOQuery.Create(nil);
LSQry.Connection:=frmMain.ADOConnection1; //你的数据连接
JYQry.Connection:=frmMain.ADOConnection1;
try
//采用事物对数据进行存储,
frmMain.ADOConnection1.BeginTrans;
try
//向进药临时表添加信息
LSQry.Close;
LSQry.SQL.Clear;
LSQry.SQL.Add('select * from jinyaolinshibiao');
LSQry.Open;
LSQry.Append;
LSQry.FieldByName('药名').AsString:=EdtName.Text;
LSQry.FieldByName('规格').AsString:=EdtSpec.Text;
LSQry.FieldByName('单价').AsString:=EdtPrice.Text;
LSQry.FieldByName('数量').AsString:=EdtNum.Text;
//计算药品总额
Num:=StrToFloat(EdtNum.Text);
Price:=StrToFloat(EdtPrice.Text);
Allprice:=Num*Price;
LSQry.FieldByName('总价').AsFloat:=Allprice;
LSQry.FieldByName('单位').AsString:=ComboBox1.Text;
LSQry.FieldByName('类名').AsString:=ComboBox2.Text;
LSQry.Post; //向进药表添加信息
JYQry.Close;
JYQry.SQL.Clear;
JYQry.SQL.Add('select * from jinyao');
JYQry.Open;
JYQry.Append;
JYQry.FieldByName('药名').AsString:=EdtName.Text;
JYQry.FieldByName('规格').AsString:=EdtSpec.Text;
JYQry.FieldByName('单价').AsString:=EdtPrice.Text;
JYQry.FieldByName('数量').AsString:=EdtNum.Text;
JYQry.FieldByName('总价').AsFloat:=Allprice;
JYQry.FieldByName('单位').AsString:=ComboBox1.Text;
JYQry.FieldByName('类名').AsString:=ComboBox2.Text;
JYQry.FieldByName('日期').AsDateTime:=DateTimePicker1.Date;
JYQry.Post;
Application.MessageBox('信息成功录入!','提示',MB_OK+
MB_ICONINFORMATION);
ADOTable1.Close;
ADOTable1.Open;
//JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
//JYQry.ExecSQL;
frmMain.ADOConnection1.CommitTrans;
except
frmMain.ADOConnection1.RollbackTrans;
Application.MessageBox('您输入的数据有误,请核查后再提交!','系统提示',MB_OK+
MB_ICONINFORMATION);
Exit;
end;
finally
LSQry.Free;
JYQry.Free;
end;
EdtName.Text:='';
EdtSpec.Text:='';
EdtPrice.Text:='';
EdtNum.Text:='';
ComboBox1.Text:='';
ComboBox2.Text:='';
ActiveControl:=EdtName;
end;end;procedure TfrmYaopinLuru.Button2Click(Sender: TObject);
var
LinShiQry,YaoKuQry: TADOQuery;
a:string;
b:Integer;
begin
if Application.MessageBox('确定要把表中药品录入药库中吗?','系统提示', MB_yesno + MB_ICONINFORMATION)=mryes then
begin
LinShiQry := TADOQuery.Create(nil);
YaoKuQry := TADOQuery.Create(nil);
LinShiQry.Connection:=frmMain.ADOConnection1; //数据连接
YaoKuQry.Connection:=frmMain.ADOConnection1;
try
//frmMain.ADOConnection1.BeginTrans;
try
//打开临时表
LinShiQry.Close;
LinShiQry.SQL.Clear;
LinShiQry.SQL.Add('select * from jinyaolinshibiao');
LinShiQry.Open;
//打开药库表
YaoKuQry.Close;
YaoKuQry.SQL.Clear;
YaoKuQry.SQL.Add('select * from yaoku');
YaoKuQry.Open;
{//在药库中存在
YKQry.Close;
YKQry.SQL.Clear;
//YKQry.Open;
ShowMessage('1');
YKQry.SQL.Add('update yaoku set 数量=数量 + (select 数量 from jinyaolinshibiao where 药名=yaoku.药名),总价 = 总价+ (select 总价 from jinyaolinshibiao where 药名=yaoku.药名)where yaoku.药名 in (select 药名 from jinyaolinshibiao)');
ShowMessage('2');
YKQry.SQL.Add('insert into yaoku values(select 类名,药名,规格,单价,数量,单位,总价 from jinyaolinshibiao where 药名 not in (select 药名 from yaoku))');
//JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
YKQry.ExecSQL;
//在药库中不存在 }
while not LinShiQry.Eof do
begin
if YaoKuQry.Locate('药名',LinShiQry.FieldByName('药名').AsString,[]) then
begin
YaoKuQry.Edit;
YaoKuQry.FieldByName('数量').AsInteger:=YaoKuQry.FieldByName('数量').AsInteger+LinShiQry.FieldByName('数量').AsInteger;
YaoKuQry.FieldByName('总价').AsFloat:=YaoKuQry.FieldByName('总价').AsFloat+LinShiQry.FieldByName('总价').AsFloat;
YaoKuQry.Post;
end
else begin
YaoKuQry.Append;
YaoKuQry.FieldByName('药名').AsString := LinShiQry.FieldByName('药名').AsString;
YaoKuQry.FieldByName('规格').AsString := LinShiQry.FieldByName('规格').AsString;
YaoKuQry.FieldByName('类名').AsString := LinShiQry.FieldByName('类名').AsString;
YaoKuQry.FieldByName('单位').AsString := LinShiQry.FieldByName('单位').AsString;
YaoKuQry.FieldByName('数量').AsInteger := LinShiQry.FieldByName('数量').AsInteger;
YaoKuQry.FieldByName('单价').AsFloat := LinShiQry.FieldByName('单价').AsFloat;
YaoKuQry.FieldByName('总价').AsFloat := LinShiQry.FieldByName('总价').AsFloat;
YaoKuQry.Post;
end;
LinShiQry.Next;
end;
Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
MB_ICONINFORMATION);
Exit;
//frmMain.ADOConnection1.CommitTrans;
except
//frmMain.ADOConnection1.RollbackTrans;
Application.MessageBox('录入失败,请仔细核查后再录入!','系统错误提示',MB_OK+
MB_ICONINFORMATION);
Exit;
end;
finally
LinShiQry.Free;
YaoKuQry.Free;
end;
end
else
begin
//ShowMessage('no');
end;
end;
完全可以使用算法设计来做的
逐条记录遍历分析,可能效率差点,但控制性最好的个人意见而已,我对SQL语法也什么研究的,一般要实现这类事情,都是使用算法来做的_____________________
http://lysoft.7u7.net
YKQry.SQL.Clear;
//YKQry.Open;
ShowMessage('1');
YKQry.Sql.Text:='update yaoku a,jinyaolishibiao b set a.数量=a.数量+b.数量,a.总价 = a.总价+b.总价 where a.药名=b.药名';
YKQry.ExecSql;
ShowMessage('2');
YKQry.Sql.Text:='insert into yaoku select * from jinyaolishibiao where 药名 not in (select 药名 from yaoku))';
YKQry.ExecSQL;
第二条sql可能耗时长些,但应当可以执行