Как копировать данные из одной базы в другую

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

  1. Abbi

    Abbi Гость

    Всем привет.
    Нужна помощь есть база телефонный справочник (BD1) в нем данные о всех сотрудниках с фотографиями. И есть другая база по тестированию (BD2)
    вопрос
    Необходимо при добавлении данных в BD2 при нажатии кнопки открывалась вьюха bd1 и выбрав сотрудника все данные сохранялись (Фамилия, Имя, Отчество,занимаемая должность, отдел, подразделение, фото, и т.д.) в форме BD2.
    Подскажите как реализовать.

    Заранее спасибо.
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    notesUIWorkspace.PickListCollection
     
  3. Abbi

    Abbi Гость

    Вот мой код но я не знаю как дальше записать данные.

    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim ses As New NotesSession
    Dim db As NotesDatabase
    Dim spravdb As New NotesDatabase("","")
    Dim strdb As New NotesDatabase("","")
    Dim uidoc As NotesUIDocument
    Dim coll As NotesDocumentCollection
    Dim view As NotesView

    Set db = ses.CurrentDatabase
    Set uidoc = ws.CurrentDocument
    If Not uidoc.EditMode Then
    Msgbox "Документ должен быть открыт для редактирования"
    Exit Sub
    End If

    sServer=ses.GetEnvironmentString("SpravInfServer")
    sDb = "telsprav.nsf"

    If Not spravdb.OpenWithFailover( sServer,sDb ) Then
    Msgbox "База данных ""Телефонный Справочник"" не найден.", 16,"Ошибка..."
    Exit Sub
    End If

    Set coll=ws.PickListCollection(3,False,sServer,sDb,"Podr","Title","Promt","")

    field.Fam:= ?????????????
    field Name:=????????????
    и т.д.

    End Sub
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ну ты же получил некий объект коллекцию документов, почему бы не открыть справку и не узнать как он работает?..
    по коллекции можно пройтись в цикле, обработать каждый документ из нее...
    в твоем случае будет только один документ -
    например:

    Код (Text):
    set someDoc = coll.GetFirstDocument
    field.Fam:= someDoc.GetItemValue("FamItem")
    field Name:= someDoc.GetItemValue("NameItem")
     
  5. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Чет я не догоняю... а почему Call doc.CopyToDatabase( Db ) не использовать? Зачем вообще UI какой-то использовать?
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    действительно, Abbi, ты б рассказал чего надо сделать более детально, а то мы тебя так только запутать можем ))
     
  7. Abbi

    Abbi Гость

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

    вот какой код получился

    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim ses As New NotesSession
    Dim db As NotesDatabase
    Dim spravdb As New NotesDatabase("","")
    Dim strdb As New NotesDatabase("","")
    Dim uidoc As NotesUIDocument
    Dim coll As NotesDocumentCollection
    Dim view As NotesView

    Set db = ses.CurrentDatabase
    Set uidoc = ws.CurrentDocument
    If Not uidoc.EditMode Then
    Msgbox "Документ должен быть открыт для редактирования"
    Exit Sub
    End If

    sServer=ses.GetEnvironmentString("SpravInfServer")
    sDb = "telsprav.nsf"

    If Not spravdb.OpenWithFailover( sServer,sDb ) Then
    Msgbox "База данных ""Телефонный Справочник"" не найден.", 16,"Ошибка..."
    Exit Sub
    End If

    Set coll=ws.PickListCollection(3,False,sServer,sDb,"Podr","Список сотрудников","Выберите","")

    Set someDoc = coll.GetFirstDocument
    f=someDoc.GetItemValue("fam")
    If Isempty(f) Then
    Msgbox "Не выбран сотрудник!",48,"Внимание..."
    Exit Sub
    End If

    i=someDoc.GetItemValue("Name")
    o=someDoc.GetItemValue("Otch")
    d=someDoc.GetItemValue("dolj")
    ot=someDoc.GetItemValue("Otdel")
    po=someDoc.GetItemValue("Podraz")
    fo=someDoc.GetItemValue("Foto")

    uidoc.Document.Fam = f
    uidoc.Document.Name = i
    uidoc.Document.Otch = o
    uidoc.Document.Dolj = d
    uidoc.Document.Otdel = ot
    uidoc.Document.Podraz = po
    uidoc.Document.Foto = fo

    End Sub
     
  8. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Можно так.
    Call someDoc.GetFirstItem("Foto").CopyItemToDocument(uidoc.Document, "Foto")
    Но в любом случае потребуется переоткрытие документа. Особенности работы с ричтекстом. :D
     
  9. Abbi

    Abbi Гость

    а можно поподробней пока мне тяжело дается програмирование по мелочи спросить не у кого
     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    точно, и сохранять из UI до переоткрытия нельзя, т.к. информация из ричтекста пропадет...

    вот пример, где из одного документа в другой копируют содержимое ричтекста и переоткрывают документ-приемник:

    Код (Text):
        Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim doc As NotesDocument
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim rtitem As Variant, rtitem1 As Variant
    Dim dc As NotesDocumentCollection
    Dim doc1 As NotesDocument

    Set uidoc = ws.CurrentDocument
    Set doc=uidoc.document 
    Set db = session.CurrentDatabase

    Set doc1 = получаем документ-источник
    из источника берем RTI Body
    Set rtitem1= doc1.GetFirstItem("Body")

    из приемника берем RTI Body, если он не существует, то создаем
    Set rtitem = doc.GetFirstItem("Body")
    If rtitem Is Nothing Then
    Set rtitem = doc.CreateRichTextItem("Body")
    End If

    в приемник пишем какой-то текст
    Call rtitem.AppendText("bbb")
    и добавляем источник
    Call rtitem.AppendRTItem(rtitem1)
    "прописываем" изменения в приемнике
    Call rtitem.Update

    тут указывается форма документа, т.к. он был новый и форма не установлена еще
    Call doc.ReplaceItemValue("Form", "AttachCopy")
    теперь открываем приемник в новом окне
    Call ws.EditDocument(True, doc)
    это позволяет избавиться от вопроса о сохранении закрываемого документа!
    Call doc.ReplaceItemValue("SaveOptions", "0")
    закрываем "старый" приемник
    Call uidoc.Close(True)
    End If
    End If
    при такой манипуляции не обязательно даже сохранение изменияемого документа!
     
  11. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Вот, если ничего не забыл.
    Код (Text):
    Call someDoc.GetFirstItem("Foto").CopyItemToDocument(uidoc.Document, "Foto")
    Call uidoc.Document.ReplaceItemValue("SaveOptions", "0")
    Call uidoc.Close()
    Call uidoc.Document.RemoveItem("SaveOptions")
    Call uidoc.Document.ReplaceItemValue("Form", "Твоя форма")
    Call ws.EditDocument(True, uidoc.Document, False)
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Medevic, что-то ты заработался :lol:
    сначала uidoc.Close, потом uidoc.Document... в итоге еще и спросит "а не сохранить ли"?..
    см мой пример :D
     
  13. Abbi

    Abbi Гость

    что то я совсем запутался по примеру
    у меня создается новая форма со всеми полями и фото а так же остается старая со всеми полями и без фото, а код
    для меня что то сложновато или уже устал читая книги.

    Нашел как сделать
    нужно было исправить одну строку
    на
    Call uidoc.Document.RemoveItem("CloseOptions")



    но данные не сохраняются.
     
  14. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Akupaka
    Да, ты прав.
     
  15. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    чтоб не заморачиваться с переоткрытиями документов можно сделать вот как....
    На панели вида (или откуда там надо нажимать на кнопку для создания нового документа) сразу спросить "откуда брать данные? Выберите документ пользователя"
    делаем это методом
    Код (Text):
    ws.PickListCollection(3,False,sServer,sDb,"Podr","Title","Promt","")
    если пользователь выбрал то что надо - тогда идем далее
    Формируем строку с перечнем имен полей. Названия полей пишем через какой-нить уникальный разделитель. Потом разбиваем строку на массив.
    Переменная строки должна быть типа Variant. Для разбиения строки пользуем функцию Split. Ну это чтоб не заморачиваться с каждым элементом массива отдельно
    Создаем (НЕ КОПИРУЕМ!!!!!!!) новый документ по нужной форме
    Затем делаем цикл от 0 до колличества элементов массива с названиями полей... и в этом цикле копируем их... пользуем CopyItemToDocument
    После всего этого сохраняем документ.
    ну и если надо - открываем через EditDocument

    А можно еще и так....
    Просто копировато документ из одной базы в другую. А потом, если надо, поменять название формы.

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

    Но думаю этот метод не правильный.... т.к. может скопироваться много лишней инфы
     
  16. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Код (Text):
    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim ses As New NotesSession
    Dim db As NotesDatabase
    Dim spravdb As New NotesDatabase("","")
    Dim strdb As New NotesDatabase("","")
    Dim uidoc As NotesUIDocument
    Dim coll As NotesDocumentCollection
    Dim view As NotesView

    dim rtFotoSrc as NotesRichTextItem
    dim rtFotoDst as NotesRichTextItem

    Set db = ses.CurrentDatabase
    Set uidoc = ws.CurrentDocument
    If Not uidoc.EditMode Then
    Msgbox "Документ должен быть открыт для редактирования"
    Exit Sub
    End If

    sServer=ses.GetEnvironmentString("SpravInfServer")
    sDb = "telsprav.nsf"

    If Not spravdb.OpenWithFailover( sServer,sDb ) Then
    Msgbox "База данных ""Телефонный Справочник"" не найден.", 16,"Ошибка..."
    Exit Sub
    End If

    Set coll=ws.PickListCollection(3,False,sServer,sDb,"Podr","Список сотрудников","Выберите","")

    if coll.Count > 0 then
    Set someDoc = coll.GetFirstDocument

    uidoc.Document.ReplaceItemValue("Fam", someDoc.GetItemValue("fam"))
    uidoc.Document.ReplaceItemValue("Name", someDoc.GetItemValue("Name"))
    uidoc.Document.ReplaceItemValue("Otch", someDoc.GetItemValue("Otch"))
    uidoc.Document.ReplaceItemValue("Dolj", someDoc.GetItemValue("dolj"))
    uidoc.Document.ReplaceItemValue("Otdel", someDoc.GetItemValue("Otdel"))
    uidoc.Document.ReplaceItemValue("Podraz", someDoc.GetItemValue("Podraz"))



    Set rtFotoSrc = someDoc.GetFirstItem("Foto")

    ' из приемника берем RTI, если он не существует, то создаем
    Set rtFotoDst = uidoc.Document.GetFirstItem("Foto")
    If rtFotoDst Is Nothing Then
    Set rtFotoDst = uidoc.Document.CreateRichTextItem("Foto")
    End If

    ' и добавляем источник
    Call rtFotoDst.AppendRTItem(rtFotoSrc)
    ' "прописываем" изменения в приемнике
    Call rtFotoDst.Update

    ' тут указывается форма документа, т.к. он был новый и форма не установлена еще
    Call uidoc.Document.ReplaceItemValue("Form", "СЮДА НАДО ВПИСАТЬ ИМЯ ФОРМЫ, А ЛУЧШЕ АЛИАС")
    ' теперь открываем приемник в новом окне
    Call ws.EditDocument(True, uidoc.Document)
    ' это позволяет избавиться от вопроса о сохранении закрываемого документа!
    Call uidoc.Document.ReplaceItemValue("SaveOptions", "0")
    ' закрываем "старый" приемник
    Call uidoc.Close(True)


    end if

    End Sub
    зы: юзай теги скрипта в сообщениях, иначе модеры будут ругаться!
     
  17. NickProstoNick

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

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Akupaka
    прошу прощения...а зачем все так сложно?
    и немного не гибко... ИМХО

    я бы сделал это так
    Код (Text):
    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim ses As New NotesSession
    Dim db As NotesDatabase
    Dim spravdb As New NotesDatabase("","")
    Dim strdb As New NotesDatabase("","")
    Dim uidoc As NotesUIDocument
    Dim coll As NotesDocumentCollection
    Dim view As NotesView
    Dim someDoc As NotesDocument
    Dim Fitem As NotesItem 
    Dim FieldArray As Variant
    Dim i As Integer

    Set db = ses.CurrentDatabase
    Set uidoc = ws.CurrentDocument
    If Not uidoc.EditMode Then
    Msgbox "Документ должен быть открыт для редактирования"
    Exit Sub
    End If

    sServer=ses.GetEnvironmentString("SpravInfServer")
    sDb = "telsprav.nsf"

    If Not spravdb.OpenWithFailover( sServer,sDb ) Then
    Msgbox "База данных ""Телефонный Справочник"" не найден.", 16,"Ошибка..."
    Exit Sub
    End If

    Set coll=ws.PickListCollection(3,False,sServer,sDb,"Podr","Список сотрудников","Выберите","")

    FieldArray = "Fam:Name:Otch:Dolj:Otdel:Podraz:Foto"
    FieldArray = Split( FieldArray, ":" )

    If coll.Count > 0 Then
    Set someDoc = coll.GetFirstDocument

    For i = 0 To Ubound( FieldArray )      

    If someDoc.HasItem( FieldArray(i) ) Then

    Set itemA = someDoc.GetFirstItem( FieldArray(i) )              
    Call itemA.CopyItemToDocument( uidoc.Document , FieldArray(i) )

    End If

    Next

    Call uidoc.Document.Save( True, False, True )

    End If

    End Sub
    Правда еще бы поковырять открытие базы справочника... что-то как-то не прозрачно

    и все же лучше делать все в бекэнде... по возможности...
     
  18. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    я всего-лишь показал Abbi как сделать то, что он хотел
    твой вариант тоже интересен, если ты об этом :rolleyes:
    но в нем тоже есть минусы - если пользователь, составляющий документ ошибся в выборе, то ему придется закрыть документ и заново выполнить операции по созданию, в том варианте который обсуждался мной, он просто перевыбирает без необходимости изменения остальных данных...
    какой вариант выбрать дело Abbi :)

    но, если ты не об этом, то я готов выслушать твое предложение! :)

    зы: что там сложно и не гибко я не наю ))
    зы2: к стати, на счет имен полей в цикле - согласен, но для начала может быть сложнее, чем перебор ;)

    NickProstoNick, ты забыл, что Foto - ричтекст, который можно корректно перенести только переоткрытием документа


    Код (Text):
        FieldArray = Split( "Fam:Name:Otch:Dolj:Otdel:Podraz:Foto", ":" )

    ...    
    Forall FieldArrayItem in FieldArray

    If someDoc.HasItem(FieldArrayItem) Then ' в принципе не обязательно

    Set itemA = someDoc.GetFirstItem( FieldArrayItem )             
    Call itemA.CopyItemToDocument( uidoc.Document , FieldArrayItem ) ' тоже не верно, если документ взят с UI, то ты продублируешь итемы! (по-идее)

    End If

    Next

    ...
     
  19. Abbi

    Abbi Гость

    Всем огромное спасибо вроде получилось. Буду очень признателен если порекомендуете литературу которую лучше всего читать с примерами для вникания.
    Надеюсь я тоже в скором смогу на равных вести беседу с вами.
     
  20. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Хелп читай :rolleyes: Там и пример есть почти на каждую функцию :)
     
Загрузка...

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