Foxtable(狐表)用户栏目专家坐堂 → 如何批量处理流水帐


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

主题:如何批量处理流水帐

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


加好友 发短信
等级:五尾狐 帖子:1152 积分:7712 威望:0 精华:0 注册:2019/6/13 9:57:00
如何批量处理流水帐  发帖心情 Post By:2019/8/5 16:14:00 [只看该作者]


1.帮助-实例-是用手动录入,我的实例是想实现以下功能:

(1)批量操作:期初,入库,出库数量,我都从期初表,进货单,出货单,批量导入,这个功能没问题,现在存在以下;


1.1导入数据,同一个产品同一日期不在同一行,不是我想要,我想是同一个产品同一日期在同一行,同一个产品同不一日期在不同一行,这个如何实现?
1.2如何实现每年1月1日进行过帐,每月月初进行期初计算,每月月未进行期未合计;

1,3如何在另一个查看流水帐每一种产品最后库存数,并可以期数据导出。


以上功能如,会计中,做好凭证记录,就可以实现明细帐和总帐的功能。

请老师,指导,谢谢,



此功能,也是常规功能,会有多人需要









示例二

对于下图所示这种区分产品的流水账:

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

需要将DataColChanged事件代码改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Select Case e.DataCol.Name
    Case
"产品","入库","出库"
        Dim
dr As DataRow
        Dim
mr As DataRow = e.DataRow
        Dim
drs As List(of DataRow)
        dr
= e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [产品] = '" & mr("产品") & "'", "[_SortKey] Desc"
)
        If
dr Is Nothing Then
            mr
("库存") = mr("入库") - mr("出库"
)
            dr
=
mr
        End If

        drs
= e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And [产品] = '" & dr("产品") & "'"
, "[_SortKey]")
        For
i As Integer = 1 To drs.Count - 1
           
drs(i)("库存") = drs(i-1)("库存") + drs(i)("入库") - drs(i)("出库")
        Next
        If
e.DataCol.Name = "产品" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then
            dr
= e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [产品] = '" & e.OldValue & "'", "[_SortKey] Desc"
)
            If
dr Is Nothing Then
                dr
= e.DataTable.Find("[产品] = '" & e.OldValue & "'", "[_SortKey]"
)
                If
dr IsNot Nothing Then
                    dr
("库存") = dr("入库") - dr("出库"
)
                End If
            End If
            If
dr IsNot Nothing Then
                drs
= e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And [产品] = '" & dr("产品") & "'"
, "[_SortKey]")
                For
i As Integer = 1 To drs.Count - 1
               
    drs(i)("库存") = drs(i-1)("库存") + drs(i)("入库") - drs(i)("出库")
                Next
            End If
        End If
End Select

上述代码的第一部分(3到14行),用于在修改某行的产品、入库、出库后,重算从此行开始的所有同产品的行的余额,代码原理已经在上面不区分产品的流水账中介绍,不同的只是在条件表达式中加入了产品比较,请大家自己分析。

第二部分代码(15到29行)的原理:

  • 假定我们修改的是产品,例如将产品由PD01改为PD02,3到14行会从被修改行开始重算所有产品为PD02的行的余额;显然被修改行之后的所有产品为PD01的行的余额,也是应该重算的,于是就有了15到29行的代码, 首先第16行代码找出被修改行的上一个产品为PD01的行,保存在变量dr中,如果找到的话(变量dr不等于Nothing),则执行第24代码,找出从此行开始的所有产品为PD01的行,第25到27行重算此行之后的所有产品为PD01的行的余额。
     
  • 假定第16行代码并未找到被修改行上一个产品为PD01的行,说明被修改的行就是第一个产品为PD01的行,现在该行的产品已经由PD01改为PD02,原来第二个产品为PD01的行现在变成了第一个产品为PD01的行,于是第18行代码找出现在第一个产品为PD01的行,并保存在变量dr中,如果找到的话,由于这是第一个产品为PD01的行,其库存直接等于入库减去出库,于是第20行代码计算出此行的余额;然后执行第24行代码,找出从此行开始所有产品为PD01的行,保存在集合drs中,第25到27行重算此行之后的所有产品为PD01的行的余额。

表事件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

如果多用户同时录入数据,可以在项目事件AfterOpenproject中加入代码:

Dim drs As New List(of DataRow)
With
DataTables("例子二")
    For Each nm As String In .GetValues("
产品") '找出每个产品的第一行数据, 添加到集合drs
        drs.Add(.Find("
产品 = '" & nm & "'", "[_SortKey]"))
    Next
    For Each r As DataRow In drs
        .DataCols("
入库").RaiseDataColChanged(r) '重置每个产品的第一行
   
Next
End
With

这样打开项目之后,会自动重置每个产品的第一行,刷新每个产品的库存。

 

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


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

 
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:关联计算 - 1.table


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


加好友 发短信
等级:超级版主 帖子:107727 积分:547968 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/5 17:06:00 [只看该作者]

1、导入的时候查询是否有此物料的数据在决定是否新增,如:

Dim Cols1() As String = {"进货日期","物料号","品名","型号","数量","单价"}  '来源表-入库单要引入的字段
Dim Cols2() As String = {"日期","物料号","品名","型号","入库数量","入库价"}    '接收表-库存表要接收的字段
For Each dr1 As DataRow In DataTables("进货单").Select("[审核] = 1")  '
    Dim dr2 As DataRow = DataTables("流水帐").Find("物料号='" & dr1("物料号") & "' and 日期=#" & dr1("进货日期") & "#")
    If dr2 Is Nothing Then
        dr2 = DataTables("流水帐").AddNew()
    End If
    
    For i As Integer = 0 To Cols1.Length -1
        dr2(Cols2(i)) = dr1(Cols1(i))
    Next
Next

2、计算期末库存就是计算日期最大的数据,如:

For Each n As String In DataTables("流水帐").GetValues("物料号")
    Dim dr As DataRow = DataTables("流水帐").Find("物料号='" & n & "'","日期 desc")
    Output.Show("物料号" & n & "期末库存为:" & dr("库存数"))
Next

每月最后一天凌晨的时候计算期末库存,即是下月的期初库存。

 回到顶部