Push 05.02.2026

This commit is contained in:
2026-02-05 12:52:27 +01:00
parent 5842255a6a
commit e0796deec6
15 changed files with 38386 additions and 1765 deletions

View File

@@ -1,11 +1,12 @@
from decimal import Decimal
import os
import pandas as pd
import sqlite3
import sympy as sp
from sympy import MutableDenseMatrix
from typing import Any
from Berechnungen import Einheitenumrechnung
from Einheitenumrechnung import Einheitenumrechnung
class Datenbank_anlegen:
"""Legt die SQLite-Datenbank für die Ausgleichungsrechnung an.
@@ -147,6 +148,7 @@ class Datenbankzugriff:
- Schreiben in die Datenbank durch alle set_* Methoden
- Lesen aus der Datenbank durch alle get_* Methoden
- Darstellen der aus der Datenbenak gelesenen Daten in tabellarischer Form durch alle tabelle_* Methoden
:ivar pfad_datenbank: Pfad zur SQLite-Datenbankdatei.
:vartype pfad_datenbank: str
@@ -241,7 +243,7 @@ class Datenbankzugriff:
else:
id_instrument = cursor.execute(
"SELECT instrumenteID FROM Instrumente WHERE typ = ? AND name =?", (typ, name))
print(f"Das Instrument {name} ist bereits in der Datenbank vorhanden.\nEs hat die ID {id_instrument.fetchone()[0]}")
print(f"Das Instrument {name} ist bereits in der Datenbank vorhanden.")
con.commit()
cursor.close()
con.close()
@@ -252,7 +254,8 @@ class Datenbankzugriff:
Prüft, ob instrumenteID existiert und ob mindestens eine Genauigkeitsangabe übergeben wurde.
Je nach Beobachtungsart werden Einheitenumrechnungen durchgeführt (z. B. mgon → rad bzw. mm → m).
Der Eintrag wird nur ergänzt, wenn in Genauigkeiten kein identischer Datensatz vorhanden ist.
Der Eintrag wird neu hinzugefügt, wenn in Genauigkeiten kein identischer Datensatz vorhanden ist.
Ansonsten wird der bestehende Datensatz in der Datenbank aktualisiert.
:param instrumenteID: ID des Instruments in der Tabelle Instrumente.
:type instrumenteID: int
@@ -300,51 +303,36 @@ class Datenbankzugriff:
if isinstance(stabw_apriori_streckenprop, Decimal):
stabw_apriori_streckenprop = float(stabw_apriori_streckenprop)
# Überprüfen, ob die Genauigkeitsinformation für die jeweilige Beobachtungsart des Instruments bereits vorhanden ist. Wenn nein, wird die Benutzereingabe in die Datenbank gespeichert.
sql = "SELECT 1 FROM Genauigkeiten WHERE instrumenteID = ? AND beobachtungsart = ?"
params = [instrumenteID, beobachtungsart]
# Prüfen, ob für dieses Instrument und diese Art bereits ein Eintrag existiert
vorhanden = cursor.execute("SELECT 1 FROM Genauigkeiten WHERE instrumenteID = ? AND beobachtungsart = ?",
(instrumenteID, beobachtungsart)).fetchone()
if stabw_apriori_konstant is None:
sql += " AND stabw_apriori_konstant IS NULL"
if vorhanden:
# Bestehenden Datensatz aktualisieren
cursor.execute(
"UPDATE Genauigkeiten SET stabw_apriori_konstant = ?, stabw_apriori_streckenprop = ? WHERE instrumenteID = ? AND beobachtungsart = ?",
(stabw_apriori_konstant, stabw_apriori_streckenprop, instrumenteID, beobachtungsart)
)
print(f"Die Genauigkeitsangabe für {beobachtungsart} (Instrument: {instrumentenname}) wurde aktualisiert.")
else:
sql += " AND stabw_apriori_konstant = ?"
params.append(stabw_apriori_konstant)
if stabw_apriori_streckenprop is None:
sql += " AND stabw_apriori_streckenprop IS NULL"
else:
sql += " AND stabw_apriori_streckenprop = ?"
params.append(stabw_apriori_streckenprop)
liste_genauigkeiten = cursor.execute(sql, tuple(params)).fetchall()
if liste_genauigkeiten == []:
# Neuen Datensatz anlegen
if stabw_apriori_konstant is not None and stabw_apriori_streckenprop is not None:
cursor.execute(
"INSERT INTO Genauigkeiten (instrumenteID, beobachtungsart, stabw_apriori_konstant, stabw_apriori_streckenprop) VALUES (?, ?, ?, ?)",
(instrumenteID, beobachtungsart, stabw_apriori_konstant, stabw_apriori_streckenprop)
)
print(
f"Die Genauigkeitsangabe für die Beobachtungsart {beobachtungsart} des Instrumentes {instrumentenname} wurde erfolgreich hinzugefügt.")
elif stabw_apriori_konstant is None and stabw_apriori_streckenprop is not None:
elif stabw_apriori_konstant is None:
cursor.execute(
"INSERT INTO Genauigkeiten (instrumenteID, beobachtungsart, stabw_apriori_streckenprop) VALUES (?, ?, ?)",
(instrumenteID, beobachtungsart, stabw_apriori_streckenprop)
)
print(
f"Die Genauigkeitsangabe für die Beobachtungsart {beobachtungsart} des Instrumentes {instrumentenname} wurde erfolgreich hinzugefügt.")
elif stabw_apriori_streckenprop is None and stabw_apriori_konstant is not None:
else:
cursor.execute(
"INSERT INTO Genauigkeiten (instrumenteID, beobachtungsart, stabw_apriori_konstant) VALUES (?, ?, ?)",
(instrumenteID, beobachtungsart, stabw_apriori_konstant)
)
print(
f"Die Genauigkeitsangabe für die Beobachtungsart {beobachtungsart} des Instrumentes {instrumentenname} wurde erfolgreich hinzugefügt.")
else:
print("Die Genauigkeitsangabe ist bereits in der Datenbank vorhanden.")
print(
f"Die Genauigkeitsangabe für {beobachtungsart} (Instrument: {instrumentenname}) wurde erfolgreich hinzugefügt.")
con.commit()
cursor.close()
@@ -711,7 +699,7 @@ class Datenbankzugriff:
return liste_instrumente
def get_alle_instrumente_liste(self: str) -> list:
"""Liest alle Instrumente aus der Tabelle Instrumente.
"""Liest alle Instrumente aus der Tabelle Instrumente auf.
Gibt eine Liste der gefundenen Instrumente zurück. Falls keine Instrumente vorhanden sind,
wird eine Textausgabe mit verfügbaren Typen zurückgegeben.
@@ -977,4 +965,52 @@ class Datenbankzugriff:
con.close()
return liste_varianzkomponenten
def tabelle_instrumente_aus_db(self) -> None:
"""Stellt die in der Datenbank gespeicherten Instrumente tabellarisch dar.
Die Methode liest alle Datensätze aus der Tabelle Instrumente über die
zugehörige Datenbankzugriffsmethode und erzeugt daraus einen pandas-DataFrame
zur Anzeige im Notebook. Sind keine Instrumente vorhanden, wird ein Hinweistext
ausgegeben, dass die Instrumente zuerst anzulegen sind.
:return: None
:rtype: None
"""
liste_instrumente_in_db = self.get_alle_instrumente_liste()
# Prüfen, ob Datensätze in der Tabelle Instrumente enthalten sind
if isinstance(liste_instrumente_in_db, list) and len(liste_instrumente_in_db) > 0:
df_instrumente = pd.DataFrame(liste_instrumente_in_db, columns=['InstrumenteID', 'Typ', 'Bezeichnung'])
display(df_instrumente.style.hide(axis='index'))
else:
print(
"Es wurden noch keine Instrumente angelegt. Bitte in der folgenden Zelle nachholen und diese Zelle erneut ausführen!")
def tabelle_genauigkeiten_aus_db(self) -> None:
"""Stellt die a-priori Genauigkeiten der Beobachtungsgruppen tabellarisch dar.
Die Methode liest alle Einträge aus der Tabelle Genauigkeiten über die
zugehörige Datenbankzugriffsmethode und erstellt eine
übersichtliche Anzeige im Notebook. Liegen keine Genauigkeitsangaben vor,
wird ein Hinweistext ausgegeben, dass die a-priori Genauigkeiten zunächst zu
erfassen sind.
:return: None
:rtype: None
"""
genauigkeiten_dict = self.get_genauigkeiten_dict()
# Prüfen, ob Datensätze in der Tabelle Instrumente enthalten sind
if genauigkeiten_dict == {}:
print(
"Es wurden noch keine apriori Genauigkeiten zu den Beobachtungsgruppen erfasst. Bitte in der folgenden Zelle nachholen und diese Zelle erneut ausführen.")
else:
formatierte_daten = list(genauigkeiten_dict.values())
spalten = [
'instrumenteID',
'beobachtungsart',
'stabw_apriori_konstant',
'stabw_apriori_streckenprop'
]
df = pd.DataFrame(formatierte_daten, columns=spalten)
display(df.style.hide(axis='index'))