Office中国论坛/Access中国论坛
标题: 各位高手,请进!关于库存先进先出问题! [打印本页]
作者: petrelai 时间: 2004-3-28 18:04
标题: 各位高手,请进!关于库存先进先出问题!
现在有一个大问题需要大家的帮忙!(对我来说)
如何才能实现:当每一次采购进货时,系统会自动保存它的进货价
当进行销售时,系统如何才能实现把前一次入库的先卖掉,(即进货是取前一次入库的进货价),当卖完前一次的再卖这一次的。而每一个月进行销售总结时,也要跟销售一样。进货价是取这种商品真正的进货价?
请各位帮忙!
[此贴子已经被作者于2004-3-28 11:42:41编辑过]
作者: winston 时间: 2004-3-28 18:15
会计的先进先出法?
作者: petrelai 时间: 2004-3-28 18:29
是呀?可以实现吗?
作者: winston 时间: 2004-3-28 18:43
应该可以,但是我也是菜鸟
作者: petrelai 时间: 2004-3-28 18:52
呵,还是谢谢你
作者: paul16 时间: 2004-3-28 20:14
入库使用入库明细表来保存,出库使用出库明细表来保存!
出库时要选最近一次进货价只要查询入库明细表中的日期最后的价格就可以了!至于出库也是一个道理啊!
作者: petrelai 时间: 2004-3-28 21:10
请问有没有关于这方面的例子呢?其中还关于退货的问题
作者: petrelai 时间: 2004-3-29 00:43
我想问一下,如何才能查出最近一次进货价?
也就是说如何才能得到最近一次进货价呢?
用DLOOUP()函数的话,,入库明细表应有什么设置呢?
[此贴子已经被作者于2004-3-28 16:48:08编辑过]
作者: LYP6160 时间: 2004-3-29 00:56
用DLookup函数和DMax函数可以取出最大(即最新)日期的进货价
作者: petrelai 时间: 2004-3-29 01:17
以下是引用paul16在2004-3-28 12:14:11的发言:
入库使用入库明细表来保存,出库使用出库明细表来保存!
出库时要选最近一次进货价只要查询入库明细表中的日期最后的价格就可以了!至于出库也是一个道理啊!
那你这样说的话,那入库单有一个日期,入库明细又有一个日期,岂不是重复?
作者: 我同意 时间: 2004-3-29 04:32
假设有一进库历史表
日期 数量 价格 剩余数量
注意,剩余数量是该条记录所进货的剩余数量.
出货时,先进先出,应该是从日期最小且有剩余数量的记录开始操作,数量不够则再找更大日期的进货记录,(前面几位提到找最新价则是后进先出了).
当然退货是相反的过程(如果规则是这样),从最新进货记录开始,逐条记录朝前补剩余数.
作者: petrelai 时间: 2004-3-29 04:43
那操作是在进库历史表中进行吗?如果是的话,请问何才能用代码来实现?前面的几个高手说得我我明白七八分,但不知怎么写了.
作者: 我同意 时间: 2004-3-29 05:08
我只是用进货历史记录表来实现先进先出的效果.这只是一种思路(我认为可行).
当然我这里的进货历史表也只是起到提供先进先出历史价格的作用.(当然后进先出原理是一样,只是次序相反)
操作的关键就在于剩余数量的理解.(参见我上一帖),有剩余说明这个价格的货没出完.
而真正的进销存,恐怕至少需要库存货品明细表,库存移动历史明细表(移动类型.日期,批号,价格,数量,对应购销单号等等 )
代码?
petrelai,据我的观察,这对你来说已是小菜一碟了,只要你对整个原理有了理解.
作者: petrelai 时间: 2004-3-29 05:23
"我同意"大人,你也太看得起我吧,不过谢谢!
先试试看吧
作者: petrelai 时间: 2004-3-29 22:02
以下是引用我同意在2004-3-28 20:32:16的发言:
假设有一进库历史表
日期 数量 价格 剩余数量
注意,剩余数量是该条记录所进货的剩余数量.
出货时,先进先出,应该是从日期最小且有剩余数量的记录开始操作,数量不够则再找更大日期的进货记录,(前面几位提到找最新价则是后进先出了).
当然退货是相反的过程(如果规则是这样),从最新进货记录开始,逐条记录朝前补剩余数.
"我同意"所提到的进货历史表是不是应该改为进出货历史表呢?如果说是话,那么
日期 进库量 出库量 进库价 剩余数量
=上结存+入库量-出库量
那么最初的上结存又怎么得来呢?是不是直接把进库量变成最初的上结存了呢?那又怎么才知道那是最初的上结存呢?
我现在都是在围绕这个剩余数量想不开呀,各位高手可不可再给点小"提示"呢?
[此贴子已经被作者于2004-3-29 14:34:08编辑过]
作者: 我同意 时间: 2004-3-29 23:44
我所提及“进货历史表”与“进出货历史表”是不同的概念。
实际实际上我的“进货历史表”不如改称“历史价格表”,否则容易混淆概念。
当前库存=期初存+本期进-本期出 是从整体上考察库存数量。
而我所说的剩余数量是指特定价格的存货的剩余数量。(当然还要考虑特定品种)
“历史价格表”是专门为保留历史价格以满足“先进先出”原则而设立的,他客观上可以计算当前库存数,但这不是它的主要任务。看结构
进货日期 进货价格 名称 剩余数量
20040201 1.58 AA 200
20040204 3.05 BB 300
20040225 1.80 AA 150
这里AA的库存总量350,是所有AA记录剩余数量字段总和。
假设20040229出库AA280个
历史价格表结果应该是:
进货日期 进货价格 名称 剩余数量
20040201 1.58 AA 0
20040204 3.05 BB 300
20040225 1.80 AA 70
而进出库的明细记录表应同时另作处理。
这样历史价格表起到了保存历史价格的效果。(该表里的“剩余数量”是指以某价格进货的某种货品的剩余)
作者: petrelai 时间: 2004-3-30 00:41
我明白您的意思,但我不知道怎么把它给算出来?用笔当然是可以,但用程序的话.我就不会了!
作者: 我同意 时间: 2004-3-30 05:28
呵呵,是吗?我不信你不会写.
以我在16楼举的例子
AA出货280个.
Dim 尚未出数
尚未出数=应出数
打开历史价格表
寻找AA的最小日期的记录.
Do while 0<尚未出数 Or 未到文件尾
If 剩余数量>=尚未出数 Then
剩余数量=剩余数量-尚未出数
["尚未出数"数量的AA以本记录价格出货,相应其他处理]
尚未出数=0
Else
尚未出数=尚未出数-剩余数量
["剩余数量"数量的AA以本记录价格出货,相应其他处理]
剩余数量=0
end if
继续(注意是AA的记录,是否事先筛选就看你愿意了)
loop
[此贴子已经被作者于2004-3-29 21:30:31编辑过]
作者: petrelai 时间: 2004-3-30 05:35
我说过,不要太看得起我,不然,哈,深渊哟!今天我在看我在ACCESS交流中心收集的例子:不知您看过没有.今天我还没完全去研究它呢.这个问题好像在各个论坛里都没有一个完整的例子.[attach]4069[/attach]
作者: 我同意 时间: 2004-3-30 05:44
呵呵,我也正在我收集的例子里研究呢,最近碰到问题不少.
作者: petrelai 时间: 2004-3-30 05:47
嘻,最好你搞出一个完整的例子,最好啦!
作者: 我同意 时间: 2004-3-30 05:55
恐怕不行,我最近在搞另一个东西,头正大着ing
作者: petrelai 时间: 2004-4-4 07:25
以下是引用我同意在2004-3-28 20:32:16的发言:
假设有一进库历史表
日期 数量 价格 剩余数量
注意,剩余数量是该条记录所进货的剩余数量.
出货时,先进先出,应该是从日期最小且有剩余数量的记录开始操作,数量不够则再找更大日期的进货记录,(前面几位提到找最新价则是后进先出了).
当然退货是相反的过程(如果规则是这样),从最新进货记录开始,逐条记录朝前补剩余数.
和18的说法.经过大家热心的帮忙!
现在我做到了,但数量不够则再找更多的日期的进货记录还没有做到.那应怎么再跳到那里去呢?
[此贴子已经被作者于2004-4-3 23:45:39编辑过]
作者: akesaisi 时间: 2004-4-4 07:50
研读了一下本话题,
我认为,历史价格表内记录的增加肯定是日期新的记录在后面的.所以实际上寻找记录的循环只要依次MoveNext并判断货品是否匹配.数量是否够是是否结束寻找循环的判断条件之一.当然还要考虑是否到文件尾等.
作者: petrelai 时间: 2004-4-5 18:36
又有新问题了,如果我想在销售出库时,找出它相应的进货价,但如果这次出库量含有两个不同进货价的出库量,那应该怎么做才可以把它们各自的进货价找出来呢?请帮忙改一下:
Dim bian, ku, wan, wei, qi, qian, zi
Dim e As Currency
Dim ri As Date
Dim db As DAO.Database
Dim rec As DAO.Recordset
Dim strXs As String
Dim check
check = True
bian = " [商品编号] ='" & Forms![销售出库]![销售出库子窗体]![商品编号] & "'"
wan = "[完结]=" & False
wei = Forms![销售出库]![销售出库子窗体]!数量
Set db = CurrentDb()
strXs = "select 库存表.日期,库存表.库存量,库存表.完结,库存表.商品进价 from 库存表 where 库存表.商品编号 = '" & Forms!销售出库!销售出库子窗体!商品编号 & "'" & "and 库存表.完结 = " & False & ""
Set rec = db.OpenRecordset(strXs, dbOpenDynaset)
'ri = DMin("日期", "库存表")
'rec.FindFirst "[日期]=# " & Forms!销售出库!销售出库子窗体!单据日期 & "#"
Do While wei < 0 Or Not rec.EOF
If rec("库存量") > wei Then
rec.Edit
rec("库存量") = rec("库存量") - wei
Forms![销售出库]![销售出库子窗体]![进货价] = rec("商品进价")
rec.Update
Exit Do
Else
rec.Edit
wei = wei - rec("库存量")
Forms![销售出库]![销售出库子窗体]![进货价] = rec("商品进价")
rec("库存量") = 0
rec("完结") = True
rec.Update
End If
rec.MoveNext
Loop
作者: akesaisi 时间: 2004-4-5 19:45
你的子窗是进货历史表吗?
另外你找进货价的目的是什么?
先进先出是用进货价来计算已销售商品成本的.
作者: petrelai 时间: 2004-4-5 20:50
对呀,我的就是用来算销售商品的成本的。
但上面的程序只能记住着最一次的进货价。如这次出库量为2,但库存里有一个进货价为220,一个进货价为215的,我想把它们的进货价也拿出来,跟销售单放在一块。即这出库金额为220+215=435,而不是215*2=430
作者: Benjamin_luk 时间: 2004-4-5 22:32
你可以用总价来记录成本嘛!
作者: petrelai 时间: 2004-4-5 22:37
那当我在算单个商品成本时,那岂不是没得算?!还有什么方法呀?
作者: Benjamin_luk 时间: 2004-4-5 22:47
按平均单价不就成了吗?
作者: Benjamin_luk 时间: 2004-4-5 22:49
都是同一订单,用不着分那么细的了
[此贴子已经被作者于2004-4-5 15:00:24编辑过]
作者: petrelai 时间: 2004-4-6 01:14
不是呀。到时我要做商品销售明细时就没法分了。
作者: akesaisi 时间: 2004-4-6 01:32
销售订单里就别考虑进价了.因为同一品种在销售单里一般是一条记录,所以难以考虑多种进价的数据保存.
1.可以考虑处理完销售记录同时,再处理本次出货的成本.即再搞个成本表. 是不是太复杂了?
2.可以在销售记录中设一个成本字段,用以汇总同一商品的核销成本.(但成本组成的明细内容似乎还是搞一个成本表比较好)
作者: petrelai 时间: 2004-4-6 01:38
我有一个成本表呀,因为我这个库要做采用先进先出的方法来计算商品的销售成本,所以我我建了一个成本表,销售时的成本就在这个表取,但如果出现29楼,还是28楼说的那样的情况出现的话,我就没法了,它只会取最后一个商品销售的成本表。我们老板而就是想要这种效果,不想要平均的。我为了这个问题苦了十多天呀。
作者: Benjamin_luk 时间: 2004-4-6 18:01
你在下面的代码中加入增加数据到成本表不行了吗?你进货时还是用批号吧
//Dim Rs1 as recordset
//set rs1=db.OpenRecordset("成本表", dbOpenDynaset)
//在减库存量的时候同时记录成本
//RS1.Edit
//rs1(..)=Forms!..![订单号]
//rs1(..)=Forms!..![产品]
//rs1(..)=wei
//rs1(..)== rec("商品进价")
这样的记录,还怕什么找不到
Dim bian, ku, wan, wei, qi, qian, zi
Dim e As Currency
Dim ri As Date
Dim db As DAO.Database
Dim rec As DAO.Recordset
Dim strXs As String
Dim check
check = True
bian = " [商品编号] ='" & Forms![销售出库]![销售出库子窗体]![商品编号] & "'"
wan = "[完结]=" & False
wei = Forms![销售出库]![销售出库子窗体]!数量
Set db = CurrentDb()
strXs = "select 库存表.日期,库存表.库存量,库存表.完结,库存表.商品进价 from 库存表 where 库存表.商品编号 = '" & Forms!销售出库!销售出库子窗体!商品编号 & "'" & "and 库存表.完结 = " & False & ""
Set rec = db.OpenRecordset(strXs, dbOpenDynaset)
'ri = DMin("日期", "库存表")
'rec.FindFirst "[日期]=# " & Forms!销售出库!销售出库子窗体!单据日期 & "#"
Do While wei < 0 Or Not rec.EOF
If rec("库存量") > wei Then
rec.Edit
rec("库存量") = rec("库存量") - wei
Forms![销售出库]![销售出库子窗体]![进货价] = rec("商品进价")
rec.Update
Exit Do
Else
rec.Edit
wei = wei - rec("库存量")
Forms![销售出库]![销售出库子窗体]![进货价] = rec("商品进价")
rec("库存量") = 0
rec("完结") = True
rec.Update
End If
rec.MoveNext
Loop
作者: Benjamin_luk 时间: 2004-4-6 18:23
Do While wei < 0 Or Not rec.EOF
是不是应该为:
Do While wei > 0 Or Not rec.EOF
作者: Benjamin_luk 时间: 2004-4-6 18:27
另外,我觉得,你还先看一下,库存量是否足够,所以还要多写一些代码,提醒用户当前的库存是否足够.
作者: petrelai 时间: 2004-4-6 18:52
您这样做的话,是不是用到了两个表来计算了?一个库存表,记录着入库的进货价,一个是成表,记录着出库存的成本价。
作者: Benjamin_luk 时间: 2004-4-6 19:01
只有这样才能做到了,这样做也很容易呀
作者: petrelai 时间: 2004-4-6 19:03
您说得对,好,我先试试看。谢谢!
作者: petrelai 时间: 2004-4-6 19:46
Dim bian, ku, wan, wei, qi, qian, zi
Dim e As Currency
Dim ri As Date
Dim db As DAO.Database
Dim rec, Rs1 As DAO.Recordset
Dim strXs As String
bian = " [商品编号] ='" & Forms![销售出库]![销售出库子窗体]![商品编号] & "'"
qian = " [商品进价] =" & Forms![销售出库]![销售出库子窗体]![进货价] & " "
wan = "[完结]=" & False
wei = Forms![销售出库]![销售出库子窗体]!数量
Set db = CurrentDb()
strXs = "select 库存表.日期,库存表.库存量,库存表.完结,库存表.商品进价 from 库存表 where 库存表.商品编号 = '" & Forms!销售出库!销售出库子窗体!商品编号 & "'" & "and 库存表.完结 = " & False & ""
Set rec = db.OpenRecordset(strXs, dbOpenDynaset)
If IsNull(rec("日期")) Then
MsgBox "库存中没有该商品信息,请确认是否已入库!", 16, "警告"
Exit Sub
End If
Do While wei > 0 Or Not rec.EOF
If rec("库存量") > wei Then
rec.Edit
rec("库存量") = rec("库存量") - wei
Forms![销售出库]![销售出库子窗体]![进货价] = rec("商品进价")
rec.Update
Set Rs1 = db.OpenRecordset("销售日志", dbOpenDynaset)
Rs1.AddNew
Rs1("日期") = Forms![销售出库]![单据日期]
Rs1("商品编号") = Forms![销售出库]![销售出库子窗体]![商品编号]
Rs1("数量") = wei
Rs1("商品进价") = rec("商品进价")
Rs1("商品售价") = Forms![销售出库]![销售出库子窗体]![商品售价]
Exit Do
Else
rec.Edit
wei = wei - rec("库存量")
Forms![销售出库]![销售出库子窗体]![进货价] = rec("商品进价")
rec("库存量") = 0
rec("完结") = True
rec.Update
Set Rs1 = db.OpenRecordset("销售日志", dbOpenDynaset)
Rs1.AddNew
Rs1("日期") = Forms![销售出库]![单据日期]
Rs1("商品编号") = Forms![销售出库]![销售出库子窗体]![商品编号]
Rs1("数量") = wei
Rs1("商品进价") = rec("商品进价")
Rs1("商品售价") = Forms![销售出库]![销售出库子窗体]![商品售价]
End If
rec.MoveNext
Loop
代码是这样吗?好像不行耶,我加了进去,没反应!
作者: Benjamin_luk 时间: 2004-4-6 20:10
要加
rs1.Update
作者: petrelai 时间: 2004-4-6 21:06
哈…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………笑三天三夜都不够呀,非常感谢您的帮忙!
作者: paul16 时间: 2004-4-6 21:20
笑不久的!照你现在的表做下去还有很多路要走!
作者: Benjamin_luk 时间: 2004-4-6 21:53
值得这么开心吗?
作者: petrelai 时间: 2004-4-6 23:57
肯定的啦。非常开心!
还有,PAUL16版主大人,你在泼我冷水吗?或许您有什么好意见,提出来呀。我可不想到没有路走时,就完了。
作者: 土豆 时间: 2004-4-7 00:02
多花点时间在系统结构设计上比较好,包括数据库结构
作者: petrelai 时间: 2004-4-7 00:06
你们是说我设计的系统结构设计上不好,容易出错,是吧?
作者: warmpeng 时间: 2004-4-22 08:00
petrelai,你先进先出的问题最后搞定了吗?我也遇到同样的难题,想请教你一下。
作者: petrelai 时间: 2004-4-22 18:13
其实就像“我同意”那样说的。建一个进价历史表:日期,商品编号,进价,完结。把每一闪采购进货时,如果是同一种商品,进价不一样的话,那就新增进去,如果说是相同的话,那就加进去。销售出库时就刚才好相反。不过做起很烦人,联系到删除,编辑也要用进行进出库。
作者: warmpeng 时间: 2004-4-22 19:16
那能不能麻烦你把你的例子传给我看一下,先谢谢了。
作者: petrelai 时间: 2004-4-22 19:29
标题: 哇好大的哟。我把进库和出库的给你吧
不好意思,我自己也在修改,有点乱。也还没有做完。
[attach]4369[/attach]
[此贴子已经被作者于2004-4-22 20:14:06编辑过]
作者: warmpeng 时间: 2004-4-22 22:34
真是好人呀。我的QQ是585769,能不能有幸加你的好友。
作者: warmpeng 时间: 2004-4-22 22:58
555555555 可是一登陆就报错 什么都没法用呀
作者: petrelai 时间: 2004-4-22 23:10
不好意思!传错了!
还在上上楼中!
[此贴子已经被作者于2004-4-22 15:11:03编辑过]
作者: warmpeng 时间: 2004-4-23 03:08
能登陆了 可是一填入库单或者出库单就出错呀。
作者: petrelai 时间: 2004-4-23 04:15
这次行了吧
作者: warmpeng 时间: 2004-4-23 06:10
出库还是不能用呀。
作者: hi-wzj 时间: 2004-4-23 22:35
到这儿看看我的例子。欢迎大家讨论。
http://accxp.com/club/topic.cgi?forum=2&topic=11787
改一句代码即成后进先出。
[此贴子已经被作者于2004-4-23 14:36:01编辑过]
作者: caibbs 时间: 2004-4-25 18:07
请问有没有关于这方面的例子呢?
作者: shslsun 时间: 2015-2-10 12:14
期待
作者: shslsun 时间: 2015-2-10 12:43
非常期待呀
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |