[Gelöst] Anfänger: Filter übergeben auf Lookup-Liste

8. November 2007 18:47

Hallo Allerseits,

so sehr ich Business-Logik liebe, so sehr hasse ich Oberflächen-Programmierung - insbesondere wenn ich von der Umgebung kaum Ahnung habe....

Also: Für Euch Profis ist's wahrscheinlich trivial, sofern ich nur die richtigen Fragen stelle. :oops:

Ich baue eine ungebundene Form, um einen Code anzustossen. In der Form habe ich ein Feld, in dem eine Artikelnummer angegeben werden soll, für die der Code dann ausgeführt werden soll.

Damit keine Missverständnisse aufkommen: Der "Artikel" steht nicht in der Item, sondern ist ein Datensatz in einer anderen Tabelle ;)

OK, hinter meinem Eingabefeld liegt eine Record-Variable, die auf die entsprechende Kopfdatentabelle zeigt. Da hab ich jetzt auch eine wunderschöne Lookup-Funktion, die mir die Standard-Listensicht der besagten Tabelle zeigt, und durch Doppelklick oder über den OK-Button kann ich da auch meinen Artikel auswählen.

Nu geht's los:
Die Sicht soll eingeschränkt werden auf ein weiteres Attribut dieser Artikel-Tabelle, soll heissen, es sollen nur Artikel des Typs Auto und des Typs Laster angezeigt werden und auswählbar sein - und zwar so, daß der Benutzer den Filter nicht ändern kann.

Jo - ganz einfach: Da nimmt man Filtergroup 2. Aber: Wie geht das???

Ich hab in meiner Form für das Eingabefeld im OnLookup-Trigger den Code implementiert:

Code:
recArtikel.SETFILTER("Typ",'=%1|%2','Auto','Laster');
Form.RUNMODAL(0,recArtikel);


Nu bin ich schon ganz happy, daß die Listenform aufgeht und sogar den Filter richtig gesetzt hat. Aber: Ich kann den Artikel nicht mehr durch Doppelklick auswählen und der OK-Button ist verschwunden!

WARUM?? :cry:

In der Befürchtung, daß die Frage zu unspezifisch ist: Wo muß ich nachgucken, um Erkenntnisse zu gewinnen, damit ich die Frage spezifischer formulieren kann?

Nächste Frage: Wenn ich den Filter nun mit eurer Hilfe hinbekomme, dann verstecke ich ihn einfach mit Filtergroup(2), richtig?

Viele Grüße,

SF


Edit:

Noch eine frage zu diesem Forum: Ich hab versucht, für diesen Thread folgenden Untertitel einzugeben:

Form-->lookup-->automatischer Filter, Filtergroup

Beim Absenden bekomme ich dann immer eine ganz merkwürdige Fehlermeldung, der Beitrag wäre wegen eines Wurms geblockt, oder so.

Warum?
Zuletzt geändert von SafetyFirst am 9. November 2007 16:03, insgesamt 2-mal geändert.

Re: Anfänger-Frage: Filter übergeben auf Lookup-Liste

8. November 2007 19:44

SafetyFirst hat geschrieben:Nu bin ich schon ganz happy, daß die Listenform aufgeht und sogar den Filter richtig gesetzt hat. Aber: Ich kann den Artikel nicht mehr durch Doppelklick auswählen und der OK-Button ist verschwunden!

WARUM?? :cry:

Hi!
Wo genau hast du deinen Code hinterlegt? Wenn in der Form, dann hat diese OnLookup-Programmierung Vorrang ggü. dem, was in der Tabelle im OnLookup-Trigger steht.
Nur durch FORM.RUN(MODAL) gibts keine Lookup-Form. Das musst zu erzwingen. Versuchs mal so:

Code:
recArtikel.SETFILTER("Typ",'=%1|%2','Auto','Laster');
IF FORM.RUNMODAL(0, recArtikel) = Action::LookupOK THEN
  DeinFeld := recArtikel."No."; // oder VALIDATE

9. November 2007 10:57

Natalie,

Du bist meine gute Fee! :-D

Ich hatte meinen Code in den OnLookup-Trigger des Eingabefeldes auf meiner Form gesetzt. Genau Dort habe ich jetzt, wie Du mir geraten hast, den Code gesetzt:


Code:
recArtikel.FILTERGROUP(2);
recArtikel.SETFILTER("Typ",'=%1|%2','Auto','Laster');
recArtikel.FILTERGROUP(0);
IF FORM.RUNMODAL(0, recArtikel) = Action::LookupOK THEN BEGIN
END;


Nun funktioniert es.

Aber: Was passiert denn da jetzt eigentlich? Was ist das für eine Option, die da mit "Action::LookupOK" spezifiziert wird?

