Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: piccolo am 23.06.03 - 19:12:38

Titel: Hilfe bei script
Beitrag von: piccolo am 23.06.03 - 19:12:38
hier mein ls-script, das über einen agent laufen sollte, attachment von der derzeitigen db aus einer ansicht heraus lösen und dann in eine andere datenbank übertragen, leider kommt der fehler "variant does not contain an object"

hier das script:


Dim s As New NotesSession  
   Dim SourceDB As NotesDatabase
   Dim TargetDB As NotesDatabase
   Dim dc As NotesDocumentcollection   
   Set TargetDB = s.CurrentDatabase
   Set SourceDB = s.GetDatabase("" , "blablablabla.nsf")
   Set view = SourceDB.GetView( "Memo" )
   
   Dim TargetDoc As NotesDocument
   Dim SourceDoc As NotesDocument
   'Set SourceDoc = view.GetFirstDocument()
   
   Dim object As NotesEmbeddedObject
   Dim ItemType As Integer
   
   Do While Not (SourceDoc Is Nothing)
      
          ' Copy fields from Source Doc to Target Doc
      Set TargetDoc = New NotesDocument( TargetDB )
      TargetDoc.form = "New Document"
      TargetDoc.Category = SourceDoc.heading
      TargetDoc.SubCat = SourceDoc.Category
      TargetDoc.docTitle = SourceDoc.DocHeading
      
          ' Check for attachment(s) in document
      Dim AttachmentName As String
      Dim newObject As NotesEmbeddedObject
      Dim rtitem As NotesRichTextItem
      
          ' Save Attachment from Source Document to Disk
          ' and then attach file from disk to Target Document
      
      Set item = SourceDoc.GetFirstItem("$File")
      If Not (item Is Nothing) Then
         ItemType = item.Type
         
         If ItemType = 1084 Then           ' Item Type is
