• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Данные из Subforms

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

oddyvoo

Здравствуйте!
Появилась потребность сделать view, основываясь на форме, которая состоит из сплошных <Computed Subform>. Все нужные мне поля я без проблем выделяю, но вот одно поле из subform неудается. Поле в формате RichText, причем в разных subforms его значение может быть как editable, так и computed. Здесь на форуме нашел много разных советов и по созданию отдельного hide-поля, с вычисляемым значением. Но все бесполезно. Пробовал вообще проверить, существует ли такое поле в основной форме. Пишу - @IsAvailable (FieldName) - во view выдает мне 0.
Все это к чему. Каким образом можно напрямую из subform вытащить интересующую меня информацию? Причем обращение к subform должно быть только из одного столбца. Остальная часть view вполне устраивает.
Спасибо.
 
Medevic
Да естественно. Писал так @Abstract([TextOnly];15360;"";"RTField"). В колонке выдает во всех строках – RTField. Т. е. то что в кавычках то и выдает.
Если указать такое же RTField из той же формы то выдается записи из этого поля. Т.е. то что надо. Получается что поле, из которого мне нужно достать информацию не доступно. И как его сделать доступным, честно говоря ума не приложу. База эта нам досталась по наследству, концов по разработке не найти.
Что можно еще попробовать? Может быть сделать Shared Field и прикрутить к основной форме? Работать будет такой вариант?
 
Писать надо так:
@Abstract([TextOnly]; 15360; ""; RTField)
Прописать надо в обычном текстовом вычисляемом поле на форме. В колонке использовать это поле.

@Abstract([TextOnly]; 15360; ""; RTField)
Хотя я всегда использую такую формулу:
@Abstract([TryFit]; 200; ""; RTField)
Больше 200 символов вряд ли понадобятся в представлении.
 
Medevic
Еще раз. Вставляем вычисляемое поле в основную форму или в подформу, где это поле содержиться? На основной форме нужное поле как таковое отсутствует. Обращения к нему, не к чему не приводят. Поле есть только в подформах, в одном случае поле вычисляемое, во втором просто изменяемое.
Если я пробую из Дизайнера на основной форме сделать Preview in Notes появляется форма без это поля. Так заложено изначально, менять нельзя.

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

Извините если достаю, но действительно надо сделать это. Своих умственных способностей не хватает.
 
Это поле кладется рядом с ричтекстовым (ниже его, чтобы вычислялось нормально). Если оно в подформе, то значит в подформу. Назовем его, например, "RTFieldTextOnly". Оно текстовое и вычисляемое (не for display и не when composed). Пишем формулу: @Abstract([TryFit]; 200; ""; RTField). Скрываем его.
В представлении в колонке пишем: RTFieldTextOnly. И всё.
Работать будет только с новыми документами. Существующие документы надо пересохранить.
 
Medevic
Простите за нескромный вопрос. Пересохранить документы - создать агента с формулой @Command([ToolsRefreshAllDocs]) и запустить нажав Run? Поставил в свойствах - на каких документах выполнять None. Пробовал поставить All documents in database - результат нулевой.
 
oddyvoo
На новых документах работает ?
 
Medevic
Так точно, только что еще раз сделал все на чистой базе, нетронутой моими корявыми руками, все заработало. Осталось только пересохранить предыдущие элементы. Вот как это делать нашел, но опять уперся.
 
@Command([ToolsRefreshAllDocs]) скорее всего не работает из-за того, что используются подформы. Он их не персчитывает, как я думаю. Хотя, хз. Надо проверить.
Попробуй агент с формулой:
@SetField("RTFieldTextOnly"; @Abstract([TryFit]; 200; ""; RTField))
 
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 символов только брать, но это сам плз :)
 
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.

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab