[Gelöst] Valid. und Mod. wird ausgeführt. Aber passiert nix.

4. Januar 2008 13:58

Hallo,

ich habe folgenden Code in einem Report

Code:
IF Customer.Passwort = '' THEN BEGIN
         WITH Customer DO BEGIN
              VALIDATE(Passwort,password); //password ist eine globale Variable die das Passwort enthält
              MODIFY;
         END;
      END;


Wenn ich mit Hilfe von Message prüfe ob der Code durchlaufen wird, scheint es auch zu funktionieren.
Der Report erstellt eine XML Datei in der auch das Passwort ausgegeben wird. ABER das Passwort scheint nie in der Tabelle zu landen :-( Nach meinen Navision Kenntnissen ist der obige Code doch richtig.. oder nicht?

Hat jemand vielleicht ne Idee?
Zuletzt geändert von Heike Bennerscheid am 9. Januar 2008 09:32, insgesamt 1-mal geändert.

4. Januar 2008 14:02

//password ist eine globale Variable die das Passwort enthält


Was hat password zur Laufzeit für einen Wert?

4. Januar 2008 14:07

password ist zurerst leer. Dann wird password der Wert aus Customer.Passwort zugewiesen. Wenn dieses leer ist wird ein Passwort mit einem Passwort generator generiert und dieses dann der Variable zugewiesen.

Das ist ja alles nicht das Problem. Wie gesagt ich hab mir das mit Message ausgeben lassen. Sogar an mehreren Stellen weil ich dachte vielleicht wird die Variable irgendwo geleert wo sie nicht geleert werden soll. Aber die Variable ist zu jeder Zeit gefüllt bis sie an der von mir gewählten Stelle wieder geleert wird.

4. Januar 2008 14:14

Stoppe mit einem Debugger an der Stelle VALIDATE. Welcher Customer ist da am Wickel? Welchen Wert hat Passwort vorher, welchen nachher?
Wenn das alles mit korrekten Inhalten durchläuft, dann kommt folgndes in Betracht:

Irgendwann danach wird ein ERROR('') ausgeführt (keine sichtbare Fehlermeldung, aber ein Rollback wird ausgeführt)
oder an einer späteren Stelle wird der Customer wieder zurück geändert.

4. Januar 2008 14:17

Da stellt sich mir nur schon vorher die Frage: Wieso? Wenn ich einen Debitor neu anlege, er also noch gar kein Passwort hat und ich dann den Report ausführe, dann macht er ja alles korrekt. Es ist nur wenn ich bei einem bestehenden Debitor das Passwort lösche und dann den Report ausführe. Aber naja.. ich werde mal den Debugger "befragen" (auch wenn ich meist noch zu blöd bin dieses richtig zu verwenden).

Nachtrag:

Der Debugger zeigt den richtigen Debitor an. Und die Variable ist auch richtig gefüllt.

So komische Sachen passieren auch nur mir :-(

4. Januar 2008 14:24

Heike Bennerscheid hat geschrieben: wenn ich bei einem bestehenden Debitor das Passwort lösche und dann den Report ausführe.


Das hört sich doch stark nach einer deiner letzten Fragen an:
Wann rufst du den Report auf? Vor oder nach dem MODIFY?
Wenn der Reportaufruf im OnModify-Trigger statt findet, ist es noch zu früh. Dann müsstest du davor extra ein MODIFY; schreiben.

4. Januar 2008 14:25

Der Debugger zeigt den richtigen Debitor an. Und die Variable ist auch richtig gefüllt.


Auch nach dem Modify?

4. Januar 2008 14:31

@Natalie

Ja der Report wird im OnModify Trigger ausgeführt. Und vor dem Report steht ein MODIFY.

@MrBurns

Soweit hab ich den Debugger nicht laufen lassen. Werd ich gleich nach der Mittagspause machen.

4. Januar 2008 14:33

Werd ich gleich nach der Mittagspause machen

Guten Appetit. :wink:

4. Januar 2008 15:27

MrBurns hat geschrieben:
Werd ich gleich nach der Mittagspause machen

Guten Appetit. :wink:


Danke :wink:

Ich habe den Debugger nochmal laufen lassen. Wenn ich alles richtig gemacht habe (bin mir bei dem Debugger nie so sicher) ist nach dem MODIFY das Variable auch richtig gefüllt.

Habe auchnochmal ein MESSAGE nachdem Modify ausgeführt. Da ist die Variable auch gefüllt.

4. Januar 2008 15:45

Steht der Aufruf des Reports ganz am Ende des OnModify-Triggers oder passiert danach noch etwas? Wenn ja, was?

4. Januar 2008 15:51

Nach dem Aufruf kommt noch folgender Code:

Code:
IF WebSite.FIND('-') THEN
  SynchMgt.ModifyCustomer(Rec,xRec);

4. Januar 2008 16:25

Vielleicht mach ich ja irgendwas falsch... Hier mal die Schritte wie das alles funktioniert.

Auf der Debitorenkarte wird das Passwort geändert und durch einen Buttonklick wird der OnModify Trigger der Customer Tabelle ausgeführt.
In der Customer Tabelle im OnModify Trigger wird ein MODIFY ausgeführt wenn bestimme Felder geändert wurden (unter anderem das Passwortfeld).
Nach diesem Modify wird der Report aufgerufen der dann ein neues Passwort generiert, dies in eine XML Datei schreibt und eigentlich das Passwort in der Customer Tabelle aktualisieren soll. Aber der letzte Schritt funktioniert irgendwie nicht. Sind das zu viele VALIDATEs? Oder zu viele MODIFYs? Irgendwie blick ich grad selbst nicht ganz durch.

Nachtrag:

Ich weiß nicht genau was es ist.. aber irgendwas scheint er nicht zu mögen. Ich habe meinen Code jetzt mit MESSAGES gespickt. Er geht in den Report rein füllt dort die Variable, validiert das Passwort (Variable und Customer.Passwort werden gefüllt angezeigt), führt den Modify aus.. geht dann durch den OnModify Trigger der CustomerTabelle, wenn er fertig íst wieder in den Report (der muss ja noch fertig ausgeführt werden) und anschließend geht er wieder in den OnModify Trigger und führt den rest vom ersten durchlauf aus.. und dort ist dann Customer.Passwort plötzlich wieder leer :-x Vorher war es die ganze Zeit gefüllt.. erst nachdem er den Report verlassen hat und den OnModify Trigger vom "ersten Durchlauf" weiter macht, wird das Feld gelöscht/geleert. Ich weiß nur nicht wieso...
Zuletzt geändert von Heike Bennerscheid am 4. Januar 2008 17:14, insgesamt 1-mal geändert.

4. Januar 2008 17:10

Code: ‹ markieren › ‹ einklappen ›
IF Customer.Passwort = '' THEN BEGIN
WITH Customer DO BEGIN
VALIDATE(Passwort,password); //password ist eine globale Variable die das Passwort enthält
MODIFY;
END;
END;


Dieser Code steht im OnModify-Trigger des Customers?
Dann kann es natürlich sein, dass durch den internen Aufruf der Zuweisung und des Customer.MODIFY das ganze gespeichert wird und beim Abschluss des äußeren OnModify-Trigger das Feld wieder geleert wird. D.h. die äßere Transaktion überschreibt die innere.

Versuch es ohne Customer.MODIFY, in dem im OnModify nur bspw. folgendes steht:
Code:
:
OnModify
IF Customer.Passwort = '' THEN BEGIN
  NewPassword := PasswordGenerator.GetNewPassword  // Pseudocode
  Customer.VALIDATE(Passwort,NewPassword);
END;

4. Januar 2008 17:16

@MrBurns

Es steht nicht ganz im OnModify. Sondern in einem Report der im OnModify aufgerufen wird.

Und wie oben in meinem Nachtrag geschrieben scheint genau das zu passieren was du grad sagst.

Den Modify im Report hatte ich auch schon weg gelassen. Er überklatscht es aber trotzdem.

4. Januar 2008 17:22

Wo wird denn der OnModify aufgerufen? In einer Form?

Das Problem ist folgendes:
- Transaktion 1 gestartet: OnModify
- Transaktion 1.1 gestartet: Report
- Transaktion 1.1.1 gestartet: Report - Customer.MODFIY
- Transaktion 1.1.1 beendet: Report - Customer.MODFIY
- Transaktion 1.1 beendet: Report
- Transaktion 1 beendet: OnModify
Dieser Transaktionsbaum endet erst mit der äußeren Transaktion.


Versuch den Aufruf des Reports nach dem OnModify, also auf gleicher Ebene zu starten.

4. Januar 2008 17:51

Ist nur die Frage: Wie? Es gibt ja leider immer noch keinen OnAfterModify Trigger :-(

4. Januar 2008 17:55

Was für ein Objekt ruft den OnModify direkt oder indirekt auf?

4. Januar 2008 17:59

Einen Report. Vorher werden noch Filter gesetzt.

Code:
   CLEAR(CustomerProfile);
   Cust.RESET;
   Cust.SETRANGE("No.","No.");
   Cust.SETFILTER("E-Mail",'<>%1','');
   Cust.SETFILTER(Blocked,'=%1 | =%2',0,2);
   CustomerProfile.SETTABLEVIEW(Cust);
   CustomerProfile.RUN;

4. Januar 2008 18:03

In dem CustomerProfile.RUN steht dann irgendwo ein Cust.MODIFY(TRUE).
Danach kannst Du einen Report bspw. reinhängen oder den Code z.B. so ausführen
Code:
IF Cust.Password = '' THEN BEGIN
 ...
END;
Cust.MODIFY(TRUE);

4. Januar 2008 18:05

CustomerProfile.RUN IST ja der Report.

4. Januar 2008 18:25

Ich hätte es jedenfalls so formuliert:

Code:
IF ("E-Mail" <> '') AND (Blocked IN [0,2]) THEN BEGIN
   Cust.RESET;
   Cust.SETRANGE("No.","No.");
   CLEAR(CustomerProfile);
   CustomerProfile.SETTABLEVIEW(Cust);
   CustomerProfile.RUN;
END;

Aber das hat mit deinem Problem nichts zu tun.

4. Januar 2008 18:32

CustomerProfile.RUN IST ja der Report.

In dem Report hast Du ja ein DataItem Customer und dort machst Du ein MODIFY(TRUE) und nach dem MODIFY(TRUE) kannst Du den anderen Code ausführen, so dass er auf gleicher Transaktionsbene wie das MODIFY ist und nicht ineinander verschachtelt ist.

7. Januar 2008 10:17

Ich weiß nicht ob es zu früh am Morgen ist oder ob ich einfach zu blöd bin :-( irgendwie versteh ich das nicht ganz.

Soll ich jetzt im Report als aller erstes ein MODIFY(TRUE) machen und dann erst den restlichen Code, oder wie?

7. Januar 2008 10:32

Ob der Code vor oder nach dem Modify auftritt ist, wenn man die überflüssige zweite Schreiboperation unberücksichtigt lässt, irrelevant.
Wichtig ist nur, dass der Code auf derselben Transaktionsebene im selben Objekt wie der erste Modify(true) ausgeführt wird und nicht indirekt über ein anderes Objekt.