Форум продуктов IBM Lotus

Общие вопросы => Разработка приложений => Тема начата: K85 от 22 Сентябрь 2009, 13:14:04

Название: Перемещение писем в папки
Отправлено: K85 от 22 Сентябрь 2009, 13:14:04
У меня есть переделанная почтовая база, в ней когда приходит новая почта агентом переносится письмо в одну из папок. А появилась необходимость сделать форму, в которой будут задаваться эти названия папок и при нажатии Ок запускался тот агент, а в агенте данные брались из этих полей.  ???
На данный момент названия папок создаются в самом агенте.
Может кто-то делал?! просто что-то не могу добиться данного результата     :'(
Название: Re: Перемещение писем в папки
Отправлено: K85 от 22 Сентябрь 2009, 15:49:27
Вот код самого агенка, который проверяет почту и отправляет письма по папкам:
Set db = s.CurrentDatabase
Set doc=s.DocumentContext

vSubj$ = doc.Subject(0)
vAdr$ = doc.From(0)
Flag% = 0

'Разбираем поле Subject, оно должно быть в формате sXXXX-RR
'Где XXXX - номер, а RR - номер реестра
'Если поле Subject соответсвует указанной гипотезе то помещает сообщение в папку RR\XXXX
'Если папка отсуствует - создаем ее
If (Strcompare(FormName$, "Memo", 1) = 0) Then
Subject$ = Trim$(doc.Subject(0))

'Достаем Номер
S1$ = Strleft(Subject$, "-")
S1$ = Trim$(Right(S1$, Len(S1$)-1))

'Достаем КОДИФИКАТОР-2
S2$ = Strright(Subject$, "-")
S2$ = Trim$(Left(S2$, Len(S2$)))

Select Case S1$
Case "0001"
S1$ = "0001 – папка1"
Case "0002"
S1$ = "0002 – папка2"
……………………….
Case Else
S1$="Неизвестный"
' отправка сообщения
………..
Flag% = 1
End Select

Select Case S2$
Case "00"
S2$ = "00 – Осн.папка1"
Case "01"
S2$ = "01 – Осн.папка2"
………………………..
Case Else
S2$ = "Неизвестный"
If Flag% = 0 Then
' отправка сообщения
………
End If
Flag% = 1
End Select

'Проверяем целевую папку для сообщения, если нет то создаем, после чего перемещаем сообщение
Folder$ = S2$ + "\" + S1$
Set view = db.GetView( Folder$ )
If ( view Is Nothing ) Then
Call db.EnableFolder(Folder$)
Call doc.PutInFolder(Folder$)
Call doc.RemoveFromFolder("($Inbox)")
If Flag% = 0 Then
vSS$ = GetFilesInfo(doc)
vSD$ = Date$ + " " + Time$ + Uchr$ (10)
' отправка сообщения
…………….
End If
Else
Call doc.PutInFolder(Folder$)
Call doc.RemoveFromFolder("($Inbox)")
If Flag% = 0 Then
vSS$ = GetFilesInfo(doc)
vSD$ = Date$ + " " + Time$ + Uchr$ (10)
………………
End If
End If
End If

проблема в том, что агент не создает новые папки пока не укажешь название в самом агенте, поэтому и хотелось бы отдельную форму, в которой и заполнялись бы эти названия новых папок
Название: Re: Перемещение писем в папки
Отправлено: ViV от 22 Сентябрь 2009, 17:31:39
Т.е. db.EnableFolder(Folder$) не создает папку? а в каком случае создает?
Название: Re: Перемещение писем в папки
Отправлено: K85 от 22 Сентябрь 2009, 17:51:48
создает, когда в
  Select Case S1$
  Case "0001"
  S1$ = "0001 – папка1"
указываешь название новой папки, тогда письмо прийдет в новую папку
т.е. в коде Case "0001" ..... Case "nnnn" надо постоянно добавлять
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Сентябрь 2009, 09:33:34
Итак, пользователю приходит письмо, в теме которого указано в какую папку его класть. В формате <название папки>-<название подпапки>. Вам нужно, чтобы письма в автоматическом режиме раскладовались по нужным папкам. Правильно?

Если да, то можно без select case:
S1$ = S1$ + "папка" + StrRightBack(S1$, "0")
аналогично для S2$, ну и дополнительно обрабатывать S1$ без "0" и т.д.

Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Сентябрь 2009, 10:00:13
спасибо за ответ, но я не очень понимаю, что такое "папка"?
Я вот думаю, что папку создавать в новой форме, но правда еще не совсем понимаю как  ???. Потом в агенте использовать папки, созданные в новой форме

