AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Trigger Felder verketten
Thema durchsuchen
Ansicht
Themen-Optionen

Trigger Felder verketten

Ein Thema von Eppos · begonnen am 8. Jun 2020 · letzter Beitrag vom 8. Jun 2020
Antwort Antwort
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#1

Trigger Felder verketten

  Alt 8. Jun 2020, 17:50
Datenbank: Firebird • Version: 3.0 • Zugriff über: FireDac
Hallo zusammen,

ich bin gerade dabei, die Datenbank etwas zu optimieren. An vielen Stellen werden unötige Verkettungen durchgeführt.
Nun habe ich mir gedacht, dass ich durch einen Trigger die Adresse zusammensetzen lassen kann.

Delphi-Quellcode:
Create Trigger Adresse_ai_au
active after insert or update on Adressen
as
begin
new.Adresse = (Select Coalesce(Titel,'') || ' ' || Coalesce(Vorname, '') || ' ' || Coalesce(Nachname, '') from Adressen where ID = new.ID);
end
Nur leider bringt er mir [FireDAC][Phys][FB]attempted update of read-only column und ich weiß nicht warum.

Jemand eine Idee?

VG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: Trigger Felder verketten

  Alt 8. Jun 2020, 18:04
Im AfterInsert/-Update wurde bereits gespeichert und es lässt sich nichts mehr Ändern.
Du kannst dort maximal ein neues UPDATE-Statement auslösen.
--UPDATE Adressen SET Adresse = concat(new.Titel, ' ', new.Vorname, ' ', new.Nachname) WHERE ID = new.ID;
UPDATE Adressen SET Adresse = concat(Titel, ' ', Vorname, ' ', Nachname) WHERE ID = new.ID;
(auf Endlosschleifen achten)

Was du willst, ist wohl im BeforeInsert/-Update zu besser lösen.
new.Adresse = concat(new.Titel, ' ', new.Vorname, ' ', new.Nachname);
(wird Titel/Vorname/Nachname in einem anderen Trigger geändert, dann auf die Reihenfolge der Trigger achten)

Einige DBMS kennen auch sowas wie ein new.Adresse = concat_ws(' ', new.Titel, new.Vorname, new.Nachname); ,
also "concatenate with separator", wo ' ' als Trennzeichen nur zwischen vorhandene Einträge (nicht NULL) eingefügt wird.


Kennt Firebird Writeable-Views?
Wenn ja, dann keine doppelte Datenhaltung, sondern sich einen View erstellen, der das bei der Abfrage zusammensetzt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Jun 2020 um 18:29 Uhr)
  Mit Zitat antworten Zitat
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Trigger Felder verketten

  Alt 8. Jun 2020, 18:18
Perfekt danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: Trigger Felder verketten

  Alt 8. Jun 2020, 18:28
Büdde.

PS: Hatte noch was nachgetragen. (sah nicht das du noch da warst und auch schon geantwortet hattest)
Der letzte Satz/Frage, bezüglich der doppelten Daten,
und das concat/concat_ws.

Alternativ kann man es auch umdehen und ins Coalesce einfügen.
Coalesce(Titel || ' ', '') || Coalesce(Vorname || ' ', '') || Coalesce(Nachname, '')
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Jun 2020 um 18:31 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz