[Gelöst] - Modify Probleme...

8. Juli 2008 13:17

Hi,

ich habe eine Tabelle in welcher ich Datum Berechnungen durchführe, dazu ein Form, wo ich eine Funktion aufrufe welche sich in der Tabelle befindet.

In der Tabelle habe ich 2 Felder:
Feld1: Datum1 (fest)
Feld2: Intervall (1J) (fest)

Im Form im OnAfterGetRecord Trigger rufe ich die Funktion CalDatum() auf welche mir ein Datum für Feld3 berechnet, wie folgt:

CalcDatum():
Code:
NeuesDatum:= CALCDATE(Feld2,"Feld1");
Feld3 := NeuesDatum;
CheckDatum();


Feld3 wird auch in der Tabelle geändert. So weit so gut...

Nun habe ich Feld 4, ein Boolean Feld, welches geändert werden soll mit aufruf der Funktion CheckDatum() , welche so aussieht:

CheckDatum():
Code:
   IF (NeuesDatum < WORKDATE) THEN BEGIN
     "Feld4" := TRUE;
   END ELSE BEGIN
     "Feld4" := FALSE;
   END;



Im Form wird das auch alles richtig angezeigt, aber wenn ich anschliessend in der Tabelle gucke, hat sich nichts geändert, füge ich ein MODIFY hinzu, bekomme ich beim Form aufruf die Meldung das die Datenbank von diesem Codestück aus nicht verändert werden kann, in der Tabelle sind aber anschl. die Datensaetze richtig geändert.

Was könnte ich falsch machen?

Danke.
Zuletzt geändert von elTorito am 9. Juli 2008 10:47, insgesamt 1-mal geändert.

8. Juli 2008 13:32

Ich weiß, ich bin pingelig, aber hier erst mal ein Code-Verbesserungsvorschlag ;-)

CalcDatum():
Code:
Feld3:= CALCDATE(Feld2,"Feld1");


CheckDatum():
Code:
"Feld4" := Feld3 < WORKDATE;


Zum eigentlichen Problem:
Wie wäre es, wenn du beide Funktionen für den Aufruf in OnAfterGetRecord (ich verwende immer OnAfterGetCURRRecord; ich weiß aber nicht, ob das einen Unterschied macht) zusammen fasst?

Code:
Feld3:= CALCDATE(Feld2,"Feld1");
"Feld4" := Feld3 < WORKDATE;


Wenn es nun noch immer nicht (MIT Modify!) geht, prüfe, ob die Formeigenschaft ModifyAllowed = Nein gesetzt ist.

Ist es nur Zufall, dass deine Felder mal mit und mal ohne doppelte Anführugnsstriche geschrieben werden?

8. Juli 2008 13:55

Hi Natalie,

bei OnAfterGetCURRRecord verändert sich im Form der Datensatz nur wenn ich Aktuell über den Datensatz gehe...

ModifyAllowed Eigenschaft im Form = ja

Mit den Anführungstrichen war/ist Zufall ... ;-)

Habe die Funktionen jetzt zusammengefasst und geht noch immer nicht.
Selbst wenn ich den Code aus den Funktionen direkt im OnAfterGetRecord Trigger setze bekomme ich den Fehler das die Datenbank nicht von diesem Codestück aus veränderbar ist

Der Code im Form in OnAfterGetRecord Triigger sieht aktuell so aus:

Code:

// Funktion in Tabelle 50010
//CalcDatum();

IF FORMAT("Dat. letzte Rechnung") = '' THEN
  NextOrderDate:= "Order Date"
ELSE
  NextOrderDate:=CALCDATE(OrderInterval,"Order Date");

"Dat. nächste Rechnung" := NextOrderDate;

// Wenn "Gekündigt" dann keine Faktura fällig
IF "Gekündigt" THEN BEGIN
  "Faktura fällig" := FALSE;
END ELSE BEGIN
    // Faktura Prüfen
   IF ((NextOrderDate < WORKDATE) OR (FORMAT("Dat. letzte Rechnung") = '')) THEN BEGIN
     "Faktura fällig" := TRUE;
   END ELSE BEGIN
     "Faktura fällig" := FALSE;
   END;
END;
//MODIFY;

8. Juli 2008 16:47

OK, jetzt ganz anderer Ansatz:
Wieso soll deine Form(!) die Datensätze ergänzen?

Wie kommen sie überhaupt in die Tabelle (Report, manuell, ...) - an DIESER Stelle sollte der Quelltext ausgeführt werden.

8. Juli 2008 17:25

OrderInterval und "Order Date" werden über Extern eingefügt über C/Front.

Macht für die Anwendung auch kein Sinn den Code beim einfügen des Datensatzes auszuführen weil die Berechnung abhängig vom Arbeitsdatum sein soll.

Deswegen wollte ich das über das Form machen. Bei Aufruf der Tabelle habe ich ja gar keine Möglichkeit Code auszuführen.

Habe nun versucht über eine Record Variable das ganze mal zu machen, hilft auch nicht, gleicher Fehler das die DB von dem Codestück aus nicht geändert werden kann. Langsam verzweifle ich. Muss doch möglich sein "im Hintergrund" einmal alle Datensaetze "durchzurattern"...

Ich versuch jetzt mal die Funktion zu starten bevor das Formular geöffnet wird, im OnPush Trigger des Menü.

8. Juli 2008 18:18

Wie wäre es dann, wenn du im OnOpenForm-Trigger alle Datensätze mit Hilfe einer gesonderten Record-Variable durchläufst?

9. Juli 2008 10:46

Hi Natalie,

Natalie hat geschrieben:Wie wäre es dann, wenn du im OnOpenForm-Trigger alle Datensätze mit Hilfe einer gesonderten Record-Variable durchläufst?


so habe ich das jetzt gemacht, das funktioniert!!

Vielen Dank.

9. Juli 2008 10:57

Puh! :-)
Was lernen wir daraus:

Wenn schon Datensätze auf Formebene ohne Benutzereingriff ändern, dann nicht "im laufenden Betrieb" (also OnAfterGetRecord etc.), sondern vor Anzeige der Daten.