Не удается создать "ответы" на "документ" (заявка)

Тема в разделе "Lotus - Программирование", создана пользователем LordLeo, 3 июн 2008.

  1. LordLeo

    LordLeo Гость

    Создание потомков заявки реализуется в коде кнопки "Принять заявку", находящуюся в заявке.
    Не могу понять почему возникает ошибка, и как ее исправить.

    Ниже приведен код кнопки "Принять заявку", которая
    - заполняет некоторые поля заявки-родителя
    - создает потомков (в цикле)
    - заполняет поля потомков (в цикле).

    При трассировке кода возникает одна ошибка "Notes Error - Specified command is not available from the workspace"
    на строку Set childuidoc=ws.ComposeDocument(server$,file$,"FJobs").

    Без трассировки возникают две другие ошибки (странно, что другие):
    1) "Invalid or nonexistent document"
    2) "Unable to find Document Window"
    На какой строке кода они возникают я не могу сказать, так как при трассировке возникает другая выше приведенная ошибка.

    Примечание: раза два все таки создались потомки (с тем же кодом без изменении) в промежутках между запусками с ошибками.
    [codebox]
    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim childuidoc As NotesUIDocument
    Set uidoc=ws.CurrentDocument
    server$="Server/Organization"
    file$="struct.nsf"
    'Если не выбраны исполнители вывести предупреждение
    If uidoc.FieldGetText("Performers")="" Then
    Msgbox {Поле "Все исполнители" пустое},16,"Ошибка"
    'в противном случае принять заявку, создать потомки
    Else
    If uidoc.EditMode=False Then ws.EditDocument(True) 'перевести в режим редактирования
    'заполняются поля
    uidoc.Save
    i=1
    'количество витков цикла Do равно количеству исполнителей
    Do While(i<=uidoc.FieldGetText("perCount"))
    'здесь выплывает ошибка при трассировке
    Set childuidoc=ws.ComposeDocument(server$,file$,"FJobs")
    If childuidoc.EditMode=False Then ws.EditDocument(True)
    currentperf=uidoc.FieldGetText("Performers")
    Call childuidoc.FieldSetText("Performer",currentperf)
    childuidoc.Save
    childuidoc.Close
    i=i+1
    Loop
    uidoc.Close
    End If
    End Sub[/codebox]
     
  2. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    для выявления ошибок используй конструцию try catch
    типа
    Код (Text):
    объявление переменных
    try:
    on error goto catch

    ..выполняемый код

    exit sub 'exit function
    catch:
    print err, error, erl 'где err - номер ошибки, error - описание ошибки, erl - строка в коде с ошибкой
    resume next ' если предполагается продолжить выполнение кода после ошибки со следующей строки за строкой с ошибкой
    или
    exit sub 'exit function ' или выход из процедуры/функции
    exit sub 'exit function
    если делаются ответы, то нужно для каждого ответа делать call childuidoc.document.makeresponce(uidoc.document), иначе это будут просто документы, а ответы на родитель..
    а вообще использовать ui (ws.ComposeDocument) для создания ответов это какой-то изврат..
    лучше сделать так, вместо цикла do -- loop
    Код (Text):
    dim i as integer
    for i = 1 to cint(uidoc.document.getitemvalue("perCount")(0)) ' если в perCount число, то cint() не нужен
    ' декларацию dim childuidoc ранее уборать
    dim childuidoc as new notesdocument(uidoc.document.parentdatabase)
    call childuidoc.makeresponce(uidoc.document)
    call childuidoc.replaceitemvalue("Form","FJobs")
    call childuidoc.replaceitemvalue("Performer",uidoc.document.getitemvalue("Performers")(0))
    call childuidoc.save(true,false)
    next
     
  3. LordLeo

    LordLeo Гость

    Я поменял код: потомки создаются, НО создаются по форме родителя ("FRequest"), когда должны создаваться по своей форме ("FJobs"), хотя я явно присваивал свойству "Form" название формы.

    Вопрос: что надо поменять, чтобы потомки создавались по форме "FJobs"?

    Ниже привожу измененный код:
    [codebox]Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim db As notesdatabase
    Dim uidoc As NotesUIDocument
    Dim childdoc As NotesDocument
    Set uidoc=ws.CurrentDocument
    Set db=uidoc.document.parentdatabase
    'Если не выбраны исполнители вывести предупреждение
    If uidoc.FieldGetText("Performers")="" Then
    Msgbox {Поле "Все исполнители" пустое},16,"Ошибка"
    'в противном случае принять заявку, создать потомки
    Else
    If uidoc.EditMode=False Then ws.EditDocument(True)
    Call uidoc.FieldSetText("Status","Принята")
    Call uidoc.FieldSetText("ReqID",Cstr(GetReqID))
    Call uidoc.FieldSetText("TakeTime",Cstr(Now))
    uidoc.Save
    perCount=uidoc.FieldGetText("perCount")
    uidoc.Close
    For i=1 To perCount
    Set childdoc=New notesdocument(db)
    Call childdoc.MakeResponse(uidoc.document)
    childdoc.Form="FJobs" 'явно присвоил имя формы
    currentperf=uidoc.FieldGetText("Performers")
    childdoc.performer=currentperf
    Call childdoc.save(True,False)
    Next
    End If
    End Sub[/codebox]
     
  4. johny

    johny Гость

    а в свойствах формы FJobs указано что это респонс?
     
  5. LordLeo

    LordLeo Гость

    да указано.
     
  6. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    В коде, скорее всего, менять ничего не надо. Проблема в другом месте. Может Form Formula стоит. Посмотри в документе чему равно поле Form.
     
  7. LordLeo

    LordLeo Гость

    Заново протрассировал код, выполняя следующие действия:
    1) Открыл заявку, указал исполнителей.
    2) Нажал кнопку "Принять заявку"
    3) При нажатии кнопки создаются и сохраняются потомки-ответы. Видно, что
    + свойство "Form" приравнялось "FJobs"
    + поле родителя скопировалось в поле потомков
    -- при определении свойства "Form" поля формы "FJobs" не добавились в раздел Items (при трассировке). Почему? Хотя после, при открытии потомков видно, поля формы "FJobs" все таки добавились
    4) При открытии потомков в событии "PostOpen" выплывает ошибка "Type mismatch" (не соответствие типа) на строку
    "If parent.GetItemValue("StartTime")="" Then Call parent.ReplaceItemValue("StartTime",source.FieldGetText("MiniBeginTime"))"
    Поля StartTime и MiniBeginTime имеют формат Date/Time (Computed).
    Второй параметр (значение поля MiniBeginTime) функции ReplaceItemValue попытался преобразовать в текст (с помощью Cstr) не помогло. Что не правильно в этой строке кода?
    5) В Форме "FJobs", соответствующей документам-потомкам отметил галочку на "Formulas inherit values from selected document" (наследование полей). Но при открытии потомков видно, что поля, которые должны были наследовать значения полей родителя пусты. Примечание: имена этих полей потомков и родителя идентичные. Почему так происходит?
    6) Я создал представление, которое отображает документы всех форм, где есть колонка, показывающая какой форме соответствует документ. Так вот, созданные потомки в этом представлении отображаются под формой родителя "FRequest", хотя если их открыть, при трассировке видно, что свойство Form="FJobs"
     
  8. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Потому что и не должны. Почитай про ComputeWithForm.

    Сравнение массива со строкой.

    Потому что для наследования значений должен быть выделен документ от которого нужно наследовать значения.

    Form Formula есть?
     
  9. LordLeo

    LordLeo Гость

    Как узнавать пустое ли поле, типа Date/Time? Сравнивать с null?
    Form Formula- это где?
     
  10. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    В представлении.
     
  11. LordLeo

    LordLeo Гость

    Если имеешь ввиду, что отображает представление "Заявки", то я указал следующую формулу:
    SELECT Form="FRequest" | Form="FJobs"

    Medivic, ты говоришь "Потому что для наследования значений должен быть выделен документ от которого нужно наследовать значения." Согласно твоему высказыванию, что я должен изменить в коде, приведенном в первых постах?
     
  12. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    If parent.GetItemValue("StartTime")(0)=""

    Я говорю о Form Formula, которая идет пунктом ниже после формулы отбора.

    Ничего. Просто допиши, чтобы необходимые значения копировались.
     
  13. K-Fire

    K-Fire Гость

    LordLeo, попробуй перекомпоновать код.
    Т.е. сначала создай документ, все поля заполни как надо, сохрани его, а только потом сделай MakeResponse и снова сохрани.

    На форме "Formulas inherit values from selected document" убери, эта опция при твоем способе создания чайлда не нужна вообще.
     
  14. LordLeo

    LordLeo Гость

    - Form Formula пустое:ph34r: А какой код там должен быть?
    - Имеешь ввиду явно копировать все необходимые поля с родителя в потомок?
    childdoc.Название_поля=uidoc.FieldGetText("Название_поля")
    ...
    То есть, в методе создания потомков с помощью notesdocument, а не notesuidocument настройка формы потомка "Formulas inherit values from selected document" не помогает? Учитывая, что "Потому что для наследования значений должен быть выделен документ от которого нужно наследовать значения".
     
  15. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    IsDate()
     
  16. LordLeo

    LordLeo Гость

    Не удается скопировать часть поля Performers в поле Performer.

    Значение поля Performers заполняется с помощью формулы:
    choice:=@Trim(@PickList([Custom] ; server: file; view; title; prompt; column));
    Пользователь может выбрать несколько значений. Согласно справке @PickList возвращает "Text list" (текстовый список).
    В настройках поля Performers я отметил "Allow multiple values" и "Display separate values with New Line".

    Использовал индексы childdoc.Performer=uidoc.Performers(i). Выдает ошибку "Несоответствие типов"
    Так же пытался так:
    begin=1
    For i=1 To perCount
    currentperf=Left(Performers,Instr(Begin,Performers,Chr(13))-1)
    Begin=Instr(Begin,Performers,Chr(13))+2
    childdoc.performer=currentperf
    Next
    Но в полях "Performer" всех потомков копируется первый исполнитель, указанный в поле родителя.

    Вопрос: Каким методом извлекать по частям данные из поля Performers?
     
  17. LordLeo

    LordLeo Гость

    В общем, теперь потомки заявки-родителя правильно создаются и заполняется то, что надо, кроме:
    1) Не решена приведенная в предыдущем посте проблема с извлечением по частям
    2) Когда исполнитель первый раз открывает свою завку-потомок, заполняются несколько полей потомка, и один раз поле родителя. Все это правильно выполняется. НО, как я открываю любой потомок-заявку, он проподает из представления "Заявки" и представления "Все документы" (где отображаются все документы, с указанием их формы).
    И почему-то потомки в представлении "Все документы" когда отображаются, отображаются в со значением формы в колонке "FRequest", хотя состав полей потомков полностью соответствуют требуемой форме "FJobs". Почему?

    Посоветуйте, как решить эти две проблемы:)
     
  18. LordLeo

    LordLeo Гость

    Кто-нибудь помочь может?
     
  19. Dikobraz Grey

    Dikobraz Grey Гость

    Код (Text):
    forall perf in uidoc.Document.Performers
    childdoc.Performer=perf
    end forall
     
  20. LordLeo

    LordLeo Гость

    Первый вопрос я решил таким способом:
    Performers=uidoc.FieldGetText("Performers")
    Performers=Split(Performers,Chr(13)+Chr(10))

    For i=1 To perCount
    ...
    childdoc.performer=Performers(i-1)
    ...
    Next

    Поле оказывается имело тип значение "строка" (формировалось с помощью PickList).
    А я пытался извлекать данные как из списка (массива).

    Второй вопрос пока решить не могу.
     
Загрузка...

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