Und: Die IF-Anweisung ohne Inhalt stört jetzt etwas mein ästhetischen Empfinden. Du hattest ja vorgeschlagen, ich sollte das Ergebnis der Auswahl erst noch in eine Variable übernehmen, aber scheint gar nicht nötig zu sein, oder?

Schlägst Du alternativ vor, den VALIDATE-Trigger zu durchlaufen? Mit dem Validate kenn ich mich nun gar nicht aus. Ist das dann der Validate-Trigger des Eingabefeldes (in den ich noch nichts programmiert habe)?

Viele Grüße,

SF

9. November 2007 11:44

SafetyFirst hat geschrieben:Du bist meine gute Fee! :-D

lol na DEN Status hat mir hier noch keiner gegeben ;-)))

Aber: Was passiert denn da jetzt eigentlich? Was ist das für eine Option, die da mit "Action::LookupOK" spezifiziert wird?

Grundsätzlich empfehle ich dir, zuallererst die Navision-Onlinehilfe zu bemühen. Da steht sowas nämlich immer drin (und auch ich muss da ständig nachsehen, weil keiner sich alles merken kann).
In dem Augenblick, wo ich den Rückgabewert der Form abfrage (also statt FORM.RUNMODAL(..) -> IF FORM.RUNMODAL(..) = ACTION::XXX THEN weiß die Form, dass sie den OK- und Abbrechen-Button zur Verfügung stellen muss. (Stichwort: "Warum werden mir diese Buttons nicht mehr angezeigt??").

MIT ACTION frage ich ab, welches Ereignis eingetreten ist. Hinter den Buttons OK und Abbrechen liegt hinter der Eigenschaft "PushAction". Ein möglicher Wert davon ist LookupOK - und der liegt hinter dem OK-Button.
Also: Hast du den OK-Button geklickt, dann ist ACTION::LookupOK ausgeführt worden. Und das heißt in einer Lookup-Form ganz einfach, dass du einen Datensatz in der Lookup-Form ausgewählt hast (statt z.B. auf Abbrechen zu klicken oder die Form zu schließen).

Und: Die IF-Anweisung ohne Inhalt stört jetzt etwas mein ästhetischen Empfinden. Du hattest ja vorgeschlagen, ich sollte das Ergebnis der Auswahl erst noch in eine Variable übernehmen, aber scheint gar nicht nötig zu sein, oder?
Nicht nötig?
Nur weil du einen Datensatz gewählt hast, weiß Navision noch immer nicht, was damit gemacht werden soll.
Es soll aber die Artikelnr. in dein Feld geschrieben werden - und genau das wird in der IF-Anweisung ausgeführt.

Also, Inhalt der gesamten IF-Anweisung: Wenn du einen Datensatz mit "OK" ausgewählt hast (und nur dann!), wird die Artikelnr. in dein Feld geschrieben.

Schlägst Du alternativ vor, den VALIDATE-Trigger zu durchlaufen? Mit dem Validate kenn ich mich nun gar nicht aus. Ist das dann der Validate-Trigger des Eingabefeldes (in den ich noch nichts programmiert habe)?
Jupp, der OnValidate-Trigger der Tabelle, an die dein Zielrecord geknüpft ist. Aber deine Artikelnr. ist an kein Feld gebunden, sondern ist eine Variable (wenn ich dich richtig verstanden habe). Von daher brauchst du dir an dieser Stelle keine Gedanken zu machen.

9. November 2007 12:02

Hi,
hier gibts noch Infos bezueglich FILTERGROUPS. Beachte bitte auch die vers. Gruppennummern. Du verwendest momentan die 2. Gruppe, dabei werden die Standardfilter der Form, falls vorhanden, geloescht und dann dein Filter gesetzt.

Ist das bei dir so gewuenscht?

SafetyFirst
Und: Die IF-Anweisung ohne Inhalt stört jetzt etwas mein ästhetischen Empfinden. Du hattest ja vorgeschlagen, ich sollte das Ergebnis der Auswahl erst noch in eine Variable übernehmen, aber scheint gar nicht nötig zu sein, oder?

Wird die Auswahl auf der Form bereits in die Tabelle uebernommen?

Safety First
Aber: Was passiert denn da jetzt eigentlich? Was ist das für eine Option, die da mit "Action::LookupOK" spezifiziert wird?

Damit gibst du der Form an, dass der User einen Datensatz auswaehlen kann, welcher dann zurueckgegeben wird. In dem Beispiel an die Variable "recArtikel".
Irgendwo gibts eine Liste mit saemtlichen Action:: Befehlen, allerdings finde ich die gerade nicht :oops:. In der Hilfe ist das auch nicht so ausfuehrlich beschrieben.

Gruesse
feri

9. November 2007 12:44

Hallo Allerseits,

das Navision ist schon ein erstaunliches System, fürwahr, ganz erstaunlich....

Yep, die online-Hilfe bemühe ich laufend und gerne, bin aber in diesem Fall nicht weiter gekommen - vermutlich, weil ich unter Action gesucht habe, nicht unter Form.Runmodal :oops:

Ziel der ganzen Übung ist, daß ich in der übergeordneten Datenstruktur einen "Artikeltausch" durchführen möchte. Der Benutzer wählt auf der Form den Vorher-Artikel und den Nachher-Artikel, drückt dann auf "Run" und die Artikel werden ausgetauscht (hängt ein wenig Logik hinter).

So hab ich also die ungebundene Form gebaut mit den beiden Feldern OldArticel und NewArticle. Die Felder hab ich aufgesetzt auf die Rec-Variablen recOldArticle und recNewArticle.

In die OnLookup-Trigger hab ich denn also den beschriebenen Code gesetzt (jeweils mit Old und New). Die Auswahl klappt nun also durchaus so wie gewollt, und ich kann dann im Push-Trigger des Run-Buttons wunderbar die Inhalte der Felder abgreifen und als Parameter an die Tausch-Funktion übergeben.

Wie schon gesagt, dies klappt, ohne dass ich die die IF-Schachtel füllen muss.

Derweil ich aber a) kein ausgebildeter Programmierer bin und b) Anfänger im Navision, hab ich natürlich immer die Befürchtung, daß ein richtiger Programmierer grün anläuft, wenn er meine Konstrukte sieht. Um dies zu vermeiden, versuche ich, möglichst viel von Euch zu lernen, und frage deshalb so viel nach.

