HILFE! C# Belege - Wareneingang - Seriennummern nennen?

Paul@GEKKO

Mitglied
Hallo Zusammen,

ich möchte gerne per Skript einen Wareneingangsbeleg erzeugen, jedoch ist mir nicht ganz klar, wie ich der Position eine Seriennummer zuweise!
Hier mein Test Code:

Code:
var WEBELEG = new Sagede.OfficeLine.Wawi.BelegEngine.Beleg(mandant, Sagede.OfficeLine.Wawi.Tools.Erfassungsart.Einkauf);
         
WEBELEG.Transform(939118, "ELL", DateTime.Today, short.Parse(DateTime.Today.Year.ToString()), false, true);
WEBELEG.Bearbeiter = sBearbeiter;

Sagede.OfficeLine.Wawi.BelegEngine.BelegPosition test = new Sagede.OfficeLine.Wawi.BelegEngine.BelegPosition(WEBELEG);

test.SetVorgangspositionsReferenz(18515299);
test.SetArtikel(sArtikelnummer,0);
test.SetLagerplatz(234,"WE;0;0;0");
test.Menge = 1;

Sagede.OfficeLine.Wawi.LagerEngine.SeriennummernEintrag sn = new Sagede.OfficeLine.Wawi.LagerEngine.SeriennummernEintrag();
sn.Seriennummer = "99999999";
test.SeriennummernPflicht = 3;
test.HatLagerfuehrung = true;
test.GebuchteSeriennummern = new Sagede.OfficeLine.Wawi.LagerEngine.SeriennummernEintragCollection() {sn};

test.RefreshBasismenge(true, 2);
test.RefreshStatusmengen();
test.Calculate();
test.PrepareForDataService();


WEBELEG.Positionen.Add(test);
WEBELEG.Calculate(true);

WEBELEG.Validate();

WEBELEG.Renumber();
WEBELEG.Save(false);


Kann mir jemand helfen wie ich einen Wareneingangsbeleg erstelle, dieser mir direkt eine 'ZB'-Buchung zur benannten Seriennummer macht?



Ich bedanke mich wie immer für eure Unterstützung schoneinmal jetzt im Vorraus!

MfG Paul@GEKKO
 
Du musst beim Lagerplatz in der Lagerplatz-Collection der Belegposition eine neue Collection für die Seriennummern hinzufügen und dieser Collection die Seriennummern über neue Seriennummerneinträge hinzufügen.
Also in etwa so (ohne es jetzt getestet zu haben):
belegPosition.Lagerplatz[0].SeriennummernEintraege = new SeriennummernEintragCollection();
SeriennummernEintrag seriennummer = new SeriennummernEintrag
{
Seriennummer = "99999999"
};
belegPosition.Lagerplatz[0].SeriennummernEintraege.Add(seriennummer);


Die Eigenschaften "SeriennummernPflicht" und "HatLagerfuehrung" werden über "SetArtikel" aus den Stammdaten gelesen und sollten an dieser Stelle eher ausgewertet aber nicht gesetzt werden?!
 
@diakh Vielen Dank!
So funktioniert es :-D

Jedoch kommt mir nun eine weitere Frage auf....
Und zwar gibt mir beleg.Validate() immer false zurück! Der Error und Warning Count stehen auf 0, auch der Beleg wurde gespeichert!
Leider ist die API-Reference nicht sehr aufschlussreich. Ich habe bereits eine vereinfachte Bestellanlage gebaut und bekomme dort kein false vom Validate zurück.

Woran kann das liegen? In welchen Fällen gibt Validate false zurück?

Nochmals vielen Dank und MfG Paul@GEKKO
 
In der Fehlercollection vom Beleg sollten Warnmeldungen stehen.
Beim Speichern würde ich auch nicht den Parameter "abbruchBeiWarnung" auf "false" setzen.
 
Hallo,

