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

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

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

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

отбор док. по номеру

Irina

Green Team
31.05.2019
145
2
BIT
0
есть документы , у которых номера 111111, 11111as, 11111ab, 11111abc
вот надо при отборе в агенте проверять есть ли документы у которых номер 11111 и только тогда продолжать
Код:
Set Doc= myview.Getfirstdocument
   While Not (Doc Is Nothing)
....
определяется summa из документа
отправить сообщение
        Set Doc= myview.Getnextdocument(Doc)
    Wend

если так, то первое отправится сообщение и дальше я проверю и например, если 11111as не буду отправлять. но проблема в том, что мне надо в первом сообщение суммировать summa (из 11111)+ summa (из 11111as ) и только потом отправлять
подскажите, пожалуйста, как правильно сделать отбор документов по номеру ?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
есть документы , у которых номера 111111, 11111as, 11111ab, 11111abc
вот надо при отборе в агенте проверять есть ли документы у которых номер 11111 и только тогда продолжать
Код:
Set Doc= myview.Getfirstdocument
   While Not (Doc Is Nothing)
....
определяется summa из документа
отправить сообщение
        Set Doc= myview.Getnextdocument(Doc)
    Wend

если так, то первое отправится сообщение и дальше я проверю и например, если 11111as не буду отправлять. но проблема в том, что мне надо в первом сообщение суммировать summa (из 11111)+ summa (из 11111as ) и только потом отправлять
подскажите, пожалуйста, как правильно сделать отбор документов по номеру ?
в корне странный подход...
нет критерия отбора документов (вы его не указали)
если критерий можно свести к формуле отбора (в категорию например) - не надо будет перебирать всё до остановки
еще момент - получать док ради полей может оказаться накладным и будет достаточно NotesViewEntry (читать хэлп дизигнера)
и да - в категории можно получать суммы (вот ток не помню - вроде можно получить значение в ЛС)
 
Последнее редактирование:

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
80
А мне что-то кажется, что это задача ближе к NotesDatabase.Search(...).
 

Irina

Green Team
31.05.2019
145
2
BIT
0
можно:
1 получить первый док в нужной категории
2 GotoPrevSibling
3 ColumnValues(№ totalCol)
да, как получить и использовать поле из одного документа и потом смотреть следующий документ я понимаю. как сравнивать документы тоже. а вот как проверить, что есть например два или три документа с номером+..., и если такие документы есть, то ссумировать в них одно поле, я не могу пока найти вариант

А мне что-то кажется, что это задача ближе к NotesDatabase.Search(...).
спасибо, посмотрю

в корне странный подход...
нет критерия отбора документов (вы его не указали)
если критерий можно свести к формуле отбора (в категорию например) - не надо будет перебирать всё до остановки
еще момент - получать док ради полей может оказаться накладным и будет достаточно NotesViewEntry (читать хэлп дизигнера)
и да - в категории можно получать суммы (вот ток не помню - вроде можно получить значение в ЛС)
вот я с отбором наверное в голове не могу понять, что и с чем мне надо сравнить. есть документы и у них есть номер и вот мне надо в агенте использовать только один из них, если их 3 (а суммы по всем)
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
37
да, как получить и использовать поле из одного документа и потом смотреть следующий документ я понимаю. как сравнивать документы тоже. а вот как проверить, что есть например два или три документа с номером+..., и если такие документы есть, то ссумировать в них одно поле, я не могу пока найти вариант


спасибо, посмотрю


вот я с отбором наверное в голове не могу понять, что и с чем мне надо сравнить. есть документы и у них есть номер и вот мне надо в агенте использовать только один из них, если их 3 (а суммы по всем)
по предложению @lmike
используем служебный вид, в котором группируем доки с одинаковым номером (без постфикса) в категории,
во второй колонке суммируем и читаем готовую сумму по категории
искомый док - найденный ByKey, key - номер без постфикса
 

