Hilfe bei SQL-Abfragen

  • VB.NET

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

    Hilfe bei SQL-Abfragen

    Hallo,

    habe eine Datenbank "AOIDaten.sdf" mit einer Tabelle "Test" in der es 5 Spalten gibt:
    "Date" "Time" "Program" "AnalysisTime" "CycleTime"
    In "CycleTime" stehen z.B. solche Werte "34.45", "35.01", usw.
    Nun will ich herausfinden welcher Wert in "CycleTime" am Häufigsten vorkommt in Abhängigkeit vom Programmnamen der in "Program" enthalten ist und diesen z.B. in einer MsgBox anzeigen lassen!!

    SQL-Abfrage

    1. SELECT COUNT(*) AS CycleTime
    2. FROM Test
    3. WHERE (Program = @Programname)


    mit dieser Abfrage klappt es nicht, wie muss es lauten, damit es funktioniert?
    Tja, da ist - je nach Vorkenntnissen - mehr oder weniger viel Grundlagenwissen zu lernen.
    vlt. die relationale GrundIdee, sicher "Datenbank in 10 Minuten" auf Movie-Tuts, und wenn mans geschnackelt hat wirds dann wieder leicht mit [VB 2008] DBExtensions.

    Immer zuerst die Frage: Brauch ich ühaupt eine Datenbank? DB-Programmierung ohne Datenbank
    Das ist nämlich gar nicht so häufig wirklich der Fall.
    Wenn die Daten sowieso im Programm benötigt werden ist der Dataset-Ansatz ja OK.

    Wenn's allerdings tatsächlich lediglich darum geht, den häufigsten Wert rauszukriegen, halte ich es für zuviel Overhead das Ganze in ein Dataset zu lesen, wenn's auch mit einem SQL-Einzeiler geht (siehe Post #3).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja, also mit der Abfrage das hab ich jetzt in SQL gemacht.

    Im Anhang mal die Tabelle nachdem ich die Daten eingelesen habe.

    Wie bekomme ich jetzt z.B. den häufigsten Wert der Spalte "CycleTime" in eine Textbox??
    Bilder
    • snap.jpg

      213,62 kB, 833×419, 147 mal angesehen
    zuächstmal kannst du einfach auf den SpaltenHeader "CycleTime" klicksen, dann sortiert sich das, und der höchste Wert kommt zB. nach oben.
    Vlt. reicht das ja schon.

    Ansonsten finde ich in dieser Spalte lauter unterschiedliche Werte - daher sehe ich keinen Sinn, den am häufigsten vorkommenden herauszusuchen - die Häufigkeit ist bei allen gleich: 1

    Aber vlt. hat man auch nur zuwenig Datensätze im Blick.

    Also wenns da wirklich dopplungen gibt - kannst du das Projekt mal hochladen?

    Ich würde das gern mal mit LinqToDataset ausprobieren - habich nämlich noch nie.

    Aber geht auch zu fuß: Alle Daten in ein Dictionary(of Double, Integer), und wenn ein Wert da schon drin ist, kann man den Integer hochzählen.

    Und am Schluß das Dic-Entry raussuchen mit dem höchsten Value-Wert.

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

    So hab das mal gezippt, hoffe das passt so!
    Stand der Dinge vielleicht nochmal:

    Lese die einzelnen Zeilen aus einem TXT-File ein, will dann den häufigst vorkommenden Wert aus der Spalte "CycleTime" herausbekommen = Taktzeit,
    aber nur jeweils für das entsprechende "Program" - sprich Taktzeit für Program "00329BFBOT", Taktzeit für Program "00329BFTOP", usw.

    Erklärung der eingelesenen Zeilen bzw. TXT-File:
    -Maschine schreibt für jeden Tag ein File
    -die Zeile die ich einlese, entspricht ein gefertigtes Teil mit Zeitstempel (Date und Time), Programmnamen (Program), AnalyseZeit und Takzeit (CycleTime).
    -die zeilen im DataSet sind nach der Zeit sortiert
    -wenn sich der Programmname ändert, wurde auf ein anderes Teil umgestellt, d.h. diese Umstellzeit bräuchte ich auch (=CycleTime vom ersten neuen Teil)
    -am Schluß soll noch etwas ausgerechnet werden und zwar immer nur für den einen Abschnitt wo z.B. Programm 00329BFBOT produziert wurde:
    (Summe aller CycleTime) - (Umstellzeit) - ((Anzahl Program X) * (Taktzeit))

    Vielleicht kannst du mir ja da weiterhelfen, steh auf dem Schlauch!!!
    Ist glaub ich auch ganz schön kompliziert!!! ;)
    Dateien

    VB.NET-Quellcode

    1. Imports AOI2OEE_Konverter.AOIDatenDataSet
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    5. DateiEinlesen()
    6. End Sub
    7. Sub DateiEinlesen()
    8. 'einlesen ins Dataset - nicht in die Datenbank
    9. For Each line In IO.File.ReadAllLines("..\..\Timelg23.txt")
    10. If line.Contains("Analysis time :") Then
    11. Dim var = line.Split(" "c) 'jeweils bei einem Leerzeichen trennen
    12. AOIDatenDataSet.Linie3.AddLinie3Row(var(0), var(2), var(6), var(11), var(16))
    13. End If
    14. Next
    15. End Sub
    16. Sub Taktzeitberechnen()
    17. End Sub
    18. Private Sub Linie3BindingNavigatorSaveItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Linie3BindingNavigatorSaveItem.Click
    19. Me.Validate()
    20. Me.Linie3BindingSource.EndEdit()
    21. Me.TableAdapterManager.UpdateAll(Me.AOIDatenDataSet)
    22. End Sub
    23. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    24. 'gruppen von rows bilden, bei denen rw.CycleTime identisch ist
    25. 'absteigend sortiert, sodass die größte Gruppe die erste ist.
    26. Dim grps = From rw In AOIDatenDataSet.Linie3 _
    27. Group By rw.CycleTime Into Group Order By Group.Count Descending
    28. 'anzeige: die erste Row der ersten Gruppe
    29. AOIDatenDataSet_Linie3RowBindingSource.DataSource = grps.First.Group.First
    30. End Sub
    31. End Class

    Option Strict On! gemacht.
    Befüllung geändert: ich befülle nicht erst die DB, und von da aus das Dataset, sondern gleich das Dataset.

    Bei Anzeige der gesuchten Row einen Trick angewandt: nämlich im Datenfenster eine Resource hinzugefügt, vom Typ "Object", und da die Linie3Row ausgewählt.
    Danach konnte ich son Row-Objekt aus dem Datenfenster aufs Form ziehen, und er generierte die Labels und Textboxen.

    zu beachten: connectionString geändert, denn meine SqlServer-Instanz heißt "SqlExpress2008", nicht einfach "SqlExpress"

    Aber Das Datenmodell ist vollkommen vermurkst: Double-Werte, Datumse als Strings - da funktioniert natürlich die Sortierung nicht.
    Keine PrimKeys, sodaß aus der DB geladene Datensätze nicht mehr rückgespeichert werden können.
    Keine Prinzipien der Datenmodellierung beachtet, sodaß hundertfach derelbe Wert in der einzigen Tabelle steht. solche Redundanzen sind unzulässig - "Program" muß eine eigene Tabelle sein, auf die Verwiesen wird.
    2 Spalten - eine für Datum, und eine für time - beide als String. Das gehört zusammengelegt in eine Spalte vom Typ DateTime.

    Ich empfehle dir wirklich, die angegebenen tuts gründlich durchzumachen - so wies jetzt anfängt, wirds kein ernstzunehmendes Software-Produkt werden können.
    Dateien
    Danke, für die Hilfe.

    Ich seh schon, bin noch ein ganzes Stück entfernt, ein "richtiges" Programm zu schreiben!!

    Da ist es ja am Besten, ich fange das Projekt neu an und lese die Daten zuerst nur in ein DataSet ein, anschließend versuche ich die benötigten Berechnungen durchzuführen.
    Und erst dann, werde ich diese Werte in eine Datenbank schreiben.

    Kann ich mehrere DataSet´s erstellen? Oder DataTable´s?
    Werde für jedes "Program" das es in der Datei gibt ein DataSet/DataTable erstellen lassen. Oder wie würdest du das am Besten angehen, wenn du so ein Projekt beginnst?

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

    Also die Idee, für jedes Program eine DataTable anzulegen zeigt, dass die relationale GrundIdee nicht verstanden wurde.
    Die Frage nach den mehreren DataTables zeigt, dass du keine einzige meiner SampleSolution mal geöffnet hättest, und dir die dortigen Datasets mal angeguckt.
    Oder hast du tatsächlich eine erwischt, wo nur eine DataTable drin ist?

    ketzei schrieb:

    wie würdest du das am Besten angehen, wenn du so ein Projekt beginnst?

    immer mitte Datenmodellierung. Also den abzubildenden Vorgang in ein Datenmodell übersetzen.
    Von deinen Vorgängen weißich bisher nur, dasses Programme gibt, und Daten, und das aus einem Programm mehrere Daten herauskommen, also die Relation Programm->Daten, zwei Tabellen.