AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird Feld Funktion
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Feld Funktion

Ein Thema von Eppos · begonnen am 25. Jun 2018 · letzter Beitrag vom 27. Jun 2018
Antwort Antwort
Eppos

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

Firebird Feld Funktion

  Alt 25. Jun 2018, 12:56
Datenbank: Firebird • Version: 2,5 • Zugriff über: FireDAC
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: Firebird Feld Funktion

  Alt 25. Jun 2018, 13:09
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?
  Mit Zitat antworten Zitat
Eppos

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

AW: Firebird Feld Funktion

  Alt 25. Jun 2018, 13:32
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Firebird Feld Funktion

  Alt 25. Jun 2018, 13:39
Ich würde hier auch mit Sequenz und auf jeden Fall Semaphorenfunktion GEN_ID() arbeiten.
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#5

AW: Firebird Feld Funktion

  Alt 25. Jun 2018, 14:04
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?

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
  Mit Zitat antworten Zitat
Eppos

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

AW: Firebird Feld Funktion

  Alt 25. Jun 2018, 14:44
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Firebird Feld Funktion

  Alt 25. Jun 2018, 14:57
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#8

AW: Firebird Feld Funktion

  Alt 25. Jun 2018, 15:07
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Eppos

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

AW: Firebird Feld Funktion

  Alt 27. Jun 2018, 07:37
@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
  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 04:36 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