Поля Appendix и Appendix_1 - Notesdocument.getfirstitem

29.09.2009
12
0
#1
Чем можно заменить конструкцию:
Set item = NotesDocument.GetFirstItem(FieldName)
что бы корректно работало при наличии полей с именами Appendix и Appendix_1 ?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#3
Код:
Set item = NotesDocument.GetFirstItem("Appendix")
Set item = NotesDocument.GetFirstItem("Appendix_1")
:)
 
29.09.2009
12
0
#6
Это касалось бы итемов с именами, например, Appendix, Appendix, Appendix, Appendix, но не Appendix, Appendix_1.
Покаж код обработки.
Предупреждаю сразу, мопед не мой.

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
Function pp_CopyRTItems( actiondoc As NotesDocument, SourceDoc As NotesDocument, TargetDoc As NotesDocument) As NotesDocument
'Возвращает оригинал для TargetDoc, если оригинал был изменен
On Error Goto ErrHnd

Dim i As Long
Dim v
Dim AllDes
Dim Des As String
Dim TName As String
Dim SName As String
Dim ASourceDoc As NotesDocument
Dim ATargetDoc As NotesDocument
Dim TargetOrigDoc As NotesDocument
Dim InOrig As Integer
Dim HasOrig As Integer
Dim RemovedRT List As Integer
Dim OrigFields As Variant
Dim tmpDoc As NotesDocument

If actiondoc.rtfields(0)="" Then Exit Function

If Ubound( actiondoc.rtfields ) > 1 Then
'старый способ описания RT-полей
For i=0 To Ubound(actiondoc.rtfields)-1 Step 2
Set v=SourceDoc.getfirstitem(actiondoc.rtfields(i))
If Not v Is Nothing Then
Call v.CopyItemToDocument(TargetDoc,actiondoc.rtfields(i+1))
End If
Next
Else
'новый способ описания RT-полей (с поддержкой оригиналов)
'<SRT1>%<TRT1>[%O] : <SRT2>%<TRT1>[%O] : <SRT1>%<TRT2>...
Set tmpDoc = TargetDoc.ParentDatabase.CreateDocument 'врем. док. для RT-полей
HasOrig = False
Set ASourceDoc = pp_GetRTStorageDocument( SourceDoc )
AllDes = Evaluate(actiondoc.rtfields(0), SourceDoc)
For i = 0 To Ubound( AllDes )
Des = Cstr( AllDes( i ) )
SName = Trim$( Strleft(Des,"%" ) )
TName = PPR_Word(Des, "%",2)
If TName="" Or SName="" Then Error AGENTERRORNUM#, "Не правильный формат описания копируемых RT-полей"

InOrig = ( Ucase$(Trim$(PPR_Word(Des, "%",3))) = "O")

If InOrig And TargetOrigDoc Is Nothing Then
Set TargetOrigDoc = pp_GetRTStorageDocument( TargetDoc )
If TargetOrigDoc.UniversalId<>TargetDoc.UniversalId Then HasOrig = True
End If
If InOrig Then
Dim OrigS As String
Dim OrigT As String
Dim OrigType As String
Dim sOrigDes As String

Set ATargetDoc = TargetOrigDoc

Else
Set ATargetDoc = TargetDoc
End If

'// 23.11.05 для переноса полей с подписью в ЭО
Dim Sitem As Variant
Dim Titem As Variant

'на случай если в ASourceDoc нет поля для TName
If Not Iselement( RemovedRT(TName) ) Then
ATargetDoc.RemoveItem TName
RemovedRT(TName) = 1
End If


Set Sitem = ASourceDoc.GetFirstItem(SName)
If Not Sitem Is Nothing Then
Set Titem = tmpDoc.GetFirstItem( TName )
If Titem Is Nothing Then
Set Titem = Sitem.CopyItemToDocument( tmpDoc,TName )
Elseif Sitem.Type=RICHTEXT Or Sitem.Type=MIME_PART Then
Titem.AppendRTItem Sitem
Elseif Sitem.Type = Titem.Type Then
v = Titem.Values
v = Arrayappend( v, Sitem.Values )
Call tmpDoc.ReplaceItemValue( TName, v)
Else
Error 1001, "Type of source and target item doesn't match"
End If
End If
'//
Next

'Через CopyAllItems приходится делать потому что CopyItemToDocument(ATargetDoc) приводил к дублированию $FILE
Call tmpDoc.CopyAllItems( ATargetDoc, True )

If HasOrig Then Set pp_CopyRTItems = TargetOrigDoc
End If

Exit Function

ErrHnd:
Dim ErrStr As String
ErrStr = "pp_CopyRTItems Line " & Erl & "; " & Chr(10) & Error$
Resume Done

Done:
On Error Goto 0
Error agentERRORNUM#, ErrStr
End Function
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#7
Предупреждаю сразу, мопед не мой
Это не значит, что не нужно использовать теги кода на форуме ))

Код:
AllDes = Evaluate(actiondoc.rtfields(0), SourceDoc)
непонятно, зачем так, а не просто
Код:
AllDes = actiondoc.rtfields(0)
или
Код:
AllDes = actiondoc.rtfields
не понял какой вид должно иметь значение поля rtfields
 

TIA

:-)
Lotus team
15.05.2009
790
3
#8
непонятно, зачем так, а не просто
Разница как раз понятна. Список значений получается в результате вычисления некой формулы, записанной в rtfields(0).

promka
Какой из GetFirstItem должен получить "Appendix_1"? Тут нет ни одного "Appendix" чтоб можно было понять по аналогии?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#11
Одним значением или массивом строк?
Если массивом, то код должен заходить в ветку
If Ubound( actiondoc.rtfields ) > 1 Then
Если заходит в нее, то форматирование значения в поле не соответствует выполняемому коду.
Если одной строкой и/или не заходит в ветку выше, то зачем там тогда Evaluate?

TIA, подсказывай, бо я че-то не понимаю кода этого ))
 
29.09.2009
12
0
#12
Одним значением или массивом строк?
Если массивом, то код должен заходить в ветку
If Ubound( actiondoc.rtfields ) > 1 Then
Если заходит в нее, то форматирование значения в поле не соответствует выполняемому коду.
Если одной строкой и/или не заходит в ветку выше, то зачем там тогда Evaluate?

TIA, подсказывай, бо я че-то не понимаю кода этого ))
Одним значением.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#13
А что тогда возвращается в AllDes = Evaluate(actiondoc.rtfields(0), SourceDoc)?
Дебагером пробовал пройтись?
 

TIA

:-)
Lotus team
15.05.2009
790
3
#14
TIA, подсказывай, бо я че-то не понимаю кода этого ))
Мне на вопросы не отвечают. Я не пойму как связать в понятный вопрос GetFistItem, Appendix с Appendix_1 и приведённый код.
На прямой вопрос ты уже ответил:
Это касалось бы итемов с именами, например, Appendix, Appendix, Appendix, Appendix, но не Appendix, Appendix_1.
Т.е. "Appendix" и "Appendix_1" это разные поля, потому что с разными именами.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#16
А одной строкой или массив из многих содержит переменная?
Я понял, евалуейт должен был преобразовать это в массив. Преобразовал ли?
Если возвращает массив вида:

0 - "Body%Body%O"
1 - "Appendix%Appendix%O"
2 - "Appendix_1%Appendix_1%O"
Тогда в каком месте код некорректно отрабатывает?
 

TIA

:-)
Lotus team
15.05.2009
790
3
#17
promka
Так, а надо то что? В вашем первом вопросе говорите что работает "некорректно", а каков критерий корректности?