2009-11-11 12 views
0

Je veux programaticaly changer certaines valeurs à l'article NSF et que vous souhaitez enregistrer (par exemple modifier le fichier NSF et puis enregistrez les éditions)Comment modifier le fichier NSF à l'aide de C#?

par exemple:.

Je veux définir le nom de l'expéditeur de tous mails à "[email protected]" (en utilisant Domino.dll).

Solution J'ai essayé: (swaping de vers et à partir des valeurs)

Chaîne Temp_From = ((objet []) docInbox.GetItemValue ("From")) [0] sous forme de chaîne; Chaîne Temp_SendTo = ((objet []) docInbox.GetItemValue ("SendTo")) [0] as String; docInbox.ReplaceItemValue ("De", Temp_SendTo); docInbox.ReplaceItemValue ("SendTo", Temp_From); docInbox.Save (true, false, false);

/* Appliqué pour les champs suivants:

Pour De: AltFrom, DisplayFrom, DisplayFrom_2, dspFrom, ForwardedFrom, INetFrom, tmpDisplayFrom

Pour Pour: displaySendTo, EnterSendTo, Envelope_to, tmpDisplaySendTo

Aussi essayé pour sauver: docInbox.Save (vrai, vrai, vrai); */

Dans le code ci-dessus après modification réussie, les valeurs ne sont pas reflétées dans le fichier Nsf. Mais quand je lis edited Nsf (copie d'un fichier modifié sur emplacement différent) fichier programatically il montre les valeurs modifiées

+0

Lorsque vous dites que les valeurs modifiées ne sont pas refletées dans le fichier NSF - comment visualisez-vous la NSF? Si à travers une vue dans le client Notes, il est très possible que la vue n'a pas été actualisée. Essayez d'utiliser les propriétés du document pour voir les valeurs de champ sous-jacentes réelles. En outre, confirmez que la vue utilise le même champ que vous avez modifié. –

Répondre

0

Le « Guide de programmation, Volume 2. (Pourquoi les changements ne sont pas visibles ici?): LotusScript/COM/OLE les classes » se trouve ici: http://www-12.lotus.com/ldd/doc/uafiles.nsf/docs/DESIGNER70/

en bref résumé, bien que, une fois que vous avez une poignée à un document, vous pouvez itérer sur tous les champs existants (les « articles ») sur ce document en utilisant la propriété Items; et vous pouvez mettre à jour un champ donné sur ce document en utilisant les méthodes ReplaceItemValue et/ou AppendItemValue.

0

Vérifiez-vous le résultat avec le client Notes? Je suppose que ce comportement pourrait s'expliquer par la mise en cache plutôt agressive du client. Essayez de supprimer le fichier cache.ndk du répertoire de données avant de vérifier le résultat de votre programme. En outre, un «élément» Notes contient généralement un tableau de valeurs - votre approche pour échanger les champs SendTo et From perdra des données si, par exemple, un message a été envoyé à plusieurs personnes. Essayez plutôt de copier l'intégralité du object[].

0

Je l'ai fait une fois.

Vous devez ajouter une nouvelle référence à votre projet et choisir 'COM' dans la boîte de dialogue 'Ajouter une référence'. Trouvez le composant nommé 'Lotus Domino Objects' dans la liste et ajoutez-le. Vous verrez une nouvelle référence appelée "Domino" ajoutée à votre projet. Ce composant COM est installé par le client Lotus Notes. Vous devez l'avoir dans votre machine de développement, et vous devrez l'installer quand vous lancerez votre application. A partir de là, vous pouvez utiliser la plupart des classes disponibles lors du développement avec lotuscript dans NotesDesigner.

Ajouter un lieu 'en utilisant' déclaration:

using Domino; 

Créer une session Notes:

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. 

Obtenir une base de données:

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

Obtenez des documents, par exemple: d'aujourd'hui rendez-vous (si la base de données que vous avez ouverte est votre mail.nsf)

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

Itérer dans votre collection:

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

Un problème que je remarqué avec cette interface: il n'y a pas de méthode session.Close(), ni rien de semblable, et mes séances n'étaient pas fermé dans le serveur une fois que la GC a collecté l'objet C#. Une fois que j'ai ouvert un nouveau NotesSession(), il est resté actif sur le serveur domino tant que mon thread C# était actif. Pour résoudre ce problème, j'ai dû créer des threads d'arrière-plan et instancier uniquement de nouveaux objets NotesSession() à partir des threads. Les threads devaient également être configurés avec le mode STA apartment avant d'être démarrés. Je ne suis pas sûr si ce problème est vraiment un problème dans l'interface, ou quelque chose d'autre que j'ai mal fait dans mon code. Mais si quelqu'un est confronté à ce problème: les threads sont la façon dont je l'ai réparé.