Zeitleiste Grafisch darstellen Vb.net

werner_sg

Erfahrenes Mitglied
Du musst dafür die Y-Position beim DrawLine entsprechend anpassen (deine Variable horizontal)
(hatte ich in meinen Beispielen jetzt nicht gemacht)

z.B. wie du es glaube schon an einer stelle hattest
in der for each Schleife
horizontal = horizontal + 10

ev. alternativ je fahrzeug könntest du probieren wenn du die fahrzeugnummer zur Berechnung der Y-Position nimmst
horizontal = fahrzeugNummer * 10
Code:
Dim horizontal = Row.Item("Fahrzeugnummer")                                                  
Dim FzgNr As Integer = (horizontal * 30)
brav im for each Block und nicht wieder meilenweit vorher und es läuft ideal

1627887638954.png

jetzt noch ein wenig Feinschliff und Fertig

Muchas Gracias
 

werner_sg

Erfahrenes Mitglied
hier eventuell dann per SQL das niedrigste und höchste Mietbeginn/Mietende ermittln anstatt hart auf den 01.01 und 31.12 zu gehen

kennst Du oder gibt es eine Alternative zur SQL Abfrage: Min(Mietbegin) AS BoxAnfang, ?
hiermit erhalte ich die Meldung das BuchungsNr nicht als Teil der Agregatfunktion eingeschlossen ist. scheint also von Access nicht akzeptiert zu werden obwohl es fast immer als Lösung angegeben wird.
 

Spyke

Premium-User
dir fehlt ein GROUP BY in der SQL
Du gibts in deiner SQL noch weitere Felder/Spalten mit aus die, ich sag mal, in keiner Aggregatfunktion laufen.
Diese Felder musst du für die SQL mittels GROUP BY gruppieren.
In deinem Fall wäre es ev. so
SQL:
SELECT buchungsNr, MIN(mietbeginn) AS BoxAnfang, ...
FROM ...
WHERE ...
GROUP BY buchungsNr

Für nähere Angaben brauch man aber die SQL.
(Bei solchen Fragen am besten immer gleich die SQL mit angeben)

Die buchugnsnummer sollte aber in diesem Fall nicht mit ausgegeben werden.
Wir wollen ja die Datümer über alle Buchungen, und nicht je Buchung.

Für nähere SQL Fragen aber ev. am besten einen Thread hier auf tutorials im SQL bereich (relationale Datenbanksysteme) posten.
Da gibts dann auch noch weitere Leute die sich mit auskennen.
 
Zuletzt bearbeitet:

werner_sg

Erfahrenes Mitglied
dir fehlt ein GROUP BY in der SQL
Du gibts in deiner SQL noch weitere Felder/Spalten mit aus die, ich sag mal, in keiner Aggregatfunktion laufen.
Diese Felder musst du für die SQL mittels GROUP BY gruppieren.
In deinem Fall wäre es ev. so
SQL:
SELECT buchungsNr, MIN(mietbeginn) AS BoxAnfang, ...
FROM ...
WHERE ...
GROUP BY buchungsNr
OK werde mich da mal durchwühlen, mit Group by hatte ich mich noch nicht beschäftigt
Für nähere Angaben brauch man aber die SQL.
(Bei solchen Fragen am besten immer gleich die SQL mit angeben)
Bin davon ausgegangen das es nicht an der SQl liegt sondern das es von Access nicht unterstützt wird
Die buchugnsnummer sollte aber in diesem Fall nicht mit ausgegeben werden.
Wir wollen ja die Datümer über alle Buchungen, und nicht je Buchung.
Buchungsnummer brauche ich in der Abfrage da ich Sie in der Zeitleiste verarbeite.
Über demr Linie habe ich zum Startpunkt das Anfangsdatum stehen und am Endpunkt das Enddatum, auf der Zeitleiste welche ich Hellblau gefärbt habe und höher gemacht habe, findet sich jetzt die Fahrzeugnummer und darunter die Buchungsnummer.
Somit sind alle wichtigen Daten zur Übersicht gut ersichtlich.
Für nähere SQL Fragen aber ev. am besten einen Thread hier auf tutorials im SQL bereich (relationale Datenbanksysteme) posten.
Da gibts dann auch noch weitere Leute die sich mit auskennen.
Ja Yaslaw ist zum Beispiel sehr fit in SQL, schau erst mal so durch und im Notfall mache ich das noch

Danke für den Hinweis auf die Group Funktion
 

Spyke

Premium-User
Für die Ermittlung von MIN, MAX einfach eine neue/extra SQL für Aufrufen.
Das alles in eine zu packen, das es irgendwie funktioniert, bringt nixs.

Und bei größeren Datensätzen könnte sowas theoretisch auch die performance der SQL Abfrage runterziehen.

Außerdem wäre es so leichter wartbar, wenn du dies trennst.

Kurz gesagt, mach eine extra SQL, welche sich nur um die Ermittlung von MIN und MAX Datum kümmert (diese SQL zu beginn aufrufen um entsprechend damit zeitleisteBeginn und zeitleisteEnde setzen zu können)
 

werner_sg

Erfahrenes Mitglied
Für die Ermittlung von MIN, MAX einfach eine neue/extra SQL für Aufrufen.
Das alles in eine zu packen, das es irgendwie funktioniert, bringt nixs.

Und bei größeren Datensätzen könnte sowas theoretisch auch die performance der SQL Abfrage runterziehen.

Außerdem wäre es so leichter wartbar, wenn du dies trennst.

Kurz gesagt, mach eine extra SQL, welche sich nur um die Ermittlung von MIN und MAX Datum kümmert (diese SQL zu beginn aufrufen um entsprechend damit zeitleisteBeginn und zeitleisteEnde setzen zu können)
bin wieder Da :giggle:

