Probleme mit dem Primary Key???

Alles, was den Programmierer beschäftigt

Moderator: SYNERPY

Antworten
Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Probleme mit dem Primary Key???

Beitrag von Vegeta »

Hallo @ all,
habe einen seltsamen Fehler entdeckt.
Habe eine neue Tabelle erstellt. View angelegt usw. Läuft alles wunderbar.
Daten die ich dort eintragen möchte, werden durch eine AfterInsert-Procedure einer anderen Tabelle automatisch eingetragen. Alles kein Problem. Jetzt ist mir durch Zufall aufgefallen, dass ich jedoch nichts über AvERP(zugehörige Maske der View) in die Tabelle eintragen kann. Da bekomme ich immer folgende Fehlermeldung:

ISC Fehlernummer: 335544665
ISC Fehlermeldung:
violation of PRIMARY or UNIQUE KEY constraint "PK_BLFK" on table "BLFK"


Auch kann ich über AvERP keinen angelegten DS(kann ich ja über AfterInsertProcedure anlegen lassen) ändern, dann bekomme ich folgende Fehlermeldung:

Der Datensatz wurde bereits von einer anderen Person veraendert.

Der Primary Key der Tabelle sieht folgendermaßen aus:

Code: Alles auswählen

/* Primary keys definition */

ALTER TABLE BLFK ADD CONSTRAINT PK_BLFK PRIMARY KEY (ID);

SET TERM ^ ;

/* Triggers definition */
Der Generator für die ID läuft einwandfrei, AvERP benutzt immer wieder neue ID´s kommt also nix doppelt vor, auch Maskenkey ist jedes Mal anders... Trotzdem jedesmal die Fehlermeldung. Wenn ich es über die Procedure mache läuft es einwandfrei, wenn ich sie direkt von Hand in die DB schreibe auch, nur nicht über AvERP. :?
Hat jemand eine Idee woran es hängen könnte??

Gruß
Vegeta
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Bitte BEFORE-Insert-Trigger und BEFORE-Update Trigger posten.
Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Beitrag von Vegeta »

Mach ich doch glatt :wink:

Before Insert der Tabelle:

Code: Alles auswählen

AS
BEGIN
/* Protokollieren, dass Aktion hier durchgelaufen ist */
IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('BLFK_BI');
IF ((NEW.ID IS NULL) OR (NEW.ID = 0)) THEN NEW.ID = GEN_ID("GEN_BLFK",1);
NEW."Benutzer" = USER;
NEW."Gesp" = 'NOW';
END
Before Update der Tabelle:

Code: Alles auswählen

AS
BEGIN
/* Protokollieren, dass Aktion hier durchgelaufen ist */
IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('BLFK_ BU');
IF (NEW."Gesp" <> OLD."Gesp") THEN EXCEPTION KEINE_AENDERUNG;
NEW."Benutzer" = USER;
NEW."Gesp" = 'NOW';
END
Before Insert der View:

Code: Alles auswählen

AS
BEGIN
/* Protokollieren, dass Aktion hier durchgelaufen ist */
IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('V_BLFK_ BI');
IF ((NEW.ID IS NULL) OR (NEW.ID = 0)) THEN NEW.ID = GEN_ID("GEN_BLFK",1);
NEW.gespeichert = 'NOW';
NEW.benutzer = USER;

INSERT INTO BLFK (
       BLFK.id,
       BLFK."Maskenkey",
       BLFK."Span",
       BLFK."FurnFolie",
       BLFK."Saegeblatt",
       BLFK."Gesp",
       BLFK."Benutzer"
       )
       Values (
       New.id,
       New.maskenkey,
       New.span,
       New.furnfolie,
       New.saegeblatt,
       New.gespeichert,
       New.benutzer
       );

END 
Before Update der View:

Code: Alles auswählen

AS
BEGIN
/* Protokollieren, dass Aktion hier durchgelaufen ist */
IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('V_BLFK_ BU');
IF (NEW.gespeichert <> OLD.gespeichert) THEN
EXCEPTION KEINE_AENDERUNG;
NEW.gespeichert = 'NOW';
NEW.benutzer = USER;

UPDATE BLFK
  SET BLFK.id = NEW.id,
  BLFK."Maskenkey" = NEW.maskenkey,
  BLFK."Span" = New.span,
  BLFK."FurnFolie" = New.furnfolie,
  BLFK."Saegeblatt" = New.saegeblatt,
  BLFK."Gesp" = NEW.gespeichert,
  BLFK."Benutzer" = NEW.benutzer
  WHERE ID = OLD.ID;

END  
Gruß
Vegeta
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Hmmm, alles nicht so wirklich nach dem AvERP-Standard, aber auch nicht wirklich falsch.

Werden über Maske oder After-Updates noch Änderungen an der Tabelle gemacht?

Die Fehlermeldung beim Ändern deutet darauf hin, dass eine Änderung gespeichert wird und diese Änderung erneut zu einer Änderung des Datensatzes führt.

Wenn man in der Maske auf "+" drückt, erscheint dann eine neue ID?
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Beitrag von festus01 »

Hatten wir nicht schon mal ein ähnliches Problem, wenn die Felder in " " stehen :?:

Warum heißt das DB Feld Benutzer z.B. "Benutzer" - sehr merkwürdig :?: :?: :?:

Ich weiß da war mal was, aber was :?:

Ich würde die Table und zugehörige View neu erstellen aber ohne diese " ".
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Das kann schon sein, warum nicht anstatt von dem

