DB-Programmierung ohne Datenbank relationare GrundIdee

  • VB.NET

Es gibt 72 Antworten in diesem Thema. Der letzte Beitrag () ist von mularstein.

    DB-Programmierung ohne Datenbank relationare GrundIdee

    hallo Leute,

    ich komme seit zwei tagen nicht wirklich weiter.

    Ich versuche euch das mal zu erklären.

    Ich habe eine Excel-Tabelle mit sehr vielen Artikeln gefüllt ( Als Übungstabelle habe ich jetzt ca. 8.000 Artikel auf ca. 200 Paletten) . Die genaue Anzahl ist IMMER UNBEKANNT.
    Alle Artikel sind einzeln aufgelistet und haben eine Palettennummer angegeben.

    z.B.:

    Artnr 1 | Pallete1 | Artikel Topf | EAN | EK-Preis | VK-Preis

    Auf einer Palette können sich zwischen 5 und 60 Artikel befinden. Es ist ebenfalls unbekannt.

    Ich wollte jetzt die einzelnen Artikel in die Palette stecken und nur in einer Zeile die wichtigsten zahlen ausgeben lassen, wie:

    Paletten-Nr | Gesamt EK-Preis | Gesamt VK-Preis

    Ich habe schon einiges ausprobiert.
    Zweidimensionale Array eignen sich nicht, da diese nicht erweiterbar sind.
    mit csv habe ich nicht nicht geabreitet.

    vielleicht könnt ihr mir helfen!! ?? Wie kann ich die Daten bearbeiten und wieder zusammengefasst ausgeben???

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mularstein“ ()

    mularstein schrieb:

    Ich wollte jetzt die einzelnen Artikel in die Palette stecken und nur in einer Zeile die wichtigsten zahlen ausgeben lassen
    Mit dieser Idee laufen deine Gedanken bereits in Richtung relationale Datenmodellierung.

    Da würde man eine Tabelle Palette anlegen, und eine Tabelle Artikel.
    Und jeder Artikel würde per ForeignKey auf die Palette verweisen, der er angehört.

    Die von dir angesprochene Aufsummierung wäre dann ein Klacks.

    Gugge erstmal die relationale GrundIdee für die relationale GrundIdee, dann DB-Programmierung ohne Datenbank für eine erste Umsetzung von sowas, dann DataExpressions für SummenFormeln und so Zeugs.
    Und schon kommt die erste Frage.

    wenn ich der Video-Anleitung: "DataSet-Only" folge, dann erstelle ich zuerst die Tabelle: Palette, trage dann die Werte ein.
    Danach erstelle ich die Ersten Artikel.
    Zu der Video-Anleitung: Die finde ich schon sehr gut gemacht. Es ist aber total nervig, dass man nach dem Klick nicht mehr zurück kann, sondern die komplette Anleitung von vorne starten muss!! :cursing:
    Habe aber tortzdem alles soweit hinbekommen was dort zu machen war 8-) , nachdem ich die Anleitung ca. 1.000 Mal von vorne angesehen habe. :P
    Diese Anleitung ist für solche Anfänger wie mich sehr gut geeignet!!


    Jetzt wieder zurück zum Problem:
    Bei mit ist es aber genau andersrum.
    Ich habe zuerst die Artikel und aus den Artikeln muss ich eine Palette erstellen.

    Bis jetzt habe ich nur die vorhandene Exceltabelle eingelesen und im DGV ausgegeben.

    Ich müsste jetzt aus der Spalte Paletten-Nr alle Zeilen auslesen und wenn eine neue Palette auftaucht in die Tabelle: Palette einfügen.
    Danach die ExcelTabelle nochmals auslesen und alle einzelnenen Artikel in die Tabelle: Artikel hinzufügen.

    Ist das richtig?
    kann mir vielleicht jemand mit dem Code etwas helfen. ich weiß nicht wo und wie ich am besten anfangen kann! :wacko: :?: ?(

    Noch eine Sache:

    Wie kann ich beim Klicken auf die Paletten-Tabelle in der Artikel-Tabelle nur die Artikel anzeigen lassen, die zu der ausgewählten Palette gehören?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mularstein“ ()

    ich weiß jetzt nicht.
    Vom typDataset her ists ganz einfach und logisch, Paletten zuzufügen, und den Paletten dann Artikel zuzufügen. Und deine letzte Frage ist ja mit DB-Programmierung ohne Datenbank bereits beantwortet: Du musst dir nur vorstellen, die Kategorien seien deine Paletten, und die AddOns seien deine Artikel.
    Diese Struktur einer Präsentation nennt man den "ParentChild-View". Weil es gibt 4 grundlegende Möglichkeiten, relational organisierte Daten zu präsentieren, und in Kombination untereinander ergeben sich irrsinnig viele Möglichkeiten - gugge vier Views

    Das Theater mit deiner Excel ist eine ganz annere Baustelle, was du brauchst, ist nämlich ein Konverter, der die doofe Excel-Tabelle einliest, gruppiert und ordentliche Dataset-Datensätze draus macht.
    Den Konverter musste einmal ausführen, und dann kannste Excel deinstallieren.

    Mach erstmal das Dataset-Teil fertig.

    Dann schreib mir irgendwas, was die Excel-Tabelle zeilenweise in irgendetwas einliest, in was ist egal.
    Das kann man dann mit Linq leicht gruppieren, und das Dataset davon befüllen.
    Bis jetzt habe ich die Excel-tabelle wie folgt eingelesen:

    VB.NET-Quellcode

    1. Dim path As String = OpenFileDialog1.FileName
    2. Dim DS As System.Data.DataTable
    3. Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
    4. Dim MyConnection As System.Data.OleDb.OleDbConnection
    5. Dim myRow As DataRow
    6. Dim TabellenName As String = ""
    7. Dim TabGeladen As Boolean = False
    8. Dim TabelleErr As Boolean = False
    9. MyConnection = New System.Data.OleDb.OleDbConnection( _
    10. "provider=Microsoft.Jet.OLEDB.4.0; " & _
    11. "data source=" & path & "; " & _
    12. "Extended Properties=Excel 8.0;")
    13. Try
    14. MyConnection.Open()
    15. DS = MyConnection.GetSchema("Tables")
    16. For Each myRow In DS.Rows
    17. TabellenName = myRow.Item(2).ToString 'Tabellenblattname ermitteln
    18. Next
    19. Me.Cursor = Cursors.WaitCursor
    20. MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [" + TabellenName + "]", MyConnection)
    21. DS = New System.Data.DataTable
    22. MyCommand.Fill(DS)
    23. Do Until TabGeladen = True
    24. DataGridView1.DataSource = DS
    25. My.Application.DoEvents()
    26. TabGeladen = True
    27. Loop
    28. Catch ex As Exception
    29. MsgBox("Fehler beim Öffnen! " + vbCrLf + "Vorgang abgebrochen oder nicht kompatible Datei gewählt!", MsgBoxStyle.Critical, vbYes)
    30. tabelleerr = True
    31. End Try
    32. MyConnection.Close()
    33. Me.Cursor = Cursors.Default
    34. If TabelleErr = True Then
    35. TabelleErr = False
    36. Else
    37. DataGridView1.Columns.Add("vkPreis", "VK-Preis")
    38. DataGridView1.Columns.Add("gewinnq", "Gewinnquote")
    39. DataGridView1.Columns.Add("VKPrChkt", "VKPrChkt")
    40. maxZeilen = Me.DataGridView1.Rows.Count 'Zeilenanzahl ermitteln
    41. maxSpalten = Me.DataGridView1.ColumnCount 'Spaltenanzahl ermitteln
    42. Label11.Text = CStr(maxZeilen) ' nur für testzwecke
    43. End If


    jetzt weiß ich aber nicht wie es weiter geht.

    Ich kann die einzelnen Spalten ansprechen. Es wäre theoretisch möglich jetzt schon die Parents-Tabelle also die Paletten-tabelle mit Daten zu füllen. oder nicht?
    naja, das tut doch immerhin - mit bischen Glück eine Excel-Tabelle in eine DataTable namens "DS" laden - das ist schoma das wichtigste.

    nun braucht man noch den Screenshot vom typisierten Dataset, damit bekannt ist, welche Spalten für Palette und Artikel vorgesehen sind, und dann kann man paar Zeilen mit Linq zurechtmachen.

    Wäre natürlich netter, du würdest Bitte VB-Tag benutzen - aber richtig, und DS vernünftig benamen, und den DatagridViewTeil da rauswerfen, aber zur not gehts auch so.
    Na klar doch... war mir nur nicht sicher ob es dir wirklich um sreenshot geht... dachte nur es wäre wieder mal ein fachbegriff aus der Programmiersprache.. :D

    Das erste Bild zeigt die eingelesene Excel-tabelle. ( SKU = Paletten-Name)
    Alle Informationen aus der Tabelle werden auch in der Artikel-tabelle benötigt. zusätzlich erstelle ich immer Extra Spaleten für den Verkaufspreis, die Gewinnermittlung und ob Artikel bereits geprüft wurde.

    Für die Paletten-tabelle sieht man bereits alles auf dem Bild.

    Nicht wundern über das komische Aussehen... ich werds, wenn ich soweit alles fertig hab schöner machen. Bis jetzt probiere ich alles aus...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mularstein“ ()

    Tja, sind noch zuwenig Informationen, sorry. Aber in diese Richtung wird das gehen:

    VB.NET-Quellcode

    1. Private Sub FillTypDataset(ByVal ds As DataTable, ByVal typDts As PaletteDataset)
    2. Dim groupedData = From dr In ds.Rows.Cast(Of DataRow)() Select dr!Lager_ID, dr!SKU, dr!Itemname, dr!ASIN, dr!EAN, dr!Zustand, dr!Land, dr!VK_netto
    3. Group By SKU Into Group
    4. For Each gp In groupedData
    5. Dim rwPalette = typDts.Palette.AddPaletteRow(gp.SKU)
    6. For Each itm In gp.Group
    7. typDts.Artikel.AddArtikelRow(rwPalette, itm.SKU, itm.Itemname, itm.ASIN, itm.EAN, itm.Zustand, itm.Land, itm.VK_netto)
    8. Next
    9. Next '
    10. End Sub
    Nur weiß ich nicht, welchen Datentyp die typisierten Spalten haben, und in welcher Reihenfolge sie von der AddXYRow - Methode erwartet werden, und welche Excel-Spalte in welche Dataset-Spalte umgewandelt gehört.
    Auch die Namen mancher Excelspalten sind geraten. Ich weiß nur, dass aus einer Spalte "VK Preis" keine DatasetSpalte "VK Preis" generiert werden kann, sondern vermutlich "VK_Preis".

    Auch deine Dataset-Tabellennamen habich verkürzt und singularisiert, gemäß meinem Benamungs-Schema für DB-Entitäten

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Vielen Dank für dein Hilfe!
    Leider wird bei mir bei PaletteDataset ein fehler angezeigt: Typ nicht definiert.

    VB.NET-Quellcode

    1. Private Sub FillTypDataset(ByVal ds As DataTable, ByVal typDts As PaletteDataset)


    Was muss ich da ändern?
    achso.. Ich glaub das konntest du nicht wissen, da ich es nicht geschrieben habe.

    Irgendwie steige ich da nicht ganz durch.
    Nachdem ich jetzt den Dataset umbenannt habe kommen weitere Fehlermeldung.

    VB.NET-Quellcode

    1. For Each gp In groupedData
    2. Dim rwPalette = typDts.Palette.AddPaletteRow(gp.SKU)
    3. For Each itm In gp.Group
    4. typDts.Artikel.AddArtikelRow(rwPalette, itm.SKU, itm.Itemname, itm.ASIN, itm.EAN, itm.Zustand, itm.Land, itm.VK_netto)
    5. Next


    typDts.Palette und Artikel sind keine Member...

    Könnetest du mir dein Quelltext bischen erklären, damit ich es besser verstehen kann?? :rolleyes:

    mularstein schrieb:

    typDts.Palette und Artikel sind keine Member...

    ErfinderDesRades schrieb:

    Auch deine Dataset-Tabellennamen habich verkürzt und singularisiert, gemäß meinem Benamungs-Schema für DB-Entitäten
    Dein Dataset hat keine Tabelle Namens Palette, sondern nur eine mit dem ich finde idiotischen Namen "NeuePaletten".
    Ich würde empfehlen, statt meinen Code an deine Namen anzupassen, eher deine Namen an mein BenamungsSchema anzupassen, weil letzteres ist in einigen Jährchen gewachsen und bewährt.

    Das wird jetzt einiges Gefummel, denn der richtige Name jeder Excel-Spalte muß mit der richtigen DataColumn assoziiert werden, und auch noch im Typ richtig konvertiert.

    Knackpunkt ist die untypisierte DataTable ds, die du aus dem ExcelSheet befüllst.
    von der werden pro DataRow die Spaltenwerte abgerufen, mit ds!SpaltenName. Ist hier ein Spaltenname eingesetzt, dens nicht gibt, so wird das Fehler werfen.

    als nächstes werden im typDataset typiseirte DAtarows geaddet, PaletteRows werden der PaletteDataTable geadded, und ArtikelRows der ArtikelDataTable.
    Und deren .AddXYRow-Methoden erwarten für jede Spalte ein Argument mit dem richtigen Datentyp.

    Die blöden mit ds!SpaltenName abgerufenen Spaltenwerte sind aber nur von Typ Object, und müssen noch umgewandelt werden in die Datentypen deiner DataColumns (die ich ja nicht weiß).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Die Namen Neuetabellen und NeueArtikel habe ich gewällt, da es sich um neuzugänge handelt. Dazu wollte ich alle Artikel speichern um Statistiken usw. zu erstellen.
    Aber ich habe da noch nicht viel Erfahlrung in den Sachen... also habe ich auf dich gehört und die namen geändert.

    Die Spalte PalettenNr in der Tabelle Palleten hat String als Datentyp, da der Inhalt sich aus Buchtaben, zahlen und Sonterzeichen zusammenstetzt.

    Bei dem Code wird mir angezeigt, dass


    VB.NET-Quellcode

    1. Dim rwPalette = typDts.Paletten.AddPalettenRow(gp.SKU)
    , siehe Bild 2


    Wenn ich jetzt

    VB.NET-Quellcode

    1. Ctype(gp.SKU, String)


    Kommt die Meldung, dass er es nicht konvertieren kann.

    Was muss ich dann als Wert eintragen?
    Bilder
    • seine4.png

      16,99 kB, 606×274, 114 mal angesehen
    • seite5.png

      18,46 kB, 786×255, 115 mal angesehen

    mularstein schrieb:

    VB.NET-Quellcode

    1. Dim rwPalette = typDts.Paletten.AddPalettenRow(gp.SKU)
    Es gibt noch eine weitere Überladung von AddPalettenRow, die mehrere Argumente erwartet (nämlich für jede Spalte eines). Diese Überladung musste nehmen.

    Ist vlt. ganz gut, sich erstmal nur auf die PaletteDataTable zu konzentrieren.
    also habe ich auf dich gehört und die namen geändert
    naja - da sind noch einige Verstöße gegen mein Benamungs-Schema für DB-Entitäten, zb Primärschlüssel sollen einfach Id heißen, und alle Tabellen im Singular.