удалить в rich text

Irina

Green Team
31.05.2019
145
2
BIT
0
надо удалить из поля rich text вложение

Код:
    Set doc = docc.GetFirstDocument
    While Not doc Is Nothing

        ForAll item In doc.Items
            If (item.name = "$FILE" ) Then
                If not IsEmpty(item.values) then
               
                удалить вложение из определенного поля
               
                End if
            End If
        End ForAll
               Set doc = docc.GetNextDocument(doc)
    Wend

пробовала ReplaceItemValue("нужное поле",""), но не пойму как именно вложение удалить, а не заменить
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
Нужно из RTI получить EOS объекты и потом на том объекте, .который является аттачем, вызвать метод remove
что-то подбное:
Visual Basic:
Dim attch As NotesEmbeddedObject
Dim eos As Variant

Set rti = doc.Getfirstitem("Body")
        
If rti Is Nothing Then exit sub
        
If rti.Type = RICHTEXT Then
            
    eos = rtiRequest.Embeddedobjects
    
    If IsEmpty(eos) Then exit sub
    
    ForAll attch In eos
        if attch.Type = 1454 then   ' EMBED_ATTACHMENT (1454)
            Call attch.Remove()
        end if
        
    end forall
end if
 
  • Нравится
Реакции: Irina

Irina

Green Team
31.05.2019
145
2
BIT
0
Код:
    Set docc = db.UnprocessedDocuments
    Set doc = docc.GetFirstDocument
    
    While Not doc Is Nothing
        Dim eos As Variant
        Dim rtitem As Variant
        Set rtitem = doc.Getfirstitem("мое поле")
            
        If rtitem Is Nothing Then Exit Sub
        
        If rtitem.Type = RICHTEXT Then
            eos = rtitem.Embeddedobjects
            
            If IsEmpty(eos) Then
            Exit Sub
            End If
            
                ForAll attch In eos
                    If attch.Type = 1454 Then 
                        Call attch.Remove
                        Call doc.Save( True, True )
                    End If
                End ForAll
        End If
        
        Call s.UpdateProcessedDoc(doc)
        Set doc = docc.GetNextDocument(doc)
    Wend

помогите пожалуйста, сделала по примерам выше, но как-то странно, выбираешь 20 шт , отрабатываешь агент - ОК, выделаешь потом еще 10 (количество выделанных может быть разное) и eos = rtitem.Embeddedobjects всегда пусто .
Что сделала не так?
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
363
  1. Что значит "выбираешь 20 шт"?
  2. Дебагером с пошаговой отладкой пробовали пользоваться?
 

Irina

Green Team
31.05.2019
145
2
BIT
0
  1. Что значит "выбираешь 20 шт"?
  2. Дебагером с пошаговой отладкой пробовали пользоваться?
в виде выделяю несколько штук, нажимаю кнопку, которая вызывает агент - отработало без проблем. но потом выделяю любые другие и в дебагере видно , что в rtitem: Type = 1 , Embeddedobjects =пусто , Values тоже пусто. соответственно и eos = rtitem.Embeddedobjects пусто
Хотя в этих документах есть вложение

