Unterteilen und abspeichern von Select Count funktionen

  • VB.NET

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

    Unterteilen und abspeichern von Select Count funktionen

    Hallo,

    ich will eine funktion schreiben die immer wieder, alle einträge der letzten Woche zusammenzählt (select count) und abspeichert (optimal wäre in ein fortlaufende Excel Tabelle)

    Meine überlegung wäre per Group by eine Woche einzugrenzen. Das Problem welches ich nun habe ist, dass ich nicht weiß wie ich es schaffe, das dass Programm automatisch immer die letzte Woche unterteilt und den Count wert abspeichert.

    Ich könnte mir auch vorstellen ein Button zu erstellen welcher die unterteilung übernimmt. Hier wiederrum weiß ich nicht wie ich mit dem Group by umgehen soll. (Letzte woche). ?(

    Wäre dankbar für jeden ansatz :)

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

    So richtig blicke ich bei der Fragestellung nicht durch:

    Frage 1: Benutzt Du eine Datenbank? Wenn ja: welche?
    Frage 2: Was steht im Feld "Woche", bzw. gibt es überhaupt ein solches Feld. Anders: Wie weißt Du welcher Eintrag von welcher Woche ist?
    Frage 3: Geht es Dir um den Select-Befehl oder um VB-Code?
    Hallo,

    eine Datenbank (testweise .mdb später Upzising [SQL]) ist vorhanden.

    ich beschreibe einfach mal die Struktur.

    Es existieren 3 Spalten mit Daten (im Format: TT.MM.JJJJ H:m:ss). Eine Spalte davon wird automatisch bei Befüllung mit dem aktuellen Datum versehen. (Beispiel 21.1.12 14:00,21.1.12 15:00, 21.1.12 14:00.....28.1.13 14:00). Die anderen 2 Spalten benötige ich für eine Differenz Rechnung, die ich bereits erstellt habe.

    Nun soll eine Woche zusammengefasst werden. Die zusammengefasste Woche soll dann per count gezählt werden. (Beispiel: Woche 1: 12 Zeilen Woche 2 16 Zeilen...usw). Die Ergebnisse sollen in eine Excel Tabelle(Zeile) gespeichert werden. Danach sollen Woche für Woche eine weitere Zeile in die Excel Tabelle geschrieben werden.

    Zzt weiß ich überhaupt nicht wie bzw wo ich da anfangen soll. Meine erste Idee war, eine weitere Spalte in die Datenbank einzufügen für die Kalenderwoche. Dann müsste ich nicht auf das Daten format achten sondern hätte eine kleine Zahl.

    Ich weiß aber nicht wie ich das alles in VB reinprügeln soll.
    ich glaube mein Arbeitstag ist zu lang :) Irgendwie kommt nix mehr rüber :)

    VB.NET-Quellcode

    1. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    2. cmd.CommandText = "SELECT WKZ_T_ANTRAGSZEITPUNKT FROM WKZ_Anfrage"
    3. Conn.Open()
    4. reader = cmd.ExecuteReader()
    5. While reader.Read()
    6. d_anzahl = (reader(0))
    7. End While
    8. datum = CDate(d_anzahl)
    9.  woche = DatePart(DateInterval.WeekOfYear, datum, FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays)
    10. reader.Close()
    11. Try
    12. cmd.CommandText = "Update WKZ_Anfrage SET WKZ_Anfrage.WKZ_KALENDERWOCHE ='woche'"
    13. cmd.ExecuteNonQuery()
    14. Catch ex As Exception
    15. End Try
    16. Me.Refresh()
    17. Conn.Close()
    18. End Sub

    Er soll jetzt in die spalte Kalenderwoche, die KW schreiben, die er sich aus einer anderen Spalte berrechnet
    Fehlermeldung?

    EDIT:

    VB.NET-Quellcode

    1. cmd.CommandText = "Update WKZ_Anfrage SET WKZ_Anfrage.WKZ_KALENDERWOCHE ='woche'"

    Sollte das nicht

    VB.NET-Quellcode

    1. cmd.CommandText = "Update WKZ_Anfrage SET WKZ_Anfrage.WKZ_KALENDERWOCHE ='" & woche & "'"

    heißen?
    Die funktion schreibt nun in die Tabelle rein. Leider ist der Wert falsch. Er soll das datum von WKZ_T_Antragszeitpunkt nehmen => Kalenderwoche berechnen => und in Kalenderwoche abspeichern.

    Im moment schreibt er in jede Zeile 9 rein also die aktuelle Kalenderwoche!



    Fehlermeldung tauchen keine auf!

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

    Mach mal zur Kontrolle nach

    VB.NET-Quellcode

    1. d_anzahl = (reader(0))

    ein

    VB.NET-Quellcode

    1. MessageBox.Show(d_anzahl)

    dann kannst Du nämlich sehen was Du für einen Wert aus der DB bekommst.

    Und wenn Du lustig bist, kannst Du auch das Casten testen indem Du nach

    VB.NET-Quellcode

    1. datum = CDate(d_anzahl)

    ein

    VB.NET-Quellcode

    1. MessageBox.Show(datum)

    machst.

    Dann siehst Du was Dein Proggi macht
    ah ok. Hab

    VB.NET-Quellcode

    1. d_anzahl = (reader(0))
    in

    VB.NET-Quellcode

    1. MessageBox.Show(d_anzahl)

    umgewandelt. Er zeigt nur 00:00:00 an. Hab daraufhin d_anzahl geändert

    VB.NET-Quellcode

    1. d_anzahl = Convert.ToString(reader(0))

    Nun nimmt er sich das richtige Datum aus der Zeile.

    Das Problem ist das er aber, für die KW berechnung nur den letzten Wert der Datenbank nimmt. Und der letzte Wert entspricht der KW =9 :(
    Zunächst,
    mach doch bitte aus:

    VB.NET-Quellcode

    1. d_anzahl = (reader(0))

    ein

    VB.NET-Quellcode

    1. d_anzahl = (reader("WKZ_T_ANTRAGSZEITPUNKT"))

    Dieses reader(0) tut mir in den Augen weh...
    Das Convert brauchst Du nicht.

    Dann schau mal was für ein Datum in der MessageBox zu sehen ist.

    Dass das Programm in alle Zeilen die gleiche KW schreibt liegt an Deiner Update Anweisung. Du musst in diese noch eine Where Klausel einbauen. Sonst gilt das Update für ALLES.

    Versuch doch mal folgendes:

    VB.NET-Quellcode

    1. Private Sub Button5_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button5.Click
    2. cmd.CommandText = "SELECT WKZ_T_ANTRAGSZEITPUNKT FROM WKZ_Anfrage"
    3. Conn.Open()
    4. reader = cmd.ExecuteReader()
    5. Dim datumsListe As List(Of Date)
    6. While reader.Read()
    7. datumsListe.Add(CDate(reader("WKZ_T_ANTRAGSZEITPUNKT")))
    8. End While
    9. reader.Close()
    10. Try
    11. Dim woche As Integer
    12. For Each datum As Date In datumsListe
    13. woche = DatePart(DateInterval.WeekOfYear, datum, FirstDayOfWeek.Monday, FirstWeekOfYear.Jan1)
    14. cmd.CommandText = "Update WKZ_Anfrage SET WKZ_Anfrage.WKZ_KALENDERWOCHE ='" & woche & "' WHERE WKZ_T_ANTRAGSZEITPUNKT='" & datum & "'"
    15. cmd.ExecuteNonQuery()
    16. Next
    17. Catch ex As Exception
    18. End Try
    19. Me.Refresh()
    20. Conn.Close()
    21. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „vb-xperiment“ ()

    er Zeigt mir folgende Fehlermeldung:




    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in WKZ_Tool.exe aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


    Hab die datumsListe Variabel Global gesetzt, davor konnte er nicht auf die Var zugreifen.
    Er zeigt mir keine Fehlermeldung an, trotzdem schreibt er nichts mehr in die Spalte. (Kalenderwoche).

    Zur kontrolle habe ich die Woche kontrolliert

    VB.NET-Quellcode

    1. woche = DatePart(DateInterval.WeekOfYear, datum, FirstDayOfWeek.Monday, FirstWeekOfYear.Jan1) 'MessageBox.Show(woche)

    An dieser stelle zeigt er mir die Woche 5 an. Mein Datensatz startet mit dem 21.1.13 13:31:54. Theoretisch müsste er doch in der MessageBox = 4 anzeigen oder?

    edit: Ich hab den Update befehl verändert und er zeigt mir nun die richtigen Werte in der MessageBox an. Irgendwo in der Where Klausel liegt der Fehler.

    SQL-Abfrage

    1. WHERE WKZ_Anfrage.WKZ_T_ANTRAGSZEITPUNKT='" & datum & "'
    an dem TryCatch liegt es nicht. Hab ihn wegenommen und er schreibt trotzdem nix in die Datenbank. In meiner Test MessageBox zeigt das Programm die richtigen Kalenderwochen an aber schreibt diese nicht in die Datenbank. Er schreibt noch immer die KW des letzten Eintrags.

    Deshalb schließe ich daraus das die Where Klausel fehlerhaft ist.

    SQL-Abfrage

    1. "Update WKZ_Anfrage SET WKZ_Anfrage.WKZ_KALENDERWOCHE = '" & woche & "' WHERE WKZ_Anfrage.WKZ_T_ANTRAGSZEITPUNKT = '" & datum & "' "

    Fehlermeldung/Zeilen werden weiterhin nicht angezeigt



    edit:

    bin grad ein wenig verwirrt. Wenn ich cmd.ExecuteNonQuery() weglasse schreibt er nichts in die Tabelle. Habe ich es drinne kommt eine Fehlermeldung:


    Eine nicht behandelte Ausnahme des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.

    Zusätzliche Informationen: Datentypen in Kriterienausdruck unverträglich.



    Lasse ich cmd.ExecuteNonQuery() drinne. Aber die Where Klausel im SQl befehl nicht, schreibt er wieder was rein aber halt nur die KW der letzten Woche ?( ?(

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

    Du magst verwirrt sein, aber ich finde, du steuerst ganz zielstrebig auf den Problem-Kern zu.
    Wenn man sich erst vom TryCatch getrennt hat, kann man mittm Debuggen anfangen:
    Im VB-Code ist also kein Fehler, sondern erst, wenn das Sql ausgeführt wern soll, und zwar anne Where-Klausel hängts.

    Allerhöchstwahrscheinlich ein Konvertierungs-Fehler, der niemals aufgetreten wäre, wenn du DBParameter verwenden tätest.

    Meiner meinung nach nämlich sollte Microsoft die DB-Commands neu designen, dass diese String-Frickelei, wie du sie hier treibst, garnimmermehr möglich ist. DbParameter verwenden

    FRage ist auch: als welcher DatenTyp ist "WKZ_T_ANTRAGSZEITPUNKT" in der DB angelegt? Viele Diletanten legen nämlich auch für Datum-Werte einfach nur Datentyp String an, und handeln sich fabelhaften späteren Ärger damit ein.
    Aber das wirds nicht sein - dein String-Gefrickel liefert ja das Datum als String, und das lehnt die DB ja ab (lies die Fehlermeldung).

    Also, richtig machen, einen DbParameter verwenden, der Datum als Date anliefert - nicht als String.