Создание Response

Тема в разделе "Lotus - Программирование", создана пользователем Hedg, 7 сен 2006.

Статус темы:
Закрыта.
  1. Hedg

    Hedg Гость

    Вообщем потребовалось создать Response документ который содержит историю открытия документа-родителя. Проблема в том, как я понял, MakeResponse работает только в Back-end'e, а мне нужно повесить создаение Response и запись в него значений на QueryOpen документа-родителя, а это уже Front-end. Кто что посоветует?
     
  2. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Hedg

    А чё тут посоветовать: создаешь документ ответа и фсё. Только поля ручками придется копировать, если таковые имеются.
     
  3. Hedg

    Hedg Гость

    Вообщем наваял я тут код который работает. Но выглядит он ховайся в жито.

    Код (Text):
    Sub Postopen(Source As Notesuidocument)
    Dim session As New NotesSession
    Dim workspace As New NotesUIWorkspace
    Dim docA As NotesUIDocument
    Dim docA2 As NotesDocument
    Dim docB As NotesDocument
    Dim creator As String
    Dim number_doc As String
    Dim user As String
    Dim db As NotesDatabase
    Dim accessDate As Variant
    Dim ID As String

    Set db = session.CurrentDatabase
    Set docA = workspace.CurrentDocument

    user = session.UserName
    Messagebox user
    creator=docA.FieldGetText("Creator")
    number_doc=docA.FieldGetText("Номер")

    Set docA2=docA.document
    accessDate = docA2.LastAccessed
    ID = docA2.UniversalID

    Set docB = New NotesDocument ( db )
    docB.Form = "Invoice_Hystory"

    Call docB.ReplaceItemValue("$Ref", ID)
    Call docB.ReplaceItemValue("Creator", creator) 
    Call docB.ReplaceItemValue("number_document", number_doc)
    Call docB.ReplaceItemValue("readers", user+";")
    Call docB.ReplaceItemValue("open_time", Cstr(accessDate))
    Call docB.Save( True, True )

    End Sub
    Но он создаёт каждый раз новый документ, а не дописывает в старый.
    И ещё какие будут предложения по его привидению в нормальный вид.
     
  4. Hedg

    Hedg Гость

    Хождение по мукам часть 2

    Код (Text):
    Sub Postopen(Source As Notesuidocument)
    Dim session As New NotesSession
    Dim workspace As New NotesUIWorkspace
    Dim docA As NotesUIDocument
    Dim docA2 As NotesDocument
    Dim response As NotesDocument
    Dim creator As String
    Dim number_doc As String
    Dim user As String
    Dim db As NotesDatabase
    Dim accessDate As Variant
    Dim ID As String
    Dim view As NotesView
    Dim dc As NotesDocumentCollection

    Set db = session.CurrentDatabase
    Set docA = workspace.CurrentDocument
    Set view = db.GetView("Response")

    Set docA2=docA.document

    ID = docA2.UniversalID
    accessDate = docA2.LastAccessed
    user = session.UserName
    creator=docA.FieldGetText("Creator")
    number_doc=docA.FieldGetText("ТНомер")

    Set dc = view.GetAllDocumentsByKey(number_doc)
    Set docA2 = dc.GetFirstDocument
    Set response = view.GetChild(docA2)

    If Not (response Is Nothing) Then
    Call response.ReplaceItemValue("readers", user)
    Call response.ReplaceItemValue("open_time", Cstr(accessDate))
    Call response.Save( True, True )

    Else
    Set response= New NotesDocument ( db )         
    response.Form = "Invoice_Hystory"

    Call response.ReplaceItemValue("$Ref", ID)
    Call response.ReplaceItemValue("Creator", creator) 
    Call response.ReplaceItemValue("number_document", number_doc)
    Call response.ReplaceItemValue("readers", user+";")
    Call response.ReplaceItemValue("open_time", Cstr(accessDate))
    Call response.Save( True, True )

    End If
    End Sub

    Вот здесь
    Код (Text):
    Set response = view.GetChild(docA2)
    Получаю Function requires a valid ADT argument
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Может docA2 is Nothing ? :(
     
  6. Hedg

    Hedg Гость

    docA2 всегда есть, а мне нужно найти его потомка GetChild(docA2), если он существует дописать, если его нет то создать. Если брать docA2 is Nothing - то прийдётся идти по всей коллекции и брать респонсы всех доков, а мне нужен респонс конкретного документа, открытого в текущий момен.
    Я не доконца понимаю работу метода GetAllDocumentsByKey - коллекция не создаёться.
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Hedg
    Если коллекция не создается (т.е. создается, но пустая), то docA2 is Nothing. Отсюда и ошибка.
    Метод GetAllDocumentsByKey ищет в первой отсортированной колонке в представленнии по ключу.
    Для получения респонсов есть свойство NotesDocument.Responses. Текущий документ хранится в параметре Source.
     
  8. Hedg

    Hedg Гость

    docA2 не пустой - проверял.
    GetAllDocumentsByKey ищет по ключу, может ли ключём являться значение поля?
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Hedg, если у тебя коллекция пустая, то docA2 тоже будет пустой.
    Может.
     
  10. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Вот тут по-осторожнее. Это свойство безупречно работало в 4.6.х. Потом (не скажу сейчас в какой версии 5-ки или 6-ки) его разломали :( Пришлось от него оотказаться и переписывать уйму рабочих приложений. Недавно (под 6.5.5) проверял - вроде починили. Но осадок остался...
     
  11. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-Constantin A Chervonenko+11:09:2006, 10:05 -->
    <span class="vbquote">(Constantin A Chervonenko @ 11:09:2006, 10:05 )</span><!--QuoteEBegin-->Вот тут по-осторожнее. Это свойство безупречно работало в 4.6.х. Потом (не скажу сейчас в какой версии 5-ки или 6-ки) его разломали mad.gif Пришлось от него оотказаться и переписывать уйму рабочих приложений. Недавно (под 6.5.5) проверял - вроде починили. Но осадок остался...
    [snapback]43569" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Да я и сам почти его не использую. Слишком много проблем. Лучше GetAllDocumentsByKey с UNID в качестве ключа. Гораздо удобнее. :(
     
  12. Hedg

    Hedg Гость

    Блин я жу незнаю что делать

    Код (Text):
    Sub Postopen(Source As Notesuidocument)
    Dim session As New NotesSession
    Dim workspace As New NotesUIWorkspace
    Dim view As NotesView
    Dim dc As NotesDocumentCollection  
    Dim docA2 As NotesDocument
    Dim response As NotesDocument

    Dim creator As String
    Dim number_doc As String
    Dim user As String
    Dim db As NotesDatabase
    Dim accessDate As Variant
    Dim ID As String


    Set db = session.CurrentDatabase
    Set docA2=Source.Document

    ID = docA2.UniversalID
    accessDate = docA2.LastAccessed
    user = session.UserName
    creator=Source.FieldGetText("Creator")
    number_doc=Source.FieldGetText("ТНомер")

    Set view = db.GetView("Таблица\Invoice Facturen")
    Set dc = view.GetAllDocumentsByKey(ID)
    Set docA2=view.GetFirstDocument
    Set response = view.GetChild(docA2)



    If Not (response Is Nothing) Then
    Call response.ReplaceItemValue("readers", user)
    Call response.ReplaceItemValue("open_time", Cstr(accessDate))
    Call response.Save( True, True )
    Messagebox "Документ истории изменён"

    Else
    Set response= New NotesDocument ( db )         
    response.Form = "Invoice_Hystory"

    Call response.ReplaceItemValue("$Ref", ID)
    Call response.ReplaceItemValue("Creator", creator) 
    Call response.ReplaceItemValue("number_document", number_doc)
    Call response.ReplaceItemValue("readers", user+";")
    Call response.ReplaceItemValue("open_time", Cstr(accessDate))
    Call response.Save( True, True )
    Messagebox "Документ истории создан"

    End If
    End Sub
    Коллекция в упор создаётся пустой. Пустой она быть не должна, так как документы существуют и ключём явлется UNID текущего документа.
     
  13. Hedg

    Hedg Гость

    Я что-то не понимаю как работает Set dc = view.GetAllDocumentsByKey(ID), осуществляет поиск в документе по переданному значению. Как оно ищет? Нужно задавать поле в котором искать или метод обходит все поля?
     
  14. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    из хелпа:

    Usage
    For the GetAllDocumentsByKey method to work, you must have at least one sorted column for each key.

    Этот метод ищет документы по первому ОТСОРТИРОВАННОМУ столбцу.
     
  15. Hedg

    Hedg Гость

    Т.е что бы Set dc = view.GetAllDocumentsByKey(ID) отрабатывал правильно, нужно создать представление с формулой отбора документов по форме, первый стобец которого должен отображать, для данного случая, данные из поля которое содержит UNID документа?
     
  16. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Hedg

    да
     
  17. Hedg

    Hedg Гость

    Что-то не работает. Коллекция по прежнему пуста, возможно нужно задавать парметр сортировки.
    GetAllDocumentsByKey(ID) , т.е. ID по чём отбирать, а какое нужно указывать значение для сортировки?
     
  18. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Лишняя сущность - технологическая view. Если еще и сортировка респонсов нужна, то да, удобнее.
     
  19. Hedg

    Hedg Гость

    Да не нужна мне сортировка респонсов, мне нужно дописывать в респонс открытого документа-родителя, а я немогу его найти. По идее должна создаться коллекция из одного документа и от него браться респонс. Но коллекция пустая.
     
  20. Dikobraz Grey

    Dikobraz Grey Гость

    Код (Text):
        Set view = db.GetView("Таблица\Invoice Facturen")
    Set dc = view.GetAllDocumentsByKey(ID)
    Set docA2=view.GetFirstDocument
    Set response = view.GetChild(docA2)
    Насколько я понял нужный тебе документ находится в коллекции dc, а респонс ты пытаешься получить из вьюхи и далеко не факт, что

    Код (Text):
    Set docA2=view.GetFirstDocument
    вернет тебе открытый в данный момент док (он с равным успехом может быть и в конце и в начале, и в середине вьюхи), а возвращаемый документ респонсов может и не иметь...
     
Загрузка...
Статус темы:
Закрыта.

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