Lotus - Анилиз документа во вложении

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

SOFTOBZOR.ru

Юлия, наверно вопрос к вам!

Возможно ли избавиться вот от этого:
Код:
Set emo=doc.GetAttachment("lotus.doc")

И получить нечто переменное

Код:
Set emo=doc.GetAttachment("*.doc")

где * любой докумен .doc
 
G

Guest

Конечно, можно. В метод должен передаваться переменная типа String.
Заведи поле в котором будет задаваться имя и вызывай метод.
См. пример в хелпе на NotesEmbeddedObject. Вообще там хорошие примеры по этому классу. :)
Так можно получить все имена файлов, которые есть в поле attach.

Код:
Set rtitem = doc.GetFirstItem( "attach" )
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
Messagebox( o.Name )
End Forall
End If
 
S

SOFTOBZOR.ru

Почему то не работет, попробовал получить колличество приатаченых файлов, выскакивает ошибка "Object Variable not Set" (Объектная Переменная не была Установлена). Как буквально понимать эту ошибку?

Пример моего кода:
Код:
Sub Click(Source As Button)

Dim doc As NotesDocument
Dim rtitem As Variant
Dim attachCount As Integer

Set rtitem = doc.GetFirstItem( "attach" )
attachCount = 0

If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
Select Case o.Type
Case EMBED_ATTACHMENT:
 attachCount = attachCount + 1
End Select
End Forall
End If
Print( attachCount & " attachments " & linkCount & _
" links " & objectCount & " objects " )
End Sub
 
G

Guest

Ошибка в том, что переменной не присвоено начение.
Опять же проблема с doc. Программа не знает к какому именно документу ты хочешь обратиться.
 
S

SOFTOBZOR.ru

Вроде все описано:

Код:
Sub Click(Source As Button)

Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument 
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document

Dim rtitem As Variant
Dim attachCount As Integer

Set rtitem = doc.GetFirstItem( "attach" )
attachCount = 0
If ( rtitem.Type = RICHTEXT ) Then
 Forall o In rtitem.EmbeddedObjects
 	Select Case o.Type
 	Case EMBED_ATTACHMENT:
   attachCount = attachCount + 1
 	End Select
 End Forall
End If
Print( attachCount & " attachments " )
End Sub

А ошибка таже.
Если сюда вставить ваш пример:
Код:
Set rtitem = doc.GetFirstItem( "attach" )
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
Messagebox( o.Name )
End Forall
End If

Происходит тоже самое.

Юлия, если вам не сложно могли бы вы мне обьяснить эти опреции:
А то, у меня чисто абстрактное представление :), но как понимаю это основа основ! Имею общее представление, но охото понять "суть по русски", если конечно не сложно.

NotesUIWorkspace
NotesUIDocument
NotesDocument
CurrentDocument
Document
 
G

Guest

А на какой строчке возникает ошибка?

У тебя поле точно attach называется?
Set rtitem = doc.GetFirstItem( "attach" )

Инфа по классам. Взято из электронной справки неизвестного происхождения.

Встроенные классы Notes можно разделить на две группы:
1. Классы интерфейса пользователя – обеспечивают доступ к объектам пользовательского интерфейса: рабочее пространство (Workspace), окно вида (View Window), окно документа (Document Window), поле и форматируемое поле.
· NotesUIWorkSpace – представляет текущее рабочее пространство Notes.
· NotesUIDocument – представляет документ, который сейчас выбран в рабочем пространстве

