Autor Thema: Fehler 'Type mismatch'  (Gelesen 3955 mal)

Jürgen Schomann

  • Gast
Fehler 'Type mismatch'
« am: 24.02.16 - 14:47:48 »
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

  • Gast
Re: Fehler 'Type mismatch'
« Antwort #1 am: 24.02.16 - 15:28:06 »
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?

Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Fehler 'Type mismatch'
« Antwort #2 am: 24.02.16 - 19:32:07 »
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
« Letzte Änderung: 24.02.16 - 19:50:30 von Andrew Harder »
Andy

Jürgen Schomann

  • Gast
Re: Fehler 'Type mismatch'
« Antwort #3 am: 24.02.16 - 21:50:26 »
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.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Fehler 'Type mismatch'
« Antwort #4 am: 25.02.16 - 08:31:40 »
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
« Letzte Änderung: 25.02.16 - 11:05:52 von Peter Klett »

Jürgen Schomann

  • Gast
Re: Fehler 'Type mismatch'
« Antwort #5 am: 25.02.16 - 13:23:37 »
Vielen Dank für den Hinweis, aber das habe ich schon im 1. Beitrag selbst gesagt.
Mir geht es ja um den Umstand, dass ich die direkte Zuweisung der Werte an die Variant-Variable benutzen möchte und nicht extra in einer Schleife, also nur

v = doc.GetItemValue("F2")

Wie in der letzten Antwort gezeigt, klappt es ja auch wenn man Variant-Variablen direkt benutzt, also

v2(0) = 2.0
v2(0) = "3"

aber dies klappt eben nicht, wenn das Feld einen numerischen Wert enthält, also

v = doc.GetItemValue("F2")
v(0) = "3"

obwohl in beiden Fällen ein Variant-Feld Ausgangspunkt ist.

Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Fehler 'Type mismatch'
« Antwort #6 am: 25.02.16 - 13:36:38 »
Natürlich geht das nicht:
Zitat
An array is a named collection of elements of the same data type
Da Du ein Variant benutzt ist es egal welcher Type das ist, aber das bedeutet nicht das Du im Array mischen darfst.
« Letzte Änderung: 25.02.16 - 13:41:30 von Andrew Harder »
Andy

Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Fehler 'Type mismatch'
« Antwort #7 am: 25.02.16 - 13:38:46 »
*deleted*
« Letzte Änderung: 25.02.16 - 13:40:40 von Andrew Harder »
Andy

Jürgen Schomann

  • Gast
Re: Fehler 'Type mismatch'
« Antwort #8 am: 25.02.16 - 14:19:11 »
Doch bei einem Feld vom Typ Variant können den Elementen beliebige Werte unterschiedlicher Datentypen zugewiesen werden, also auch
String, Double, Objekte, Felder u.a.

Dies z. B. funktioniert

Dim v2(2) As Variant
v2(0) = 2.0
v2(1) = "3"
Set v2(2) = doc
Print v2(2).F2(0)


Ich habe aber noch einmal in der Notes-Hilfe nachgelesen und glaube das ist die Erklärung:
In meinem letzten Test ist

Dim v2(0) As Variant

ein Feld vom Typ Variant und deshalb funktioniert, auch

v2(0) = 2.0
v2(0) = "3"


Beim Einlesen eines Feldes vom Dokument erhält die Variant-Variable aber immer den Typ des Feldinhaltes, also

v = doc.GetItemValue("F2")

wird ein Feld vom Typ Double wenn das Feld numerische Werte enthält.
Dann geht also nur die Zuweisung numerischer Werte, aber nicht die Zuweisung eines String-Wertes mit

v(0) = "3"


Vielen Dank noch einmal für euere Antworten.


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz