[Gelöst] Keine Änderung an Datenbank ... ehe Transaktion

15. November 2011 13:12

Hallo,

bei dem Versuch das Feld "Ship-to Name" der Tabelle 38 (Purchase Header) mittels Code (MODIFY) zu ändern erhalte ich die folgenden Fehlermeldung:

"Sie können keine Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde."

Ich kann nicht nachvollziehen woher diese Fehlermeldung kommt. Hat jemand eine Idee?

Das Feld lässt sich händisch in der Form 50 (Purchase Order) ändern ohne dass es zu der Fehlermeldung kommt.

:-( Das hängt mir grad zu hoch!

Gruß Joachim
Zuletzt geändert von GJMSD am 15. November 2011 18:04, insgesamt 1-mal geändert.

Re: Keine Änderungen an Datenbank ... ehe Transaktion gestar

15. November 2011 14:03

Nicht verzagen ;-)
NAV erwartet, dass dem MODIFY ganz zu Anfang eine Benutzertransaktion (z.B hat Button XY geklickt) vorausgegangen ist.
Dein MODIFY wird wahrscheinlich im OnOpenForm- oder OnAfterGetRecord-Trigger der Form aufgerufen?

Da stellt sich die Frage, ob dieses MODIFY an dieser (frühen) Stelle unbedingt notwendig ist.
Wenn doch: Es gibt einen Trick. Packe deinen gesamten Code bis zum MODIFY in einen Report (ProcessingOny = Yes) und führe auf der Form den Report aus.

PS: Um Felder zu ändern, verwendest du VALIDATE, nicht MODIFY.
MODIFY wird automatisch vom Programm ausgeführt, sobald der Benutzer den geänderten Datensatz verlässt.

Re: Keine Änderungen an Datenbank ... ehe Transaktion gestar

15. November 2011 14:48

Hallo Natalie,
vielen Dank für deine Infos!

Mit VALIDATE funktionierts jetzt auch, wobei ich es nicht so wirklich verstanden habe.

Also, der Code wird im OnDeactivate() Trigger einer TextBox ausgeführt, die auf der Form 50 liegt.
(Die TextBox ist: Lookup = Yes; SourceExpr = recIBLiefAn.Code; TableRelation = "IB Lief. an")

"IB Lief. an" ist eine separate Tabelle, die die benötigten Lieferadressdaten enthält, da bei uns die Lieferadresse von Debitoren bzw. Objekten (Lagerortcodes) nicht (immer) die passenden sind. Damit wiederkehrende abweichende Adressen nicht bei jeder Bestellung neu von Hand zu erfassen sind, sollen ( :-D bzw. können jetzt ja auch) diese in der separaten Tabelle abgelegt werden und über die TextBox, die auf der Form liegt ausgewählt und automatisch in die Form eingetragen werden.

Code:
IF recIBLiefAn.GET(recIBLiefAn.Code) THEN BEGIN
  VALIDATE("Ship-to Name", recIBLiefAn.LaName);
  VALIDATE("Ship-to Address", recIBLiefAn.LaAdr);
  //VALIDATE(weitere Adress Felder)...
  CLEAR(recIBLiefAn);
  CurrForm.UPDATE;
END;


Der Unterschied zwischen MODIFY und VALIDATE ist mir leider nicht so ganz klar geworden, und vor Allem:
Muss ich jetzt erst den Datensatz verlassen, damit die geänderten Werte auch wirklich gespeichert sind?
Das wäre unschön, denn die weitere Verarbeitung der Bestellung (Buchen/Drucken) sollte natürlich auch so möglich sein.
Oder langt CurrForm.Update; ?? Der richtige Feldinhalt wird jetzt ja auf der Karte angezeigt.

Gruß Joachim

Re: Keine Änderungen an Datenbank ... ehe Transaktion gestar

15. November 2011 18:02

---
Soweit ich es nachvollziehen kann, ist bei VALIDATE das anschließende CurrForm.UPDATE notwendig, damit die Werte auch in die Tabelle 38 ("Purchase Header") geschrieben werden.

Falls jemand die gleiche Problemstellung hat, unten mein kompletter Code.
Meine separate Tabelle mit den Adressdaten hat für das Feld "LaPLZ" eine TableRelation zur Tabelle 225 ("Post Code").
Mit dem Code, der in den entsprechenden Triggern der separaten Tabelle steht, wird dort beim Eintragen von Adressen die richtige Zuordnung von PLZ und Ort geprüft, weshalb dann in der Form 50 die Zuweisung für "Ship-to Post Code" und "Ship-to City" NICHT mit VALIDATE erfolgt. (Sonst wird nämlich genau diese Prüfung noch 2x ausgeführt!!!)

LaOrt - OnValidate()
Code:
PostCode.ValidateCity(LaOrt,LaPLZ) ;

LaOrt - OnLookup()
Code:
PostCode.LookUpCity(LaOrt,LaPLZ,TRUE) ;

LaPLZ - OnValidate()
Code:
PostCode.ValidatePostCode(LaOrt,LaPLZ) ;

LaPLZ - OnLookup()
Code:
PostCode.LookUpPostCode(LaOrt,LaPLZ,TRUE) ;


---

Form 50
TextBox "IB Lief. an" - OnDeactivate()
Code:
IF Status <> 0 THEN BEGIN   // <> 'Offen'
  MESSAGE('Bestellung muss `Offen´ sein!') ;
  CLEAR(recIBLiefAn) ;
  EXIT ;
END ;

IF recIBLiefAn.GET(recIBLiefAn.Code) THEN BEGIN
  VALIDATE("Ship-to Name", recIBLiefAn.LaName) ;
  VALIDATE("Ship-to Name 2", recIBLiefAn.LaName2) ;
  VALIDATE("Ship-to Address", recIBLiefAn.LaAdr) ;
  VALIDATE("Ship-to Address 2", recIBLiefAn.LaAdr2) ;
  // PLZ und Ort NICHT mit VALIDATE,
  "Ship-to Post Code" := recIBLiefAn.LaPLZ ;  // wegen Überprüfung bei nicht
  "Ship-to City" := recIBLiefAn.LaOrt ;       // ein-eindeutiger Zuordnung von PLZ zu Ort
  VALIDATE("Ship-to Contact", recIBLiefAn.LaKontakt) ;
  CLEAR(recIBLiefAn) ;
  CurrForm.UPDATE ;   // NOTWENDIG! Sonst nur PLZ und Ort geändert!
END;


Gruß Joachim :-P

Re: Keine Änderungen an Datenbank ... ehe Transaktion gestar

30. August 2022 09:29

Natalie hat geschrieben:Wenn doch: Es gibt einen Trick. Packe deinen gesamten Code bis zum MODIFY in einen Report (ProcessingOny = Yes) und führe auf der Form den Report aus.


Vielen Dank! Das hat mich gerade gerettet :-)