Вложения

  • example.zip
    26,7 КБ · Просмотры: 320

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
4
есть документы , у которых номера 111111, 11111as, 11111ab, 11111abc
вот надо при отборе в агенте проверять есть ли документы у которых номер 11111 и только тогда продолжать
Код:
Set Doc= myview.Getfirstdocument
   While Not (Doc Is Nothing)
....
определяется summa из документа
отправить сообщение
        Set Doc= myview.Getnextdocument(Doc)
    Wend

если так, то первое отправится сообщение и дальше я проверю и например, если 11111as не буду отправлять. но проблема в том, что мне надо в первом сообщение суммировать summa (из 11111)+ summa (из 11111as ) и только потом отправлять
подскажите, пожалуйста, как правильно сделать отбор документов по номеру ?
dim coll as
set coll=view.GetAllDocumentsByKey("11111",false)
вернет из представления коллекцию, которая содержит все документы , у которых ключ представления начинается на "11111"
А там уже - наворачивать логику по суммированию значения полей и иные действия.

ЗЫ - Для высоконагруженных систем рекомендую view.GetDocumentByKey("11111",false)\NotesViewNavigator.GetEntryByKey("11111",false) с последующей итерацией GetNext и тп...
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
37
у которых ключ представления начинается на "11111"
а так же доки с номером, начинающимся на 111111;)
они будут лишними, если я правильно понял задачу
кажется необходимо точное соответствие номера (цифрового) с отрезанным постфиксом (буквенным)
впрочем, правильный отбор и категоризирование в въюшке с одновременным подсчётом означенных сумм там же, задачу решает уже наполовину
а с учётом того, что это делает сервер и подготавливает данные заранее, отбор и обработка будет практически мгновенными (к тому ж не надо лезть в доки за данными, а надо просто прочесть 2!!! готовых энтриса)
если есть боязнь, что въюшка будет слишком большой, можно ограничить селект в ней, не показывая уже "обработанные" доки, если это приемлемо из условия
 

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
4
Ну на вкус и цвет - все фломастеры разные :)
Судя по всему (эт нужно уточнить) - классическая задача parent-child, типа номер-серия и т.п.
1 - Т е если есть хоть какой то 11111 - coll.count>0 - то далее продолжаем обработку, если coll.count>1 - то уже есть что считать в сумму (в цикле без учета 11111) - та же половина задачи :).
2 - если использовать entry collection - то первый найденный entry - будет всегда 11111
3 - Вьюшки - считалочки оч хорошо работают там, где редко меняются документы.
4 - Таких вьюшек-считалочек в БП может быть оч много - так же влияет на перфоманс (сорри - кто о чем, а лысый о расчестке:))

