user2472368
user2472368

Reputation: 199

Getting values from profile document

I have some problem getting the value from the profile document. For creation, I followed these instructions: Creating a profile form 1.Create a form with fields to hold the values you want to store in profile documents. 2.Choose Design - Form Properties and deselect "Include in Menu. and "Include in Search Builder" 3.Save the form. 4.Do not include the form in any view.

In the form I have only one field that is computed when composed (a number), with a computed value "0"

But with this code I can't retreive the field value:

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 return true, but number is always "". For some reason it never gets the value

Upvotes: 1

Views: 4021

Answers (3)

Sam Sirry
Sam Sirry

Reputation: 762

As Richard mentions, when you call the method GetProfileDocument, the profile is created as a blank document, if not found in the database, (it will only have some initial fields that hold the profile name, conflict action, last editor)..

To initialize the profile, you might try to either:

1) Program the Form's QuerySave event to copy all items to the profile (then cancel the Save, to avoid storing the data in a regular document).

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

Or:

2) Call GetProfileDocument to create a new profile or get an old one (you can tell the difference by checking the IsNewNote property. Then assign it a Form name, and compute it with this form.

In an Agent or an Action:

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

Upvotes: 0

Richard Schwartz
Richard Schwartz

Reputation: 14628

Computed field formulas are not executed when you call GetProfileDocument. That's because GetProfileDocument is a "back-end" method. The form, with its various field definitions and formulas is used by the "front-end". (There's one exception: there's a ComputeWithForm method available in the back-end classes.) Anyhow. GetProfileDocument either loads a previously saved profile doc, or creates a new one that is essentially empty. @Ken's answer tells you how to manually create the profile document and save it so your code will find it. As an alternative, you can do the initialization in your code like this:

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

That way you won't be dependent on someone manually creating the profile document. But if you are accessing the profile document from multiple places in code, and you can't predict which code might execute first, then you're probably going to want to create a script library with functions (or a class) and wrap GetProfileDocument in your own function (or method) to insure that all code paths will do the initialization properly.

Upvotes: 1

Ken Pespisa
Ken Pespisa

Reputation: 22266

Perhaps it is because you haven't saved the document into the database yet. You can create an action button that let's you edit the document and then save it:

@Command( [EditProfile] ; formname );

Upvotes: 1

Related Questions