[Gelöst] Änderung Kopf aus Zeilen?

20. Oktober 2006 11:42

Hallo zusammen,

ich habe "Kopfprobleme" :wink: und hoffe, dass euch etwas einfällt:

Ich habe in den Zeilen einer neuen Tabelle Zeilenstati und im Kopf einen Status, welche sich in Abhängigkeiten ändern sollen.

Nun möchte ich als erstes, dass wenn alle Zeilen erledigt sind, auch der Status im Kopf auf erledigt gesetzt wird.

Wenn ich das auf dem OnValidate des Zeilenstatus in der Zeile programmiere, also mir den Kopf hole, dort den Status validiere und dann ein Kopf.Modify setze, dann sieht lt. Debugger alles prima aus, der Kopf wird validiert und geändert, aber ín Wirklichkeit wird er gar nicht geändert.

Ich habe jetzt schon so einiges ausprobiert, aber spätestens, wenn ich ein paar Mal die Stati schalte, geht es nicht mehr.

Ich habe es in einer Funktion ausgelagert und im Kopf. Ich habe auch versucht, ein Modify der Zeile vorher abzusetzen, aber das bringt auch nicht viel.

Wißt ihr, ob und wie das funktionieren könnte?

Danke im voraus.
Zuletzt geändert von NavHummel am 23. Oktober 2006 15:57, insgesamt 1-mal geändert.

20. Oktober 2006 12:25

Die von die genannte Funktion habe ich schon des öfteren an unterschiedlichen Stellen angewendet, und das auch immer funktioniert.

Was dabei aber ein Problem ist, ist die Tatsache, dass sich auf dem Form, welches den Kopf anzeigt, nichts verändert solange man den Cursor nicht ins Form positioniert. Könnte es ev. daran liegen?

20. Oktober 2006 13:28

Hallo Rotsch,

nein, das wäre mir egal, wenn ich erst in den Kopf wechseln müsste, um die Änderung zu sehen. Das Problem ist bekannt :wink: .

Leider wird die Änderung überhaupt nicht durchgeführt. Im Debugger auf dem Modify ist der recKopf.Status aber auf erledigt...

Aber nach deinem Einwand, dass es ja eigentlich funktionieren müsste, habe ich mich mal in der Datenbank nach ähnlichen Funktionen auf die Suche gemacht und auch gefunden.

Tja, der einzige Unterschied: Die zu ändernden Felder waren keine Optionsfelder.

Also mit einem anderen Feld (Datumsfeld) getestet und siehe da, es funktioniert!
Nächster Schritt: Das Datumsfeld validiert und das Optionsfeld. Ergebnis: Es funktioniert! Komisch, oder?

Ich habe sonst wirklich nichts verändert, nur zusätzlich ein Validate für ein Datumsfeld eingebaut. :shock:

20. Oktober 2006 13:55

Poste doch mal den C/AL-Code.

Gruß, Marc

20. Oktober 2006 13:56

Ich stimme dir zu, das ist mehr als eigenartig. Wobei, jetzt, wo du das so schreibst, erinnere ich mich an ein ähnliches Phänomen, das ich ganz selten auch schon bebachtet habe.

Ich stelle einen Fehler fest - der Debugger zeigt, wie bei dir, die korrekten Werte an - dann baue ich eine Message-Box ein um den Wert auf den Schirm zu bekommen - der Wert kommt richtig :shock: - ich baue die Message wieder aus - der Wert kommt immer noch richtig und bleibt auch so :shock: :!:

Das sind wohl die kleinen Geheimnisse, die Navision für sich behält. Darum heisst das ja auch EDV (Ende Der Vernunft) :-D

20. Oktober 2006 14:29

Hier der Code vom OnValidate auf dem Status der Zeile:

Code:
//Prüfung ob alle Zeilen erledigt
IF Status = Status :: erledigt THEN BEGIN
  Aktualisiere := TRUE;
  recZeile.RESET;
  recZeile.SETRANGE("Document No.","Document No.");
  IF recZeile.FIND('-') THEN
    REPEAT
      IF (recZeile."Line No." <> "Line No.") AND (recZeile.Status <> recZeile.Status :: erledigt) THEN
        Aktualisiere := FALSE;
    UNTIL recZeile.NEXT = 0;

  //Wenn alle Zeilen erledigt, dann Kopf ändern
  IF Aktualisiere = TRUE THEN BEGIN   
    recKopf.RESET;
    recKopf.GET("Document No.");
    NeuerKopfStatus := NeuerKopfStatus :: erledigt;
    recKopf.VALIDATE(Status,NeuerKopfStatus);
    recKopf.VALIDATE("Posting Date",TODAY); //Eingefügt, damit es funktioniert   
    recKopf.MODIFY;
  END;
END;

20. Oktober 2006 15:29

Ein FlowField auf dem Kopf hätte das Problem auch gelöst.

Code:
Exist("Sales Line" WHERE (Document Type=FIELD(Document Type),Document No.=FIELD(xy)))


Gruss

20. Oktober 2006 16:06

martinst hat geschrieben:Ein FlowField auf dem Kopf hätte das Problem auch gelöst.

Code:
Exist("Sales Line" WHERE (Document Type=FIELD(Document Type),Document No.=FIELD(xy)))


Gruss


Danke, auch eine gute Idee. Nur in diesem speziellen Fall hätte es nicht funktioniert, da der Zeilenstatus mehr und andere Optionen hat als der Kopfstatus.

20. Oktober 2006 18:59

Wenn der Kopfstatus nur erledigt und nicht erledigt ist, dann geht das schon.
Das Feld heißt dann unerledigt und zeigt ein Häkchen, wenn noch nicht alle Zeilen auf erledigt sind. Dazu muss die Calcformula etwas erweitert werden:
Code:
Exist("Sales Line" WHERE (Document Type=FIELD(Document Type),Document No.=FIELD(document no.),Statusfeld=Filter(<>statusfeld::erledigt)))

ich weiss jetzt nicht, ob die Syntax für den Filter so korrekt ist, aber das Prinzip dürfte klar geworden sein...

23. Oktober 2006 15:56

Das ginge wahrscheinlich, wenn ich nicht 3 Stati im Kopf hätte: offen, in Bearbeitung und erledigt.

Naja, es funktioniert ja jetzt irgendwie, daher werde ich das ganz mal auf gelöst setzen.