Daten einlesen und als Diagramm ausgeben??

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ketzei.

    Daten einlesen und als Diagramm ausgeben??

    Hallo,

    mein neues Projekt soll mir ein Zeitdiagramm anzeigen, aber wie bekomme ich ein Zeit-Diagramm in VB.net? Ich brauche eure Hilfe um dieses Projekt zu verwirklichen!!

    Ich habe eine Textdatei, die täglich erstellt wird mit Namen "08112011.BDE", in dieser Datei befindet sich ab der Zeile 21 eine Nummer für das Produkt und anschließend durch Leerzeichen getrennt eine Uhrzeit, z.B. "23:52:15". Danach kommt eine Zeile die mit "0" beginnt und in der nächsten Zeile steht das nächste Produkt mit der Zeit.
    Nun will ich in meinem Programm zuerst ein einen Zeitraum festlegen, z.B. von 6:00 Uhr bis 14:00 Uhr und eine Stückzahl an Produkten festlegen, dies soll dann im Diagramm die Soll-Linie sein. Wenn mann jetzt per Button startet, soll das Programm in einem Intervall von vorher eingestellten Minuten, je nach dem die Uhrzeit in dem vorgegebenen Zeitraum liegt im Zeitdiagramm einen Punkt setzen!!

    Wie mache ich das alles am Besten? Wie würdet ihr das angehen?
    Die Datei einlesen:

    VB.NET-Quellcode

    1. Public lines() As String
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. lines = IO.File.ReadAllLines(Application.StartupPath & "\Daten.txt")
    4. End Sub


    jetzt hast du erstmal die gesamte Textdatei in einem Array, dann kannst du hingehn und jede Zeile in einen Array aufteilen

    VB.NET-Quellcode

    1. Dim Var1() As String
    2. For x = 0 To UBound(lines)
    3. Var1 = lines(x).Split(New Char() {" "}) 'jeweils bei einem Leerzeichen trennen
    4. Next x


    jetzt teste mal mit einer MsgBox(Var1(0)) was in Var1(0) steht was in Var1(1) steht usw


    Für das Diagramm füg mal ein Chart zu deinem Form hinzu -> unter Toolbox->Daten->Chart
    Das kannst du so mit werten füllen. Zum Beispiel mit einer For Next schleife wenn du deine X und Y Werte jeweils in einem Array gespeichert hast


    VB.NET-Quellcode

    1. For x = 0 To UBound(XWerte)
    2. Chart1.Series(0).Points.AddXY(XWerte(x),YWerte(x))
    3. Next
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

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

    Danke für die Hilfe, werde es morgen testen, aber wie mache ich das mit dem Dateinamen, dass automatisch die richtige Datei gelesen wird. Der Dateiname ist ja nur das Datum,
    kann ich das vielleicht mit "Format(Now, "dd.mm.yyyy")" und mit replace machen?
    Danke, das mit dem Datum und dem Datei einlesen funktioniert wunderbar.
    Wenn ich jetzt aber die Abfrage mit einer MsgBox(Var1(0)) und so weiter mache, bekomme ich bei Var1(0) den richtigen Wert, aber bei Var1(1) bekomme ich eine Zeit die es in der Datei gar nicht gibt!!??
    Was mache ich falsch?

    VB.NET-Quellcode

    1. Sub main()
    2. lines = IO.File.ReadAllLines(path & Now.ToString("ddMMyyyy") & ".BDE")
    3. Dim Var1() As String
    4. For x = 0 To UBound(lines)
    5. Var1 = lines(x).Split(New Char() {vbTab}) 'jeweils bei einem TAB trennen
    6. Next x
    7. MsgBox(Var1(0) & " " & Var1(1))
    8. End Sub
    Dateien
    • 09112011.BDE.txt

      (935,67 kB, 239 mal heruntergeladen, zuletzt: )

    ketzei schrieb:

    ..bekomme ich eine Zeit die es in der Datei gar nicht gibt!!??
    Was mache ich falsch?

    Doch - die Zeit gibt es bei Dir.
    Ganz am Ende der Textdatei :D.
    Du läßt Dir in der Messagebox nur die letzte Zeile anzeigen.

    Guck mal - bei mir geht das:


    Also so in etwa:

    VB.NET-Quellcode

    1. Dim lines() As String = IO.File.ReadAllLines("F:\" & Now.ToString("ddMMyyyy") & ".BDE")
    2. Dim Var1() As String
    3. For x = 20 To UBound(lines)
    4. Var1 = lines(x).Split(CChar(" "))
    5. ListBox1.Items.Add(Var1(0) & vbTab & Var1(1))
    6. Next x


    Wie Du siehst, fülle ich die ListBox schon während der Schleife.
    So möchtest Du das natürlich nicht - es dient nur der Visualisierung.
    Deine Arbeit besteht nun darin, das gefüllte Array zu durchlaufen und die Daten zu verabeiten.

    LG,
    Bruno
    Super Danke, stimmt so weit hab ich natürlich wieder nicht gedacht!!
    Werde das aber auch so machen wie du, da ich ja die Chart damit füllen will!!


    Hab das mit dem Diagramm jetzt so eingefügt, aber wie kann ich z.B. X-Linie schön unterteilen??

    VB.NET-Quellcode

    1. For x = 20 To UBound(lines)
    2. Var1 = lines(x).Split(CChar(" ")) 'jeweils bei einem Leerzeichen trennen
    3. Chart1.Series(1).Points.AddXY(Var1(1), part)
    4. part = part + 1
    5. Next x


    Danke für die super Hilfe!!

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

    Hallo Leute,

    will das Diagramm jetzt ein wenig vereinfachen, d.h. keine Linie mehr sondern Balken!
    Ich habe zwei Stückzahlen die ich für das Produkt a und Produkt b vorgebe, nun soll im Diagramm ein Balken für Produkt a und ein Balken für Produkt b sein.
    An der X-Achse will ich den Produktnamen und die Y-Achse soll die Stückzahl zeigen. So nun zu den Daten die ich aus der Datei bekomme: Die sortiere ich vorher für welches Produkt sie sind, stand ja in Var1(0) drin und anschließend soll ein Balken neben dem vorgebenen Balken erscheinen und mit einem Timer aktualisiere ich das Diagramm bzw. lese die Datei neu ein, um zu schauen ob weitere Werte hinzugekommen sind!

    Ich brauche Hilfe bei der Erstellung des Balkendiagramms, kennt jemand damit aus?
    So hab einiges ausprobiert, aber jetzt komm ich nicht mehr weiter.
    Hier der Code:

    VB.NET-Quellcode

    1. Sub Main()
    2. lines = IO.File.ReadAllLines(path & Now.ToString("ddMMyyyy") & ".BDE")
    3. Dim Var1() As String
    4. Dim part1 As Integer = 0
    5. Dim part2 As Integer = 0
    6. Chart1.Series(0).XValueType = ChartValueType.Auto
    7. Chart1.Series(1).XValueType = ChartValueType.Auto
    8. Chart1.Series(2).XValueType = ChartValueType.Auto
    9. Chart1.Series(3).XValueType = ChartValueType.Auto
    10. Chart1.Series(0).Points.AddXY(Einstellungen.TextBox1.Text, Einstellungen.TextBox2.Text)
    11. Chart1.Series(2).Points.AddXY(Einstellungen.TextBox3.Text, Einstellungen.TextBox4.Text)
    12. For x = 20 To UBound(lines)
    13. Var1 = lines(x).Split(CChar(" ")) 'jeweils bei einem Leerzeichen trennen
    14. If Var1(0).ToString = Einstellungen.TextBox1.Text Then
    15. part1 = part1 + 1
    16. ElseIf Var1(0).ToString = Einstellungen.TextBox3.Text Then
    17. part2 = part2 + 1
    18. End If
    19. Next x
    20. Chart1.Series(1).Points.AddXY(Einstellungen.TextBox1.Text, part1)
    21. Chart1.Series(3).Points.AddXY(Einstellungen.TextBox3.Text, part2)
    22. ' MsgBox(Var1(0) & " " & Var1(1))
    23. End Sub


    und im Anhang ein Screenshot wies jetzt aussieht!!

    Was muss ich ändern dass die x-Achse besser skaliert ist?
    Bilder
    • snap.jpg

      292,09 kB, 1.671×964, 715 mal angesehen
    Schau doch einfach mal was das Chart Object alles zu bieten hat :)
    Da kannst du die Achsenskalierung ändern wie du es brauchst, Standardgemäß steht es auf Auto
    Bilder
    • ChartObject.png

      166,6 kB, 1.693×995, 574 mal angesehen
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Danke, habs jetzt soweit wie im Bild sichtbar!
    Wie mache ich das, dass die ersten zwei Balken immer in X auf 1 sind und die anderen zwei Balken immer in X auf 2 sind?
    Wie kann ich oberhalb der Balken z.B. die Programmnummer anzeigen lassen?

    VB.NET-Quellcode

    1. Sub Main()
    2. lines = IO.File.ReadAllLines(path & Now.ToString("ddMMyyyy") & ".BDE")
    3. Dim Var1() As String
    4. Dim part1 As Integer
    5. Dim part2 As Integer
    6. For x = 20 To UBound(lines)
    7. Var1 = lines(x).Split(CChar(vbTab)) 'jeweils bei einem Leerzeichen trennen
    8. If Replace(Var1(0), " ", "") = Einstellungen.TextBox1.Text Then
    9. part1 = part1 + 1
    10. ElseIf Replace(Var1(0), " ", "") = Einstellungen.TextBox3.Text Then
    11. part2 = part2 + 1
    12. End If
    13. Next x
    14. Chart1.Series(0).Points.Add(Einstellungen.TextBox2.Text)
    15. Chart1.Series(1).Points.AddY(part1)
    16. Chart1.Series(2).Points.Add(Einstellungen.TextBox4.Text)
    17. Chart1.Series(3).Points.AddY(part2)
    18. 'MsgBox("ABC" & Var1(0) & " " & "ABC" & Var1(1))
    19. 'MsgBox(part1 & " " & part2)
    20. End Sub
    Bilder
    • snap.jpg

      121,89 kB, 1.674×966, 461 mal angesehen
    Ich versteh nicht ganz was du da eigentlich machst...

    Chart1.Series(0).Points.Add(Einstellungen.TextBox2.Text)
    Chart1.Series(1).Points.AddY(part1)
    Chart1.Series(2).Points.Add(Einstellungen.TextBox4.Text)
    Chart1.Series(3).Points.AddY(part2)

    Dir ist klar das 0,1,2,3 jeweils ein neues Diagramm darstellen? Du vergibst ja irgendwie nur Y werte.
    Wie wärs wenn du hingehst und deine Datensätze wo du bei x=1 darstellen willst sagst: Chart1.Series(0).Points.AddXY(1,YWerte)
    und alles was bei x=2 sein soll Chart1.Series(0).Points.AddXY(2,YWerte)
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Ach so, ich hab gemeint dass Series(0) der erste Balken ist und Series(1) der zweite usw.
    Blick da irgendwie überhaupt nicht durch!!

    Wie muss ich das dann machen? Reicht dann ein Series(0)?

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

    In Analogie zu Excel, wenn du nur eine Kurve hast dann reicht auch ein Series(0)
    Bilder
    • Series.png

      82,59 kB, 1.503×446, 474 mal angesehen
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Ok, dann bin ich ja mit meinen 4 Datenreihen schon richtig! Da jeder ja etwas anderes wiedergibt!

    Ich hab jetzt die Series(0) und Series(2) auf eine Linie festgelegt.

    1. Wieso beginnt die x-Achse mit 0 als erstem Wert? Den Wert 0 hab ich doch nirgends??
    2. Wie schaffe ich es dass die Linien eine Gerade von X=0 und Y="Eingabewert in Einstellungen" werden?? --> soll praktisch als Ziel vorrausgesetzt werden
    3. Wieso überschneiden sich X und Y-Achse nicht bei 0??
    Bilder
    • snap.jpg

      224,42 kB, 1.637×945, 531 mal angesehen
    So wie ich das sehe gibt es in Vorgabe 1 einen Punkt(0|0) und einen Punkt (1/400) in Vorgabe 2 gibt es einen Punkt (0|0) und einen Punkt (2|500) je nachdem welche Darstellungsart du in den Series wählt macht er halt Balken oder Splines oder Linien was es da halt alles gibt, die auswahl scheinst du ja gefunden zu haben.
    2. Versteh ich nicht ganz, es sind doch geraden? oder meinst du das die senkrecht nach oben gehn?
    3. Stell mal in der ChartArea bei der X-Achse das Minimum auf 0, es wird automatisch -1 gewählt weil die linien vom nullpunkt losgehn, das liegt an der autoformatierung
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Danke für den Denkanstoss,

    habs jetzt hinbekommen, eigentlich ganz einfach wenn man weis, was was ist!! :whistling:

    ist zwar wahrscheinlich umständlich gemacht, aber so funktioniert es wenigstens!!

    VB.NET-Quellcode

    1. Chart1.Series(0).Points.AddXY(0, Einstellungen.TextBox2.Text)
    2. Chart1.Series(0).Points.AddXY(1, Einstellungen.TextBox2.Text)
    3. Chart1.Series(0).Label = Einstellungen.TextBox2.Text
    4. Chart1.Series(1).Points.AddXY(1, part1)
    5. Chart1.Series(1).Label = part1
    6. Chart1.Series(2).Points.AddXY(0, Einstellungen.TextBox4.Text)
    7. Chart1.Series(2).Points.AddXY(2, Einstellungen.TextBox4.Text)
    8. Chart1.Series(2).Label = Einstellungen.TextBox4.Text
    9. Chart1.Series(3).Points.AddXY(2, part2)
    10. Chart1.Series(3).Label = part2


    Danke noch mal!!