В Uidocument вставить файл в Rt-поле

morpheus

скриптописец
07.08.2006
3 915
1
#1
Стоит задача: в UI открыт документ. Есть пременная содержащая пути к файлам. Как в UI можно вставить эти файлы в рт-поле Body не переоткрывая документ ?
Файлы у меня bmp

CreateObject у меня вставляет картинку как обьект... получаеться как то криво.
 
S

Sandr

#2
чет не понял... нужно картинку вставить, или файл?

а как же @Command( [EditInsertFileAttachment] ) ?
 

morpheus

скриптописец
07.08.2006
3 915
1
#3
ВСё таки надо вставить именно файлы. Просто файлы у меня - результаты сканирования ( бмп-хи)


мдя,а я тут занимаюсь любовью с Embeted ... а всё так просто.. и главное что на собаках не надо переоткрывать док-т в отличии от шкрипта
 

morpheus

скриптописец
07.08.2006
3 915
1
#4
Усё разобрался

Код:
@Command([ToolsRunMacro]; "Moy_agent" ); 
@Command( [EditGotoField]; "Body" ); 
@PostedCommand([EditInsertFileAttachment]; @GetProfileField( "MY_setup"; "ScanField"; @UserName ) )
запускаю агент, сканирую( всё происходит в агенте "Moy_agent" ), кидаю в личный профайл путь к файлу, вставляю файл в документ

без переоткрытия, без рагульных импортов
 

yerke

Well-known member
28.08.2007
392
0
#5
Усё разобрался

Код:
@Command([ToolsRunMacro]; "Moy_agent" ); 
@Command( [EditGotoField]; "Body" ); 
@PostedCommand([EditInsertFileAttachment]; @GetProfileField( "MY_setup"; "ScanField"; @UserName ) )
запускаю агент, сканирую( всё происходит в агенте "Moy_agent" ), кидаю в личный профайл путь к файлу, вставляю файл в документ

без переоткрытия, без рагульных импортов
Добрый день!

Есть ли аналог команды: @Command([EditInsertFileAttachment]; FilePath)
в ЛС?

АПИ функция:
result = W32_NSFNoteAttachFile (hNT, "Body", Len("Body"), fileLoc$ & fname$, fname$, COMPRESS_HUFF)
тоже не подошла.

NotesRichTextItem.EmbedObject - не предлагать, так как приаттаченный файл не виден сразу.

Нужен именно та УИ функция, которая выполняется, когда юзер выбирает пункт меню "File - Attach.." на открытом УИ документе, где фокус стоит на рич текст поле?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#8
А создать агент на собаках и запустить его скриптом?
 

yerke

Well-known member
28.08.2007
392
0
#10
А создать агент на собаках и запустить его скриптом?
Usage
This method runs any agent regardless of source language (simple action, formula, LotusScript, Java).
You cannot run an agent recursively (cannot call it from itself).
The user cannot interact directly with a called agent. User output goes to the Domino log.
You cannot debug a called agent.
You cannot use the Notes UI classes in an agent called by this method.
For COM applications, the Notes program directory must be in the application path.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#11
yerke ,
во-1, агент на собаках аж никак не использует Notes UI классы, во-2, этот участок текста из справки из метода notesAgent.RunOnServer().
Зачем ты тулишь к этому случаю запуск агента на сервере, тебе же в клиенте его нужно запустить - notesAgent.Run()!
 

yerke

Well-known member
28.08.2007
392
0
#12
yerke ,
во-1, агент на собаках аж никак не использует Notes UI классы, во-2, этот участок текста из справки из метода notesAgent.RunOnServer().
Зачем ты тулишь к этому случаю запуск агента на сервере, тебе же в клиенте его нужно запустить - notesAgent.Run()!
1) согласен - @Command( [EditInsertFileAttachment] ) не Notes UI класс. Однако данная функция работает только в УИ.
2) см. вложение
 

Вложения

  • 66.1 КБ Просмотры: 71

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#13
yerke
у меня в справке такого упоминания нет (нотес 8.5). Но ты таки прав - не запускается в таком порядке.

Но! Я так полагаю, что код, который должен создать вложение, активируется некоторой кнопкой. Если так, то можно попробовать сделать следующим образом.
Создать два агента: А1 и А2. А1 - скриптовый агент, который выполняет все предварительные действия, перед вызовом EditInsertFileAttachment. А2 - агент собачный, который вызывает EditInsertFileAttachment. Кнопка, которая с формы ранее запускала скрипт, должна на собаках! запустить по-очереди два агента: А1 и А2, если в А1 выполнены условия выполнения EditInsertFileAttachment.
Если надо, можно еще и третий агент А3 создать, который выполняет какие-то действия после EditInsertFileAttachment.
Думаю, должно получиться.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#14
yerke
у меня в справке такого упоминания нет (нотес 8.5). Но ты таки прав - не запускается в таком порядке.

