设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 4408|回复: 7
打印 上一主题 下一主题

[ADO/DAO] 两种计价方式集成实例

[复制链接]
跳转到指定楼层
1#
发表于 2009-1-20 07:09:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   近日在版面看到有版友讨论移动平均的问题,这个问题让在下联想到存货的计价方式中便有一种叫做移动平均法的。从这个问题开始,便琢磨能否在一个系统中集成多种存货的计价方式。于是便花了点时间研究了一番,结论是这种想法还是可行的。在下面这个实例中,在下将加权平均法和移动平均法集成于一个简单的收发存系统中。
     两种计价方式基本算法如下:
    1、加权平均法:
    发料单价=(期初金额+月度累计收料金额)/(期初数量+月度累计收料数量)
    2、移动平均法:
    发料单价=(期初金额+累计收料金额-累计已发料金额)/(期初数量+累计收料数量-累计已发料数量)




系统图示:
1、期末结算库存前:

  


2、选择加权平均法:

  



3、单击【月结库存】按钮后:

  



4、无选项时点击【月结库存】按钮,清除原有结算数据:

  



5、选择移动平均法:

  



6、单击【月结库存】按钮后:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2009-1-20 07:09:40 | 只看该作者

回复 1# 的帖子

主要代码:

Private Sub 月结库存_Click()
Dim sql As String
DoCmd.SetWarnings no
If Me.计价选项 > 0 Then
   Select Case Me.计价选项
          Case Is = 1 '加权平均计价法
               sql = "SELECT 发料查询.记录号, 发料查询.物资ID, 加权平均查询.发料单价, 加权平均查询.发料数量, 加权平均查询.发料金额 INTO 临时表 "
                                  sql = sql + "FROM 发料查询 LEFT JOIN 加权平均查询 ON (发料查询.记录号 = 加权平均查询.记录号) AND (发料查询.物资ID = 加权平均查询.物资ID);"

               DoCmd.RunSQL sql '生成临时表查询
              sql = "UPDATE 临时表 INNER JOIN 发料查询 ON (临时表.记录号 = 发料查询.记录号) AND (临时表.物资ID = 发料查询.物资ID) SET 发料查询.单价 = 临时表.发料单价, 发料查询.金额 = 临时表.发料金额;"
              DoCmd.RunSQL sql '更新发料表查询
          Case Is = 2 '移动平均计价法
               DoCmd.GoToRecord acForm, "主窗体", acFirst
               For i = 1 To DCount("*", "卡片", "true")
                   sql = "SELECT No AS 标记, (select count(*) from 基础查询 as b where b.物资ID=a.物资ID and b.记录号<=a.记录号) AS 序号, "
                                            sql = sql + "a.记录号, a.日期, a.物资ID, a.名称, a.期初单价, a.期初数量, a.期初金额, a.收料单价, a.收料数量, a.收料金额, a.发料单价, a.发料数量, a.发料金额, "

                   sql = sql + "Round(期末金额/期末数量,2) AS 期末单价, (select sum(b.期初数量+b.收料数量-b.发料数量) from 基础查询 as b where b.物资ID=a.物资ID and b.记录号<=a.记录号) AS 期末数量, "
                   sql = sql + "(select sum(b.期初金额+b.收料金额-b.发料金额) from 基础查询 as b where b.物资ID=a.物资ID and b.记录号<=a.记录号) AS 期末金额 "
                   sql = sql + "INTO 临时表 FROM 基础查询 AS a where 物资ID=forms![主窗体]![物资ID];"
                   DoCmd.RunSQL sql '生成临时表查询
                   For j = 1 To DCount("*", "移动平均查询", "发料数量<>0")
                       sql = "SELECT 记录号, 物资ID, 发料单价, 发料数量,发料金额 INTO 临时表2 FROM 移动平均单价查询;"
                       DoCmd.RunSQL sql '生成临时表2查询
                       sql = "UPDATE 发料查询 INNER JOIN 临时表2 ON (发料查询.物资ID = 临时表2.物资ID) AND (发料查询.记录号 = 临时表2.记录号) SET 发料查询.单价 = 临时表2.发料单价, 发料查询.金额 = round(临时表2.发料单价*发料查询.数量,2);"
                       DoCmd.RunSQL sql '更新发料表查询
                       sql = "UPDATE 临时表2 INNER JOIN 临时表 ON (临时表2.物资ID = 临时表.物资ID) AND (临时表2.记录号 = 临时表.记录号) SET 临时表.发料单价 = 临时表2.发料单价, 临时表.发料金额 = 临时表2.发料金额;"
                       DoCmd.RunSQL sql '更新临时表查询
                       sql = "UPDATE 移动平均单价查询 SET 移动平均单价查询.标记 = -1;"
                       DoCmd.RunSQL sql '更新临时表标识查询
                   Next
                   DoCmd.GoToRecord acForm, "主窗体", acNext, 1
               Next
               DoCmd.GoToRecord acForm, "主窗体", acFirst
           End Select
           DoCmd.RunSQL "DELETE * FROM 临时表;"
           DoCmd.RunSQL "DELETE * FROM 临时表2;"
           Me.子窗体.Form.Requery
           Me.计价选项 = 0
           '增加下月期初月结单号
           DoCmd.RunSQL "INSERT INTO 单号表 ( 单据ID, 类型, 日期 ) SELECT '01' AS 单据ID, '月结单' AS 类型, DateAdd('m',1,Forms!主窗体!月度) AS 日期;"
          '生成临时表
           sql = "SELECT '01' AS 单据ID, '' AS ID, DateAdd('m',1,forms!主窗体!月度) AS 日期, 收发存查询.物资ID, 收发存查询.期末单价, 收发存查询.期末数量, 收发存查询.期末金额 INTO 临时表 "
           sql = sql + "FROM 收发存查询 WHERE (((收发存查询.序号)=99));"
           DoCmd.RunSQL sql
           '追加期初
           sql = "INSERT INTO 期初 ( 单据ID, ID, 日期, 物资ID, 单价, 数量, 金额 ) "
           sql = sql + "SELECT a.单据ID, Format((select count(*) from 临时表 as b where b.物资ID<=a.物资ID),'00') AS ID, a.日期, a.物资ID, a.期末单价, a.期末数量, a.期末金额 "
           sql = sql + "FROM 临时表 AS a;"
           DoCmd.RunSQL sql
    Else
    sql = "UPDATE 发料 SET 发料.单价 = 0, 发料.金额 = 0;"
    DoCmd.RunSQL sql '发料表清零查询
    sql = "DELETE 期初.单据ID, 期初.ID, 期初.日期, 期初.物资ID, 期初.单价, 期初.数量, 期初.金额, Format([日期],'yymm') AS 月度 "
    sql = sql + "FROM 期初 WHERE (((Format([日期],'yymm'))=Format(DateAdd('m',1,[forms]![主窗体]![月度]),'yymm')));"
    DoCmd.RunSQL sql '删除期初
    sql = "DELETE 单号表.日期, 单号表.单据ID, 单号表.类型, Format([日期],'yymm') AS 月度 "
    sql = sql + "FROM 单号表 WHERE (((单号表.类型)='月结单') AND ((Format([日期],'yymm'))=Format(DateAdd('m',1,[forms]![主窗体]![月度]),'yymm')));"
    DoCmd.RunSQL sql '删除期初月结单记录号
    Me.子窗体.Form.Requery
    End If
End Sub


[ 本帖最后由 todaynew 于 2009-1-20 07:10 编辑 ]

评分

参与人数 1经验 +10 收起 理由
Henry D. Sy + 10 我很赞同

查看全部评分

3#
发表于 2009-1-20 07:12:57 | 只看该作者
tn老兄辛苦,加分。
4#
 楼主| 发表于 2009-1-20 07:22:12 | 只看该作者
原帖由 Henry D. Sy 于 2009-1-20 07:12 发表
tn老兄辛苦,加分。


谢谢版主鼓励,呵呵。
5#
发表于 2015-2-10 14:12:40 | 只看该作者
太棒
回复

使用道具 举报

6#
发表于 2015-2-14 15:19:29 | 只看该作者
非常感谢
回复

使用道具 举报

7#
发表于 2015-2-25 09:16:44 | 只看该作者
{:soso_e163:},这个必须要点赞
8#
发表于 2018-11-4 13:25:08 | 只看该作者
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 02:58 , Processed in 0.122645 second(s), 38 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表