Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка документов и перенос в другую папку
Форум программистов > Базы данных и администрирование > Lotus > Lotus - Программирование
AndryG
Доброго времени суток.
Свела судьба с Лотусом ... учусь разбирать почту.
В папку spider\atm\upc с помощью правил в Notes переносятся пришедшие документы.

Используя COM (скрипт на PHP, но это не имеет значения в данном случае) подключаюсь к базе, просматриваю эту папку, обрабатываю каждый документ и переношу его в архивную папку.
  $n_session = new COM("Lotus.NotesSession");
  $n_session->initialize($conf->get('notes_password')); // Подключаемся ...
  $n_dir = $n_session->GetDbDirectory($conf->get('notes_server'))->
             OpenMailDatabase()->
             GetView('spider\atm\upc'); // получаю объект папки
  $n_doc = $n_dir->GetFirstDocument();
  while(is_object($n_doc)){
   /* здесь была обработка документа ... она работает нормально */
    $n_doc_next = $n_dir->GetNextDocument($n_doc); // получаем объект следующего док.
    $n_doc->PutInFolder('spider\arh\atm-upc'); // копируем в архив
    $n_doc->RemoveFromFolder($n_dir->name); //удаляем текущий док из рабочей папки !!!!! ПРОБЛЕМА
    print_r($n_doc->GetItemValue('Subject')); //отладочная штука - дабы видеть, сколько доков обработали
    $n_doc = $n_doc_next; //Следующий док становится текущим.
   }
echo "End of script.\n";

В папке имею пять док. При запуске скрипта сперва обрабатывается три, при следующем - два.
Если убрать строку удаления документа - все пять при первом запуске.

Документы приходили на ящик тоже сперва два, потом (через пару часов) три - так "группами" и обрабатываются.

Откройте секрет ... в чем загвоздка ... понимаю, что теряется ссылка на след. документ ... но как исправить - не могу придумать.
Medevic
Я бы взял коллекцию записей в папке с помощью NotesViewEntryCollection. И обрабатывал бы эту коллекцию.
AndryG
метод NotesDataBase->Search() -- возвращает коллекцию документов по ВСЕЙ базе ... в том числе и с уже обработанными доками в папке архива. sad.gif (как бы отобрать только нужное ...)

метод NotesView->GetAllDocumentsByKey() -- массив поиска задавать ... как?
Под каждое поле View задаем элемент таблицы соответствующего типа и с нужной маской?
Представление ($inbox) - шесть полей ... но скрипт не ругается только при двух элементах в таблице... видать полей много, но индексированные только два (догадка :-) ) .. как узнать, что это за поля?
маски поиска .. стандартные * ?

Может есть более элегантное решение?
Medevic
Я предлагал что-то типа этого:
...
Set vc = NotesView.AllEntries
Set ve = vc.GetFirstEntry( )
While Not (ve is Nothing)
  If ve.IsDocument Then
    Set doc = ve.Document
    ...
    Call doc.PutInFolder(...)
    Call doc.RemoveFormFolder(...)
  End If
Set ve = vc.GetNextEntry(ve)
Wend
AndryG
Спасибо! Заработало ... всё забрало с первого прохода.

Если не лень ... можете пояснить в двух словах, что такое Entry и в чем отличие от Document?
И почему первый вариант не работал?

Глубоко и серьезно Лотус я изучать не собираюсь (просто столкнулся с ним) но в общих чертах узнать бы, что за беда была...
___
P.S. Вдруг кому интересно будет ...
  $n_session = new COM("Lotus.NotesSession");
  $n_session->initialize($conf->get('notes_password'));
  $n_list = $n_session
            ->GetDbDirectory($conf->get('notes_server'))
            ->OpenMailDatabase()
            ->GetView('spider\atm\upc')
            ->AllEntries;
  echo "Docs: ".$n_list->Count."\n";
  $n_entry = $n_list->GetFirstEntry();
  while(is_object($n_entry)){
    if($n_entry->IsDocument){
      $n_doc = $n_entry->Document;
      echo ' Date: '.$n_doc->GetFirstItem("PostedDate")->text."\n";
      $n_doc->PutInFolder('spider\arh\atm-upc');
      $n_doc->RemoveFromFolder('spider\atm\upc');
    }
    $n_entry = $n_list->GetNextEntry($n_entry);
  }
