[Gelöst] Modify richtig benutzen

23. August 2010 08:05

Liebe Leute!

Ich möchte in einer Code-Unit ein Blocked-Feld auf "Yes" setzen, und zwar das der Strukturplanzeile. In der Code-Unit habe ich ein Global namens StrucPlanLine des Typs Record definiert.

[
StrucPlanLine.Blocked := TRUE;
StrucPlanLine.MODIFY;
]

Tatsächlich wird dann, wenn ich in der Code-Unite mit MESSAGE abfrage, StrucPlanLine.Blocked auf Yes gesetzt. Wenn ich die Codeunit dann aber erneut aufrufe, ist es jedoch wieder auf "No" gesetzt. Habe schon ein paar Bücher gewälzt, aber die beschreiben alles so, wie ich es gemacht habe.
Weiß irgendjemand Rat?

Maike
Zuletzt geändert von Maike am 30. August 2010 08:14, insgesamt 1-mal geändert.

Re: Modify richtig benutzen

23. August 2010 08:29

Hallöchen,

du musst NAV vorher sagen, welchen Datensatz genau du gerade versuchst, zu ändern:
GET verwenden

Code:
StrucPlanLine.GET(.......);
StrucPlanLine.Blocked := TRUE;
StrucPlanLine.MODIFY;

Re: Modify richtig benutzen

23. August 2010 09:21

Hallo Maike,

dieses Problem wurde bereits in folgendem Beitrag behandelt.

viewtopic.php?p=54663#p54663


Schönen Gruß Raimond

Re: Modify richtig benutzen

23. August 2010 10:00

Hallo, Leute!

Danke für Eure Bemerkungen. Habe am Anfang des Codes bereits bekannt gegeben, welchen Datensatz ich ändern möchte.
Code:
StrucPlanLine.RESET;
StrucPlanLine.SETCURRENTKEY (StrucPlanLine."JSP Code");
StrucPlanLine.SETFILTER (StrucPlanLine."JSP Code", JobJnlLine."JSP Code");


Habe es jetzt auch mal mit GET versucht, führt zum gleichen Ergebnis. Habe auch VALIDATE versucht, ohne Erfolg. Kenne den Eintrag über MODIFY bereits, der hilft mir aber nicht..

