Пересчет полей документа после изменений в Embedded View

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

  1. Idea

    Idea Гость

    Доброго времени суток!
    Есть такая проблема:
    В основной документ встроено представление, на котором отображаются документы, категоризованные 1) по родителю, 2) по автору. Соответственно пользователь видит на этом представлении только то, что относится к нему. Пользователь может из этой формы (через экшен бар представления) добавить документ, изменить или удалить. На вью есть колонка - сумма. Которая в обычном представлении делает подсчет по категориям, но естественно, что во встроенном представлении итоговой суммы мы не видим (single category). Для того, чтобы отобразить сумму по всем столбцу, использую форму уже на главной форме:
    Код (Text):
     @If(@IsNewDoc;@Return(0);"");
    ar := @DbLookup("":"NoCache";@DbName;"PoT";@Text(@DocumentUniqueID);9);
    @If( @IsError(ar); 0; @Sum(ar) )
    Естественно, если что-то меняется, то его надо пересчитать. А теперь заковырка:
    пользователь, редактирующий свои документы через вью совсем не обязательно обладает правами автора на головной документ (скорее всего он есть только в поле Reader), то есть не может он его редактировать. Как можно в этом случае отобразить актуальную сумму?
    Попробовала агентом, но эффекта пока никакого. Код агента:
    Код (Text):
     
    Dim session As NotesSession
    Dim doc As NotesDocument

    Set session= New NotesSession
    Set doc=session.documentcontext

    doc.HistText = "Added new TimeReport"

    Call doc.ComputeWithForm(False, False)
    Call doc.Save(True,False)
    Сам агент вызывается по кнопке из встроенного представления:
    Код (Text):
     
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument

    Set db = session.CurrentDatabase
    Set uidoc = ws.CurrentDocument
    Set doc = db.CreateDocument

    doc.Form = "WorkWeek"
    doc.Parentunid = uidoc.Document.UniversalID
    doc.ProjectID = uidoc.Document.ProjectID
    Call doc.MakeResponse( uidoc.Document )

    Call doc.ComputeWithForm( False, False )

    If ws.DialogBox("WorkWeek", True, True, True, False, False, False, "WorkWeek", doc, True, True) Then

    Set agent = db.GetAgent("Recalculate")
    Call agent.Run(uidoc.Document.NoteID)

    End If
    End Sub
     
  2. Sandr

    Sandr Гость

    Call agent.Run(uidoc)

    надо передавать noteID, а не uidic...
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Idea
    Код (Text):
    If ws.DialogBox("WorkWeek", True, True, True, False, False, False, "WorkWeek", doc, True, True) Then

    Set agent = db.GetAgent("Recalculate")
    Call agent.Run(uidoc)

    End If
    1. При открытии тоже такой код исполнять?
    2. Call agent.Run(uidoc) - что-то новенькое...
    3. Не Run тогда, а RunOnServer...
    Потом как вы данные из back-end'a покажете в front-end'e?
    У меня единственная мысля - CFD поле и после добавления респонса закрывать и заново открывать главный документ (как-то поле обновить нужно)
     
  4. Idea

    Idea Гость

    Да-да, конечно noteID.

    Для fedotxxl :

    1 - при открытии чего?
    2 _
    3. Сейчас попробую закрывать и открывать, только такая мелочь - информация на форме представлена в виде таблицы с закладками, а нужная закладка аж третья. Как запомнить последний вид, чтоб пользователь не заметил, что документ переоткрывался?
     
  5. Idea

    Idea Гость

    На данный момент есть такая проблема - код, который написан в условии
    If ws.DialogBox ... вообще не выполняется.
     
  6. Sandr

    Sandr Гость

    Вы пытаетесь через диалог записать в документ выбранные значения в диалоге - не выйдет... Пользователь ведь не имеет права изменять документ... Создавайте темповый док и пишите все в него.. Агентом потом его подгребаете и пишите из него все что Вам надо в свой док...
     
  7. Idea

    Idea Гость

    Мне в принципе не надо из диалога ничего переписывать, мне реально надо всего лишь обновить документ (computed for display - поле меня вполне устраивает). Проблема в том, что я не знаю, как после закрытия диалога заставить что-либо (просто код или агента) выполнить рефреш или релоад. Куда подвесить код, чтобы лотус понял, что нужно работать с головным документом (uidoc-то уже не катит)?
     
  8. Sandr

    Sandr Гость

    Перепишите этот кусок вот так:

    Код (Text):
    Call ws.DialogBox("WorkWeek", True, True, True, False, False, False, "WorkWeek", doc, True, True) Then

    Set agent = db.GetAgent("Recalculate")
    Call agent.RunOnServer(uidoc.Document.NoteID)
    Условие там ни к чему..

    А вот с переоткрытием документа ждействительно проблема, так как не понятно, когда отработает агент, перегружать то док нужно после отработки агента...
     
  9. Idea

    Idea Гость

    Ну например агента или код перезагрузки можно на PostSave повесить формы диалогбоксовской, вот только какой код?
     
  10. Sandr

    Sandr Гость

    Знаете... а можно ведь легко обойтись юез серверных агенов... Пишите все в какой-то темповый документ (или в профайл пользователя), и тащите оттуда данные лукапом в нужный вам документ... Так будет гораздо проще...
     
  11. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Sandr
    Я так и предлагал. Можно вообще dblookup + summ и темповый документ не нужен... только вот как отобразить это не переоткрывая документ
    Для: Idea
    Мне кажется, что никак... пытался с JS - не пашет что-то focus()
     
  12. Sandr

    Sandr Гость

    @Command([ViewRefreshFields]) должен помочь...

    Именно никак... И жаваскрипт тут не причем... Есть стандартный способ переключений между закладками, но текущую закладку не получить никак...
     
  13. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Так что не пойдет
    Что за механизм?
     
  14. serEJa Shabalin

    serEJa Shabalin Гость

    Программируемые таблицы
     
  15. Sandr

    Sandr Гость

    Ну, значит @Command( [RefreshWindow] )

    На последней закладке в свойстве таблицы задаем ID, на форму лепим поле с именем $IDтаблицы.
    Каждой закладке даем совй айдишник...
    Когда в то поле пишем айдишник како-то из закладок и рефрешим док, таблица переключается на закладку, чей айдишник мі записали в то поле...
     
  16. serEJa Shabalin

    serEJa Shabalin Гость

    А почему нельзя получить текущую закладку
    Ее имя храниться в поле $ID-таблицы
    Можно на закрытие документа сохранить это имя в документе
    А на открытие прописать в поле $ID-таблицы
     
  17. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Sandr
    Возник вопрос просто для образования - как мне программно узнать, на какой я сейчас закладке (строке)?

    Для: Sandr, Idea

    Почему этот метод не пременим? После добавления нового респонса записываем в notes.ini, что мы нажали. Затем закрываем документ, открываем. А на QueryOpen чтение переменной из notes.ini, если не пустая, то записывем в поле $IDтаблицы id закладки, очищаем переменную в notes.ini
     
  18. Sandr

    Sandr Гость

    Если Вы туда пишете айди ячеки, то можно прочитать, сам лотус, почему-то, туда ничего не пишет... Можете проверить... Так что прочитать програмно, на какой закладке вы находитесь низя...
     
  19. Idea

    Idea Гость

    Провела эксперимент на @Command( [RefreshWindow]), просто повесила команду на кнопочку "Пересчитать" - ничего, и ошибок не выдает.
    Так что остается проблема как именно переоткрыть.

    Для fedotxxl
    На счет неприменимости метода. Я просто не знаю, как что-то записывать в тот же notes.ini и считывать оттуда, а с $IDтаблицы и id закладки вообще какой-то темный лес.
     
  20. Idea

    Idea Гость

    Вообще не понятно, зачем это нужно. я ещё понимаю данные о закладках таблицы для переоткрытия, а данные для поля и так лукапом собираются по встроенному вью, прям в формуле поля (CFD) и без всяких темпов.
    А агентом хотелось "обмануть" обновление формы, правда не обманывается всё равно.
     
Загрузка...

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