2. Классы заднего планы – представляют такие объекты Notes, как базу данных, вид или папку, агент, документ, пункт в документе. Выполняемые пользователем действия происходят без явного отображения в пользовательском интерфейсе.
· NotesSession – представляет среду Notes, в которой выполняется данный скрипт . Он позволяет получать доступ к адресным книгам, информации о текущем пользователе, к переменным из файла Notes.ini, текущей платформе Notes.
· NotesDbDirectory – позволяет просмотреть список имеющихся баз и получить доступ к любой из них
· NotesDatabase – представляет конкретную базу Notes и обеспечивает доступ ко всем, содержащимся в ней объектам.
· NotesACL – представляет список управления доступом (ACL) базы.
· NotesACLEntry – представляет один элемент из набора элементов в ACL.
· NotesAgent – представляет конкретного агента.
· NotesView – представляет вид или папку в базе и обеспечивает доступ к содержащимся там документам.
· NotesViewColomn –представляет столбец вида или папки.
· NotesDocumentCollection - представляет коллекцию документов из базы, отобранную в соответствии с некоторым критерием.
· NotesDocument – представляет один документ в базе.
· NotesItem – представляет один пункт документа. Поле в форме (Field) и пункт в документе (Item) – это разные объекты, хотя часто и связанные между собой.
· NotesRichTextItem - является производным от класса NotesItem, т.е. он наследует все свойства и методы базового класса, но дополнительно имеет свои собственные специфические свойства и методы для работы с произвольным текстом.
Контейнерная иерархия стандартных классов довольно сложна, поэтому она не приводится целиком, а рассматривается на примере создания и использования объектов.

Рассмотрим следующий скрипт, в котором проявлена контейнерная иерархия классов:
Dim s As New NotesSession ‘( Метод New cоздает новый объект класса NotesSession и присваивает переменной s ссылку на него. Этот объект представляет текущий сеанс пользователя)
Dim db As NotesDatabase ‘(переменная класа NotesDatabase. Ей пока не присвоено значение и она не связана ни с какими объектами)
Dim view As NotesView ‘(переменная класа NotesView, аналогично)
Dim doc As NotesDocument ‘(аналогично)
Dim item As NotesItem ‘(представляет один пункт документа)
Set db = s.CurrentDatabase ‘переменной присваивается ссылка на объект класса NotesDataBase, возвращаемая свойством СurrentDatabase объекта s. Этот объект содержится в объекте класса NotesSession, он представляет текущую базу в сеансе пользователя.
Set view = db.GetView(“Cтуденты”) ‘переменной присваивается ссылка на объект класса NotesView, возвращаемая методом GetView объекта db. У объекта db (базы данных) может быть несколько видов и метод имеет параметр. Здесь метод GetView создает и возвращает ссылку на объект, представляющий вид с названием «Студенты».
Set doc = view.GetFirstDocument ‘ переменной doc присваивается ссылка на объект класса NotesDocument, представляющий первый документ в виде view.
Set Item = doc.GetFirstItem ‘переменной item класса NotesItem присваивается ссылка на объект класса NotesItem, представляющий первый пункт в документе doc.

Из рассмотренного примера становится очевидной следующая иерархия классов:
NotesSession -> NotesDatabase -> NotesView -> NotesDocument -> NotesItem
 
S

SOFTOBZOR.ru

Да, поле точно называеться attach
Set rtitem = doc.GetFirstItem( "attach" )

На какой строчке? :) ... незнаю компилятор не ругаеться, происходит ошибка тогда, когда я прикрипил файл и Sub Click(Source As Button) сделал.


PS - Спасибо за справочку!
Очень полезно и исчерпывающе, а вам не было бы сложно поделиться этим файлом (Взято из электронной справки неизвестного происхождения) v_vasilev#softobzor.ru
Я бы его выложил на свой сервер, было бы полезно для многих.
 
G

Guest

Попробуй сохранить документ с вложением, а потом уже открыть или обновить и нажать на кнопку.
Я твой код проверила у меня нормально работает.

Справку кину :)
 
S

SOFTOBZOR.ru

Да работет!
За справочку спасибо, будем читать - пробовать.

А как в LotusScript происхоить создание перенной, для работы во всем документе, а не только в этом коде.
Допустим я получил колличество приатаченых файлов [attachCount] .

Я хочу создать "глобальную" переменную в которой содержится это число (attach) что бы подставить его в поле на форме.
 
N

nor

Объяви эту переменную в области

(Globals)
(Declaration)

документа или библиотеки скриптов.

Вообще пользуйся лучше классами.
 
S

SOFTOBZOR.ru

