设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3056|回复: 10

[查询] 【Access小品】灵机一动 -- 一个有趣的算法

[复制链接]
发表于 2015-2-6 16:53:46 | 显示全部楼层 |阅读模式
本帖最后由 todaynew 于 2015-2-7 18:03 编辑

  有一个版友最近在折腾会计科目之间的计算问题,零零碎碎发了很多的帖子。今天看到一个关于费用和利润算法的问题,便觉得算法上有些罗嗦,便私下里想找一个更为简单一些的算法。

  我们知道会计采用借贷记账法,其中资产、成本及费用类科目增加计入借方,减少计入贷方,而负债、权益、收入类科目相反,并以此实现借贷平衡。这样就在计算期末余额的绝对值上,会出现前一类科目的计算公式与后一类科目的计算公式中,出现正负号相反的问题。比如,计算应收账款和应付账款的期末余额,计算公式分别如下:

  应收账款期末余额=期初余额+借方发生额合计-贷方发生额合计

  应付账款期末余额=期初余额-借方发生额合计+贷方发生额合计

  假设我们有一个查询中存在这样几个字段:科目编号,科目名称,类型(True/False),期初余额,借方发生额合计,贷方发生额合计,其中类型为True表示资产、成本及费用类科目,为False表示负债、权益、收入类科目。那么我们求期末余额的话,是可以这样来写的:

  select *,iif(类型=True,期初余额+借方发生额合计-贷方发生额合计,期初余额-借方发生额合计+贷方发生额合计) as 期末余额
  from 查询1

    问题在于,我们是否一定需要用iif函数呢?我想应该可以不用。因为我们知道在Access中,True=-1,False=0,如果能利用布尔值的这个特性,那就可以简化算法。现在的问题是需要将数组{-1,0},变换为{-1,1},只要这个变换能实现,那么就可以容易的写出算式了。我们可以这样来变换:

  2×{-1,0} => {2×(-1),2×0} => {-2,0}+1 => {-2+1,0+1} => {-1,1}   

  也就是说:

  2×{-1,0}+1 => {-1,1}


  基于这样的变换,我们的查询就可以简化为:

  select *,期初余额+(贷方发生额合计-借方发生额合计)*(类型*2+1) as 期末余额
  from 查询1

  我是比较讨厌用iif函数的,所以通常遇到iif函数,我就试图转换一个算法来解决问题,这种转换我觉得很有趣味。




本帖被以下淘专辑推荐:

发表于 2015-2-7 08:26:21 | 显示全部楼层
谢谢todaynew版主的帮助,我用你的方法来试试。

点击这里给我发消息

发表于 2015-2-7 09:55:40 | 显示全部楼层
赞一个!
回复

使用道具 举报

点击这里给我发消息

发表于 2015-2-7 09:59:51 | 显示全部楼层
新颖的想法!
发表于 2015-2-7 13:21:01 | 显示全部楼层
这才是大侠级别,学习了!
发表于 2015-2-12 11:08:30 | 显示全部楼层
有利有弊,牺牲了可读性,但赢得了执行效率。

点评

哥们好悟性.事物都有两面性  发表于 2015-2-12 13:00

点击这里给我发消息

发表于 2015-2-13 13:10:20 | 显示全部楼层
老汉点子多{:soso_e179:}
发表于 2015-5-1 15:39:04 | 显示全部楼层
我来学习学习,看一下

点击这里给我发消息

发表于 2015-11-22 10:38:48 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2016-8-20 15:24:22 | 显示全部楼层
#在这里快速回复#已经下载学习,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 17:11 , Processed in 0.100563 second(s), 40 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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