Данные из Subforms

  • Автор темы oddyvoo
  • Дата начала
O

oddyvoo

Здравствуйте!
Появилась потребность сделать view, основываясь на форме, которая состоит из сплошных <Computed Subform>. Все нужные мне поля я без проблем выделяю, но вот одно поле из subform неудается. Поле в формате RichText, причем в разных subforms его значение может быть как editable, так и computed. Здесь на форуме нашел много разных советов и по созданию отдельного hide-поля, с вычисляемым значением. Но все бесполезно. Пробовал вообще проверить, существует ли такое поле в основной форме. Пишу - @IsAvailable (FieldName) - во view выдает мне 0.
Все это к чему. Каким образом можно напрямую из subform вытащить интересующую меня информацию? Причем обращение к subform должно быть только из одного столбца. Остальная часть view вполне устраивает.
Спасибо.
 
O

oddyvoo

Medevic
Да естественно. Писал так @Abstract([TextOnly];15360;"";"RTField"). В колонке выдает во всех строках – RTField. Т. е. то что в кавычках то и выдает.
Если указать такое же RTField из той же формы то выдается записи из этого поля. Т.е. то что надо. Получается что поле, из которого мне нужно достать информацию не доступно. И как его сделать доступным, честно говоря ума не приложу. База эта нам досталась по наследству, концов по разработке не найти.
Что можно еще попробовать? Может быть сделать Shared Field и прикрутить к основной форме? Работать будет такой вариант?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Писать надо так:
@Abstract([TextOnly]; 15360; ""; RTField)
Прописать надо в обычном текстовом вычисляемом поле на форме. В колонке использовать это поле.

@Abstract([TextOnly]; 15360; ""; RTField)
Хотя я всегда использую такую формулу:
@Abstract([TryFit]; 200; ""; RTField)
Больше 200 символов вряд ли понадобятся в представлении.
 
O

oddyvoo

Medevic
Еще раз. Вставляем вычисляемое поле в основную форму или в подформу, где это поле содержиться? На основной форме нужное поле как таковое отсутствует. Обращения к нему, не к чему не приводят. Поле есть только в подформах, в одном случае поле вычисляемое, во втором просто изменяемое.
Если я пробую из Дизайнера на основной форме сделать Preview in Notes появляется форма без это поля. Так заложено изначально, менять нельзя.

Только что попробовал на основной форме создать поле Text-Computed. Назвал его точно также, как и поле которое мне нужно. Матюга в ответ не последовало. Значит поля не видно. Написал как Вы показали @Abstract([TryFit]; 200; ""; SU). Затем в представлении пишу в поле @Abstract([TryFit]; 200; ""; SU) - результат, поле остается пустым.

Извините если достаю, но действительно надо сделать это. Своих умственных способностей не хватает.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Это поле кладется рядом с ричтекстовым (ниже его, чтобы вычислялось нормально). Если оно в подформе, то значит в подформу. Назовем его, например, "RTFieldTextOnly". Оно текстовое и вычисляемое (не for display и не when composed). Пишем формулу: @Abstract([TryFit]; 200; ""; RTField). Скрываем его.
В представлении в колонке пишем: RTFieldTextOnly. И всё.
Работать будет только с новыми документами. Существующие документы надо пересохранить.
 
O

oddyvoo

Medevic
Простите за нескромный вопрос. Пересохранить документы - создать агента с формулой @Command([ToolsRefreshAllDocs]) и запустить нажав Run? Поставил в свойствах - на каких документах выполнять None. Пробовал поставить All documents in database - результат нулевой.
 
O

oddyvoo

Medevic
Так точно, только что еще раз сделал все на чистой базе, нетронутой моими корявыми руками, все заработало. Осталось только пересохранить предыдущие элементы. Вот как это делать нашел, но опять уперся.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
@Command([ToolsRefreshAllDocs]) скорее всего не работает из-за того, что используются подформы. Он их не персчитывает, как я думаю. Хотя, хз. Надо проверить.
Попробуй агент с формулой:
@SetField("RTFieldTextOnly"; @Abstract([TryFit]; 200; ""; RTField))
 
O

Omh

oddyvoo
Ну сделай скртиптиком, типа:
Код:
Dim session As New NotesSession

Dim Agent As NotesAgent
Set Agent = Session.CurrentAgent

Dim Db As NotesDatabase
Set Db = Agent.Parent

Dim Query As String
Query = {Form = "SUPER_FORM"}

Dim Coll As NotesDocumentCollection
Set Coll = Db.Search(Query, Nothing, 0)

Dim Total As Long
Total = Coll.Count 

If Total > 0 Then
Dim Doc As NotesDocument

Dim Progress As Long

Dim Item As NotesItem

Set Doc = Coll.GetFirstDocument
While Not Doc Is Nothing
Progress = Progress + 1
Print "Progress: " + Cstr(Progress) + " / " + Cstr(Total) + "..."
Set Item = Doc.GetFirstItem("OLD_RT_ITEM")
if Not Item is Nothing then
Call doc.ReplaceItemValue("NEW_COMPUTED_ITEM", Item.Text)
Call Doc.Save(True, False)
end if
Set Doc = Coll.GetNextDocument(Doc)
Wend
End If
Там ещё можно первых 200 символов только брать, но это сам плз :)
 
O

oddyvoo

Medevic
Все прошло на ура! Терь все что надо отражается! Спасибо большое. Дай бог Вам здоровья.

Omh
Спасибо. Я конечно попробую.

Итог для потомков:
1.Создаем в нужной Подформе Поле RTFieldTextOnly (Text-Computed)
2. Дополняем поле формулой @Abstract([TryFit]; 200; ""; RTField).
3. Скрываем его.
4. Создаем агента с формулой @SetField("RTFieldTextOnly"; @Abstract([TryFit]; 200; ""; RTField)). Выбираем в запуске All documents in database (у меня по другому не пошло).Запускаем.
5. В нужном Представлении в столбце указываем Field - RTFieldTextOnly.

Еще раз спасибо за помощь.
 
Мы в соцсетях:

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