| |
VB.NET - Ein- und UmsteigerTyp List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: MoveIt | Datum: 23.11.17 20:33 |
| Hallo,
Irgendwie stehe ich gerade auf dem Schlauch. Ich habe folgendes gebastelt:
Public Function MapContents(ByVal csvline As String, ByVal DBObjMapping As List( _
Of clsMeineImportKlasse)) As List(Of clsMeineImportKlasse)
Dim x As New List(Of clsMeineKlasse)
For Each Feld As clsMeineKlasse In DBObjMapping
If Feld.USED Then
Dim sField As String
sField = csvline.Substring(fldVon - 1, fldLength)
If sField.Contains("""") Then
sField.Replace("""", String.Empty)
End If
Feld.INHALT = Trim(sField)
End If
x.Add(Feld)
Next
Return x
End Function
Public Function DateiEinlesen(Dateiname As String) As Dictionary (Of Integer, _
List(Of clsMeineImportKlasse)
[...]
Dim MeinDictionary As New Dictionary (Of Integer, List(Of _
clsMeineImportKlasse))
For row As Integer = 0 To _lines.Count - 1
Dim obj As New List(Of clsMeineKlasse)
obj = MapContents(line(row), Mapping)
MeinDictionary.Add(row, New List(of clsMeineImportklasse))
MeinDictionary(row).Add(obj)
Next
Return MeinDictionary
End Function Soweit funktioniert das Ganze auch prima.
Problematisch ist folgender Snippet:
MeinDictionary.Add(row, New List(of clsMeineImportklasse))
MeinDictionary(row).Add(obj) Hier bekomme ich folgenden Fehler:
Fehler 1 Der Wert vom Typ "System.Collections.Generic.List(Of clsMeineImportKlasse)" kann nicht in "clsMeineImportKlasse" konvertiert werden.
obj ist aber auch ein List(Of clsMeineImportklasse)
Hat jemand von euch vielleicht eine Idee, wie ich meinen Ansatz von Dictionary(Of Integer, List(Of Klasse) noch retten kann ?
BTW: Das Ganze ist in Visual Basic 2008 geschrieben..
Vielen Dank...
Stephan
Beitrag wurde zuletzt am 23.11.17 um 20:34:33 editiert. | |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: Manfred X | Datum: 23.11.17 21:03 |
| Hallo!
"obj" ist nicht vom Typ "clsMeineImportKlasse", sondern "clsMeineKlasse".
Falls es zwischen diesen Klassen keinen Ableitungszusammenhang gibt, ist die
Zuweisung nicht möglich.
Offenbar ist clsMeineKlasse eine Ableitung von clsMeineImportklasse.
Versuche es bei der Zuweisung statt mit "Add" mit einem = .
Beitrag wurde zuletzt am 23.11.17 um 21:27:34 editiert. | |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: MoveIt | Datum: 24.11.17 12:01 |
| Hallo Manfred,
vielen Dank für deine schnelle Antwort !
Fehler habe ich behoben. Und wieso werden in der Debugschleife immer dieselben Zeilen ausgegeben, obwohl in der CSV jede Zeile unterschiedlich ist ?
For Each dicRow As KeyValuePair(Of Integer, List(Of clsMeineImportKlasse)) In _
MeinDictionary
Dim row As Integer : row = dicRow.Key
Dim objList As List(Of clsMeineImportKlasse) = dicRow.Value
Dim sout As String : sout = ""
For x As Integer = 0 To objList.Count - 1
sout = "Zeile in Datei: " & row.ToString & " | " & " | FELD: " & objList( _
x).FELD & " INHALT: " & objList(x).INHALT
Debug.Print(sout)
Next
Next Danke !
__________________
Heute ist nicht mein Tag.
| |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: Manfred X | Datum: 24.11.17 12:23 |
| An Deinem Code ist das nicht erkennbar.
Ich greife mal in die Kiste mit den Vermutungen:
Du weist auf die "objlist" in einer Schleife versehentlich
allen Elementen die gleiche Objekt-Referenz zu.
Poste mal, wie Du diese Liste in "DicRow" gefüllt hast -
bzw. "MeinDictionary".
(Eventuell fehlt in der Füll-Schleife das Schlüsselwort New,
durch das für jede CSV-Zeile ein neues Objekt erstellt wird.)
Beitrag wurde zuletzt am 24.11.17 um 12:26:09 editiert. | |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: MoveIt | Datum: 26.11.17 20:18 |
| Hallo Manfred,
Ich habe es umgeschrieben und nur List(Of T) verwendet.
Der Fehler kann nicht in TEdiFieldsList liegen. Diese Liste wird korrekt ausgegeben und enthält auch jedes eingelesene Feld wie erwartet. Ein Debug von EdiFile.Add(TEdiFieldsList) zeigt hier jedoch stets n Wiederholungen der letzten Zeile, wobei EdiFile ein List(Of List(Of clsEdi_FileImportMappingClass) ist. EdiFile.Add(List (Of T)) ignoriert einfach jeglichen neuen Inhalt.
Public Function LiesEdiDateiEin(ByVal _FileName As String, ByVal Profil As _
clsEDI_Mapping_Profiles) As List(Of List(Of clsEDI_FileImportMappingClass))
Dim EOL As String = vbCrLf
Dim strText = System.IO.File.ReadAllText(_FileName)
Dim _lines As String()
_lines = Split(strText, EOL)
Dim EdiFile As New List(Of List(Of clsEDI_FileImportMappingClass))
' 1 Zeile enthält jeweils n Spalten fester Größe bzw ein Objekt von
' clsEDI_FileImportMappingClass
'
For row As Integer = 0 To _lines.Count - 1
Dim line As String
line = _lines(row)
Dim Satzart As String = Left(line, 3)
Dim Filter As String = line.Substring(3, 2)
Dim EdiMapping As New List(Of clsEDI_FileImportMappingClass)
EdiMapping = Profil.getEdiSegCols(Satzart, Filter)
Dim TEdiFieldsList As New List(Of clsEDI_FileImportMappingClass)
TEdiFieldsList = MapContentsOfImportedEdiFile(line, EdiMapping) '
' List(Of clsEDI_FileImportMappingClass ' Debug gibt die geparste _
Liste richtig aus
EdiFile.Add(TEdiFieldsList) ' TEdiFieldsList sollte an das Ende von
' EdiFile angehängt werden, enthält aber hier immer die letzten
' Position
Next
Debug.Print("EdiFile.Count:" & EdiFile.Count)
For row As Integer = 0 To EdiFile.Count - 1
DebugEdiItems(EdiFile(row))
Next
Return EDIFile
End Function Public Function MapContentsOfImportedEdiFile(ByVal csvline As String, ByVal _
ediDBObjMapping As List(Of clsEDI_FileImportMappingClass)) As List(Of _
clsEDI_FileImportMappingClass)
Dim TList As New List(Of clsEDI_FileImportMappingClass)
For Each EdiField As clsEDI_FileImportMappingClass In ediDBObjMapping
If EdiField.USED Then
Dim obj As New clsEDI_FileImportMappingClass
Dim fldLength As Int32
Dim fldVon As Int32
fldLength = EdiField.EDI_FLD_LAENGE
fldVon = EdiField.EDI_FLD_VON
Dim sField As String
sField = csvline.Substring(fldVon - 1, fldLength)
If sField.Contains("""") Then
sField.Replace("""", String.Empty)
End If
obj = EdiField
obj.INHALT = Trim(sField) ' funktioniert so
TList.Add(obj) : obj.Dispose : obj = Nothing
End If
Next
'DebugEdiItems(TList)
Return TList
End Function __________________
Heute ist nicht mein Tag.
| |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: Manfred X | Datum: 26.11.17 22:22 |
| Hallo!
Deine Datenstrukturen kann ich aus dem Code nicht erschließen.
Der Fehler liegt an einer anderen Stelle.
'Das sind Referenzvariablen (ohne Objekt)
Dim TEdiFieldsList As List(Of clsEDI_FileImportMappingClass)
Dim EdiMapping As List(Of clsEDI_FileImportMappingClass)
For row As Integer = 0 To _lines.Count - 1
Dim line As String
line = _lines(row)
Dim Satzart As String = Left(line, 3) 'Verwende substring !!
Dim Filter As String = line.Substring(3, 2)
'Zuweisung einer Referenz auf die Liste in Profil
EdiMapping = Profil.getEdiSegCols(Satzart, Filter) '???????
'Zuweisung einer Referenz auf die zurückgegebene Liste
TEdiFieldsList = MapContentsOfImportedEdiFile(line, EdiMapping) '????
'Jede nachträgliche Änderung an der Liste in Profil oder
'was immer sich in MapContentsOfImportedEdifile noch abspielt
'wird auch die Liste in EdiFile ändern
EdiFile.Add(TEdiFieldsList) 'Referenz auf Liste in MapContent..
Next row
'Der Fehler liegt eine Stufe tiefer im Code - eventuell bei der Weiter-
'verarbeitung des Edimapping-Parameters in MapContents....
'Dort muß jeweils eine neue Liste erstellt werden (new)
'Das Schlüsselwort New in Deinem Code ist wirkungslos, weil Du das neu
'erstellte Listenobjekt danach nicht verwendest, sondern in der nächsten
'Zeile eine Referenz auf die zurückgegebene Liste zuweist, und es dadurch
'wieder verwirfst.
Beitrag wurde zuletzt am 26.11.17 um 22:43:52 editiert. | |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: MoveIt | Datum: 27.11.17 13:05 |
| Hallo Manfred,
EdiMapping: List(Of clsEDI_FileImportMappingClass) enthält die vom Kunden verwendeten EDIFACT-Felder
Diese sind in einer DB gespeichert
EdiFile bzw. EdiFileRefs enthält die (gefüllten) EDIFACT - Referenzfelder gemäß der Spezifikation durch EdiMapping
EdiFile ist in der gesamten Klasse einmal deklariert.
' (1)
For row As Integer = 0 To _lines.count - 1
EdiMapping = Profil.getEdiSegCols(Satzart, Filter)
TEdiFieldsList = MapContentsOfImportedEdiFile(line, EdiMapping)
EdiFile.Add(TEdiFieldsList) 'New List(Of
' clsEDI_FileImportMappingClass))
' Man sollte nun annehmen, dass DebugEdiItems(EdiFile(row)) identische
' Datensätze ausgibt
' Dies ist nicht der Fall. Vielmehr entspricht jeder empfangene Datensatz exakt
' der gemappten Zeile in der Datei:
DebugEdiItems(EdiFile(row))
Next
' AUßERHALB der Schleife führt derselbe Durchlauf mit derselben Variable zu
' einem identischen Ergebnis. Warum ???
' (2)
For row As Integer = 0 To EdiFile.Count - 1
DebugEdiItems(EdiFile(row))
Next ' (3)
Private Sub DebugEdiItems(ByVal EdiFileRefs As List(Of _
clsEDI_FileImportMappingClass))
For Each obj As clsEDI_FileImportMappingClass In EdiFileRefs
Dim sout As String : sout = ""
sout = "SEGMENT: " & obj.SATZART & " | FELD-NR.:" & obj.EDI_FELD_NR _
& " | CONTENTS: " & obj.INHALT.ToString
Debug.Print(sout)
Next
End Sub __________________
Heute ist nicht mein Tag.
| |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: Manfred X | Datum: 27.11.17 15:59 |
| Nochmal:
Du mußt innerhalb von "MapContentsOfImportedEdiFile(line, EdiMapping)"
bei jedem Aufruf eine neue Instanz der Klasse "TEdiFieldsList"
erstellen (New), sie mit den aktuellen Daten füllen und eine Referenz
auf diese diese Instanz per "Return" zurückgeben.
Die zurückgegebene Referenz kannst Du dann in der Liste "EdiFile" anhängen
(siehe oben).
Eventuell muß das Gleiche in der Klasse/Methode "gedEdiSegCols" passieren:
Eine neue Instanz der Klasse "Edimapping" erstellen, mit Daten füllen und
per "Return" eine Referenz zurückgeben.
Du verwendest mit hoher Wahrscheinlichkeit stets die gleiche Instanz
und überschreibst deshalb den Dateninhalt bei einem Aufruf in der Schleife.
Alle EdiFile-Items zeigen (referenzieren) vermutlich dieses eine Objekt
(=Instanz) von "TEdiFieldsList".
Bereits innerhalb der ersten Schleife wirst Du das bemerken, wenn Du ab
dem zweiten Schleifendurchlauf auch "DebugEdiItems(EdiFile(row-1))" anschaust.
Beachten: Es handelt sich um eine naheliegende Vermutung.
Ich kenne den Code dieser Klassen nicht !!!
Beitrag wurde zuletzt am 27.11.17 um 16:18:04 editiert. | |
Re: Typ List(Of clsKlasse) und Typ Dictionary wollen nicht so ganz | | | Autor: MoveIt | Datum: 27.11.17 18:11 |
| Hallo Manfred,
Vielen Dank für deine Hilfe.
Ich werde mal meinen Code "optimieren" und entzerren.
Fehler liegt wahrscheinlich an dem Parameter Profil, den ich da über eine Selbstreferenz (Me) übergeben habe.
Du hast mich da auf eine neue Idee gebracht.
Bis denne,
Stephan
__________________
Heute ist nicht mein Tag.
| |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|