AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ZEOS - Interbase: Fehler bei Post eines neuen Datensatzes
Thema durchsuchen
Ansicht
Themen-Optionen

ZEOS - Interbase: Fehler bei Post eines neuen Datensatzes

Ein Thema von mschaefer · begonnen am 12. Mär 2003 · letzter Beitrag vom 14. Mär 2003
Antwort Antwort
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#1

ZEOS - Interbase: Fehler bei Post eines neuen Datensatzes

  Alt 12. Mär 2003, 11:57
Moin zusammen,

Greifee mit Zeos auf eine Interbase DB zu und habe die einzelnen Tabellen
mit einem AutoInc-Feld über einen Generator-Trigger aufgebaut.

CREATE GENERATOR adress_basis;
COMMIT;

set term ! ;
CREATE TRIGGER Trigger1 FOR adress_basis
before insert position 0 as
begin
NEW.ADR_BAS_PID = GEN_ID(adress_basis,1);
end !!
set term ; !

WAS GEHT
Man kann Datensätze anlegen und angelegte ändern oder löschen.
Wenn ein Anwender einen Neuen Datensatz anlegt und Änderungen in
den visuellen Datenbankkomponenten / Feldern macht dann wird auf
dem DBNavigator der Haken zum Posten aktiviert. Dieser kann auch
gecklickt werden und die Änderungen gehen an die Datenbank OK !
Danach ist der Haken deaktiviert

PROBLEM:
Wenn der Kandidat aber jetzt ohne !!! den Datensatz zu wechseln
nochmals Änderungen im DB Feldern des Fomular macht dann wird
der Haken im DBNavigator wieder aktiviert, da ja neue Daten vorliegen.
Wird dieser jedoch jetzt geklickt oder Query.Post angewendet,
läuft die Anwendung in einen Datenbankfehler und der geänderte Satz
wird nicht gespeichtert.

Irgendjemand eine Idee


Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#2
  Alt 12. Mär 2003, 14:02
Hallo MSchaefer 8)

Ich weiß jetzt nicht gezielt was für einen Fehler Du bekommst... nun... kann ich nur vermuten, dass Deine Datenbank kriegt nicht richtig mit... Bescheid über neue ADRESS_BASIS (ich hoffe, dass das ein Primärschlüssel in Deiner Tabelle ist!)

Nun das Generator sollte so aussehen:


CREATE GENERATOR ADRESS_BASIS_ID_GEN;
SET GENERATOR ADRESS_BASIS_ID_GEN TO 0

und Trigger:

CREATE TRIGGER ADRESS_BASIS _ID_GEN FOR ADRESS_BASIS BEFORE INSERT POSITION 0 AS
BEGIN
IF (NEW. ADRESS_BASIS IS NULL) THEN
NEW. ADRESS_BASIS = GEN_ID(ADRESS_BASIS _ID_GEN, 1);
END

So….!

__________________________________________________ _____
__________________________________________________ _____

Hilft das weiter nicht, dann kannst Du noch gezielt nach abspeichern eines Datensatzes das Befehl ‚COMMIT’ in dem Ereignis AfterPost Deiner Query „wegschicken“
Dies kann man auf zwei Arten realisieren:
__________________________________________________ _____

1.) Du kannst in dem besagtem Ereignis gezielt eine andere Query mit nur einem Befehl ‚COMMIT’ (Eine Operation, die alle Änderungen an Datenbanken speichert) ausführen... z.B. so:

Query1.Add('COMMIT');
try
Query1.ExecSQL;
except
end;
Somit erzwingst Du die Aktualisierung der Daten...
___________________________________________
2.) Verwendest Du in Deinem Projekt die Komponennte TdataBase und Deine Query „hängt“ an dieser Komponente dann kannst Du in dem AfterPost-Ereignis gezielt Commit erzwungen:

DataBase1.Commit;

Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Delphianer

Registriert seit: 19. Feb 2003
Ort: Rossau
149 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3
  Alt 12. Mär 2003, 15:42
Hallo,

