Zeiger auf Datensatz in einer Teilmenge setzen
Verfasst: 6. September 2007 10:29
Ich kenne diese Art der Programmierung erst seit Kurzem, daher könnte dieses Thema vielleicht (und hoffentlich) auch für andere von Interesse sein:
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
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:
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).
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:
// 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:
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).