复杂SQL语句请教 (100分)

  • 主题发起人 主题发起人 heping
  • 开始时间 开始时间
H

heping

Unregistered / Unconfirmed
GUEST, unregistred user!
复杂SQL语句请教:
(开发环境:DELPHI + ADO + MS SQL SERVER2000)
在一个表中,有一堆数据,如下:
ckm仓库名
hpbh货品编号
hpmc货品名称
js件数

ckm hpbh hpmc js
------------------------------------
仓库1 001123 大米 12
仓库1 001234 小米 9
仓库2 002456 小麦 7
......

在作移库的操作时,就是:把:这个仓库的数据移动到:另一个仓库中去。
作批量操作。
我让:用户,对:件数作:三个选择:
一:每件货,只操作:1件;
二:每件货,操作,库存的全部件数。
三:每件货,操作,用户输入的一个数据。
(当用户输入的件数,大于,库存全部件数时,系统使用库存全部件数。)

选择出货品时,新仓库中,增加,原仓库,相应减少。
当:移动的件数是:原仓库中的全部件数时,把:原仓库中相应的记录删除,
当:移动的件数比:原仓库中的全部件数小时,原仓库中相应的记录的件数减少。

下面:我写出:选择货品的一段代码,
请帮忙,看看:删除或减少原仓库的件数,用一个SQL语句,如何写。谢谢。
var
ttt, js_ttt: string;
begin
ttt := ' select ckm,hpbh,hpmc,';
if RadioButton_js_1.Checked then //每件货,只操作:1件
js_ttt := ' 1'
else if RadioButton_js_kcjs.Checked then //每件货,操作,库存的全部件数
js_ttt := ' js'
else if RadioButton_js_zdy.Checked then //每件货,操作,用户输入的一个数据
js_ttt := ' (case when ' + FormatFloat('0.0', StrToFloatDef(Trim(Edit_js_zdy.Text), 0.0)) + '>=js then js ' +
' else ' + FormatFloat('0.0', StrToFloatDef(Trim(Edit_js_zdy.Text), 0.0)) + ' end)';
ttt := ttt + js_ttt;
ttt := ttt + ' from table_123';
with ADOQuery_tmp do
begin
Close;
Sql.Clear;
Sql.Add(ttt);
Prepared := True;
Open;
end;
end;
我想,可能要用:IF...ELSE...但,我写不出来,请大侠帮忙。谢谢。
 
减少用update
刚学了触发器
create trigger trg_dec for update on tablename
as
declare
@num int
@js int
select @num=js from deleted
select @js=js from tablename where 仓库号
if @js-@num<=0
delete from tablename where 仓库号
 
写一个存储过程吧,不要用一条SQL了
 
我是:在两个临时表,中,操作,
能否不用:存储过程。写SQL语句来实现?谢谢。
 
用存储过程!
清晰、安全、执行效率高
用本地SQL不利于理解,也不安全!
 
我想这个过程用一句SQL是无法完成的,我的建议是写一段存储过程或在MSSQL2000中写自定义函数
例:存储过程
Create Procedure UP_MoveCK @CKM varchar(50),@NewCKM varchar(50),@hpbh varchar(30),@hpmc varchar(50),@js int as
Declare @ZJS int
Select @ZJS=JS From Table_123 where CKM=@CKM and hpbh=@hpbh
if @ZJS is null
Return(-1) --报错
if @ZJS>@js --如果总数大于移库数
begin
begin tran
Update Table_123 Set JS=JS-@js where CKM=@CKM and hpbh=@hpbh
if exists(Select * from Table_123 where ckm=@newckm and hpbh=@hpbh) --检查新仓库是否存在
Update Table_123 Set JS=JS+@js where ckm=@newckm and hpbh=@hpbh
else
insert into Table_123(ckm,hpbh,hpmc,js) values(@ckm,@hpbh,@hpmc,@js)
commit tran
Return(1)
end

if @Zjs=@js --相等
begin
begin tran
Delete From Table_123 where ckm=@ckm and hpbh=@hpbh
if exists(Select * from Table_123 where ckm=@newckm and hpbh=@hpbh) --检查新仓库是否存在
Update Table_123 Set JS=JS+@js where ckm=@newckm and hpbh=@hpbh
else
insert into Table_123(ckm,hpbh,hpmc,js) values(@ckm,@hpbh,@hpmc,@js)
commit tran
Return(0)
end

if @Zjs<@js
begin
begin tran
Delete From Table_123 where ckm=@ckm and hpbh=@hpbh
if exists(Select * from Table_123 where ckm=@newckm and hpbh=@hpbh) --检查新仓库是否存在
Update Table_123 Set JS=JS+@zjs where ckm=@newckm and hpbh=@hpbh
else
insert into Table_123(ckm,hpbh,hpmc,js) values(@ckm,@hpbh,@hpmc,@zjs)
commit tran
Return(0)
end
 
在ADODataset.commandtext 中写:
declare @js int, @fckm varchar(10),@tckm varchar(10),@hpbh varchar(10)
set @js = :js
set @fchm = :fchm
set @tchm = :tchm
set @hpbh = :hpbh

declare @sjs int
select @sjs = select top 1 js from table_123 where chm=@fchm and hpbh=@hpbh
if @js = 0 set @js = @sjs
if @js>=@sjs
begin
if exists(select * from table_123 where chm=@tchm and hpbh=@hpbh)
begin
update table_123 set js=js+@sjs where chm=@tchm and hpbh=@hpbh
delete table_123 where chm=@fchm and hpbh=@hpbh
end
else update table_123 set chm=@tchm where chm=@fchm and hpbh=@hpbh
end
else
begin
if exists(select * from table_123 where chm=@tchm and hpbh=@hpbh)
update table_123 set js=js+@js where chm=@tchm and hpbh=@hpbh
else insert into table_123(chm, hpbh, hpmc, js) select chm, hpbh, hpmc, @js from table_123 where chm=@fchm and hpbh=@hpbh
update table_123 set js=js-@js where chm=@fchm and hpbh=@hpbh
end
 
谢谢。我看了下。上面的SQL,我感觉,上面的SQL,只能一件一件的处理货品。
能否有可能,写出SQL,可以一次处理所有的记录?
 
我写了如下的批量处理语句,
想一次性把:#table_to中的数据,全部,转到:#table_from表中去,
但:执行时,总是:在:#table_from中有相同货品编号的货,能正确转移,
而在:#table_from中,没有的货,插入数据,没有执行,请指点。谢谢。
if exists(select hpbh from #table_to where hpbh in (select hpbh from #table_from))
update #table_to
set js = js + (select js from #table_from where hpbh=#table_to.hpbh),
je = dj * (js + (select js from #table_from where hpbh=#table_to.hpbh))
where hpbh in (select hpbh from #table_from)
else
insert into #table_to
select hpbh,hpmc,dj,js,je,ckm
from #table_from
where hpbh not in (select hpbh from #table_to)
delete from #table_from
 
改为:
update #table_to
set js = js + (select js from #table_from where hpbh=#table_to.hpbh),
je = dj * (js + (select js from #table_from where hpbh=#table_to.hpbh))
where hpbh in (select hpbh from #table_from)
insert into #table_to
select hpbh,hpmc,dj,js,je,ckm
from #table_from
where hpbh not in (select hpbh from #table_to)
delete from #table_from
因为:if ... else ...只是执行其中的一个条件。当两种情况都可能出现时,
就不完整。
 
多人接受答案了。
 
后退
顶部