Yaslaw hat mir bei der SQL sehr geholfen und mir das dann mit dem Alias in der SQL erklärt kannte ich noch nicht, so wurde es dann doch eine Abfrage

SQL:
                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

 "

Mit der Konvertierung habe ich ja soweit verstanden

Code:
                    Dim MinDatum As DateTime = CType(Row.Item("min_begin"), DateTime)                                      ' ZeitleisteStart als DateTime
                    Dim ZeitleisteStart As Integer = (((MinDatum.Year * 100) + MinDatum.Month) * 100) + MinDatum.Day       ' ZeitleisteStart als Zahl umgerechnet

                    Dim MaxDatum As DateTime = CType(Row.Item("min_begin"), DateTime)                                      ' ZeitleisteStop als DateTime
                    Dim ZeitleisteStop As Integer = (((MaxDatum.Year * 100) + MaxDatum.Month) * 100) + MaxDatum.Day        ' ZeitleisteStop als Zahl umgerechnet

zeigt auch brav das Datum wie folgt an: 20210731, am Anfang war es 2021000731, lag an dem Year * 10000 habe das überall auf 100 reduziert (Ergebnis ist optisch das gleiche wie vorher)

Funktioniert aber nur im eachRow Block, verständlich holt sich die Daten ja per Row.Item, kann dadurch aber nicht oberhalb des Blocks mit
Code:
  Dim zeitleisteMaxBereich As Integer = (zeitleisteEnde - zeitleisteBeginn + 1)        ' 100% für die Zeitleiste
darauf zugreifen

wie kann ich das lösen?

und mal ne andere Frage, kannst Du mir ein gutes Buch zu dem allem empfehlen.
Da ich mitlerweile in Spanien bin kann ich schlecht in die nächste Buchhandlung und schauen was es da gibt, auf deutsch haben die nichts da, muss also online bestellen und kann da kaum vorher reinschauen
 

Spyke

Premium-User
Sry, was es da aktuell ev. für Bücher gibt die empfehlenswert wären weiß ich nicht.

zum zeitleisten problem
pack dann einfach zeitleisteBeginn, zeitleisteEnde und zeitleisteMaxBereich runter in das for each.
Im for each dann so das es mit als erstes verarbeitet wird.

Und kleiner Tipp noch es könnte ja sein das durch die SQL dein MinDatum zum Beispiel der 07.10.2021 ist.
Einfach weil da die erste gültige Buchung ist.
Bei sowas wäre zu überlegen ob du nicht prüfst:
Visual Basic:
                    Dim MinDatum As DateTime = CType(Row.Item("min_begin"), DateTime)                                      ' ZeitleisteStart als DateTime
                    
                    Dim checkMinDatum As DateTime = New DateTime(MinDatum.Year, 1, 1)                                      ' Hilfsvariable für den 01.01 des Jahres
                    If MinDatum > checkMinDatum Then MinDatum = checkMinDatum                                              ' Wenn MinDatum höher als der 01.01 dann MinDatum auf den 01.01 setzen, damit anhand 01.01 die Zeitleiste aufgebaut wird
    
                    Dim ZeitleisteStart As Integer = (((MinDatum.Year * 100) + MinDatum.Month) * 100) + MinDatum.Day       ' ZeitleisteStart als Zahl umgerechnet
So sollte deine Zeitleiste in den meisten Fällen die Abstände immer richtig zeichen (ansonsten wird ev. alles zu sehr zusammengestaucht gezeichnet)

so änhlich dann ev. für MaxDatum prüfen, nur das da zum 31.12 hin geprüft wird und auf den 31.12 gesetzt wird wenn MaxDatum kleiner ist
 

werner_sg

Erfahrenes Mitglied
Sry, was es da aktuell ev. für Bücher gibt die empfehlenswert wären weiß ich nicht.

zum zeitleisten problem
pack dann einfach zeitleisteBeginn, zeitleisteEnde und zeitleisteMaxBereich runter in das for each.
Im for each dann so das es mit als erstes verarbeitet wird.

Und kleiner Tipp noch es könnte ja sein das durch die SQL dein MinDatum zum Beispiel der 07.10.2021 ist.
Einfach weil da die erste gültige Buchung ist.
Bei sowas wäre zu überlegen ob du nicht prüfst:
Visual Basic:
                    Dim MinDatum As DateTime = CType(Row.Item("min_begin"), DateTime)                                      ' ZeitleisteStart als DateTime
                   
                    Dim checkMinDatum As DateTime = New DateTime(MinDatum.Year, 1, 1)                                      ' Hilfsvariable für den 01.01 des Jahres
                    If MinDatum > checkMinDatum Then MinDatum = checkMinDatum                                              ' Wenn MinDatum höher als der 01.01 dann MinDatum auf den 01.01 setzen, damit anhand 01.01 die Zeitleiste aufgebaut wird
   
                    Dim ZeitleisteStart As Integer = (((MinDatum.Year * 100) + MinDatum.Month) * 100) + MinDatum.Day       ' ZeitleisteStart als Zahl umgerechnet
So sollte deine Zeitleiste in den meisten Fällen die Abstände immer richtig zeichen (ansonsten wird ev. alles zu sehr zusammengestaucht gezeichnet)

so änhlich dann ev. für MaxDatum prüfen, nur das da zum 31.12 hin geprüft wird und auf den 31.12 gesetzt wird wenn MaxDatum kleiner ist
??????

keine Ahnung warum aber sobald ich den Inhalt aus dem MinDatum nutze ist die Anzeige gleich Null, soll aber jetzt nicht weiter stören lass es erst mal pro Jahr eventuell setze ich noch ne if Abfrage rein um das Jahr zu wechseln.
Also: ((Mietbegin.Year+1) * 100)