Код:
Sub Click(Source As Button)

Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument 
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document

Dim rtitem As Variant
Dim attachCount As Integer

Set rtitem = doc.GetFirstItem( "attach" )
attachCount = 0
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
Select Case o.Type
Case EMBED_ATTACHMENT:
 attachCount = attachCount + 1
End Select
End Forall
End If

В Declaration прописал

Код:
Dim attachCount As Integer

На форме создал вычисляемое поле по формуле
Код:
@if(attachCount="";"0";attachCount)

Но почему то не что не возвращаеться, что я делаю не так?
 
S

SOFTOBZOR.ru

Господа подскажите пожалуйста, как обьявить ГЛОБАЛЬНО переменную
В глобал Декларация пишу
Код:
Dim attachCount As Integer

От куда получеться attachCount описано выше, но ни как не могу эту переменную всунуть в вычисляемое поле.
 
G

Guest

Нельзя так, насколько я знаю.
Если глобальная переменная определена в LS, то из формул к ней сложно обратиться.
Лучше запиши глобальную переменную в notes.ini, а потом ее доставай @Environment
 
S

SOFTOBZOR.ru

<!--QuoteBegin-Юлия+28:03:2006, 09:32 -->
<span class="vbquote">(Юлия @ 28:03:2006, 09:32 )</span><!--QuoteEBegin-->Лучше запиши глобальную переменную в notes.ini[/quote]

:)
ого, это уже хирургическое вмешательство, нехотелось бы...
тем более учитывая то, что таких переменных в итоге будет с десяток.
например a1, a2, a3, a4, ...., an

Суть то вот вот в чем: к примеру есть фирма в городе "X" она присылает по Email докумен Word заполненый по определенной форме, вот мне интересно, осуществить перенос данных из Word документа в лотус документ, что бы проверить ошибки (например что-то не заполнено). Ну а дальше уже делать представления и тому подобные штуки.

Вот что-то голову сломал уже. :(
 
G

Guest

Можно сделать обработку одной функцией в кнопке.
Типа нажимает пользователь на кнопку "Импортировать" и данные выгружаются из документа, проверяются и передаются полям формы.
Если данных не хватает, то можем вывести сообщение об ошибке или загрузить неполные данные.
Для каждого дока можно создавать отдельную новую форму.
 
S

SOFTOBZOR.ru

<!--QuoteBegin-Юлия+28:03:2006, 09:50 -->
<span class="vbquote">(Юлия @ 28:03:2006, 09:50 )</span><!--QuoteEBegin-->и данные выгружаются из документа, проверяются и передаются полям формы
[snapback]32599" rel="nofollow" target="_blank[/snapback]​
[/quote]
Вот тут то и сложность, что бы передать дынные полям.
Это можно сделать средствами LotusScript?

А то я может зря заморачиваюсь?
Если есть способ - то ура!
 
G

Guest

Например так:

Код:
Dim doc As NotesDocument
Dim item As NotesItem
.....
strText = wdApp.ActiveDocument.Tables(1).Rows(1).Cells(1).Range.Text
Set item = doc.ReplaceItemValue( "ПолеКудаЗапоминаем", strText )
Call doc.Save( True, True )
 
S

SOFTOBZOR.ru

:) здорово! дело сразу сдвинулось с мертвой точки.
И как всегда ответ порождает новый вопрос :(
Как можно средствами LScript осуществить @Trim(") функцию.
А то ворд всегда в конце вернувшегося значения дописывает кватрат
 
G

Guest

см в хелпе @Trim.
Там внизу есть синонимы для LS и/или JS. :)
 
A

alb

Например так:

Код
Dim doc As NotesDocument
Dim item As NotesItem
.....
strText = wdApp.ActiveDocument.Tables(1).Rows(1).Cells(1).Range.Text
Set item = doc.ReplaceItemValue( "ПолеКудаЗапоминаем", strText )
Call doc.Save( True, True )
а что если в теле документа есть другие объекты кроме текста их тоже надо по разным ртф поля надо вставлять. иногда отдельно иногда вместе с текстом.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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