Code: Alles auswählen


UPDATE BLFK 
  SET BLFK.id = NEW.id, 
  BLFK."Maskenkey" = NEW.maskenkey, 
  BLFK."Span" = New.span, 
  BLFK."FurnFolie" = New.furnfolie, 
  BLFK."Saegeblatt" = New.saegeblatt, 
  BLFK."Gesp" = NEW.gespeichert, 
  BLFK."Benutzer" = NEW.benutzer 
  WHERE ID = OLD.ID; 

das hier schreiben?

Code: Alles auswählen


UPDATE BLFK 
SET id = NEW.id, 
     Maskenkey = NEW.maskenkey, 
     Span = New.span, 
     FurnFolie = New.furnfolie, 
     Saegeblatt = New.saegeblatt, 
     Gesp = NEW.gespeichert, 
     Benutzer = NEW.benutzer 
WHERE ID = OLD.ID; 

Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Beitrag von Vegeta »

Hallo,
also kann eigentlich nix mit dem DB-Dialekt zu tun haben. Selbst wenn ich das alles umstelle, und den Code von Admin benutze
Code:


UPDATE BLFK
SET id = NEW.id,
Maskenkey = NEW.maskenkey,
Span = New.span,
FurnFolie = New.furnfolie,
Saegeblatt = New.saegeblatt,
Gesp = NEW.gespeichert,
Benutzer = NEW.benutzer
WHERE ID = OLD.ID;

bekomme ich trotzdem die Fehlermeldung.
Wenn man in der Maske auf "+" drückt, erscheint dann eine neue ID?
Ja es wird eine neue ID angelegt, und zwar genau die richtige. Die, die laut Generator dran ist, welche er auch nehmen würde, wenn ich das ganze von Hand in die DB schreibe. Das komische ist, ich habe früher schon mal eine DB so umgebaut, mit der selben Tabelle, den selben Triggern usw, und da hat es noch funktioniert. Ich habe es diesmal genauso gemacht wie beim letzten Mal, aber es funktioniert einfach nicht. Auch wenn ich eine ganz andere Tabelle anlege, ich kann mit AvERP einfach auf keine neu angelegte Tabelle zugreifen, wenn ich was erstellen oder ändern will.
Hat jemand noch eine andere Idee woran es liegen könnte?

Gruß
Vegeta
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Wie ist denn die Relationsverwaltung gemacht worden? Sind hier alle Einträge korrekt gemacht worden?

Und noch eine Sache fällt mir auf: In der Tabelle gibt es keinen Fremdschlüssel. IB/FB mag es manchmal aber nicht, wenn in einer View kein JOIN ist. Gibt es in der View einen JOIN auf die VIEWPSEUDO?
Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Beitrag von Vegeta »

Hallo Admin,
Relationen waren da mal keine gesetzt... habe dann einfach mal einen Bezug auf eine andere Tabelle gesetzt.. nur so zum testen, da gings zumindest teilweise.
Wenn ich also ein Feld für eine FremdID einfügen, darauf Relationen und Join in der View setze, habe ich zumindest das Problem mit dem PK nicht mehr.
Muss man hier denn unbedingt eine FremdID mit einbeziehen, auch wenn man eigentlich keine braucht? :?
Und es gibt ja immer noch das Problem mit dem Bearbeiten, dass funktioniert nämlich nach wie vor noch nicht. Kommt immer noch die Fehlermeldung:
Der Datensatz wurde bereits von einer anderen Person veraendert.
Obwohl ich jetzt Relationen drin habe.
Irgendeine Idee wie ich das noch behebn kann?

Gruß
Vegeta
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Das mit der View mit mindestens zwei Tabellen ist eine Firebird Voraussetzung...


Die Meldung beim Bearbeiten kommt, wenn das Feld "Gespeichert" zwischenzeitlich geändert wurde. Wie oft wird denn der Trigger durchlaufen? AvERP versucht hier über den Trigger der Tabelle abzufangen, ob schon ein anderer Benutzer abgespeichert hat, während der erste Benutzer noch bearbeitet. Kann es sein, dass mehrmals versucht wird, denselben Datensatz abzuspeichern, wenn bearbeitet und bestätigt wird?
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Uuups, bei genauerem Hinsehen ist mir der Fehler aufgefallen.

Also, der Datensatz wird eingefügt. Gesp = '01.01.2006 12:00:00'

Datensatz wird bearbeitet. Gesp immer noch = '01.01.2006 12:00:00'

Datensatz wird gespeichert. Gesp = '01.01.2006 12:00:00'

Durchläuft View-Trigger, Gesp am Anfang immer noch = '01.01.2006 12:00:00', wird dann aber auf aktuelles Datum gesetzt = Gesp = '01.01.2006 12:30:00'

Läuft jetzt in Tabellen Trigger. Hier ist der alte Wert immer noch Gesp = '01.01.2006 12:00:00' und der wird mit dem neuen Wert verglichen. Gesp = '01.01.2006 12:30:00'.

Diese sind ungleich und es kommt zur Fehlermeldung.

Abhilfe: NIEMALS "Benutzer" oder "Gespeichert" im View-Trigger setzen. Immer im Tabellen-Trigger und IMMER nach der Prüfung OLD.GESPEICHERT <> NEW.GESPEICHERT :!:
Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Beitrag von Vegeta »

Hallo Admin,
das war es natürlich :roll:

Aber jetzt läuft es wieder einwandfrei :D

Nochmal vielen Dank!!

Gruß
Vegeta
Antworten