Help!

  • Автор темы Mitya
  • Дата начала
M

Mitya

#1
Добрый день, подскажите, как решить данную задачу.
Есть «справочники» - документы, на базе которых будут формироваться «основные» документы.
Так вот, как лучше хранить в «основном» документе «справочные» документы?
1-е что пришло в голову:
Вешаем кнопку в «основном» доке, через DialogBox вызываем view «справочников». Создаем дубликаты «справочников» с ключем в Queryclose (DialogBox). В «основном» доке внедряем вид с отбором по ключу.
Но, проблема в удалении дубликатов – пользователи не могут удалять док-ты в базе. =((
2-е:
Вызов вида «справочников» через PickListCollection. Выбранные «справочники» добавлять AppendToTextList в поле «основного» док.
Но, проблемы возникла уже в процессе добавления - приходится переоткрывать "основной" док, чтобы увидеть изменения
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код кнопки</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Click(Source As Button)	
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim dbCur As NotesDatabase
Dim docUi As NotesUIDocument
Dim docCur As NotesDocument
Dim item As NotesItem
Dim myArr (1 To 2) As String

Set dbcur = session.CurrentDatabase
Set docUi = ws.CurrentDocument
Set docCur = docUi.Document

If docCur.HasItem("List3") Then
Set item = docCur.GetFirstItem("List3")
myArr (1) = "Тест 1"
myArr(2) = "Тест 2"
Call item.AppendToTextList(myArr)		
Call docCur.Save(True,False)		
End If	

Call DocUi.Refresh

End Sub
3-я идея на этапе зародыша =)) хранить в "основном" док-те ссылки справочников в ричтекст

+ на базе всего придется строить отчеты, типа... сколько\каких док сформировано на базе N-справочника

куда же податься? :eek:
p.s. пытался найти на openntf.org решение - пока не нашел, может кто-то видел решение данной задачи?
 
M

Mitya

#3
Mitya, путаетесь в показаниях.


Хранение и отображение - 2 большие разницы. Что надо-то?
Да :eek: ... если я правильно понимаю большую разницу, то лучше хранить, чтобы проще делать печатных формы, отчеты, выгрузки и т.д.

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

erdi

Well-known member
20.08.2008
265
17
#4
переделанный твой код, чтобы не переоткрывать док

Код:
	Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim dbCur As NotesDatabase
Dim docUi As NotesUIDocument
Dim docCur As NotesDocument
Dim item As NotesItem
Dim myArr (1 To 2) As String
Dim tmpVal As Variant

Set dbcur = session.CurrentDatabase
Set docUi = ws.CurrentDocument
Set docCur = docUi.Document

tmpVal=docCur.GetItemValue("List3")
myArr (1) = "Тест 1"
myArr(2) = "Тест 2"
Call docCur.ReplaceItemValue("List3",Arrayappend(tmpVal,myArr))

Call DocUi.Refresh
 

Dragon108

Well-known member
19.01.2010
265
0
#5
Но, проблема в удалении дубликатов – пользователи не могут удалять док-ты в базе. =((

Сделай какой-нибудь признак (поле) при "удалении" (считай аннулировании) дока типа Deleted. И по нему скрывай документы во всех представлениях, а ночью пробегайся агентом и по "удаленным" докам и удаляй их.

3-я идея на этапе зародыша =)) хранить в "основном" док-те ссылки справочников в ричтекст
Можно и не в ричтексте, можно хранить массив ссылок - notesDocument.NotesURL - в поле и отображать их в <Computed Value> + Pass Thru HTML на это компьютед велью. (НО есть свои особенности при реализации :eek:- см. прикрепленную базу) + хранить UNID-ы справочников в другом поле в основном доке, что бы ... строить отчеты, типа... сколько\каких док сформировано на базе N-справочника
 

Вложения

M

Mitya

#6
переделанный твой код, чтобы не переоткрывать док

Код:
	Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim dbCur As NotesDatabase
Dim docUi As NotesUIDocument
Dim docCur As NotesDocument
Dim item As NotesItem
Dim myArr (1 To 2) As String
Dim tmpVal As Variant

Set dbcur = session.CurrentDatabase
Set docUi = ws.CurrentDocument
Set docCur = docUi.Document

tmpVal=docCur.GetItemValue("List3")
myArr (1) = "Тест 1"
myArr(2) = "Тест 2"
Call docCur.ReplaceItemValue("List3",Arrayappend(tmpVal,myArr))

Call DocUi.Refresh
Спасибо за помощь, но данный код работает, если поле "List3" имеет тип TEXT, а со LIST данный код не работает
 
M

Mitya

#7
Сделай какой-нибудь признак (поле) при "удалении" (считай аннулировании) дока типа Deleted. И по нему скрывай документы во всех представлениях, а ночью пробегайся агентом и по "удаленным" докам и удаляй их.