названия папок выглядят так:
00 - папка1
   0000 - подпапка01
   0001 - подпапка02
07 - папка2
   0009 - подпапка07
   0075 - подпапка08
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Сентябрь 2009, 10:07:49
Папка - это наподобие представления (списка документов), в которое вы можете добавлять/удалять документы. Служит для логического упорядочивания документов.

Зачем вам отдельно создавать папки, еслу у вас в агенте их создает метод EnableFolder(...)?
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Сентябрь 2009, 10:12:10
может я не совсем точно излогаюсь...
приходит письмо, в теме которого написано s00-000, соответственно письмо перемещается в папку00 и подпапку 0000, но при этом мне необходимо где-то вводить названия этих новых папок, т.е. папка00 - это например, филиал1, а подпапка 0000 - название отдела.

я в Правилах добавляю кнопку создания новой папки, открывается форма, на ней заполняю два поля (основной папки и подпапки), а вот как сделать чтобы при нажатии на кнопку Ок эта папка создавалась в навигаторе???
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Сентябрь 2009, 10:35:04
Т.е. номеру в теме сообщения соответсвует свое название папки/подпапки?
Тогда лучше было бы сделать справочник по соответствию "номер" - "название папки". И при получении письма в агенте автоматом определять название папки по справочнику.
Если пользовательская почтовая БД не одна, то справочник (форма+представление) лучше сделать в отдельной БД, к которой обращаться при приеме писем.
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Сентябрь 2009, 11:01:09
можно ли сделать так:
- стандартным способом создаю папку и подпапку, при нажатии на кнопку Папка\Создать папку
- отправляю письмо,в теме которого указан это номер новой папки
- агентом проверяю номера и названия папок (написанные не в самом агенте) созданные стандартным методом
- письмо после проверки агента , перемещается в нужную папку.

???????????

сейчас сделано так, только папки создаются в самом агенте, а не стандартно, и там же в самом агенте и проверяются названия папок, номера которых должны соответствовать теме письма

Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Сентябрь 2009, 11:08:06
можно
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Сентябрь 2009, 11:09:36
если можете подскажите плизз, как определять в агенте название папки, созданной стандартно

насколько я понимаю, то надо вместо select case, как-то определять название папки в виде
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Сентябрь 2009, 11:24:10
Только условным блоком. А как еще определить соответствие названия номеру, у вас ведь в явном виде название папки не фигурирует в письме.
Тем же select case'ом в агенте прописывайте соответствие названия номеру.

Только при добавлении/изменении папок вам прийдется сначала вручную их создать, а потом в агенте прописать соответствие.
При использовании справочника вам бы не пришлось делать лишних действий и лезть в код.
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Сентябрь 2009, 11:29:16
тогда если можно... объясните поподробней оспаровчнике...
т.е. в справонике создаютсянания папок и подпапок
а потом они должны проверяться в агенте
Правильно?
а как они будут проверятся в самом агенте???
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Сентябрь 2009, 11:46:15
Справочник представляет из себя форму с двумя полями (номер и название папки) и представление для выборки.

В агенте вы извлекаете номер из темы сообщения, затем ищете в справочнике документ по этому номеру (например с помощью notesView.GetDocumentByKey(...)). Из документа берете название папки. Затем, таким же образом получаете название подпапки. Формируете иерархическое имя папки (папка\подпапка). Выполняете db.EnableFolder(...). Помещаете письмо в эту папку.
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Сентябрь 2009, 15:11:17
если можете помогите  :'(
уже раз 40 переделываю.......
создана база, в ней поля Name - название папки, Alias - доп.значение
потом в агенте
If (Strcompare(FormName$, "Memo", 1) = 0) Then
Subject$ = Trim$(doc.Subject(0))
'Достаем КОДИФИКАТОР
S1$ = Strleft(Subject$, "-")
S1$ = Trim$(Right(S1$, Len(S1$)-1))

'Достаем КОДИФИКАТОР-2
S2$ = Strright(Subject$, "-")
S2$ = Trim$(Left(S2$, Len(S2$)))
проверяю название письма
далее необходимо найти это название в базе, но никак не могу понят как надо делать

Dim DB As NotesDatabase
Dim Doc As NotesDocument
Set DB = session.GetDatabase ( db.Server, "BВ\\gf.nsf" )
Set DB_DbCodesLookup = DB.GetView("Papki")
Set Doc = DB_DbCodesLookup.GetDocumentByKey(Lcase(Doc.GetItemValue("Alias")(0)))
If Not Doc Is Nothing Then ........

