7. Januar 2008 17:42

Ich hoffe du erschlägst mich jetzt nicht. Aber auch nach mehrfachen lesen versteh ich es irgendwie nicht.

Ich drücke ja auf einen Button der das Passwort ändert. Dadurch wird der OnModify Trigger in der Customer Tabelle ausgeführt. Und dort wird der Report ausgeführt. Und im Report soll ich jetzt ein MODIFY(TRUE) im Customer DataItem einbauen?

7. Januar 2008 17:49

Ich hoffe du erschlägst mich jetzt nicht.

Hier wird keiner erschlagen. :-D

Verstehe ich Dich richtig?
1. Button drücken führt den Report aus
2. Report hat MODIFY(TRUE)

Die Idee kurz skizziert:
1. Den Code aus dem OnModify entfernen: If Customer.Passowrd = '' then ...
2. Im Report von dem Cust-;ODIFY(TRUE) die Abfrage If Cust.Password = '' then ... einbauen.
=> Dadurch haben die beiden Transaktionen (Schreiben und Password generieren) die identische Elterntraksaktion.

7. Januar 2008 17:55

Nicht ganz.

Also der Button macht folgendes:

Code:
WITH Cust DO BEGIN
     VALIDATE(Passwort,Passwort);
     //Hier stand früher noch ein MODIFY
END;


Dadurch wird aber auch der OnModify Trigger der Customer Tabelle ausgeführt.
Dort, nach einem MODIFY, wird folgender Code ausgeführt um den Report aufzurufen

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;


Im Report wird dann unter anderem folgender Code ausgeführt

Code:
IF Customer.Passwort = '' THEN BEGIN
         WITH Customer DO BEGIN
              VALIDATE(Passwort,password);
              //MODIFY; Zur Zeit auskommentiert
         END;
      END;

7. Januar 2008 18:26

Ich nehme an, dass der Button alle leeren Passwörter aller Debitoren füllen soll?

Wenn ja, schlage ich folgende Variante vor:
Im Button ersetzen:
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;



Im Report ersetzen:
Code:
Cust - OnAfterGetRecord
...
IF Cust.Passwort = '' then begin
  NewPassword := ErzeugeNeuesPassword //Aus dem Passworgenerator laden
  Cust.Passwort := NewPassword;
end;
Cust.MODIFY(TRUE);
...


Der Code im OnModity-Trigger ist dann nicht mehr notwendig.

7. Januar 2008 18:29

Ich vermute, dass es hier einfach zuviele "Customer"-Variablen gibt und die letzte gewinnt...

Wenn ich den Ablauf verstanden habe, gibt es
1) die REC-Variable (Wird aus dem Button "aufgerufen")
2) die Variable "Cust", die in T18.OnModify() verwendet wird
3) die Variable "Customer", die das Dataitem oder eine Variable des Reports ist.

Modifiziert werden die REC-Variable durch expliziten MODIFY, bevor der Report aufgerufen wird und dann "Customer" innerhalb des Reports.
Wenn der OnModify-Trigger dann weiter durchlaufen bzw. beendet wird, erfolgt m. E. noch der "Standard"-Modfiy, der dann mit den Werten der REC-Variable (also ohne die Password-Änderung) erfolgt.

Wäre es ein Ansatz, innerhalb des Reports keinen Modify zu machen, sondern dort nur das Password zu erzeugen und dies nach Beenden des Reports per Funktion zu holen und in die REC-Variable einzutragen?
Und wenn dieser Vorgang nur durch das Button-Drücken erfolgen soll und nicht bei jeder Änderung des Customers, könnte man ggf. alles aus dem T18.OnModify auslagern und in eine eigene Funktion legen.

7. Januar 2008 18:31

Okay, zu spät. Aber der Vorschlag von MrBurns geht in Richtung meines Alternativvorschlags :wink:

8. Januar 2008 18:23

Ich würde mal versuchen den Report auf der Form im OnAfterValidateTrigger des Passwort-Feldes aufzurufen, ähnlich wie meine Vorredner(-schreiberInnen) vermute ich, dass du hier in eine Art Instanzproblem reinläufst - so könntest du dich einfach hinten an die Transaktion anhängen.

9. Januar 2008 09:30

Das Problem konnte ich Gestern nach einigem rumm probieren lösen. Ich habe es ähnlich gemacht wie MrBurns vorgeschlagen hat. Musste aber natürlich bei mir noch ein paar andere Anpassungen vornehmen.

Danke euch allen für die Hilfe.

9. Januar 2008 14:04

woger hat geschrieben:Wäre es ein Ansatz, innerhalb des Reports keinen Modify zu machen, sondern dort nur das Password zu erzeugen und dies nach Beenden des Reports per Funktion zu holen und in die REC-Variable einzutragen?


Weiß einer wie das gehen könnte? Steh da irgendwie aufm Schlauch.

9. Januar 2008 14:42

Klar :wink:

Leider weiß ich nicht, wie man diese tollen aufklappbaren Boxen erzeugt, deshalb so ...

Innerhalb des Reports wird doch das neue Password erzeugt. Anstatt den Wert nun der Artikelbeschreibung zuzuweisen, weist man ihn einer globalen Variable zu.
Nun benötigt man im Report noch eine Funktion (z. B. "PasswortHolen) mit einem Übergabeparameter (muss VAR sein), in der diese globale Variable dem Parameter zugewiesen wird.

Eine Recordvariable hast Du schon definiert, dann einfach ...
...
CustomerProfile.RUN;
CustomerProfile.PasswortHolen(NeuesPasswort);

Danach steht das erzeugte Passwort in der Variable NeuesPasswort (oder auch direkt in Customer.Passwort).

Auf ähnlichem Weg kann man auch einem Report vor dem Rep.Run Daten übergeben. Wichtig ist nur, dass man nicht Report.RUN verwendet sondern eine Variable vom Typ Report definiert hat.

9. Januar 2008 15:18

Danke dir.