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

  • Автор темы Abbi
  • Дата начала
A

Abbi

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

Заранее спасибо.
 
A

Abbi

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

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
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#4
ну ты же получил некий объект коллекцию документов, почему бы не открыть справку и не узнать как он работает?..
по коллекции можно пройтись в цикле, обработать каждый документ из нее...
в твоем случае будет только один документ -
например:

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

abbatik

Lotus team
20.10.2008
277
0
#5
Чет я не догоняю... а почему Call doc.CopyToDatabase( Db ) не использовать? Зачем вообще UI какой-то использовать?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#6
действительно, Abbi, ты б рассказал чего надо сделать более детально, а то мы тебя так только запутать можем ))
 
A

Abbi

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

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

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
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#8
Можно так.
Call someDoc.GetFirstItem("Foto").CopyItemToDocument(uidoc.Document, "Foto")
Но в любом случае потребуется переоткрытие документа. Особенности работы с ричтекстом. :D
 
A

Abbi

#9
Но в любом случае потребуется переоткрытие документа. Особенности работы с ричтекстом.
а можно поподробней пока мне тяжело дается програмирование по мелочи спросить не у кого
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#10
Но в любом случае потребуется переоткрытие документа. Особенности работы с ричтекстом.
точно, и сохранять из UI до переоткрытия нельзя, т.к. информация из ричтекста пропадет...

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

Код:
	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
при такой манипуляции не обязательно даже сохранение изменияемого документа!
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#11
Вот, если ничего не забыл.
Код:
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)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#12
Medevic, что-то ты заработался :lol:
сначала uidoc.Close, потом uidoc.Document... в итоге еще и спросит "а не сохранить ли"?..
см мой пример :D
 
A
#13
что то я совсем запутался по примеру у меня создается новая форма со всеми полями и фото а так же остается старая со всеми полями и без фото, а код для меня что то сложновато или уже устал читая книги.

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



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

NickProstoNick

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

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

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

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

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#16
Код:
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
зы: юзай теги скрипта в сообщениях, иначе модеры будут ругаться!
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 802
21
#17
Akupaka
прошу прощения...а зачем все так сложно?
и немного не гибко... ИМХО

я бы сделал это так
Код:
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
Правда еще бы поковырять открытие базы справочника... что-то как-то не прозрачно

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

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#18
прошу прощения...а зачем все так сложно?
и немного не гибко... ИМХО
я всего-лишь показал Abbi как сделать то, что он хотел
твой вариант тоже интересен, если ты об этом :rolleyes:
но в нем тоже есть минусы - если пользователь, составляющий документ ошибся в выборе, то ему придется закрыть документ и заново выполнить операции по созданию, в том варианте который обсуждался мной, он просто перевыбирает без необходимости изменения остальных данных...
какой вариант выбрать дело Abbi :)

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

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

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


Код:
	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

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

abbatik

Lotus team
20.10.2008
277
0
#20
Всем огромное спасибо вроде получилось. Буду очень признателен если порекомендуете литературу которую лучше всего читать с примерами для вникания.
Надеюсь я тоже в скором смогу на равных вести беседу с вами.
Хелп читай :rolleyes: Там и пример есть почти на каждую функцию :)