Access / Vb.net Aggregat Funktion Min

werner_sg

Erfahrenes Mitglied
Hallo
mit
Code:
            Try
                'SQL Zugriff für alle Fahrzeuge welche noch nicht zurückgegeben sind
                Sql = "SELECT BuchungsNr, Fahrzeugnummer, Mietbegin, Mietdauer, Mietende FROM tblreservierung  where KFZ_ABGEGEBEN='nein' ORDER BY Fahrzeugnummer, Mietbegin"
                conn.Open()
                With dbcmd
                    .CommandText = Sql
                    .Connection = conn
                End With

                dbda.SelectCommand = dbcmd
                dbda.Fill(dbdt)
hole ich mir alle Notwendigen Daten aus meiner Access Datenbank

jedoch benötige ich noch das kleinste Datum vom Mietbegin und das größte vom Mietende

SQL:
Min(Mietbegin) As StartDatum, Max(Mietende) As EndDatum

einfach Einbauen in die SQL Abfrage funktioniert so ja leider nicht, also eine zweite SQL Abfrage welche die erste aber nicht behindert bzw. stört

gebraucht wird es in folgendem Block
Code:
                Next

                Dim zeitleisteBeginn As Integer = (((DateTime.Today.Year * 10000) + 1) * 100) + 1        ' Beginn der Zeitleiste, erstmal das Jahr laut Heutetag zum 01.01
                Dim zeitleisteEnde As Integer = (((DateTime.Today.Year * 10000) + 12) * 100) + 31        ' Ende Zeitleiste, erstmal das Jahr laut Heutetag zum 31.12

und am Ende zu Übersicht mal der gesammte Sub Bereich
Code:
    Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
        If String.IsNullOrEmpty(TextBox1.Text) Then

            Dim MietzeitIndex = 1                                                   ' Counter zum durchlaufen der Zeilen

            Dim g As Graphics = e.Graphics                                          ' Variable für die PictureBox.

            Try
                'SQL Zugriff für alle Fahrzeuge welche noch nicht zurückgegeben sind
                Sql = "SELECT BuchungsNr, Fahrzeugnummer, Mietbegin, Mietdauer, Mietende FROM tblreservierung  where KFZ_ABGEGEBEN='nein' ORDER BY Fahrzeugnummer, Mietbegin"
                conn.Open()
                With dbcmd
                    .CommandText = Sql
                    .Connection = conn
                End With

                dbda.SelectCommand = dbcmd
                dbda.Fill(dbdt)


                'Zeilen Trennung Linien
                Dim x As Integer                    'definiert x als Integer Zahl
                For x = 40 To 2000 Step 50          'setzt x auf Anfang 40 und erhöht jeweils um 50 bis 2000 erreicht

                    ' g.DrawLine(New Pen(System.Drawing.Color.Black, 1), PictureBox1.Left, x, PictureBox1.Right, x) ' zeichnet die Linien in die PictureBox

                Next

                Dim zeitleisteBeginn As Integer = (((DateTime.Today.Year * 10000) + 1) * 100) + 1        ' Beginn der Zeitleiste, erstmal das Jahr laut Heutetag zum 01.01
                Dim zeitleisteEnde As Integer = (((DateTime.Today.Year * 10000) + 12) * 100) + 31        ' Ende Zeitleiste, erstmal das Jahr laut Heutetag zum 31.12
                ' hier eventuell dann per SQL das niedrigste und höchste Mietbeginn/Mietende ermittln anstatt hart auf den 01.01 und 31.12 zu gehen

                Dim zeitleisteMaxBereich As Integer = (zeitleisteEnde - zeitleisteBeginn + 1)        ' 100% für die Zeitleiste

                Me.PictureBox1.Width = 60000
                Dim bildBreite As Integer = (PictureBox1.Width)    ' die Breite des Zeichnungsbereiches (unsere 100% zum zeichnen)

                For Each Row As DataRow In dbdt.Rows

                    Dim Mietbegin As DateTime = CType(Row.Item("Mietbegin"), DateTime)                                      ' Mietbegin als DateTime
                    Dim MietbeginNum As Integer = (((Mietbegin.Year * 10000) + Mietbegin.Month) * 100) + Mietbegin.Day      ' Mietbegin als Zahl umgerechnet
                    Dim MietbeginProzent As Decimal = ((MietbeginNum - zeitleisteBeginn) / CDec(zeitleisteMaxBereich))      ' der prozentuale Anteile des Mietbegins in der Zeitleiste

                    Dim Mietende As Date = CType(Row.Item("Mietende"), DateTime)                                            ' Mietende als DateTime
                    Dim MietendeNum As Integer = (((Mietende.Year * 10000) + Mietende.Month) * 100) + Mietende.Day          ' Mietende als Zahl umgerechnet
                    Dim MietendeProzent As Decimal = ((MietendeNum - zeitleisteBeginn) / CDec(zeitleisteMaxBereich))        ' der prozentuale Anteile des Mietendes in der Zeitleiste

                    Dim MietbeginText As String = Mietbegin.Day & "." & Mietbegin.Month
                    Dim MietendeText As String = Mietende.Day & "." & Mietende.Month

                    Dim Fahrzeugnummer = Row.Item("Fahrzeugnummer")                                                         ' Fahrzeugnummer für die Zeitleiste
                    Dim Horizontal As Integer = (Fahrzeugnummer * 50)

                    Dim Buchungsnummer = Row.Item("BuchungsNr")                                                             ' dBuchungsnummer für die Zeitleiste


                    If Date.Compare(Mietende, Today) > 0 Then

                        Dim leftPos1 As Decimal = (MietbeginProzent * bildBreite)
                        Dim leftPos2 As Decimal = (MietendeProzent * bildBreite)

                        g.DrawLine(New Pen(System.Drawing.Color.LightSkyBlue, 30), leftPos1, Horizontal, leftPos2, Horizontal)
                        g.DrawString(MietbeginText + " - ", fnt2, Brushes.Black, New Point(leftPos1, (Horizontal - 30)))
                        g.DrawString(MietendeText + " |", fnt2, Brushes.Black, New Point((leftPos2 - 28), (Horizontal - 30)))
                        g.DrawString("FzgNr:  " + Fahrzeugnummer, fnt2, Brushes.Black, New Point(leftPos1, (Horizontal - 13)))
                        g.DrawString(Buchungsnummer, fnt2, Brushes.Black, New Point(leftPos1, (Horizontal)))

                    End If
                    MietzeitIndex += 1          'Zähler für die reihen



                Next
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                conn.Close()
            End Try
        End If
    End Sub
 

