| |
VB.NET - Ein- und UmsteigerSchleife nach sql abfrage funktioniert nicht richtg | | | Autor: Mctotti | Datum: 23.08.20 18:38 |
| Hallo Leute,
irgendwie funktioniert meine schleife nicht so ganz.
Okay ich versuch euch mal zu erklären worum es überhaupt geht damit ihr euch ein Bild machen könnt.
Also, ich versuch mich gerade an einem Terminplaner, es werden sogenannte Tagesfelder (soviel tage wie der monat hat ) erstellt, und in die tagesfelder kommen "LinkLabels" wo der Benutzer seine Termine reinschreiben kann. Das funktioniert auch super soweit.
Aber das problem darin liegt das er den Termin am selben Tag jeden Monat reinschreibt.
Die Daten kommen aus einer Access Datenbank und werden auch gut eingelesen.
Das ganze läuft bei mir über eine Funktion ab. Ich poste sie mal damit ihr seht wie ich das machen wollte.
Wie gesagt funzt es schon gut, nur mit dem Fehler das der Termin jeden Monat am selben Tag wiedergegeben wird, und nicht nur an dem vorgebenen .
Ich hoffe das ich mich verständlich ausgedrückt habe.
Über eure Hilfe oder Tipps würde ich mich sehr freuen
Übrigens ich arbeite mit VS 2015 Express und Access
Private Sub AnzeigenderTermineimTagesfeld(ByVal StartTagflpNummer As Integer)
Dim StartDatum As DateTime = New Date(aktuellesDatum.Year, _
aktuellesDatum.Month, 1)
Dim EndDatum As DateTime = StartDatum.AddMonths(1).AddDays(-1)
Dim sql As String
sql = $"select * from Termine where t_datum between '" & StartDatum & _
"' and '" & EndDatum & "' "
Dim dt As DataTable = QueryAsDataTable(sql)
MsgBox(sql)
For Each row As DataRow In dt.Rows
Dim Appday As Date = Date.Parse(row("t_datum")) 'hier testen
' wir gerade so rum
Dim link As New LinkLabel
link.Tag = row("ID")
link.Name = $"link{row("ID")}"
link.Text = row("t_name")
flpTageslabelliste((Appday.Day - 1) + (StartTagflpNummer - _
1)).Controls.Add(link)
Next
End Sub
Beitrag wurde zuletzt am 23.08.20 um 18:43:01 editiert. | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: Manfred X | Datum: 24.08.20 08:26 |
| Hallo!
Für mich undurchschaubar wegen fehlender Angaben.
Wieso muss das eingelesene Datum geparst werden?
Wird das Datum (String?) richtig erkannt?
Wie wird diese flpTageslabelliste gebildet? deklariert?
Was bedeutet der Parameter StartTagFlpNummer?
Ein falscher Parameter-Wert würde das geschilderte Phänomen
vermutlich erklären. | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: Mctotti | Datum: 24.08.20 09:56 |
| Hallo, das mit dem "Parse" war nur ein versuch von vielen....
Hier der Code wo StartTagflpNummer her kommt.
Aber ich glaube das es an der schleife liegt, die schleife soll aus der Datenbank(Access) mit dem Namen "Organizer" aus der Tabelle "Termine" und Spalte "t_datum" alle Termine anzeigen welche zwischen den beiden Datums liegen. Der SQL Befehl zeigt mir auch an start und enddatum an. Das scheint zu funktionieren.
Aber irgendwie steh ich auf dem Schlauch wegen der Schleife, ich weiss nicht wie ich in der schleife das Datum aus der DB mit den beiden Datums aus dem SQL-Befehl abfragen kann. Gibt es da vielleicht eine bessere Lösung als mit einer For Each Schleife zu arbeiten?
'###########################################################################
' ##########################################################################
' ###############
'Hier werden die Labels ( Die Monatstage ) in die Tage gesetzt, soviele
' Labels( flpTagesLabelliste ) der Monat hat
' und Zahlen (vom ersten Tag im Monat (also 1 ) bis ende des Monats (
' soviel wie der Monat Tage hat )
'##########################################################################
' #########################################################################
' #################
Private Sub TagesLabelflp(ByVal StartTagflpNummer As Integer, ByVal _
KompletteTageDesMonats As Integer)
For Each flp As FlowLayoutPanel In flpTageslabelliste
flp.Controls.Clear()
flp.Tag = 0
flp.BackColor = Color.White
Next
For i As Integer = 1 To KompletteTageDesMonats
Dim lbl As New Label
lbl.Name = $"lblDay{i}"
lbl.AutoSize = False
lbl.TextAlign = ContentAlignment.MiddleRight
lbl.Size = New Size(150, 25)
lbl.Text = i
lbl.Font = New Font("Microsoft Sans Serif", 12, FontStyle.Bold)
lbl.ForeColor = Color.DarkOrchid
flpTageslabelliste((i - 1) + StartTagflpNummer - 1).Controls.Add( _
lbl)
Next
End Sub | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: Manfred X | Datum: 24.08.20 18:18 |
| Du fragst per SQL-Between ein Zeitintervall über Strings ab?
Ob das korrekt funktioniert, weiss ich nicht.
Wieso ist das in Access kein Date-Typ?
Eventuell musst Du diese Datums-Strings explizit per
Code filtern.
Hänge Deine Datatable an ein Datgridview und schaue
nach, welche Werte in der Tabelle per SQL eingetragen
worden sind.
Deine Funktionsparameter verstehe ich nicht. | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: Mctotti | Datum: 24.08.20 20:03 |
| Hallo Manfred X,
Meine DB besteht aus vier Spalten:
ID=Autowert
t_datum=Datum/Uhrzeit
t_name=Kurzer Text
t_ereignis=Kurzer Text
In der DB habe ich die Spalte t_datum auf Datum/Uhrzeit umgestellt und das Datum wird mit .ToShortDateString gespeichert.
Private Sub btnSpeichern_Click(sender As Object, e As EventArgs) Handles _
btnSpeichern.Click
If String.IsNullOrEmpty(txtTerminName.Text) Then 'wird geprüft ob
' das Textfeld leer oder null aufweist
MsgBox("Name wird benötigt !") 'wenn ja erscheint eine
' Meldung (Messagebox) das ein Name benötigt wird
Return 'Return gibt die
' Anweisung wieder zurück an die Eingabe
End If
If Bestaetigen("Wollen Sie wirklich Speichern ?") Then
If TerminID = 0 Then
Dim sql As String
sql = "INSERT INTO Termine(t_datum,t_name,t_ereignis) VALUES (" & _
"'" _
& dtpDatum.Value.ToShortDateString & "','" _
& txtTerminName.Text & "','" _
& txtTerminBeschreibung.Text & "')"
If SpeichernAendernLoeschen(sql) Then
MsgBox("Gespeichert !")
Close()
Else
MsgBox("Nicht Gespeichert !")
End If
Else
Dim sql As String
sql = "UPDATE Termine SET t_datum='" & _
dtpDatum.Value.ToShortDateString & "',t_name='" & _
txtTerminName.Text & "' ,t_ereignis='" & _
txtTerminBeschreibung.Text & "' WHERE ID=" & Val(TerminID)
If SpeichernAendernLoeschen(sql) Then
MsgBox("Geändert !")
Close()
Else
MsgBox("Nicht Geändert")
End If
End If
End If
End Sub Ich habe mal die Speicher Prozedur hier gepostet, Datum wird korrekt gespeichert (Kurzform )
Ich habe auch ein datagridview erstellt und die Daten aus der DB dort einfliessen lassen. Sieht alles gut aus. | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: Mctotti | Datum: 25.08.20 06:55 |
| Guten Morgen Manfred X,
so ich habe gestern noch ein bischen rum experimentiert, jetzt macht er die monatlichen Wiederholungen nicht mehr, sondern packt alles an den ersten Tag im Monat rein. Aber jetzt macht er alles im richtigen Monat und im richtigen Jahr. Das ist doch schon mal ein Anfang Jetzt nur noch am richtigen Tag dann haben wir es.
ich poste mal wie es im Augenblick ausgelesen wird.
Meiner bescheidenen Meinung nach kann es nur im Abfragen oder an der schleife selbst liegen.
Der Inhalt der Schleife wird korrekt dargestellt.
Private Sub AnzeigenderTermineimTagesfeld(ByVal StartTagflpNummer As Integer)
Dim StartDatum As DateTime = New Date(aktuellesDatum.Year, _
aktuellesDatum.Month, 1)
Dim EndDatum As DateTime = StartDatum.AddMonths(1).AddDays(-1)
Dim sql As String
sql = $"select * from Termine where t_datum between" & _
"'{StartDatum.ToShortDateString}' and '{EndDatum.ToShortDateString}'"
Dim dt As DataTable = QueryAsDataTable(sql)
For Each row As DataRow In dt.Rows
Dim Appday As Date
StartDatum = StartDatum.ToShortDateString
EndDatum = EndDatum.ToShortDateString
If row("t_datum") >= StartDatum And row("t_datum") <= EndDatum Then
Dim link As New LinkLabel
link.Tag = row("ID")
link.Name = $"link{row("ID")}"
link.Text = row("t_name")
AddHandler link.Click, AddressOf TerminDetailsanzeigen
flpTageslabelliste((Appday.Day - 1) + (StartTagflpNummer - _
1)).Controls.Add(link)
End If
Next
End Sub | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: Mctotti | Datum: 25.08.20 10:24 |
| Hallo Manfred X,
So jetzt hat es geklappt, es funktioniert einwandfrei, die Termine werden am richtigen Tag, im richtigen Monat und im richtigen Jahr so angezeigt, wie sie gespeichert sind.
Vielen Danke für deine Mithilfe und deine Anregungen. Ich stand irgendwie auf dem Schlauch.
Vor allem fand ich gut das du mir nicht irgendein code zur Hilfe gepostest hast sondern mir mit Anregungen geholfen hast. Vielen Dank. Zum Abschluss hab ich dir mal den Code gepostet damit man sieht wie es funzt
Private Sub AnzeigenderTermineimTagesfeld(ByVal StartTagflpNummer As Integer)
Dim StartDatum As DateTime = New Date(aktuellesDatum.Year, _
aktuellesDatum.Month, 1)
Dim EndDatum As DateTime = StartDatum.AddMonths(1).AddDays(-1)
Dim sql As String
sql = $"select * from Termine where t_datum between" & _
"'{StartDatum.ToShortDateString}' and '{EndDatum.ToShortDateString}'"
Dim dt As DataTable = QueryAsDataTable(sql)
For Each row As DataRow In dt.Rows
StartDatum = StartDatum.ToShortDateString
EndDatum = EndDatum.ToShortDateString
If row("t_datum") >= StartDatum And row("t_datum") <= EndDatum Then
Dim Appday As DateTime = DateTime.Parse(row("t_datum"))
Dim link As New LinkLabel
link.Tag = row("ID")
link.Name = $"link{row("ID")}"
link.Text = row("t_name")
AddHandler link.Click, AddressOf TerminDetailsanzeigen
flpTageslabelliste((Appday.Day - 1) + (StartTagflpNummer - _
1)).Controls.Add(link)
End If
Next
End Sub | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: effeff | Datum: 25.08.20 12:09 |
| sql = $"select * from Termine where t_datum between" & _
"'{StartDatum.ToShortDateString}' and '{EndDatum.ToShortDateString}'" Bei dieser Abfrage lässt Du nur alle Datensätze auswählen, die zwischen zwei Datumsangaben liegen.
If row("t_datum") >= StartDatum And row("t_datum") <= EndDatum Then Hier fragst Du ab, ob die Daten zwischen zwei Datumsangaben liegen. Das hast Du doch schon oben gemacht. Ist das nicht überflüssig? Die Daten können doch nur im richtigen Bereich liegen.
EALA FREYA FRESENA | |
Re: Schleife nach sql abfrage funktioniert nicht richtg | | | Autor: Mctotti | Datum: 26.08.20 07:52 |
| Hallo,
sql = $"select * from Termine where t_datum between" & _
"'{StartDatum.ToShortDateString}' and '{EndDatum.ToShortDateString}'"
Bei dieser Abfrage lässt Du nur alle Datensätze auswählen, die zwischen zwei Datumsangaben liegen.
Da hast du vollkommen Recht
If row("t_datum") >= StartDatum And row("t_datum") <= EndDatum Then
Hier fragst Du ab, ob die Daten zwischen zwei Datumsangaben liegen. Das hast Du doch schon oben gemacht. Ist das nicht überflüssig? Die Daten können doch nur im richtigen Bereich liegen.
Auch dieses ist vollkommen richtig.
Aber wenn ich die Abfrage weglasse funktioniert es nicht. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|