Ls: Азы

Тема в разделе "Lotus - Программирование", создана пользователем Dimok-163rus, 25 июн 2013.

  1. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    Подскажите пжлст как создать копию выбранного(выделенного) документа

    Sub Click(Source As Button)

    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim session As New NotesSession

    Dim db As NotesDatabase
    Dim view As NotesView
    Dim doc As NotesDocument
    Dim item As NotesItem

    Set uidoc = ws.CurrentDocument
    Set pdoc = uidoc.Document
    Set db = session.CurrentDatabase

    ...
    ... :)
    ...

    Exit Sub

    End Sub
     
  2. Darkhan

    Darkhan Lotus team
    Lotus team

    Регистрация:
    14 дек 2012
    Сообщения:
    97
    Симпатии:
    4
    Код (Text):
    Dim copyDoc as NotesDocument
    Set copyDoc = pdoc.CopyToDatabase(db)
     
  3. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Вопрос из серии RTFM.
    Смотри хелп дизайнера.
    Класс NotesDatabase, метод CreateDocument.
    Класс NotesDocument, методы CopyAllItems, CopyToDatabase, ComputeWithForm (это не всегда нужно), Save

    Есть аналогичные классы в Java, только называются иначе: Database и Document, методы там есть.
    Ветка FAQ: http://codeby.net/forum35.html
    С чего начать: http://codeby.net/forum/threads/19433.html
     
  4. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Dim-ok для кнопки в виде:
    Код (Text):
    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uiview As NotesUIView
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim SelectedDocInView As NotesDocument
    Set uiview = ws.CurrentView
    Set db = s.CurrentDatabase
    'получаем док, выделенный в виде (на котором курсор)
    Set SelectedDocInView = db.GetDocumentByID(uiview.CaretNoteID)
    'делаем его копию в ту-же базу  
    Call SelectedDocInView.CopyToDatabase(db)
    'обновляем, что-бы сразу появился в виде
    Call ws.ViewRefresh
    End Sub
    плюс рекомендации от savl-a
     
  5. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    Спасибо ребята, помогли! Сижу классы штудирую
     
  6. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    При копировании документа, необходимо возрастание поля "Organ" на 1
    Ругается на несоответствие типов:

    Dim ws As New NotesUIWorkspace
    Dim doc As NotesDocument

    Set doc = ws.CurrentDocument
    'Organ - имя поля 1документа
    Organ = doc.FieldGetText("Organ")
    'Organ - имя поля копии документа
    Organ = Organ + 1
    Call doc.FieldSet.Text("Organ", Organ)
     
  7. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    А почитать в хелпе какой тип данных возвращает FieldGetText?
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Dim-ok
    Опять же Хелп:NotesUIWorkspace, NotesUIDocument

    NotesUIWorkspace.CurrentDocument - возвращает объект класса NotesUIDocument
    И вот уже у этого объекта есть метод FieldGetText.
    А у NotesDocument, который у тебя в коде, такого метода нет. Вот и ошибка.
    Сделай себе обработчик ошибок:
    Код (LotusScript):
    Sub Click(Source As Button) 'для агента это Sub Initialize
    On Error goto handler

    {твой код кнопки}

    Goto endh

    handler:
    Msgbox {Error #} & Err & {: } & Error$ & { in line } & Erl
    resume Endh
    endh:
    End Sub
    Если работать с NOtesDocument, то надо использовать методы ReplaceItemValue и GetItemValue
     
  9. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    savl, прописал корректно сейчас, ошибок в Designer не показывает, а в lotuse(пользователя) о5 пишет "Несоответствие типов в методе OP_IS: найдено EMPTY, ожидался Unknown@.
    Сейчас попробую прописать аналогию с использованием методов ReplaceItemValue и GetItemValue
     
  10. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Organ = doc.GetItemValue ("Organ")(0)
     
  11. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    с аналогией пока худо, вернулся к началу ^_^

    'Присваивание значения в поле документа
    Set uidoc = ws.CurrentDocument

    Organ = uidoc.FieldGetText("Organ") (ругается на эту строку в режиме пользователя на типы)
    Call uidoc.FieldSetText("Organ", Organ)

    что может быть о5 нитак то?
     
  12. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Код (LotusScript):
    Dim Organ as String
    Organ = uidoc.FieldGetText("Organ")
     
  13. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    savl, тип проставлял сначала да...
    Код (LotusScript):
    'получаю представление, где и создана кнопка
    Dim ws As New NotesUIWorkspace
    Dim UIview As NotesUIView
    Set UIview = ws.CurrentView

    'получаем документ
    Set uidoc = ws.CurrentDocument


    Добавлено: при создании формы, в поле Organ прописан тип "число"
     
  14. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Dim-ok
    ws.CurrentDocument возвращает документ открытый на экране...
    Если он закрыт, его так не получить. Вернее можно получить, если какой-то другой открыт.
    Хочешь получить из представления, надо действовать по другому.
     
  15. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    savl, можно намекнуть как по другому? Да, действую из представления
     
  16. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Код (LotusScript):
    Dim ws As New NotesUIWorkspace
    Dim currNoteID As String
    Dim ses As New NotesSession
    Dim parentDoc As NotesDocument 
    Dim childDoc As NotesDocument
    dim Organ as variant

    currNoteID = ws.CurrentView.CaretNoteID
    Set parentDoc = ses.CurrentDatabase.GetDocumentByID(currNoteID) ' документ из представления, копия которого будет сделана
    If parentDoc Is Nothing Then Error 5002, "Ошибка при получении основного договора"
    Set childDoc = parentDoc.CopyToDatabase( ses.CurrentDatabase)
    Organ = parentDoc .GetItemValue ("Organ")(0) ' получить значение, может быть ошибка, если пустое
    Call childDoc.ReplaceItemValue("Organ ",Cint(Organ) +1) ' +1
    call ws.EditDocument(true,childDoc) ' Открыть на редактирование
     
  17. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    Ошибок не обнаружено, сейчас буду разбираться дальше, спасибо за новую мысль!
     
  18. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Че то взрыв мозга какой то...

    Organ - если поле числовое и обязательно заполнено то так
    Код (LotusScript):
            Dim Organ as integer 'Если номера бывают большие то лучше сразу Long
    Organ = parentDoc.GetItemValue ("Organ")(0)
    Call childDoc.ReplaceItemValue("Organ ",Organ + 1) ' +1
    all ws.EditDocument(true,childDoc) ' Открыть на редактирование

    Organ - если поле может быть пустым то нужно проверять че там в поле, и принимать соотв. действия
    устанавливать какое либо значение, не копировать документ...от задачи зависит
     
  19. Dimok-163rus

    Dimok-163rus Well-Known Member

    Регистрация:
    20 июн 2013
    Сообщения:
    88
    Симпатии:
    0
    Да, поле числовое - это порядковый номер документа, у меня вообще задача:
    При нажатии на кнопку(в представлении) должны создаваться копии документа(сколько док-тов должно создаться будет оговорено позже, но точно ни один) по форме родителя, и чтобы поле organ в каждом последующем док-те возрастало на +1
     
  20. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Call childDoc.ReplaceItemValue("Organ ",Cint(Organ) +1) ' +1
    так не пойдет, значение в childDoc.Organ не изменится
    добавить единицу надо так: childDoc.Organ = Organ +1
    и если не контролировать док открытием в UI, то после присвоения - сохранить и обновить View
    Call childDoc.Save(True,False)
    Call ws.ViewRefresh
    Dim-ok если не получится - выкладывай весь свой код кнопки, чтобы разобрать ошибки по твоему коду раз и навсегда.

    PS. И пользуйся дебагером, что-бы понять, что накодил (Tools - Debug Lotus Script - поставить галочку)
    Что-бы оно заработало, надо переоткрыть вид (или базу).
     
Загрузка...

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