Yaslaw

n/a
Moderator
"jedoch benötige ich noch das kleinste Datum vom Mietbegin und das größte vom Mietende"
Über was? Der Selekt ist ja pro Buchung. Brauchst du MAX() pro Fahrzeug?
 

werner_sg

Erfahrenes Mitglied
"jedoch benötige ich noch das kleinste Datum vom Mietbegin und das größte vom Mietende"
Über was? Der Selekt ist ja pro Buchung. Brauchst du MAX() pro Fahrzeug?
Du stellst immer so gemeine Fragen ;) aber Recht hast Du ja
ich brauche das MIN() und MAX() Datum von allen Fahrzeugen welche noch nicht zurückgegeben sind
Dabei das kleinste Datum aus der Spalte Mietbegin und das höchste Datum aus der Spalte Mietende.

Der Zweck ist die Zeitleiste welche derzeit noch auf das aktuell Jahr festgelegt ist auf das kleinste und größte Datum festzulegen, das kleinste Datum findet sich in der Spalte Mietbegin und das größte in der Spalte Mietende-

Ich benötige aber gleichhfalls alle Selectierten Spalten aus der bestehenden Abfrage

Und da Du dann ja schon mal am schreiben bist darfst Du mir gerne erklären wieso ich Select pro Buchung habe, das Select geht ja über mehrere Spalten, oder betrifft die Aussage nur den Fall bei einer Aggregat Funktion.
Hab leider über Google nicht viel Aussagekräftiges mit eingehender Erklärung gefunden, Hinweise wie es Aufgebaut sein muss das Group by und die Alternative zu Where aber immer nur auf eine Spalte bezogen, das war es dann mit Infos. :unsure:
 
Zuletzt bearbeitet:

Yaslaw

n/a
Moderator
Ich gehe mal davon aus, dass BuchungsNr die ID der Tabelle tblreservierung ist. ALso hast du den Select pro Buchung. Also pro Eintrag in tblreservierung.

SQL:
SELECT 
    r.BuchungsNr, 
    r.Fahrzeugnummer, 
    r.Mietbegin, 
    r.Mietdauer, 
    r.Mietende,
    (
        select min(rmin.Mietbegin) 
        from tblreservierung rmin 
        where rmin.KFZ_ABGEGEBEN='nein' 
    ) AS min_mietbegin
FROM 
    tblreservierung r
where r.KFZ_ABGEGEBEN='nein' 
ORDER BY r.Fahrzeugnummer, r.Mietbegin
oder
SQL:
select 
    r.BuchungsNr, 
    r.Fahrzeugnummer, 
    r.Mietbegin, 
    r.Mietdauer, 
    r.Mietende,
    ragg.min_begin,
    ragg.max_ende
from 
    tblreservierung r,
    (
        select 
            min(Mietbegin) as min_begin,
            max(Mietende) as max_ende
        from tblreservierung
        where KFZ_ABGEGEBEN='nein' 
    ) ragg
where r.KFZ_ABGEGEBEN='nein' 
ORDER BY r.Fahrzeugnummer, r.Mietbegin
 

werner_sg

Erfahrenes Mitglied
Ich gehe mal davon aus, dass BuchungsNr die ID der Tabelle tblreservierung ist. ALso hast du den Select pro Buchung. Also pro Eintrag in tblreservierung.
Es gibt zwar eine extra ID aber die Buchungsnummer ist Verwendbar da einzigartig

könnte jetzt einfach deinen SQL Code einbauen, verstehe ihn aber nicht ganz, wofür steht das r. denn?
Würde mir sehr helfen sollte ich mal nochmal sowas brauchen ;)
 

Yaslaw

n/a
Moderator
Im FROM-Teil habe icvh hinter dem Tabellenname das r gesetzt. r ist somit ein Alias für diese Tabelle und kann im restlichen SQL anstelle des Tabellennamens verwendet werden. Ist interessant, wenn man mehr als eine Tabelle im SQL hat. Im 2ten Beispiel habe ich ja ein Subselect als 2te QUelle im FROM. Dem gebe ich den Alias ragg
Es gibt auch die Schreibweise mit AS
SQL:
FROM my_table t
-- ist identisch mit 
FROM my_table AS t