Обновление поля

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

oleg7

#1
Помогите, пожалуйста
Есть база в нее берутся данные из Словаря
Можно ли агентом вручную (только выделенные документы) обновить данные из Словаря.
Например в словаре была запись "тест1", а ее в словаре переименовали в "тест_1" , так вот можно как-то автоматически подтянуть изменения?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#2
Можно, если имеется однозначный способ определить соответствие словаря "тест_1" и документа, использующего "тест1"
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#3
для этого нужно использовать не сами значения а их синонимы
 
O

oleg7

#4
ToxaRat
если правильно понимаю, то имеется в виду поле Alias, но оно не заполнялось :)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#5
oleg7 ,
неправильно понял, либо углубляешься в технические детали, которые нам неизвестны, и врядли мы сможем оценить верность твоего предположения, исходя из имеющихся у нас данных.

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

Это что, какой-то БР? :)
 
O

oleg7

#6
решил, раз так не знаю как правильно делать... пойти другим путем и тоже ступор
Есть база, в которой заполняются данные (Словарь) , есть база в которой эти поля выбираются. Хочу написать агент, который в виде будет редактировать документы и сразу (например выделено 10 документов) будет менять определенное поле (Например Pole_Test) , т.е. мне не надо будет открывать каждый документ, а можно будет менять поле, если данные одинаковые (например по ним осортированы по этим данным)

Код:
myServer:=@Subset(@DbName;1);
myDb:= "DB.nsf";
myView := "TESTVIEW";
@Set("myField";"Pole_Test");
mySelection:=@PickList( [Custom] : [Single];myServer :myDb;myView;"";"";1);
@SetField(myField;mySelection);
SELECT @All
Данные добавляются, но вот PickList появляется ровно столько раз, сколько документов выделено в представлении. Как можно обновить нужное мне поле в нескольких документов, но только 1 раз выбрать данные в PickList?
 
A

ABarmin

#8
Если есть поле, которое поддерживает уникальность взятого из словаря значения или хотябы предыдущая версия, чтобы знать что на что менялось, тогда можно сравнивать и менять.
 
O

oleg7

#9
делаю так
Код:
	Dim ws As New NotesUIWorkspace, DB As NotesDatabase, ODB As NotesDatabase
Dim session As New NotesSession
Set DB = session.CurrentDatabase	
Set ODB = session.GetDatabase ( DB.Server, "baza.nsf" )
Dim DocCol As NotesDocumentCollection
Dim RezCol As NotesDocumentCollection
Dim Doc As NotesDocument

Set DocCol = DB.UnprocessedDocuments
Set Doc = DocCol.GetFirstDocument
Set RezCol= ws.PickListCollection( 1 ,False, ODB.Server, ODB.FilePath,"TESTView", "1","1","")
If RezCol.Count = 0 Then Exit Sub
While Not(Doc Is Nothing)
Set Doc=DocCol.GetFirstDocument
Doc.PoleTest= RezCol							 ' выдает ошибку Type mismatch
Doc.Save True, False
Set Doc= DocCol.GetNextDocument(Doc)
Wend
Как мне в PoleTest подставить то, что я получаю в RezCol?
 

Cleric-Lviv

Lotus team
03.01.2008
600
0
#10
oleg7

хм, так правильно что ругается.... ви пробуете подставить в поле колекцию которую получили....

if rezcol.count > 0 then
set doccol = rezcol.getfirstdocument
while not doccol is nothing
doc.poletest = doccol.НАЗВАНИЕ_ПОЛЯ_ИЗ_КОТОРОГО_НУЖНО_ВЗЯТЬ_ЗНАЧ.
или
call doc.replaceitemvalue("poletest", doccol.getitemvalue("xxx")(0))

set doccol = rezcol.getnextdocument(doccol)
whend

end if
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#11
Cleric-Lviv ,
де теги кода?

oleg7 ,
почему ошибка, описано в посте Клерика.
Я же покритиковать код хочу ))

Код:
' описание переменных
' описывать переменные очень желательно по одной в каждой строке
' размещать переменные тоже желательно как-то логично сгрупировав, например, объекты классом NotesUIWorkspace и NotesSession обычно описывают в самом начале
' позже объекты БД, колекций, документов, т.е. по некоторой иерархии

Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim DB As NotesDatabase
Dim ODB As NotesDatabase
Dim RezCol As NotesDocumentCollection
Dim DocCol As NotesDocumentCollection
Dim RezDoc As NotesDocument
Dim Doc As NotesDocument

Set DB = session.CurrentDatabase	
Set ODB = session.GetDatabase ( DB.Server, "baza.nsf" )

' код тоже должен быть отдельными логическими блоками, а не смешан между собой

Set DocCol = DB.UnprocessedDocuments

' в агенте, который запускается на выделенных документах, эта проверка не обязательна, т.к. колекция будет заполнена документами, как минимум одним

If DocCol.Count > 0 Then

' сначала необходимо получить документ справочника

Set RezCol= ws.PickListCollection(3, False, ODB.Server, ODB.FilePath, "TESTView", "1", "1") ' согласно справке, первый параметр должен быть 3 (цифра три)
If RezCol.Count > 0 Then
Set RezDoc = RezCol.GetFirstDocument

' потом уже беремся за обработку

Set Doc = DocCol.GetFirstDocument
While Not(Doc Is Nothing)
' Set Doc=DocCol.GetFirstDocument ---- ЭТО что вообще такое было? вечный цикл? :)
Call Doc.ReplaceItemValue("PoleTest", RezDoc.GetItemValue("имя поля, которое копируем"))
Call Doc.Save(True, False)
Set Doc = DocCol.GetNextDocument(Doc)
Wend
End If
End If
 
O

oleg7

#12
Все работает просто отлично
Akupaka
спасибо за объяснения!
Cleric-Lviv
спасибо за помощь!
 

Cleric-Lviv

Lotus team
03.01.2008
600
0
#15
Akupaka

ну не придирайся, а..... не вчив я російську і відповідно граматики не знаю!
 
Статус
Закрыто для дальнейших ответов.