[Gelöst] - Probleme beim Variabeln übergeben

23. August 2006 13:45

So, hier mal wieder ein Problem von mir:

Ich soll ja 2 Datensätze miteinander vergleichen,soweit so gut:

Diese Datensätze sind in einer Tabelle gespeichert,
sind gekennzeichnet durch einen Code.
Ich habe eine Mainform(MF1), in der kann ich Datensätze importieren, exportieren und den ersten Datensatz aussuchen den ich mit nem andren vergleichen will.


Durch einen Button soll die Fieldcaption vom Codefeld an eine andre Mainform übergeben werden(MF2).
Ausserdem gibt es noch eine zweite Tabelle(CT), in der alle Codes gelistet sind, mit einlesedatum, zeit, beschreibung...

In der MF2 sind zwei Subformen (SF1, SF2), MF2 hat als SourceTable die CT, SF1 soll nach dem Code der von MF1 übergeben wurde gefiltert werden,
also übergebe ich durch eine Function den Code in einer Variablen.
SF2 wird durch die SourceTable von MF2 gefiltert.

Problem:

In SF1 habe ich ebenfalls eine Function damit ich diese gleich filtern kann,
aber es wird nix übergeben, obwohl der Code eigentlich richtig sein müsste..

Hier mal der Code:


SF1:
Function: gDefCode mit dem Parameter lDefCode [Code, 10]
Variable: gVarCode [Code, 10]

Code:

Code:
Form - OnOpenForm()
Rec.SETFILTER(Code,gVarCode);


gDefCode(lDefCode : Code[10])
gVarCode := lDefCode;


MF2:
Function: gFncCode mit dem Parameter lParCode [Code, 10]
Variable: gVarCode [Code, 10]
Variable: gFrmSb1 [Form, SF1]

Code:

Code:
Form - OnOpenForm()
gFrmSB1.gDefCode(gVarCode);


gFncCode(lParCode : Code[10]) : Decimal
gVarCode := lParCode;



Na - warum geht das nicht?
Falscher Trigger?
Irgendwas nicht beachtet?

Hoffe auf eure Hilfe..

23. August 2006 16:57

Hallo Danis

Das oder ähnlich gelagerte Probleme wurden bereits hier diskutiert. Probier doch mal die Suchfunktion aus. Da findest du diverse Beiträge wie:

Filter Mainform Subform

Was mich auf jeden Fall falsch scheint ist der Ansatz, die Lösung auf OnOpenForm auszuführen. Dieser Trigger wird nur einmal beim Aufruf des Form ausgeführt. Wenn du dann den Record wechselt, funktioniert das nicht mehr.

24. August 2006 08:38

Guten Morgen Roger,
sicher - die suche habe ich natürlich schon benutzt, doch - das Problem wie ich es habe kann ich mit den Lösungsansätzen bzw Tips die dort beschrieben sind leider nicht lösen..

Und: Ich wechsel ja den Record gar nicht, anbei mal ein Screenshot der (hoffentlich) mein Problem verdeutlicht!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

24. August 2006 08:49

Hallo Danis

Wenn ich deinen Screenshot richtig interpretiere, dann rufst du aus einem Form heraus ein zweites auf. Das wäre dann aber nicht ein Subform im Sinne von Navision, sondern ein verlinktes Form, also eine Form, die in Abhängigkeit von einem anderen aufgerufen wird.

Also ich würde das so lösen:
Auf dem Mainform in den Funktionen ein MenuItem definieren und dort in den Propertys angeben:
PushAction = RunObject
RunObject = Name es aufzurufenden Forms
RunFormLink = Feldverbindungen eintragen

Dann sollte das aufgerufene Form automatisch richtig gefiltert sein

24. August 2006 09:00

wann rufst du denn die Funktinen gDefCode und gFncCode auf?
und wie rufst du sie auf?
ist z.B. sichergestellt, dass auch die Instanz der Form, die geöffnet wird, die Parameter erhält?

also z.B. der aufruf

mf2.sf1.form.gDefCode(parameter);
mf2.sf2.form.gFncCode(parameter);
mf2.runmodal

oder wie machst du das?

24. August 2006 09:28

Also:
Ja Rotsch, ich rufe von einer Form ein Zweites auf,
aber das Zweite Form hat 2 Subformen,
wobei nur die eine der Subformen mit der Form in verbindung steht.

Ich weiss nicht wirklich wie ich das ausdrücken soll, aber ich denke das ist so schon ganz i.O. und halbwegs verständlich..


So: Nun zu den Funktionen:
Die Funktion gFncCode wird aufgerufen wenn ich auf den Menubutton "Objectstände vergleichen" klicke.

-> gFrmVergM.gFncCode(Rec.Code);