ich möchte dieses Thema nocheinmal wiederbeleben, denn ich bekomme bei einigen Belegen einen Fehler:
Description "Fehler in der Belegerfassung Einkauf\r\nEs sind keine Zahlungskonditionen angegeben."

Die Belege werden vom Einkauf mit Transform() in einen Wareneingang überführt und für die Positionen dann die entsprechende VorPosID als Referenz genannt...

Habe ich evtl. den Aufruf einer Methode vergessen?
Code:
bool gespeichert = false;
        bool valid = false;

        const int ArtikelAuspraegungID = 0;
        int ZiellagerPlatzID = 234;
        string ZiellagerKennung = "WE;0;0;0";
        int BelID = 0;

        foreach (DataRow r in WESeriennummern.Rows)
            MessageBox.Show(r["BelID"].ToString());
   

        string gesetzteSNs = "";

        try
        {
            BelID = (int)WESeriennummern.Rows[0]["BelID"];
       
            var mandant = ((dynamic)LSInfoSystem90.basStatic.goApplication.oSageMandant).GetRealObject as Sagede.OfficeLine.Engine.Mandant;

            var WEBELEG = new Sagede.OfficeLine.Wawi.BelegEngine.Beleg(mandant, Sagede.OfficeLine.Wawi.Tools.Erfassungsart.Einkauf);

            WEBELEG.Transform(BelID, "ELL", DateTime.Today, (short)DateTime.Today.Year, false, true);
            WEBELEG.Bearbeiter = mandant.Benutzer.Name;


            DataTable dataVorPosIDs = WESeriennummern.DefaultView.ToTable(true, "VorPosID");

            foreach (DataRow r in dataVorPosIDs.Rows)
            {
                Sagede.OfficeLine.Wawi.BelegEngine.BelegPosition position = new Sagede.OfficeLine.Wawi.BelegEngine.BelegPosition(WEBELEG);

                position.SetVorgangspositionsReferenz((int)r["VorPosID"]);
                //position.VorgangspositionsHandle = 5755;
                position.SetArtikel(sNeueArtikelnummer, ArtikelAuspraegungID);
                position.SetLagerplatz(ZiellagerPlatzID, ZiellagerKennung);
                position.Menge = WESeriennummern.Select("VorPosID = " + r["VorPosID"].ToString()).Count();

                foreach (DataRow s in WESeriennummern.Select("VorPosID = " + r["VorPosID"].ToString()))
                {
                    gesetzteSNs += s["Seriennummer"].ToString() + ",";
                    Sagede.OfficeLine.Wawi.LagerEngine.SeriennummernEintrag sn = new Sagede.OfficeLine.Wawi.LagerEngine.SeriennummernEintrag();

                    sn.Seriennummer = s["Seriennummer"].ToString();

                    position.Lagerplatz[0].SeriennummernEintraege = new Sagede.OfficeLine.Wawi.LagerEngine.SeriennummernEintragCollection();
                    position.Lagerplatz[0].SeriennummernEintraege.Add(sn);
                }
                //position.RefreshBasismenge(true, 2);
                //position.RefreshStatusmengen();
                position.Calculate();
                //position.PrepareForDataService();
                WEBELEG.Positionen.Add(position);
            }
            WEBELEG.Calculate(true);

            if (WEBELEG.Validate())
            {//Beleg OK?
                WEBELEG.Renumber();
                gespeichert = WEBELEG.Save(false);  //Speichern ohne Meldungen
                sSessionLog += "(i) - Beleganlage: " + WEBELEG.Handle.ToString() + " erfolgreich erstellt!";
            }
            else
            {
                sSessionLog += WEBELEG.Errors.Warnings.ToString() + "\n";
                sSessionLog += WEBELEG.Errors.Errors.ToString() + "\n";
                sSessionLog += "(X) - Fehler beim speichern des Beleges! Es wurde kein Wareneingang verbucht für:\n" + gesetzteSNs + "\n";
            }

        }
        catch
        {
            sSessionLog += "(X) - Fehler beim setzen der Belegdaten! Es wurde kein Wareneingang verbucht für:\n" + gesetzteSNs + "\n";
        }


        return gespeichert;