И не важно какие будут выделены первые, а какие потом документы ( , отрабатывает только первый раз
 
Последнее редактирование:

garrick

Lotus Team
26.10.2009
1 367
152
BIT
363
Вы уверены что вложение находится именно в этом поле?
А ещё вложение может быть вообще не в поле.
отрабатывает только первый раз
Попробуйте в самом конце агента выдать какой-нибудь Print или MessageBox. Оно появляется?
 
Последнее редактирование:

Irina

Green Team
31.05.2019
145
2
BIT
0
в поле. смотрите , есть в виде 40 документов
выделяю первых 10 и удаляю вложение и получаю
Код:
Set doc = docc.GetNextDocument(doc)
Wend
    MessageBox ("Все хорошо" )
, потом 11-20 выделяю , вылетает
Код:
If rtitem Is Nothing Then
MessageBox ("Нет вложений" )
Exit Sub
end if

в другом примере пробую наоборот , первыми удаляю 11-20 - без проблем, а потом запускаю 1-10 и получаю MessageBox ("Нет вложений" )
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
У вас логическая ошибка, если у вас появляется документ, где нет RTI поля, то агент прекращает работу.
Вот в таком виде - будут обработаны все выделенные документы, которые имеют RTI поле, если поля в документе нет - то будет взят следующий документ из коллекции.

Visual Basic:
 Set docc = db.UnprocessedDocuments
    Set doc = docc.GetFirstDocument
   
    While Not doc Is Nothing
        Dim eos As Variant
        Dim rtitem As Variant
        Set rtitem = doc.Getfirstitem("мое поле")

' Строка ниже приводит к выходу из агента
'        If rtitem Is Nothing Then Exit Sub

  If Not rtitem Is Nothing Then    
        If rtitem.Type = RICHTEXT Then
            eos = rtitem.Embeddedobjects
           
            If not IsEmpty(eos) Then
            
                ForAll attch In eos
                    If attch.Type = 1454 Then
                        Call attch.Remove
                        Call doc.Save( True, True )
                    End If
                End ForAll
            End If
                          
        End If
   End if
        Call s.UpdateProcessedDoc(doc)
        Set doc = docc.GetNextDocument(doc)
    Wend
 
  • Нравится
Реакции: garrick

Irina

Green Team
31.05.2019
145
2
BIT
0
У вас логическая ошибка, если у вас появляется документ, где нет RTI поля, то агент прекращает работу.
Вот в таком виде - будут обработаны все выделенные документы, которые имеют RTI поле, если поля в документе нет - то будет взят следующий документ из коллекции.

Visual Basic:
 Set docc = db.UnprocessedDocuments
    Set doc = docc.GetFirstDocument
  
    While Not doc Is Nothing
        Dim eos As Variant
        Dim rtitem As Variant
        Set rtitem = doc.Getfirstitem("мое поле")

' Строка ниже приводит к выходу из агента
'        If rtitem Is Nothing Then Exit Sub

  If Not rtitem Is Nothing Then   
        If rtitem.Type = RICHTEXT Then
            eos = rtitem.Embeddedobjects
          
            If not IsEmpty(eos) Then
           
                ForAll attch In eos
                    If attch.Type = 1454 Then
                        Call attch.Remove
                        Call doc.Save( True, True )
                    End If
                End ForAll
            End If
                         
        End If
   End if
        Call s.UpdateProcessedDoc(doc)
        Set doc = docc.GetNextDocument(doc)
    Wend
все время If not IsEmpty(eos) Then сразу на end if переходит, но не могу понять в поле 100% есть вложение и именно в поле
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
все время If not IsEmpty(eos) Then сразу на end if переходит, но не могу понять в поле 100% есть вложение и именно в поле

А в дебагере объект eos как выглядит?
А это именно вложение или картинка?
Может быть вложение не в поле, а в документе? : когда-то было поле RTI, туда вложили файл, потом поле удалили/переименовали на форме, документ пересохранили.
И вот как бы файл в документе, но не в поле.
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
363
  1. если в RichText поле вставить картинку как картинку, а не как файл, то это уже не вложение
  2. вложения могут быть в полях $FILE, а не в RichText
Надо смотреть структуру такого документа. Лучше всего каким-нибудь ScanEz-ом. Ну как минимум через свойства документа поля посмотреть...
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
а с $File по другому удалять?
Да, лучше вот так, если я нигде не накосячил
Возможно, что код ниже одинаково хорошо работает как для документов с RTI, так и без.
Предлагаю проверить самостоятельно, конечно лучше адаптировать под себя.

Visual Basic:
    Set doc = dc.Getfirstdocument()
    Do While (Not doc Is nothing)
           
        attachNames = Evaluate({@AttachmentNames}, doc)
           
        ForAll attchName In attachNames
               
           
           
            Set attch = doc.Getattachment(attchName)
                               
            Call attch.Remove()

        End ForAll      
           
            If doc.Save(False, False) Then
                count_Processed = count_Processed + 1  
            End If          
       
nextDoc:
        Set doc = dc.Getnextdocument(doc)
    Loop
 
  • Нравится
Реакции: Irina

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
стоит упомянуть - если док открыт в ЮИ - нужен ряд пред/после действий...
в основном, самое простое - если открыт в ЮИ - закрыть перед манипуляциями
 
Мы в соцсетях:

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