Данные из Subforms

Тема в разделе "Lotus - Программирование", создана пользователем oddyvoo, 19 мар 2008.

  1. oddyvoo

    oddyvoo Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    oddyvoo
    Т.е. @Abstract уже пробовал?
     
  3. oddyvoo

    oddyvoo Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Писать надо так:
    @Abstract([TextOnly]; 15360; ""; RTField)
    Прописать надо в обычном текстовом вычисляемом поле на форме. В колонке использовать это поле.

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

    oddyvoo Гость

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

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Это поле кладется рядом с ричтекстовым (ниже его, чтобы вычислялось нормально). Если оно в подформе, то значит в подформу. Назовем его, например, "RTFieldTextOnly". Оно текстовое и вычисляемое (не for display и не when composed). Пишем формулу: @Abstract([TryFit]; 200; ""; RTField). Скрываем его.
    В представлении в колонке пишем: RTFieldTextOnly. И всё.
    Работать будет только с новыми документами. Существующие документы надо пересохранить.
     
  7. oddyvoo

    oddyvoo Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    oddyvoo
    На новых документах работает ?
     
  9. oddyvoo

    oddyvoo Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    @Command([ToolsRefreshAllDocs]) скорее всего не работает из-за того, что используются подформы. Он их не персчитывает, как я думаю. Хотя, хз. Надо проверить.
    Попробуй агент с формулой:
    @SetField("RTFieldTextOnly"; @Abstract([TryFit]; 200; ""; RTField))
     
  11. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    oddyvoo
    Ну сделай скртиптиком, типа:
    Код (Text):
    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 символов только брать, но это сам плз :)
     
  12. oddyvoo

    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.

    Еще раз спасибо за помощь.
     
Загрузка...

Поделиться этой страницей