А так да - можно решать задачу по всякому.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
нафигатор строится от к-л сучности (а не от ключа), есть ли смысл тогда в false для сучности
даже класс делал
Код:
Class ViewNavBase As ErrorHandler
    Private AutoSave As Boolean
    Private logDoc As NotesDocument
    Private columns List As Integer
    Private db As NotesDatabase
    Private dbsource As NotesDatabase
    Private dbtarget As NotesDatabase
    Private view As NotesView
    Private key As String
    Private nav As NotesViewNavigator
    Private lastAU As Boolean 'last autoupdate state
    Private first As NotesViewEntry
    Private last As NotesViewEntry
    Private debug As Boolean
    Private safe As Boolean 'for safe update (don't replace "existing" value)
    Private NDChave2save() As NotesDocument
    Private UNIDS2save() As String
    Private UNIDS4missmatch() As String
    Private isTmpl As String
    %REM
    *--------------------------------------------
        Sub New
        Description: Comments for Sub
    %END REM
    Sub New(db As NotesDatabase, viewName As String, key As String)
        Dim routineName As String
        routineName="New"
        On Error GoTo ErrH
        'your code here
        me.AutoSave=True
        me.isTmpl={0}
        'Print {Class->} TypeName(Me){;View name:} viewName
        If db Is Nothing Then Error 1024, {DB is Nothing}
        Dim ses As New NotesSession
        Set me.db=db
        'Print {Database RID:} me.db.Replicaid
        Set me.logDoc=me.db.CreateDocument
        Call me.logDoc.Replaceitemvalue({form}, {log})
        Set me.rtTrace=me.logDoc.Createrichtextitem({body})
        Call me.logDoc.Computewithform(False, False)
        me.key=key
        Set me.view=me.db.Getview(Viewname)
        me.lastAU=me.view.AutoUpdate
        me.view.AutoUpdate= False
        me.view.Refresh
        Dim entry As NotesViewEntry

        Dim NEC As NotesViewEntryCollection
        'Print {Class:} TypeName(Me) {->} {Key:} me.key
        Set NEC=view.Getallentriesbykey(me.key, True)
        If Not NEC Is Nothing Then Set entry=NEC.Getfirstentry()
        If entry Is Nothing Then
            Print {Class:} TypeName(Me) {->} {First Entry Is Nothing}
            Set nav=view.Createviewnav()'escape error if key doesn't match any entries
        Else
            'Print {Class:} TypeName(Me) {->} {Entries Count} NEC.Count
            Set me.nav=view.Createviewnavfrom(entry)
            'https://www-10.lotus.com/ldd/ddwiki.nsf/dx/Fast_Retrieval_of_View_Data_Using_the_ViewNavigator_Cache
            nav.BufferMaxEntries = NAV_BUF
            nav.EntryOptions = Vn_entryopt_nocountdata
            Set me.first=entry
            Set entry=NEC.Getlastentry()
            Set me.last=nav.Getentry(entry)
            ForAll col In me.view.Columns
                Dim tmp As NotesViewColumn
                Set tmp=col
                'Print {Column name/pos:}tmp.ItemName {/} tmp.Position-1
                me.columns(tmp.ItemName)=tmp.Position-1
            End ForAll
        End If

Quit:
        Exit Sub
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Sub
    %REM
    *--------------------------------------------
        Function Add2Missmathc
        Description: add to array for missmatch entries
    %END REM
    Function Add4Missmatch(entry As NotesViewEntry) As NotesViewEntry
        Dim routineName As String
        routineName="Add4Missmatch"
        On Error GoTo ErrH
        'your code here
        Dim cnt As Long
        If IsArrayInitialized(me.UNIDS4missmatch) Then
            cnt=UBound(me.UNIDS4missmatch)+1
        End If
        ReDim Preserve me.UNIDS4missmatch(cnt) As String
        me.UNIDS4missmatch(cnt)=entry.Universalid
        Set Add4Missmatch=entry
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
    Function Add2Save
    Description: Comments for Function
    %END REM
    Private Function Add2Save(doc As NotesDocument) As NotesDocument
        Dim routineName As String
        routineName="Add2Save"
        On Error GoTo ErrH
        'your code here
        Dim cnt As Long
        If IsArrayInitialized(me.NDChave2save) Then
            cnt=UBound(me.NDChave2save)+1
        End If
        ReDim Preserve me.NDChave2save(cnt) As NotesDocument
        ReDim Preserve me.UNIDS2save(cnt) As String
        Set me.NDChave2save(cnt)=doc
        me.UNIDS2save(cnt)=doc.Universalid
        Set Add2Save=doc
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
    Sub Terminate
    Description: destroy object
    %END REM
    Sub Delete()
        Dim routineName As String
        routineName="Delete"
        On Error GoTo ErrH
        'your code here
        'try to save document have been marked for save
        If me.AutoSave Then Me.Save
Quit:
        Exit Sub
