Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird INTEGER = NotNull (https://www.delphipraxis.net/183653-firebird-integer-%3D-notnull.html)

strom 26. Jan 2015 13:34

Datenbank: FireBird • Version: ? • Zugriff über: IBC

Firebird INTEGER = NotNull
 
Hallo,

habe Probleme mit der Spalte "Einsatznummer" hier soll automatisch eine Nr. angelegt werden.

Einsatznummer(PK)INTEGER NOTNULL

Delphi-Quellcode:
Einsatz.Insert;
  Einsatz.Edit;
  z := z +1;
  Einsatz.FieldByName('MELDUNG').Text := MemoText;
  Einsatz.FieldByName('EINSATZNUMMER').Text := InttoStr(z); // Was ist falsch?
  Einsatz.FieldByName('Sondersignal').Text := '0';
  Einsatz.Post;

DeddyH 26. Jan 2015 13:38

AW: Firebird INTEGER = NotNull
 
Wieso versuchst Du händisch, den PK zu setzen? Üblicherweise benutzt man dafür einen Generator und einen BEFORE INSERT-Trigger und hat damit dann quasi ein AutoInc-Feld.

Uwe Raabe 26. Jan 2015 13:40

AW: Firebird INTEGER = NotNull
 
Abgesehen von dem überflüssigen Edit (du machst ja direkt davor schon ein Insert), was funktioniert denn nicht?

strom 26. Jan 2015 13:47

AW: Firebird INTEGER = NotNull
 
Also,

"Edit" ist jetzt raus! Aber es wird nicht hochgezählt, es wird immer eine 1 gesetzt! :(

strom 26. Jan 2015 13:50

AW: Firebird INTEGER = NotNull
 
Jetzt geht es! :-)

Delphi-Quellcode:
 Einsatz.Insert;
  z := z + 1;
  Einsatz.FieldByName('MELDUNG').Text := MemoText;
  Einsatz.FieldByName('EINSATZNUMMER').Text := InttoStr(z+1);
  Einsatz.FieldByName('Sondersignal').Text := '0';
  Einsatz.Post;

strom 26. Jan 2015 13:52

AW: Firebird INTEGER = NotNull
 
es geht doch nicht :-(

es wird nicht hochgezählt!

mkinzler 26. Jan 2015 13:57

AW: Firebird INTEGER = NotNull
 
Warum versuchst Du ein Integerfeld als Text zu setzen?
Delphi-Quellcode:
Einsatz.FieldByName('MELDUNG').Value := z+1;
Was für einen Wert hat z am Anfang?
Es ist, wie schon erwähnt äusserst gefährlich den PK derartig zu setzen, verwenden einen Generator, welchen Du per Trigger setzen lässt.
Möglicherweise ist schon eine BI-Trigger aktiv.

strom 26. Jan 2015 14:11

AW: Firebird INTEGER = NotNull
 
hallo mkinzler,

die Datenbank ist vorgegeben, wo ich was reinschreiben möchte.
Ein Trigger Trigger_BI ist auch vorhanden, wie kann ich diesen mit einbinden?

himitsu 26. Jan 2015 14:12

AW: Firebird INTEGER = NotNull
 
Zitat:

Zitat von mkinzler (Beitrag 1287799)
Warum versuchst Du ein Integerfeld als Text zu setzen?

AsInteger :stupid:

Wo kommt denn der Inhalt von
Delphi-Quellcode:
z
her?
Und warum wird doppelt hochgezählt?

DeddyH 26. Jan 2015 14:12

AW: Firebird INTEGER = NotNull
 
Kommentier die Zeile doch mal aus, in der Du versuchst, die Nummer zu beschreiben.

mkinzler 26. Jan 2015 14:15

AW: Firebird INTEGER = NotNull
 
Zitat:

Ein Trigger Trigger_BI ist auch vorhanden, wie kann ich diesen mit einbinden?
Dann wird dieser den Wert setzen, egal was Du vorher reinschreibst.

Hansa 26. Jan 2015 14:27

AW: Firebird INTEGER = NotNull
 
Zitat:

Zitat von strom (Beitrag 1287804)
Ein Trigger Trigger_BI ist auch vorhanden, wie kann ich diesen mit einbinden?

Dann zeige den mal.

strom 26. Jan 2015 14:29

AW: Firebird INTEGER = NotNull
 
Delphi-Quellcode:
  var
  i,e,z : integer;
Mein Problem ist, dass ich aufgefordert werde was in die Spalte "Einsatznummer zu schreiben.

Die Zahl sollte natürlich fortlaufend geführt werden.
Später möchte ich dieses mit einem Datum ergänzen!

Beispiel:

20150126-00001
20150126-00002 usw. usw.

DeddyH 26. Jan 2015 14:30

AW: Firebird INTEGER = NotNull
 
Nun zeig doch mal, was im Trigger drinsteht.

p80286 26. Jan 2015 14:34

AW: Firebird INTEGER = NotNull
 
Zitat:

Zitat von strom (Beitrag 1287810)
Beispiel:

20150126-00001
20150126-00002 usw. usw.

Na das Beispiel ist ja schon ein wenig von Integer weg.
Statt mit solchen Konstrukten Speicherplatz zu sparen, wie wäre es mit
Key,Timestamp bzw. Date und Sequenz? alle drei Felder können Durch die DB vorbelegt werden oder hast Du so obskure Anforderungen zu erfüllen wie, alle Datensätze für britische Kunden müßen im Datensatzkenner ein "007" enthalten?

Gruß
K-H

strom 26. Jan 2015 14:49

AW: Firebird INTEGER = NotNull
 
Das ich auf dem falschem Weg bin,
ist mir auch schon aufgefallen :shock:

Dein Vorschlag "Date und Sequenz" hört sich gut an!

Delphi-Quellcode:
 Einsatz.Insert;
 Einsatz.FieldByName('MELDUNG').Text := MemoText;
 Einsatz.FieldByName('EINSATZNUMMER').Text := FormatDateTime ('yyyymmdd', Now)+( )// hier brauche ich eine Art ID
 Einsatz.FieldByName('Sondersignal').Text := '0';
 Einsatz.Post;

DeddyH 26. Jan 2015 14:52

AW: Firebird INTEGER = NotNull
 
Er hat von 3 Feldern geschrieben, Du versuchst das alles in eins zu quetschen. Und wie der Trigger aussieht, wissen wir immer noch nicht.

strom 26. Jan 2015 14:58

AW: Firebird INTEGER = NotNull
 
Habe von Trigger leider noch keine Ahnung.
Die Trigger befinden sich als Bezeichnung in der Datenbank! (mehr nicht!)

Brauche einfach nur eine automatisch fortlaufende Nr. die ich da "reinschreiben" kann!
Sie soll nicht von der Datenbank vorgegeben werden, sondern von Delphi selbst!

Das ist mein Ziel! Vielleicht noch mit einem Datum vorher versehen!

DeddyH 26. Jan 2015 15:01

AW: Firebird INTEGER = NotNull
 
Das kann aber mächtig ins Auge gehen, darauf wurde nun auch schon mehrfach hingewiesen.

strom 26. Jan 2015 15:05

AW: Firebird INTEGER = NotNull
 
Ok, dann muss ich wohl eine eigene DB erstellen.
Gibt es für Firebird eine Art Konsole oder so? (Freeware)

Hansa 26. Jan 2015 15:13

AW: Firebird INTEGER = NotNull
 
Ich glaube du weisst weder, was ein Trigger ist, noch was eine Datenbank ist. Und "ist vorgegeben" ist lediglich vorgeschoben. 8-)

DeddyH 26. Jan 2015 15:18

AW: Firebird INTEGER = NotNull
 
An administrativen Tools fallen mir spontan IBExpert (Personal) und FlameRobin ein.

strom 26. Jan 2015 15:22

AW: Firebird INTEGER = NotNull
 
Danke DeddyH :lol:

p80286 26. Jan 2015 16:02

AW: Firebird INTEGER = NotNull
 
Zitat:

Zitat von Hansa (Beitrag 1287830)
Ich glaube du weisst weder, was ein Trigger ist, noch was eine Datenbank ist. Und "ist vorgegeben" ist lediglich vorgeschoben. 8-)

