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

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

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

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

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

Нужно имитировать нажатие кнопки

  • Автор темы T1000
  • Дата начала
Статус
Закрыто для дальнейших ответов.
T

T1000

День добрый!

Задачка вроде бы кажется простой, но что-то не получается её решить. Заключается в следующем: Есть 2 базы "БД_1" и "БД_2". В "БД_1" нажимаем на кнопку сохранить документ(в этом документе есть UNID документа в "БД_2"), и мы должны закрыть окно документа из "БД_1", перейти в документ из "БД_2" и эмитировать нажатие кнопки редактировать в этом документе.

У меня только получается открыть документ в "БД_2" и закрыть документ в "БД_1", а вот скрипт по кнопочке не выполняет\не запускается\вобщем не работает.

Подскажите плз какие-нибудь пути решения. Если надо могу написать то, что уже перепробовал.
 
N

nvyush

T1000
Если на кнопке редактирования только перевод документа в режим редактирования, то выполнить на LS uidoc.EditMode = True, где uidoc - документ из второй базы. Если что-то более сложное, то код вынести в агента или продублировать в первой базе с соответствущей докруткой. Исходных данных для более исчерпывающего ответа недостаточно.
 
T

T1000

Код на кнопке более сложный, чем просто перевести документ в режим редактирования. Пробовал программно запускать агент. Пишет, что отработал, но реальных изменений нет. Код кнопки:
Код:
	Dim ws As New NotesUIWorkspace
Dim uidoc As notesuidocument
Dim doc As NotesDocument

Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document

uiDoc.EditMode=True 
Call doc.ReplaceItemValue("Time1",Now)
Call doc.ReplaceItemValue("Time2",Now)
Call uidoc.FieldSetText("Date",Cstr(Today))
Call uidoc.FieldSetText("Time3",Cstr(Now))
Call uidoc.FieldSetText("par1","1")
Call uidoc.FieldSetText("par2","")
Call uidoc.FieldSetText("par3","") 
Call uidoc.Refresh
Весь напряг с моей точки зрения из-за того что поля во втором документе изменяются при открытом документе с последующим отрефрешиванием. Если эти поля просто изменить, получив документ по UNID, то может получится, что человек выйдет просто из документа и тогда эти изменения надо будет как-то отменять.
 
H

hosm

Почему вариант с editMode=True и [returnNotesUIDocument] не подходит:
Set notesUIDocument = notesUIWorkspace.EditDocument( [editMode] , [notesDocument] , [notesDocumentReadOnly] , [documentAnchor$] , [returnNotesUIDocument] , [newInstance] )
Parameters
editMode
Boolean. Optional. Specify True (default) to open the document in Edit mode. Specify False to open the document in Read mode or to put the document in the given Edit mode.
notesDocument
NotesDocument. Optional. Opens the specified document instead of the currently selected document.

Добавлено: пробовали?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Почему бы все твои действия не делать в бекэнде, а пользователю уже светить результат работы?
У меня подобное реализовано именно так....
Пользователь жмет на кнопку.... в бекэнде часть документа копируется в новую базу.... затем модифицируется по определенным алгоритмам... и в итоге пользователю открывается то что он хотел увидеть. все работает четко
Вопрос с отменой изменений можно решить, к примеру, созданием копии документа на момент открытия документа... ну или же просто сохранением нужных полей в переменные
 
T

T1000

2OKEN
Я не совсем Вас корректно понял
Код:
		  ' это код в БД_1 на вытаскивание документа из БД_2
If uidoc.Document.OtherBaseUNID(0)<>"" Then
Set odb=s.GetDatabase("","БД_2")
Set odoc=odb.GetDocumentByUNID(doc.OtherBaseUNID(0))

Call ws.EditDocument(False, odoc)
End If
Вы про это хотели мне сказать?
 
N

nvyush

2OKEN
Я не совсем Вас корректно понял
Код:
		  ' это код в БД_1 на вытаскивание документа из БД_2
If uidoc.Document.OtherBaseUNID(0)<>"" Then
Set odb=s.GetDatabase("","БД_2")
Set odoc=odb.GetDocumentByUNID(doc.OtherBaseUNID(0))

Call ws.EditDocument(False, odoc)
End If
Вы про это хотели мне сказать?
Про Call ws.EditDocument(True, odoc)
P.S.
Кстати, обновления полей в Вашем случае можно вставить в обработку события Postmodechange, тогда на кнопке Edit в базе 2 будет только Source.EditMode = True, а в базе 1 uidoc.EditMode = True
 
K

KFire3

T1000, код который выполняется на кнопке "Редактировать" нужно перенести в PostOpen формы. То что его сделали на кнопке это неправильный подход.
Естественно в PostOpen надо проверить режим открытия документа, if uidoc.Editmode = true then ...

