Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird Feld Funktion (https://www.delphipraxis.net/196846-firebird-feld-funktion.html)

Eppos 25. Jun 2018 11:56

Datenbank: Firebird • Version: 2,5 • Zugriff über: FireDAC

Firebird Feld Funktion
 
Hallo zusammen,

ich möchte in einer Tabelle eine Art Feldfunktion hinzufügen, die automatisch eine Nummer hochzählt.
Wie ein Generator je Eintrag in einer Tabelle.

Gibt es so eine Funktion schon? Oder wie löst man dies am besten?

Vielen Dank.

Gruß
Eppos

Delphi.Narium 25. Jun 2018 12:09

AW: Firebird Feld Funktion
 
Wann soll hochgezählt werden?

Beim Einfügen, beim Ändern, nur wenn die Funktion manuell aufgerufen wird?

Per Trigger?

Sinngemäß sowas?
SQL-Code:
SET TERM ^ ;
CREATE TRIGGER TR_Name_BI FOR Tabellenname ACTIVE
BEFORE INSERT POSITION 0
AS BEGIN
  if (NEW.Zaehlspalte is NULL) then NEW.Zaehlspalte = 0;
END^

CREATE TRIGGER TR_Name_BU FOR Tabellenname ACTIVE
BEFORE UPDATE POSITION 0
AS BEGIN
  NEW.Zaehlspalte = NEW.Zaehlspalte + 1;
END^
SET TERM ; ^
Oder halt 'ne Kombination daraus?

Oder Aufgabenstellung präzisieren, da mir nicht klar ist, ob ich unter dem Geschriebenen das verstehe, was Du meinst.

Soll ein in der Tabelle vorhandenen Wert einer Spalte hochgezählt werden oder soll für die ganze Tabelle ein Wert hochgezählt werden, so dass hier ein eindeutiger Wert für die betroffenen Spalte entsteht?

Oder?

Eppos 25. Jun 2018 12:32

AW: Firebird Feld Funktion
 
Das sieht schon mal gut aus, du hast es richtig erkannt.
Die Spalte eines einzelnen Eintrags soll um eins hochgezählt werden.
Aber nur dann wenn die Funktion aufgerufen wird.
Tabelle:
ID | Zahl
1 | 0
2 | 0
3 | 0

Funktion: Gib mir Zahl von ID 2, wäre dann 1

ID | Zahl
1 | 0
2 | 1
3 | 0

Also eigentlich wie ein Generator, nur auf Feldebene.

mkinzler 25. Jun 2018 12:39

AW: Firebird Feld Funktion
 
Ich würde hier auch mit Sequenz und auf jeden Fall Semaphorenfunktion GEN_ID() arbeiten.

Delphi.Narium 25. Jun 2018 13:04

AW: Firebird Feld Funktion
 
Wenn um eins hochgezählt werden soll, wenn eine Funktion aufgerufen wird, dann muss halt die Funktion den Generator aufrufen.

Ganz klar ist mir allerdings noch nicht, was Du genau möchtest.

Sowas?

SQL-Code:
select ID, DeineFunktion(Zahl) from tabelle?

Soll dann Zahl in der Datenbank = Zahl + 1 werden?

Oder ausgehend von Deinem Beispiel:

Soll beim nächsten Funktionsaufruf bei ID 1 Zahl = 1 werden oder Zahl = 2.

Soll das Zählen pro Spalte für sich allein funktionieren oder pro einzelne Zelle?

Also: wird beim Funktionsaufruf, egal in welcher Zeile, Spalte = Spalte + 1 vom zuletzt vergebenen Wert für Zahl oder wird beim Funktionsaufruf für ID 1 die Zahl zu ID 1 um eins erhöht und die Zahl für ID 2 beim Aufruf der Funktion für ID 2 um eins erhöht?

Führt der nächste Funktionsaufruf zu diesem Ergebnis
Code:
ID | Zahl
1  | 1
2  | 1
3  | 0
oder zu jenem?
Code:
ID | Zahl
1  | 2
2  | 1
3  | 0

Eppos 25. Jun 2018 13:44

AW: Firebird Feld Funktion
 
Also die einzelne Zeile soll um 1 erhöht werden. Generatoren wäre nicht so gut, da ja je Eintrag in der Tabelle ein Generator benötigt würde.
Bei 200.000 Datensätzen wären es 200.000 Generatoren.

Ich denke da eher an einen Procedure die den Wert zurück gibt.

@Delphi.Narium
Soll beim nächsten Funktionsaufruf bei ID 1 Zahl = 1 werden oder Zahl = 2.

--> Es soll Zahl 1 werden.
Es führt also zum ersteren Ergebnis.

mkinzler 25. Jun 2018 13:57

AW: Firebird Feld Funktion
 
Eine Prozedur benötigt man ja nicht. GEN_ID() macht das ja schon und zwar sicher.
Pro Datensatz würde man es auch nicht beötigen, denn dann würde ja ein Generator ausreichen; höchtens einen pro Feld.

Uwe Raabe 25. Jun 2018 14:07

AW: Firebird Feld Funktion
 
Also nochmal zur Klarstellung: Du willst eine Methode haben die ein bestimmtes Integerfeld eines Datensatzes um eins hochzählt?

Sowas wie
Code:
UPDATE MeineTabelle
SET MeinFeld = MeinFeld + 1
WHERE ID = :ID
RETURNING MeinFeld

Eppos 27. Jun 2018 06:37

AW: Firebird Feld Funktion
 
@Uwe Raabe
Genau richtig.
Wenn ich mir dein Update mit returning anschaue, passt das glaube ich ganz gut.
Ich werde es mir mal ansehehen...
Manchmal steht man einfach auf dem Schlauch :shock:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 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