обновление поля

Irina

Green Team
31.05.2019
145
2
BIT
0
Код:
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim varx As Variant
    Dim doc As NotesDocument
    Dim docNext As NotesDocument
    Dim dc As NotesView
    Set db = session.CurrentDatabase
    Set dc = db.GetView( "MyView" )

    Set doc = dc.getFirstDocument
    Do While Not doc Is Nothing
        Set docNext = dc.getNextDocument( doc )
        Call doc.ComputeWithForm( True, False )
        Set doc = docNext
    Loop
но поля не пересчитываются вообще. ошибок дебагер не выдает, но и поля не редактируются
добавляю еще Call doc.save(True, false) , но тоже не происходит изменений
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
42
Код:
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim varx As Variant
    Dim doc As NotesDocument
    Dim docNext As NotesDocument
    Dim dc As NotesView
    Set db = session.CurrentDatabase
    Set dc = db.GetView( "MyView" )

    Set doc = dc.getFirstDocument
    Do While Not doc Is Nothing
        Set docNext = dc.getNextDocument( doc )
        Call doc.ComputeWithForm( True, False )
        Set doc = docNext
    Loop
но поля не пересчитываются вообще. ошибок дебагер не выдает, но и поля не редактируются
добавляю еще Call doc.save(True, false) , но тоже не происходит изменений
обращу внимание, если в полях есть "тяжелые" формулы, типа dblookup, dbcolumn, то такие поля по компьютвизформ пересчитываться НЕ будут.
 

Irina

Green Team
31.05.2019
145
2
BIT
0
обращу внимание, если в полях есть "тяжелые" формулы, типа dblookup, dbcolumn, то такие поля по компьютвизформ пересчитываться НЕ будут.
тогда понятно,
там именно такие и есть формулы в данной форме, которую и необходимо обновлять агентом
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
444
тогда понятно,
там именно такие и есть формулы в данной форме, которую и необходимо обновлять агентом
из общей практики:
- весь ф-ционал вынести из кода форм в ЛС библиотеки
- поля можно обновлять на событие QR ( ) из ЛС
при таком подходе не будет нужды вызывать ComputeWithForm (желательно его вовсе не вызывать в циклах и агентах)
 

Irina

Green Team
31.05.2019
145
2
BIT
0
из общей практики:
- весь ф-ционал вынести из кода форм в ЛС библиотеки
- поля можно обновлять на событие QR ( ) из ЛС
при таком подходе не будет нужды вызывать ComputeWithForm (желательно его вовсе не вызывать в циклах и агентах)
то есть мне надо создать script libraries, добавить ее в option глобальной формы.
и все поля вычисляемые перенести туда? а как их в документе указать потом?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
444
то есть мне надо создать script libraries, добавить ее в option глобальной формы.
и все поля вычисляемые перенести туда? а как их в документе указать потом?
Код:
Set Item=replaceItemValue({fieldName}, MySuperFunction(doc, {fieldName})) 'этот вызов д.б. в событии QR и doc - Source.Document
если поле CFD - =False
в документе они просто должны быть (вернее - в форме)
 
Последнее редактирование:

Irina

Green Team
31.05.2019
145
2
BIT
0
Код:
Set Item=replaceItemValue({fieldName}, MySuperFunction(doc, {fieldName})) 'этот вызов д.б. в событии QR и doc - Source.Document
если поле CFD - =False
в документе они просто должны быть (вернее - в форме)
ох. сложнова-то
быстро не получится сделать, а может есть вариант обновиться поля, кроме ComputeWithForm ? чтобы переделывать уже не спеша
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
42
ох. сложнова-то
быстро не получится сделать, а может есть вариант обновиться поля, кроме ComputeWithForm ? чтобы переделывать уже не спеша
А что, полей до фига? Делать вычисления прям в агенте и писать в док влоб. Сопсна это тоже самое, практически, что вы и вынос в либу, ток в агенте)...
 

Irina

Green Team
31.05.2019
145
2
BIT
0
А что, полей до фига? Делать вычисления прям в агенте и писать в док влоб. Сопсна это тоже самое, практически, что вы и вынос в либу, ток в агенте)...
просто надо некоторые поля проверять и обновлять раз в день. а так их могут менять пользователи и в другое время, вернее менять другие параметры и поля пересчитываются
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
444
ох. сложнова-то
быстро не получится сделать, а может есть вариант обновиться поля, кроме ComputeWithForm ? чтобы переделывать уже не спеша
это существенно проще чем мучиться с собаками, а потом дописывать в агенте (и менно это вам и придется делать), и потом поддерживать две кодовых базы на разных ЯП + в собаках куча "но и если" и пользоваться ими нужно уметь ;)
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
42
это существенно проще чем мучиться с собаками, а потом дописывать в агенте (и менно это вам и придется делать), и потом поддерживать две кодовых базы на разных ЯП + в собаках куча "но и если" и пользоваться ими нужно уметь ;)
И, да, собаками имеет смысл пользоваться, только когда надо иметь супер отзывчивый UI ввиду из макс быстро действия.
 

