Autor Thema: Extrahieren per Lotusscript bringt Fehler Type Mismatch  (Gelesen 8180 mal)

Offline lorderich

  • Frischling
  • *
  • Beiträge: 9
Hallo zusammen,

ich versuche mich gerade in das Thema Lotusscript einzulesen und probiere ein wenig rum.

Dabei haeb ich mir als erstes eine Möglichkeit ausgewählt, alle Dokumente aus einer Ansicht nach einem Feld einem RichText Item mit der Bezeichnung "Userpicture" zu durchsuchen. Wenn dieses Feld eine Datei enthälst, so soll diese in eine lokal abgespeichert werden.

Das Feld Userpicture gibt es definitiv in allen Dokumenten, es kann jedoch leer sein.

Lotusscript-Code:
Sub Initialize
      Dim ss As New NotesSession
      Dim db As NotesDatabase
      Dim view As NotesView
      Dim doc As NotesDocument
      Dim rtitem As NotesRichTextItem
      Dim pathname As String
 
      pathname = "E:\images"
      Set db = ss.CurrentDatabase
      Set view = db.GetView("People")
 
      Set doc = view.GetFirstDocument
         If doc.HasEmbedded Then
            Set rtitem = doc.GetFirstItem("Userpicture")
            ForAll obj In rtitem.EmbeddedObjects
               If(obj.Type = EMBED_ATTACHMENT)Then
                  Call oBJ.ExtractFile _
                  ( pathname + "\" + obj.Name )
               End If         
               End ForAll
            End If
            Set doc = view.GetNextDocument(doc)
End Sub

---------------------
Derzeit steigt der Agent im Debug Modus jedoch immer bei der Zeile Set rtitem = doc.GetFirstItem("Userpicture") mit der Fehlermeldung "Type mismatch" aus. Logisch wäre dies meiner Meinung nach, wenn es das Feld gar nicht geben würde oder es keinen Inhalt hat, diese Prüfung führe ich meiner Meinung nach jedoch mit dem If doc.HasEmbedded Then durch.

Zum Feld selbst ist zu sagen, dass die User per XPage Upload Control in dieses Feld ein Bild von sich laden können. Inahlt des Feldes wird nicht als Mime etc. Content gespeichert.

Der zugehörige Agent soll später mal zeitgesteuert alle Dokumente in einer View durchlaufen und die in dem Feld Userpicture vorhandenen Bilder auf die Festplatte bringen.

Vielleicht übersehe ich ja etwas, aber irgendwie steig ich gerade nicht hinter die Fehlermeldung und warum der Debugger diese auswirft.

Danke schonmal fürs drüber schauen.

MFG

Der Lordi


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #1 am: 03.09.13 - 20:58:45 »
Die NotesRichTextItem-Class kennt keine Methode GetFirstIgtem. Je nach Kontext verwende NotesItem oder Variant.

Offline m3

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #2 am: 03.09.13 - 21:02:57 »
Bernhard, er macht ja auch  "doc.GetFirstItem()" und das sollte funktionieren, wenn "Userpicture" auch wirklich ein RichTextItem ist. Ansonsten liefert es naemlich NotesItem zurueck, was in diesem Fall das Problem sein dürfte.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #3 am: 03.09.13 - 21:10:19 »
Nö, nö - die Methode gibt es wirklich nicht für RTIs, und auch die brave DesignerHelp verwendet bei den Beispielen beispielsweise für GetEmbeddedObject Variant as Type für RTI-Objekte.

Bernhard

Offline lorderich

  • Frischling
  • *
  • Beiträge: 9
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #4 am: 03.09.13 - 21:36:06 »
Hallo zusammen,

ich habe gerade mal in der Form nachgeschaut, dass Feld "Userpicture" ist definitiv in Feld mit dem Typ Rich-Text.

Darin gespeichert ist ein z.B. ein Image im PNG Format. Das sollte doch daher ein RichTextItem sein, oder?

Wenn ich Dim rtitem As Variant definiere, dann steigt der Debugger bei der Zeile "ForAll obj In rtitem.EmbeddedObjects" mit der Fehlermeldung "Instance Member EMBEDDObjects does not exist". aus.

Jetzt verstehe ich gerade nur noch Bahnhof.

MFG

Der Lordi

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #5 am: 03.09.13 - 21:46:33 »
Da hast Du aber ein ganz anderes Problem. Schau Dir das Beispiel zu NotesRichTextItem.EmbeddedObjects an. Für nähere Analysen würden wir hier Code benötigen, aber ich denke, mit dem genannten Beispiel der DesigneDokumente.rHelp solltest Du zurecht kommen. Oder Du hast ein anderes Problem innerhalb Deiner Dokumente.

Bernhard

PS: Wenn Du Deinen richtigen Namen unter Deine Posts schreibst, steigt hier auch das Engagement der Helfer. Wir mögen eher den direkteren Kontakt.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #6 am: 04.09.13 - 07:32:37 »
Auf Dokumentation zu stützen, ist irgendwie nicht mein Ding, deshalb habe ich mal folgendes ausprobiert, wobei das verwendete doc ein TextItem namens Form, ein RichtextItem namens Body und kein Item Body2 enthält.

Code
Sub Initialize
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Set db = session.CurrentDatabase
	Dim view As NotesView
	Set view = db.GetView ("test")
	Dim doc As NotesDocument
	Set doc = view.Getfirstdocument
	Dim rtitem As NotesRichtextItem
	Set rtitem = doc.GetFirstItem ("Body")
	MsgBox rtitem.Name
End Sub
-> gibt "Body" als Msgbox aus

Code
Sub Initialize
	...
	Dim rtitem As NotesRichtextItem
	Set rtitem = doc.GetFirstItem ("Body2")
	MsgBox rtitem.Name
End Sub
-> gibt ein Object variable not set in der MsgBox-Zeile

Code
Sub Initialize
	...
	Dim rtitem As NotesRichtextItem
	Set rtitem = doc.GetFirstItem ("Form")
	MsgBox rtitem.Name
End Sub
-> gibt ein type mismatch in der Set rtitem ... - Zeile

Also kann ein NotesRichtextItem definitiv ein doc.GetFirstItem, Voraussetzung ist, dass das Item existiert und ein RichtextItem ist, oder eben nicht existiert. Existiert es und ist kein RichtextItem, kommt das type mismatch.

Nun zu Lordi's Code:

1. Mit If doc.HasEmbedded prüfst Du nur, ob in dem DOKUMENT Anhänge vorhanden sind, diese können aber an jedem beliebigen anderen Richtextfeld sein

2. Es ist völlig irrelevant, ob in der MASKE das Feld "Userpicture" ein RichtextItem ist, entscheidend für Deine Routine sind die DOKUMENTE. Schau also in den Dokumenteigenschaften nach, welcher Typ Item gespeichert ist. Da Du über mehrere Dokumente läufst, genügt ein Dokument, bei dem Userpicture ein Textitem ist, und schon bekommst Du den Fehler

-> Exkurs zum Verständnis: Du erstellst in der Maske ein neues Feld Userpicture als Textfeld. Danach erstellst Du mit der Maske ein paar Dokumente, die dadurch ein Textitem Userpicture enthalten. Anschließend änderst Du in der Maske das Feld in ein Richtextfeld. Diese Änderung hat keinen Einfluss auf danach nicht neu im Frontend gespeicherte Dokumente! Notes ist keine relationale Datenbank, bei der Feldänderungen in einer Tabelle erfolgen, die dann gnadenlos drübergebügelt werden, Notes ist dokumentenbasiert und tickt da ganz anders. Auch andere Routinen können in Dokumente Items schreiben, die in der Maske entweder nicht oder ganz anders definiert sind. Das ist die totale Freiheit, verlangt aber eine andere Denkweise des Entwicklers

Du musst also prüfen, ob es sich tatsächlich um ein Richtextitem handelt. Dazu ist eine Möglichkeit, rtitem als Variant zu deklarieren und dann abzuprüfen, ob es sich wirklich um ein RichtextItem handelt (-> siehe Hilfe zu notesItem.Type)

3. Wenn Du wirklich prüfen willst, ob ein RichtextItem Dateianhänge hat, musst Du prüfen, ob EmbeddedObjects ein Array ist. Deshalb knallt Deine Forall-Zeile, weil Du durch ein Nichtarray loopen willst

Code
If IsArray (rtitem.EmbeddedObjects) Then
   Forall obj ...
   End Forall
End If
 

Offline Jens Winkelmann

  • Junior Mitglied
  • **
  • Beiträge: 53
  • Geschlecht: Männlich
  • Jens Winkelmann
    • PAVONE AG
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #7 am: 04.09.13 - 21:01:56 »
Die Klasse NotesRichTestItem erbt alle Eigenschaften und Methoden der Klasse NotesItem.

Also auch GetFirstItem.

In der Doku http://www-12.lotus.com/ldd/doc/domino_notes/rnext/help6_designer.nsf/b3266a3c17f9bb7085256b870069c0a9/baebe8a2bdfffc8485256c54004d29ec?OpenDocument
heißt es auch Inherits from: NotesItem

Ist glaube ich die einzige Notes Klasse, die von einer anderen abgeleitet ist!?!
« Letzte Änderung: 04.09.13 - 21:04:52 von Jens Winkelmann »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Extrahieren per Lotusscript bringt Fehler Type Mismatch
« Antwort #8 am: 05.09.13 - 07:42:25 »
Unabhängig davon ist NotesDocument.GetFirstItem keine Methode von NotesItem oder NotesRichtextItem, sondern von NotesDocument und liefert laut Hilfe ein NotesItem oder NotesRichtextItem zurück.

Hier der Auszug aus der Hilfe:

GetFirstItem method
Given a name, returns the first item of the specified name belonging to the document.

Defined in
NotesDocument

Syntax
Set notesItem = notesDocument.GetFirstItem( name$ )

Parameters
name$

String. The name of the item you want to find.

Return value
notesItem

NotesItem or NotesRichTextItem. The first item with the specified name. Returns Nothing if the document does not contain an item with this name.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz