最近在项目中遇到客户需要在C/S客户端上在一个界面中同时显示视图和表单,即在左面的视图中点击文档,在右面打开,这种布局在Domino 8.0的复合应用中是很容易实现的,不过在7.0中,试了好多方法,都不能实现,于是想到了通过B/S模式来实现C/S下的审批操作,我是通过定义了2张表单,一张for 客户端的
Sub Postopen(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Set doc=source.Document
unid = doc.UniversalID
url = doc.db_server(0)+doc.db_Path(0)+"/viewname/"+unid+"?EditDocument"
ws.URLOpen(url)
Call Source.Close
End Sub
在 Postopen的时候通过ws.URLOpen来打开for Web的那张同名表单,这样客户的需求是显示了,不过就性能和技术方面,下面做了一下分析。
首先遇到的问题是服务器的HTTP服务器需要开启,这个因为我是B/S与C/S模式集合的一个系统,所以HTTP服务是开启的,接着就是权限的问题,在C/S下可以通过设置读者和作者域来控制文档的权限,但在B/S中,如果对文档的权限进行控制,则会弹出用户登录框,这里有2种解决方法,一种是在URLOpen中设置webusername和webpassword来自动登录,这样的局限性是不够灵活,我的方法是把读者和作者都设成"*",通过在视图的 Queryrecalc中运行代理来控制文档的查看权限
Sub Queryrecalc(Source As Notesuiview, Continue As Variant)
Dim session As New NotesSession
Dim agent As NotesAgent
Dim db As NotesDatabase
Set db=session.CurrentDatabase
Set eProfile = db.GetProfileDocument("Enviroment Profile")
If eProfile.IsNewNote Then Print "环境设定简要表没有配置!"
eProfile.txtUserID=session.UserName
Call eProfile.save(True,True)
Set agent = db.GetAgent("根据权限修改视图公式")
If Not(agent Is Nothing) Then
If Not agent.RunOnServer() = 0 Then
Messagebox "代理运行错误!",16,"提示"
Exit Sub
End If
Else
Messagebox "代理没有找到!",16,"提示"
Exit Sub
End If
End Sub
代理为:
Sub Initialize
Dim session As New NotesSession
Dim doc As NotesDocument
Dim agent As NotesAgent
Dim db As NotesDatabase
Dim view As NotesView
Dim formula As String
Set db = session.CurrentDatabase
Set agent = session.CurrentAgent
Set eProfile = db.GetProfileDocument("Enviroment Profile")
If eProfile.IsNewNote Then Print "环境设定简要表没有配置!"
Set view=db.GetView("viewname")
If view Is Nothing Then
Msgbox "数据库缺少视图‘viewname’。",48,"提示"
Exit Sub
End If
If eProfile.txtUserID(0)="CN=SystemAdmin/O=CHENGTOU" Then
formula = {SELECT Form = "formname"}
Else
formula={eng_NextApproverID="}+eProfile.txtUserID(0)+{"}
formula = {SELECT Form = "formname"&(}+formula+{)}
End If
view.SelectionFormula = formula
Call view.Refresh
End Sub
这样就能控制每个文档的读权限,每个用户只能看到自己的文档,同时还需要在数据库Script中在postopen的时候运行这个代理。保证用户登录客户端这张视图只看到自己的文档。
最后就是性能的问题,由于C/S模式是基于局域网的,所以在表单打开速度方面还是比较快的,不过在安全性方面总是会存在一定的隐患,有待解决。
不过这样实现是实现了客户要求的功能,不过花的精力相当大,个人不是很推荐这种做法,毕竟8.0中IBM也考虑到了这个问题,复合应用的出现还是相当好的解决了这个问题。