Но! Я так полагаю, что код, который должен создать вложение, активируется некоторой кнопкой. Если так, то можно попробовать сделать следующим образом.
Создать два агента: А1 и А2. А1 - скриптовый агент, который выполняет все предварительные действия, перед вызовом EditInsertFileAttachment. А2 - агент собачный, который вызывает EditInsertFileAttachment. Кнопка, которая с формы ранее запускала скрипт, должна на собаках! запустить по-очереди два агента: А1 и А2, если в А1 выполнены условия выполнения EditInsertFileAttachment.
Если надо, можно еще и третий агент А3 создать, который выполняет какие-то действия после EditInsertFileAttachment.
Думаю, должно получиться.
правильно говоришь, рисуем кучу скрытых кнопок и запускаем их ява скриптом
в каждой кнопке свой код на своём языке :)

А главная УИ кнопка имеет код:
document.forms[0].StartScan.click(); // Кликаем на кнопке которая имеет id и Name - StartScan
document.forms[0].AttachFile.click(); // Кликаем на кнопке которая имеет id и Name - AttachFile

естественно имеется еще поле куда помещаем где лежит файл и которое заполняется первой кнопкой и используется второй
 

yerke

Well-known member
28.08.2007
392
0
#16
обошелся стандартными инструментами лотус

1) код кнопки на первом документе в БД "А"
ini.doc - это текущий открытый док
ini - класс инишка (содержит Current Database, current ui doc, session, current doc итд итп)

Код:
Sub CreateOutputDoc

On Error Goto EH

'=dims
Dim Server As String
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim nm As NotesName
Dim directory As String
Dim Files As Variant
Dim itm As NotesRichTextItem
Dim fp As String
Dim uidoc As NotesUIDocument
Dim udoc As NotesDocument

'=get db
Server = Lcase(Trim(Cstr(ini.doc.DocServer(0))))
Set db = ini.s.GetDatabase(Server, "B.nsf", False)
If db Is Nothing Then Error 1984, "БД «Исходящие документы» не доступна!"

'=check Output doc if already created
Set view = db.GetView("(DocRequestUNID)")
view.AutoUpdate = False
Call view.Refresh
Set doc = view.GetDocumentByKey(ini.doc.DocRequestUNID(0), True)
If Not doc Is Nothing Then Error 1984, "Исходящий документ уже создан!"

'=set environment vars
Call ini.s.SetEnvironmentVar("OutputdocFilesForAttachments", "")

Set nm = New NotesName(ini.s.UserName)
directory = ini.GetTempDir + nm.Common
If Dir$(directory, 16) = "" Then Mkdir directory

Files = Split("", "")
Set itm = ini.doc.GetFirstItem("F_Attach")
If Not itm Is Nothing Then
Forall obj In itm.EmbeddedObjects
If Not obj Is Nothing Then
If obj.Type = EMBED_ATTACHMENT Then
fp = directory + "\" + obj.Source
Call obj.ExtractFile(fp)
Files = Arrayappend(Files, Replace(fp, "\", "\\"))
End If
End If
End Forall
End If
Files = Arrayunique(Fulltrim(Files), 5)
If Trim(Join(Files, "")) <> "" Then Call ini.s.SetEnvironmentVar("OutputdocFilesForAttachments", Join(Files, "|"))

'=compose new Output doc
Set uidoc = ini.w.ComposeDocument(db.Server, db.FilePath, "output1")
Set doc = uidoc.Document

'=patch fields
doc.DocRequestUNID = ini.doc.DocRequestUNID(0)
doc.ReqType = "Служебная записка"
doc.Subject = "Справка"

doc.category = "Не задана"
doc.orgsorepid = "$"
doc.s = "$"
doc.recepient = ini.doc.F_Client_Name(0)
doc.rf = "Частное лицо"
doc.to = "Частное лицо"
doc.recepient_1 = doc.to(0) + "->" + doc.recepient(0)

'=attaching files in query recalc on Output doc
Call uidoc.RefreshHideFormulas	
Call uidoc.Refresh(True)

'=delete handles
Set doc = Nothing
Set uidoc = Nothing
Call ini.s.SetEnvironmentVar("OutputdocFilesForAttachments", "")
If Trim(Join(Files, "")) <> "" Then
Forall File In Files
Kill Replace(File, "\\", "\")
End Forall
End If

Exit Sub
EH:
Call ini.s.SetEnvironmentVar("OutputdocFilesForAttachments", "")
If Err = 1984 Then
Messagebox Error$, 16, "Ошибка"
Elseif Err = 4412 Then
Print Cstr(Err) + " (" + Cstr(Erl) + ") " + Error$
Else
Messagebox Cstr(Err) + " (" + Cstr(Erl) + ") " + Error$, 16, "Ошибка"
End If
Exit Sub
End Sub
2) код на queryrecalc на втором документе в БД "B"
Код:
@If(!@IsNewDoc; @Return(""); "");
@If(!@IsDocBeingEdited; @Return(""); "");

Files := @Text(@Environment("OutputdocFilesForAttachments"));
@Environment("OutputdocFilesForAttachments"; "");
@If(@Trim(Files) = ""; @Return(""); "");
MyFiles := @Explode(Files; "|");

@Command([EditGotoField]; "Body");
@For(nn := 1; nn <= @Elements(MyFiles); nn := nn + 1;
@Command([EditInsertFileAttachment]; MyFiles[nn]; "1")
);
@PostedCommand([EditGotoField]; "Subject")