在VB6中评估Lotus Notes公式以提取数据

时间:2014-04-13 09:32:13

标签: ms-access vb6 lotus-notes

我正在尝试使用VB6自动将数据从Lotus Notes数据库提取到MS Access

在评估Notes公式时,弹出一个错误,指示下面一行中的“运行时错误13类型不匹配”。

dtsenttime = domSession.Evaluate(stsenttime,domDocument)

我们有一些多值字段:一些是文本字段,一些是日期字段。我不知道如何从多值字段中获取数据。

Private Sub Command1_Click()
Dim domSession As New Domino.NotesSession
Dim domDatabase As New Domino.NotesDatabase
Dim domDocument As NotesDocument
Dim domViewEntry As NotesViewEntry
Dim domcollection As NotesDocumentCollection
Dim domform As NotesForm
Dim domView As NotesView
Dim domViewNav As NotesViewNavigator

Dim dtsenttime As Date
Dim stsenttime As String
Set domDatabase = domSession.GetDatabase("xxxxxxxxxx", "yyyyyyyyyy.nsf")
Set domView = domDatabase.GetView("02.Charges")
Set domViewNav = domView.CreateViewNav
Set domViewEntry = domViewNav.GetFirstDocument()

stsenttime = "@If(JobSentTimeFinalDelivery="""";"""";@Max(JobSentTimeFinalDelivery))"                            
dtsenttime = domSession.Evaluate(stsenttime, domDocument)

3 个答案:

答案 0 :(得分:1)

在示例代码中,您必须实例化并初始化NotesDocument的实例。

我注意到文档说的是Evaluate方法的doc参数:

doc

NotesDocument. The formula context. Cannot be null.

答案 1 :(得分:1)

根据Mark Bertenshaw的回应阐述,试试这个:

dtsenttime = domSession.Evaluate(stsenttime, docViewEntry.Document)

重新多值字段,请注意dtsenttime将作为变体返回,因此您需要更改您的暗淡语句:

Dim dtsenttime As Variant

即使评估的公式解析为单个值,dtsenttime也会解析为具有单个元素的数组。如果您评估返回多个值列表的公式,则dtsenttime将解析为包含所有值的数组。 (某些版本的IBM关于此的文档令人困惑,因为他们说"标量结果被返回。"但这与其他版本所说的截断:"标量结果在第一个元素中返回。")

答案 2 :(得分:0)

您也可以跳过全部评估。

首先,正如Mark指出的那样,你没有将domDocument设置为任何东西。

然后我会使用以下代码:

Dim domTemp As Variant
Dim domValues(0) As Date 
Dim i as Integer
Dim maxDate As NotesDateTime
'*** Get array of values from field
domTemp = domDocument.GetItemValues("JobSentTimeFinalDelivery")
'*** Redim array to match number of values in field
Redim domValues(Ubound(domTemp)) As Double
'*** Populate new array
For i = Lbound(domTemp) to Ubound(domTemp)
    domValues(i) = domTemp(i)
Next
'*** Use the VB Max() method to get the largest value of the arrays
maxDate = Cdat(domValues.Max)

您可以跳过使用第二个数组,并直接在domTemp数组上使用Max(),我不知道VB如何处理最初声明为Variant的数组。