Auch wenn hansa nicht sehr freundlich war, recht scheint er zu haben.
Also nochmals zurück auf Los.
Was hast Du wohin willst Du und welche Fragen tauchen dabei auf. Das herumdoktern an Symptomen hilft da nicht wirklich weiter!

Gruß
K-H

Hansa 26. Jan 2015 16:09

AW: Firebird INTEGER = NotNull
 
Stimmt, kommt wirklich nicht so freundlich rüber. Ein Land der Weicheier und Dilletanten nützt allerdings selbst letztgenannten nichts.

strom 26. Jan 2015 16:32

AW: Firebird INTEGER = NotNull
 
Natürlich habe ich keine Ahnung von Datenbanken in Delphi usw.
sonst wäre ich nicht in diesem Forum oder?

Dank "DeddyH" konnte ich mir mal einen Trigger anschauen. (FlameRobin)

Soll dieser Trigger jetzt von Delphi angesteuert werden?
Oder übernehme ich diesen Quelltext?

Code:
SET TERM ^ ;
ALTER TRIGGER EINSAETZE_BI ACTIVE
BEFORE INSERT POSITION 0
AS
    DECLARE iEinsatznummer INTEGER;
    DECLARE iRecordCount INTEGER;
    DECLARE iEinsatznummerStart INTEGER;
    DECLARE iEinsatznummerMax INTEGER;
