以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  如何实现多用户管理  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=153694)

--  作者:吃亏是福
--  发布时间:2020/8/19 17:33:00
--  如何实现多用户管理

我们现在有23个用户,每个人一张表。

如何实现:

其中一部分人能看到其他人的22张表,

其中一部分人不可以看到别人的表,

每个人的表只能在规定的日期内填写与修改自己的表,过了一定的实效就不可以修改。


--  作者:有点蓝
--  发布时间:2020/8/20 8:43:00
--  
参考:http://www.foxtable.com/webhelp/topics/2267.htm


--  作者:吃亏是福
--  发布时间:2020/8/21 14:46:00
--  DataRowAdding为什么不执行???
e.DataRow("填报人") = User.name
e.DataRow("日期") = Date.Today()
e.DataRow("序号") = e.DataTable.Compute("Max(序号)") + 1
If e.DataTable.DataRows.Count = 0 Then \'如果是一个空表
    Return \'那么返回
End If
Dim dr As DataRow = e.DataTable.DataRows(e.DataTable.DataRows.Count - 1) \'获得最后一行
For Each dc As DataCol In e.DataTable.DataCols 
    e.DataRow(dc.Name) = dr(dc.Name) \'将最后一行的内容复制到新增行中.
Next


以上是我在数据表“工作日志基础数据”的DataRowAdding的内容,但是做完之后没有任何错误提示,也没有任何变化
[此贴子已经被作者于2020/8/21 14:50:50编辑过]

--  作者:有点蓝
--  发布时间:2020/8/21 14:57:00
--  
注意DataTable的最后一行不一定是Table的最后一行

If e.DataTable.DataRows.Count > 0 Then \'如果不是一个空表
    Dim dr As DataRow = e.DataTable.DataRows(e.DataTable.DataRows.Count - 1) \'获得最后一行
    For Each dc As DataCol In e.DataTable.DataCols
        e.DataRow(dc.Name) = dr(dc.Name) \'将最后一行的内容复制到新增行中.
    Next
End If

e.DataRow("填报人") = User.name
e.DataRow("日期") = Date.Today()
e.DataRow("序号") = e.DataTable.Compute("Max(序号)") + 1

--  作者:有点蓝
--  发布时间:2020/8/21 15:00:00
--  
如果要使用Table的最后一行,改为

Dim dr As DataRow = Tables(e.DataTable.Name).Rows(Tables(e.DataTable.Name).Rows.Count - 1).DataRow \'获得最后一行


--  作者:吃亏是福
--  发布时间:2020/8/24 14:34:00
--  按设计步骤做完不执行

设计步骤:

1、首先在用户管理中,加上每个填报人:

2、然后在订单表的DataRowAdding事件 中加入代码:

e.DataRow("填报人") = User.name

这样新增订单的时候,会自动在业务员列填入当前登录用户名。

3、最后将订单表的PrepareEdit事件设置为:


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

If e.Row("填报人") <> User.Name Then
    e.Cancel =
True
End If
图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20200824143019.png
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2020/8/24 14:39:00
--  
这个窗口是用来执行数据库sql语句的,不是执行代码的。代码直接写在代码编辑器即可。

初学者建议先按顺序学习一下基础:http://www.foxtable.com/webhelp/topics/1592.htm

--  作者:吃亏是福
--  发布时间:2020/8/26 14:18:00
--  结账列如何自动返回True???

表事件

 

工作日志基础数据_PrepareEdit

 

If User.Name = "管理员" Then \'如果是管理员

    If e.Row("结账") = True Then \'此订单已经结账

        Dim tv As Date = e.Row("日期")

        Dim tp As TimeSpan = Date.Today - tv

        If tp.TotalDays >= 10 Then \'如果订单已经超过10天

            e.Row("结账") = True \'则结账列自动返回True???

            e.Cancel = True \'则取消编辑

        End If

    End If

ElseIf e.Row("填报人") <> User.Name Then \'如果是其他用户,且填报人和登录用户名不同

    e.Cancel = True \'则取消编辑

End If
[此贴子已经被作者于2020/8/26 14:27:42编辑过]

--  作者:有点蓝
--  发布时间:2020/8/26 14:29:00
--  
表格不同事件有不同的使用场合,如果要改变其它列值,应该放到datacolchanged事件处理,而不是PrepareEdit事件

另外【自动返回True】指什么?没看懂

--  作者:吃亏是福
--  发布时间:2020/8/26 15:18:00
--  datacolchanged事件处理

定在数据表中,有一逻辑型数据列,列名为“结帐”,我们希望对于每一个结帐的行,是否能够自动通过大于10天则审核(锁定),以免被误编辑。 



表事件

 

工作日志基础数据_PrepareEdit

 

If User.Name = "管理员" Then \'如果是开发者或者是管理员

    If e.Row("结账") = True Then \'此订单已经结账

        Dim tv As Date = e.Row("日期")

        Dim tp As TimeSpan = Date.Today - tv

        If tp.TotalDays >= 10 Then \'如果订单已经超过10天

            e.Row("结账") = True \'则结账列返回True

            e.Cancel = True \'则取消编辑

        End If

    End If

ElseIf e.Row("填报人") <> User.Name Then \'如果是其他用户,且填报人和登录用户名不同

    e.Cancel = True \'则取消编辑

End If

 

工作日志基础数据_DataColChanged

 

If e.DataCol.Name = "结帐" Then \'如果是已结帐列的内容变动

    If e.NewValue = True Then \'而且变动后的值是True(已勾选)

        Dim tv As Date = e.DataRow("日期")

        Dim tp As TimeSpan = Date.Today - tv

        If tp.TotalDays >= 10 Then \'如果订单已经超过10天

            e.DataRow.Locked = True \'那么锁定此行

        End If

    End If

End If

 

工作日志基础数据_DataRowAdding

 

e.DataRow("填报人") = User.name \'新增行.20200826

e.DataRow("日期") = Date.Today()

e.DataRow("编号") = e.DataTable.Compute("Max(编号)") + 1