Мелкие Вопросы Rtfm

  • Автор темы serko
  • Дата начала
S

serko

В ходе развития своего говнокода хотелось бы получить ответы на следующие вопросы:
1) Есть ли функция, которая сортирует полученный NotesDocumentCollection по определенному полю?
2) Есть ли метод, который создает коллекцию из коллекции на основе формулы?
Перебирать документы в коллекции уже надоедает :confused:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
1) Есть ли функция, которая сортирует полученный NotesDocumentCollection по определенному полю?
у каждого свой велик ;) я использую LS2J Array.Sort()
2) Есть ли метод, который создает коллекцию из коллекции на основе формулы?
зависит от задачи, есть пересечение коллекций
 
  • Нравится
Реакции: serko

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
один из великов
Код:
Function QuickSort( anArray As Variant, indexLo As Long, indexHi As Long) As Variant
Dim lo As Long
Dim hi As Long
Dim midValue As String
Dim tmpValue As String
lo = indexLo
hi = indexHi
If ( indexHi > indexLo) Then
'get the middle element
midValue = anArray( (indexLo + indexHi) /2)
While ( lo <= hi )
'find first element greater than middle
While (lo < indexHi) And (anArray(lo) < midValue )
lo = lo+1
Wend
'find first element smaller than middle
While ( hi > indexLo ) And ( anArray(hi) > midValue )
hi = hi - 1
Wend
'if the indexes have not crossed, swap
If ( lo <= hi ) Then
tmpValue = anArray(lo)
anArray(lo) = anArray(hi)
anArray(hi) = tmpValue
lo = lo+1
hi = hi -1
End If
Wend
' If the right index has not reached the left side of array, sort it again
If( indexLo < hi ) Then
Call QuickSort( anArray, indexLo, hi )
End If
'If the left index has not reached the right side of array, sort it again
If( lo < indexHi ) Then
Call QuickSort( anArray, lo, indexHi )
End If
End If
QuickSort = anArray
End Function
[DOUBLEPOST=1429353346,1429353285][/DOUBLEPOST]вариант не мой (я, как упомянул, пользуюсь java Array.sort())
 
  • Нравится
Реакции: serko
S

serko

Почему поиск выдает 0 документов?
Прописываю эту же формулу руками - 9 находит.
Код:
Public Sub InputSearchDialog
Dim ws As New NotesUIWorkspace
Dim dialog As NotesDocument
Set dialog = ws.Currentdatabase.Database.CreateDocument
If  Not ws.DialogBox ("Dialog\Search", True, True, False, False, False, False, "", dialog, True) Then
Exit Sub
End If
Dim view As String
Dim regnum As String
Dim status As String
Dim createdate As String
Dim regdate As String
Dim execdate As String
Dim formula As String
Dim arr(1 To 3) As String
arr(1) = dialog.Getitemvalue("DocView")(0)
arr(2) = dialog.Getitemvalue("DocRegNum")(0)
arr(3) = dialog.Getitemvalue("DocStatus")(0)
Dim v(1 To 3) As String
v(1) = "Title"
v(2) = "DocRegNumber"
v(3) = "DocStatus"
Dim i As Integer
For i = 1 To 3
If arr(i) <> "" Then
If formula = "" Then
formula = "{" & v(i) & {="} & arr(i) & {"}
Else
formula = formula & " " & v(i) & {="} & arr(i) & {"}
End If
End If
Next i
If formula = "" Then
MsgBox "Пустой запрос"
Exit Sub
End If
formula = formula & "}"
'formula = FullTrim(formula)
MsgBox formula
Dim col As NotesDocumentCollection
'formula = {Title= "Входящий документ"}
Set col = ws.Currentdatabase.Database.Search(formula, Nothing,0)
MsgBox col.count
'Call doc.save(True, True)
End Sub

===

Исправился

Код:
Public Sub InputSearchDialog 
Dim ws As New NotesUIWorkspace
Dim dialog As NotesDocument 
Set dialog = ws.Currentdatabase.Database.CreateDocument
If  Not ws.DialogBox ("Dialog\Search", True, True, False, False, False, False, "", dialog, True) Then
Exit Sub
End If
Dim view As String 
Dim regnum As String 
Dim status As String 
Dim createdate As String
Dim regdate As String
Dim execdate As String 
Dim formula As String 
Dim arr(1 To 3) As String
arr(1) = dialog.Getitemvalue("DocView")(0)
arr(2) = dialog.Getitemvalue("DocRegNum")(0)
arr(3) = dialog.Getitemvalue("DocStatus")(0)
Dim v(1 To 3) As String
v(1) = "Title"
v(2) = "DocRegNumber"
v(3) = "CurrentStage"
Dim i As Integer
For i = 1 To 3
If arr(i) <> "" Then
If formula = "" Then
If v(i) = "CurrentStage" Then
formula = v(i) & { = "} & getroutemanager().getStageIDByName(arr(i)) & {"}
Else
formula = v(i) & { = "} & arr(i) & {"}
End If
Else
If v(i) = "CurrentStage" Then
formula = formula & " & " & v(i) & { = "} & getroutemanager().getStageIDByName(arr(i)) & {"}
Else
formula = formula & " & " & v(i) & { = "} & arr(i) & {"}
End If
End If
End If
Next i
If formula = "" Then
MsgBox "Пустой запрос"
Exit Sub 
End If
Dim col As NotesDocumentCollection
Set col = ws.Currentdatabase.Database.Search(formula, Nothing,0)
MsgBox col.count
End Sub
 
Последнее редактирование:
S

serko

