从个人资料文档中获取值

时间:2014-05-29 20:43:57

标签: lotus-notes lotusscript

从配置文件中获取值时遇到一些问题。为了创作,我遵循了以下指示: 创建个人资料表单 1.使用字段创建表单以保存要存储在配置文件中的值。 2.选择设计 - 表单属性并取消选择"包括在菜单中。和"包含在搜索构建器中#34; 3.保存表格。 4.不要在任何视图中包含表格。

在表单中,我只有一个字段,在编写时计算(数字),计算值为" 0"

但是使用此代码我无法检索字段值:

Dim session as New NotesSession             
Dim db as NotesDatabase             
Dim doc as NotesDocument                
Set db=session.CurrentDatabase              
Set doc=db.GetProfileDocument("nameofprofiledoc")
dim number as integer
number=doc.fieldname(0)

Isprofile返回true,但数字总是""。由于某种原因,它永远不会得到值

3 个答案:

答案 0 :(得分:1)

也许是因为您尚未将文档保存到数据库中。您可以创建一个操作按钮,让您编辑文档然后保存它:

@Command( [EditProfile] ; formname );

答案 1 :(得分:1)

调用GetProfileDocument时不会执行计算字段公式。那是因为GetProfileDocument是一个“后端”方法。具有各种字段定义和公式的表单由“前端”使用。 (有一个例外:后端类中有一个ComputeWithForm方法。)无论如何。 GetProfileDocument可以加载以前保存的配置文件,也可以创建一个基本上为空的新文档。 @Ken的答案告诉您如何手动创建配置文件并保存它,以便您的代码能够找到它。作为替代方案,您可以在代码中进行初始化,如下所示:

if ! doc.hasItem("fieldname") then
  doc.replaceItemValue("fieldname",0)
end if
number=doc.fieldname(0)

这样您就不会依赖手动创建配置文件的人。但是如果您从代码中的多个位置访问配置文件,并且无法预测哪个代码可能首先执行,那么您可能希望创建一个包含函数(或类)的脚本库并将GetProfileDocument包装在你自己的函数(或方法),以确保所有代码路径都能正确地进行初始化。

答案 2 :(得分:0)

正如Richard所提到的那样,当您调用方法GetProfileDocument时,如果在数据库中找不到,则配置文件将创建为空白文档(它只会包含一些包含配置文件名称的初始字段,冲突操作,最后编辑)..

要初始化配置文件,您可以尝试:

1)编写Form的QuerySave事件,将所有项目复制到配置文件(然后取消保存,以避免将数据存储在常规文档中)。

Sub Querysave(Source As Notesuidocument, Continue As Variant)
    Dim db As NotesDatabase
    Dim curdoc As NotesDocument
    Dim profile As NotesDocument

    Set curdoc = Source.Document
    Set db = curodc.ParentDatabase
    Set profile = db.GetProfileDocument(curdoc.Form(0))

    Call curdoc.CopyAllItems(profile, True)

    Call profile.Save(True, False)

    Continue = False    'Don't allow the form to be saved to a regular document.
End Sub

或者:

2)调用GetProfileDocument创建一个新的配置文件或获取旧的配置文件(您可以通过检查IsNewNote属性来区分它。然后为其分配一个表单名称,并使用此表单计算它

在代理人或行动中:

Sub InitializeProfile
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim profile As NotesDocument

    Set db = s.CurrentDatabase
    Set profile = db.GetProfileDocument("MyForm")

    If profile.IsNewNote Then
        Call profile.ReplaceItemValue("Form", "MyForm")
        Call profile.ComputeWithForm(False, False)    'This will create the computed fields with their default values in the profile.
        Call profile.Save(True, False)
    End If
End Sub