Tabellenberechnung

Forum für neue Firebird-Anwender.

Moderator: thorben.braun

Antworten
cableguy
Beiträge: 1
Registriert: Di 24. Mai 2022, 08:35

Hallo,
Ich stehe da momentan ein bischen auf dem Schlauch:

Ich habe eine Tabelle "STÜCKLISTE" mit folgendem Inhalt:
Zwischenablage01.jpg
Zwischenablage01.jpg (8.56 KiB) 772 mal betrachtet
Jetzt möchte ich gerne die Gesamtzeit berechnen ("Menge" * "ZEIT") und in die letzte Spalte ("GESAMTZEIT") schreiben.

Wie stelle ich das am besten an?
Benutzeravatar
andi
Beiträge: 11
Registriert: Fr 13. Mär 2020, 16:26

Hallo,

mittels eines 'Update-Statements':

UPDATE "STÜCKLISTE"
SET GESAMTZEIT = Menge * ZEIT;

Hiermit wreden alle Einträge geändert, wenn nur ein Datensatz geändert werden soll, muss mit einer Restriktion dieser Datensatz selektiert werden:

UPDATE "STÜCKLISTE"
SET GESAMTZEIT = Menge * ZEIT
WHERE ID = 1;

Ich würde vorschlagen, ein Tutorial für SQL im Internet zu suchen. :-;

LG
Benutzeravatar
martin.koeditz
Beiträge: 348
Registriert: Sa 31. Mär 2018, 14:35

Alternativ kannst du das auch über einen Trigger lösen. Dieser berechnet die Daten automatisch beim Einfügen oder Ändern eines Datensatzes.

Code: Alles auswählen

CREATE TRIGGER TBL_STUECKLISTE_BIU FOR TBL_STUECKLISTE ACTIVE BEFORE INSERT OR UPDATE POSITION 0 AS
BEGIN
   -- Berechne die Gesamtzeit anhand der Menge und Zeit --
   -- übergebe dies an die Spalte GESAMTZEIT des neuen Datensatzes.
   NEW.GESAMTZEIT = NEW.MENGE * NEW.ZEIT;

END
Gruß
Martin
Martin Köditz
it & synergy GmbH
Gerd
Beiträge: 196
Registriert: Di 1. Okt 2019, 17:13

Hallo

Ich möchte @Martins TRIGGER hier noch an den SQL 2003-Standard anpassen, denn das ist laut Firebird 4 Referenz-Handbuch empfohlen. Der TRIGGER würde demnach wie folgt aufgebaut sein:

Code: Alles auswählen

CREATE TRIGGER tbl_stueckliste_biu
ACTIVE BEFORE INSERT OR UPDATE ON TBL_STUECKLISTE POSITION 0
AS
BEGIN
-- Berechne die Gesamtzeit anhand der Menge und Zeit --
-- übergebe dies an die Spalte GESAMTZEIT des neuen Datensatzes.
NEW.GESAMTZEIT = NEW.MENGE * NEW.ZEIT;
END
Falls der TRIGGER bei Dir nicht funktioniert, müsstest Du Dich mit Folgendem auseinandersetzen:

RECHTE (bspw. SYSDBA - der darf TRIGGERN)
POSITION (hier: 0 - ist Standardeinstellung)
TERMINATOR (bspw. # für das TRIGGER-Konstrukt setzen (bspw. SET TERM # ;)

(Ich habe weder Martins noch meinen davon abgeleiteten TRIGGER geprüft.)


Viele Grüße
Gerd
Linux Mint 20.3 Una Cinnamon 5.2.7
Firebird 4.0.1, Embedded, ISQL: LI-V4.0.1.2696
Lazarus 2.2.0 - FPC 3.2.2
bfuerchau
Beiträge: 349
Registriert: Mo 7. Mai 2018, 18:09

Oder noch einen oben drauf:

Eine View erstellen, die die Berechung enthält, die Spalte kann dann entfallen.
Denn bei Änderung der Ursprungswerte mus auch der Update wiederholt werden.
Bei einer View entfällt das Ganze.
Antworten