2010-09-15 5 views
0

Cette fonction a été écrit pour créer un e-mail Lotus, peupler, enregistrez-vous à la section Brouillons, puis ouvrez-le pour l'utilisateur de modifier . Cependant, il a 2 problèmes:Un peu buggé: Code pour créer, enregistrer, et ouvrir un Lotus projet Email à travers VBA

  1. Il ne s'ouvre pas toujours le bon brouillon d'email pour l'édition.
  2. Il produit parfois une "erreur Notes - commande spécifiée n'est pas disponible à partir de l'espace de travail." Message d'erreur. (L'email est toujours sauvegardé, donc ce n'est pas une grosse perte).

Les deux problèmes se produisent à intervalles irréguliers. S'il y a un motif, je ne l'ai pas encore vu. Puis-je faire disparaître ces problèmes? D'autres conseils sur la réduction des erreurs ici?

(Note: Je quitte le gestionnaire d'erreurs)

Dim NtSession As New NotesSession 
Dim NtDB As New NotesDatabase 
Dim NtWkSp As Object 
Dim NtDoc As New NotesDocument 
Dim NtObj As New NotesEmbeddedObject 
Dim NtBodyRT As New NotesRichTextItem 
NtSession.Initialize 

'========================================================================== 
'Open the mail server 
Set NtDB = NtSession.GetDatabase(_ 
    NtSession.GetEnvironmentString("MailServer", True), _ 
    NtSession.GetEnvironmentString("MailFile", True), _ 
    True) 

'========================================================================== 
'Fill in basic email fields 
Set NtDoc = NtDB.CreateDocument 
NtDoc.AppendItemValue "Form", "Memo" 
Set NtBodyRT = NtDoc.CreateRichTextItem("Body") 
AddFields 

'========================================================================= 
' Save it to the drafts folder 
DoEvents 
NtDoc.SaveMessageOnSend = True 
NtDoc.SignOnSend = True 
NtDoc.Save False, False, True 
Set NtWkSp = CreateObject("Notes.NotesUIWorkspace") 
DoEvents 
NtWkSp.OpenDatabase _ 
    NtSession.GetEnvironmentString("MailServer", True), _ 
    NtSession.GetEnvironmentString("MailFile", True), _ 
    "($Drafts)" 
DoEvents 
NtWkSp.VIEWREFRESH 
NtWkSp.EDITDOCUMENT 

Set NtWkSp = Nothing 
Set NtSession = Nothing 

Répondre

0

après la NtWkSp.VIEWREFRESH appel que vous devrez vous assurer que la sélection de vue est sur le projet que vous venez d'ajouter, sinon, lorsque vous appelez NtWkSp.EDITDOCUMENT il ouvrira toujours le premier brouillon, puisque c'est là que le voit pointer.

Autre que cela, il semble étrange que vous utilisez une liaison anticipée pour les objets Domino et reliure de dernière minute pour les classes Lotus d'automatisation, mais peut-être il y a un but?

Sur quelle ligne l'erreur Notes se produit-elle?

+0

Je ne sais pas exactement où l'erreur se produit car il est difficile de reproduire pendant les heures normales de travail. – PowerUser

+0

Pour répondre à votre question Early ou liaison tardive, je ne me souviens plus de la raison originale. Mais cela fonctionne (la plupart du temps). Si vous pensez que je devrais lier tout en retard, je peux le faire aussi. – PowerUser

+0

Cela fonctionnera encore, juste un peu déroutant. – Fink

0

La méthode NotesUIWorkspace EditDocument peut éventuellement être passé d'une poignée à un document Notes, et ouvrira ses portes ce document en mode édition. Donc, vous pouvez utiliser quelque chose comme:

... 
NtWkSP.EditDocument (true, NtDoc) 
+0

J'ajoute ces paramètres à ma ligne EditDocument, mais je continue à recevoir des erreurs "Object Expected". Que puis-je faire d'autre? – PowerUser

+0

Je ne suis pas sûr si VBA se soucie, mais EditDocument retourne un objet NotesUIDocument, vous devrez donc faire quelque chose comme: set uidoc = NtWkSP.EditDocument (vrai, NtDoc) ou appelez NtWkSP.EditDocument (vrai, NtDoc) –

+0

Arg.J'ai essayé les deux idées et je reçois toujours la même erreur Object Expected. Je n'ai jamais compris comment l'API Lotus fonctionne, donc d'autres suggestions sont les bienvenues. – PowerUser

0

Les deux ensembles de classes sont des API non reliés et utilisent différents et différents contextes d'exécution - votre objet NtDoc ne sera pas exister dans le contexte de l'espace de travail. Autant que je déteste faire, je suggère de faire le tout dans les classes Notes Automation. Vous devez quand même ouvrir une session Notes dans l'espace de noms Notes pour vous assurer que vous avez le bon document (que vous utilisiez NotesDatabase.GetDocumentByUNID, NotesDatabase.GetDocumentByID ou NotesView.GetDocumentByKey). Évidemment, avoir deux sessions, deux bases de données, deux documents, et cetera, tous pointant vers des poignées différentes pour le même ensemble d'objets va devenir désordonné et peut réellement causer des collisions en cours de route. Pour répondre à une question précédente, les objets Lotus Domino sont une interface COM prise en charge qui prend en charge la liaison anticipée mais qui n'a accès qu'au back-end: l'interface Notes Automation est une interface OLE antérieure et obsolète qui ne prend pas en charge liaison précoce et est, franchement, sorte de crashy.)

Questions connexes