'ATTACHMENT (not absolutely sure because Notes help does not state the
            'integer values of item Types !)
            
            AttachmentName = item.Values(0)
            Set object = Sourcedoc.GetAttachment(AttachmentName )
            Call object.ExtractFile ( "c:\temp\" & AttachmentName)
            
                    ' Create Attachment in DocContent Field from file on disk
            Set rtitem = New NotesRichTextItem( TargetDoc,"DocContent" )
            Set NewObject = rtitem.EmbedObject (EMBED_ATTACHMENT, "", "c:\temp\" & AttachmentName)
            
                    ' Delete temporary files from c:\temp directory
            Kill "c:\temp\" & AttachmentName
            
         End If
      End If
      
      TargetDoc.Save True,True
      
      Set SourceDoc = view.GetNextDocument( SourceDoc )
      
   Loop
   
   ws.ViewRefresh  
Titel: Re:Hilfe bei script
Beitrag von: ata am 23.06.03 - 19:24:18
... ich vermute dir fehlt die session

Dim s As New NotesSession

ata

Korrektur:

... sorry ich habe die erste Zeile übersehen...
... wo steigt denn der Debugger aus?

... Set SourceDoc ist auskommentiert - es wird nicht mehr initialisiert...
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 24.06.03 - 18:36:20
hallo ata
der fehler , nach entfernen des kommentars kommt bei setsourcedoc  
  object variable not set

p.s. tschuldigung dass ich nerve, aber ich blicke null mehr durch  ??? 8) ???
Titel: Re:Hilfe bei script
Beitrag von: Performance am 24.06.03 - 18:45:47
hast du überhaupt ne view "Memo"  - so heisst die Maske

hast du eine view "Memo" ??

cu
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 24.06.03 - 19:18:46
ja, maske "memo" hab ich...... :-[ :-[
Titel: Re:Hilfe bei script
Beitrag von: Performance am 24.06.03 - 19:24:52
stell doch die abgespeckte db rein --- mit 2 doks - dann geht das schneller mit der Fehlersuche  ;D

bin noch ne halbe Stunde online


cu
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 24.06.03 - 20:05:51
datenbank ist die mailschablone r5, andere datenbank idem.  attachment irgendeines... sorry die db hat sich höllisch groß gemacht, da ich ein zu großes attachment reingehängt habe....

edit. ...

fehler kommt jetzt bei set item = SourceDoc.GetFirstItem("$File")  ???
variable item ist leer, habs mit dem debugger durchgespielt....

bitte um hilfe, ich verzweifle fast :-\
Titel: Re:Hilfe bei script
Beitrag von: ata am 25.06.03 - 00:13:42
... dein Code ist etwas ducheinander. Ich möchte versuchen dir den Code besser zu strukturieren.

... als erstes - nur die Dimensionierungen - keie Zuweisungen...
... als zweites die Initialisierung der benötigten Objekte...
... und dann der Code, der das Ergebnis bringen soll.

Code
Sub Click(Source As Button)
   ' # 1. Dimensionierung der Objekte
   Dim session As New NotesSession  
   ' # nenn die Session nicht 's' - einzelne Buchstaben verwendet man gerne als Zählvariablen in Schleifen
   
   Dim SourceDB As NotesDatabase  ' # besser wäre dbSource - das Objekt leitet den Namen ein...
   Dim TargetDB As NotesDatabase
   'Dim dc As NotesDocumentcollection   
   Dim TargetDoc As NotesDocument  ' # besser wäre docTarget - das Objekt leitet den Namen ein...
   Dim SourceDoc As NotesDocument
   'Dim object As NotesEmbeddedObject
   'Dim ItemType As Integer
   
   ' # ... die Dimensionierung innerhalb einer Do-While-Schleife macht keinen Sinn - hier ist sie richtiger
   'Dim AttachmentName As String
   'Dim newObject As NotesEmbeddedObject
   Dim rtitem As NotesRichTextItem
   
   ' # Initialisierung der benötigten Objekte
   Set TargetDB = session.CurrentDatabase
   
   ' # ...Validierung der Quelldatenbank
   Set SourceDB = session.GetDatabase("" , "blablablabla.nsf")
   If Not SourceDB.IsOpen Then
      Msgbox "Abbruch - die Quelldatenbank konnte nicht geöffnet werden"
      Exit Sub ' # ... bzw. Exit Function, wenn in einer Funktion gearbeitet wird.
   End If
   
   ' # ... Validierung der benötigeten Ansicht
   Set view = SourceDB.GetView( "Memo" )
   If view Is Nothing Then
      Msgbox "Abbruch - die Ansicht 'Memo' konnte nicht in der Quelldatenbank gefunden / geöffnet werden."
      Exit Sub ' # ... bzw. Exit Function, wenn in einer Funktion gearbeitet wird.
   End If
   
   ' # ... das erste Dokument initialisieren - war in deinem Code auskommentiert - warum
   Set SourceDoc = view.GetFirstDocument()
   
   ' # Der eigentliche Code, der das Ergebnis herstellen soll
   Do While Not (SourceDoc Is Nothing)
      
          ' Copy fields from Source Doc to Target Doc
      Set TargetDoc = New NotesDocument( TargetDB )
      TargetDoc.Form = "New Document"
      TargetDoc.Category = SourceDoc.heading
      TargetDoc.SubCat = SourceDoc.Category
      TargetDoc.docTitle = SourceDoc.DocHeading
      
          ' # hier kommt der Code zur Übernahme des Attachments
      ' # ... ich würde das Feld mit dem Attachment in dein Zieldokument kopieren
      Set rtItem = SourceDoc.GetFirstItem("Body") ' # hier liegt das Attachment in der Regel  
      Call TargetDoc.CopyItem( rtItem, "Body" )      
      ' # ... Attachment übernommen.
      
      TargetDoc.Save True,True
      
      Set SourceDoc = view.GetNextDocument( SourceDoc )
      
   Loop
   
   ws.ViewRefresh  
End Sub

... ich konnte es nicht mehr testen, aber das müßte meiner Meinung nach funktionieren...

ata
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 25.06.03 - 08:42:49
@ata, großen dank für deine mühe,

aber ich habe noch ein problem bei :
   Set rtItem = SourceDoc.GetFirstItem("Body") ' # hier liegt das Attachment in der Regel  *** object variable not set :-\

hab mal ein debug fenster hinzugefügt...
danke im vorraus für die hilfe
Titel: Re:Hilfe bei script
Beitrag von: Axel am 25.06.03 - 08:48:30
Hi,

der Fehler liegt meines Erachtens hier:

Do While (SourceDoc Is Nothing)

In ata's Script steht Do While Not..., bei dir fehlt das Not.


Axel
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 25.06.03 - 10:00:59
wenn ich das not nicht weglasse, passiert überhaupt nichts, mit dem debugger durchgespielt ???
Titel: Re:Hilfe bei script
Beitrag von: Axel am 25.06.03 - 11:07:28
Hi,

dann liegt der Fehler weiter vorne.

SourceDoc wird nicht belegt. Unter Umständen liegt der Hund hier begraben: Set SourceDoc = view.GetFirstDocument()


view wird initialisiert, dass habe ich auf deinem Screenshot gesehen.

Mal ganz spitz gefragt: sind in der Ansicht überhaupt Dokumente vorhanden ?


Axel
Titel: Re:Hilfe bei script
Beitrag von: ata am 25.06.03 - 11:42:30
... so sehe ich das auch, denn ohne SourceDoc geht er nicht in die Schleife...

ata
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 25.06.03 - 14:24:22
hallo ihr  ;D, hab´s jetzt endlich überrissen !, jedoch müßte ich das ritem extrahieren und dann in ein neues dokument kopiern, da ich ansonsten wieder probleme mit dem dokumentenschlüssel habe !
Titel: Re:Hilfe bei script
Beitrag von: Axel am 25.06.03 - 14:40:36
... jedoch müßte ich das ritem extrahieren und dann in ein neues dokument kopiern, da ich ansonsten wieder probleme mit dem dokumentenschlüssel habe !

Hi,

was meinst du denn damit. Heißt das, du willst das Attachment lösen und an das neue Dokument anhängen ?

Wenn ja, könnte das so aussehen:

...
Set rtitem = Sourcedoc.GetFirstItem("Body")    
If rtitem.Type = RICHTEXT Then
  Forall objects In rtitem.EmbeddedObjects
    If objects.Type = EMBED_ATTACHMENT Then
      strPfad = "c:\temp\" & objects.Source
      objects.ExtractFile strPfad    'Anhang in temp. Verzeichnis lösen
    End If  'If objects.Type = EMBED_ATTACHMENT
  End Forall  'Forall objects In rtitem.EmbeddedObjects
End If  'If rtitem.Type = RICHTEXT

Set newrtitem = New NotesRichTextItem( TargetDoc, "Body" )
Set object = newrtitem.EmbedObject( EMBED_ATTACHMENT, "", strPfad)
...

Axel
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 25.06.03 - 15:30:29
habs jetzt auf die Reihe bekommen, letzte frage bitte:

agent sollte bei einkommender mail gestartet werden, d.h. dass ich die quelldatenbank bzw. die zieldatenbank gar nicht offen haben muß ! Im prinzip sieht die problemstellung so aus:

mail in datenbank, wenn ja , dann kopiere attachment in die faxverteiler.nsf hinein, bzw. extrahieren und dann hinzufügen......
Titel: Re:Hilfe bei script
Beitrag von: Axel am 25.06.03 - 15:39:37
Hi,

setze die Option "Wann soll der Agent gestartet werden" auf "Nach Eingang neuer Mail".

Allerdings musst du darauf achten, dass du keine Frontend-Klassen (uidoc etc.) einsetzt.


Axel
Titel: Re:Hilfe bei script
Beitrag von: piccolo am 25.06.03 - 20:12:26
hallo @all, hab noch ne frage....
da ich den agent "nur bei neuer mail" ausführe, sollte er nur das "neue" dokument in die datenbank schaufeln, wie kann man das machen ?

Sorry bin noch notes azubi mit null durchblick, jetzt durch eure hilfe jedoch mehr.. ;D