Richtigen Wert aus Tabelle holen

  • VB.NET

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

    Richtigen Wert aus Tabelle holen

    hi leute

    mal wieder eine frage.
    als vorgabe habe ich eine tabelle(schema siehe bild) in welcher preise enthalten sind. nun habe ich in einer form eine combobox1 (diese dient zur auswahl ob haupttabelle oder nebentabelle), eine combobox2 (diese dient zur auswahl ob zeile1, zeile2, usw. zu), eine combobox3 (diese dient zur auswahl ob kat1, kat2, kat3, usw.) und ein label1

    das ist meine aktuelle situation.


    nun stellt sich mir die frage wie man so etwas am besten umsetzt um den richtigen wert aus der richtigen tabelle zu holen (in der schemazeichnung die rot markierten felder)
    mit der ersten combobox wähle ich die tabelle aus (also haupttabelle oder nebentabelle).

    mit der zweiten und der dritten combobox werden die zeilen und spalten angegeben. der schnittpunkt der beiden ergibt logischerweise meinen gewünschten wert.


    wäre super wenn ihr mir verraten könntet wie man soetwas am besten umsetzen kann.


    hoffe ihr kennt euch bei meiner etwas seltsamen fragestellung aus ;)

    danke bereits im voraus
    Bilder
    • schema.jpg

      49,77 kB, 1.152×648, 155 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NET.Rider“ ()

    danke, aber da blick ich noch nicht wirklich durch :(

    edit: habe das schemabild ein wenig verändert um es deutlicher zu machen. die rot markierten felder solln herausgefunden und in ein label geschrieben werden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NET.Rider“ ()

    Also wenn du wolltest, könntest du es erlernen - sehr zu deinem Nutzen, denn dieses KnowHow ist in 9 von 10 Datenverarbeitungen verwendbar.

    Und es ist die korrekte Antwort auf deine Frage:
    wäre super wenn ihr mir verraten könntet wie man soetwas am besten umsetzen kann.


    Aber wenn du es erlernen wolltest, müsstest du halt nachfragen: Sesamstraße ;)
    okay. danke. hab es endlich umgesetzt und gecheckt. nur eine frage habe ich noch:

    die eingegebenen daten werden ja in einer xml-datei gespeichert. wo liegt diese ? sind die daten auch noch vorhanden wenn ich diese beim erstellen des programmes eingib und anschließend ein setup erstelle und es auf einem anderen pc installiere?
    Bei DB-Programmierung ohne Datenbank werden die Daten im _DataFile abgelegt:

    VB.NET-Quellcode

    1. Private _DataFile As New FileInfo("..\..\DBSampleDataSet.DataSet.xml")
    Das ist auch im Projekt eingebunden, und du kannst es direkt angugge.

    Ich hab keine Ahnung von Setups, aber kann man sicherlich so konfigurieren.

    ErfinderDesRades schrieb:

    Bei DB-Programmierung ohne Datenbank werden die Daten im _DataFile abgelegt:

    VB.NET-Quellcode

    1. Private _DataFile As New FileInfo("..\..\DBSampleDataSet.DataSet.xml")
    Das ist auch im Projekt eingebunden, und du kannst es direkt angugge.

    Ich hab keine Ahnung von Setups, aber kann man sicherlich so konfigurieren.



    Gut. Danke. Hat mir alles wirklich sehr geholfen. :)

    Nun habe ich nur noch das Problem, wie ich einen gespeicherten wert in der Tabelle finde.
    Zuerst soll eine Spalte fixiert werden (dies geschieht durch eine combobox), anschließend soll die Zeile gefunden werden, wo der wert darin steht welcher in der combobox ausgewählt wurde.

    jetzt soll in der gewählten spalte soweit "hintergefahren" werden bis in der spalte 1 der wert steht, welcher auch in der 2. combobox steht. der schnittpunkt dieser 2 gedachten geraden ist nun der wert der in ein label ausgegeben werden soll.

    leider habe ich zu diesem thema nichts passendes noch gefunden.

    EDIT:
    habe jetzt mal folgenden beitrag gefunden:
    vb-paradise.de/programmieren/d…ehoerige-zeile-ermitteln/

    und meinen code jetzt mal o eingegeben:

    VB.NET-Quellcode

    1. For i As Integer = 0 To dlg_tarifverwaltung.KryptonDataGridView1.Rows.Count
    2. If dlg_tarifverwaltung.KryptonDataGridView1.Rows(i).Cells(0).Value.ToString = CDbl(cboAbo.SelectedIndex) Then
    3. If cboSaison.Text = "Hauptsaison" Then
    4. lblEinzelpreisErwachsen.Text = dlg_tarifverwaltung.KryptonDataGridView1.Item(2, cboAbo.SelectedIndex).Value
    5. Else
    6. lblEinzelpreisErwachsen.Text = dlg_tarifverwaltung.KryptonDataGridView1.Item(5, cboAbo.SelectedIndex).Value
    7. End If
    8. End If
    9. Next


    irgendwie will es aber nicht funktionieren ? kann mir jemand weiterhelfen ?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „NET.Rider“ ()

    Ich denke, du denkst zu sehr Tabellen-orientiert, also in Zeilen und Spalten.

    Eine DataTable ist weniger eine Tabelle, sondern ist eine Liste von Objekten (Datensätze), und jedes Objekt hat einen bestimmten Satz von Properties. Diese Properties werden bei tabellarischer Präsentation praktischerweise als Spalten angezeigt - sind aber eigentlich Properties.
    Aber auch ich rede oft von Spalten - jetzt weißt du ja, was damit gemeint ist.

    Jo, und "Spalte fixieren", oder "Spalte hinterherfahren" sind halt Begriffe, die im OOP nicht wirklich funktionieren.

    Durchsucht wird immer die gesamte Liste, wobei man eine "Spalte" angeben kann, nach deren Werten ausgewählt werden soll.
    Auch kann man eine Spalte angeben, deren Werte angezeigt werden sollen - diese Spalte wird - je nachdem - als "DisplayMember", oder bei Binding-Objekten auch als "DataMember" bezeichnet.
    (In einem anneren Zusammenhang benennt der "Datamember" aber auch eine Tabelle oder Relation, die aus mehreren Tabellen oder Relationen ausgewählt wird - dies nur am Rande).

    Vlt. erklärst du nochmal genau, was dir im Ergebnis vorschwebt:

    In einer Combo sollen SpaltenNamen enthalten sein, und der angewählte Spaltenname soll angeben, nach welcher Spalte die Tabelle durchsucht werden soll.
    Oder soll die Combo die Spalte angeben, deren Werte angezeigt werden sollen?

    In einer anderen Combo willst du Werte einer Spalte anzeigen - und was dort angewählt wird, soll ins Label übertragen werden?

    Wozu das?
    Wenn du einen Wert in der Combo anwählst, dann wird er doch bereits in der Combo angezeigt - wozu ihn zusätzlich nochmal im Label präsentieren?
    Okay. Ich glaube es war auch meine Schuld dass ich mich nicht ganz deutlich ausgedrückt habe.

    Also folgender Sachverhalt:
    Ich habe in dem Table Preise gespeichert (ohne datenbank wie du es mir bereits am anfang mitgeteilt hattest). diese schaut folgendermaßen aus:

    ID | Abo | E1 | J1 | K1 | E2 | J2 | K2
    ... dies sind meine Spalten in dem Table.


    dort sind darunter Werte eingetragen:

    ID | Abo | E1 | J1 | K1 | E2 | J2 | K2
    ---------------------------------------------
    0 | 1 Tag | 5 | 4 | 3 | 4,5 | 3,5 | 2,5
    1 | 2Tage | 8 | 7 | 6 | 7,5 | 6,5 | 5,5
    ... usw ...


    Nun habe ich auf der Form eine ComboBox. In dieser wähle ich das Abo aus (also 1 Tag, 2 Tage, ...). In der zweiten ComboBox wählt man die Kategorie aus (also E1, J1, K1, E2, J2, K2).

    Anhand diese ausgewählten Werte in den ComboBoxen soll der richtige Preis in ein Label (jetzt mal Label1 genannt) geschrieben werden.

    Ergebnis soll sein: Wenn ich in der ersten ComboBox (also bei Abo) "2 Tage" wählen und in der zweiten ComboBox "E2" wähle, soll im Ergebnis, also im Label1 "7,5" stehen.


    Hoffe wirklich dass mir jemand weiterhelfen kann. Bin mitterweile am verzweifeln. Finde einfach kein passendes Thema zu meinem Vorhaben.

    Danke bereits im voraus :)
    Ahaa!

    Also in der ersten Combo wird anhand der ABO-Spalte ein Datensatz ausgesucht, und die 2. Combo enthält Spaltennamen, die angeben, welche Property im Label anzuzeigen ist.

    Guck dirmal Keine Strings in die File-Listbox! an - da gibts auch eine Combo, die die Displaymember definiert.

    Das kann ich auch eben umfrickeln, dasses so präsentiert, wie ich dich jetzt glaube verstanden zu haben.
    FileInfoDatamember00.zip

    Es ist übrigens komplizierter.
    Man kann in einem bestehenden Binding nicht den Datamember austauschen, sondern man muß das ganze Binding austauschen.

    Ausserdem macht die Synchronisation von Combobox und Label erforderlich, dass eine BindingSource zwischengeschaltet wird, damit ein Zeiger auf den Selected-Datensatz verwaltet wird.

    Ausserdem konfiguriert man BindingSources im Designer, wenn man ein typDataset zur Verfügung hat. Btw. Die Bs wird dir korrekt konfiguriert generiert, wenn du an DataTables bindest. Das ist ein Unterschied zur primitiven List(Of FileInfo) - achnee - DataSource ist ja nur ein FileInfo-Array.
    Kann es sein, dass du dein Datenmodell von hinten aufzäumst?
    Was machst du, wenn mehr Kategorien dazukommen sollten? Meiner Meinung nach sollte ein Datensatz folgende Properties haben:
    ID | Abo | ID_Kateg | Preis
    Eine 2. Tabelle enthielte die Kategorien in Form von ID | Benennung.
    Dann eine 1:n Verknüpfung zwischen Kategorietabelle.ID und Preisliste.ID_Kateg.

    Das kannst du so darstellen wie du möchtest und hast eben die Möglichkeit, ohne Probleme weitere Kategorien hinzuzufügen. Das Heraussuchen des richtigen Preises gechieht dann über den Bindingsource.Filter.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hi Vatter!

    Stimme dir vollkommen zu. :thumbsup: Eine vernünftige Datenmodellierung ist das nicht, wassichda verzapft hab.
    Tut mir jetzt fast leid - ist eiglich ein Beispiel für QuicknDirty :wacko:

    Aber ist ein gutes Beispiel für Q&D, weil die angesprochene Komplikation ist im Grunde bereits direkte Folge vom Dirty.

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

    da habt ihr beide recht. die modellierung ist nicht sonderlich gut. aber kategorien kommen zu 100% keine mehr dazu.

    alles was jetzt noch funktionieren muss, ist die suche in den daten wie ich bereits ein wenig weiter oben beschrieben habe :)
    (Klugscheiß):
    Es handelt sich nicht um eine Suche, sondern es ist einfach eine zwei-stufige Auswahl.
    Unter Suche verstehe ich, wenn man eine For-Schleife anwenden muß, oder (mw. im weitesten Sinne) einen Linq-Ausdruck.
    Nicht mal einen zu setzenden Filter würde ich als Suche bezeichnen - auch wenn die BindingSource da im Hintergrund iwie suchen tut.