Bin für Kritik also immer offen.

feri,

yep, die Auswahl wird wie gewünscht übernommen.
Die Filtergrp ist auch OK. Auf der Liste liegen per Default keine Filter; dies ist derzeit nur für diese Tausch-Funktion gewünscht - hier aber für den Benutzer nicht änderbar.


Natalie,

hab ich das jetzt richtig verstanden: Wenn ich den Lookup-Trigger programmiere, dann nimmt die Form erstmal an, daß sie keine "Auswahl-Liste" sondern eine "Anzeige-Liste" ist und deaktiviert standardmässig die Auswahl-Funktionalität?

Wenn du einen Datensatz mit "OK" ausgewählt hast (und nur dann!), wird die Artikelnr. in dein Feld geschrieben.


Ich nehme an, das "Nur dann" impliziert, daß ein Doppelklick standardmässig wie ein OK gewertet wird (funktioniert nämlich)?

Vielen Dank nochmals für Eure Hilfe, Ihr seid echt großartig!

Viele Grüße,

SF

9. November 2007 13:33

SafetyFirst hat geschrieben:Wie schon gesagt, dies klappt, ohne dass ich die die IF-Schachtel füllen muss.

Dann bitte nur für mich aus reiner Neugier an der Sache: Könntest du mir jetzt bitte den gesamten Quelltext im OnLookup-Trigger der Form zeigen?

hab ich das jetzt richtig verstanden: Wenn ich den Lookup-Trigger programmiere, dann nimmt die Form erstmal an, daß sie keine "Auswahl-Liste" sondern eine "Anzeige-Liste" ist und deaktiviert standardmässig die Auswahl-Funktionalität?

Formulieren wirs anders herum:
Die Form weiß von einer Lookup-Funktionalität nur dann etwas, wenn du mit dem IF FORM.RUNMODAL(..) = ... THEN arbeitest - ganz egal in welchem Trigger! Schreibst du nur FORM.RUNMODAL(...);, fehlen die Buttons.

Ich nehme an, das "Nur dann" impliziert, daß ein Doppelklick standardmässig wie ein OK gewertet wird (funktioniert nämlich)?

So ist es.

9. November 2007 14:40

Natalie hat geschrieben:Dann bitte nur für mich aus reiner Neugier an der Sache: Könntest du mir jetzt bitte den gesamten Quelltext im OnLookup-Trigger der Form zeigen?


OnLookup-Trigger *des Feldes*, nicht der Form (hat die auch einen?); genau wie oben gepostet:

Code:
recArtikel.FILTERGROUP(2);
recArtikel.SETFILTER("Typ",'=%1|%2','Auto','Laster');
recArtikel.FILTERGROUP(0);
IF FORM.RUNMODAL(0, recArtikel) = Action::LookupOK THEN BEGIN
END;


