Foxtable(狐表)用户栏目专家坐堂 → 窗口内数据消失问题


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

主题:窗口内数据消失问题

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


加好友 发短信
等级:幼狐 帖子:197 积分:1351 威望:0 精华:0 注册:2019/3/31 11:25:00
窗口内数据消失问题  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:超级版主 帖子:107739 积分:548028 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/18 11:36:00 [只看该作者]

应该是这2句代码引起的,B窗口关闭后会重新加载数据?

DataTables("计划单").LoadFilter = " 进度 = '待复核' And 单位名称 = '" & User.Group & "'"
DataTables("计划单").Load()

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


加好友 发短信
等级:幼狐 帖子:197 积分:1351 威望:0 精华:0 注册:2019/3/31 11:25:00
  发帖心情 Post By: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

       

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


加好友 发短信
等级:超级版主 帖子:107739 积分:548028 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/18 12:09:00 [只看该作者]

还是这2局代码的原因

DataTables("计划明细").LoadFilter = " 进度 = '待分配'and 状态 = 1 and 欠发数量 <> 0 "
DataTables("计划明细").Load()

数据重新加载会影响主表和所有的副本

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


加好友 发短信
等级:幼狐 帖子:197 积分:1351 威望:0 精华:0 注册:2019/3/31 11:25:00
  发帖心情 Post By:2019/9/19 8:16:00 [只看该作者]

谢谢蓝老师指点,根据此情况我分析,系统启用时间越久,订单和明细肯定会更多,而且现在设置的加载条件还是工作流需要避不开的,所以只能保留。但自己知识有限,在帮助也没找到有效办法,请老师给指导下,有什么办法解决上面的问题,谢谢老师!

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


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

DataTables("计划明细").LoadFilter = " 进度 = '待分配'and 状态 = 1 and 欠发数量 <> 0  and 之前计划单currentchanged的筛选条件"

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


加好友 发短信
等级:幼狐 帖子:197 积分:1351 威望:0 精华:0 注册:2019/3/31 11:25:00
  发帖心情 Post By: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

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


加好友 发短信
等级:超级版主 帖子:107739 积分:548028 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/19 13:54:00 [只看该作者]

既然"计划明细"表多个窗口都用到,如果互相冲突建议在各个窗口表里使用sqltable、或者SQLcommand加载各自的"计划明细"表数据。

如果大家都可以使用,那么就必须加载所有窗口都能用的数据。各个窗口就使用数据即可,不需要重新加载这个表的数据。

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


加好友 发短信
等级:幼狐 帖子:197 积分:1351 威望:0 精华:0 注册:2019/3/31 11:25:00
  发帖心情 Post By:2019/9/20 9:31:00 [只看该作者]

蓝老师好,这个计划单和计划明细,几个窗口都用是因工作流的不同进度需要而设置的,筛选的内容不同。所以我只能想到了按不同条件筛选的方案。

根据您的指导,我把窗口表改为了SQLtable模式,  然后打开发现计划单内容没有经过筛选全部显示,就是一楼的加载筛选树代码没起作用,我不太明白为什么?
我将筛选条件加在了窗口Select语句里如下: 但结果是无任何内容,请问老师窗口改SQLtable后,如何让加载条件也正常

Select * Fro m {计划单} WHERE 进度 = '待报单' And 单位名称 = '" & User.Group & "'


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


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

首先搞清楚筛选和加载的区别。

筛选是基于已经加载的数据进行过滤显示,已经加载的数据不会有变化,只是table里面看不到这些数据而已。table.filter就属于筛选用法

加载是重新到数据库获取数据,会影响这个表的主表和所有的副本,同时会导致之前的筛选全部失效。SQLcommand和datatable.load就属于加载用法

然后在根据自己的业务逻辑搞清楚到底应该怎么用

 回到顶部