Ну а дальше все очень очень просто. Открываете ваш 2й док сразу в режиме редактирования Call ws.EditDocument(True, odoc)

PS. Более того, куча полей Time1, Time2, Time3, Date в которые попадает текущее время - это тоже несколько перебор.
Зачем они вообще нужны? Дальше 3 поля флага, устанавливаются жестко без всяких условий, они тоже нужны ли вообще в коде? Может просто дефолтными значениями установить поля?
 
H

hosm

да.
сразу пытаться открыть документ в режиме редактирования, вернув его uidocument, код заполнения продублировать после открытия в режиме редактирования (через uidocument или в postopen). Не факт, что это сильно хорошо, но можно.
Если задача позволяет, то имхо, лучше в postopen.
 
T

T1000

2KFire3
В PostOpen это не делается, так как документ в "БД_2" может быть открыт сам по себе, а не обязательно из "БД_1".
2nvy сейчас попробую с True
2TIA и Ваш метод попробую :rolleyes:
 
K

KFire3

2KFire3
В PostOpen это не делается, так как документ в "БД_2" может быть открыт сам по себе, а не обязательно из "БД_1".
2nvy сейчас попробую с True
2TIA и Ваш метод попробую :rolleyes:

Стоп, стоп. Вы писали:
мы должны закрыть окно документа из "БД_1", перейти в документ из "БД_2" и эмитировать нажатие кнопки редактировать в этом документе.
Т.е. эта кнопка "Редактировать" используется по своему прямому назначению, т.е. пользователь редактирует по ней документ, неважно откуда он открывает его, из БД_1 или БД_666.

Короче, я все веду к тому, что логика в вашем коде с большой вероятностью неправильная. Вы пытаетесь этими странными присваиваниями сделать что-то что нужно делать по-другому. Как результат первоначальной ошибки, у вас пошли хвосты, приходится извращаться там, где в этом нет никакой необходимости. Это, кстати, одна из самых типичных проблем в программировании.

Я конечно могу быть неправ полностью, так что если что извиняюсь :)
 
S

susinmn

почему нельзя перед открытием документа прописать туда все, что нужно?

Call doc.ReplaceItemValue("Time1",Now)
Call doc.ReplaceItemValue("Time2",Now)
Call doc.ReplaceItemValue("Date",Cstr(Today))
Call doc.ReplaceItemValue("Time3",Cstr(Now))
Call doc.ReplaceItemValue("par1","1")
Call doc.ReplaceItemValue("par2","")
Call doc.ReplaceItemValue("par3","")

и открыть документ?
Call ws.EditDocument(True, doc)
 
T

T1000

Коменты всех выступающих натолкнули меня на следующую мысль. Прилагаю сей результат:
Код:
						' код в БД_1
If uidoc.Document.OtherBaseUNID(0)<>"" Then ' тут надо сделать переход в кэтмэновскую базу
Set odb=s.GetDatabase("","БД_2")
Set odoc=odb.GetDocumentByUNID(doc.OtherBaseUNID(0))

Call ws.EditDocument(True, odoc)

Set ouidoc=ws.CurrentDocument
Set odoc=ouidoc.Document
Call odoc.ReplaceItemValue("Time1",Now)
Call odoc.ReplaceItemValue("Time2",Now)
Call ouidoc.FieldSetText("Date",Cstr(Today))
Call ouidoc.FieldSetText("Time3",Cstr(Now))
Call ouidoc.FieldSetText("par1","1")
Call ouidoc.FieldSetText("par2","")
Call ouidoc.FieldSetText("par3","") 
Call ouidoc.Refresh
End If

Call uidoc.Close
таким образом я сохраняю и закрываю документ в БД_1, произвожу необходимые изменения в документе БД_2 согласно скрипту на кнопке и спокойно продолжаю работать с этим документом.
 
N

nvyush

почему нельзя перед открытием документа прописать туда все, что нужно?
Если логика приложения правильная (хотя есть сомнения), то следует сделать так:
В форму документа добавить обработку события
Код:
Sub Postmodechange(Source As Notesuidocument)
If Source.EditMode Then
Dim doc as NotesDocument
Set doc = Source.Document
Call doc.ReplaceItemValue("Time1",Now)
Call doc.ReplaceItemValue("Time2",Now)
Call doc.ReplaceItemValue("Date",Cstr(Today))
Call doc.ReplaceItemValue("Time3",Cstr(Now))
Call doc.ReplaceItemValue("par1","1")
Call doc.ReplaceItemValue("par2","")
Call doc.ReplaceItemValue("par3","") 
End If
End Sub
А документ в БД1 открывать так
Код:
Set uidoc = ws.EditDocument(False, doc)
uidoc.EditMode = True
В БД2 в кнопке редактирования оставить только Source.Document.EditMode = True
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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