Можно и не в ричтексте, можно хранить массив ссылок - notesDocument.NotesURL - в поле и отображать их в <Computed Value> + Pass Thru HTML на это компьютед велью. (НО есть свои особенности при реализации :)- см. прикрепленную базу) + хранить UNID-ы справочников в другом поле в основном доке, что бы ... строить отчеты, типа... сколько\каких док сформировано на базе N-справочника
Спасибо за "хранить UNID-ы справочников" - :eek:

Делать признак - не вариант, пользовать может накидать "справочников", удалить, опять накидать... не красиво

Мне еще интересен сам механизм добавления, удаления "справочных" док - не имея прав на удаления док из базы.

Может были такие темы на форуме - ткните... а то, я не знаю что в "поиске" и написать.
 

savl

Lotus team
28.10.2011
2 131
102
#8
Мне еще интересен сам механизм добавления, удаления "справочных" док - не имея прав на удаления док из базы.
Самое простое:
В представлении где отображаются "справочники", изменить формулу отбора документов.
К текущей твоей добавить { & Deleted = "" }, без фигурных скобок :eek:
сделать кнопку "удалить", которая прописывает в документ: Deleted = "1"
 

Dragon108

Well-known member
19.01.2010
265
0
#9
Мне еще интересен сам механизм добавления, удаления "справочных" док - не имея прав на удаления док из базы.
Запускай агента на сервере Agent.RunOnServer (агент должен быть подписан учеткой, которая может имеет права на удаление и изменение документов в бд).
 
A

alexas

#10
Спасибо за "хранить UNID-ы справочников"
Можно хранить названия документов вместе юнидами (как alias). Соответственно показывать это поле в ListBox (Названия документов) и кнопкой открывать док по соотв. ему UNUD (alias выбранной строки).
1 ListBox заменит EmbeddedView
2 Просто удалять "ненужный" док из списка
3 Нет необходимости делать дубликаты доков

Но лучше добавлять отобранные "справочные документы" в приватную папку, ее и внедрить в "основной" док.
 
M

Mitya

#11
Спасибо ВСЕМ за советы! :gifts:

Решил сделать так:
В доке 3 поля "DirectoryUNID" (Text), "DirectoryText" (Text), "DirectoryList" (ListBox)= "DirectoryText"
Кнопка "Добавить" заносит значения в поля "DirectoryUNID","DirectoryText" -> Refresh CurDOc
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Кнопка "Удалить запись"</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim curdoc As NotesDocument
Dim tmpArr As Variant 	
Dim i As Integer
Dim ArrText() As String
Dim ArrUNID() As String

Set uidoc = ws.CurrentDocument
Set curdoc = uidoc.Document

tmpVal = curdoc.GetItemValue("DirectoryText")	
i= Arraygetindex(tmpVal,curdoc.DirectoryList(0))

Redim ArrText(Ubound(curdoc.DirectoryText))
Redim ArrUnid(Ubound(curdoc.DirectoryUNID))
For x=0 To Ubound(curdoc.DirectoryText)
ArrText(x)=curdoc.DirectoryText(x)
Next
For x=0 To Ubound(curdoc.DirectoryUNID)
ArrUNID(x)=curdoc.DirectoryUNID(x)
Next

ArrText(i)=""
ArrUNID(i) =""
Call curdoc.ReplaceItemValue("DirectoryText",ArrText)
Call curdoc.ReplaceItemValue("DirectoryUNID",ArrUNID)
Call uidoc.Refresh	
End Sub
Все работает! Но... как-то :maybe:
Стоит что-то менять в данной реализации?
 

savl

Lotus team
28.10.2011
2 131
102
#12
ммм, вот так наверное лучше:
И массивы всегда должны быть одного размера. Попробуйте на тестовой системе.
Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim curdoc As NotesDocument
Dim i As variant
Dim ArrText As Variant
Dim ArrUNID As Variant

Set uidoc = ws.CurrentDocument
Set curdoc = uidoc.Document

i= Arraygetindex(curdoc.GetItemValue("DirectoryText"),curdoc.GetItemValue("DirectoryList")(0))
if isNull(i) then exit sub

ArrText = curdoc.GetItemValue("DirectoryText")
ArrUnid = GetItemValue("DirectoryUNID")

ArrText(i)=""
ArrUNID(i) =""
Call curdoc.ReplaceItemValue("DirectoryText",Fulltrim(ArrText))
Call curdoc.ReplaceItemValue("DirectoryUNID",Fulltrim(ArrUNID))
Call uidoc.Refresh	
End Sub
 

erdi

Well-known member
20.08.2008
265
17
#13
я бы вместо 2-х полей "DirectoryUNID" и "DirectoryText" сделал 1 поле - DirectoryText, а значения этих полей разделил бы, например символом "#"(unid#text). В поле DirectoryList формула @Transform(DirectoryText;"x";@Word(x;"#";1)).
когда все работает в автомате, то код нормально ходит по 2, 3....n полям, а вот когда что-то изменить приходится вручную и в каком-то поле изменил(удалил) значение, а в другом забыл или не знал про него, в случаи чужого кода, то тогда начинаются ошибки по разным индексам, текст почему съезжает и несоответствует и т.д.