Lagerplätze für Stücklistenelemente bei Belegübernahme

Arne Drews

Mitglied
Moin,

Ich komme grad nicht weiter bei der Übernahme eines Auftrags in einen Lieferschein, wo Handelsstücklisten enthalten sind.
Das Problem ist, dass die Lagerplatzzuordnung der Stücklistenelemente nicht aus dem Auftrag übernommen werden.
Bei Standard-Artikeln und Produktionsstücklisten werden die Zuordnungen sauber übernommen, aber für die Elemente einer Handelsstückliste wird immer der Hauptlagerplatz verwendet, anstelle dem Platz, der im Auftrag zugewiesen ist.

Was übersehe ich?
Ich übernehme die Positionen aus den Belegen wie folgt:
C#:
foreach (BelegPosition pos in Auftrag.Positionen)
{
    decimal offen = pos.GleichgewichtsstatistikBestellt - pos.GleichgewichtsstatistikGeliefert;

    if (offen <= 0)
        continue;

    BelegPosition p = new BelegPosition(Lieferschein);
    p.SetArtikel(pos.Artikelnummer, pos.AuspraegungsHandle);
    p.Lagerplatz = pos.Lagerplatz;
    p.Menge = offen;
    p.Einzelpreis = pos.Einzelpreis;
    p.Rabatt = pos.Rabatt;
    p.Lagerplatz = pos.Lagerplatz;
    p.Bezeichnung1 = pos.Bezeichnung1;
    p.Bezeichnung2 = pos.Bezeichnung2;

    p.Langtext = pos.Langtext;
    p.LangtextHtml = pos.LangtextHtml;

    if (pos.LangtextIstRichtext)
        p.LangtextRtf = pos.LangtextRtf;

    // eBay
    if (Auftrag.Kontogruppe == "10")
    {
        p.UserProperties["USER_ebayID"].Value = pos.UserProperties["USER_ebayID"].Value;
        p.UserProperties["USER_ebayTitle"].Value = pos.UserProperties["USER_ebayTitle"].Value;
        p.UserProperties["USER_ebayTransaction"].Value = pos.UserProperties["USER_ebayTransaction"].Value;
    }

    p.Calculate();
    p.GleichgewichtsstatistikBestellt = pos.Menge;
    p.GleichgewichtsstatistikGeliefert += p.Menge;
    p.GleichgewichtsstatistikBerechnet = pos.GGBerechnetStatus;

    p.SetVorgangPositionHandle(pos.VorgangspositionsHandle);
    p.IstErledigt = false;
    Lieferschein.Positionen.Add(p);
}
 
Hi,

Versuchs mal so (statt p.Lagerplatz = pos.Lagerplatz;):

var Kurzbezeichnung = context.Mandant.MainDevice.Lookup.GetString("Kurzbezeichnung", "KHKLagerplaetze", $"Mandant = {context.Mandant.Id} AND PlatzID = {pos.Lagerplatz}");
p.SetLagerplatz(pos.Lagerplatz, Kurzbezeichnung);
 
Danke Dir für den Ansatz, probiere ich nachher mal aus und gebe Feedback.
Ich kann mir allerdings nicht vorstellen, dass das hilft, denn mit SetLagerplatz übergebe ich ja genau einen Lagerplatz. Die Elemente der Handelsstückliste sind ja aber aufgeteilt auf mehrere Lagerplätze.
p ist in dem Fall die Handelsstückliste selbst.

Aber ich teste das mal und gebe Feedback, danke!
 
Sorry, falsch gelesen. Es geht um Übernahme aus der Auftragsposition.
Dann wirst du nicht drum herum kommen, durch die Stuecklistenelemente zu iterieren und dort alle Lagerplaetze einzeln zu setzen.
 
Für die, die es mal benötigen, geht natürlich ganz einfach:
C#:
// p = Position aus Ziel (Lieferschein)
// pos = Position aus Quelle (Auftrag)
for (int idx = 0; idx < pos.Stueckliste.Count; idx++)
    p.Stueckliste[idx].Lagerplatz = pos.Stueckliste[idx].Lagerplatz;

Wäre aus meiner Sicht allerdings noch einfacher oder cooler, wenn das automatisch übernommen werden würde.
Mir fällt zumindest kein plausibler, praktischer Fall ein, bei dem ich einen Beleg übernehme und die Lagerplätze der Stücklistenelemente nicht so gesetzt haben möchte, wie im Quellbeleg.

Ist im Grunde zwar nur ein Zweizeiler, aber die Notwendigkeit erschließt sich mir nicht.
 
Guten Morgen ,

ist die Funktion CopyData nicht am besten hierfür geeignet
p.CopyData(pos);

Mit p.SetArtikel wird eine komplett neue Position anhand der Stammdaten erzeugt und schließlich über p.SetVorgangPositionHandle(pos.VorgangspositionsHandle); die Verbindung hergestellt.
Wenn jedoch in der AB die Stückliste geändert wurde (neue Stücklistenelemente, Mengen, Lager etc...), wird durch die erwähnte Iteration über die pos.Stücklisten das nicht berücksichtigt. Außerdem kann in einer Stückliste eine Stückliste vorkommen, z. B. ein Set besteht aus mehreren Sets, die wiederum Stücklistenelemente enthalten..

Beste Grüße
Sergej Müller
 
CopyData() ist mir gar nicht aufgefallen.
Kopiert das alles an den Positionen, wie Menge usw., außer den Handles? Also auch benutzerdefinierte Felder usw.? Dann könnte man sich ja auch ne Menge anderer Zeilen Code sparen. Werde ich bei Gelegenheit mal testen, bevor ich das in dieses Projekt einbaue.

Danke für den Hinweis!
 
CopyData() ist mir gar nicht aufgefallen.
Kopiert das alles an den Positionen, wie Menge usw., außer den Handles? Also auch benutzerdefinierte Felder usw.? Dann könnte man sich ja auch ne Menge anderer Zeilen Code sparen. Werde ich bei Gelegenheit mal testen, bevor ich das in dieses Projekt einbaue.

Danke für den Hinweis!
Hallo,

genau, alles außer den Handles wird dabei kopiert. Auch die benutzerdefinierten Felder.

Viele Grüße
Marcel @ web2perform
 
Darf ich nochmal fragen, in welcher Assembly CopyData() steckt? :)

EDIT: Sorry, habe das falsche Objekt verwendet
Danke!
 
Zuletzt bearbeitet:
Zurück
Oben