![]() |
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; |
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.
|
AW: Firebird INTEGER = NotNull
Abgesehen von dem überflüssigen Edit (du machst ja direkt davor schon ein Insert), was funktioniert denn nicht?
|
AW: Firebird INTEGER = NotNull
Also,
"Edit" ist jetzt raus! Aber es wird nicht hochgezählt, es wird immer eine 1 gesetzt! :( |
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; |
AW: Firebird INTEGER = NotNull
es geht doch nicht :-(
es wird nicht hochgezählt! |
AW: Firebird INTEGER = NotNull
Warum versuchst Du ein Integerfeld als Text zu setzen?
Delphi-Quellcode:
Was für einen Wert hat z am Anfang?
Einsatz.FieldByName('MELDUNG').Value := z+1;
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. |
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? |
AW: Firebird INTEGER = NotNull
Zitat:
Wo kommt denn der Inhalt von
Delphi-Quellcode:
her?
z
Und warum wird doppelt hochgezählt? |
AW: Firebird INTEGER = NotNull
Kommentier die Zeile doch mal aus, in der Du versuchst, die Nummer zu beschreiben.
|
AW: Firebird INTEGER = NotNull
Zitat:
|
AW: Firebird INTEGER = NotNull
Zitat:
|
AW: Firebird INTEGER = NotNull
Delphi-Quellcode:
Mein Problem ist, dass ich aufgefordert werde was in die Spalte "Einsatznummer zu schreiben.
var
i,e,z : integer; 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. |
AW: Firebird INTEGER = NotNull
Nun zeig doch mal, was im Trigger drinsteht.
|
AW: Firebird INTEGER = NotNull
Zitat:
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 |
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; |
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.
|
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! |
AW: Firebird INTEGER = NotNull
Das kann aber mächtig ins Auge gehen, darauf wurde nun auch schon mehrfach hingewiesen.
|
AW: Firebird INTEGER = NotNull
Ok, dann muss ich wohl eine eigene DB erstellen.
Gibt es für Firebird eine Art Konsole oder so? (Freeware) |
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-)
|
AW: Firebird INTEGER = NotNull
|
AW: Firebird INTEGER = NotNull
Danke DeddyH :lol:
|
AW: Firebird INTEGER = NotNull
Zitat:
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 |
AW: Firebird INTEGER = NotNull
Stimmt, kommt wirklich nicht so freundlich rüber. Ein Land der Weicheier und Dilletanten nützt allerdings selbst letztgenannten nichts.
|
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 ; ^ |
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.
|
AW: Firebird INTEGER = NotNull
Öffentliche Diskussion beginnen und dann hinter den Kulissen irgendwas machen, was soll das ? Zusammenhang ist dadurch ziemlich durcheinander.
|
AW: Firebird INTEGER = NotNull
Ja
IBexpert Personal Edition Database Workbench free Edition FlameRobin Aber PK sollte man so nie setzen. |
AW: Firebird INTEGER = NotNull
Zitat:
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. |
AW: Firebird INTEGER = NotNull
Dreh- und Angelpunkt ist das hier :
Delphi-Quellcode:
. 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.
NEW.EINSATZNUMMER IS NULL
|
AW: Firebird INTEGER = NotNull
Zitat:
man kann aber neue felder/spalten z.b. als computed fields machen. gruß a.c. |
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 20:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz