寻求数据存储,有点难,高手请支着

lee_2020 2006-05-25 01:42:44
我想在sql中建一个数据存储,powerbuilder 中触发,从pb中传过来一个参数是关于出库单的,数据存储根据出库单上对应的货物数量按照先进先出的原则自动修改库存表中的数量,因为货物在库存表里是按照(自动序列、货物编号、批次、数量)这样的结构存储的,不同批次的相同货物是两条不同的记录。所以在修改库存数量时要求先拣出所有批次的这种货物,看批号最小的那批货物够不够出库的,不够的话,先把这批的货物全部出库再拣批号次小的去出库,直到满足出库单上要求的数量。
我可以先把参数简单设置为需要出库的一个货物包括(货物编号,数量)这两个变量,该如何去编写这个数据存储呢?请高手给点启发。
情况紧急!!!哪怕给点建议我也会给高分回报的!
...全文
129 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lee_2020 2006-05-25
  • 打赏
  • 举报
回复
我先给分啦
lee_2020 2006-05-25
  • 打赏
  • 举报
回复
多谢
子陌红尘 2006-05-25
  • 打赏
  • 举报
回复
当然,如果没有单价波动的情况,只考虑数量问题,直接用SQL也可能直接得出结果。

楼主把表结构和数据列出来,分析分析。
子陌红尘 2006-05-25
  • 打赏
  • 举报
回复
以前写的一个处理先进先出的例子:
-----------------------------------------------------------------------------------
--生成测试数据
Create Table tmp_IntPut(
FItemID Int ,
FQty Decimal(18,4),
FCost Decimal(18,4),
FID Int,
FRow Int,
FR Int Identity(1,1) )

Create Table tmp(Fid Int,
FItemID Int,
FQty DECIMAL(18,4),
FCost Decimal(18,4))

Insert Into tmp_IntPut(FItemID,FQty,FCost,FID)
Select 1, 1,20.00,1 Union
Select 1, 5,22.00,2 Union
Select 1,10,21.00,3 Union
Select 1,10,19.00,3 Union

Insert Into tmp(Fid,FItemID,FQty,FCost)
Select 1,1, 1,0 Union
Select 2,1, 6,0 Union
Select 3,1, 2,0 Union
Select 4,1,10,0
GO


--创建存储过程
CREATE PROCEDURE SP_PROCESS
AS
BEGIN
IF NOT EXISTS(SELECT 1 FROM tmp) OR NOT EXISTS(SELECT 1 FROM tmp_IntPut)
RETURN

--借助游标实现数据处理过程
DECLARE @FR int,@FCost Decimal(18,4)
DECLARE @FR_I int,@FQty_I DECIMAL(18,4),@FCost_I Decimal(18,4)
DECLARE @FID int,@FQty DECIMAL(18,4)

SELECT @FR=MAX(FR) FROM tmp_IntPut

DECLARE c1 CURSOR FOR
SELECT Fid,FQty FROM tmp ORDER BY Fid

DECLARE c2 CURSOR FOR
SELECT FR ,FQty,FCost FROM tmp_IntPut ORDER BY FR

OPEN c1
FETCH NEXT FROM c1 INTO @FID,@FQty

OPEN c2
FETCH NEXT FROM c2 INTO @FR_I,@FQty_I,@FCost_I

WHILE @@FETCH_STATUS=0
BEGIN
SET @FCost=0

IF @FR_I=@FR
SET @FCost=@FQty*@FCost_I
ELSE
BEGIN
WHILE @FQty>0
BEGIN
IF @FQty_I>0
BEGIN
IF(@FQty>@FQty_I)
BEGIN
SET @FCost=@FCost+@FQty_I*@FCost_I
SET @FQty=@FQty-@FQty_I
END
ELSE
BEGIN
SET @FCost=@FCost+@FQty*@FCost_I
SET @FQty_I=@FQty_I-@FQty
SET @FQty=0
END
END
BEGIN
IF @FR_I=@FR
BEGIN
SET @FCost=@FCost+@FQty*@FCost_I
SET @FQty=0
END
ELSE
FETCH NEXT FROM c2 INTO @FR_I,@FQty_I,@FCost_I
END
END
END
UPDATE tmp SET FCost=@FCost WHERE Fid=@FID

FETCH NEXT FROM c1 INTO @FID,@FQty
END
CLOSE c2
DEALLOCATE c2
CLOSE c1
DEALLOCATE c1
END
GO

--执行存储过程
EXEC SP_PROCESS
GO

--查看执行结果
SELECT * FROM Tmp
/*
Fid FItemID FQty FCost
----------- ----------- -------------------- --------------------
1 1 1.0000 20.0000
2 1 6.0000 131.0000
3 1 2.0000 42.0000
4 1 10.0000 210.0000
*/


--删除测试数据
DROP TABLE tmp,tmp_IntPut
lee_2020 2006-05-25
  • 打赏
  • 举报
回复
能给个游标的例子吗?
子陌红尘 2006-05-25
  • 打赏
  • 举报
回复
最直接的方法是用游标。
lxzm1001 2006-05-25
  • 打赏
  • 举报
回复
yes
lee_2020 2006-05-25
  • 打赏
  • 举报
回复
再问个白痴的问题,我要是现在给分,是不是就不能有其他人回帖了,不能给别人分数了啊。我想现在就送分给你啊
xiaoku 2006-05-25
  • 打赏
  • 举报
回复
先进先出啊。

这里有例子:
http://expert.csdn.net/Expert/topic/2480/2480338.xml?temp=.2083551

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