Foxtable(狐表)用户栏目专家坐堂 → 如何避免外部表结构变化时动态加载出错!


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

主题:如何避免外部表结构变化时动态加载出错!

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


加好友 发短信
等级:小狐 帖子:393 积分:3723 威望:0 精华:0 注册:2013/10/9 23:09:00
如何避免外部表结构变化时动态加载出错!  发帖心情 Post By:2015/12/28 3:24:00 [只看该作者]

因表格均支持增减列,在多人网络协同条件下,张三的外部数据表datatable(“表A”)增加了一列,李四的datatable(“表A”)在未能重新刷新表结构的时候,用load加载数据就会报错,用try也拦截不住,老师给想想办法,多谢!


'LockBaseMainForm
Dim 表名 As String = Args(0)
Dim 数据源 As String=args(1)
Dim 显示进度窗口 As Boolean = Args(2)
Dim 是否强制创建 As Boolean= Args(3)

Dim x1 As Integer
Dim y1 As Integer
Dim x2 As Integer
Dim y2 As Integer

If Tables.contains("主窗体_table1") Then
    Dim t As Table=Tables("主窗体_table1")
    x1=t.Toprow
    y1=t.leftcol
    x2=t.bottomrow
    y2=t.rightcol
End If
If 显示进度窗口=True Then
    Functions.Execute("失效菜单")
    Functions.Execute("显示进度条","正在加载【" & 表名 & "】数据,请稍候......",100,0,100,False )
End If

If DataTables.Contains(表名)=False Or 是否强制创建=True Then
    Dim q As new OuterTableBuilder
    q.TableName = 表名
    q.TableCaption = 表名
    q.ConnectionName = 数据源
    q.SelectString = "Sele ct * Fr om [" & 表名 & "] wh ere 1=0"
    If Tables.contains("主窗体_table1") AndAlso Tables("主窗体_table1").DataTable.name=表名 Then
        Forms("主窗体").StopRedraw
        Forms("主窗体").Controls("上下面板").Visible=False
        Tables("主窗体_table1").DataSource=DataTables("主窗口表")
        try
            q.Build
        Catch ex As Exception
        End try
        Forms("主窗体").ResumeRedraw
    Else
        try
            q.Build
        Catch ex As Exception
        End try
    End If
End If
If DataTables.Contains(表名)=True Then
    If DataTables(表名).DataCols.Contains("sys_审计项目编号")=True Then
        DataTables(表名).dataCols( "sys_审计项目编号").DefaultValue="""" & 全局变量审计项目编号 & """"
        DataTables(表名).LoadFilter="sys_审计项目编号 = '" & 全局变量审计项目编号 & "'"
        Try
            DataTables(表名).Load
        Catch ex As Exception
            全局变量更新结构表集合.add(表名)
        End Try
    Else
        DataTables(表名).LoadFilter=""
        Try
            DataTables(表名).Load
        Catch ex As Exception
            全局变量更新结构表集合.add(表名)
        End Try
    End If
End If
If Tables.contains("主窗体_table1") Then
    Dim t As Table=Tables("主窗体_table1")
    If x1<=t.Rows.count-1 AndAlso y1<=t.Cols.count-1 AndAlso x2<=t.Rows.count-1 AndAlso y2<=t.Cols.count-1 Then
        t.Select(x1,y1,x2,y2)
    End If
End If
Functions.Execute("恢复窗体控件","主窗体")
Functions.Execute("恢复菜单")
If Forms("进度条窗口").Opened Then
    Forms("进度条窗口").close
End If


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


加好友 发短信
等级:八尾狐 帖子:1960 积分:15536 威望:0 精华:0 注册:2011/7/16 20:59:00
  发帖心情 Post By:2015/12/28 7:32:00 [只看该作者]

让李四直接升级应用程序啊?

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


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2015/12/28 9:04:00 [只看该作者]


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/28 9:12:00 [只看该作者]

增减列的时候,肯定要通知各个客户端,然后卸载,重新加载表才行啊。

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


加好友 发短信
等级:小狐 帖子:393 积分:3723 威望:0 精华:0 注册:2013/10/9 23:09:00
  发帖心情 Post By:2015/12/28 12:54:00 [只看该作者]

目前设计的是在增减列的时候,通知各个客户端重新加载,一般情况下不会报错。但有时候诸如因网络问题等,未能及时收到通知,怎么样避免这个错误(兜底预防),为何try不行呢?

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/28 14:21:00 [只看该作者]

那你可以在beforeload事件,先判断一下列数是否发生变化。

 

也就执行一下 select * f rom {表A} where 1=2

 

看看得到的dt的datacols.count是否等于当前表的列数


 回到顶部