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
这样打开项目之后,会自动重置每个产品的第一行,刷新每个产品的库存。