если закончить If Not Doc Is Nothing Then S1$ = Doc.GetItemValue("Alias")(0)
то создается новая папка с подпапкой, а должно было найти нужную папку и в нее переместить
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Сентябрь 2009, 18:26:53
Второй кусок кода странноватый...

Set DB = session.GetDatabase ( db.Server, "BВ\\gf.nsf" )один слеш лишний
Set DB = session.GetDatabase (db.Server, "BВ\gf.nsf")

Set Doc = DB_DbCodesLookup.GetDocumentByKey(Lcase(Doc.GetItemValue("Alias")(0)))откуда в Doc.GetItemValue("Alias")(0) может быть значение, если вы только ищете этот документ??

Set Doc = DB_DbCodesLookup.GetDocumentByKey(S2$)
If Not Doc Is Nothing Then
  mainfstr = Doc.Alias(0)
End if
для папки
и
Set Doc = DB_DbCodesLookup.GetDocumentByKey(S1$)
If Not Doc Is Nothing Then
  subfstr = Doc.Alias(0)
End if
для подпапки.

далее если заданы mainfstr и subfstr, то
Folder$ = mainfstr + "\" + subfstr
Название: Re: Перемещение писем в папки
Отправлено: K85 от 24 Сентябрь 2009, 10:52:36
ViV
Огромное спасибо! Все работает.
Есть еще небольшое дополнение, вдруг кому-то будет надо, перед Folder$ = mainfstr + "\" + subfstr
необходимо опять вернуться в почтовую базу
Set db = s.CurrentDatabase
Set doc=s.DocumentContext
так как иначе папки и подпапки создаются в базе BВ\gf.nsf
Название: Re: Перемещение писем в папки
Отправлено: ViV от 24 Сентябрь 2009, 10:55:27
Лучше использовать другую переменную для базы справочника, не db, тогда и возвращаться не прийдется;)
Название: Re: Перемещение писем в папки
Отправлено: K85 от 24 Сентябрь 2009, 13:33:50
у меня появился еще один вопрос....
а можно ли как-то или после приема письма обновлять навигатор, чтобы папки сразу добавлялись или  сделать кнопку, при нажатии которой будет происходить обновление папок(возможно это лучше, т.к. не будет постоянно запускаться)
Название: Re: Перемещение писем в папки
Отправлено: ViV от 24 Сентябрь 2009, 14:43:47
Попробуйте поставить кнопку с формулой:
@Command( [RefreshWindow] )
Название: Re: Перемещение писем в папки
Отправлено: K85 от 24 Сентябрь 2009, 15:57:55
точно! СПАСИБО  :D
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Ноябрь 2009, 09:57:27
Доброе утро. Помогите, если можете.
Появилась проблема, когда в бд "BВ\gf.nsf" создаю название, которое имеет более 31 символа, то новая папка не создается в виде. Не подскажете почему?
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Ноябрь 2009, 10:21:20
Доброе утро!
Что значит "папка не создается в виде"? Может просто не создается папка с длинным именем?
Вообще ограничение на имена видов/папок - 64 символа (Domino limits (http://www.geniisoft.com/showcase.nsf/DominoLimits)). Возможно из-за русских символов получается 32 символа.
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Ноябрь 2009, 10:26:24
т.е. с этим я ничего сделать не смогу?!
Папка не отображается в виде, если имеет, например 33 символа, как только делаю короче название папка отображается
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Ноябрь 2009, 10:37:24
Попробуйте вручную создать папку с таким именем, что на это скажет Lotus Notes?

А зачем такое громадное имя для папки, с ним же не удобно потом работать?
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Ноябрь 2009, 10:58:44
не подскажете, какой @-формулой можно ограничить количество вводимых символов в поле, т.е. при сохранении, если в поле введено, например больше 38 символов, чтобы писало "нельзя вводить больше 38 символов"
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Ноябрь 2009, 11:37:13
пробую сделать так:
@If ( @Length (@ThisValue) < 39;  @ThisValue;@Failure("Превышено количество"));
при кол-ве символов больше 38 пишет сообщение в самом поле Превышено количество  :(
Название: Re: Перемещение писем в папки
Отправлено: ViV от 23 Ноябрь 2009, 11:43:59
Посмотрите в сторону "input validation"
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Ноябрь 2009, 12:49:21
в Input Validation формула:
@If(@Length(@text(Name))<10;@Success;@Failure("Количество превысило 38 символов!"));
после ввода неверного значения сначала выскакивает окно с предупреждением, а потом окно: NotesError - field didn't pass validation formula.
Как от этого сообщения избавиться?!
Название: Re: Перемещение писем в папки
Отправлено: K85 от 23 Ноябрь 2009, 13:09:15
Все разобрался. Спасибо за помощь VIV