ErrH:
        Error Err, Me.RaiseError
        Resume Quit
    End Sub
    %REM
    *--------------------------------------------
        Function Save
        Description: Comments for Function
    %END REM
    Private Function Save()
        Dim routineName As String
        routineName="Save"
        On Error GoTo ErrH
        'your code here
        If Not me.view Is Nothing Then
            me.view.Refresh
            me.view.Autoupdate=me.lastAU
        End If
        'Print {Class:} TypeName(Me){->Destroy; Key:}key
        If Not IsArrayInitialized(me.NDChave2save) Then GoTo Quit
        'Print {Class:} TypeName(Me){->Saving Documents...} UBound(me.NDChave2save)+1
        Dim lastTry2Save As String
        ForAll obj In me.NDChave2save
            Dim doc As NotesDocument
            Set doc=obj
            If Not doc Is Nothing Then
                lastTry2Save={*Saved Doc Parent/UNID/Form/Name:} & _
                doc.Parentdocumentunid & {/} & _
                doc.Universalid & {/} & _
                doc.GetItemValue({Form})(0)&{/}&doc.Getitemvalue(NAME_FLD)(0) &{*}
                Call doc.Save(True, False)
                'Print {Class:} TypeName(Me){->Saved Doc name:}doc.Getitemvalue(NAME_FLD)(0)
            End If
        End ForAll
        ReDim me.NDChave2save(0) As NotesDocument
        Set me.NDChave2save(0)=Nothing
        'Save=
Quit:
        Exit Function
ErrH:
        Dim s As String
        s=Me.RaiseError
        If Len(lastTry2Save)>0 Then s=s & Chr(10) & lastTry2Save & Chr(10)
        Error Err, s
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
        Property Set IsDebug
        Description: Comments for Property Set
    %END REM
    Property Set IsDebug As Boolean
        Dim routineName As String
        routineName="IsDebug"
        On Error GoTo ErrH
        'your code here
        me.debug=IsDebug
Quit:
        Exit Property
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Property
   
    %REM
    *--------------------------------------------
    Property Set IsTemplate
    Description: return ISTEMPLATE_FLD value
    %END REM
    Private Property Get IsTemplate As String
        Dim routineName As String
        routineName="IsTemplate"
        On Error GoTo ErrH
        'your code here
        IsTemplate=me.isTmpl
Quit:
        Exit Property
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Property
    %REM
    *--------------------------------------------
    Property Set IsTemplate
    Description: Comments for Property Set
    %END REM
    Private Property Set IsTemplate As String
        Dim routineName As String
        routineName="IsTemplate"
        On Error GoTo ErrH
        'your code here
        me.isTmpl=IsTemplate
Quit:
        Exit Property
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Property
    %REM
    *--------------------------------------------
        Property Get Changes
        Description: Comments for Property Get
    %END REM
    Property Get Changes As Long
        Dim routineName As String
        routineName="Changes"
        On Error GoTo ErrH
'your code here
        If IsArray(me.NDChave2save)Then Changes=UBound(me.NDChave2save)+1
Quit:
        Exit Property
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Property
    %REM
    *--------------------------------------------
        Property Get ChangesUNIDS
        Description: Comments for Property Get
    %END REM
    Property Get ChangesUNIDS
        Dim routineName As String
        routineName="ChangesUNIDS"
        On Error GoTo ErrH
'your code here
        If IsArrayInitialized(me.UNIDS2save)Then
            ChangesUNIDS=me.UNIDS2save
        Else
            ChangesUNIDS=Split({},{})
        End If