Medevic
Цитата(AndryG @ 5:08:2008 - 15:33) *
Если не лень ... можете пояснить в двух словах, что такое Entry и в чем отличие от Document?

Entry - строка в представлении. Может быть как документом, так и категорией, например.

Цитата(AndryG @ 5:08:2008 - 15:33) *
И почему первый вариант не работал?

Нужно было использовать обновление(notesView.Refresh), чтобы получать актуальное состояние папки после удаления. Но при этом кем-нибудь в папку могли бы добавляться/удаляться документы. Да и медленнее это. Поэтому лучше взять коллекцию и обработать её.
AndryG
Понятно ... понятно, что "поверхам" не осилить :-)

Ее вопрос небольшой - третий день не могу пометить письмо как прочитанное sad.gif
Где этот флаг в документе прячется? Или он вне документа живет?
Akupaka
этот флаг прячется в спец. таблице вне базы... если то, что я знаю - правда, то эта таблица на самом клиенте строится...
попробуйте метод notesDocument.Save( force, createResponse [, markRead ] )
AndryG
  $n_entry = $n_list->GetFirstEntry();
   while(is_object($n_entry)){ //проходим по докам в папке ящика
    if($n_entry->IsDocument){
      $n_doc = $n_entry->Document;
   ...
      while($n_doc->HasItem('$FILE')){//проходим по всем аттачам письма
   ...
        $n_filenameitem->Remove;
      } // while по $FILE
      $n_doc->Save(true,false,true);      // СОХРАНЕНИЕ С СНЯТИЕМ МЕТКИ О ПРОЧТЕНИИ
      $n_doc->PutInFolder('spider\arh\atm-upc');
      $n_doc->RemoveFromFolder('spider\atm-upc');
    } // if IsDoc
    $n_entry = $n_list->GetNextEntry($n_entry);
  } // while по entry

При таком раскладе из писем благополучно исчезают вложения (от этого нужно избавится), что означает, что документ сохраняется ... но "признак прочтения" не изменяется никак.
Пробовал и false и true третим параметром для прочтенных и новых писем -- признак прочтения не изменяется.
Akupaka
подожди smile.gif
признак прочтения где не меняется? у какого пользователя? где и от чьего имени выполняется вышеуказанный код?
AndryG
У меня на компе стоит LotusNotes.
PHP cкрипт через COM подключается под моей же (я так думаю) учетной записью и шерстит почту.
подключение
 $n_session = new COM("Lotus.NotesSession"); // создаем объект сессии
  $n_session->initialize($conf->get('password','notes')); // подключаемся

  //Через кучу методов/свойств получаем объект "вхождений" указанной папки почты
  $n_list = $n_session->GetDbDirectory($conf->get('server','notes'))->OpenMailDatabase()->GetView('spider\atm-upc')->AllEntries;
//дальше идет код с поста выше

Ложу в папку пару "прочтенных" и "непрочтенных" доков с вложениями - запускаю скрипт.
Документы перекладываются в другую папку, из них удаляются вложения (временный глюк), статус прочтения не изменяется.

Сам я админом сей системы не являюсь и о работе ее знаю .. ровно сколько в COM-интерфейсе разобрался.
Лень заставила взяться за написание скрипта :-)
Akupaka
хм... чесгря, не знаю, работает ли через КОМ этот параметр...
а без ПХП, эту обработку никак? в смысле, в самом клиенте нельзя сделать?
AndryG
Меня бы устроил агент, дабы при попадании писем в папку "ABC" они превращались в прочитанные, но я обладаю минимумом прав ... и не могу создать агента.
А больше вариантов у меня нет в голове.
Если через COM добраться до этого флага нельзя - значит придется смириться.
Akupaka
я имел ввиду вообще сделать все то, что ты делаешь не через внешнюю программу, а с помощью средств лотуса
если нету прав на конкретную базу, то можно сделать свою локальную в которой будет нужный код, обрабатывающий доки в другой базе...
AndryG
Это сильно круто :-)

Спасибо за помощь. Будем считать вопрос закрытым.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.