以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 窗口内数据消失问题 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=140964) |
-- 作者:Jaime -- 发布时间:2019/9/18 11:27:00 -- 窗口内数据消失问题 老师好!下面问题找不出原因,请老师给指点下: A窗口 包含: A窗口_Table1 , A窗口_Table2,A窗口_Table3 ,其中Table1绑定计划单, Table2、3是计划明细,两表同表模拟关联。 有个加载树筛选数据 B窗口 包含:同A窗口表结构内容一样。 和A窗中加载树筛选值有区别。 当A窗是为主窗口打开状态下,打开模式的B窗口再关闭后, A窗里: A窗口_Table1 , A窗口_Table2,A窗口_Table3三个窗口内数据就都消失了。 我把B窗口加载树里的代码屏蔽后,再开关表数据不再消失,表B里显示的数据和表A就一样了。 另外,我把A窗口设置为模式,不屏蔽B窗加载树代码,这样数据也不消失,显示正常。 请问老师,A窗口数据消失是B窗口加载树代码问题吗,如何解决? B窗口AfterLoad事件里的加载树代码如下: ‘加载树显示代码 \'首先生成统计表 Dim dt As DataTable Dim b As New SQLGroupTableBuilder("统计表1","计划单") b.C b.Groups.AddDef("进度") b.Groups.AddDef("单位名称") b.Groups.AddDef("报单日期", DateGroupEnum.None) \'根据日期按年分组) b.Totals.AddDef("_Identify",AggregateEnum.Count,"订单数") \'根据主键列来统计记录数,也就是订单数 \'b.Filter = " 进度 = \'待复核\' And 单位名称 = \'" & User.Group & "\'" b.Filter = " 进度 = \'待复核\'" dt = b.Build(True) \'参数设置为True,生成一个临时表,不在主界面显示 \'然后根据统计表生成目录树 Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1") trv.BuildTree(dt, "单位名称|报单日期") trv.StopRedraw For Each nd As WinForm.TreeNode In trv.AllNodes Dim Product1 As String = nd.DataRow("进度") Dim Product2 As String = nd.DataRow("单位名称") Dim Year As Date = nd.DataRow("报单日期") Select Case nd.Level Case 0 nd.Text = nd.text & "(" & dt.compute("sum(订单数)","单位名称=\'"& Product2 & "\'") &")" Case 1 nd.Text = nd.text & "(" & nd.DataRow("订单数") & ")" End Select Next trv.Nodes.Insert("加载所有行","全部待复核(" & dt.Compute("Sum(订单数)") & "条)",0) \'DataTables("计划单").LoadFilter = "进度 = \'待复核\'" DataTables("计划单").LoadFilter = " 进度 = \'待复核\' And 单位名称 = \'" & User.Group & "\'" DataTables("计划单").Load() trv.ResumeRedraw
[此贴子已经被作者于2019/9/18 11:32:39编辑过]
|
-- 作者:有点蓝 -- 发布时间:2019/9/18 11:36:00 -- 应该是这2句代码引起的,B窗口关闭后会重新加载数据? DataTables("计划单").LoadFilter = " 进度 = \'待复核\' And 单位名称 = \'" & User.Group & "\'" DataTables("计划单").Load() |
-- 作者:Jaime -- 发布时间:2019/9/18 11:52:00 -- 本楼也是同项目内窗口显示问题,不知道是否和一楼问题有关,所以分开表达: A窗口 包含: A窗口_Table1 , A窗口_Table2,A窗口_Table3 ,其中Table1绑定计划单, Table2、3是计划明细,两表同表模拟关联。 有个加载树筛选数据(同一楼) C窗口 包含: 表出库单(非副本),表出库明细(非副本) 一个加载树 打开A窗口为主主窗口,再打开C窗口的主窗口,再切换回A窗,A窗口_Table1(绑计划单)数据内容在,A窗口_Table2(绑计划明细)数据内容消失。 我屏蔽C窗口加载树代码后,按上面再切换窗口,A窗口数据显示正常。请老师帮我看下,这个和一楼问题是有关系吗,如何解决? C窗口 -加载树代码: \'首先生成统计表 Dim dt As DataTable Dim b As New SQLGroupTableBuilder("统计表1","计划明细") b.C b.Groups.AddDef("进度") b.Groups.AddDef("单位名称") b.Groups.AddDef("报单日期", DateGroupEnum.None) \'根据日期按年分组) b.Totals.AddDef("_Identify",AggregateEnum.Count,"订单数") \'根据主键列来统计记录数,也就是订单数 b.Filter = " 进度 = \'待分配 \'and 状态 = 1and 欠发数量 <> 0 " dt = b.Build(True) \'参数设置为True,生成一个临时表,不在主界面显示 \'然后根据统计表生成目录树 Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1") trv.BuildTree(dt, "单位名称") trv.StopRedraw For Each nd As WinForm.TreeNode In trv.AllNodes Dim Product1 As String = nd.DataRow("进度") Dim Product2 As String = nd.DataRow("单位名称") Dim Year As Date = nd.DataRow("报单日期") Select Case nd.Level Case 0 nd.Text = nd.text & "(" & dt.compute("sum(订单数)","单位名称=\'"& Product2 & "\'") &")" End Select Next trv.Nodes.Insert("加载所有行","全部可发放(" & dt.Compute("Sum(订单数)") & "条)",0) DataTables("计划明细").LoadFilter = " 进度 = \'待分配\'and 状态 = 1 and 欠发数量 <> 0 " DataTables("计划明细").Load() trv.ResumeRedraw |
-- 作者:有点蓝 -- 发布时间:2019/9/18 12:09:00 -- 还是这2局代码的原因 DataTables("计划明细").LoadFilter = " 进度 = \'待分配\'and 状态 = 1 and 欠发数量 <> 0 " DataTables("计划明细").Load() 数据重新加载会影响主表和所有的副本
|
-- 作者:Jaime -- 发布时间:2019/9/19 8:16:00 -- 谢谢蓝老师指点,根据此情况我分析,系统启用时间越久,订单和明细肯定会更多,而且现在设置的加载条件还是工作流需要避不开的,所以只能保留。但自己知识有限,在帮助也没找到有效办法,请老师给指导下,有什么办法解决上面的问题,谢谢老师! |
-- 作者:有点蓝 -- 发布时间:2019/9/19 8:19:00 -- DataTables("计划明细").LoadFilter = " 进度 = \'待分配\'and 状态 = 1 and 欠发数量 <> 0 and 之前计划单currentchanged的筛选条件" |
-- 作者:Jaime -- 发布时间:2019/9/19 11:58:00 -- 老师,我没太明白,我理解的是把打开C窗口时引起数据丢失的 A窗口里计划单的CurrentChanged里筛选条件加在后面,不知道理解的沾边不,下面是A窗代码,请问老师怎么加 Dim t3 As Table = Tables("计划申请_Table2")
Dim filter As String With Tables("计划申请_Table1") If .Current Is Nothing Then filter = "False" Else filter = "计划单号 = \'" & .Current("计划单号") & "\'" End If End With If e.Table.Current IsNot Nothing Then \'如果Current为Nothing If filter > "" Then t3.Filter = filter \'t3.Sort = "报单日期 DESC" \'筛选与排序--P1432 End If End If |
-- 作者:有点蓝 -- 发布时间:2019/9/19 13:54:00 -- 既然"计划明细"表多个窗口都用到,如果互相冲突建议在各个窗口表里使用sqltable、或者SQLcommand加载各自的"计划明细"表数据。 如果大家都可以使用,那么就必须加载所有窗口都能用的数据。各个窗口就使用数据即可,不需要重新加载这个表的数据。
|
-- 作者:Jaime -- 发布时间:2019/9/20 9:31:00 -- 蓝老师好,这个计划单和计划明细,几个窗口都用是因工作流的不同进度需要而设置的,筛选的内容不同。所以我只能想到了按不同条件筛选的方案。 根据您的指导,我把窗口表改为了SQLtable模式, 然后打开发现计划单内容没有经过筛选全部显示,就是一楼的加载筛选树代码没起作用,我不太明白为什么? 我将筛选条件加在了窗口Select语句里如下: 但结果是无任何内容,请问老师窗口改SQLtable后,如何让加载条件也正常 Select * Fro m {计划单} WHERE 进度 = \'待报单\' And 单位名称 = \'" & User.Group & "\' |
-- 作者:有点蓝 -- 发布时间:2019/9/20 9:39:00 -- 首先搞清楚筛选和加载的区别。 筛选是基于已经加载的数据进行过滤显示,已经加载的数据不会有变化,只是table里面看不到这些数据而已。table.filter就属于筛选用法 加载是重新到数据库获取数据,会影响这个表的主表和所有的副本,同时会导致之前的筛选全部失效。SQLcommand和datatable.load就属于加载用法 然后在根据自己的业务逻辑搞清楚到底应该怎么用
|