BEGIN
    iRecordCount = 0;
    iEinsatznummerStart = extract(year from current_date) * 1000000;
    iEinsatznummerMax = 0;

    SELECT COUNT(*), max(EINSATZNUMMER) FROM EINSAETZE WHERE (EINSATZNUMMER >= :iEinsatznummerStart) INTO :iRecordCount, :iEinsatznummerMax;

    IF (iRecordCount >= 1) THEN iEinsatznummer = iEinsatznummerMax; ELSE iEinsatznummer = iEinsatznummerStart;
    iEinsatznummer = iEinsatznummer + 1;

    IF (NEW.EINSATZNUMMER IS NULL) THEN NEW.EINSATZNUMMER = iEinsatznummer;

END^
SET TERM ; ^

DeddyH 26. Jan 2015 16:39

AW: Firebird INTEGER = NotNull
 
Dieser Trigger macht doch schon das, was Du erreichen möchtest, von daher wäre es kontraproduktiv, die Einsatznummer "von außen" zu belegen. Wenn da nun unbedingt eine Eingabe erforderlich ist, kannst Du es ja mal mit NULL bzw. einem Clear-Aufruf versuchen, obwohl ich da auch nicht viel Hoffnung habe.

Hansa 26. Jan 2015 16:41

AW: Firebird INTEGER = NotNull
 
Öffentliche Diskussion beginnen und dann hinter den Kulissen irgendwas machen, was soll das ? Zusammenhang ist dadurch ziemlich durcheinander.

mkinzler 26. Jan 2015 16:56

AW: Firebird INTEGER = NotNull
 
Ja

IBexpert Personal Edition
Database Workbench free Edition
FlameRobin

Aber PK sollte man so nie setzen.

Dejan Vu 26. Jan 2015 18:49

AW: Firebird INTEGER = NotNull
 
Zitat:

Zitat von strom (Beitrag 1287842)
Code:
ALTER TRIGGER EINSAETZE_BI ACTIVE
BEFORE INSERT POSITION 0
...
    IF (NEW.EINSATZNUMMER IS NULL) THEN NEW.EINSATZNUMMER = iEinsatznummer;
...

Deshalb (und weil Du bei Dir die 'Einsatznummer' selber setzt, funktioniert das nicht.

Allerdings sollte der Ersteller des Triggers geteert und gefedert werden. Eine Grundregel der Datenbankprogrammierung lautet: Kodiere niemals(!) das primäre Schlüsselfeld. Niemals! Du kannst eine fortlaufende Nummer vergeben, oder -auch das ist legitim- einen eindeutigen Code, aber ein Primärschlüssel soll nie 'sprechend' sein.

Man kann zusätzlich zum Primärschlüsselfeld noch ein weiteres Feld angeben (mit unique-constraint), das dann mit derartigem Kram gefüllt ist. Aber das ist dann eben irgend eine 'Bezeichnung' des Datensatzes.

Hansa 26. Jan 2015 18:56

AW: Firebird INTEGER = NotNull
 
Dreh- und Angelpunkt ist das hier :
Delphi-Quellcode:
NEW.EINSATZNUMMER IS NULL
. Wenn du da selber eingreift, d.h. der Einsatznummer einen Wert zuweist, dann ist die eben nicht mehr NULL und der Trigger tritt nicht mehr automatisch in Aktion.

chess 26. Jan 2015 19:09

AW: Firebird INTEGER = NotNull
 
Zitat:

Zitat von Dejan Vu (Beitrag 1287854)
Zitat:

Zitat von strom (Beitrag 1287842)
Code:
ALTER TRIGGER EINSAETZE_BI ACTIVE
BEFORE INSERT POSITION 0
...
    IF (NEW.EINSATZNUMMER IS NULL) THEN NEW.EINSATZNUMMER = iEinsatznummer;
...

Deshalb (und weil Du bei Dir die 'Einsatznummer' selber setzt, funktioniert das nicht.

Allerdings sollte der Ersteller des Triggers geteert und gefedert werden. Eine Grundregel der Datenbankprogrammierung lautet: Kodiere niemals(!) das primäre Schlüsselfeld. Niemals! Du kannst eine fortlaufende Nummer vergeben, oder -auch das ist legitim- einen eindeutigen Code, aber ein Primärschlüssel soll nie 'sprechend' sein.

Man kann zusätzlich zum Primärschlüsselfeld noch ein weiteres Feld angeben (mit unique-constraint), das dann mit derartigem Kram gefüllt ist. Aber das ist dann eben irgend eine 'Bezeichnung' des Datensatzes.

Ich würde nach dem was ich bisher weiß (12. klasse) einen pk in der datenbank immer bei firebird über generator/trigger laufen lassen.
man kann aber neue felder/spalten z.b. als computed fields machen.
gruß
a.c.

Dejan Vu 26. Jan 2015 19:23

AW: Firebird INTEGER = NotNull
 
Würde ich auch so machen. Das konkrete Aussehen eines PK ist so unwichtig, das man das generell immer gleich behandelt sollte.


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