Quit:
        Exit Property
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Property
    %REM
    *--------------------------------------------
        Function GetFirst
        Description: Comments for Function
    %END REM
    Function GetFirst() As NotesViewEntry
        Dim routineName As String
        routineName="GetFirst"
        On Error GoTo ErrH
        'your code here
        Set GetFirst=me.first
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function

    %REM
    *--------------------------------------------
        Function GetPrev
        Description: Comments for Function
    %END REM
    Function GetPrev(entry As NotesViewEntry) As NotesViewEntry
        Dim routineName As String
        routineName="GetPrev"
        On Error GoTo ErrH
        'your code here
        If entry.Getposition(POS_SEP) = me.first.Getposition(POS_SEP) Then GoTo Quit
        Set GetPrev=nav.Getprev(entry)
        'If Me.GetPrev.Columnvalues(0)<>key Then Set GetPrev=NOTHING
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function

    %REM
    *--------------------------------------------
    Function GetNext
    Description: Comments for Function
    %END REM
    Function GetNext(entry As NotesViewEntry) As NotesViewEntry
        Dim routineName As String
        routineName="GetNext"
        On Error GoTo ErrH
        'your code here
        If entry.Getposition(POS_SEP) = me.last.Getposition(POS_SEP) Then GoTo Quit
        Set GetNext=me.nav.Getnext(entry)
        'If Me.GetNext.Columnvalues(0)<>me.key Then Set GetNext=Nothing
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function

    %REM
    *--------------------------------------------
    Sub Get HashMap
    Description: return List Array
    should be overrided
    %END REM
    Sub GetHashMap(lst List As Variant)
        Dim routineName As String
        routineName="HashMap"
        On Error GoTo ErrH
        'your code here
        'HashMap=
Quit:
        Exit Sub
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Sub
    %REM
    *--------------------------------------------
        Sub ShowLog
        Description: Comments for Sub
    %END REM
    Function ShowLog As NotesUIDocument
        Dim routineName As String
        routineName="ShowLog"
        On Error GoTo ErrH
        'your code here
        Dim wks As New NotesUIWorkspace
        me.rtTrace.Update
        Set ShowLog=wks.Editdocument(True, me.logDoc)
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
    Function Filter
    Description: return True if value have not to be updated
    %END REM
    Function Filter(key As String) As Boolean
        Dim routineName As String
        routineName="Filter"
        On Error GoTo ErrH
        'your code here
        'Filter=False
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
        Function UpdateByHashMap
        Description: update "collection" according HashMap
        all additional documents will be added
        vnav is another object
    %END REM
    Function UpdateByHashMap(vnav As ViewNavBase)
        Dim routineName As String
        routineName="UpdateByHashMap"
        On Error GoTo ErrH
        'your code here
        If Not (TypeName(vnav) = TypeName(Me)) Then _
        Error 1024, CM_NAVTYPEMISMATCH &TypeName(Me) &{/} &TypeName(vnav)
        Set vnav.dbsource=me.db
        Set me.dbtarget=vnav.db
        'Print {Target DB RID:} vnav.db.Replicaid
        Dim lst List As Variant
        Call Me.GetHashMap(lst)
        Dim entry As NotesViewEntry
        Set entry=vnav.GetFirst()
        Do While Not entry Is Nothing
            Dim tmpkey As String
            tmpkey=entry.Columnvalues(vnav.GetKeyValueCol())
            'check target view key according source key list
            If IsElement(lst(tmpkey)) Then
                'check if key should not be updated
                If Not Filter(tmpkey) Then
                    Dim docres As NotesDocument
                    If vnav.UpdateValues(lst(tmpkey), entry, docres) Then
                        'Call entry.Document.Save(True, False, False)
                        'Print {Add to Save:} docres.Getitemvalue(NAME_FLD)(0) {/} docres.Getitemvalue(VALUE_FLD)(0)
                        Call Add2Save(docres)
                    End If
                End If
                'remove hash element if it has been found
                Erase lst(tmpkey)
            Else
                Call Me.Add4Missmatch(entry)
            End If
            Set entry=vnav.GetNext(entry)
        Loop
        'create document according filter
        'itarate reamin keys
        ForAll m In lst
            Dim doc As NotesDocument
            Set doc=Nothing
            If Not Filter(ListTag(m)) Then Set doc=vnav.CreateDocument(ListTag(m),m)
            If Not doc Is Nothing Then
                SetType doc
                'Call doc.Save(True, False, False)
                Call Add2save(doc)
            End If
        End ForAll
        'UpdateByHashMap=
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function

    %REM
    *--------------------------------------------
        Function GetKeyValue
        Description: return  column Index (view entry) for hash key
        should be overrided
    %END REM
    Function GetKeyValueCol() As Integer
        Dim routineName As String
        routineName="GetKeyValue"
        On Error GoTo ErrH
        'your code here
        'GetKeyValueCol=
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
   
    %REM
    *--------------------------------------------
        Function CreateDocument
        Description: should be overrided
        will be called from UpdateByHashMap
    %END REM
    Function CreateDocument(keyfld As String, values) As NotesDocument
        Dim routineName As String
        routineName="CreateDocument"
        On Error GoTo ErrH
        'your code here
        'CreateDocument=
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
        Function RemoveMissmatch
        Description: Comments for Function
    %END REM
    Function RemoveMissmatch()
        Dim routineName As String
        routineName="RemoveMissmatch"
        On Error GoTo ErrH
        'your code here
        If IsArrayInitialized(me.UNIDS4missmatch) Then
            ForAll m In me.UNIDS4missmatch
                Dim unid As String
                unid=CStr(m)
                Dim doc As NotesDocument
                Set doc=GetDocumentByUNIDSilent(me.db, unid)
                If Not doc Is Nothing Then
                    Call doc.Remove(True)
                End If
            End ForAll
        End If
        'RemoveMissmatch=
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
    Function SetType
    Description: should be overrided
    %END REM
    Private Function SetType(doc As NotesDocument)
        Dim routineName As String
        routineName="SetType"
        On Error GoTo ErrH
        'your code here
        'SetType=
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
    %REM
    *--------------------------------------------
    Property Set IsSafe
    Description: replace or not (true - not) to new value with UpdateValues
    %END REM
    Property Set IsSafe As Boolean
        Dim routineName As String
        routineName="IsSafe"
        On Error GoTo ErrH
        'your code here
        me.safe=IsSafe
