[gelöst] Filter von Main Form auf Subform übertragen

13. Dezember 2006 17:00

Hallo zusammen,

ich habe eine Frage zu einem Formular. Ich bastel gerade an einem Formular das Beitragsdaten darstellen soll. Dem Beitrag habe ich einen Screenshot des Formulars aus dem Designmodus angehängt. Beide Teile (Kopf und Zeilen) haben den gleichen Sourcetable. Die Felder im Kopf sollen der Filterung dienen. Wenn ich alle obigen Felder im Property RunFormLink hinterlege, funktioniert das zwar, allerdings erst dann, wenn den aktuellen Record verlasse. Welche Einstellung gibt es, damit die Zeilen sofort aktualisiert werden, wenn im Kopf etwas geändert wird? Oder muss ich im OnValidatetrigger des Sourcetables den Code hinterlegen?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von mgerhartz am 19. Dezember 2006 17:22, insgesamt 1-mal geändert.

13. Dezember 2006 17:42

Wie wäre es, wenn ich im oberen Teil Variablen des Typs Option anstelle der Felder der gleichen Tabelle verwende? Allerdings frage ich mich, wo ich dann die Filter (Setfilter etc.) setze. Direkt im OnValidate Trigger des entsprechenden Formularfeldes?

13. Dezember 2006 17:43

Hallo,
so wie es aus dem Bild zu erkennen ist, benutzt du eine Subform?!
Normalerweise werden nur die folgenden Properties für eine Subform benötigt:
SubformID --> Diese Zeigt auf deine Subform
SubFormLink --> Hier gibst du den Link ein zwischen deiner Mainform und der Subform ein.
SubFormView --> Diesen kannst du Optional angeben um die Sortierung und Filterung an die Subform zu übergeben.
Wo hast du den RunFormLink hinterlegt?

Währe eine Tablebox nicht ausreichend?
Ein paar Infos mehr währen hilfreich.
Gruß Mikka

13. Dezember 2006 17:51

Hi Mikka,

also der Plan ist folgender. Ich möchte im oberen Formularbereich verschiedene Filter anbieten. Diese Filterfelder sind Optionfelder. Entsprechend der Eingabe, sollen dann die Werte in den Zeilen (Sub-Form) gefiltert werden. Und möglichst direkt nach der Validierung des geänderten Wertes in den Filterfeldern.

13. Dezember 2006 18:03

Ahh es werde Licht :-)

Hier ein Beispiel:
Um die Subform zu Filtern, erstelle in der Subform eine Funktion (z.B. Filtere(Anzeigen: Boolean)), die einen Parameter erwartet. In dieser wird der gewünschte Filter hinterlegt.

Gebe der Subfom (In deiner Mainform!) einen Namen z.B. SForm
Auf einem Button gibst du dann folgenden Code ein
Code:
CurrForm.SForm.FORM.Filtere(FALSE);

(Es geht leichter den Code über das C/AL Symbol Menü einzufügen!)

In diesen Beispiel wurde von der Mainform aus die Funktion in der Subform aufgerufen um den Filter auszuführen.

Ich hoffe das es Verständlich war.
Gruß Mikka

Nachtrag:
Wenn du natürlich nur einen Wert änderst, der eine Filterung auslösen soll, muss das auf dem OnAfterValidate Trigger geschehen des entsprechenden Feldes.

13. Dezember 2006 18:50

Nimm doch einfach das VK-Preise-Formular, das an den Artikeln hängt. Da hast du ein Beispiel für
- oben Filterkriterien
- unten sofort Ergebnis.

14. Dezember 2006 13:10

Hi Mikka,

danke für Deinen Tipp. Ich habe folgendes ausprobiert:

- Auf der Mainform Felder zum filtern erstellt. Sourceexpression ist jeweils eine Variable
- Im OnAfterValidate Trigger des Feldes rufe ich eine Funktion auf. Diese ist in der SubForm hinterlegt. Ich übergebe Gliederungsnummer, Kontaktnummer und Zuwendungsart als Parameter.
- Die Funktion sieht so aus:

Code:
Zuwendungsartfilter(Gliederungnummer_p : Code[8];Kundennummer_p : Code[20];Zuwendungsart_p : Integer)


SETFILTER("Beitrag für Gliederung",'%1',Gliederungnummer_p);
IF FIND('-') THEN
  SETFILTER("Beitrag von Kontakt",'%1',Kundennummer_p);
  IF FIND('-') THEN
    BEGIN
      CASE Zuwendungsart_p OF
     
      1:
     
      SETFILTER(Zuwendungsart,'%1',Zuwendungsart::Beitrag);
   
      2:

      SETFILTER(Zuwendungsart,'%1',Zuwendungsart::Sonderbeitrag);
   
      3:
       
      SETFILTER(Zuwendungsart,'%1',Zuwendungsart::Patenbeitrag);
      END;
      FIND('+');
    END;


Der Parameter Zuwendungsart_p ist vom Typ Integer.

So sieht der Code im OnAfterValidateTrigger des Feldes Zuwendungsart aus:

