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

Тема в разделе "Lotus - Программирование", создана пользователем T1000, 27 ноя 2009.

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

    T1000 Гость

    День добрый!

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

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

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    T1000
    Если на кнопке редактирования только перевод документа в режим редактирования, то выполнить на LS uidoc.EditMode = True, где uidoc - документ из второй базы. Если что-то более сложное, то код вынести в агента или продублировать в первой базе с соответствущей докруткой. Исходных данных для более исчерпывающего ответа недостаточно.
     
  3. T1000

    T1000 Гость

    Код на кнопке более сложный, чем просто перевести документ в режим редактирования. Пробовал программно запускать агент. Пишет, что отработал, но реальных изменений нет. Код кнопки:
    Код (Text):
        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, то может получится, что человек выйдет просто из документа и тогда эти изменения надо будет как-то отменять.
     
  4. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Почему вариант с editMode=True и [returnNotesUIDocument] не подходит:
    Добавлено: пробовали?
     
  5. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Почему бы все твои действия не делать в бекэнде, а пользователю уже светить результат работы?
    У меня подобное реализовано именно так....
    Пользователь жмет на кнопку.... в бекэнде часть документа копируется в новую базу.... затем модифицируется по определенным алгоритмам... и в итоге пользователю открывается то что он хотел увидеть. все работает четко
    Вопрос с отменой изменений можно решить, к примеру, созданием копии документа на момент открытия документа... ну или же просто сохранением нужных полей в переменные
     
  6. T1000

    T1000 Гость

    2OKEN
    Я не совсем Вас корректно понял
    Код (Text):
              ' это код в БД_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
    Вы про это хотели мне сказать?
     
  7. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Про Call ws.EditDocument(True, odoc)
    P.S.
    Кстати, обновления полей в Вашем случае можно вставить в обработку события Postmodechange, тогда на кнопке Edit в базе 2 будет только Source.EditMode = True, а в базе 1 uidoc.EditMode = True
     
  8. KFire3

    KFire3 Гость

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

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

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

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Да, OKEN про это хотела сказать. Только ещё нюансик:

    Код (Text):
    Set uidoc=ws.EditDocument(TRUE, odoc,,,,FALSE)
    if not uidoc.EditMode then uidoc.EditMode = True
     
  10. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    да.
    сразу пытаться открыть документ в режиме редактирования, вернув его uidocument, код заполнения продублировать после открытия в режиме редактирования (через uidocument или в postopen). Не факт, что это сильно хорошо, но можно.
    Если задача позволяет, то имхо, лучше в postopen.
     
  11. T1000

    T1000 Гость

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    О, KFire3 и TIA уже все сказали )))
     
  13. KFire3

    KFire3 Гость

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

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

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

    susinmn Well-Known Member

    Регистрация:
    16 окт 2007
    Сообщения:
    530
    Симпатии:
    8
    почему нельзя перед открытием документа прописать туда все, что нужно?

    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)
     
  15. T1000

    T1000 Гость

    Коменты всех выступающих натолкнули меня на следующую мысль. Прилагаю сей результат:
    Код (Text):
                            ' код в БД_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 согласно скрипту на кнопке и спокойно продолжаю работать с этим документом.
     
  16. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Если логика приложения правильная (хотя есть сомнения), то следует сделать так:
    В форму документа добавить обработку события
    Код (Text):
    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 открывать так
    Код (Text):
    Set uidoc = ws.EditDocument(False, doc)
    uidoc.EditMode = True
    В БД2 в кнопке редактирования оставить только Source.Document.EditMode = True
     
Загрузка...
Статус темы:
Закрыта.

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