Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
做了个功能窗口,期中的的个按钮代码如下:
Dim cj =e.Form.Controls("ComboBox1").Value
Dim data As Date=e.Form.Controls("DateTimePicker1").value
Dim cj2 = data.Year & Format(data.Month,"00")
Dim drs As List(of DataRow)
If cj <> cj2 Then
Dim List As List(of String)
Dim dr1 As DataRow
List = DataTables("订单生产安排供需流水账").GetUniqueValues("[会计期间]= '" & cj &"'" ,"料品编码")
Dim st As Date = Date.Now
DataTables("订单生产安排供需流水账").LoadFilter = "[会计期间] in ('" & cj & "','" & cj2 & "')"
DataTables("订单生产安排供需流水账").Load()
Dim dr2 As DataRow=DataTables("订单生产安排供需流水账").Find("[会计期间] = '" & cj2 & "'","[会计期间] Desc")
If dr2 IsNot Nothing Then
drs = DataTables("订单生产安排供需流水账").Select("[会计期间] = '" & cj2 & "'and [摘要] = '期初结存'")
For i As Integer = 0 To drs.Count - 1
drs(i).Locked = False
Next
DataTables("订单生产安排供需流水账").DeleteFor("[会计期间] = '" & cj2 & "'and [摘要] = '期初结存'")
With CurrentTable
Dim r As Integer
r = .Find( "' & cj2 & '", 0, "会计期间", False, False, True)
If r > - 1 Then '如果找到符合条件的行
.Position = r '则选择该行
End If
End With
DataTables("订单生产安排供需流水账").StopRedraw()
For ii As Integer = List.Count - 1 To 0 Step -1
Dim dr As Row = Tables("订单生产安排供需流水账").InsertNew()
dr("摘要")="期初结存"
dr("日期") = e.Form.Controls("DateTimePicker1").value
dr("料品编码") = List (ii)
dr1 = DataTables("订单生产安排供需流水账").Find("[会计期间] = '" & cj & "' And [料品编码] = '" & dr("料品编码") & "'and [_sortkey] < " & dr("_sortkey") ,"[日期] Desc, [_SortKey] Desc")
dr.DataRow("结存量")=dr1("结存量")
dr.Locked = True
Next
DataTables("订单生产安排供需流水账").ResumeRedraw()
MessageBox.Show("结转完成,总耗时: " & (Date.Now - st).TotalSeconds & "秒","提示") '计算并显示执行代码所花费的秒数
Else
DataTables("订单生产安排供需流水账").StopRedraw()
For u As Integer = 0 To List.Count - 1
Dim dr As DataRow = DataTables("订单生产安排供需流水账").AddNew()
dr("摘要")="期初结存"
dr("日期") = e.Form.Controls("DateTimePicker1").value
dr("料品编码") = List (u)
dr1 = DataTables("订单生产安排供需流水账").Find("[会计期间] = '" & cj & "' And [料品编码] = '" & dr("料品编码") & "'and [_sortkey] < " & dr("_sortkey") ,"[日期] Desc,[_SortKey] Desc")
dr("结存量")=dr1("结存量")
dr.Locked = True
Next
DataTables("订单生产安排供需流水账").ResumeRedraw()
MessageBox.Show("结转完成,总耗时: " & (Date.Now - st).TotalSeconds & "秒","提示") '计算并显示执行代码所花费的秒数
End If
Else
MessageBox.Show("你选择的下个期间的第一天有误,请重新选择正确的日期!","提示", MessageBoxButtons.OK ,MessageBoxIcon.Information)
End If
执行一次上面的代码,没出错,如果第二次执行就出错提示如下图所示的信息!
我怀疑是红色部份的代码有问题,但测试了好几次都不成功,想不明白到底是什么原因。
下面的代码并没有判断dr1是否找到:
dr1 = DataTables("订单生产安排供需流水账").Find("[会计期间] = '" & cj & "' And [料品编码] = '" & dr("料品编码") & "'and [_sortkey] < " & dr("_sortkey") ,"[日期] Desc, [_SortKey] Desc")
dr.DataRow("结存量")=dr1("结存量")
当然错误不一定在这里,类似的检查都应该判断的,建议你看看:
http://help.foxtable.com/topics/1485.htm
http://help.foxtable.com/topics/2044.htm
下面的代码并没有判断dr1是否找到:
dr1 = DataTables("订单生产安排供需流水账").Find("[会计期间] = '" & cj & "' And [料品编码] = '" & dr("料品编码") & "'and [_sortkey] < " & dr("_sortkey") ,"[日期] Desc, [_SortKey] Desc")
dr.DataRow("结存量")=dr1("结存量")
当然错误不一定在这里,类似的检查都应该判断的,建议你看看:
http://help.foxtable.com/topics/1485.htm
http://help.foxtable.com/topics/2044.htm
我想不是这个问题,当然应该加上判断是最好的,
我在测代码的过程中发现:如果在结转完成后不加上锁定行和解锁的那部份功能就没问题;
我是后来加上等结转完后去锁定那些期初结存的行的代码时发现问题的;
发现问题后,我想是不是结转完成后再作一次同样的结转的过程在有先删除那些之前结转的数据行,但因为那些数行之前已经被锁定而导致删除出错了呢?
然后我在前面加上解锁的动作,但还是不行,所以想不明白啊!真痛苦。
呵呵,那就分别删除你怀疑的那两段代码,看看问题到底在那一段。
这个没有啥技巧的,只能先逐段排除,再逐行检查,找出问题。
还有:
Dim cj =e.Form.Controls("ComboBox1").Value
Dim cj2 = data.Year & Format(data.Month,"00")
是不是应该改为:
Dim cj As String =e.Form.Controls("ComboBox1").Value
Dim cj2 As String = data.Year & Format(data.Month,"00")
测试是在:如果结转成功一次,再去做相同的结转是就出现,是在作第二次结转时要去删除刚才结转后的那些期初数据时出问题的,但不知如何解决!
贺先生,帮我检查一下吧
我在
项目中的全部表的BeforeLoad中按照帮助的例子也做了一段代码,也出现了点问题,现在上传这个项目给你。麻烦帮我一起看看。
Select Case e.DataTable.Name
Case "订单生产安排供需流水账","料品基础数据表"
For Each dr1 As DataRow In DataTables("授权表").Select("用户名 = '" & Vars("_UserName") & "'" )
If dr1("表名")=e.DataTable.Name AndAlso dr1("只加载本部门数据")=True Then
Dim fl As String = "[部门] = '" & Vars("部门名称") & "'"
If e.DataTable.LoadFilter = "" Then
e.DataTable.LoadFilter = fl
ElseIf e.DataTable.LoadFilter.IndexOf(fl) < 0 Then '如果没有包括这个条件
e.DataTable.LoadFilter = e.DataTable.Loadfilter & fl
End If
End If
If dr1("表名")=e.DataTable.Name AndAlso dr1("只加载本部门数据")=False Then
Dim fl As String = "[部门] in (" & dr1("部门范围") & ")"
If e.DataTable.LoadFilter = "" Then
e.DataTable.LoadFilter = fl
ElseIf e.DataTable.LoadFilter.IndexOf(fl) < 0 Then '如果没有包括这个条件
e.DataTable.LoadFilter = e.DataTable.Loadfilter & fl
End If
End If
Next
End Select
下载信息 [文件大小: 下载次数: ] | |
![]() |
其实我在2楼就告诉你答案了,我将你的代码改为:
dr1 = DataTables("订单生产安排供需流水账").Find("[会计期间] = '" & cj & "' And [料品编码] = '" & dr("料品编码") & "'and [_sortkey] < " & dr("_sortkey") ,"[日期] Desc, [_SortKey] Desc")
If dr1 isnot Nothing Then
dr.DataRow("结存量")=dr1("结存量")
End If
就不再提示你所说的错误了。
为啥就不一开始就按照我所说的测试一下呢?
其实我在2楼就告诉你答案了,我将你的代码改为:
dr1 = DataTables("订单生产安排供需流水账").Find("[会计期间] = '" & cj & "' And [料品编码] = '" & dr("料品编码") & "'and [_sortkey] < " & dr("_sortkey") ,"[日期] Desc, [_SortKey] Desc")
If dr1 isnot Nothing Then
dr.DataRow("结存量")=dr1("结存量")
End If
就不再提示你所说的错误了。
为啥就不一开始就按照我所说的测试一下呢?
真不好意思,因为我之前没加上这个代码的时候是正常的,且当时我去做BeforeLoad的相关代码,且做过程中也出现了问题,所以就没按你所说的去做。
现在我测试真的是这个问题,但我想不明白,为什么当初我没加上锁定行的相关代码时是正常的呢?
另外BeforeLoad中的代码又是什么原因呢?
当初没有,是因为当初有符合条件的数据, dr1不是Nothing,数据变化后,dr1就可能找不到符合条件的行。
BeforeLoad我不明白你有啥问题,你可以在后面加一行检查一下代码的执行结果:
Select Case e.DataTable.Name
Case "订单生产安排供需流水账","料品基础数据表"
For Each dr1 As DataRow In DataTables("授权表").Select("用户名 = '" & Vars("_UserName") & "'" )
If dr1("表名")=e.DataTable.Name AndAlso dr1("只加载本部门数据")=True Then
Dim fl As String = "[部门] = '" & Vars("部门名称") & "'"
If e.DataTable.LoadFilter = "" Then
e.DataTable.LoadFilter = fl
ElseIf e.DataTable.LoadFilter.IndexOf(fl) < 0 Then '如果没有包括这个条件
e.DataTable.LoadFilter = e.DataTable.Loadfilter & fl
End If
End If
If dr1("表名")=e.DataTable.Name AndAlso dr1("只加载本部门数据")=False Then
Dim fl As String = "[部门] in (" & dr1("部门范围") & ")"
If e.DataTable.LoadFilter = "" Then
e.DataTable.LoadFilter = fl
ElseIf e.DataTable.LoadFilter.IndexOf(fl) < 0 Then '如果没有包括这个条件
e.DataTable.LoadFilter = e.DataTable.Loadfilter & fl
End If
End If
Next
MessageBox.Show(e.DataTable.Name & "|" & e.DataTable.LoadFilter )
End Select