• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Поля Appendix и Appendix_1 - Notesdocument.getfirstitem

  • Автор темы promka
  • Дата начала
P

promka

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

Akupaka

Код:
Set item = NotesDocument.GetFirstItem("Appendix")
Set item = NotesDocument.GetFirstItem("Appendix_1")
:)
 
P

promka

Это касалось бы итемов с именами, например, 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
 
A

Akupaka

Предупреждаю сразу, мопед не мой
Это не значит, что не нужно использовать теги кода на форуме ))

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

TIA

непонятно, зачем так, а не просто
Разница как раз понятна. Список значений получается в результате вычисления некой формулы, записанной в rtfields(0).

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

Akupaka

Разница как раз понятна. Список значений получается в результате вычисления некой формулы, записанной в rtfields(0)
это-то я и сам предположил ) все-равно, не понятно, что в поле сидит.
 
A

Akupaka

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

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

promka

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

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

Одним значением.
 
A

Akupaka

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

TIA

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

promka

А что тогда возвращается в AllDes = Evaluate(actiondoc.rtfields(0), SourceDoc)?
Дебагером пробовал пройтись?
AllDes = "Body%Body%O":"Appendix%Appendix%O":"Appendix_1%Appendix_1%O":"$LockerIT_XMLSign%$LockerIT_XMLSign%O":"CMLocker_SignInfo%CMLocker_SignInfo%O":"CMLocker_CertifySignInfo%CMLocker_CertifySignInfo%O"
 
A

Akupaka

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

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

TIA

promka
Так, а надо то что? В вашем первом вопросе говорите что работает "некорректно", а каков критерий корректности?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!