以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  求助:非开发者或非管理员登录问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=174861)

--  作者:xnsiwei
--  发布时间:2022/2/9 20:19:00
--  求助:非开发者或非管理员登录问题
1、开发者或管理员身份登录没有问题
2、其它身份登录出现如图错误(不同用户错误提示表不同)
3、但对应的项目事件代码里面不涉及相关表,只是可视化授权相关代码
4、此前一直没有问题,可视化授权代码一直都在
求解?


图片点击可在新窗口打开查看此主题相关图片如下:3.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:2.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2022/2/9 20:23:48编辑过]

--  作者:有点蓝
--  发布时间:2022/2/10 8:24:00
--  
贴出出错事件代码。应该是权限表配置有问题,没有加载或者卸载隐藏了需要使用的表
--  作者:xnsiwei
--  发布时间:2022/2/10 9:56:00
--  

1、项目AfterOpenProject事件代码


If User.Type <> UserTypeEnum.Developer \'隐藏表名,仅开发者可见.

    TableCaptionVisible = False
End If
Syscmd.Project.Update(False,False) \'静默升级
forms("主界面").open \'打开窗口
forms("背景窗口").open \'打开背景窗口
MainTable = Tables("A") \'打开背景主表
HttpServer.Start() \'开启http服务器
If user.Type = userTypeEnum.user Then \'非开发者或管理员不可见下列表
    Tables("yh1").Visible = False
End If
For Each t As Table In Tables \'切换用户时可见控制代码
    t.Visible = True
    t.AllowEdit = True
    For Each c As Col In t.Cols
        c.Visible = True
        c.AllowEdit = True
    Next
Next
Tables("yh1").Visible = (User.Type <> UserTypeEnum.User )\'非开发者或管理员不可见此表
If User.Type = UserTypeEnum.User Then
    For Each dr As DataRow In DataTables("yh1").Select("用户名 = \'" & User.Name & "\'" )
        If dr.IsNull("列名") Then
            Tables(dr("授权项目")).Visible = Not dr("不可见")
            Tables(dr("授权项目")).AllowEdit = Not dr("不可编辑")
        Else
            Tables(dr("授权项目")).Cols(dr("列名")).Visible = Not dr("不可见")
            Tables(dr("授权项目")).Cols(dr("列名")).AllowEdit = Not dr("不可编辑")
        End If
    Next
End If


[此贴子已经被作者于2022/2/10 9:56:21编辑过]

--  作者:xnsiwei
--  发布时间:2022/2/10 9:56:00
--  
2、项目LoadUserSetting 事件代码

For Each t As Table In Tables \'切换用户时可见控制代码
    t.Visible = True
    t.AllowEdit = True
    For Each c As Col In t.Cols
        c.Visible = True
        c.AllowEdit = True
    Next
Next
Tables("yh1").Visible = (User.Type <> UserTypeEnum.User )\'非开发者或管理员不可见此表
If User.Type = UserTypeEnum.User Then
    For Each dr As DataRow In DataTables("yh1").Select("用户名 = \'" & User.Name & "\'" )
        If dr.IsNull("列名") Then
            Tables(dr("授权项目")).Visible = Not dr("不可见")
            Tables(dr("授权项目")).AllowEdit = Not dr("不可编辑")
            DataTables(dr("授权项目")).AllowClipBoard = Not dr("不可复制")
        Else
            Tables(dr("授权项目")).Cols(dr("列名")).Visible = Not dr("不可见")
            Tables(dr("授权项目")).Cols(dr("列名")).AllowEdit = Not dr("不可编辑")
            DataTables(dr("授权项目")).AllowClipBoard = Not dr("不可复制")
        End If
    Next
End If


--  作者:有点蓝
--  发布时间:2022/2/10 10:07:00
--  
首先升级代码的用法不正确:http://www.foxtable.com/webhelp/topics/2934.htm

如果我们在AfterOpenProject下面的代码:

Syscmd.Project.Update(False,False)
Forms("窗口1").Open() \'可能会出错
\'后续其它代码

目的是希望打开项目的时候自动升级,然后打开窗口1。
但是上述代码肯定会在升级成功之后提示错误,因为一旦升级成功,Foxtable就会关闭,后面的打开窗口代码就会出错,当然后续其它的代码也一样会出错。
我们可以用下面的代码避免错误:

If Syscmd.Project.Update(False,False) = False Then \'如果没有升级
    
Forms("窗口1").open()
    \'后续其它代码
End
 If

也就是说Update执行后会返回一个逻辑值,如果升级成功,返回True,否则返回False。

总之,如果需要在AfterOpenPoject事件中实现自动升级,那么原有的AfterOpenProject事件代码必须包括在这个判断中,只有没有升级的情况下,才执行原来的代码:

If Syscmd.Project.Update(False,False) = False Then \'如果没有升级
    \'原AfterOpenProject事件代码
End
 If


改正升级代码后如果还有问题,检查一下权限表的设置,确定存在“hp1”的表格,并且已经加载

--  作者:xnsiwei
--  发布时间:2022/2/10 13:01:00
--  
已改,问题依旧

以前一直都没问题的

--  作者:有点蓝
--  发布时间:2022/2/10 13:35:00
--  
检查一下权限表的设置,确定存在“hp1”的表格,并且已经加载
--  作者:xnsiwei
--  发布时间:2022/2/10 15:17:00
--  
有的,不止这些表,但因为表很多,都设置为动态加载
先前这样也不会有问题

--  作者:有点蓝
--  发布时间:2022/2/10 15:48:00
--  
怎么设置的‘动态加载’?表格都没有加载,权限表里用到并设置肯定是出错的。之前没有问题,可能是之前权限表没有针对这些表的设置
--  作者:xnsiwei
--  发布时间:2022/2/11 6:52:00
--  
1、项目BeforeLoadOuterTable事件代码,默认不加载其它表,用界面按钮加载

Select Case e.DataTableName
    Case "A","yh1","mls" ,"用户" \'无条件加载这些表
    Case "sjklb"
        If e.User.Type <> UserTypeEnum.Developer Then \'只有开发者才加载表sjklb
            e.Cancel = True
        End If
    Case Else \'其他所有表默认都不加载
        e.Cancel = True
End Select
2、根据版主意见改良后的AfterOpenProject代码
If User.Type <> UserTypeEnum.Developer \'隐藏表名,仅开发者可见.
    TableCaptionVisible = False
End If
Syscmd.Project.Update(False,False) \'静默升级
If Syscmd.Project.Update(False,False) = False Then \'如果没有升级
    forms("主界面").open \'打开窗口
    forms("背景窗口").open \'打开背景窗口
    MainTable = Tables("A") \'打开背景主表 \'原AfterOpenProject事件代码
    HttpServer.Start() \'开启http服务器
    If user.Type = userTypeEnum.user Then \'非开发者或管理员不可见下列表
        Tables("yh1").Visible = False
    End If
End If