以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  如何避免外部表结构变化时动态加载出错!  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=79262)

--  作者:hdffzxf
--  发布时间: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


--  作者:新福星
--  发布时间:2015/12/28 7:32:00
--  
让李四直接升级应用程序啊?
--  作者:Hyphen
--  发布时间:2015/12/28 9:04:00
--  
先卸载表,再加载 http://www.foxtable.com/help/topics/2754.htm



--  作者:大红袍
--  发布时间:2015/12/28 9:12:00
--  
增减列的时候,肯定要通知各个客户端,然后卸载,重新加载表才行啊。
--  作者:hdffzxf
--  发布时间:2015/12/28 12:54:00
--  
目前设计的是在增减列的时候,通知各个客户端重新加载,一般情况下不会报错。但有时候诸如因网络问题等,未能及时收到通知,怎么样避免这个错误(兜底预防),为何try不行呢?
--  作者:大红袍
--  发布时间:2015/12/28 14:21:00
--  

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

 

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

 

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