Ich bitte daher um eure Unterstützungen und vielen Dank für euer Interesse!

MfG Paul@GEKKO
 
Du musst nach dem "Transform" die Zahlungskonditionen setzen.
Dazu kannst Du die Funktion BelegManager.FillZkdCollection() aus der BelegEngine nutzen (ggf. anschließend noch das Valutadatum anpassen) oder die Zahlungskonditionen einfach über beleg.SetZkd() vorgeben.
 
Ich habe festgestellt, wenn ich zuerst den Bestellbeleg lade, diesen dann mit Transform in einem Wareneingangsbeleg wandle und anschließend die übernommenen Positionen mit Clear() lösche, kann ich meine Positionen mit VorPos Referenz setzen und der Beleg wurde nun ohne Zahlungskonditions-Fehler gespeichert!

Ist dieser Weg denn 'legal', darf ich dies so tätigen oder gibt es denn an anderer Stelle Probleme (z.B. Beleg 'geblockt' weil in Bearbeitung bei...)?

Um 'FillZkdCollection() nutzen zu können, müsste ich doch auch zuerst den Bestell-Beleg laden und dessen ZkdCollection halten bis nach dem Transform()?
 
Wenn Du den Bestellbeleg lädst und die Belegart änderst, ist natürlich der Bestellbeleg nicht mehr da. Das meinst Du doch hoffentlich nicht?! Ansonsten wüßte ich nicht, wo da der Unterschied bezüglich der Zahlungskonditionen sein sollte.

Über "FillZkdCollection()" werden die Zahlungskonditionen aus dem Bestellbeleg gelesen und übernommen. Als Parameter musst Du dazu das BelegHandle (BelID) des Quellbelegs angeben. Den Beleg musst Du dazu nicht laden.
 
Nochmals vielen dank @diakh, das hat mir sehr geholfen!

Ich habe die Anwendung der Methode nun wie folgt verstanden:
Code:
//mandant, EINKAUF, BelegID vom Bestellbeleg(?),kein Archiv,0, ZKDCollection WEBELEG
            
Sagede.OfficeLine.Wawi.BelegEngine.BelegManager.FillZkdCollection(mandant, Sagede.OfficeLine.Wawi.Tools.Erfassungsart.Einkauf, BelID, false, 0, WEBELEG.ZKDs);

Also der Methode übergebe ich den Quell-Beleg-Handle und die ZKDCollection vom zu erstellenden WE-Beleg, da diese als ref übergeben wird, nehme ich an, dass diese Collection entsprechend in der Methode gefüllt wird!

Ich werde gleich einmal einige Tests tätigen! Danke und MfG Paul@GEKKO
 
Nun werden die ZKDs (im Objekt) wie erwartet gesetzt, jedoch gibt mir im nächsten Moment Validate() false zurück!

Hier mal ein kleiner Ausschnitt vom Debugger:
upload_2020-10-26_15-13-4.png

Der Error Count ist 0, jedoch habe ich ein false zurückbekommen...
Woran kann dies liegen, ich habe keine Idee und bitte um Hilfe!

MfG Paul@GEKKO
 
Das Setzen der Vorgangspositionsreferenz würde ich nach dem SetArtikel() machen und auf jeden Fall den Aufruf
position.RefreshBasismenge(true, 0) direkt nach dem Setzen der Menge wieder einfügen, damit die Basismenge und auch die Lagermengen aktualisiert werden.
Ein Fehler könnte durch das Testen auch in den Eindeutigkeiten der Seriennummern liegen.

Ruf mal die Validate()-Funktion mit dem Parameter "true" auf, dann solltest Du den Fehler über die Error-Collection auswerten können.
 
Zurück
Oben