Хитрозамудренный агент.

  • Автор темы LIGHT
  • Дата начала
L

LIGHT

#1
Суть агента:

Есть БД, назовем ее - "Задачи" в которой хранятся ссылки на документы в других разных базах.
В этой базе "Задачи"есть форма - Memo на которой лежат следующие поля:
SendTo (UserNoteName)
SourseUNIDDoc (UNID - документа)
From - (Название базы в которую ведет ссылка по русски)

Юзер видет только свои документы по признаку что он является SendTo
Он открывает документ и в нем есть ссылка на документ из другой БД.
Он нажимет ссылку и знакомится с доком.

Задача написать агент который будет делать следубщее:

Юзер выделяет колекцию своих документов, и реплейсит поля X1; X2 в документах на которые ведут ссыки. Сложность в том что доки лежат в разных базах, но везде есть указаные поля.

Вот за что бы зацепится???
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#2
Имя базы есть?
Тогда:
1. notesSession.GetDatabase
2. notesDatabase.GetDocumentByUNID
3. notesDocument.ReplaceItemValue
 
L

LIGHT

#3
Ага только имя базы в буквальном смысле database title ;)
Как с этим быть?

Есть еще база "Связи" svazi.nsf в коротой есть список баз (title) и их коды реплик.
Может как-то это зацепить?
Только как???
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#4
Прописать нормальный путь. Можно в скрытое поле.
Можно еще, наверное, через notesSession.GetDbDirectory, а потом notesDbDirectory.GetFirstDatabase и notesDbDirectory.GetNextDatabase.

<!--QuoteBegin-LIGHT+5:06:2007, 12:25 -->
<span class="vbquote">(LIGHT @ 5:06:2007, 12:25 )</span><!--QuoteEBegin-->Есть еще база "Связи" svazi.nsf в коротой есть список баз (title) и их коды реплик.
Может как-то это зацепить?
Только как???

[snapback]68109" rel="nofollow" target="_blank[/snapback]​
[/quote]
Тогда можно попробовать:
notesDbDirectory.OpenDatabaseByReplicaID

Или notesDatabase.OpenByReplicaID.
 
L

LIGHT

#5
На данный момен картина такая.

Sub Click(Source As Button)

Dim s As NotesSession
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim w As NotesUIWorkspace
Dim createDate As Variant
Dim i As Variant
'***********************************************
Set s = New NotesSession
Set db = s.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
Set w = New NotesUIWorkspace

'**********************************************

Do Until doc Is Nothing 'Первый документ

Let From1=doc.From(0) 'Поле FORM
Let SendTo1=doc.SendTo(0) 'Поле SendTo
Let SUNID=doc.SourceUNIDDoc(0) 'Поле SendTo

Messagebox( "Документ " + SUNID + " в БД - " + From1 + " Изменен")

Dim s1 As New NotesSession
Dim db1 As NotesDatabase
Set db1 = s.GetDatabase("server", "svazi")
If Not db1.IsOpen Then
Messagebox "Неудалось открыть базу данных"
Else


Messagebox db1.Title,, "Title of svazi.nsf"

Вот тут вопрос как в открытой теперь БД вытащить документ у которого поле Title = From1
А дальше уже когда вытащин документ, в форме есть поля:
ServerDB
FileDB
ReplicalID


End If

Set doc = dc.GetNextDocument (doc)
Loop


End Sub
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#6
<!--QuoteBegin-LIGHT+5:06:2007, 12:37 -->
<span class="vbquote">(LIGHT @ 5:06:2007, 12:37 )</span><!--QuoteEBegin-->Вот тут вопрос как в открытой теперь БД вытащить документ у которого поле Title = From1
А дальше уже когда вытащин документ, в форме есть поля:
ServerDB
FileDB
ReplicalID
[snapback]68115" rel="nofollow" target="_blank[/snapback]​
[/quote]
Использовать notesView.GetDocumentByKey
 
L

LIGHT

#7
Врезал такой кусок, ругается на неверный тип, не подскажеш на какю мину я наступил?
Код:
			Dim session2 As New NotesSession
Dim db2 As NotesDatabase
Dim view2 As NotesView
Dim doc2 As NotesDocument
key = From1
Set db2 = session2.CurrentDatabase
Set view2 = db2.GetView ("DBTitleLookup" ) 'Моя вьюшка
Set doc2 = view2.GetDocumentByKey (key ) 
If Not (doc2 Is Nothing) Then
Messagebox "$" & doc2.GetItemValue ("Title")(0),, _
"Title"
Else
Messagebox "DBTitleLookup " + key,, "Not found"
End If
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#8
Для: LIGHT
Ты посмотри в дебаггере на какую строку ругается.
Кстати, вторую сессию (Dim session2 As New NotesSession) не надо создавать. У тебя уже есть - s.
 
L

LIGHT

#9
А что-то дебагер вообще молчит
Но методом тыка вычисли на что он ругается.
На Set doc2 = view2.GetDocumentByKey (key )
При чем Messagebox key нормально выдает.
Вьюшка DBTitleLookup - существует (это к стати алиас, но пробовал и назваине и алиас, один фиг)
 
L

LIGHT

#13
Я кажись понял в чем дело.
Смотрите:

Нужно же прочитать в базе связей документ! у которого поле Title=From1
Проще всего найти название Title во вьюшке DBTitleLookup
А дальше открыть документ который постоен по форме Databese и на которой лежат поля Title File Replical

Что-то запутался....
 
L

LIGHT

#15
Вроде прбедил, насамом деле была ошибка в коде.
На данный момент я благополучно выдрал ReplicaID и Значение поля Address
Но тут возник затык, поле Address много значное
"Adress/Servers"
"FileName.nsf"

Как бы мне выдрать только последнее?

Ой все вопрос снят!!!
 
L

LIGHT

#16
Еще вопрос по теме.
Как проще всего отыскать документ зная его UNID?
 

morpheus

скриптописец
07.08.2006
3 915
1
#17
<!--QuoteBegin-LIGHT+5:06:2007, 15:09 -->
<span class="vbquote">(LIGHT @ 5:06:2007, 15:09 )</span><!--QuoteEBegin-->Как проще всего отыскать документ зная его UNID?
[snapback]68169" rel="nofollow" target="_blank[/snapback]​
[/quote]

...
Set db = s.CurrentDatabase
Set dc = db.AllDocuments
Set doc = dc.GetFirstDocument
While Not(doc Is Nothing)
If doc.IsResponse Then
Set pdoc = _
db.GetDocumentByUNID(doc.ParentDocumentUNID)
...
 
L

LIGHT

#18
Код:
db.AllDocuments
Хм.. а если документов пару сотен тыщ?
 

morpheus

скриптописец
07.08.2006
3 915
1
#19
Для: LIGHT
Да Вы на это не сматрите, выше код я привел что бы было понятно что такое db - NotesDataBase

Set db = s.CurrentDatabase
...
Set pdoc = _
db.GetDocumentByUNID(doc.ParentDocumentUNID)
- Finds a document in a database, given the document universal ID (UNID).

Syntax
Set notesDocument = notesDatabase.GetDocumentByUNID( unid$ )
 
L

LIGHT

#20
Понял, победил.
Начались заморочки с реплейсами.
К примеру есть много занчное поле
Reviewer
"User1NotesName"
"User2NotesName"
"User3NotesName"
"User4NotesName"

Среди них должен быть (не обязательно) SendTo (UserNoteName) т.е. User заненсенный в поле SendTo в самом первом документе (первый пост в этой ветке)
Как мне удалить эту строку в много значном поле?

Как бы логику понимаю сложность отыскать именно эту строку в многозначнике :)