Я тоже сторонник 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 эти поля не сохранятся.