Quit:
        Exit Property
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Property
   
    %REM
    *--------------------------------------------
        Function UpdateValues
        Description: assign nev values to entry
        shoul be overrided
    %END REM
    Function UpdateValues(values, entry As NotesViewEntry, docres As NotesDocument) As Boolean
        Dim routineName As String
        routineName="UpdateValues"
        On Error GoTo ErrH
        'your code here
        'UpdateValues=
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
End Class
чтобы отслеживать последний энтрис (в классе много "лишнего")
 
Последнее редактирование:

swyatogor

Green Team
24.02.2014
593
24
BIT
0
я на подобии этого статистику делал по базе СЭД..
категоризированный вид
- первая колонка - категория тип документа (в данном случае суфикс - 11111)
- вторая колонка - у меня просто единичка стояла (в данном - выводить сумму в доке).. на колонке для категории стоял тотал
всё.. бежим по категориям.. считаем что нуно)..
 

Irina

Green Team
31.05.2019
145
2
BIT
0
спасибо. сделала вью первая категоризированная и в ней без доп букв номер ,вторая сумма общая. вроде все работает (отвлекли другой задачей)
сейчас осталось разобраться с процессом отбора документов. так как я с основной вью проверяю все поля , а во второй номер и сумму . и получается в основной 10 документов, а уже при категории 3 (+ подкатегории), вот он отправляет 10 писем , но с верными данными
 

Irina

