2009-11-11 2 views
0

Я хочу programaticaly изменить некоторые значения в НФС пункта, а затем хотите сохранить его (т.е. редактировать NSF файлов, а затем сохранить издания)Как отредактировать файл NSF с помощью C#?

, например:.

Я хочу установить имя отправителя всех почты на "[email protected]". (Использование Domino.dll).

Решение Я попробовал: (Swaping из To и От значений)

Строка Temp_From = ((Object []) docInbox.GetItemValue ("С")) [0] в виде строки; String Temp_SendTo = ((object []) docInbox.GetItemValue ("SendTo")) [0] as String; docInbox.ReplaceItemValue ("From", Temp_SendTo); docInbox.ReplaceItemValue ("SendTo", Temp_From); docInbox.Save (true, false, false);

/* Применяется для следующих полей также:

Для От: AltFrom, DisplayFrom, DisplayFrom_2, dspFrom, ForwardedFrom, INetFrom, tmpDisplayFrom

Для To: displaySendTo, EnterSendTo, Envelope_to, tmpDisplaySendTo

Также попытался сохранить: docInbox.Save (true, true, true); */

В приведенном выше коде после успешного редактирования изменения значения не отражаются в файле Nsf. Но когда я читаю редактируемый файл Nsf (копирование измененного файла в другом месте), он программно отображает измененные значения. (Почему изменения не видны здесь?)

+0

Когда вы говорите, что измененные значения не отображаются в файле NSF - как вы просматриваете NSF? Если через просмотр в клиенте Notes, очень возможно, что представление не было обновлено. Попробуйте использовать Свойства документа, чтобы увидеть фактические значения полей. Также убедитесь, что в представлении используется то же поле, которое вы изменили. –

ответ

0

«Руководство по программированию, том 2: LotusScript/COM/OLE Классы»можно найти здесь: http://www-12.lotus.com/ldd/doc/uafiles.nsf/docs/DESIGNER70/

Как краткий обзор, хотя, как только вы описатель документа, вы можете перебрать все существующие поля („элементы“) по этому документу, используя свойство Items; и вы можете обновить данное поле в этом документе, используя методы ReplaceItemValue и/или AppendItemValue.

0

Вы проверяете результат с клиентом Notes? Я предполагаю, что это поведение можно объяснить довольно агрессивным кэшированием клиента. Попробуйте удалить файл cache.ndk из каталога данных, прежде чем вы проверите результат своей программы.

Кроме того, примечание «Товар» обычно содержит массив значений - ваш подход к замене полей SendTo и From потеряет данные, если, например, почтовое отправление было отправлено нескольким людям. Попробуйте скопировать все object[].

0

Я сделал это один раз.

Вы должны добавить новую ссылку на свой проект и выбрать «COM» в диалоговом окне «Добавить ссылку». Найдите в списке компонент с именем «Lotus Domino Objects» и добавьте его. Вы увидите новую ссылку «Domino», добавленную в ваш проект. Этот COM-компонент установлен клиентом Lotus Notes. Вы должны иметь его на своей машине разработки, и вам придется установить его при запуске приложения.

С этого момента вы можете использовать большинство классов, которые у вас есть при разработке с помощью lotusscript в NotesDesigner.

Добавить соответствующий 'используя' заявление:

using Domino; 

Создать ноты сессии:

NotesSession session = new NotesSession(); 
session.Initialize("mypassword"); 
//this uses your current Notes location and id. 
//i think you can use session.Initialize("") if notes is already running and you are already logged in. 

Получить базу данных:

NotesDatabase notesDb = session.GetDatabase("server", "database", false); 

Получить некоторые документы, например: Сегодня (если вы открыли базу данных, то ваш mail.nsf)

NotesDocumentCollection col = null; 
try { col = notesDb.Search("Form = \"Appointment\" & StartDate = @Today", null, 0); } 
catch (Exception e) { } 

Итерация по коллекции:

if (null != col) 
{ 
    NotesDocument doc = col.GetFirstDocument(); 
    while (doc != null) 
    { 
     //do your magic tricks 
     doc = col.GetNextDocument(doc); 
    } 
}  

Одна проблема, я заметил, с этим интерфейсом: нет session.Close() метод, ни что-либо подобное, и мои сеансы не были закрыты на сервере, как только GC собрал объект C#. Как только я открыл новый NotesSession(), он остался жив на сервере domino, пока мой поток C# был жив. Чтобы решить эту проблему, мне пришлось создавать фоновые потоки и создавать экземпляры NotesSession() только из потоков. Перед началом работы потоки также должны были быть настроены с использованием режима квартиры STA.

Thread thread = new Thread(new ThreadStart(MyFunctionThatInstantiatesNewNotesSessions)); 
thread.SetApartmentState(System.Threading.ApartmentState.STA); 
thread.Start(); 
thread.Join(); 

Я не уверен, что эта проблема действительно является проблемой в интерфейсе, или что-то еще, что я сделал неправильно в своем коде. Но если кто-то сталкивается с этой проблемой: нити - это то, как я ее исправил.