我正在尝试在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”时,在运行脚本后,它返回两个值。 所有情况的类似场景..代码不断返回垃圾值。
请帮助...... 提前谢谢..
答案 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的答案中第二个例子中所述的功能。