Torsummen als eigene Spalten, NULL heisst unbekannt (Datenbankversion 123)

Die STFV-Tabellensortierung braucht als letzte inhaltliche Stufe die Tore — und
die stehen bisher ausschliesslich im tinytext ergebnis_detailliert, wo kein SQL
sie lesen kann (#306-Konzept, Abschnitt 2). Also neue, durchweg NULL-bare
Spalten: teamspiel_heim_tore/gast_tore, begegnung.heim_tore/gast_tore und
team.tore_gewonnen/verloren/differenz/quotient (Typen nach punkte_*-Vorbild).

toreFuerSpiel() in tools.php ist die einzige Rechenstelle: bei punktetyp 0 sind
die Punkte die Tore; wo Satzergebnisse gefuehrt werden (satzergebnisse 1),
werden sie aus ergebnis_detailliert summiert (runden_detailliert_auswertung);
sonst NULL — unter "Mehrere" ohne Satzerfassung spiegelt das Detail nur den
Satzstand, eine Torzahl steht dort nicht und stand dort nie. Geschrieben wird
an denselben zwei Stellen wie die Spielpunkte (Spielbericht speichern und
begegnungenAktualisieren), immer paarweise gesetzt oder paarweise NULL; das
Loeschen des Spielberichts nullt die Begegnungssummen mit. team.tore_* rechnet
teamstatistikAktualisieren immer mit — als SUM ueber CASE je Begegnung, OHNE
COALESCE: eine Begegnung mit unbekannten Toren traegt nichts bei, unbekannt
wird niemals als 0:0 gewertet. Gemessen an Prueflige F: ein geleertes
ergebnis_detailliert macht Spiel, Begegnung und die Differenz beider Teams
NULL (135/147 -> 85/98), die Wiederherstellung stellt exakt den alten Stand her.

KEIN Backfill in der Migration: updateDatabase() ruft begegnungenAktualisieren()
nicht auf, und ein Update soll gespeicherte Werte nicht anfassen. Gemessen: nach
Einspielen und einem Seitenaufruf steht die Version auf 123, alle 455 + 116 + 32
Tore-Felder sind NULL. Befuellt wird beim naechsten Speichern eines Berichts
bzw. komplett beim Speichern des Modus — gemessen ueber alle acht Ligen:
Einer/Race tragen Tore = Punkte (Damenbundesliga 42:31 -> 42:31), Satzerfassung
summiert die Saetze ("5:3 4:4 2:6 6:1" -> 17:14, Begegnung 50:49), "Mehrere"
ohne Satzerfassung bleibt ehrlich NULL (PRUEF Liga A, 30 Spiele, 0 Tore-Werte).

Beide Pflegeorte: Migration <123 in database/update.php (getTableColumns-Guard
je Tabelle, Versionsschreiben am Ende) UND die CREATEs in script.php samt
datenbank_version 123. Gemessen per probe_-Tabellen aus den Neuinstallations-
CREATEs gegen die migrierten Tabellen (information_schema: Name, Position, Typ,
Nullable, Default): alle drei Tabellen spaltenidentisch.

Bestand unberuehrt, gemessen mit derselben Messlatte wie beim Refactoring:
alle zehn Modi und dieselben zehn Begegnungen unveraendert erneut gespeichert,
danach Datenbank-Dump der Bestandsspalten (756 Zeilen) und Frontend-Dump
(30995 Zeilen HTML) gegen den Lauf mit dem alten Code verglichen:
VOLLSTAENDIG identisch.
This commit is contained in:
svennickel
2026-09-09 18:56:02 +02:00
parent e1a0637795
commit 79f3abc01a
5 changed files with 122 additions and 10 deletions
+9 -1
View File
@@ -149,6 +149,8 @@ return new class () implements InstallerScriptInterface
. "\n `gast_punkte` smallint(6) DEFAULT NULL,"
. "\n `heim_spielpunkte` smallint(6) DEFAULT NULL,"
. "\n `gast_spielpunkte` smallint(6) DEFAULT NULL,"
. "\n `heim_tore` smallint(6) DEFAULT NULL,"
. "\n `gast_tore` smallint(6) DEFAULT NULL,"
. "\n `nichtraucherschutz` tinyint(4) DEFAULT '0',"
. "\n PRIMARY KEY (`begegnung_id`),"
. "\n KEY `heim_team_id` (`heim_team_id`),"
@@ -719,6 +721,10 @@ return new class () implements InstallerScriptInterface
. "\n `punkte_verloren` smallint(6) DEFAULT NULL,"
. "\n `punkte_differenz` smallint(6) DEFAULT NULL,"
. "\n `punkte_quotient` float(8,2) DEFAULT NULL,"
. "\n `tore_gewonnen` smallint(6) DEFAULT NULL,"
. "\n `tore_verloren` smallint(6) DEFAULT NULL,"
. "\n `tore_differenz` smallint(6) DEFAULT NULL,"
. "\n `tore_quotient` float(8,2) DEFAULT NULL,"
. "\n `buchholz1` smallint(6) DEFAULT NULL,"
. "\n `buchholz2` smallint(6) DEFAULT NULL,"
. "\n PRIMARY KEY (`team_id`),"
@@ -776,6 +782,8 @@ return new class () implements InstallerScriptInterface
. "\n `teamspiel_heim_spielpunkte` smallint(6) DEFAULT NULL,"
. "\n `teamspiel_gast_spielpunkte` smallint(6) DEFAULT NULL,"
. "\n `ergebnis_detailliert` tinytext DEFAULT NULL,"
. "\n `teamspiel_heim_tore` smallint(6) DEFAULT NULL,"
. "\n `teamspiel_gast_tore` smallint(6) DEFAULT NULL,"
. "\n PRIMARY KEY (`teamspiel_id`),"
. "\n KEY `begegnung_id` (`begegnung_id`),"
. "\n KEY `heim_spieler_1_id` (`heim_spieler_1_id`),"
@@ -1307,7 +1315,7 @@ return new class () implements InstallerScriptInterface
$db->setQuery( $query );
if (!$db->execute()) { die($db->stderr(true)); }
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '122';";
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '123';";
$db->setQuery( $query );
if (!$db->execute()) { die($db->stderr(true)); }