[gelöst] Satzmarkierungen löschen sich wieder...

4. Oktober 2007 09:57

Hallo liebe Forengemeinde,

wie der Titel schon sagt, ich will über einen Auftrag die gebuchten Lieferungszeilen anzeigen lassen.
Wenn ich mir die Ergebnisse als Message ausgeben lasse dann habe ich auch alles was ich brauche.
Leider kann ich das nicht im Fenster anzeigen weil die Satzmarkierungen bei jedem RESET wieder gelöscht werden.
Vieleicht hat jemand eine Idee wie man das Problem lösen könnte.

Code:
SalesLine.SETRANGE(SalesLine."Document Type", "Document Type");
SalesLine.SETRANGE(SalesLine."Document No.", "No.");
IF SalesLine.FIND('-') THEN
REPEAT
  ProdOrder.RESET;
  ProdOrder.SETRANGE(ProdOrder.Auftragsnummer, SalesLine."Document No.");
  ProdOrder.SETRANGE(ProdOrder."Auftragszeilennr.", SalesLine."Line No.");
  IF ProdOrder.FIND('-') THEN
  REPEAT
    PurchRcptLine.RESET;
    PurchRcptLine.SETRANGE(PurchRcptLine."Einkauf für FA", ProdOrder."No.");
    IF PurchRcptLine.FIND('-') THEN
    REPEAT
      PurchRcptLine.MARK(TRUE);
    UNTIL PurchRcptLine.NEXT<>1;
  UNTIL ProdOrder.NEXT<>1;
UNTIL SalesLine.NEXT<>1;

PurchRcptLine.MARKEDONLY(TRUE);
FORM.RUN(FORM::"Purch. Receipt Lines", PurchRcptLine);


Im voraus schon einmal Danke für die Antworten.
Zuletzt geändert von Steev am 4. Oktober 2007 12:14, insgesamt 1-mal geändert.

4. Oktober 2007 11:04

Lass einfach das PurchRcptLine.RESET; weg.

4. Oktober 2007 11:17

Leider geht das auch nicht,
es wird immer nur der letzte Datensatz der gefunden wird auch markiert und damit in der Form angezeigt.
Vieleicht liegt es daran das überhaupt ein neuer Filter auf die PurchRcptLine gesetzt wird.

4. Oktober 2007 11:41

Dann stimmt etwas mit deinem Code nicht. Lass ihn uns mal rein textlich auflösen:

Für alle Zeilen eines VK-Beleges
--Für alle Fertigungsaufträge zu den VK-Zeilen
----Für alle EK-Lieferzeilen die zum Fertigungsauftrag gehören
------Markiere EK-Lieferzeile

Richtig? Ich würde das zunächst abkürzen
--Für alle Fertigungsaufträge mit Bezug zur VK-Belegnummer (also Zeilenbezug egal)
----Für alle EK-Lieferzeilen die zum Fertigungsauftrag gehören
------Markiere EK-Lieferzeile

Ich behaupte jetzt mal:
1. Lass wie gesagt das RESET weg, das brauchst du nicht, weil der Filter immer nur auf das gleiche Feld gesetzt wird (nämlich PurchRcptLine."Einkauf für FA"). Ein neuer Filter ERSETZT den alten.

2. Schreib statt nur PurchRcptLine.MARK(TRUE);
Code:
IF NOT PurchRcptLine.MARK THEN
  PurchRcptLine.MARK(TRUE);


3. Und hier ist wohl auch der Fehler: Schreibe
Code:
PurchRcptLine.SETRANGE(PurchRcptLine."Einkauf für FA"); // NEU!!! Filter muss aufgehoben werden
PurchRcptLine.MARKEDONLY(TRUE);


Übrigens, für gewöhnlich schreibt man
UNTIL SalesLine.NEXT = 0
statt
UNTIL SalesLine.NEXT<>1;

