Help!

Тема в разделе "Lotus - Программирование", создана пользователем Mitya, 29 май 2013.

  1. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    Добрый день, подскажите, как решить данную задачу.
    Есть «справочники» - документы, на базе которых будут формироваться «основные» документы.
    Так вот, как лучше хранить в «основном» документе «справочные» документы?
    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">
    Код (Text):
    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 решение - пока не нашел, может кто-то видел решение данной задачи?
     
  2. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.020
    Симпатии:
    8
    Mitya, путаетесь в показаниях.
    Хранение и отображение - 2 большие разницы. Что надо-то?
     
  3. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    Да :eek: ... если я правильно понимаю большую разницу, то лучше хранить, чтобы проще делать печатных формы, отчеты, выгрузки и т.д.

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

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    переделанный твой код, чтобы не переоткрывать док

    Код (LotusScript):
        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
     
  5. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0

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

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

    Вложения:

    • TestLinks.rar
      Размер файла:
      26,9 КБ
      Просмотров:
      3
  6. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    Спасибо за помощь, но данный код работает, если поле "List3" имеет тип TEXT, а со LIST данный код не работает
     
  7. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    Спасибо за "хранить UNID-ы справочников" - :eek:

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

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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Самое простое:
    В представлении где отображаются "справочники", изменить формулу отбора документов.
    К текущей твоей добавить { & Deleted = "" }, без фигурных скобок :eek:
    сделать кнопку "удалить", которая прописывает в документ: Deleted = "1"
     
  9. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Запускай агента на сервере Agent.RunOnServer (агент должен быть подписан учеткой, которая может имеет права на удаление и изменение документов в бд).
     
  10. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Можно хранить названия документов вместе юнидами (как alias). Соответственно показывать это поле в ListBox (Названия документов) и кнопкой открывать док по соотв. ему UNUD (alias выбранной строки).
    1 ListBox заменит EmbeddedView
    2 Просто удалять "ненужный" док из списка
    3 Нет необходимости делать дубликаты доков

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

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    Спасибо ВСЕМ за советы! :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">
    Код (Text):
    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:
    Стоит что-то менять в данной реализации?
     
  12. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    ммм, вот так наверное лучше:
    И массивы всегда должны быть одного размера. Попробуйте на тестовой системе.
    Код (LotusScript):
    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
     
  13. erdi

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    я бы вместо 2-х полей "DirectoryUNID" и "DirectoryText" сделал 1 поле - DirectoryText, а значения этих полей разделил бы, например символом "#"(unid#text). В поле DirectoryList формула @Transform(DirectoryText;"x";@Word(x;"#";1)).
    когда все работает в автомате, то код нормально ходит по 2, 3....n полям, а вот когда что-то изменить приходится вручную и в каком-то поле изменил(удалил) значение, а в другом забыл или не знал про него, в случаи чужого кода, то тогда начинаются ошибки по разным индексам, текст почему съезжает и несоответствует и т.д.
     
Загрузка...

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