Как собрать View из FORM

Тема в разделе "Lotus - Программирование", создана пользователем GROMILA, 8 апр 2004.

  1. GROMILA

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    Ситуация простая, но я недавно изучаю Lotus. Помогите пожалуйста!
    Есть Форма1 по которой создаются сотрудники. Она хранить Код сотрудника и его Имя.
    Есть Форма2, где хранится только Код сотрудника и некая другая информация.
    Вопрос:
    Как мне сформировать View по документам Формы2 так, чтобы вместо Кода сотрудника отображалось его имя из Формы1?

    Спасибо всем.
     
  2. Veselinka

    Veselinka Гость

    А никак. Это же не реляционка.

    Обычно такие проблемы решаются синхронизацией информации, необходимой для представлений из одного документа в связанные с ним.

    То есть например, в примере кадровой системы - где у одного человека есть форма Т1, резюме, относящиеся к нему приказы о приеме, отпусках, командировках, больничных и прочей мути....

    В такой системе информация о имени ФИО & NotesName - как правило проходит нитью через все документы этого сотрудника.

    Я не считаю свое мнение единственно правильным - но я не знаю способа решить поставленную задачу околореляционными методами. Это одна из классических нерешаемых в нотес задач (ибо @dblookup-ы в колонках вью использовать нельзя (в 5-ке точно, может под 6-кой они это как-нибудь решили, надо будет посмотреть)).

    Может есть умельцы - кто знает иные способы решения.
     
  3. Vagor.ini

    Vagor.ini Гость

    Солидарен с Veselinka, чтобы такое реализовать на Lotus'e надо хранить на form2 поля со значениями подставленне из form1.

    Здесь специфика Lotus хранить неизменным документ рожденный конкретной формой, чтобы не произошло с другими формами (связанными между собой логикой). А вид это всего лишь представление :) этих документов...
     
  4. GROMILA

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    Как так? :) Люди!!!!!!!!!!!!!

    Интересно получается, а если мне понадобится Имя сотрудника заменить?
    Это по всем документам БД шарить нужно будет, причем вручную? :p
    А размер БД как же? Она же станет ИЗБЫТОЧНОЙ

    Получается, что каждый документ должен в себе содержать всю необходимую информацию если эту
    информацию просто потребовалось вывести на экран? То есть каждый раз перекидывать по нужному полю
    из справочников? Это же зависимость от интерфейса, а меня учили, что БД и Прикладная часть (Интерфейс, Код)
    не должны зависет друг от друга!!!!! :p

    Может можно как-то ссылки Lotus задействовать?
    Но у меня по ссылкам View не строится тоже или можно как-то?
     
  5. Vagor.ini

    Vagor.ini Гость

    GROMILA
    Представь, ты подписал документ как гл.бухгалтер(в поле подпись выбрал из справочника ФИО), в справочнике людей затем поменялся главбух (старый уволился), так что тот документ должен уже иметь в поле подписи фамилию нового... Здесь идея лотуса как хранилище электронных документов...
    Существуют папки, где ты можешь задавать условия отбора документов, в том числе и из разных форм

    И не построишь, вид штука статичная, там даже формулу отбора не заменишь (хотя в 6 это можно). Стандартно используются категории, ответные документы (созданные по другим формам), все зависит от целей...
     
  6. Veselinka

    Veselinka Гость

    Vagor.ini - прав.

    Нотес - НЕРЕЛЯЦИОННАЯ БАЗА,
    Ругать его за отсутствие реляционной парадигмы, это все равно, что ругать бутерброд с красной икрой, за то что это не бутерброд с колбасой.

    Это разные продукты для разных целей. Если решать задачи работы с ДОКУМЕНТАМИ, где информация слабоструктурирована - то лучше нотеса ты вряд ли найдешь, а если у тебя задача ложится идеально в реляционную схему - зачем на нотесах-то ее делать? Ну сооруди на .Net приложение с реляционным бакэндом, там и гуи попродвинутее....
     
  7. Veselinka

    Veselinka Гость

    А еще лучше - забацай 7-уровневую архитектуру с концепцией абстрактного хранилища данных, концепцией документа, концепцией формы и при этом в качестве одного из стандартных хранилищ сделай - подключение реляционной БД. Ладно это шутка :)
     
  8. GROMILA

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    Спасибо за ответы. Особенно Vagor! Хочу у тебя еще раз уточнить.
    Так получается мне нужно ПАПКАМИ пользоваться в тех случаях, когда мне по ключевому полю нужно
    отобразить на экране выборку из нескольких документов, созданных по разным формам?
    Я вас правильно понял?
     
  9. nor

    nor Гость

    Уважаемый, GROMILA.
    Ваша проблема решается элементарно еще на стадии разработки форм. Необходимо однозначно сопоставить имя сотрудника и его код.
    Пускай форма "temp1" содержит следующие поля: name, code.
    Пусть форма "temp2" содержит поля: code, info, name(hidden field).
    Создаем представление "temp1": SELECT Form = "temp1". 1-ый слолбец данного представления: code, свойства: Hide column. 2-ой слолбец представлния: name.
    Далее, для проводим сопоставление. На форме "temp2" напротив поля "code" создаем кнопку. (Замечу, что кнопку можно нарисовать самому, красивую, реагирующую на движения мышки при наведении на нее. :D. Для кнопки пишем следующий скрипт:
    <code>
    (Declarations)
    Dim session As NotesSession
    Dim ws As NotesUIWorkspace
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim uidoc As NotesUIDocument
    Dim view As NotesView
    Dim entry As NotesViewEntry

    (Initialize)
    Set session = New NotesSession
    Set ws = New NotesUIWorkspace
    Set db = session.CurrentDatabase

    Set uidoc = ws.CurrentDocument
    Set doc = uidoc.Document

    (Click)
    Sub Click(Source As Button)
    Dim new_value As Variant

    Set view = db.GetView( "temp1" )
    Call view.Refresh
    new_value = ws.PickListStrings(3, False, db.Server, db.FilePath, "temp1", "Выбор кода сотрудника", "Выберите код сотрудника:", 1)
    If Not Isarray(new_value) Then Exit Sub

    doc.code = new_value(0)
    Set view = db.GetView( "temp1" )
    Set entry = view.GetEntryByKey(doc.code(0), True)
    doc.name = entry.Document.name(0)

    Call uidoc.Refresh

    End Sub
    </code>


    После этого, "можно сформировать View по документам Формы2 так, чтобы вместо Кода сотрудника отображалось его имя из Формы1?". ;)
     
  10. GROMILA

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    Спасибо за код, но он для моей задачи особого смысла не имеет, если я не решу две проблемы:
    1. проблему обновления поля NAME в "temp2" при изменении поля NAME в форме "temp1". По условию задачи поле NAME должно меняться, понимаете? Как это реализовать, если по-вашему построить?
    2. есть некоторые формы типа "temp1", поля которых ну так мешают в "temp2", а их просто нужно для удобства один раз отобразить в одном частном случае вместе с полями "temp2". Не буду же я их туда перекидывать.
    Вот в этом случае #2 я и спрашивал про ПАПКИ.
     
  11. nor

    nor Гость

    Привет, Gromila.
    Не против, если я тебя на "ты" буду называть?

    Твои проблемы можно решить без всяких папок.

    1. проблема обновления поля NAME в "temp2" при изменении поля NAME в форме "temp1": поле name в "temp2" нужно сделать Computed с кодом @DbLookup( "Notes":"NoCache" ; "":"" ; "temp1" ; code; 2). Я смоделировал твою ситуацию - обновление работает как часы.

    2. решение проблемы номер 2: согласно моему коду, приведенному выше, обеспечивается однозначное соответствие между именем сотрудника и его кодом. Поэтому, если в форме "temp2" у нас хранится уникальная информация о сотруднике, можно использовать ее для выборки информации из ВСЕЙ бд, которая сопоставлена для данного сотрудника, не зависимого от того, в каких формах она хранится и в каких представлениях она отображается. Папки не нужны. Для этого необходимо создать скрытые Computed поля с аналогичным кодом пункта 1. Если кто-то придумает решение проблемы втоей по-другому, мне будет весьма интересно. Еще раз, .nsf - это НЕреляционная БД, плюсы и минусы этого аспекта были изложены на сотнях страниц многочисленной литературы. Поэтому некоторая избыточность данных в документах будет присутствовать. Работая с .nsf, нужно четко понимать ее положительные и отрицательные стороны. Однако Domino поддерживает работу с реляционными бд, поэтому при желании их можно использовать в качестве хранилища данных, а станции Lotus можно использовать в качестве front-end clients.


    В данном случае, хочу отметить, что уважаемый Vagor.ini ввел тебя в заблуждение фразой "Существуют папки, где ты можешь задавать условия отбора документов, в том числе и из разных форм". Как мы все знаем, в папках нельзя создавать условия отбора документов методом Select. В папки можно только ПОМЕЩАТЬ документы при помощи действий конечного пользователя либо посредством скрипта (агента). Возможно Vagor.ini оговорился или имел ввиду что-то другое, недоступное моему пониманию.
     
  12. Veselinka

    Veselinka Гость

    >1. проблема обновления поля NAME в "temp2" при изменении поля NAME в форме "temp1": поле name в "temp2" >нужно сделать Computed с кодом @DbLookup( "Notes":"NoCache" ; "":"" ; "temp1" ; code; 2). Я смоделировал твою >ситуацию - обновление работает как часы.

    При использовании данного подхода - синхронизация полей произойдет только при открытии и пересохранении документа по форме temp2, а это не всегда удовлетворительно. Этот документ может еще месяц не будет никем пересохранен и данные будут рассинхронизованы.

    Поэтому, Уважаемый громила:
    На событии querySave или postSave формы, в которой инициируется изменение синхронизуемых полей, пишется код, который находит соответствующий документ и вносит в него изменения.

    Тут надо
    1. Сделать проверку - на то что вообще что-то изменилось - то есть при открытии формы запомнить в глобальные переменные то что было и при сохранении синхронизовать только если изменение имело место
    2. Надо понять маску прав доступа текущего пользователя. Он может быть не имеет права на модификацию 2-го документа, хотя модифицирует первый. В этом случае пишется агент, которому передается текущий сохраняемый
    документ по NoteID call agent.RunOnServer(source.document.noteid). Запущенный из под админа на сервере агент сможет модифицировать нужный документ и синхронизовать поля. Надо однако отметить что для запуска агента на сервере подойдет только событие PostSave, потому что в querySave докуент еще не сохранен в бакэнде и новые значения его полей не будут доступны агенту.
     
  13. Vagor.ini

    Vagor.ini Гость

    Возможно, фраза построена неправильно, я знаю, что не папки отбирают документы, а в папки отбирают (агенты, скрипты...)
    Все равно спасибо за уточнение!
     
  14. nor

    nor Гость

    Veselinka, я с тобой полностью согласен!
    Идея изменения связанного документа по обытию сохранения текщего у меня возникла уже после того, как я только-только написал сво предыдущее сообщение и выключил комп! :unsure:

    GROMILA, если у тебя возникнут проблемы с написанием кода - обращайся! поможем обязательно! Но я думаю тебе и самому уже интересно покопаться в этой задачке. ;).
     
  15. mony_id

    mony_id Гость

    ВО народ расписался! Здорово!!!

    Думаю что можно решить проблему следующим путем:

    В документе можно использовать встроенный вид. И этот вид ..... он работает как в реляционных базах данных подчиненные таблицы. условия отбора просты код стотрудника и починенный код долны быть равны, причем неважно какое это значение текст или цифра.
    Самое главно можноо добиться отбора всех связанных документов в этом виде и только для данного сотрудника.
    Прошу обратить на это внимание.
     
  16. GROMILA

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    mony_id

    Приведи пожалуйста условие SELECT для подчиненного View!!!
     
  17. Veselinka

    Veselinka Гость

    Mony_id, ты решаешь не ту задачу :p
     
  18. mony_id

    mony_id Гость

    а его и делать то нечего.
    на днях отправлю базу на всеобщее обозрение.
     
  19. nor

    nor Гость

    не понимаю, зачем embedded view?
    по-моему это будет немного не то, хотя я конечно могу ошибаться...
     
  20. Dimon

    Dimon Гость

    Приведствую
    У меня вопрос.
    На сервере крутится база, с ней работают клиенты.
    Локально я подготовил новую форму которая должна "влиться" в базу на сервере(не наследуя ни каких записей).
    Как дела обстоят с View?
    Возможные действия:
    Я должен с базы на сервере сделать репликацию к себе?
    Можно ли будет "грубо" скопировать форму в базу на сервере? A View(соблюдая имена)?
    Я просто понятия не имею как это делать. :ph34r:
    Да... и могу ли менять дизайн. и какими путями
    Спосибо.
     
Загрузка...

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