Relation erstellen

  • VB.NET
  • .NET (FX) 4.0

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

    Relation erstellen

    Hallo,

    versuche seit Tagen eine Relation zu erstellen, aber irgendwie funktioniert das nicht richtig. Bzw. vielleicht ist eine Relation nicht das Richtige und Ihr habt ne bessere Lösung.

    Hier der Code worum es eigentlich geht.

    Ich möchte den select Befehl entfernen, da es sicher ne elegantere Lösung.

    VB.NET-Quellcode

    1. Public Sub UpdateclosedTrades(ByVal TradeID As String, ByVal AccountID As String, ByVal offerID As String, ByVal Amount As Integer, ByVal BuySell As String, ByVal OpenRate As Double, ByVal CloseRate As Double, ByVal PL As Double, ByVal GrossPL As Double, ByVal openTime As Date, ByVal closeTime As Date)
    2. Dim foundRows() As Data.DataRow
    3. foundRows = Datenbank.Tables("RealTime").Select("OfferID = " & "'" & offerID & "'")
    4. Datenbank.Geschlossene_Trades.AddGeschlossene_TradesRow(TradeID, AccountID, offerID, "", Amount, BuySell, OpenRate, CloseRate, PL, GrossPL, openTime, closeTime)
    5. End Sub



    Ziel ist es aus der Realtime Tabelle die "Währung" in die Tabelle "Geschlossene Trades" zu bekommen. Der Zusammenhang entsteht durch die "OfferID" die einmalig für jede Währung besteht.
    Bilder
    • Dataset Bild.JPG

      34,46 kB, 508×399, 108 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Hallo,

    Habe die Relation wieder gelöscht da es nicht funktioniert hat, anbei die Tabelle.

    Die wollte ich eigentlich mit der Realtime table erschlagen. Diese wird wie gesagt im Millisekunden Bereich aktualisiert und ist die Hauptabelle, alle anderen Tabellen bekommen Ihre Daten aus dieser Tabelle.
    Ich wollte mit Parent(Realtion).Währung eine Verbindung zur Realtimeliste schaffen.

    Gruß
    Dateien
    • Datenbank.Designer.vb

      (266,34 kB, 83 mal heruntergeladen, zuletzt: )
    • Datenbank.vb

      (43 Byte, 82 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Ich glaube ich habe die Lösung, hoffe das es so richtig ist. Danke, für den Ansatz mit der offertabelle(kann dies aber auch in der Realtime einsetzen, muss nur etwas umstricken.

    Hier der Code einer test dataset:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim mInstrument1() As String
    3. Dim sw As IO.StreamReader
    4. Dim x, datei As String
    5. Dim enc As System.Text.Encoding
    6. Dim dati As Integer
    7. Dim temp() As String
    8. Dim temp2() As String
    9. enc = System.Text.Encoding.GetEncoding(28605)
    10. datei = "D:\Kurse\Kursliste.txt"
    11. Dim fil1 As New IO.FileInfo(datei)
    12. If fil1.Exists = True Then
    13. sw = New IO.StreamReader(datei, enc)
    14. x = sw.ReadToEnd
    15. temp = x.Split(CChar(Environment.NewLine))
    16. sw.Close()
    17. ReDim mInstrument1(temp.Length - 1)
    18. dati = temp.Length - 1
    19. For i = 0 To dati
    20. temp2 = temp(i).Split(CChar(";"))
    21. mInstrument1(i) = temp2(0)
    22. DataSet1.Realtime.AddRealtimeRow(i, mInstrument1(i).Trim)
    23. Next
    24. End If
    25. End Sub
    26. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    27. Dim RealTimetablerow As DataSet1.RealtimeRow
    28. For i = 0 To 14
    29. RealTimetablerow = DataSet1.Realtime.FindByOfferID(i)
    30. Me.DataSet1.closedTrades.AddclosedTradesRow(i, RealTimetablerow)
    31. Next
    32. End Sub


    Hoffe das es so richtig ist, es macht auf jedenfall das was es soll!
    Bilder
    • Richtig 2.JPG

      135,42 kB, 1.147×754, 100 mal angesehen
    • Richtig 3.JPG

      75,12 kB, 729×504, 105 mal angesehen
    • Richtig.JPG

      20,3 kB, 534×175, 93 mal angesehen
    ohne jetzt drüber nachzudenken - einfach dass ich den Code besser lesen kann:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim datei = "D:\Kurse\Kursliste.txt"
    3. Dim fil1 As New IO.FileInfo(datei)
    4. If fil1.Exists Then
    5. Dim sw = New IO.StreamReader(datei, System.Text.Encoding.GetEncoding(28605))
    6. Dim x = sw.ReadToEnd
    7. Dim temp = x.Split(CChar(Environment.NewLine))
    8. sw.Close()
    9. Dim mInstrument1(temp.Length - 1) As String
    10. Dim dati = temp.Length - 1
    11. For i = 0 To dati
    12. Dim temp2 = temp(i).Split(";"c)
    13. mInstrument1(i) = temp2(0)
    14. DataSet1.Realtime.AddRealtimeRow(i, mInstrument1(i).Trim)
    15. Next
    16. End If
    17. End Sub
    unsinnige Leerzeilen entfernt, Vorausdeklarationen entfernt, den Char zum Splitten richtig notiert.
    Zeile #7 wird noch Probleme machen - Dateien können verschiedenerlei Zeilvorschübe aufweisen.
    Ist immer besser, das Framework das machen zu lassen, etwa mit File.ReadAlllines(), also so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim datei = "D:\Kurse\Kursliste.txt"
    3. Dim fil1 As New IO.FileInfo(datei)
    4. If fil1.Exists Then
    5. Dim temp = File.ReadAllLines(datei, System.Text.Encoding.GetEncoding(28605))
    6. Dim mInstrument1(temp.Length - 1) As String
    7. Dim dati = temp.Length - 1
    8. For i = 0 To dati
    9. Dim temp2 = temp(i).Split(";"c)
    10. mInstrument1(i) = temp2(0)
    11. DataSet1.Realtime.AddRealtimeRow(i, mInstrument1(i).Trim)
    12. Next
    13. End If
    14. End Sub
    Oder warum nicht gleich so?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim datei = "D:\Kurse\Kursliste.txt"
    3. Dim fil1 As New IO.FileInfo(datei)
    4. If fil1.Exists Then
    5. Dim lines = File.ReadAllLines(datei, System.Text.Encoding.GetEncoding(28605))
    6. For i = 0 To lines.Length - 1
    7. DataSet1.Realtime.AddRealtimeRow(i, lines(i).Split(";"c)(0).Trim)
    8. Next
    9. Else
    10. MessageBox.Show("Mann - das File gibts doch garnet!!")
    11. End If
    12. End Sub


    So, jetzt.
    Ja, das mittm Dataset gfallt mir - DataExpressions: Filter und berechnete Spalten im Dataset richtig umgesetzt.

    Nur deine Benamung!
    Da wirst du noch Freude dran haben, dass RealTime jetzt einen Primkey namens OfferId hat., und Closed_Trade mittels OfferID auf einen RealTime verweist.
    Meine Empfehlung: Primärschlüssel heissen immer ID - egal in welcher Tabelle. Und ForeignKeys heissen immer <ForeignTableName>Id.
    Das ist knapp, unmissverständlich und da gibts auch keine Namens-Kollisionen


    Hmm - nochmal Bildle geguckt: Eiglich wäre eine DatagridviewComboColumn hier angemessener, dann könnte die berechnete Spalte aus dem Datenmodell entfallen.

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

    Ja die Bennenunh, hat mir jetzt schon große Probleme bereitet. Werde aber alles nochmal neu machen. Hab ja jetzt ein grundlegendes Konzept.
    Nur die Performance der der tables machen mir noch Kopfzerbrechen. Und ich bin am Überlegen ob es vlt. sogar sinnvoller ist, für jede Währung eine eigene Table erstellen zu lassen. Das mache ich aber später, wenn ich etwas mehr Erfahrung gesammelt habe. Nochmal vielen dank für die denckanstöße.
    Normal ist die Performance ausreichend. Die geht vor allem inne Knie, wenn Controls angebunden sind.

    Obwohl bei deine Spekulatius kanns natürlich wirklich sein, dass eng wird.

    Wär halt schade drum, denn mit selbstgebastelten Klassen modellierts sichs nur recht mühsam.

    Man kann sich auch Hybrid-Lösungen ausdenken, Partiale Erweiterungen typisierter DataRows, die dann mit List(Of T) worken und alles wirklich zeitkritische abhandeln.
    Aber immer die Rules Of Optimization befolgen - keine Ausnahme!

    Sorgen darfst du dir also gerne machen, aber bevor dus nicht gemessen hast, oder bevor es sichtbar die Useability stört, fang da kein Gewurstel an!