• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы GROMILA
  • Дата начала
G

GROMILA

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

Спасибо всем.
 
V

Veselinka

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

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

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

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

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

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

Vagor.ini

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

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

GROMILA

Как так? :) Люди!!!!!!!!!!!!!

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

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

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

Vagor.ini

GROMILA
Интересно получается, а если мне понадобится Имя сотрудника заменить?
Это по всем документам БД шарить нужно будет, причем вручную?

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

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

Veselinka

Vagor.ini - прав.

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

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

Veselinka

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

GROMILA

Спасибо за ответы. Особенно Vagor! Хочу у тебя еще раз уточнить.
Существуют папки, где ты можешь задавать условия отбора документов, в том числе и из разных фор
Так получается мне нужно ПАПКАМИ пользоваться в тех случаях, когда мне по ключевому полю нужно
отобразить на экране выборку из нескольких документов, созданных по разным формам?
Я вас правильно понял?
 
N

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?". ;)
 
G

GROMILA

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

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 оговорился или имел ввиду что-то другое, недоступное моему пониманию.
 
V

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 докуент еще не сохранен в бакэнде и новые значения его полей не будут доступны агенту.
 
V

Vagor.ini

В данном случае, хочу отметить, что уважаемый Vagor.ini ввел тебя в заблуждение фразой "Существуют папки, где ты можешь задавать условия отбора документов, в том числе и из разных форм".
Возможно, фраза построена неправильно, я знаю, что не папки отбирают документы, а в папки отбирают (агенты, скрипты...)
Все равно спасибо за уточнение!
 
N

nor

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

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

mony_id

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

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

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

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

GROMILA

mony_id

условия отбора просты код стотрудника и починенный код долны быть равны, причем неважно какое это значение текст или цифра.

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

nor

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

Dimon

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

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