Falls irgendetwas davon "nicht geht", sag doch bitte, was du damit meinst. Geht es um eine Fehlermeldung - welche? Oder was passiert (nicht)?

4. Oktober 2007 11:44

So wie Natalie schon sagte, würde ich bei der Variable PurchRcptLine das RESET weglassen. Außerdem würde ich den folgenden C/AL-Code:

Code:
    UNTIL PurchRcptLine.NEXT<>1;
  UNTIL ProdOrder.NEXT<>1;
UNTIL SalesLine.NEXT<>1;

durch den folgenden ersetzen:

Code:
    UNTIL PurchRcptLine.NEXT=0;
  UNTIL ProdOrder.NEXT=0;
UNTIL SalesLine.NEXT=0;


Gruß, Marc

4. Oktober 2007 11:45

Wie ich schon sagte ;-)

4. Oktober 2007 11:50

Natalie hat geschrieben:Wie ich schon sagte ;-)

Als ich mit dem Schreiben meines Beitrags anfing, war deine letzte Nachricht auch noch nicht da. Du bist einfach zu schnell... ;-)

4. Oktober 2007 11:58

Schade,
ich habe den Code so verändert wie ihr es geschrieben habt:
Code:
lProdOrder.RESET;
lProdOrder.SETRANGE(Auftragsnummer, "No.");
IF lProdOrder.FIND('-') THEN
REPEAT
  lPurchRcptLine.SETRANGE("Einkauf für FA", lProdOrder."No.");
  IF lPurchRcptLine.FIND('-') THEN
  REPEAT
    IF NOT lPurchRcptLine.MARK THEN
      lPurchRcptLine.MARK(TRUE);
  UNTIL lPurchRcptLine.NEXT=0;
UNTIL lProdOrder.NEXT=0;

lPurchRcptLine.MARKEDONLY(TRUE);
FORM.RUN(FORM::"Purch. Receipt Lines", lPurchRcptLine);


Leider wird immernoch nur der letzte gefundene Datensatz auch angezeigt.
Vieleicht muss ich mein Konzept mal überdenken...

4. Oktober 2007 12:01

Nein, du hast meinen 3. Punkt ausgelassen.

4. Oktober 2007 12:06

Ehrlich gesagt habe ich nicht ganz verstanden was du mir da sagen wolltest.
Soll ich demnach doch RESET verwenden?

Wenn der Filter sich nicht selber überschreiben würde dann würde nur der erste Datensatz angezeigt...

4. Oktober 2007 12:09

Also hier nochmal dein kompletter Quelltext inklusive meinem Punkt 3:

Code:
lProdOrder.RESET;
lProdOrder.SETRANGE(Auftragsnummer, "No.");
IF lProdOrder.FIND('-') THEN
REPEAT
  lPurchRcptLine.SETRANGE("Einkauf für FA", lProdOrder."No.");
  IF lPurchRcptLine.FIND('-') THEN
  REPEAT
    IF NOT lPurchRcptLine.MARK THEN
      lPurchRcptLine.MARK(TRUE);
  UNTIL lPurchRcptLine.NEXT=0;
UNTIL lProdOrder.NEXT=0;

lPurchRcptLine.SETRANGE("Einkauf für FA");
lPurchRcptLine.MARKEDONLY(TRUE);
FORM.RUN(FORM::"Purch. Receipt Lines", lPurchRcptLine);

4. Oktober 2007 12:14

Wunderbar,

jetzt funktioniert es.
Ich hätte nicht gedacht das es nur an einer Zeile hängt.

Danke

4. Oktober 2007 12:17

Hast du denn verstanden, was diese eine Zeile macht?
lPurchRcptLine ist immer mit einem Filter belegt.
MARKEDONLY berücksichtigt diesen Filter aber.

Möchtest du also ALLE markierten Datensätze erhalten, musst du vorher den Feldfilter aufheben. Dies tust du, indem du SETRANGE ohne Werteingrenzungen aufrufst (also: SETRANGE("Feldname");).