Irina

Green Team
31.05.2019
145
2
BIT
0
Set Item=replaceItemValue({fieldName}, MySuperFunction(doc, {fieldName})) 'этот вызов д.б. в событии QR и doc - Source.Document

replaceItemValue - это тоже функция?

решила пробовать сделать хотябы первое поле
поле сейчас : название документа зависит от того что в других полях, например, одно название может быть , если в поле выбрано определенное значение, другое название, если дата больше определенного значения и т.д. в нем же и используется @dblook
надеюсь, я верно поняла , что именно это мне и надо описать в функции (например MySuperFunction), получить там мое поле (например fieldName)
 
Последнее редактирование модератором:

Murtas

Green Team
11.04.2006
137
1
BIT
5
A Call doc.ComputeWithForm( True, True ) пробовали делать? ... хотябы для одного
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
444
replaceItemValue - это тоже функция?
вообще - это концепт, можно упростить до MySuperFunction (это я перемудрил), которая возвратит NotesItem
унутре у нее мне-мне неонка select case по полям, вызывать можно и не один раз в QR , с разными именами полей (кот. вычисляются)
и в агенте
Т.о. вызов ф-ци в либе будет одинаков для агента и интерактива
 
Последнее редактирование:

Irina

Green Team
31.05.2019
145
2
BIT
0
Да в том же месте, в Вашем же агенте. Второй параметр True возможно смог бы показать причину по которой не происходит вычисление.
запускаю агент, выдает incorrect data type for operator or @function: text expected. Удаляю все поля, запускаю - ОК
возвращаю поля все и здесь сначала работает , а потом опять ошибка
 

kolka

Green Team
16.02.2013
32
7
BIT
0
Я тоже сторонник LotusScript для работы с пересчетом полей, но геморрой со старыми базами заставляет убивать в себе "бойскаута".

Могу такой вариант предложить для ComputeWithForm:
- создать сабформу для всех подобных форм. Эту сабформу вствлять в самом конце форм.
- в сабформе события:
- - Postsend, код (для ускорения открытия сабформы, если нет другого LotusScript):
Код:
Sub Postsend(Source As Notesuidocument)
    Const dummy = " "
End Sub
- - postOpen, querySave:
Код:
    Call cleanTemporaryFields( source.document )
- в сабформе поля:
- - tmpIsUI - ComputedForDisplay, значение: "1"
- - tmpCleaner - Computed, Allow multiple values, значение:
Код:
_val := @Trim( @Unique( @ThisValue ) );

@If( "" = tmpIsUI;
    "";
   
    @Return( _val )
);

_res := @Transform( _val; "_x";
    @If( "" = _x;
        @Nothing;
        "FIELD "+ _x + ":= @DeleteField;"
    )
);

@Eval( @Implode( _res ) );

@DeleteField

- функция cleanTemporaryFields
Код:
Sub cleanTemporaryFields( doc As NotesDocument )
    On Error GoTo catch
   
    If doc Is Nothing Then
        logWarn {Doc is nothing}
        GoTo finally
    End If
   
    ForAll fld In doc.GetItemValue( "tmpCleaner" )
        If Not "" = fld Then
            Call setFieldAsCFDnoSummary( doc, CStr( fld ) )
        End If
    End ForAll
   
    Call setFieldAsCFDnoSummary( doc, "tmpCleaner" )
   
    GoTo finally
catch:
    throwException
finally:
End Sub

Sub setFieldAsCFDnoSummary( doc As NotesDocument, fieldName As String )
    On Error GoTo catch
   
    If doc Is Nothing Then
        GoTo finally
    End If
   
    Dim item As NotesItem
    If doc.hasItem( fieldName ) Then
        Set item = doc.getFirstItem( fieldName )
    Else
        Set item = doc.replaceItemValue( fieldName, "" )
    End If
   
    item.saveToDisk = False
    item.isSummary = False
   
    GoTo finally
catch:
    throwException
finally:
End Sub

Далее, каждое поле, которое используется в вычислениях и имеет тип ComputedForDisplay поменять тип на Computed и первой строчкой добавить:
Код:
FIELD tmpCleaner := tmpCleaner : @ThisName;

Это добавит имя этого поля в tmpCleaner.

В итоге при ComputeWithForm поле tmpIsUI не вычисляется и формула для удаления врЕменных полей в tmpCleaner отрабатывает. LotusScript тут не виден - не работает.

При открытии в UI поле tmpIsUI вычисляется и форма для удаления врЕменных полей игнорируется - без этого был бы бардак при рефреше формы. Вместо этого стартует LotusScript, которые помечает поля с названиями из tmpCleaner как не сохраняемые. При сохранении документа в UI эти поля не сохранятся.
 
  • Нравится
Реакции: Irina
Мы в соцсетях:

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