Wenn ich direkt nach MODIFY mit
Code:
MESSAGE(StrucPlanLine.Blocked = %1', StrucPlanLine.Blocked);

auslese, bekomme ich auch ein "Ja". Er scheint also zu verstehen, wo es hinsoll. Muss ich vielleicht in der Strukturplanzeile die Propertys irgendwie ändern, damit er einliest?

Maike

Re: Modify richtig benutzen

23. August 2010 10:08

Maike hat geschrieben:Danke für Eure Bemerkungen. Habe am Anfang des Codes bereits bekannt gegeben, welchen Datensatz ich ändern möchte.
Code:
StrucPlanLine.RESET;
StrucPlanLine.SETCURRENTKEY (StrucPlanLine."JSP Code");
StrucPlanLine.SETFILTER (StrucPlanLine."JSP Code", JobJnlLine."JSP Code");

Ohne ein anschließendes FIND, FINDSET, FINDFIRST etc. kommen deine gesetzten Filter nie zum Tragen.

Re: Modify richtig benutzen

23. August 2010 10:23

Hallo, Natalie!

Habe natürlich auch Find eingebunden, er würde sonst ja gar nichts finden:
Code:

IF  StrucPlanLine.FIND('-') THEN
BEGIN


Maike

Re: Modify richtig benutzen

23. August 2010 10:30

ersetze mal SETFILTER mit SETRANGE. Vlt. kann es helfen.
Bin selbst noch unbewandert weil ich gerade eine Ausbildung als FI AE geniesse :lol:

Re: Modify richtig benutzen

23. August 2010 10:37

Hallo, Stephen!

Hab ich versucht, funktioniert genau wie vorher. Also, er liest am Ende des Codes korrekt aus,(setzt StructPlanLine.Blocked = TRUE), beim erneuten Aufrufen ist es aber wieder FALSE.
Setzt einer der oben genannten Befehle möglicherweise diesen Wert auf den Default-Wert? Führt eine ERROR-Message möglicherweise zum Zurücksetzen auf den DEFAULT-Wert?

Maike

Re: Modify richtig benutzen

23. August 2010 10:40

achso kommt ein fehler zwischen drinne? wenn ja wird alles wieder auf den Ursprungswert gesetzt.

Re: Modify richtig benutzen

23. August 2010 10:48

Nein, keine Fehlermeldung...

Re: Modify richtig benutzen

23. August 2010 11:03

Hallo Maike,

der Report darf nicht aus dem Designer aufgerufen werden, sondern nur als gespeicherte Version.

Falls Du den Report aus dem Designermodus ausführen möchtest, musst Du im OnPostDateitem ein

Commit;

eintragen, damit die Änderungen auch sofort gespeichert werden.

Siehe dazu bitte den Beitrag, den ich Dir in meiner 1. Nachricht eingetragen hatte.


DGruss Raimond

Re: Modify richtig benutzen

23. August 2010 11:29

Hallo, Raimond!

Ich speichere ab und schließe Navision, um es danach aufzurufen. Dann versuche ich aus einer Artikelkarte zu buchen. So, wie der Endanwender es auch tun soll. Ich starte also nicht aus dem Design-Modus.

Maike

Re: Modify richtig benutzen

23. August 2010 12:02

RaiNav hat geschrieben:Falls Du den Report aus dem Designermodus ausführen möchtest, musst Du im OnPostDateitem ein

Commit;

eintragen, damit die Änderungen auch sofort gespeichert werden.

Diese Einschränkung gilt meines Wissens nach nur für Dataports, nicht für Reports?

Re: Modify richtig benutzen

23. August 2010 13:41

Hallo Maike,

dann bleibt ja eigentlich nur noch, das das Feld wieder auf False gesetzt wird.
Hast Du schon geprüft, ob beim Aufruf über den Artikelstamm dieser Feld bearbeitet wird? Dies kann ja u. U. auch eine Änderung Eurer Nav-Lösung sein.

Evt. musst Du auch Prüfen, ob ein Modify-Trigger existiert.

Gruss Raimond

Re: Modify richtig benutzen

24. August 2010 10:08

Hallo, Raimond!

In der Tat, ich denke im Code der Strukturplanzeile liegt der Hase begraben. Anscheinend wird "Gesperrt" dort wieder zurückgesetzt. Aber an "OnModify" scheint es nicht zu liegen.
Es existiert Code im Modify-Trigger. Umgehe den so:
Code:
//Anfang des Triggers:

FindHeader;
IF StrucPlanLine.Blocked  THEN Blockedtwo := TRUE;       //hier lese ich TRUE in eine Variable ein
...
//und am Ende:

IF  (Blockedtwo = TRUE) THEN
  BEGIN
  StrucPlanLine.Blocked:=TRUE;                                     //hier lese ich die Variable zurück in die Strukturplanzeile
  StrucPlanLine.MODIFY;
  END;


Führt aber nicht zum gewünschten Ergebnis..

Gibt es einen Kniff im Code - der ziemlich lang ist - wie ich eventuelles Zurücksetzen umgehen kann?
Liebe Grüße, Maike

Re: Modify richtig benutzen

24. August 2010 10:21

Der Trigger OnModify wird eh nur bei einem modify(true) durchlaufen.

Kann es sein, dass das Feld Blocked ein Flowfield ist? Dann wäre das Verhalten nämlich genau wie beschrieben.

Re: Modify richtig benutzen

24. August 2010 10:41

Hallo, McLane!

Naja, ich habe ja StrucPlanLine.MODIFY durchgeführt.
Nein, Blocked ist genau wie StrucPlanLine.Blocked ein Boolean-Wert..

Irgendwelche anderen Ideen?

Maike

Re: Modify richtig benutzen

24. August 2010 10:48

Maike hat geschrieben:Nein, Blocked ist genau wie StrucPlanLine.Blocked ein Boolean-Wert..

Das war nicht McClanes Frage ;-)
Weißt du, was ein FlowField ist und wie man es erkennt?

Re: Modify richtig benutzen

25. August 2010 08:52

Hallo, Natalie!

Soweit ich weiß, zeigt ein FlowField das Ergebnis einer Berechnung an, weswegen dafür der Datentyp auf FlowFields gesetzt werden muss. Bei einer Verwendung in einer Codeunit müsste man hierfür die CalcFormula-Funktion verwenden. Da der Datentyp ein Boolean-Wert ist und nichts berechnet wird, kommt das hier nicht in Frage.
Oder liege ich da falsch?

Grüße, Maike