ich habe zwar das Problem, daß ich Zeos nicht kenne, ich habe aber eine Ahnung, wo Du suchen mußt. Vornweg, Deine Datenbankdeklaration sieht ganz gut aus.

Was passiert:
1. Beim Andern
Die Komponente liest die Felder aus der Datenbank, Du änderst die Felder und Zeos schreibt die geänderten Felder zurück, ungefähr so:
Update tabelle set adr_bas_pid=alterwert1, feld2=neuerwert2 where adr_bas_pid=alterwert1 and feld2=alterwert2

2. Beim Einfügen
Du füllst die Felder und schickst diese an die Datenbank, Zeos bekommt nichts von Deinem Feld adr_bas_pid mit
insert into tabelle (adr_bas_pid, feld2) values (null, wert2)

3. Beim Einfügen und anschließendem Ändern
Da Du den Datensatz nicht verlassen hast, bildet sich Zeos vermutlich ein, alle Feldinhalte zu kennen:
Update tabelle set adr_bas_pid=null, feld2=neuerwert2 where adr_bas_pid=null and feld2=alterwert2
allerdings hast Du mit dem Trigger dem Feld adr_bas_pid einen Inhalt verpaßt.

Da ich, wie gesagt, zeos nicht kenne, mußt Du mal alles untersuchen, was irgendwie wie update (oder auch refresh) heißt. Und dann müßtest Du ihm sagen, daß er das Feld adr_bas_pid bitte nicht vergleichen soll. Und damit kommen wir zum Problem, das Feld hast Du sicherlich genau für diesen Zweck angelegt.
Als Lösung, falls Du innerhalb Zeos nicht fündig wirst, kann ich Dir nur anbieten, den Trigger nicht zu verwenden, sondern den Generator über eine Stored_proc abzufragen und dann in das Feld adr_bas_pid einzutragen.

Ich hoffe, es hilft, und seit bitte nachsichtig, falls ich SQL-Fehler gemacht habe.

Viele Grüße
Lutz
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#4

Es geht !!

  Alt 14. Mär 2003, 15:20
Hallo Paul Jr. und Delphianer

Zunächst einmal vielen Dank für die Tipps, das Ding hat mich doch
einige Nerven gekostet . Hat jetzt ein bischen gedauert bis ich
wieder an diese DB gekommen bin. Die Lösung war das

IF (NEW. ORD_BAS_PID IS NULL) THEN
NEW.ORD_BAS_PID = GEN_ID( ORDER_BASIS_PID_GEN,1 );

Die Idee mit dem Autocomit ist auch nicht ohne. In meinem Fall
habe ich das allerdings so gelöst, das ein Post abgesetzt wird
wenn das entsprechende Formular geschlosssen wird. Trotzde, da sind
auch einige Hinweise die später sicher mal eingebaut werden...
Hier nochmal eine Tabelle mit der kompletten Definition


CREATE TABLE order_basis (
ORD_BAS_PID INTEGER,
ORD_BAS_DeadlineDate DATE,
ORD_BAS_DeadlineTime DATE,
ORD_BAS_OrderTopic CHAR(50),
ODR_BAS_PayedBy CHAR(50)
);
COMMIT;

CREATE INDEX PRIMARYINDEX ON order_basis (ORD_BAS_PID);
CREATE GENERATOR ORDER_BASIS_PID_GEN ;
SET GENERATOR ORDER_BASIS_PID_GEN TO 0 ;
COMMIT;


DROP TRIGGER ORDER_BASIS_PID_TRG;
set term ! ;
CREATE TRIGGER ORDER_BASIS_PID_TRG FOR order_basis
before insert position 0 as
begin
IF (NEW. ORD_BAS_PID IS NULL) THEN
NEW.ORD_BAS_PID = GEN_ID( ORDER_BASIS_PID_GEN,1 );
end !
set term ; !


Übrigens Paul Jr. Danke, das Du Dich auf meine Feldbezeichnungen
eingelassen hast, die sind nun nicht jedermanns Sache.


Viele Grüße aus der Stadt an der Leine

// Martin
Martin Schaefer
  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 17:13 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