Green Team
31.05.2019
145
2
BIT
0
можете помочь, я раз 10 поменяла все и реально запуталась
проверяю основное представление , потом по номеру беру общую сумму и общий номер (без букв), потом отправляю
но не могу понять , как искать в основном, но прекратить отправку , когда прошла по всем пунктам ("(#shortview)"), а не view
Код:
    Set Doc = view.Getfirstdocument
    
        
    While Not (Doc Is Nothing)
     …
            NumberMy = Doc.GetItemValue("Number")
            
            Set myview = DB.GetView("(#shortview)")
            myview.AutoUpdate = False
            Set nav = myview.CreateViewNav   
            key = Val (NumberMy(0))
            Set entry = myview.GetEntryByKey(Int(key))
            If entry Is  Nothing Then
                Exit Sub
            Else
                
                Set mydoc = entry.Document 
                Set entryA = nav.GetPrev(entry)
                If entryA.IsCategory Then
                условие отправки    =1
            ……..       
                    
                End If
            End If

        If условие отправки Then   
                      
            Call doc.Save( True, True )
            Call doc.Send(False)
         
            
        End If
        Set Doc = view.Getnextdocument(Doc)
    Wend
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
можете помочь, я раз 10 поменяла все и реально запуталась
у вас в коде и NotesDocumentCollection и навигатор... и 100500 раз переключается навигатор
- навигатор достаточно построить 1-ин раз (вне цикла и тамже AutoUpdate...)
- ключ преобразовывается несколько раз, дстаточно CInt(Doc.GetItemValue("Number")(0)) хотя неясно - зачем искать по целому (строка тоже подойдет)
- создать Dim lst List As Document, в него засовывать документы по нужному ключу (там же можно проверять на дубирование)
- после цикла по view сделать ForAll d in lst <отправка документа> End ForAll
 

Irina

Green Team
31.05.2019
145
2
BIT
0
у вас в коде и NotesDocumentCollection и навигатор... и 100500 раз переключается навигатор
- навигатор достаточно построить 1-ин раз (вне цикла и тамже AutoUpdate...)
- ключ преобразовывается несколько раз, дстаточно CInt(Doc.GetItemValue("Number")(0)) хотя неясно - зачем искать по целому (строка тоже подойдет)
- создать Dim lst List As Document, в него засовывать документы по нужному ключу (там же можно проверять на дубирование)
- после цикла по view сделать ForAll d in lst <отправка документа> End ForAll
большое спасибо , все поняла, только "- создать Dim lst List As Document, в него засовывать документы по нужному ключу (там же можно проверять на дубирование) ." то есть создать список и в него сохранять документы , подходящие по отбору ?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
большое спасибо , все поняла, только "- создать Dim lst List As Document, в него засовывать документы по нужному ключу (там же можно проверять на дубирование) ." то есть создать список и в него сохранять документы , подходящие по отбору ?
угу, и потом, обработать его и отправить письма (вне While)
 

Irina

Green Team
31.05.2019
145
2
BIT
0
Код:
    Set view = DB.GetView( "mainview")
    Set Doc = view.Getfirstdocument
    Dim myview As NotesView
    Dim nav As NotesViewNavigator
    Dim entry As NotesViewEntry
    Dim entryA As NotesViewEntry
    Dim mydoc As NotesDocument
    Set myview = DB.GetView("(#dopview)")
    myview.AutoUpdate = False
    Set nav = myview.CreateViewNav   
    
    While Not (Doc Is Nothing)
        ....
        Number = Doc.GetItemValue("Number")
        
        key = Val (Number(0))
        Set entry = myview.GetEntryByKey(key)
        
        Set mydoc = entry.Document
        Set entryA = nav.GetPrev(entry)
            If entryA.IsCategory Then
                mylist(Doc.universalid) = Doc.universalid
        .....
            End If
        
        Set Doc = view.Getnextdocument(Doc)
    Wend
    ForAll v In mylist
    отправка
    ........
    End ForAll
12345.jpg

подскажите, пожалуйста, по какому критерию в список вносить документы, просто у entryA нет в принципе никаких параметров
 

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
80
Код:
'...
 mylist(Doc.universalid) = Doc.universalid
'...
Это Вы не документы сохранили в списке, а их UniversalID.
Если данных для отправки нет в ColumnValues, то значит их нужно брать из документа, а значит нужно сохранять в списке сами документы:
Код:
'...
Dim mylist List As NotesDocument

'начало цикла
    Set mylist(Doc.UniversalID) = Doc
'конец цикла

'...
[/QUOTE]
 
Мы в соцсетях:

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