Re: Modify richtig benutzen

25. August 2010 09:00

Maike hat geschrieben:Soweit ich weiß, zeigt ein FlowField das Ergebnis einer Berechnung an,

Richtig.

weswegen dafür der Datentyp auf FlowFields gesetzt werden muss.

Falsch. Der Datentyp entspricht dem Wert, der berechnet werden soll, so wie bei einem normalen Feld auch: Ein FlowField, dass anzeigen soll, ob etwas existiert, ist als Boolean deklariert. Ein FlowField, das vielleicht eine Bezeichung anzeigt, könnte Text 30 sein.
Ob FlowField oder nicht, wird über die Eigenschaft FieldClass gesteuert. Schau mal bei deinem Feld nach, ob der FieldClass bei dir FlowField ist.

Bei einer Verwendung in einer Codeunit müsste man hierfür die CalcFormula-Funktion verwenden.

Falsch. Die CalcFormula wird in der Feld-Eigenschaft gesetzt, gleich nachdem man das Feld alsl FieldClass = FlowField deklariert hat. Dies ist ein Muss. Du darfst nicht ein FlowField ohne CalcFormula deklarieren. Nur so ist gewährleistet, dass das FlowField etwas anzeigt, wenn du es in einer Form einbettest.
Möchtest du den Wert eines FlowFields per Quelltext auslesen (z.B. in der Codeunit), so rufst du auf
Code:
DeinRec.CALCFIELDS("Name des FlowFields");

Re: Modify richtig benutzen

25. August 2010 09:13

Hallo, Natalie!

Ja, in der Tat, Mit CALCFIELDS wird der - zuvor berechnete- Wert des FlowFields ausgelesen. Das meinte ich, habe ich jetzt aber erst richtig verstanden, Danke. Leider ist bei meinem Feld die FieldClass auf <Normal> gesetzt...

LG, Maike

Re: Modify richtig benutzen

25. August 2010 09:41

Maike hat geschrieben:Leider ist bei meinem Feld die FieldClass auf <Normal> gesetzt...

Schade eigentlich :wink:

So viel bleibt dann nicht mehr ... ist dein Record vielleicht temporär? Oder gibt es eine Tabelle, die deiner Strukturplanzeile ganz ähnlich ist (archivierte Strukturplanzeilen zB), und du hast dein Record auf die falsche Tabelle gesetzt? (Leider kann ich das nicht nachschauen, da die Tabelle nicht im Standard ist)

Aber Kaffeesatzlesen ist auch nicht das Wahre. Gib doch mal den ganzen Code.

Re: Modify richtig benutzen

25. August 2010 11:17

Hallo, McLane!

Willst Du Dir wirklich den ganzen Code antun? Sehr nett von Dir - bin aber mittlerweile eher auf der Schiene, dass das Problem eher in dem Code der Strukturplanzeile - das ist die Table, auf die zugegriffen wird - zu finden ist. Der Code dafür ist leider 109 Seiten lang, und da bin ich noch zu keinem Ergebnis gekommen...

Grüße, Maike
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Modify richtig benutzen

25. August 2010 11:29

Nein, 100 Seiten will ich nicht unbedingt lesen :wink:

Fangen wir evtl. doch anders an. Wenn du testweise ein neues Objekt erstellt - wegen mir auch eine Form, brauchst du ja nicht mal speichern - und da ein get auf irgendeine existierende Zeile deiner Tabelle machst, den Inhalt des Feldes Blocked änderst und dann ein modify - wird das dann in der Tabelle gespeichert? Nur zur Klärung, ob es grundsätzlich funktioniert.

Re: Modify richtig benutzen

25. August 2010 11:35

Ist das die Codestelle?
Code:
// Gesperrt, wenn versucht wird zu buchen, obwohl die Prognose Menge schon VORHER um 120% bzw 100% ausgeschöpft wurde.
IF (RessourceValue) >= (StrucPlanLine."Prognosis Quantity" * (Multiplier))THEN BEGIN
  StrucPlanLine.Blocked := TRUE;
  StrucPlanLine.MODIFY;
  ERROR ('Sie dürfen nichts mehr buchen. Zeile gesperrt. StrucPlanLine.Blocked = %1', StrucPlanLine.Blocked);
END;

Der Error nach dem modify macht natürlich alles bis dahin Durchgeführte rückgängig. Wurde doch oben schon mal erwähnt, oder?