Access数据库培训
网站公告
·Access快速平台QQ群号:277422564    ·Access快速开发平台下载地址及教程    ·欢迎添加微信交流账号:Accessoft7    ·如何快速搜索本站文章|示例|资料!    
您的位置: 首页 > 技术文章 > Access数据库-教程

22选5河南最新开奖:【Access小品】灵机一动-- 一个有趣的算法

黑龙江22选5 www.xyf1x.cn 时 间:2015-02-06 16:57:04
作 者:煮江品茶   ID:10802  城市:武汉
摘 要:【Access小品】灵机一动 -- 一个有趣的算法
正 文:

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

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

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

  假设我们有一个查询中存在这样几个字段:科目编号,科目名称,类型(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函数,我就试图转换一个算法来解决问题,这种转换我觉得很有趣味。 
  


Access软件网QQ交流群 (群号:329019313)       access源码网店

最新评论 查看更多评论(9)

2019/3/12 8:32:20冰青
看神仙打架很长见识啊

2015/2/10 17:32:54煮江品茶
呵呵,鬼打架的。
abs(字段)*2-1算球不出来的。

2015/2/10 16:37:26何保辛
到底 {1,0} 要换成 {-1,1} 还是 {1,-1} 随便大家自己写算法。{-1,1} * -1 = {1,-1}。我提出的只是 数据库可能会是 {1,0} 或 {-1,0},所以要 abs(字段)*2-1 或 1-abs(字段)*2。才能兼容现在小型的 access 数据库,和未来的任何数据库,不要现在埋下陷阱给自己。

2015/2/7 18:54:25煮江品茶
何保辛同志,在sql server、oracle、mysql中由于逻辑性的值用{1,0}表示,所以算法只是改写为:(1-类型*2)即可。转换的方法如下:
-2*{1,0}+1 => {-2+1,0+1} => {-1,1}

而用abs(类型)*2-1是得不到正确结果的。呵呵。


2015/2/7 15:45:16何保辛
或者用更复杂的算法来计算:

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


发表评论您的评论将提升作者分享的动力!快来评论一下吧!

用户名:
密 码:
内 容:
 

常见问答

技术分类

相关资源

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助