Entfernen von Belegpositionen und Neunummerierung der Positionen

Arne Drews

Mitglied
Moin,

Ich löse in einem Prozess Handelsstücklisten auf, was bis dahin auch gut funktioniert.
Hier mal der aktuelle Stand, als Basis:
C#:
Auftrag = new Beleg(Mandant, Erfassungsart.Verkauf);
Auftrag.Load(lists[0].BelId);

List<BelegPosition> _remove = new List<BelegPosition>();
List<string> _memo = new List<string>();

foreach (PartsListModel _position in lists)
{
    BelegPosition _pos = Auftrag.Positionen.FirstOrDefault(p => p.Handle == _position.BelPosId);

    if (_pos is null)
        continue;

    foreach (PartsListElementsModel _element in _position.Elements)
    {
        BelegPosition _new = new BelegPosition(Auftrag);

        if (!_new.SetArtikel(_element.Artikelnummer, _element.AuspraegungID))
            continue;

        Auftrag.Positionen.Add(_new);

        _new.Einzelpreis = _element.EinzelpreisKalkuliert;
        _new.Menge = _element.MengeBasis;
        _new.Liefertermin = _pos.Liefertermin;

        _new.Calculate();
    }

    _remove.Add(_pos);
    _memo.Add($"{_pos.Artikelnummer};{_pos.Handle}");
}

foreach (BelegPosition _item in _remove)
    Auftrag.Positionen.Remove(_item);

Auftrag.Calculate(true);
Auftrag.Validate(true);

if (!Auftrag.Save(false))
    throw new Exception($"Speichern des Belegs {Auftrag.BelegnummerFormatiert}/{Auftrag.Handle} gescheitert.");

return true;

Was passiert
In meiner Oberfläche markiere ich die Handelsstückliste/n, die ich auflösen möchte und starte den Prozess mit Klick auf eine Schaltfläche.
Ich habe einen Debug-Punkt vor dem Save() gesetzt und dort sieht alles super aus, die beiden Handelsstücklisten, die ich auflösen wollte sind raus und die Elemente daraus als neue Positionen im Auftrag drin.

Führe ich aber den Save-Befehl aus, sind immer noch alle Elemente als neue Positionen drin, allerdings ohne Positionsnummer ( NULL ).
Zudem befinden sich die aufgelösten Handelsstücklisten aber noch mit im Beleg, obwohl die vor dem Save() bereits nicht mehr enthalten waren.

Auftrag.Errors ist leer.

Meine Frage/n
Mir ist bewusst, dass gelöschte Positionen zunächst nur als gelöscht markiert werden, aber wie entferne ich sie dann endgültig?
Und wie stoße ich die Nummerierung der Positionen neu an oder muss ich das selber setzen?

Danke für Infos/Hinweise


EDIT
Ich habe gerade noch Renumber() gefunden, womit er zwar die Positionen neu nummeriert, allerdings bei den eigentlich gelöschten Positionen eine doppelte Positionsnummer vergibt.

Die gelöschten Positionen bleiben nach dem Save() weiterhin nicht gelöscht.
 
Zuletzt bearbeitet:
Probier mal "Auftrag.Renumber();". Damit müsste man die Neunummerierung anstoßen können.
Ich hätte jetzt gedacht, dass ein Remove hier ausreicht. Es gibt aber im Beleg noch PositionenDeleted. Evtl. müssen die zu löschenden Positionen hier eingefügt werden?
 
Ich seh gerade es gibt neben "Positionen.Remove" noch "Positionen.RemoveAndAddToDeleteCollection". Evtl. klappt es damit?
Danke für den Hinweis, habe es gerade mal getestet, ändert leider nichts.
Zudem befinden sich die beiden gelöschten Positionen nach dem Remove() auch in PositionDeleted.

Hier mal ein Screenshot, vielleicht ist das etwas deutlicher.
Die rot markierten Positionen sind die, die ich gelöscht hatte und wie man sieht, werden exakt die Positionsnummern doppelt vergeben.
Zudem stehen in der BelegPositionCollection vor dem Save() korrekter Weise 27, hier nach dem Save() dann aber wieder 29 Positionen ( siehe unten rechts ).
1781606552816.png
 
Danke für den Hinweis, habe es gerade mal getestet, ändert leider nichts.
Zudem befinden sich die beiden gelöschten Positionen nach dem Remove() auch in PositionDeleted.
Die Methode "RemoveAndAddToDeleteCollection" muss bei gespeicherten Positionen anstatt der Methode "Remove" aufgerufen werden. Als Parameter für den Schlüssel den "CollectionKeyWithoutNewHandle" übergeben.
 
Hi,

Danke für Deine Teilnahme.
CollectionKeyWithoutNewHandle hatte ich nicht übergeben, hab's eben mal probiert und das ganze anstatt Remove() gemacht.
In dem Fall hat er vor dem Save() 29 Positionen, wovon zwei zwar in PositionDeleted stehen, aber es dürften ja nur 27 sein. Und nach dem Save sind weiterhin alle Positionen drin und auch mit vollem Preisgewicht, d.h. der Auftrag ist hinterher doppelt so teuer, wie vorher.

Hier nochmal der Stand mit RemoveAndAddToDeleteCollection(), falls das hilft:
C#:
Auftrag = new Beleg(Mandant, Erfassungsart.Verkauf);
Auftrag.Load(lists[0].BelId);

List<BelegPosition> _remove = new List<BelegPosition>();
List<string> _memo = new List<string>();

foreach (PartsListModel _position in lists)
{
    BelegPosition _pos = Auftrag.Positionen.FirstOrDefault(p => p.Handle == _position.BelPosId);

    if (_pos is null)
        continue;

    foreach (PartsListElementsModel _element in _position.Elements)
    {
        BelegPosition _new = new BelegPosition(Auftrag);

        if (!_new.SetArtikel(_element.Artikelnummer, _element.AuspraegungID))
            continue;

        Auftrag.Positionen.Add(_new);

        _new.Einzelpreis = _element.EinzelpreisKalkuliert;
        _new.Menge = _element.MengeBasis;
        _new.Liefertermin = _pos.Liefertermin;

        _new.Calculate();
    }

    _remove.Add(_pos);
}

foreach (BelegPosition _item in _remove)
    Auftrag.Positionen.RemoveAndAddToDeleteCollection(_item.CollectionKeyWithoutNewHandle);

Auftrag.Renumber();

Auftrag.Calculate(true);
Auftrag.Validate(true);

if (!Auftrag.Save(false))
    throw new Exception($"Speichern des Belegs {Auftrag.BelegnummerFormatiert}/{Auftrag.Handle} gescheitert.");

return true;
Stimmt vielleicht etwas an der Reihenfolge nicht?


EDIT
Ich korrigiere mich: Es stehen 0 Elemente in PositionDeleted, wenn ich RemoveAndAddToDeletedCollection() verwende.
 
EDIT
Ich korrigiere mich: Es stehen 0 Elemente in PositionDeleted, wenn ich RemoveAndAddToDeletedCollection() verwende.
Dann können die alten Positionen auch nicht gelöscht werden.
Beim Speichern wird die _positionenDeleted-Collection durchlaufen und die Datensätze auf Basis der Handle gelöscht.
 
Zurück
Oben