Satzmarkierte DS aus der Form übernehmen

23. Juli 2007 14:06

Hallo,

ich möchte in einer aufgerufenen Form Datensätze markieren. Diese markierten Datensätze sollen außerhalb der Form verarbeitet werden.
Leider bleiben die Markierungen der übergebenen Var. unverändert.
Ich habe es versucht:
1.
Code:
  IF FORM.RUNMODAL(0,DS_Rec) = ACTION::LookupOK THEN BEGIN
     DS_Rec.MARKEDONLY(TRUE);
     IF NOT DS_Res.FIND('-') THEN
        MESSAGE('Es wurde nichts markiert.');
  END;


oder so
2.
Code:
    CLEAR(Form_Übersicht);
    Form_Übersicht.SETTABLEVIEW(DS_Rec);
    IF Form_Übersicht.RUNMODAL= ACTION::LookupOK THEN BEGIN
       Form_Übersicht.GETRECORD(DS_Rec);
       DS_Rec.MARKEDONLY(TRUE);
       IF NOT DS_Res.FIND('-') THEN
          MESSAGE('Es wurde nichts markiert.');
    END;


:evil:

Es muß doch Möglich sein, die Markierungen welche in der Form gesetzt wurden, außerhalb dieser Form zu verarbeiten.

Hat jemand eine Idee?

Gruß Stephan
Zuletzt geändert von mante am 23. Juli 2007 14:40, insgesamt 1-mal geändert.

23. Juli 2007 14:16

Was du brauchst, ist der Befehl SETSELECTIONFILTER, der ausschließlich auf einer Form verwendet werden kann.

23. Juli 2007 14:39

Hallo Natalie,

SETSELECTIONFILTER setzt doch ein Filter auf die ausgewählten DS innerhalb der FORM - oder?
Ich meinte aber Satzmarkierungen, welche ich vom User setzen lasse und nach "OK" in dem aufrufenden Objekt weiterverarbeiten möchte. Ich erhalte zwar mit GETRECORD den übernommenen DS, aber nicht die markierten DS.
Ich vermute, dass ich ein Zeiger auf die Datensatzvariable der FORM benötige um an die Datensatzmarkierungen zu gelangen.
:roll:
Mann ist das kompliziert.


Gruß Stephan

23. Juli 2007 14:55

Achsoooo ...
Naja, was spricht denn dagegen, wenn der Benutzer nicht gezwungen ist, Satzmarken zu setzen sondern mit Markierungen?
Er kann ja zur Not beides machen: Erst Satzmarken setzen, dann nur satzmarkierte anzeigen lassen, und alle verbleibenden Datensätze markieren?

Mir ist nämlich kein anderer Weg als SETSELECTIONFILTER bekannt, um Benutzermarkierungen ausfindig zu machen.

23. Juli 2007 15:02

Du könntest versuchen, auf dem Form eine Funktion zu definieren, der du dann als Parameter die gewünschte Recordvariable übergibst. Dieser Parameter soll dann VAR deklariert sein.

So kannst du aus dem aufrufenden Programm diese Funktion des Forms nach den Lookup ansprechen und solltest dann eigentlich die Markierungen haben. In der Formfunktion musst du dann natürlich die Recordvariable noch mit der Sourcetable des Forms überschreiben.

So würde ich es zumindest versuchen, getestet habe ich es aber nicht :-)

23. Juli 2007 15:04

Natalie,
das ist eine gute Idee :wink:
Nur wie kann ich außerhalb der Form auf die markierten DS zugreifen?
Das ist mir leider noch nicht klar.

:-?

23. Juli 2007 16:01

mante hat geschrieben:Natalie,
das ist eine gute Idee :wink:
Nur wie kann ich außerhalb der Form auf die markierten DS zugreifen?
Das ist mir leider noch nicht klar.

:-?
OK, gelöst - Danke

Hier die Funktion, die in die Form implementiert werden muß.
Code:
getContext(VAR DS_Rec: Record)
// Markierungen sind nur im Objektkontext gültig.
DS_Rec.COPY(Rec);



So wird getContext verwendet:

Code:
(Form_Übersicht);
    Form_Übersicht.SETTABLEVIEW(DS_Rec);
    IF Form_Übersicht.RUNMODAL= ACTION::LookupOK THEN BEGIN
       Form_Übersicht.getContext(DS_Rec);
       DS_Rec.MARKEDONLY(TRUE);
       IF NOT DS_Res.FIND('-') THEN
          MESSAGE('Es wurde nichts markiert.');
    END;



Ich wollte den Vorschlag von Natalie zusätzlich aufnehmen. Leider funktioniert SETSELECTIONFILTER nicht nur auf markierte Datensätze sondern ebenfalls auf den selektierten (aber nicht markierten) DS - was natürlich der Name der Funktion bereits sogerieren könnte. :-?

Mein erster Ansatz war

Code:
getContext(VAR DS_Rec: Record)
// Markierungen sind nur im Objectkontext gültig.
DS_Rec.COPY(Rec);
CurrForm.SETSELECTIONFILTER(Rec);
IF (COUNT=1)AND(DS_RES.Buchungsnummer=Buchungsnummer) THEN
  EXIT;

IF FINDFIRST THEN REPEAT
  DS_Rec := Rec;
  DS_Rec.MARK(TRUE);
UNTIL NEXT=0;



welches natürlich nicht korrekt funktioniert. :-x
Aber mal ehrlich (Alte Blau Programmierer werden das verstehen) ; so kompliziert muß MS uns das Leben doch nicht machen - oder.

Gruß Stephan

23. Juli 2007 16:06

Wo ist das Problem?

Verwende statt Rec eine Variable:

Code:
CurrForm.SETSELECTIONFILTER(locRecord);


Wie die Onlinehilfe dir verrät, hat Navision auf alle zuvor markierten Datensätze eine Satzmarke gesetzt und anschließend nach nur satzmarkierten Datensätzen gefiltert.

Das heißt: locRecord enthält, solange du den Filter nicht entfernst, genau die markierten Datensätze.
Nun kannst du den Record übergeben (Achtung, mit var-Parameter!) und bearbeiten, z.B.

Code:
IF locRecord.FIND('-') THEN
  MacheWas


Edit - war wohl zu langsam ;-)