Foxtable(狐表)用户栏目专家坐堂 → 关于水流帐问题


  共有3545人关注过本帖树形打印复制链接

主题:关于水流帐问题

帅哥哟,离线,有人找我吗?
lgz518
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
关于水流帐问题  发帖心情 Post By:2020/4/27 16:07:00 [只看该作者]

更多的时候,流水账是区分产品的,例如下图的库存表:

图片点击可在新窗口打开查看

此类流水账的设计方法要复杂一些,DataColChanged事件代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Select Case e.DataCol.Name
    Case
 "产品","入库",
"出库"
        
Dim drs As List(of DataRow)
        Dim Filter As String
        Filter = "[_SortKey] >= " & e.DataRow("_SortKey") & " And [产品] = '" & e.DataRow("产品") & "'"
        drs = e.DataTable.Select(Filter)
        For Each dr As DataRow In drs
            Filter = "[_SortKey] <= " & dr("_SortKey") & " And [产品] = '" & dr("产品") & "'"
            Dim Val1 As Double = e.DataTable.Compute("Sum(入库)",Filter)
            Dim Val2 As Double = e.DataTable.Compute("Sum(出库)",Filter)
            dr("库存") = Val1 - Val2
        Next
        If e.DataCol.Name = "产品" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then
            Filter = "[_SortKey] > " & e.DataRow("_SortKey") & " And [产品] = '" & e.OldValue & "'"
            drs = e.DataTable.Select(Filter)
            For Each dr As DataRow In drs
                Filter = "[_SortKey] <= " & dr("_SortKey") & " And [产品] = '" & dr("产品") & "'"
                Dim Val1 As Double = e.DataTable.Compute("Sum(入库)",Filter)
                Dim Val2 As Double = e.DataTable.Compute("Sum(出库)",Filter)
                dr("库存") = Val1 - Val2
            Next
        End If
End
 Select

上述代码的3到12行很好理解,当我们修改产品、入库、出库三列内容后,即从此行开始重算同产品所有行的余额。
假定我们修改的是产品,例如将产品由PD01改为PD02,3到12行会从此行开始重算所有产品为PD02的行的余额;显然此行之后的产品为PD01的行的余额,也是应该重算的,于是就有了13到22行的代码,注意第14行在合成条件的时候,用e.OldValue取得原产品名称。

AfterMoveRow事件代码变化不大,条件表达式中加入产品比较即可:

Dim Key As Decimal
Dim
 Index As Integer
Dim
 Filter As String
Dim
 r As Row
Index = Math.Min(e.OldIndex, e.NewIndex)
Key = e.
Table.Rows(Index)("_SortKey")
r = e.
Table.Rows(e.NewIndex)
Filter = 
"[_SortKey] >= " & Key & " And [产品] = '" & r("产品") & "'"
e.
Table.DataTable.DataCols("入库"
).RaiseDataColChanged(Filter)

而DataRowDeleting事件代码则完全相同:

e.DataRow("入库") = 0
e.
DataRow("出库") = 0



如何用流水帐,实现如图功能:

1.表首行是“期初数”,固定,而且不参加计算;

2,每个月月未或每月25日,自动进行月未结算,本月合计,和本年合计;

3,第二个月,第一行是本月的“期初数”(上个月,第一个月的本月合计数);

4,本月合计和本年合计的行,都用红色框框起来。如何代码实现?请老师,指导,谢谢!


图片点击可在新窗口打开查看此主题相关图片如下:流水帐.jpg
图片点击可在新窗口打开查看









 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106067 积分:539428 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/27 16:47:00 [只看该作者]

这个其实和流水账没有什么关系。月结的时候,直接做个分组统计,按本月的时间段分组统计即可,统计结果就是本月的月末合计,然后把这个月末合计作为下月期初使用即可

 回到顶部
帅哥哟,离线,有人找我吗?
lgz518
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/4/27 18:34:00 [只看该作者]

老师,我没表达清楚,请看如下图,要实现也下图
图片点击可在新窗口打开查看此主题相关图片如下:流水帐1.jpg
图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
lgz518
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/4/27 18:37:00 [只看该作者]

1.首行的公式?
2,本月合计和期次数,如何按每月月未或固定每月25日自动生成,不用人工操作?

其他过程是有用到流水帐逻辑

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106067 积分:539428 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/27 20:25:00 [只看该作者]

做个例子发上来测试

 回到顶部
帅哥哟,离线,有人找我吗?
lgz518
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/4/28 9:47:00 [只看该作者]

老师,实例只用流水帐做,只实现流水帐功能,但还不能实现下面功能,实例有用手工强处理,不是系统,代码实现,真正需求,是要系统,代码来自动实现 ,请老师,指教,谢谢!
问题:
1.如何实现,首行固定,期初库存=期初+入库-出库,并在次行起进行流水帐模式计算?
2,如何实现,本月合计和期初数,如何按每月月未或固定每月25日自动生成,不用人工操作?
2.1本月合计=本月最后记录的库存数
2.2次月的期初数=上月本月合计数
2.2次月的期初库存=期初+入库-出库
以此循环下,直到一年以后,也就12月以后,又从1-12月进行
3,年,月,日的字段,如何从日期获得?



例子
 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:日记帐.foxdb


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106067 积分:539428 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/28 14:11:00 [只看该作者]

建议使用历史表存储上个月的数据,这样主表只处理本月的数据,本月数据的流水账处理都不用改代码,并且数据少了效率也高很多。另外过往月份的数据也不应该再做改动,如果要改应该另外做冲销,不然的话假如要改几年前的一个数据,会导致后面几年的流水账数据外部改一遍,这是不合理的,也会导致这几年的账目全部乱掉。

这样只需要在afteropenproject事件进行一下月结即可。如果是多人并发处理的,建议做一个服务端程序放到服务器,每月1日凌晨人少的时候做一次月结即可,这样不会影响正常操作。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:日记帐.zip


 回到顶部
帅哥哟,离线,有人找我吗?
lgz518
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/4/28 16:36:00 [只看该作者]

老师,测试一下,没达到功能需求,还是存在手动,没有自动

 回到顶部
帅哥哟,离线,有人找我吗?
lgz518
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/4/28 16:55:00 [只看该作者]

您,建议使用历史表存储上个月的数据,如果能实现自动,计算,实现期初相关数据和本月合计,这个方法好,有高效。但问题须处理以下问题:
1.您上实例,与有我的实例少一个字段“期初”
2.以您的思路来,明细表处理本月数据,历史表处理以往的数据,还要实现,解决下面问题:
2.1 首行固定,期初库存=期初+入库-出库或期初库存=期初;
2.2 本月合计和期初数,(按每月月未或固定每月25日自动生成,不用人工操作),不录“本月合计或期初数”,是系统在规定时间,自动生成
2.2.1本月合计=本月最后记录的库存数,实际也就是每月月未,固定日期,或说每月最后笔记录的库存数,也是类于取上一行的值,
      以流水帐有的类似,只是给做截止,显示“本月合计”         “ 库存”
2.2.2次月的期初数=上月本月合计数
2.2.2次月的期初库存=期初+入库-出库

 回到顶部
帅哥哟,离线,有人找我吗?
lgz518
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/4/28 16:59:00 [只看该作者]

难点在:
1.首行固定,固定公式?
2.固定时间或每月最后笔记录后,自动生成,本月合计和下月期初数,它们其实都是上一行的数据(每月月未,固定日期,或说每月最后笔记录的库存数)

 回到顶部
总数 13 1 2 下一页