Hab's gerade nochmal gecheckt, so funktioniert es wirklich.

Im Feld hab ich die recArtikel-Variable, die auf die Artikel-Tabelle zeigt, als Source angegeben.

Viele Grüße,

SF

9. November 2007 14:57

SafetyFirst hat geschrieben:Im Feld hab ich die recArtikel-Variable, die auf die Artikel-Tabelle zeigt, als Source angegeben.
lol
Das erklärt jedenfalls, warum deine ausgewählte Artikelnummer in Feld landet, auch wenn du den Code in der IF-Anweisung nicht einträgst.

Aber probier jetzt mal folgendes:
Tätige den Lookup, stelle den Mauszeiger auf eine irgendeinen anderen Artikel (merken, welcher) und schließe die Form, indem du auf Abbrechen klickst oder die Form direkt schließt - was steht jetzt in deinem Feld?

9. November 2007 15:17

Natalie hat geschrieben:
SafetyFirst hat geschrieben:Im Feld hab ich die recArtikel-Variable, die auf die Artikel-Tabelle zeigt, als Source angegeben.
lol
Das erklärt jedenfalls, warum deine ausgewählte Artikelnummer in Feld landet, auch wenn du den Code in der IF-Anweisung nicht einträgst.


Eeehhm....
Jetzt verunsicherst Du mich aber. D.h. DU hättest es SO nicht gemacht?

Natalie hat geschrieben:Aber probier jetzt mal folgendes:
Tätige den Lookup, stelle den Mauszeiger auf eine irgendeinen anderen Artikel (merken, welcher) und schließe die Form, indem du auf Abbrechen klickst oder die Form direkt schließt - was steht jetzt in deinem Feld?


Wenn ich abbreche, dann verändert sich in dem Feld nix. Stand da vorher nichts, dann steht da auch hinterher nichts. Stand da vorher was, dann steht das auch hinterher da.

Also sieht es eigentlich doch richtig aus. Liege ich falsch?

9. November 2007 15:41

SafetyFirst hat geschrieben:Wenn ich abbreche, dann verändert sich in dem Feld nix. Stand da vorher nichts, dann steht da auch hinterher nichts. Stand da vorher was, dann steht das auch hinterher da.

Also sieht es eigentlich doch richtig aus. Liege ich falsch?


Ich hätte jetzt erwartet, dass wenn du die Lookup-Form durch was anderes als OK verlässt (kein Doppelklick auf Datensatz und auch kein Klick auf OK!), die zuletzt gewählte Artikelnr. trotzdem übernommen wird.

Ich kann mir nicht erklären, warum dies bei dir nicht der Fall ist, wenn doch die IF-Anweisung leer war. Dazu müsste ich deine Form schon sehen. Ich habe mich nur gewundert ;-)

Jetzt verunsicherst Du mich aber. D.h. DU hättest es SO nicht gemacht?


Nicht gleich nervös werden ;-)
Ich hätt es so gemacht, wie ich dir zu allererst geschrieben habe. Doch bei dir muss noch mehr auf der Form sein, als ich bis jetzt weiß. Von daher ...
Hauptsache, es funktioniert!
Der Rest kommt schon mit der Zeit. Schau dir einfach irgendwann einmal die ganzen Standard-Codes an und versuche, sie nachzuvollziehen.

9. November 2007 15:53

Jo, durch Code-Analyse hab ich da auch schon eine ganze Menge gelernt. Oberflächen-Programmierung hab ich aber schon immer gehasst, und die Unübersichtlichkeit im Navision macht es nicht unbedingt einfacher: Derzeit übersehe ich einfach noch wichtige Dinge zu schnell.

Nochmal zur Form: Also, da is eigentlich nix! Das ist eine flache Form, nicht gebunden. Zwei Eingabe-Felder drauf und ein OK- und ein Abbruch-Button. Die rec-Variablen, als Globals definiert, zeigen auf die Artikel-Tabelle. Mehr - ist da eigentlich nicht.

Viele Grüße,

SF

9. November 2007 15:54

SafetyFirst hat geschrieben:Oberflächen-Programmierung hab ich aber schon immer gehasst, und die Unübersichtlichkeit im Navision macht es nicht unbedingt einfacher: Derzeit übersehe ich einfach noch wichtige Dinge zu schnell.


Da find ich SAP aber viel schlimmer .....

9. November 2007 16:02

Hab ich bisher nur in Form des EH&S als Sachbearbeiters kennengelernt: Yeah, durchaus "optimierungsfähig"....

Hast aber scho Recht: Im Prinzip eine Frage des Kennenlernens und der Übung.

OK, erstmal ein schönes Wochenende und vielen, vielen Dank für die Hilfe!