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

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

oleg7

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

Akupaka

Можно, если имеется однозначный способ определить соответствие словаря "тест_1" и документа, использующего "тест1"
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
для этого нужно использовать не сами значения а их синонимы
 
O

oleg7

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

Akupaka

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

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

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

oleg7

решил, раз так не знаю как правильно делать... пойти другим путем и тоже ступор
Есть база, в которой заполняются данные (Словарь) , есть база в которой эти поля выбираются. Хочу написать агент, который в виде будет редактировать документы и сразу (например выделено 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

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

oleg7

Напиши LotusScript-агент.
делаю так
Код:
	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

Well-known member
03.01.2008
603
0
BIT
6
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
 
A

Akupaka

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

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

Cleric-Lviv

Well-known member
03.01.2008
603
0
BIT
6
Akupaka

забил, писал на скорую руку :)


oleg7

всегда пожалуста)
 

Cleric-Lviv

Well-known member
03.01.2008
603
0
BIT
6
Akupaka

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!