替换项值方法不适用于多值字段

时间:2014-07-09 09:41:07

标签: lotus-notes lotus-domino lotusscript

我正在尝试在Lotus脚本中使用“ReplaceItemValue”作为多值字段,使用以下代码:

(功能是当字段'Region'具有值“SL-BAO”或“SL-S& T”时,它应该用“SL-S& A”替换它们。其他值应保持为这样)

Sub Initialize
    Dim session As New NotesSession
    Dim uiws As New NotesUIWorkspace

    Dim doc As NotesDocument

    Dim doccoll As NotesDocumentCollection
    Dim i,j As Integer
    Dim itm1,itm2 As NotesItem

    Set uiView = uiws.Currentview
    Set docColl = uiView.Documents
    Set doc = docColl.Getfirstdocument()
    Dim tmpval() As String
    j=1
    While Not doc Is Nothing
        For i=0 To UBound(doc.Region)
            ReDim Preserve tmpval(i+1) 
            If (doc.Region(i) ="SL - BAO") Or (doc.Region(i) ="SL - S&T") Then
                tmpval(i)="SL - S&A"
            Else
                tmpval(i)=doc.Region(i)
            End If
        Next

        Call doc.ReplaceItemValue("Region",FullTrim(tmpval))
        Call doc.Save(True,False)       
            Set doc=doccoll.GetNextDocument(doc)
            Wend
End Sub

不幸的是,代码没有正确替换这些值。 当字段单独有“SL-S& T”时,在运行脚本后,它返回两个值。 所有情况的类似场景..代码不断返回垃圾值。

请帮助...... 提前谢谢..

2 个答案:

答案 0 :(得分:1)

由于answer of Torsten Link中所述的错误,您的代码无法正确替换值。

以下是您的问题的一些解决方案:
1:您可以将doc.Region值添加到tmpval,替换tmpval中的值并将其重新设置为doc.Region

'Your code

Dim tmpval As Variant

'Your code

tmpval = doc.Region

For i = 0 To Ubound(tmpval)
    If (tmpval(i) = "SL - BAO") Or (tmpval(i) = "SL - S&T") Then
        tmpval(i) = "SL - S&A"
    End If
Next

doc.Region = tmpval

'Your code

2:您可以使用Replace功能:

'Your code

Dim findArray(1) As String
Dim replacementArray (1) As String

findArray(0)="SL - BAO"
findArray(1)="SL - S&T"

replacementArray(0)="SL - S&A"
replacementArray(1)="SL - S&A"  

'Your code

doc.Region = Replace(doc.Region, findArray, replacementArray)

'Your code

3:您可以使用@Replace @ -function和Evaluate声明:

'Your code
doc.Region = Evaluate({@Replace(Region; "SL - BAO" : "SL - S&T"; "SL - S&A" : "SL - S&A")}, doc)
'Your code

正如Karl-Henry Martinsson所建议的那样,如果您是一位经验不足的开发人员,那么请尽量避免使用Evaluate()。

答案 1 :(得分:1)

代码中的问题是这一行:

ReDim Preserve tmpval(i+1)

这绝不会清理"垃圾"来自前一份文件的价值观。

示例:

第一份文件有价值观" SL - BAO" :"东西"。

在获取第Set doc=doccoll.GetNextDocument(doc)行中的下一个文档之前,tmpval的值为tmpval(0) = "SL - S&A", tmpval(1) = "Something"

现在你" redim"数组,但使用保留标志。所以在redim之后,两个值仍然是tmpval。如果你的第二个doc只有一个值(SecondDocVal),那么tmpval将如下所示:

tmpval(0) = "SecondDocVal", tmpval(1) = "Something"

此值将写回您的文档。

您可以通过更改脚本的开头来禁止此操作:

而不是使用:

   For i=0 To UBound(doc.Region)
        ReDim Preserve tmpval(i+1) 

写:

   ReDim tmpval(Ubound(doc.Region)
   For i=0 To UBound(doc.Region)

这样,就没有"保留"。

尽管如此:这只是对您的代码不起作用的解释。

更好的解决方案是使用"替换" - 如nempoBu4的答案中第二个例子中所述的功能。