Domino 9 und frühere Versionen > ND9: Entwicklung

Fehler 'Type mismatch'

(1/2) > >>

Jürgen Schomann:
Ich habe folgenden Agenten:

Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument

Set dbThis = session.CurrentDatabase
Set dc = dbThis.UnprocessedDocuments
Set doc = dc.GetFirstDocument

Dim v As Variant
v = doc.F1            'Feld F1 enthält eine Zahl
ForAll e In v
   MsgBox TypeName(e)      'Dokument geöffnet: Ausgabe 'DOUBLE'
               'Dokument in Ansicht gewählt: Ausgabe 'DOUBLE'
                    
   e = CStr(e)         'Dokument geöffnet: kein Fehler
               'Dokument in Ansicht gewählt: Abbruch mit Fehler 'Type mismatch'

   MsgBox TypeName(e)      'Dokument geöffnet: Ausgabe 'STRING'
               'Dokument in Ansicht gewählt: Anweisung wird nicht mehr abgearbeitet da Abbruch in der vorhergehenden Zeile
End ForAll

Wenn ich die Werte in der Schleife nicht direkt über die Referenzwariable 'e' ändere, sondern in ein neues Feld umspeichere geht es natürlich auch.

Aber gibt es eine Erklärung für den Fehler 'Type mismatch' wenn das Dokument in der Ansicht ausgewählt wird statt geöffnet?

Jürgen Schomann:
Noch eine Ergänzung:

Ich kann diesen Vorgang leider nur in einer fremden Datenbank so nachstellen.
Der Test in einer neuen Datenbank bringt jetzt aber in beiden Fällen den Fehler 'Type mismatch'.

Auch eine Änderung wie folgt bringt immer Fehler:
...
Dim v As Variant
v = doc.F1
v(0) = 100.0            'Variable wird überschrieben
ForAll e In v
   MsgBox TypeName(e)                    
   e = CStr(e)
   MsgBox TypeName(e)
End ForAll

Ein extra Test mit:

Dim v As Variant
Redim v(0)
v(0) = 100.0
ForAll e In v
   MsgBox TypeName(e)                    
   e = CStr(e)
   MsgBox TypeName(e)
End ForAll

dagegen bringt keine Fehler.

Anscheinend nur wenn die Variable 'v' durch das Einlesen des Feldes vom Dokument belegt wird, lässt sich diese Umwandlung in der Schleife nicht mehr durchführen?

Andrew Harder:
Füge mal vor der Zuweisung zu v ein:

--- Code: ---Print TypeName(doc.F1)
If Not doc.hasItem("F1") Then
  Print "Das Feld F1 gibt es nicht im Dokument!
End If
--- Ende Code ---

Jürgen Schomann:
Hier noch einmal ein anderer Test:

Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument

Set dbThis = session.CurrentDatabase
Set dc = dbThis.UnprocessedDocuments
Set doc = dc.GetFirstDocument
   
Dim v2(0) As Variant
v2(0) = 2.0
Print TypeName(v2(0)) & " - Wert: " & v2(0)        'OK Ausgabe DOUBLE - Wert: 2
v2(0) = "3"
Print TypeName(v2(0)) & " - Wert: " & v2(0)        'OK Ausgabe STRING - Wert: 3


Dim v As Variant

If Not doc.HasItem("F2") Then
   Print "Das Feld F2 gibt es nicht im Dokument!"
   Exit Sub
End If

'Dokument enthält Feld 'F2' mit nur einem Wert '1'

Print TypeName(doc.F2) & " - Dimension: " & UBound(doc.F2) & ", Wert: " & doc.F2(0)   'OK Ausgabe DOUBLE( ) - Dimension 0, Wert: 1
v = doc.GetItemValue("F2")
Print TypeName(v(0)) & " - Wert: " & v(0)          'OK Ausgabe Double - Wert: 1
v(0) = 2.0
Print TypeName(v(0)) & " - Wert: " & v(0)          'OK Ausgabe DOUBLE - Wert: 2
v(0) = "3"
Print TypeName(v(0)) & " - Wert: " & v(0)          'Fehler 'Type mismatch'

Für normale Variant-Variablen funktioniert es, s. o. Variable 'v2'.
Nur wenn die Variant-Variable durch ein Dokument Feld belegt wird kommt ein Fehler, aber nur wenn ein anderer Typ als ursprünglich zugewiesen wird.

Peter Klett:
So funktioniert es


--- Code: ---Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument

Set dbThis = session.CurrentDatabase
Set dc = dbThis.UnprocessedDocuments
Set doc = dc.GetFirstDocument

Dim v As Variant
Dim i As Integer

'Dokument enthält Feld 'F2' mit nur einem Wert '1'

Print TypeName(doc.F2) & " - Dimension: " & UBound(doc.F2) & ", Wert: " & doc.F2(0)   'OK Ausgabe DOUBLE( ) - Dimension 0, Wert: 1
ReDim v (UBound (doc.F2))
For i = 0 To UBound (doc.F2)
   v (i) = doc.F2 (i)
Next i
Print TypeName(v(0)) & " - Wert: " & v(0)          'OK Ausgabe Double - Wert: 1
v(0) = 2.0
Print TypeName(v(0)) & " - Wert: " & v(0)          'OK Ausgabe DOUBLE - Wert: 2
v(0) = "3"
Print TypeName(v(0)) & " - Wert: " & v(0)          'OK Ausgabe STRING - Wert: 3

--- Ende Code ---

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln