Wenn ich z.B. auf einem Feld mit einer Artikelnummer stehe und nun den Lookup-Button klicke, möchte ich, dass der Datensatzzeiger auf eben diesem Artikel steht. Dies erledigt Navision über eine TableRelation ja meistens ganz von allein.
Doch was muss ich tun, wenn der Lookup händisch programmiert werden muss? Und was hinzukommt: Was ist, wenn der Lookup mir nur eine Teilmenge der Artikel (also nach irgendwelchen Kriterien gefiltert) anzeigen soll, der Zeiger aber trotzdem korrekt gesetzt werden soll?
Dies einfacher als zumindest meinereiner dachte:
Item No. - OnLookup
- Code: Alles auswählen
// Setze zuerst den Artikelfilter
Item.SETCURRENTKEY(Feld1, Feld2, Feld3);
Item.SETRANGE(Feld1, Inhalt1);
Item.SETRANGE(Feld2, Inhalt2);
// setze den Zeiger - benuzte den Primärschlüssel
Item."No." := InhaltXY;
IF FORM.RUNMODAL(0, Item) = ACTION::LookupOK THEN ...
Den Filter kann ich nach Belieben setzen. Daher habe ich hier auf einenSETRANGE fĂĽr Feld3 verzichtet.
Was nun für den Zeiger wichtig ist: Ich weise allen Feldern des Primärschlüssels einen Wert zu.
-------- folgnden Teil konnte ich im Nachhinein nicht mehr reproduzieren und ist daher mit groĂźer Vorsicht zu genieĂźen ----------------
Verwenden kann man dieses Prinzip zur Beantwortung der Frage, ob z.B. ein Artikel in einer vorgegebenen Teillmenge enthalten ist:
- Code: Alles auswählen
Item.SETRANGE("No.", 'ART0001', 'ART0050); // aktuell sind das 50 Artikel
// setze den Zeiger
Item."No." := 'ART0051';
ArtikelInTeilmengeEnthalten := NOT Item.ISEMPTY;
// Ergebnis: FALSCH
Achtung: Ist der Zeiger nur unvollständig oder gar nicht gesetzt (also nicht alle Felder des aktuellen Schlüssels), liefert ISEMPTY hier das falsche Ergebnis, nämlich nur, ob die Teilmenge selbst Artikel enthält (ja, nämlich alle von ART0001 bis ART0050).