Abfrageergebnisse in Datei/Datenbank schreiben/lesen

  • Hallo Freunde,


    ich habe mal wieder ein erneutes Anliegen und brauche eure Hilfe:


    - ich habe ein kleines Programm geschrieben mit dem ich bestimmte Informationen von Rechnern abfragen kann

    --> Prozessor, RAM, letzter angemeldeter Benutzer, OS, usw.

    - das Programm ist so geschrieben, dass man einen Rechnernamen (in unserem Unternehmen Kürzel+Nummer) eingeben muss und dann die Abfragen direkt erfolgen und in einem GUI ausgegeben werden.

    - da es durchaus vorkommt, dass ich den ein oder anderen Rechner mehrfach abfrage, möchte ich ein weiteres Feature einbauen:


    - ich möchte eine Art Datenbank (Datenbank, Ini, Datei, irgendwas) hinter das ganze stellen

    - diese soll dann mit den ganzen Infos gefüllt werden

    - auf der anderen Seite, möchte ich auch lesend auf die Datenbank zugreifen können um Rechnerinformationen die ich bereits habe, zu speichern, zu updaten etc.

    - dabei möchte ich nicht die einzelnen Informationen updaten, sondern immer nur in der Gesamtheit der abfragenden Funktionen

    - Ziel soll es sein, dass ich Rechner die ich bereits abgefragt habe und für die es Einträge gibt, mit den jeweiligen Infos angezeigt bekomme und ggf. updaten kann bzw. einfach die Funktion zum Abfragen erneut ausführe


    was für Möglichkeiten, schlank, habe ich denn hier?


    Ich bitte um kreative Vorschläge und Ideen oder Hilfe dazu

  • was für Möglichkeiten, schlank, habe ich denn hier?

    Grundsätzlich könnte man z.B. eine .ini-Datei verwenden, mit :

    [Sektionsname] = Rechnername (d.h. Kürzel+Nummer)

    -> die jeweiligen Informationen als Key=Value Paare anlegen


    Ich würde aber eine Datenbanklösung mittels SQLITE vorziehen !.

    Jeder Datensatz stellt einen Rechner dar, mit Rechnername als Hauptindex, und den Informationen als Datensatzfelder.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Danke für deine Hinweise.


    Ich werde mir tatsächlich erstmal die .Ini-Variante anschauen und versuchen.


    Das Thema Datenbanklösung muss ich mir erstmal zu Gemüte ziehen.

    Wenn du hier noch zielführende Hilfe hast, immer her damit ;)

  • Da Du jetzt schon davon ausgehen kannst, dass Du Dein Skript von INI-Dateien auf eine Datenbank umstellen wirst, kannst Du einige Vorbereitungen treffen:

    • Mit einer Datenbank musst Du Dich zu Beginn des Skriptes verbinden und am Ende die Verbindung wieder "abbauen".
      Lagere diese Aufgabe in eigene Funktionen aus (z.B. _DS_Connect und _DS_Release. "DS" steht dabei für "Datenspeicher).
      Solange Du INI-Dateien verwendest, sind diese Funktionen leer, da für INI-Dateien nicht notwendig. Beim Umstieg auf eine Datenbank befüllst Du diese Funktionen einfach.
    • Lege durch eine AutoIt-Funktion je Verarbeitung in Deinem Skript an. Also für Datensatz lesen eine Funktion, für Datensatz schreiben eine weitere (z.B. _DS_Read, _DS_Write, _DS_Delete ...)
    • Für Tests etc. schlage ich vor, dass Du mit einer globalen Variable definierst, welchen Datenspeicher Du verwenden willst. Also z.B. 1 = INI-Datei, 2 =Datenbank.
      Dann kannst Du in jeder Deiner _DS-Funktionen beide Zugriffsvarianten abdecken:
    Code
    If $DS_Flag = 1 Then
        ; INI-Funktionalität
    Else
        ; Datenbank Funktionalität
    EndIf
  • Hallo!


    Meine Meinung nach vergiss das mit INI.


    Wenn du es mit sqlite probieren willst hier mal der Link damit du starten kannst: https://www.autoitscript.com/autoit3/pkgmgr/sqlite/

    Link stammt von dieser Seite https://www.autoitscript.com/a…tions/_SQLite_Startup.htm

    Von dort ladest du dir die sqlite3.dll und sqlite3_x64.dll herunter und gib sie in den Script Ordner.


    Oder:

    Auszug:

    If #include <SQLite.dll.au3> is included the SQLite version is checked.
    The SQLite files can be downloaded from https://www.autoitscript.com/autoit3/pkgmgr/sqlite/SQLite3_version.zip that can be stored in @ScriptDir, @SystemDir, @WindowsDir, or @WorkingDir.


    Zum Start flach und mit "schnellem" Erfolg alle Daten in eine Tabelle und "alles" wird rein geschrieben ohne Überprüfung:

    Nachteile in dem Script:

    _SQLite_Startup() und _SQLite_Shutdown() werden bei jedem Funktionsaufruf gestartet und beendet.

    Bei großen Datenmengen sind einzelne Insert sehr langsam

    Besser:

    Code
        _SQLite_Startup()
        Do
            Sleep(Random(20, 250, 1))
            _SQLite_Open(@ScriptDir & "\" & $sDatabaseFileName & ".db3")
        Until Not @error
        _SQLite_Exec(-1, "Begin Transaction;")
        _SQLite_Exec(-1, $result) ; INSERT Data
        _SQLite_Exec(-1, "Commit Transaction;")
        _SQLite_Close()
        _SQLite_Shutdown()

    $result ist dann so aufgebaut:

    INSERT INTO "main"."TEST_DB" ("Prozessor", "RAM", "letzter angemeldeter Benutzer", "OS") VALUES ('Intel Pentium 75', '8192', 'MAX Mustermann', 'Linux wtf');

    INSERT INTO "main"."TEST_DB" ("Prozessor", "RAM", "letzter angemeldeter Benutzer", "OS") VALUES ('Intel Pentium 90', '8192', 'MAX Musterfrau', 'Linux Mint');

    INSERT INTO "main"."TEST_DB" ("Prozessor", "RAM", "letzter angemeldeter Benutzer", "OS") VALUES ('Intel Pentium 100', '8192', 'MAX Mustermann1', 'Linux wtf');

    INSERT INTO "main"."TEST_DB" ("Prozessor", "RAM", "letzter angemeldeter Benutzer", "OS") VALUES ('Intel Pentium 200', '8192', 'MAX Musterfrau2', 'Linux Mint');

    .....


    Das geht rasend schnell bei Sqlite und bei anderen DBs auch.


    Auf ein Problem stösst du wahrscheinlich auch, Anführungszeichen "zerstören" dir deine inserts.

    Also musst du eine Routine schreiben die diese doppelt kommentiert.

    Beispiel: Intel "Pentium" 300 wird dann Intel ""Pentium"" 300



    Sehr Hilfreich zum Nachsehen und SQl ausprobieren ein DB Browser: DB Browser for SQLite (sqlitebrowser.org)

  • Wow 8|
    vielen Dank für diese ausführliche Hilfestellung.

    Dann werde ich das mit der Ini wirklich direkt skippen und mich dort mal einlesen.


    Ich werde den Thread mal lieber noch nicht schließen um ggf. weitere Fragen zu posten bzw. euch am Ende das Ergebnis zu präsentieren.
    Möglicherweise kann der ein oder andere ja davon profitieren wie man Ergebnisse aus einer Abfrage dann entsprechend in einer DB ablegt.


    Ich melde mich :klatschen::rock:

  • Concara

    ich habe nun folgende Schritte unternommen:


    1. ich habe von "https://www.autoitscript.com/autoit3/pkgmgr/sqlite/" die aktuellste *.zip-Datei geladen


    diese habe ich dann direkt in den SkriptOrdner gepackt.


    2. ich habe die Includes in mein Skript integriert.


    3. ich teste danach den "falschen und schnellen" Weg zuerst.


    Hier erhalte ich nun aber direkt einen Error:


    Eigentlich sollte die DB doch automatisch mit der Funktion initial angelegt werden oder nicht?

    Code
    ;Datenbank File erstellen und Tabelle anlegen
    If Not FileExists($sDatabaseFileName & ".db3") Then
    _Create_Databasefile($sDatabaseFileName, ' "Prozessor" TEXT, "RAM" INTEGER, "letzter angemeldeter Benutzer" TEXT, "OS" TEXT')
    ConsoleWrite("Datenbank existiert")
    EndIF
  • Die Files auf https://www.sqlite.org/download.html sind aktueller.

    Danke für den Hinweis.

    bin jetzt auch erstmal ein Stück weiter gekommen.

    Die Tabelle mit den Köpfen ist angelegt.


    Als nächstes habe ich meinen Rechner einige Male abgefragt und da fällt schnell auf, dass es noch keinen Index gib.

    Den kann ich theoretisch mit dem DB Browser for SQLLite setzen.

    Würde den Index dann auf den Rechnernamen setzen da dieser (in meinem Fall) eindeutig ist.


    Wie aber realisiere ich die folgenden Punkte:

    1. ich möchte bevor ich den Rechner erneut abfrage, prüfen, ob es in der SQL-Datenbank bereits einen Eintrag gibt.

    2. wenn ein Eintrag vorhanden ist (Rechnername würde ja dann zur Identifizierung ausreichen) möchte ich das SQL_Update verwenden.

    --> Wie stelle ich das dann an?

  • Hallo,


    wenn Du nur einen Index für eine Spalte brauchst, kannst Du für diese Spalte beim Anlegen der Datenbanktabelle die 3.5. The PRIMARY KEY Klausel verwenden.


    Wenn Du prüfen willst, ob ein bestimmter Rechnername bereits in der Tabelle enthalten ist, sollte Folgendes funktioneren:


    Code
    Func RechnerCheck($Name)
       Local $hQuery
       Local $sSQL = "SELECT COUNT(*) FROM Rechner WHERE Name = '" & $Name & "';"
       _SQLite_Query(-1, $sSQL, $hQuery)
       Local $aRow
       _SQLite_FetchData($hQuery, $aRow)
       Return $aRow[0]
    EndFunc 

    Die Funktion gibt entweder 1 (vorhanden) oder 0 (nicht vorhanden) zurück.


    Du brauchst dafür natürlich eine geöffnete Datenbankdatei mit passenden Tabellen- und Spaltennamen. ;)

  • Hallo!


    Ich kopiere die sqlite3.dll und sqlite3_x64.dll immer in den jeweilige Scriptordner , man weiß ja nie ob sich mal etwas ändert und dann hat man zumindest eine funktionsfähige Version.


    Index und Primary key sind zwei verschiedene Sachen, erfüllen aber einfach angewendet die selbe Funktion, nämlich, dass man nur einen Datensatz mit dem gleichen Namen einfügen kann.

    Die index Erstellung habe ich dir ja schon im Scriptbeispiel mit hinzugefügt ( auskommentiert ), wenn auch mit "falschen" Tabellennamen("PCNAME", "Benutzername").


    Beispiel Indexerstellung "nur" auf letzter angemeldeter Benutzer:

    AutoIt
    Func _Create_Databasefile($sDatabaseFileName, $sCollums, $sTablename = $sDatabaseFileName)
        _SQLite_Startup()
        _SQLite_Open(@ScriptDir & "\" & $sDatabaseFileName & ".db3")
        If Not _SQLite_Exec(-1, 'CREATE TABLE if not exists "' & $sTablename & '" (' & $sCollums & ');') = $SQLITE_OK Then _
                MsgBox(16, "SQLite Error", _SQLite_ErrMsg()) ; CREATE a Table
         If Not _SQLite_Exec(-1, 'create unique index if not exists Unique1 on ' & $sDatabaseFileName & ' ("letzter angemeldeter Benutzer");') = $SQLITE_OK Then _
                 MsgBox(16, "SQLite Error", _SQLite_ErrMsg(), 1); CREATE a INDEX
        _SQLite_Close()
        _SQLite_Shutdown()
    EndFunc   ;==>_Create_Databasefile

    Beispiel Primary Key auf letzter angemeldeter Benutzer:

    AutoIt
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    
    Local $sDatabaseFileName = "TEST_DB"
    
    ;Datenbank File erstellen und Tabelle anlegen
    If Not FileExists($sDatabaseFileName & ".db3") Then
        _Create_Databasefile($sDatabaseFileName, ' "Prozessor" TEXT, "RAM" INTEGER, "letzter angemeldeter Benutzer" TEXT PRIMARY KEY, "OS" TEXT')
    EndIF

    Beispiel mit einer Abfrage vor dem schreiben in die Datenbank (Datenbank mit index und primary key)

  • Hallo Concara,

    Index und Primary key sind zwei verschiedene Sachen, erfüllen aber einfach angewendet die selbe Funktion, nämlich, dass man nur einen Datensatz mit dem gleichen Namen einfügen kann.

    das ist meiner Meinung nach nur bedingt richtig:

    3.6. UNIQUE constraints

    A UNIQUE constraint is similar to a PRIMARY KEY constraint, except that a single table may have any number of UNIQUE constraints. For each UNIQUE constraint on the table, each row must contain a unique combination of values in the columns identified by the UNIQUE constraint. For the purposes of UNIQUE constraints, NULL values are considered distinct from all other values, including other NULLs. As with PRIMARY KEYs, a UNIQUE table-constraint clause must contain only column names — the use of expressions in an indexed-column of a UNIQUE table-constraint is not supported.

    In most cases, UNIQUE and PRIMARY KEY constraints are implemented by creating a unique index in the database. (The exceptions are INTEGER PRIMARY KEY and PRIMARY KEYs on WITHOUT ROWID tables.) Hence, the following schemas are logically equivalent:

    1. CREATE TABLE t1(a, b UNIQUE);
    2. CREATE TABLE t1(a, b PRIMARY KEY);
    3. CREATE TABLE t1(a, b);
      CREATE UNIQUE INDEX t1b ON t1(b);

    Ein Index braucht dafür den Zusatz UNIQUE.


    Nachteile in dem Script:

    _SQLite_Startup() und _SQLite_Shutdown() werden bei jedem Funktionsaufruf gestartet und beendet.

    Ich würde es deshalb auch nicht so machen. Derart gestaltete Funktionen mögen ja 'anfängerfreundlich' erscheinen. Das ist aber teuer erkauft, wenn man während der Skriptlaufzeit mehrfach auf die Datenbank zugreifen will.

  • WoW, wiedermal vielen Dank für die großartige Hilfe bei dem Thema!!!


    Folgender Fortschritt:


    Die Tabelle und die Datenbank ist angelegt.


    Code
    _Create_Databasefile($sDatabaseFileName, ' "Rechnername" TEXT PRIMARY KEY, "letzter Neustart" DATETIME, "Uptime" DATETIME, "IP-Adresse" TEXT, "Arbeitsspeicher" TEXT, "Kerne" TEXT, "Prozessor" TEXT, "Betriebssystem" TEXT, "Serial" TEXT, "Rechnermodell" TEXT, "Hersteller" TEXT, "Benutzer" TEXT, "Struktur" TEXT, "Mac-Adresse" TEXT, "Disk-Type" TEXT')

    der erste Eintrag wird sauber erzeugt.


    Die Probleme mit den Hochkommata konnte ich auch erstmal soweit lösen.


    Aber nun bekomme ich beim Update folgendes Problem:
    Ich lasse wieder Daten sammeln und möchte sie per Update in die Datenbank schreiben.

    Vorher prüfe ich auf den angelegten PRIMARY KEY Rechnername.

    Dann werden die Daten zusammengeschrieben (hier Beispielhaft)

    Code
    $InsertDaten = "WDEST1987" & @TAB & $sUpTime & @TAB & $sLastBootupTime & @TAB & "127.0.0.0" & @TAB & "24" & @TAB & "28" & @TAB & "98" & @TAB & "Win 10" & @TAB & "9373763636" & @TAB & "HP Z2 Mini G3 Workstation" & @TAB & "HP" & @TAB & "domaene\testuser" & @TAB &  "64" & @TAB & "1111111" & @TAB & $sDisktype

    Und erhalte dann folgenden Fehler:

    Code
    !   SQLite.au3 Error
    --> Function: _SQLite_Exec
    --> Query:    UPDATE Rechnerinformationen SET "WDEST1987","7 days, 7 hours, 38 minutes, 43 seconds","2022/01/17 07:15:55","127.0.0.0","24","28","98","Win 10","9373763636","HP Z2 Mini G3 Workstation","HP","domaene\testuser","64","1111111","NVMe Samsung SSD 960SSD";
    --> Error:    near ",": syntax error

    ich finde einfach nicht was da falsch läuft.

  • https://www.sqlite.org/lang_update.html =>

    SQL
    UPDATE Rechnerinformationen SET IP-Adresse="127.0.0.0", "Uptime"="2022/01/17 07:15:55" WHERE Rechnername="WDEST1987"

    Ich würde dir auch empfehlen, keine Leerzeichen/Sonderzeichen in Spaltennamen zu verwenden ("letzter Neustart"/"IP-Adresse"...) Das könnte später Probleme machen.
    Dann kann man Spaltennamen ohne "" verwenden und besser von wirklichen Daten unterscheiden und - wird auch als Minus operator verwendet => SELECT IP-Adresse FROM XX könnte also auch als subtrahiere Spalte IP von Adresse und geb das zurück heißen.

    Allgemein ist es Standard mit CamelCase oder _ zu schreiben, also: ip_adresse oder ipAdresse

  • https://www.sqlite.org/lang_update.html =>

    SQL
    UPDATE Rechnerinformationen SET IP-Adresse="127.0.0.0", "Uptime"="2022/01/17 07:15:55" WHERE Rechnername="WDEST1987"

    Ich würde dir auch empfehlen, keine Leerzeichen/Sonderzeichen in Spaltennamen zu verwenden ("letzter Neustart"/"IP-Adresse"...) Das könnte später Probleme machen.
    Dann kann man Spaltennamen ohne "" verwenden und besser von wirklichen Daten unterscheiden und - wird auch als Minus operator verwendet => SELECT IP-Adresse FROM XX könnte also auch als subtrahiere Spalte IP von Adresse und geb das zurück heißen.

    Allgemein ist es Standard mit CamelCase oder _ zu schreiben, also: ip_adresse oder ipAdresse

    Super Hinweis, danke dir.


    Hab meinen Fehler auch bereits gefunden.


    Ich bastle jetzt weiter und dann melde ich mich hoffentlich mit einem Ergebnis oder erneut mit Fragen. ;)

  • Hallo


    @Velted

    Du hast sicher mit multiplizieren angefangen zu Rechnen und nicht mit addieren!?


    Warum habe ich bloß hingeschrieben:

    Bei großen Datenmengen sind einzelne Insert sehr langsam

    Ich kenne die Datenmengen die Lashandan verarbeiten will nicht.

    Zum Anfangen und für ein paar inserts und updates sind die Funktionen ausreichend.


    Der Kommentar von Kanashius ist sinnvoll.

    Hier kann man dann auch gleich erwähnen, dass man das Datum besser mit - einfügt (2022-01-17 07:15:55) damit man die Sqlite date time Funktionen verwenden kann.

    SQLite Datum &amp; Zeit

  • Concara, ich kann gar nicht rechnen, wozu auch, ich war ja Programmierer. ;)


    Es ist richtig, Lashandan entscheidet, ob er SQLite einsetzen will oder nicht. Wenn er sich aber dafür entscheidet, muss er sich auch mit der SQL-Syntax beschäftigen und sollte von Beginn an versuchen, sein Skript 'optimal' zu gestalten, selbst wenn es wegen geringer Datenmengen (noch) nicht zwingend notwendig ist. Es bringt zumindest Erfahrungen für mögliche künftige Anwendungen.

  • Moin in die Runde.


    Ich bin ein ganzes Stück weiter gekommen in den letzten Tagen und schreibe erfolgreich Daten in die Datenbank.
    Derzeit nutze ich noch den "bad-way" - ich führe das alles derzeit nur lokal aus, sowohl das Programm als auch die Datenbank.

    Das entschuldigt nicht, dass man sloppy programmiert um schnell zum Erfolg zu kommen - hier muss aber jeder für sich entscheiden.

    Fakt ist - eure Unterstützung und Hilfe ist großartig und jeder sollte sich aneignen so sauber wie nur möglich zu programmieren, unnötige Schreibzugriffe usw. gehören vermieden.


    Seit gestern schlage ich mich mit dem Problem rum, Daten aus der SQL-Tabelle zu lesen und sie wiederum in einer Dropdownliste darzustellen.


    Das auslesen funktioniert und ich erhalte die Computer zurück, die sich bereits in der DB befinden.


    Allerdings bekomme ich es einfach nicht gelöst, den Inhalt in der Dropdownliste anzuzeigen.


    Ggf. ist die Wahl der Dropdownliste auch noch suboptimal.

    Vielleicht wäre eine Liste (scrollbar) die bessere Wahl.

    Ich möchte mit der Liste (ob nun dropdown oder andere Art) später dann, ein Element aus der Liste wählen und an die GUI dann alle weiteren Daten aus der DB lesen.

    Initial brauche ich aber vorerst nur die Computer in der Liste.


    Ich habe in dem Screenshot mal das GUI gepostet.


    Vor dem ganzen DB-Gewusel habe ich in das Eingabefeld den Rechnernamen eingetragen, nachdem ich dann den Button "Abfrage" betätige laufen verschiedene Funktionen und geben mir die gewünschten Werte zurück.
    Weiterhin wird das ganze dann in der DB gespeichert.

    Vorher findet aber eine Prüfung statt, ob der Rechnername und die Werte bereits vorhanden sind.
    An der Prüfung feile ich ebenfalls noch, dass bereitet mir aber keine Bauchschmerzen.


    In der DB sind nun 10 Datensätze vorhanden.

    Somit auch 10 Computer.

    Ziel ist es, in der DB "ALLE" Computer zu haben und folglich nur noch Änderungen (Tausch der Festplatte, anderer Benutzer, was auch immer) abzufragen und dann in der DB zu speichern.

    Die Computer sollen also, wie oben bereits beschrieben, in einer Liste erscheinen.
    Nachdem ich das Element in der Liste ausgewählt habe, soll eine neue Funktion die DB nach den Einträgen durchsuchen und sie in dem GUI wieder ausgeben.


    Ich lese die Daten aus der DB aus und schreibe sie in ein Array:

    Code
    Local $aArray = _sql_search_act($sDatabaseFileName, $sTable, $sTableToSearchFor, $sSearchString, $sTablesReturn)

    per ConsoleWrite() lasse ich mir die Ergebnisse vorsorglich ausgeben:



    Hab dann versucht das Array aufzulösen und wiederum in eine Listenvariable zu schmeißen um sie anschließend in die Dropdownliste zu übergeben.

    Auch die Funktion _ArrayToString() scheitert bei mir.


    Wie bekomme ich meine Ergebnisse für die Computer sauber in eine Liste übergeben?

  • Hi Lashandan ,


    kannst du ggf. deinen Code (bestenfalls gesamt als *.zip) zu Verfügung stellen oder geht das auf Grund des Datenschutz nicht? Mir fällt es schwer eine hoffentlich passende Antwort zu geben, wenn ich keine Testdaten dazu erzeugen kann/habe.

    Hab dann versucht das Array aufzulösen und wiederum in eine Listenvariable zu schmeißen um sie anschließend in die Dropdownliste zu übergeben.

    Verstehe den Sinn bzw. das Ziel dazu nicht. Du willst Informationen eines Arrays der Combobox übergeben, nehme ich an? Dann sollte die Funktion doch helfen oder nicht?

    AutoIt
    _GUICtrlComboBoxEx_AddString()



    Viele Grüße
    Sven

  • Hi Lashandan ,


    kannst du ggf. deinen Code (bestenfalls gesamt als *.zip) zu Verfügung stellen oder geht das auf Grund des Datenschutz nicht? Mir fällt es schwer eine hoffentlich passende Antwort zu geben, wenn ich keine Testdaten dazu erzeugen kann/habe.

    Verstehe den Sinn bzw. das Ziel dazu nicht. Du willst Informationen eines Arrays der Combobox übergeben, nehme ich an? Dann sollte die Funktion doch helfen oder nicht?

    AutoIt
    _GUICtrlComboBoxEx_AddString()



    Viele Grüße
    Sven

    Ich habe eine Variable in der alle Rechner separiert durch ein ";" gespeichert werden.

    Diese Variable möchte ich jetzt für eine Listenansicht (Dropdown etc.) in die Liste übergeben.
    Problem: derzeit stehen alle Rechner mit dem Separator in der Liste als ein gesamter Eintrag.
    Ziel: alle Rechner in der Liste untereinander - eben Dropdown.

    P.s. Den gesamte Code möchte ich aktuell noch nicht präsentieren da er ein paar sensible Daten erhält.
    Diese muss ich bei Zeiten noch anpassen, damit der Code auch für Allgemein gelten kann.