При пустом поле DocBody выдает ошибку. Проверял rtitem.Embeddedobjects на Nothing - тщетно. Выдает ошибку
Код:
Public Function getDocBodyCount (doc As NotesDocument) As Integer
Dim rtitem As NotesRichTextItem
Set rtitem = doc.GetFirstItem("DocBody")
Dim i As Integer
i = 0
ForAll o In rtitem.Embeddedobjects
i = i + 1
End ForAll
getDocBodyCount = i
End Function
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
41
При пустом поле DocBody выдает ошибку. Проверял rtitem.Embeddedobjects на Nothing - тщетно
Тут много на что надо проверять:
If ( rtitem.Type = RICHTEXT ) Or ( rtitem.Type = TEXT ) And doc.HasEmbedded And Not(Isempty(rtitem.EmbeddedObjects)) Then .............

Или так:
...
vEval = Evaluate("@AttachmentNames", doc)
ForAll v In vEval
If v <> "" Then .............
 
  • Нравится
Реакции: serko

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
vEval = Evaluate("@AttachmentNames", doc)
выше я уже упоминал параметр к @AttachmentNames(0)
Код:
%REM
*--------------------------------------------
Function AttachmentsName
Description: список имен приложенных файлов
%END REM
Function AttachmentsName(objdoc As NotesDocument) As Variant
AttachmentsName=Evaluate("@AttachmentNames(0)", objdoc)
End Function
Specify False (0) to include large MIME parts that are stored as attachments (but displayed in-line).
 
  • Нравится
Реакции: serko
S

serko

выше я уже упоминал параметр к @AttachmentNames(0)
Код:
%REM
*--------------------------------------------
Function AttachmentsName
Description: список имен приложенных файлов
%END REM
Function AttachmentsName(objdoc As NotesDocument) As Variant
AttachmentsName=Evaluate("@AttachmentNames(0)", objdoc)
End Function
он проверяет по всем полям в документе, а мне надо проверить конкретно 1 поле. У меня 2 richtext поля. Одно обязательное, другое - нет.
 
S

serko

Спасибо. Этого более, чем достаточно.
Код:
Public Function getDocBodyCount (doc As NotesDocument) As Integer
Dim rtitem As NotesRichTextItem
Set rtitem = doc.GetFirstItem("DocBody")
Dim i As Integer
i = 0
If Not(IsEmpty(rtitem.EmbeddedObjects)) Then
ForAll o In rtitem.Embeddedobjects
i = i + 1
End ForAll
End If
getDocBodyCount = i
End Function
 
S

serko

Можно ли как-то проверять RichTextLite, минуя сохранение? Попытался перед проверкой поля NotesDocumen.Save(True,True) запустить, но эффекта это не дало. Работает, только если сохранять пользователем, а это не круто.
 
S

serko

Беда. Это RTL поле мне все мозги высушит.
В 1/10 случаев прикрепляемый файл из поля переносится в подвал(самый низ документа). Как этого избежать?
 

Вложения

  • Безымянный.png
    Безымянный.png
    49,3 КБ · Просмотры: 501

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
переносится в подвал(самый низ документа). Как этого избежать?
создание поля (именно в кач РТ) и прикрепление аттача рассинхронизированы
Обновление Rtfield
Кстати
вот потому я и пользую LS2J - если нужно ЛС сорт ;)
[DOUBLEPOST=1429636849,1429636815][/DOUBLEPOST]@serko, код нужен, кот. крепит аттач
 
S

serko

Поле Number. Формат Decimal.
Как установить Integer? Как узнать длину поля?
 
J

JohnLemon

@Integer();

1. This example returns 123;789.
@Integer(123.001 : 789.999)

Как узнать длину поля?
Это в роде у текстового поля только. Количество символов. Если хочешь узнать переведи в string.

Или поиграйся еще
 
Последнее редактирование:
  • Нравится
Реакции: serko

alexas1

Green Team
10.04.2014
1 202
225
BIT
41
Поле Number. Формат Decimal.
Как установить Integer? Как узнать длину поля?
Поле - эт то, что на Форме. Типа для показа юзверю (или для уишных расчётов, например).
А инфа этого поля в одноимённом айтеме. Такшта, чо туда положил (в Item), то там и будет (пока не прошли какие нить преобразования\форматирования\вычисления в UI или compute with form)

Такшта говорить о Number, Decimal и Integer, в одном флаконе, эт как сравнивать люмены с люксами, описывая освещение :)
 
  • Нравится
Реакции: serko
S

serko

Божественно. Почему я раньше не использовал эту комбинацию? :eek:
Код:
ws.currentdocument.editmode = True
Call ws.Currentdocument.Refresh(True)
 
S

serko

Собираюсь сделать поиск. Все шло хорошо, пока я не вспомнил кое-что.
Поиск не может искать все документы, т.к. будут видны чужие документы. Т.е. надо искать только те документы, с которыми работал пользователь(создавал, регистрировал, подписывал и т.д.). Возникла проблема с реализацией. Получается, при выполнении каждого действия с документом информация должна записываться в поле главного документа. Например, поле ReadyMember. Создал документ = > в поле ReadyMember добавил пользователя. Зарегистрировал документ = > в это же поле еще добавил другого пользователя. И так всех через запятую. Проблема теперь в том, что поле содержит несколько значений. Обычным сравнением через равенство не получится искать. Знаю, есть функция @Contains, но в формуле для коллекции она не хочет работать. Как с этим быть? Изначально я раскидывал информацию по документам - этапам, а теперь получается, что я все собираю обратно в главный документ. Нехорошо как-то.
 
Мы в соцсетях:

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