vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Typ 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel