求按照先进先出方法用存储过程传入商品ID和数量得到出库成本(200分)

  • 主题发起人 主题发起人 _yzy_
  • 开始时间 开始时间
Y

_yzy_

Unregistered / Unconfirmed
GUEST, unregistred user!
明细表
id 商品代码 数量 价格 日期 类别
1 001 10 8 2008-03-01 采购
1 001 3 9 2008-03-01 采购
2 001 8 12 2008-03-10 采购
3 001 12 6 2008-04-15 采购
4 002 5 10 2008-04-02 采购
5 001 2 16 2008-04-05 出库
6 002 1 20 2008-04-05 出库
7 001 13 16 2008-04-20 出库
8 001 1 16 2008-05-01 出库
假设我准备2008-05-10出库开单时候输入001商品8个,我的目的是按照先进先出方法用sql语句得出这8个商品的出库成本5*12元+3*6元=108元,在

未产生出库记录之前,输入将要出库的商品代码和数量,上得出对应的出库成本,然后把不同单价的分为一行插入到出库单中

如在出库单表格中输入:商品代码001和数量5 然后在出库单中生成如下记录:

id 商品代码 数量 价格
1 001 5 12
2 001 3 6
 
按照入库的时间做循环判断,在达到需要的数据时,停止,不够时要提示库存不足。
也可以使用存储过程。
 
提个建议,你最好在你的表里对采购的项作个标志,比如先进的,第一个当为0时做个标记,这样量多的时候可能提升性能不少,你说的这个存储过程可以实现,以前我写过,不过出差再外地,资料没带,你网上找先,二楼兄弟说的循环来计算
 
我吧逻辑大概写了下,应该没错,希望对你有所帮助
CREATE PROCEDURE jsck (@spname varchar(15), @spsl int)
as
declare @id int /*ID*/
declare @id1 int /*ID*/
declare @spdm VARCHAR(15) /*商品代码*/
declare @spdm1 VARCHAR(15) /*商品代码*/
declare @sl int /*数量*/
declare @sl1 int /*数量*/
declare @sl2 int /*数量*/
declare @jg int /*价格*/
declare @jg1 int /*价格*/
declare @rq datetime /*日期*/
declare @lb VARCHAR(10) /*类别*/

declare cwb_cursor cursor for select [id],商品代码,数量,价格,日期,类别 from 明细表 where 商品代码=@spname and 类别='采购' and 标记>0 order by 日期 for update
declare @fetch_status int

open cwb_cursor /*打开更新*/
fetch next from cwb_cursor into @id,@spdm,@sl,@jg,@rq,@lb

set @sl2=9999 /* 先给他一个不可能的值,方便后面判断 */

while @@fetch_status=0
begin
if @sl2=9999 /* 标示是第一次计算 */
begin
if @sl-@spsl>=0 /*如果库存数量大于出库数量*/
begin

/* 建议这作一个标示,标示该项已经为0了,以后就不用再判断他 */
/* 再根据你的需要把最后的结果以你需要的形式输出 */
goto jieshu /* 第一项已经够减了,就退出 */
end
else /*如果不够*/
begin
set @sl2=@spsl-@sl /**/
/* 建议这作一个标示,标示该项已经为0了,以后就不用再判断他 */
/* 再根据你的需要把这个的结果以你需要的形式输出 */
end
end
else /* 标示不是第一次计算 */
begin
if @sl-@sl2>=0 /*如果库存数量大于出库数量*/
begin

/* 建议这作一个标示,标示该项已经为0了,以后就不用再判断他 */
/* 再根据你的需要把最后的结果以你需要的形式输出 */
goto jieshu /* 第一项已经够减了,就退出 */
end
else /*如果不够*/
begin
set @sl2=@sl-@sl2 /**/
/* 建议这作一个标示,标示该项已经为0了,以后就不用再判断他 */
/* 再根据你的需要把这个的结果以你需要的形式输出 */
end
end

fetch next from cwb_cursor into @id,@spdm,@sl,@jg,@rq,@lb
end

jieshu:

close cwb_cursor /*关闭*/
deallocate cwb_cursor
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部