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

  • Автор темы Автор темы LordLeo
  • Дата начала Дата начала
L

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]
 
для выявления ошибок используй конструцию try catch
типа
Код:
объявление переменных
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
Код:
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
 
Я поменял код: потомки создаются, НО создаются по форме родителя ("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]
 
а в свойствах формы FJobs указано что это респонс?
 
В коде, скорее всего, менять ничего не надо. Проблема в другом месте. Может Form Formula стоит. Посмотри в документе чему равно поле Form.
 
Заново протрассировал код, выполняя следующие действия:
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"
 
-- при определении свойства "Form" поля формы "FJobs" не добавились в раздел Items (при трассировке). Почему?
Потому что и не должны. Почитай про ComputeWithForm.

Что не правильно в этой строке кода?
Сравнение массива со строкой.

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

Я создал представление, которое отображает документы всех форм, где есть колонка, показывающая какой форме соответствует документ. Так вот, созданные потомки в этом представлении отображаются под формой родителя "FRequest", хотя если их открыть, при трассировке видно, что свойство Form="FJobs"
Form Formula есть?
 
Как узнавать пустое ли поле, типа Date/Time? Сравнивать с null?
Form Formula- это где?
 
Если имеешь ввиду, что отображает представление "Заявки", то я указал следующую формулу:
SELECT Form="FRequest" | Form="FJobs"

Medivic, ты говоришь "Потому что для наследования значений должен быть выделен документ от которого нужно наследовать значения." Согласно твоему высказыванию, что я должен изменить в коде, приведенном в первых постах?
 
Как узнавать пустое ли поле, типа Date/Time? Сравнивать с null?
If parent.GetItemValue("StartTime")(0)=""

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

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

На форме "Formulas inherit values from selected document" убери, эта опция при твоем способе создания чайлда не нужна вообще.
 
- Form Formula пустое:ph34r: А какой код там должен быть?
- Имеешь ввиду явно копировать все необходимые поля с родителя в потомок?
childdoc.Название_поля=uidoc.FieldGetText("Название_поля")
...
То есть, в методе создания потомков с помощью notesdocument, а не notesuidocument настройка формы потомка "Formulas inherit values from selected document" не помогает? Учитывая, что "Потому что для наследования значений должен быть выделен документ от которого нужно наследовать значения".
 
Не удается скопировать часть поля 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?
 
В общем, теперь потомки заявки-родителя правильно создаются и заполняется то, что надо, кроме:
1) Не решена приведенная в предыдущем посте проблема с извлечением по частям
2) Когда исполнитель первый раз открывает свою завку-потомок, заполняются несколько полей потомка, и один раз поле родителя. Все это правильно выполняется. НО, как я открываю любой потомок-заявку, он проподает из представления "Заявки" и представления "Все документы" (где отображаются все документы, с указанием их формы).
И почему-то потомки в представлении "Все документы" когда отображаются, отображаются в со значением формы в колонке "FRequest", хотя состав полей потомков полностью соответствуют требуемой форме "FJobs". Почему?

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

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

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

Второй вопрос пока решить не могу.
 
Мы в соцсетях:

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