Daten aus einem Datatable auslesen und Updaten

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Daten aus einem Datatable auslesen und Updaten

    Hi,

    ich setze mich momentan mit Datasets auseinander. Wie ich Daten in ein Datatabel schreiben kann ist mir mittlerweile klar, ich weiß allerdings noch nicht, wie ich eine klassische Select und Update Anfrage ausführen kann.
    Bsp: Ich möchte aus meinem Datatabel "Artikel" anhand der Artikel ID den Artikelnamen wissen.

    Könnt ihr mir weiter helfen?

    Grüße Benny

    fanello schrieb:

    ich weiß allerdings noch nicht, wie ich eine klassische Select und Update Anfrage ausführen kann.

    Dataset ist keine Datenbank in dem Sinne, dasses mit einer extra Sprache manipuliert werden müsste.
    Es gibt zwar einen untypisierten Select-Befehl - der hat mit Sql aber nix zu tun.
    Vergiss einfach "klassische Select und Update Anfrage".


    zur Frage: Wie kommts, dass du eine ArtikelID hast, nicht aber den Artikel selbst?

    Ich hab immer gleich den ganzen Artikel-Datensatz, und daher kommt so eine Anforderung gar niemals vor.
    Zu erst muss ich mich bei dir für dein Dataset only Tutorial bedanken, das hat mir wirklich sehr geholfen!
    Ich habe die Tabelle Bestellungen. In der Tabelle Bestellung muss ich anhand der Bestellnummer die dazugehörigen Artikel IDs auslesen. Aus der Tabelle Artikel muss ich dann die zu den Artikel IDs gehörende EAN auslesen.

    fanello schrieb:

    Ich habe die Tabelle Bestellungen. In der Tabelle Bestellung muss ich anhand der Bestellnummer die dazugehörigen Artikel IDs auslesen.
    Aus der Tabelle Artikel muss ich dann die zu den Artikel IDs gehörende EAN auslesen.
    Ja, das macht am Anfang immer Mühe, zu fassen, wie einfach das ist:

    VB.NET-Quellcode

    1. dim Artikels As ArtikelRow() = myBestellung.GetArtikelRows()
    2. dim ean = myArtikel.EAN

    du siehst: ArtikelID wird nicht gebraucht

    VB.NET-Quellcode

    1. dim Artikels As ArtikelRow() = myBestellung.GetArtikelRows()
    2. dim ean = myArtikel.EAN


    Das kann ich leider nicht nachvollziehen.
    ArtikelRow gibt es bei mir nicht, da gäbe es nur Testdb.ArtikelRow.
    Woher kommt denn myBestellung und myArtikel, heißen so die Datatables?

    Die Herangehensweisen die ich sonst so im Internet gefunden habe, durchsuchen den gesamten Datensatz in einer Schleife nach dem Schlüsselwort und lassen sich dann den benötigten Wert zurück geben. Diese herangehensweise empfinde ich als deutlich Aufwendiger als einfach eine kurze Anfrag an die DB zu richten, oder sehe ich das falsch?

    Wenn wir gerade schon dabei sind, das geht doch bestimmt auch noch besser:

    VB.NET-Quellcode

    1. Dim dgvcb As New DataGridViewComboBoxCell
    2. Dim dgvcl As New DataGridViewColumn(dgvcb)
    3. For Each inf In Me.Bpdb.Versandmodell
    4. dgvcb.Items.Add(inf.cVersandmodell)
    5. Next

    fanello schrieb:

    ArtikelRow gibt es bei mir nicht, da gäbe es nur Testdb.ArtikelRow.
    also gibts ArtikelRow bei dir durchaus. Am besten du setzst eine Imports-Direktive, dass dein typDataset im CodeFile bekannt ist, dann kannst du die Namen auch so kurz benutzen, wie von mir gezeigt. Gugge vlt. DBExtensions, da habe ich die Imports nachträglich in die Posts mit reingemacht, weil da ist auch danach gefragt worden.

    Woher kommt denn myBestellung und myArtikel, heißen so die Datatables?
    Nein, deine DataTables heißen: "Bestellung" und "Artikel" - aber das solltest du eiglich besser wissen als ich ;)

    myBestellung sei eine angenommene BestellungRow - du sagtest, du hättest eine Bestellung, deren Artikel du wolltest.
    myArtikel ist eine beispielhafte ArtikelRow - es könnte zB eine aus dem ArtikelRow-Array "Artikels()" aus der Zeile darüber sein - etwa Dim myArtikel = Artikels(0).

    Die Herangehensweisen die ich sonst so im Internet gefunden habe, durchsuchen den gesamten Datensatz in einer Schleife nach dem Schlüsselwort und lassen sich dann den benötigten Wert zurück geben. Diese herangehensweise empfinde ich als deutlich Aufwendiger als einfach eine kurze Anfrag an die DB zu richten, oder sehe ich das falsch?
    Bitte! Präzise Begriffe!
    Einen Datensatz durchsucht man nicht in einer Schleife - man kann BindingSources, Dataviews oder auch DataTables durchsuchen.
    Aber in deinem Fall vmtl. komplett unnötig, denn du kannst deine Bestellung aus BestellungBindingSource.Current direkt herausholen (ohne Suche), und von dieser Bestellung ebenfalls wie gezeigt direkt die bestellten Artikel abrufen.

    Ups - das Datenmodell ist natürlich Quatsch. In einer Bestellung dürfen keine Artikel auftauchen, sondern nur Bestellposten. Jeder Bestellposten verweist auf den durch ihn bestellten Artikel und gibt eine Anzahl an. Gugge zusammengesetzter Primkey

    Wenn wir gerade schon dabei sind, das geht doch bestimmt auch noch besser:

    VB.NET-Quellcode

    1. Dim dgvcb As New DataGridViewComboBoxCell
    2. Dim dgvcl As New DataGridViewColumn(dgvcb)
    3. For Each inf In Me.Bpdb.Versandmodell
    4. dgvcb.Items.Add(inf.cVersandmodell)
    5. Next
    jo, das geht sicher besser. Geht das überhaupt? (durch den Compiler?)
    :)
    Ich glaube ich muss wirklich erklären was ich vorhabe, so bekomme ich es nicht hin.. Ich wollte das eigentlich selber entwickeln, aber dafür ist das alles noch zu neu für mich.

    Ich habe Versandklassen und Versandmethoden.
    Jede Versandklasse hat eine einmalige Nummer und einen Namen, das gleiche gilt für die Versandmethoden.

    Ich möchte nun ein Datagridview aufbauen, in dem alle Versandklassen aufgelistet sind und neben jeder Versandklasse befindet sich eine Combobox in der die dazugehörige Versandmethode gewählt werden kann.

    Ich habe mir nun gedacht ich erstelle eine dritte Tabelle in der jeder Versandklasse einer Versandmethode zugewiesen ist, oder ich erweitere die Versandklassen Tabelle um die Spalte kVersandmethode, was ist denn besser?

    In einem weiteren Schritt will ich dann die zu einer Bestellung gehörenden Versandklasse, sowie die dazu gehörige Versandmethode ermitteln (darum meine Frage wie ich die Artikelnummer anhand einer Artikel ID ermitteln kann) und daraus die optimale Versandmethode zu bestimmen.

    Das Ganze Programm funktioniert schon, nur habe ich das bisher mit unendlich vielen Arrays gelöst.

    Grüße Benny

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

    ein JoiningView.

    Wie etwa in Phonebook demonstriert.

    Da gibts ja sone Combo, mit der man den Titel einer Person auswählt - das täte der Auswahlmöglichkeit einer Versandmethode entsprechen.

    Ich habe mir nun gedacht ich erstelle eine dritte Tabelle in der jeder Versandklasse einer Versandmethode zugewiesen ist, oder ich erweitere die Versandklassen Tabelle um die Spalte kVersandmethode, was ist denn besser?
    kommt auf das Verhältnis von VersandKlasse zu VersandMethode an: Gehört eine Versandmethode zu genau einer Versandklasse, oder kann dieselbe Methode mehreren Versandklassen zugeordnet werden?
    Bei letzterem bräuchtest du eine Zuordnungs-Tabelle, alias "Mittler-Tabelle"

    Dann läge eine m:n - Relation vor, und also eher ein Modell nach art von zusammengesetzter Primkey


    Leider kannichmir unter Versandklasse nix vorstellen - was soll das vorstellen: eine Versandklasse?
    Versandklasse und Versandmethoden sind eigentlich gar nicht so verschieden. Die Klasse kann man für die Artikel festlegen, damit werden z.b. Versandkosten in einem Onlineshop berechnet. Natürlich könnte ich die Klassen den Methoden auch fix zuweisen, ich programmiere allerdings weil es mir Spaß macht und ich dabei etwas lernen möchte. Darum möchte ich das ganze Variabel gestalten, sodass z.B. der Versandklasse Palette die Versandmethode Warensendung zugewiesen werden kann (auch wenn das keinen Sinn ergibt).
    Es liegt keine M:N Relation vor.

    Jetzt funktioniert die Zuweisung :)
    In Deinem Phonebook Programm wird bei Titel automatisch ein "-" eingetragen, sobald man einen neuen Eintrag anlegt, kannst du mir verraten wie das geht?

    Meine Tabelle Versandklassen hat jetzt die Spalten kVersandklasse, cName, kVersandmethode.
    Wie ermittel ich jetzt bestmöglich die zu z.B: zu Versandklasse 3 gehörige Versandmethode?

    fanello schrieb:

    Versandklasse und Versandmethoden sind eigentlich gar nicht so verschieden. Die Klasse kann man für die Artikel festlegen, damit werden z.b. Versandkosten in einem Onlineshop berechnet. Natürlich könnte ich die Klassen den Methoden auch fix zuweisen, ich programmiere allerdings weil es mir Spaß macht und ich dabei etwas lernen möchte. Darum möchte ich das ganze Variabel gestalten, sodass z.B. der Versandklasse Palette die Versandmethode Warensendung zugewiesen werden kann (auch wenn das keinen Sinn ergibt).
    Es liegt keine M:N Relation vor.
    Wenn du meinst, jetzt könne ich mir unter "Versandklasse" etwas vorstellen, dann mussichdich enttäuschen ?(

    In Deinem Phonebook Programm wird bei Titel automatisch ein "-" eingetragen, sobald man einen neuen Eintrag anlegt, kannst du mir verraten wie das geht?

    VB.NET-Quellcode

    1. Private Sub frmPhonebook_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    2. Reload()
    3. Dim defaultTitle = DirectCast(DirectCast(TitleBindingSource(0), DataRowView).Row, TitleRow)
    4. PhoneDts.Person.TitleIDColumn.DefaultValue = defaultTitle.ID
    5. End Sub
    Zeile #3 holt die erste TitleRow, die nach Befüllung des Datasets inne TitleBindingSource drinne ist.
    #4 setzt die ID dieser TitleRow als DefaultValue der TitleIDColumn der PersonDataTable.
    Dadurch verweist eine PersonRow defautlmäßig erstmal auf die erste TitleRow - und das ist halt der Titel "-". ;)

    Meine Tabelle Versandklassen hat jetzt die Spalten kVersandklasse, cName, kVersandmethode.
    Wie ermittel ich jetzt bestmöglich die zu z.B: zu Versandklasse 3 gehörige Versandmethode?

    VB.NET-Quellcode

    1. [Dim versandKlasse3 As VersandKlasseRow = '...
    2. dim methode as VersandMethodeRow = versandKlasse3.VersandMethode
    Du siehst: das typDataset generiert dir Properties, mit denen du von einer (untergeordneten) VersandKlasseRow direkt auf ihre Versandmethode zugreifen kannst.

    ... wenn dein Datenmodell so modelliert ist.
    Versandklassen können beliebig angelegt werden um eine variable Versandkostenberechnung zu ermöglichen.
    Wenn jemand ein Artikel aus Versandklasse1 bestellt, sind die VSK 2€
    Wenn jemand ein Artikel aus Versandklasse2 bestellt, sind die VSK 3€
    Und Wenn jemand ein Artikel aus Versandklasse1 und Versandklasse2 bestellt, sind die VSK 3,5€.

    Ich glaube du hast mich nicht richtig verstanden. Ich möchte aus der Tabelle Versandklasse einfach nur die Versandmethode-ID ermitteln, wenn ich die Versandklassen-ID weiß.

    Muss das nicht

    VB.NET-Quellcode

    1. Dim Method As Integer


    sein?

    Edit: Habe es selber herausgefunden:

    VB.NET-Quellcode

    1. Dim versandKlasse3 As bpdb.VersandklassenRow = CType(Bpdb.Versandklassen.FindBykVersandklasse(1), BP_Pack.bpdb.VersandklassenRow)
    2. Dim meth As Integer = versandKlasse3.kVersandmethode

    fanello schrieb:

    Versandklassen können beliebig angelegt werden um eine variable Versandkostenberechnung zu ermöglichen.
    Wenn jemand ein Artikel aus Versandklasse1 bestellt, sind die VSK 2€
    Wenn jemand ein Artikel aus Versandklasse2 bestellt, sind die VSK 3€
    Und Wenn jemand ein Artikel aus Versandklasse1 und Versandklasse2 bestellt, sind die VSK 3,5€.
    langsam kommt Licht ins Dunkel :)


    Ich glaube du hast mich nicht richtig verstanden. Ich möchte aus der Tabelle Versandklasse einfach nur die Versandmethode-ID ermitteln, wenn ich die Versandklassen-ID weiß.
    Wie gesagt: dass ist in jedem Falle unnötig.
    Die VersandklasseID weißt du nur, wenn du einen Versandklasse-Datensatz hast, und wenn du so einen Datensatz hast, kannst du direkt desse VersandMethodeRow-Property abrufen - ohne ID.

    Muss das nicht

    VB.NET-Quellcode

    1. Dim Method As Integer


    sein?
    nein, As VersandMethodeRow
    Method ist keine ID, kein Integer, sondern es ist der gesamte Datensatz - eine VersandMethodeRow halt

    Probiers dochmal aus - wenn dein Dataset tatsächlich so konfiguriert ist, wie du beschreibst, könnte der code sogar lauffähig sein.

    fanello schrieb:

    Ich brauche die Versandmethode, damit ich damit ein paar andere Werte berechnen kann, der komplette Datensatz bringt mir da wenig.

    ich verstehe nicht den Unterschied zw. "VersandMethode" und "kompletter Datensatz".
    Nach meinem Begriff hast du eine DataTable namens "VersandMethode", und darin werden VersandMethodeRows gespeichert - Datensätze halt. Was immer du mit "VersandMethode" anstellen willst - es ist ein Datensatz, und den brauchst du dazu.