Code:
Case Zuwendungsart of

  Zuwendungsart::Beitrag:
    EinzugvorschlagSUB.Zuwendungsartfilter("Beitrag für Gliederung","Beitrag von Kontakt",1);

  Zuwendungsart::Sonderbeitrag:
    EinzugvorschlagSUB.Zuwendungsartfilter("Beitrag für Gliederung","Beitrag von Kontakt",2);

  Zuwendungsart::Patenbeitrag:
    EinzugvorschlagSUB.Zuwendungsartfilter("Beitrag für Gliederung","Beitrag von Kontakt",3);

end;


Kann man das so machen? Jedenfalls wird nicht richtig gefiltert. Habe den Codecoverage laufen lassen und der zeigt mir an, dass immer nur diese Zeile ausgeführt wird:

Code:
3:
       
      SETFILTER(Zuwendungsart,'%1',Zuwendungsart::Patenbeitrag);


Gefiltert wird also nicht.

14. Dezember 2006 13:15

Ich sehe gerade im Codecoverage, dass die der OnAfterValidate Trigger gar nicht aufgerufen wird??? Aber trotzdem wird die Funktion in der Subform aufgerufen. Aber eben immer nur die letzte Option.

14. Dezember 2006 15:17

Hi Natalie,

könntest Du mir die Objekt ID nennen? Ich finde weder in unserer Kunden- noch in der Chronus DB ein Formular mit der entsprechenden Bezeichnung. Danke!

14. Dezember 2006 15:29

Form 7002
(wird auf der Artikelkarte aufgerufen über Verkauf --> Preise)

19. Dezember 2006 10:19

Da bin ich wieder :wink:

Ich habe mir wie von Natalie die Form 7002 als Beispiel angesehen. Ich denke genau solch ein Formular möchte ich basteln. Ich verwende jetzt anstelle einer Subform eine Tablebox und möchte über der Box Filterfelder (Textbox) einsetzen. Hierfür muss ich für die Filterfelder mehrere Lookups selbst programmieren.

Der Sourcetabel der Tablebox ist die Tabelle "Beitrag Journal". Die Filterfelder sollen folgende sein:

- Gliederungsnummer (Sourcetable: Structure) Lookup
- Kontaktnummer (Sourcetable: Contact) Lookup
- Saldo (Optionsfeld: 0 = Alle, 1 = >0)
- Zuwendungsart: (Optionsfeld: 0 = Alle, 1 = Beitrag etc.)

Bisher habe ich noch keinen Lookup selbst programmiert und würde mich freuen, wenn mir jemand unter die Arme greifen würde. Vielleicht an einem Beispiel zur Gliederungsnummer.

Ich fasse mal zusammen, was ich soweit verstanden habe.

Als Filterfeld setze ich eine Textbox ein. Dieser weise ich eine Variable des Typs "Text" (Gliederungsnummer) als Sourceexpression zu. Dann brauche ich noch eine Recordvariable mit Subtype: Structure und eine Formvariable des Subtypes Structure List. Das Formular Structure List ist in den Properties der Tabelle Structure als "LookupFormID" eingetragen.

Der Code im OnLookup Trigger des Filterfeldes (Gliederungsnummer: Text, 250) könnte so aussehen:

Code:
StructureList.LOOKUPMODE := TRUE;
IF StructureList.RUNMODAL = ACTION::LookupOK THEN
  Gliederungsnummer := StructureList.GetSelectionFilter
ELSE
  EXIT(FALSE);


Nun, wenn ich die Form kompilieren, kommt keine Fehlermeldung. Im Filterfeld wird mir allerdings kein Lookup Button angezeigt. Entweder habe ich etwas vergessen oder falsch verstanden.

Bin wie immer für jeden Tipp dankbar.

19. Dezember 2006 12:04

Hat keiner Zeit? Nun ich habe da noch eine andere Frage. Mir ist am Beispiel der Form 7002 folgendes aufgefallen: Im Code des OnLookup Triggers des Feldes ItemNoFilter steht dieser Code:

Code:
ItemList.LOOKUPMODE := TRUE;
IF ItemList.RUNMODAL = ACTION::LookupOK THEN
  Text := ItemList.GetSelectionFilter
ELSE
  EXIT(FALSE);

EXIT(TRUE);


Frage: Woher stamm der Eintrag (ItemList.Lookupmode := True)? Ich dachte immer man müsste eine Variable des Typs Form erstellen. In dem Fall also bspw. "Item List". Ich finde nämlich keine Variable mit dem Namen ItemList.

19. Dezember 2006 12:10

Doch, ItemList ist in dem Trigger als lokale Variable definiert.

19. Dezember 2006 12:24

Hi Natalie,

vielen Dank. Wäre nie darauf gekommen

19. Dezember 2006 13:34

Man sollte IMMER zuerst in den lokalen Variablen suchen.
Das ist allein schon deswegen praktisch, weil du dort selten lange Variablenlisten vorfindest und daher weniger schnell was übersiehst als bei unseren globalen Variablen ...