[Lagerbuchung] Wie mache ich korrekt eine Entnahmestorno per Code?

Paul@GEKKO

Mitglied
Hallo Zusammen,

ich möchte gerne ein Lagerbuchungstool bauen, welches auch Entnahmestorno (ES) oder auch Zugangstorno (ZS) korrekt durchführt!

mit diesem (Test-)Code konnte ich eine ES zu einem Job und zu einer BuchungsID durchführen...
C#:
            List<int[]> IDs = new List<int[]>();

            //Test              JobID , BuchungsID
            IDs.Add(new int[] { 980246, 11610531 });
            IDs.Add(new int[] { 980247, 11610532 });

            foreach (int[] jobbuch in IDs)
            {

                nJobID = jobbuch[0];
                BuchungsId = jobbuch[1];

                LagerJob oLagerJob = new LagerJob(_mandant, DateTime.Today, (short)DateTime.Today.Year);
               
                oLagerJob.JobHandle = nJobID;

                LagerplatzBuchung oLagerplatzbuchung = new LagerplatzBuchung(_mandant, DateTime.Today, (short)DateTime.Today.Year);
                LagerplatzBuchung oLagerplatzbuchungZuStorno = new LagerplatzBuchung(_mandant, DateTime.Today, (short)DateTime.Today.Year);
                oLagerplatzbuchungZuStorno.Load(BuchungsId);

                Lagerplatz oHerkunftslagerplatz = new Lagerplatz(_mandant, DateTime.Today);
                Lagerplatz oZielLagerplatz = new Lagerplatz(_mandant, DateTime.Today);

                SeriennummernEintragCollection colSerienNr = new SeriennummernEintragCollection();


                oLagerplatzbuchung.Bewegungsart = "ES";
                oLagerplatzbuchung.SerienNummernPflichtigkeit = oLagerplatzbuchungZuStorno.SerienNummernPflichtigkeit;

                oLagerplatzbuchung.Bewegungsdatum = oLagerplatzbuchungZuStorno.Bewegungsdatum;

                oLagerplatzbuchung.Artikelnummer = oLagerplatzbuchungZuStorno.Artikelnummer;
                oLagerplatzbuchung.MengeBasis = oLagerplatzbuchungZuStorno.MengeBasis;
                oLagerplatzbuchung.MengeLager = oLagerplatzbuchungZuStorno.MengeLager;
                oLagerplatzbuchung.SerienNummernCollection = oLagerplatzbuchungZuStorno.SerienNummernCollection;

                oZielLagerplatz.PlatzHandle = oLagerplatzbuchungZuStorno.DataServiceLagerplatzbuchungTransfer.LagerplatzHerkunftHandle;
                oHerkunftslagerplatz.PlatzHandle = oLagerplatzbuchungZuStorno.DataServiceLagerplatzbuchungTransfer.LagerplatzZielHandle;

                if (oLagerplatzbuchung.PruefeBuchung(ref oHerkunftslagerplatz, ref oZielLagerplatz, false, false))
                {
                    oLagerplatzbuchung.Intern = 2;
                    if (!oLagerplatzbuchung.Save(ref oHerkunftslagerplatz, ref oZielLagerplatz, oLagerJob))
                    {
                        Console.WriteLine($"/!\\ - BUCHUNG GESCHEITERT: <ES> JobID: {nJobID} mit BuchungsID: {BuchungsId} nicht möglich!" + "\n### MELDUNG ###\n" + oLagerplatzbuchung.Errors.GetDescriptionSummary());
                    }
                }
                else
                {
                    Console.WriteLine($"/!\\ - PRÜFUNG GESCHEITERT: <ES> JobID: {nJobID} mit BuchungsID: {BuchungsId} nicht möglich!" + "\n### MELDUNG ###\n" + oLagerplatzbuchung.Errors.GetDescriptionSummary());
                }
            }


...jedoch fiel mir auf, dass in der stornierten ZM-Buchung das Flag "Intern" nicht auf 4 (=Storniert) gesetzt wird, daher geh ich davon aus, dass ich entweder die Buchung (zu Stornierende) nochmals speichern muss und ggf. Intern = 4 setze, oder es gibt eine Methode oder Eigenschaft bei der Stornobuchung selbst, an der ich rütteln müsste?!?
Und wenn ich beide Buchungen speichern müsste, dann in welcher Reihenfolge, bzw. was muss ich bei der stornierten Buchung alles setzen?


Mfg
Paul@GEKKO
 
