[GELÖST] Command Button ein und ausblenden

7. März 2007 16:58

Hallo Leute,

habe ein Formular, wenn ich durch dieses blättere soll er mir in 2 Feldern überprüfen ob da was drin steht und falls in beiden Feldern was steht soll er mir einen Command Button auf Visible stellen. (Der Button ist auf visible "nein" eingestellt).

Momentan habe ich den Code beim Validate drin (Der Command-Button heisst "WARENEINGANG":


Code:
IF Artikelnummer <> '' THEN BEGIN
  IF KUNUMMER <> 0 THEN
CurrForm.WARENEINGANG.VISIBLE(TRUE);
END ELSE BEGIN
CurrForm.WARENEINGANG.VISIBLE(FALSE);
END;


Wenn ich jetzt durchblättere zeigt er mir den Button nie an. Nur wenn ich eben eines der beiden Felder validiere, aber ich möchte ja bereits beim blättern das so haben das der button angezeigt wird je datensatz oder eben nicht.

Kann ich den Code überhaupt so nehmen? gibt es einen Trigger der beim Blättern in einen anderen Datensatz aufgerufen wird?
Zuletzt geändert von tesarolle am 8. März 2007 15:09, insgesamt 1-mal geändert.

7. März 2007 17:02

Wenn du den Code beim OnValidate der Felder drin hast, dann wird der C/AL-Code auch nur dann ausgeführt und der Command Button ein- bzw. ausgeblendet.

Pack deinen C/AL-Code in den OnAfterGetRecord-Trigger der Form.

Noch ein Tipp: Du könntest den C/AL-Code auch wiefolgt abkürzen:
Code:
CurrForm.WARENEINGANG.VISIBLE((Artikelnummer <> '') AND (KUNUMMER <> 0));

Gruß, Marc

7. März 2007 17:28

Marc Teuber hat geschrieben:Pack deinen C/AL-Code in den OnAfterGetRecord-Trigger der Form.


Wäre nicht OnAfterGetCurrentRecord besser?

7. März 2007 17:54

rotsch hat geschrieben:Wäre nicht OnAfterGetCurrentRecord besser?

Ja, da gebe ich dir Recht. Somit wird der CommandButton z. B. wenn ein leerer Datensatz angezeigt wird (F3) ausgeblendet. Oder gibt es noch andere Situationen (Ereignisse) wo der OnAfterGetCurrRecord aufgerufen wird?

Gruß, Marc

7. März 2007 18:13

Ich meinte auch vor allem deshalb, weil ja der OnAfterGetRecord auf allen Datensätzen ausgeführt wird, wenn eine Listform aufgerufen wird. Und ich bin dann nicht sicher, ob der Button aufgrund des richtigen (ersten) Records ein/ausgeblendet wird, oder ob dies aufgrund des letzten angezeigten Records geschieht.

8. März 2007 15:08

der OnAfterGetCurrRecord ist besser, da klappt es immer!

Vielen Dank Euch beiden!

Wie immer!

26. Oktober 2007 12:01

Ich hab ein ähnliches Problem. Aber egal in welchem Trigger ich meinen Code packe (siehe unten) das Feld erscheint einfach nicht. "Autom. Bestellbestätigung" ist ein Control mit einem Label und einer Checkbox.

Code:
IF "Vermittler Nr." <> '' THEN
CurrForm."Autom. Bestellbestätigung".VISIBLE(TRUE);

26. Oktober 2007 12:46

wann wird das Feld "Vermittler Nr." denn gefüllt.

26. Oktober 2007 12:52

Sobald ein Kontakt geladen wird der eine Vermittlernummer beinhaltet.

26. Oktober 2007 13:07

Setz mal einen Brakepoint auf dein Codestück und finde mit dem Debugger heraus, ob der Code überhaupt durchlaufen wird und ob die Vermittlernummer tatsächlich <> '' ist.

26. Oktober 2007 13:28

Er geht noch nicht mal in den Code rein -.- Das scheint aber an dem Code zu liegen der davor steht. (Der ist nicht von mir) Im OnAfterGetRecord ist ein SETRANGE und im OnAfterGetCurrRecord wird eine Funktion aufgerufen.
Ich werde mal versuchen was passiert wenn ich meine Abfrage vor den vorhanden Code schreibe.

Nachtrag:

Irgendwie versteh ich den Debugger nicht. Egal wo ich rein gehe er Zeigt mir nix an. Also ich seh nirgendwo das irgendwelche Sachen gefüllt werden oder ähnliches. Bin ich zu sehr Visual Studio Debugger gewohnt? Ich versteh das prinzip von dem Navision Debugger irgendwie nicht wirklich :roll:

26. Oktober 2007 13:47

rotsch hat geschrieben:Ich meinte auch vor allem deshalb, weil ja der OnAfterGetRecord auf allen Datensätzen ausgeführt wird, wenn eine Listform aufgerufen wird. Und ich bin dann nicht sicher, ob der Button aufgrund des richtigen (ersten) Records ein/ausgeblendet wird, oder ob dies aufgrund des letzten angezeigten Records geschieht.


Ich glaube das stimmt nicht ganz:
Meines Wissens wird der OnAfterGetRecord auf allen angezeigten Records in der Liste durchlaufen. Will heissen, sind mehr Datensätze vorhanden als die auf dem Bildschirm angezeigten, wird der Trigger fuer diese nicht durchlaufen. Scrollt man dann, kommen neue Datensätze und der Trigger wird erst dann bei diesen aufgerufen. Aber ist ja ne Kleinigkeit.

26. Oktober 2007 14:07

setz sicherheitshalber mal vor deinen Befehl einfach eine Message
Message('%1',vermittlernr);
nur um mal zu sehen ob er da ankommt oder nicht (unabhängig vom debugger.

26. Oktober 2007 14:17

Werd ich mal machen.

Ich bin jetzt aber zu dem Ergebnis gekommen das ich den Debugger nicht mag.

Mein Code sieht jetzt so aus:

Code:
//IF "Vermittler Nr." <> '' THEN

CurrForm."Autom. Bestellbestätigung".VISIBLE(TRUE);

EnableFields;


Ich habe einfach mal die IF Anweisung ausgeklammert um zu sehen ob er es überhaupt Visible setzt (was er aber auch nicht tut). Dann habe ich vor dem CurrForm... Code einen Breakpoint gesetzt. Den macht er aber einfach weg und setzt ihn vor das EnableFields. Und ich hab keine Ahnung wieso *seufz*

Nachtrag:

Die Message mit der Vermittlernummer gibt er Korrekt aus. Wenn keine Vermittlernummer da ist, steht halt nix dort und wenn eine Vermittlernummer da ist, wird diese auch angezeigt.

26. Oktober 2007 14:25

Was ist mit EnableFields? Wird dort deine Programmierung eventuell übergepinselt?

26. Oktober 2007 14:29

EnableFields ist eine Funktion. In der werden einfach einige Felder von der Form Enabled. Aber ich wüsste nicht das diese Funktion irgendwas mit meinem Feld macht, da die Funktion ja schon vor meinem Feld existierte.

Ich hab das Gefühl das

CurrForm."Autom. Bestellbestätigung".VISIBLE(TRUE);

überhaupt nicht akzeptiert wird. Also es wird ja noch nicht mal ausgeführt wenn die IF Anweisung augeklammert ist. Oder hat eine Funktion vorrang vor dem Code der vor ihr steht? Eigentlich nicht oder?

26. Oktober 2007 14:38

setz dein Programmcode mal spasshalber nach dem Enablefields

26. Oktober 2007 14:41

Er führt das MESSAGE aus. Aber setzt den Control immer noch nicht auf Visible.

26. Oktober 2007 15:07

ist es möglich das dein CurrForm."Autom. Bestellbestätigung" auf das Label zeigt und nicht auf die Checkbox?

26. Oktober 2007 15:13

Also es liegt auf jeden Fall an dem Curr.Form Code. Weil wenn ich folgenden Code habe:

Code:
IF "Vermittler Nr." <> '' THEN BEGIN
MESSAGE('%1',"Vermittler Nr.");
CurrForm."Autom. Bestellbestätigung".VISIBLE(TRUE);
END ELSE
MESSAGE('Keine Vermittler Nr.');


dann gibt er die Messages auch einwandfrei aus.

Eigentlich hatte ich die Checkbox mit einem Addlabel erstellt. Dann ist da ja nochmal so ne gestrichelte Linie um beide Elemente herum. Und das sollte der eigentlich nehmen. Aber wie ich grad gesehen habe, hab ich da wohl was falsch gemacht. Ganzen Stress anscheinend umsonst *narf* Naja.. ich werd dann mal "reparieren" und dann nochmal schauen ob es dann klappt.

26. Oktober 2007 15:16

Ja, jetzt geht es. Ist schon doof wenn man die Falschen Werte nimmt. Trotzdem danke für eure Hilfe.