• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы 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]
 
K

Kee_Keekkenen

для выявления ошибок используй конструцию 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
 
L

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]
 
J

johny

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
В коде, скорее всего, менять ничего не надо. Проблема в другом месте. Может Form Formula стоит. Посмотри в документе чему равно поле Form.
 
L

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"
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
-- при определении свойства "Form" поля формы "FJobs" не добавились в раздел Items (при трассировке). Почему?
Потому что и не должны. Почитай про ComputeWithForm.

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

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

Я создал представление, которое отображает документы всех форм, где есть колонка, показывающая какой форме соответствует документ. Так вот, созданные потомки в этом представлении отображаются под формой родителя "FRequest", хотя если их открыть, при трассировке видно, что свойство Form="FJobs"
Form Formula есть?
 
L

LordLeo

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

LordLeo

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

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Как узнавать пустое ли поле, типа Date/Time? Сравнивать с null?
If parent.GetItemValue("StartTime")(0)=""

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

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

K-Fire

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

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

LordLeo

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

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?
 
L

LordLeo

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

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

LordLeo

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

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

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

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

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