Sollte einfach über die Delete-Methode funktionieren:
LagerplatzBuchung oLagerplatzbuchung = new LagerplatzBuchung(_mandant, DateTime.Today, (short)DateTime.Today.Year);
oLagerplatzbuchung.BuchungsHandle = BuchungsId;
if (oLagerplatzbuchung.Delete)
{
...
}


Du kannst auch alle Buchungen des Jobs mit einer Methode zurücksetzen:
oLagerJob.DeleteJob()
 
Danke @diakh klingt äußerst Umstandsfrei!

Wird mit oLagerJob.DeleteJob() der Job wirklich gelöscht (die JobID taucht nicht mehr in den Tabellen auf) oder tatsache etappenweise "Storniert"?
Wenn diese storniert werden und ein ZugangBestellung dort aufgetreten war, müsste der WE-Beleg nicht storniert werden?

Vielen Dank und MfG Paul@GEKKO
 
Mit oLagerJob.DeleteJob() werden nur die Buchungen im Job storniert, der Job wird dabei nicht gelöscht.
 
Das ist schonmal sehr gut zu wissen und funktioniert Super!!!


Für ein Storno einfach im LagerJob Objekt das Handle setzen und dessen Delete() Methode ausführen
und
Für eine bestimmte Buchung das gleiche nur das ich das BuchungsHandle im Lagerbuchungsobjekt setze!



Nun bin ich noch auf Lagerfunctions.RecoverLagerbestaende gestoßen, damit sollen wohl automatisch erzeugte Buchungen rückabgewickelt werden können:
1661870121344.png

Leider habe ich auf der schnelle hier im Forum nichts dazu gefunden, daher würde ich gerne zur Handhabung einige Tipps bekommen, denn so einfach wie beim Delete Job/Buchung ist das dann wohl nicht, das hatte ich einfach mal versucht:
C#:
    if (!Func.RecoverLagerbestaende(ref Fehlertext, ekBelegId: 992394))
        Console.WriteLine("Fehler: "+ Fehlertext);
    else
        Console.WriteLine("Alles OK");

Nun ist meine Folgefrage, wie ich denn diese "Lagerfunctions" zur Rückabwicklung von "ZB"-Buchungen nutzen kann oder täuscht der Hinweis aus dem Summary der DeleteJob-Methode?


Vielen Dank und MfG Paul@GEKKO
 
Was hast Du denn vor?
Wenn Du z.B. die Buchungen zu einem Wareneingangsbeleg zurücksetzen möchtest, musst Du den Wareneingangsbeleg ändern/löschen oder besser noch den Wareneingang in einen Retour-Beleg übernehmen. Die "RecoverLagerbestaende"-Funktion wird dann vom Belegobjekt aufgerufen, wenn ein Beleg geändert oder gelöscht wird.
 
Moin,

wir behandeln Wareneingänge bei uns etwas fern vom Standard, es werden zuerst Seriennummern erzeugt und auf einem Dummy-Artikel gebucht (Ware ist eingetroffen und hoffentlich auch Vollständig in der Teileanzahl) , der Wareneingang wird erst in der Technik durchgeführt. Jetzt werden die WE-Belege mit tatsächlichen Artikelnummern erzeugt und hier auch gerne erst bemerkt, dass die Ware garnicht genau der bestellten entspricht!

Also sollte etwas auf dem Weg schief gehen, es kommt was durcheinander und zu Verwechslungen, es kommen nicht alle Teile, es wird an der Bestellung geschraubt und die Positionen passen nichtmehr zu denen in der "Warenposten"-Tabelle... muss ich aufräumen!
Daher möchte ich das "Zurückrollen eines Warenpostens" weitgehend automatisieren und dies gerne sauber mit Stornos bei Buchungen und Belegen.

Dies soll also ein Werkzeug für mich werden, um mir das gepflücke beim Aufräumen zu ersparen!


Gut, ich kann gerne den Weg über den Belegobjekten machen und das klassisch per "Übernahme in...", jedoch hätte ich gehofft dafür gibt es auch noch eine Methode, die so leicht wie die Delete Methoden der Lagerobjekte handzuhaben ist. ^^'


Vielen Dank für die Tipps, dass hat mir sehr geholfen!

MfG Paul@GEKKO
 
Du kannst ja einfach den Beleg laden und im Beleg die Positionen anpassen. Die Lagerbuchungen werden dann automatisch storniert und neu erstellt. Dann passt der Beleg zu den Buchungen und die Programmierung ist eigentlich noch einfacher umzusetzen.
 
Zurück
Oben