再来一个SQL SERVER问题---设计或者写存储过程(300分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
一个HOLD货物的问题
在需要期货时,需要在采购单中寻找是否有期货.
我的设计如下:
一个采购子表:
单据编号,子表编号(流水).产品编号.到货日期...
一个HOLD货表
编号.员工编号.产品编号,需要日期

诸位看看有什么更好的方法

用怎么样的SQL(最好是存储过程)比较好?
 
相对简单,www.vclxx.com上有一些经典的控件,
而视频采集卡。。。。
我没做过,但想知道。
 
对不起,前面是操作失误!
 
cj:
是不是要找到需要日期>=到货日期的记录?
如果是:
select 采购子表.单据编号,采购子表.子表编号,采购子表.
采购子表.产品编号,采购子表.到货日期,
HOLD货.编号.HOLD货.员工编号,需要日期
from
采购子表 inner join HOLD货
on 采购子表.产品编号=HOLD货.产品编号
where
采购子表.到货日期<=HOLD货.需要日期
 
不.没那么简单,是还要考虑.货物数量.货物日期最接近的等.最好这个HOLD过程自动
完成
 
这个问题写存储过程比较麻烦,要控制循环,判断,标记等.还是在客户端用delphi熟练
些.
先做个查询,按货号连接,按到货日期排队 ,类似g622的查询.从第一行开始循环,比较
货物数量,如果数量充足,则在hold表中标记此行已hold,在订货表中填入hold数量,
如果数量不足,把此行hold,用差额再找下一张.
 
"最接近的等"
---等?再说清楚一些.
"最接近的"可以用min()来作到.

select 采购子表.单据编号,采购子表.子表编号,采购子表.
采购子表.产品编号,采购子表.到货日期,
HOLD货.编号.HOLD货.员工编号,需要日期,
min(采购子表.到货日期-HOLD货.需要日期) as tt
from
采购子表 inner join HOLD货
on 采购子表.产品编号=HOLD货.产品编号
where
采购子表.到货日期<=HOLD货.需要日期
 
这样的:
如果:
日期 产品编号 数量
1月1日 1 10
1月2日 1 10
1月3日 1 10
那么.如果我需要1月2日有15个货物.
那么需要HOLD1月2日10个+1日5个
而不是2日5个1日10个
 
太复杂了,还是在客户端处理吧,超出了关系数据库的范畴,不适合SQL语句干.
 
所以我知道一句搞不定呀,才用存储过程
 
我认为用存储过程无论从速度上、维护上都比
在Delphi中用数据组件操纵要好一点。
起码你要改变一个算法不需要改写程序。
另外,
对于期货的业务流程不懂,
你的条件描述得不太清楚,
只知道要
●要求查询此货物在采购表中是否存在,存在条件为
·条件一:需要日期>=到货日期;
·条件二:首先要Hold 需要日期=到货日期的那部分货物,操作限定为:
·Hold_One
如果到货日期的货物数量>=需要日期的货物数量
那么,Hold此部分,返回
否则,找出与需要日期最近的到货日期,
赋值 需要日期=到货日期,重新做Hold_One
但Hold是什么意思?是要更新某一字段值吗?
请你给出详细的查询要求和限定,我试着给你写一个存储过程.
 
哦,HOLD即预定之类的意思,就是我HOLD了期货,别人就不能自动HOLD
 
写了个存储过程 hold,接受三个参数,货号,需要日期,数量.
原订单表加了个字段 hold,表示已hold的数量
create proc hold
@vProductID varchar(255),
@vQueryDate datetime,
@vQty float
as

set nocount on

declare @iQty float
select @iQty = @vQty


declare cursorProcNames cursor for
select order_qty-hold,hold from po_detail where product_id =
@vProductID and receive_date <= @vQueryDate and
rder_qty-hold>0 order by receive_date desc

open cursorProcNames

declare @iorderQty float
declare @iholdQty float

begin tran

while @vQty> 0
begin
fetch next from cursorProcNames into @iorderQty,@iholdQty
if @@fetch_status <> 0
begin
rollback tran
return 0
end
if @iorderQty >= @vQty
begin
update po_detail set hold=hold+@vQty where current of cursorProcNames
return 1
end
else set @vQty = @iorderQty - @vQty
end
commit tran
 
gxg: okok, 分数估计会给你没问题了让我再调试一下给点时间, 利息不付了
你对SQL好象满熟嘛, 和和,聊聊?
 
多人接受答案了。
 
后退
顶部