Rec.Code ist der aktuelle Wer im Code Feld, der auch als Filter genutzt werden soll.

Die Zweite Funktion wird dann direkt in der Funktion gFncCode aufgerufen:

-> gFrmSB1.gDefCode(lParCode);

lParCode ist ein Parameter in der Funktion gFncCode,
also wird nun theoretisch der Wert von der gFncCode an die gDefCode übergeben, oder nicht?

Ich glaube mein Problem ist auch, das ich nicht genau weiss in welchem Trigger in der Subform ich den SETFILTER reinhaun soll,
erst war er ja in dem OnOpenForm trigger,
mittlerweile hab ichs mal in den OnAfterGetRecord trigger geschrieben.
Jetzt kommt immer eine Nachfrage mit "Wollen Sie den Datensatz umbenennen? Ja/Nein"

Ich muss zugeben: Ich bin verwirrt.. :shock:

24. August 2006 09:59

In solchen Fällen gehe ich immer folgendermassen vor:

Erstellen einer Funktion in der aufzurufenden Form. An diese Form übergebe ich die Werte, die ich zum Filtern verwenden möchte. In dieser Form setze ich dann die Filter und setzte zum Schluss den Befehlt CurrForm.UPDATE auf, damit das Form aktualisert wird.

In der aufrufenden Form deklariere ich eine Variable vom Typ Form mit der aufzurufenden Form. Auf dieser Variable finde ich dann die Funktion, die mir die Filter setzt. Die rufe ich dann mit den nötigen Parametern auf. Anschliessend starte ich das Form mit FormName.RUN

24. August 2006 10:15

hm, okay, ich weiss nur nicht recht ob das was bringt..

ich hab ja eine form, die startet eine andre form, die wiederrum in dem moment in dem sie gestartet wird an deren subform einen filter geben soll..

Ich grübel schon die ganze zeit ob ich nicht einfach den SubFormView von aussen beeinflussen kann,
aber das geht wohl nicht..

24. August 2006 10:17

Einen Filter im OnAfterGetRecord zu setzen ist zu spät....
Der OnActivate-Trigger wär ne möglichkeit, dann wird es jedesmal, wenn man die Subform anklickt und natürlich auch wenn der Activate Befehl gesendet wird, dein Filter gesetzt.
Sinnvollerweise sollte dann im OnOpenform der MF2 ein Currform.SF1.Form.Activate kommen um den Filter zu setzen. ein Currform.update(false) in der Subform nach dem setzen des Filters hilft, die Änderung auch sichtbar zu machen.
Ich glaube aber, dass du die Funktion zu übergabe nicht über die Mainform.Subform.Form.Funktion Methode sondern direkt auf der Form, die als subform dient. Leider hast du nicht erwähnt, welche Formvariable du wofür verwendest.

24. August 2006 10:20

Wenn du die aufzurufende Form als Variable deklarierst, kann du die Propertie SETTABLEVIEW dieser Form verwenden. Dazu musst du noch eine Table als Variable deklarieren (die Table, die als SourceTable auf der Zieltabelle liegt). Dann kannst du die Table mit jedem beliebigen Filter belegen und die gefilterte Table an SETTABLEVIEW weitergeben. Die Zielform wird dann entsprechend gefiltert

24. August 2006 12:09

so habs nu gelöst - wusste nicht das man durch eine aussenstehende form kein update erzwingen kann,
die funktion wird zwar angeboten aber sie funktioniert nicht..

naja - durch ne weitere functin die dann den update befehl ausführt funktioniert jetzt alles so wies soll!
vielen danke für eure mühe!

24. August 2006 12:13

Mich würde noch interessieren, welche Funktion das ist, die zwar angeboten wird, aber nicht funktioniert. Kannst du das bitte noch mitteilen?

Und wie konkret hast du dein Problem jetzt gelöst? Kannst du dazu noch ein paar Worte schreiben für andere, die diese Diskussion mal lesen werden. Das wäre nett.

24. August 2006 16:43

Klar doch!

Also:

In meiner zweiten MF hab ich ja zwei Subforms,
Subform1 hab ich dann eine Bezeichnung gegeben, damit ich auf diese über den Code zugreifen kann.

So, dann wollte ich halt einen Update machen -> F5 gedrückt

Dann:

CurrForm -> Controls -> Subform1 -> Functions -> Update
Das sieht dann im COde folgendermaßen aus:

CurrForm.cSubfBaseObjState.UPDATE;

Geht aber nich, keine Ahnung warum.

Also wie folgt gelöst:
In der SF eine Function, die den Befehl
CurrForm.Update;
aufruft.


Und dann Anstatt, dass ich gleich n Update versuche rufe ich die Function auf:


CurrForm.cSubfBaseObjState.FORM.Function();


So einfach wars :)