Zum Inhalt

Lagerverwaltung

Das IAutoLager-Interface (soLager) stellt die zentrale Schnittstelle für alle Lagerbewegungen über die COM-Aktiv-Schnittstelle dar. Es ermöglicht das Einbuchen, Umbuchen und Ausbuchen von Artikelbeständen sowie die Verwaltung von Seriennummern. Die Funktionalitäten orientieren sich an den Assistenten der microtech Software - die Eigenschaftsnamen entsprechen weitgehend den Bezeichnungen in der Oberfläche.

Objekte immer in eigenen Variablen halten

Die Unterobjekte Einbuchen, Umbuchen und Abgang müssen in einer eigenen Variablen oder einem With-Block verwendet werden. Ein verketteter Zugriff über das Lagerobjekt führt zu Fehlern.

Falsch:

Lager.Abgang.LagerNr = "1"
Lager.Abgang.Menge = 1
Lager.Abgang.Execute

Richtig - With-Block:

With Lager.Abgang
    .LagerNr = "1"
    .Menge = 1
    .Execute
End With

Richtig - eigene Variable:

Dim Abgang As AutoLager.AutoLagerAbgang
Set Abgang = Lager.Abgang
Abgang.LagerNr = "1"
Abgang.Menge = 1
Abgang.Execute
Set Abgang = Nothing

Dasselbe gilt für Einbuchen und Umbuchen.

Überblick: Das Lagerobjekt

Das Lagerobjekt wird wie andere SpecialObjects über GetSpecialObject bezogen:

Set Lager = BpApp.GetSpecialObject(soLager) ' soLager = 0

Es stellt vier Unterobjekte bereit:

Unterobjekt Beschreibung
SerienNrObj Seriennummern-Objekt für die Angabe von Seriennummern bei Lagerbewegungen. Nach jeder Verwendung werden alle Seriennummern gelöscht - das Objekt muss für jede Operation neu befüllt werden.
Einbuchen Lagerzugang durchführen. Die Berechtigungen des Lagerzugangsassistenten werden so weit wie möglich übernommen.
Abgang Lagerbestand ausbuchen. In den Berechtigungen muss das Kennzeichen „Lagerbestände über COM Anbindung ausbuchen" gesetzt sein.
Umbuchen Bestand zwischen zwei Lagern desselben Artikels transferieren.

Über das erweiterte Interface IAutoLager2 steht zusätzlich die Methode VgbLagerName zur Verfügung, mit der die in den Programmparametern hinterlegten Vorgabelager-Bezeichnungen abgefragt werden können.

Lager initialisieren (InitLager)

Bevor eine Lageroperation ausgeführt werden kann, muss InitLager aufgerufen werden. Diese Methode wählt den Artikel aus und bereitet das Lagerobjekt vor.

InitLager(ArtikelNr As String, [Waehrung As String]) As Boolean
Parameter Typ Beschreibung
ArtikelNr String Artikelnummer
Waehrung String (optional) Währungskurzbezeichnung, z. B. "EUR". Wird nichts angegeben, wird die Leitwährung 1 verwendet.
Rückgabe Boolean True, wenn die Lager zu diesem Artikel gefunden wurden.

InitLager ist Pflicht

Jeder Zugriff auf Unterobjekte des Lagerobjekts vor Abschluss von InitLager löst eine Fehlermeldung aus.

Beispiel: Lager initialisieren (VBA)
Dim Lager As IAutoLager
Set Lager = BpApp.GetSpecialObject(soLager)

If CBool(Lager.InitLager("1")) Then
    ' Lager für Artikel "1" bereit - Operationen können folgen
End If

Seriennummern

Für Artikel mit Seriennummernverwaltung muss vor Einbuchung, Umbuchung oder Abgang ein Seriennummern-Objekt erstellt und befüllt werden.

Seriennummern-Objekt erstellen

Das Seriennummern-Objekt wird über die Methode SerienNrObj des Lagerobjekts erzeugt:

Set Sernr = Lager.SerienNrObj

Das zurückgegebene IAutoSeriennummern-Interface bietet Methoden zur Verwaltung der Seriennummern. Nach jeder abgeschlossenen Lageroperation (z. B. Execute beim Einbuchen) werden die enthaltenen Seriennummern automatisch gelöscht. Für eine folgende Operation muss das Objekt erneut befüllt werden.

Erweiterung erforderlich

Das Seriennummern-Objekt kann nur erstellt werden, wenn die Erweiterung zur Seriennummernverwaltung vorliegt. Nur Lager mit aktivierter Seriennummernverwaltung nehmen Seriennummern entgegen.

Seriennummern hinzufügen, löschen, prüfen

Methode Beschreibung
Add(Number As String) As Long Fügt eine Seriennummer hinzu. Gibt die Einfügeposition zurück. Unterstützt auch Bereichssyntax, z. B. "SN100..10" um mehrere Nummern auf einmal zu erzeugen.
Delete(Index As Long) Löscht die Seriennummer an der angegebenen Position.
Count() As Long Gibt die Anzahl der aktuell enthaltenen Seriennummern zurück.
NrAtPos(Count As Long) As String Gibt die Seriennummer an einer bestimmten Position zurück.
CheckupDuplicates(DeleteDuplicates As Boolean) As String Prüft auf doppelte Seriennummern. Bei True werden Duplikate gelöscht. Rückgabe "True", wenn Duplikate vorhanden sind/waren.
Pack(Sort As Boolean, Pack As Boolean) Sortiert die Liste (Sort = True) und/oder packt sie (Pack = True). Der Parameter Pack sollte unter COM nicht verwendet werden.
Clear() Löscht alle Seriennummern im Objekt.

Seriennummern-Anzahl muss exakt stimmen

Beim Einbuchen müssen immer exakt so viele Seriennummern vorhanden sein, wie Artikel eingebucht werden. Stimmt die Anzahl nicht überein, schlägt die Buchung fehl.

Einbuchen

Das Einbuchungs-Objekt bildet den Lagerzugangsassistenten der microtech Software ab. Es wird über Lager.Einbuchen erzeugt und gibt ein IAutoLagerEinbuchen-Interface zurück.

Eigenschaften des Einbuchungs-Objekts

Eigenschaft Typ Beschreibung
InLagerBuchen Boolean Kennzeichen, ob die Artikel in das gewählte Lager gebucht werden.
LagerNummer String Nummer des Ziellagers. Pflichtfeld.
Lagerzugang Long Ganzzahlige Anzahl der zuzubuchenden Artikel (kann Fließkommawert sein, wenn keine Seriennummern vergeben werden).
Mengenfaktor Double Mengenfaktor.
Einzelpreisfaktor Double Einzelpreisfaktor.
Charge String Chargennummer (nur mit entsprechender Erweiterung).
Verfallsdatum Date Verfallsdatum / MHD.
Belegnummer String Belegnummer.
BelegPosition Long Belegposition.
Auftragsnummer String Auftragsnummer.
AuftNrbuchen Boolean Kennzeichen, ob die Auftragsnummer beachtet wird.
Kostenstellennummer String Kostenstellennummer (nur mit entsprechender Erweiterung).
LieferantNr String Adressnummer des Lieferanten. Wenn leer, können PreisInLieferant und STDLieferant nicht verwendet werden.
PreisInLieferant Boolean EK-Preis in den Lieferantendatensatz eintragen.
STDLieferant Boolean Lieferant als Standardlieferant setzen.
BestellNr String Bestellnummer.
EPreis Double Einzelpreis.
EPreisMenge Double Einzelpreismenge.
MitEkNeu Boolean Mittleren Einkaufspreis neu berechnen.
EkBerechgrundlage Double Berechnungsgrundlage für den Einkaufspreis.
KalkVkPreis Boolean Verkaufspreise neu kalkulieren.
InHistory Boolean Kennzeichen, ob ein History-Eintrag erstellt wird.

Die Methode Execute führt den Lagerzugang mit den gesetzten Werten durch.

Über das erweiterte Interface IAutoLagerEinbuchen2 steht zusätzlich die Eigenschaft Lagerzugang2 (Double) zur Verfügung: Fließkomma-Variante, kann mit IAutoLagerEinbuchen2 verwendet werden.

Beispiel: Lagerzugang mit Seriennummern

Lagerzugang mit Seriennummern (VBA)
Set Sernr = Lager.SerienNrObj

With Lager.Einbuchen
    .InLagerBuchen = True
    .AuftNrbuchen = True
    .Auftragsnummer = "AuftragNr"
    .Belegnummer = "BelegNr"
    .BelegPosition = 1
    .BestellNr = "BestNr_Artikel"
    .Charge = "Chargennummer"
    .Einzelpreisfaktor = 1
    .EkBerechgrundlage = 1
    .EPreis = 150
    .EPreisMenge = 1
    .InHistory = True
    .KalkVkPreis = True
    .Kostenstellennummer = "KostenNr"
    .LagerNummer = "1"
    .Lagerzugang = 4
    .LieferantNr = "10000"
    .Mengenfaktor = 1
    .MitEkNeu = True
    .PreisInLieferant = True
    .STDLieferant = True
    .Verfallsdatum = Now + 14

    ' Seriennummern hinzufügen - Anzahl muss exakt mit Lagerzugang übereinstimmen
    Sernr.Add "SerNr0100"
    Sernr.Add "SerNr0101"
    Sernr.Add "SerNr0102"
    Sernr.Add "SerNr0103"

    .Execute
End With

Umbuchen

Das Umbuchen-Objekt transferiert Lagerbestand zwischen zwei Lagern desselben Artikels. Es wird über Lager.Umbuchen erzeugt und gibt ein IAutoLagerUmbuchen-Interface zurück.

Zwischen Lagern transferieren

Eigenschaft Typ Beschreibung
VonLager String Quell-Lager, z. B. "1" oder "Einkauf".
NachLager String Ziel-Lager, z. B. "2" oder "Verkauf".
Menge Double Anzahl der umzubuchenden Artikel.
Belegnummer String Belegnummer.
BelegPosition Long Belegposition.
Auftragsnummer String Auftragsnummer.
Buchungsdatum Date Datum der Umbuchung.
Verfallsdatum Date Verfallsdatum / MHD.
Kostenstellennummer String Kostenstellennummer.
Charge String Chargennummer.
BewegungStatus Long Status der Lagerbewegung.

Die Methode Execute führt die Umbuchung aus.

Umbuchen (VBA)
With Lager.Umbuchen
    .VonLager = "1"
    .NachLager = "2"
    .Menge = 1
    .Verfallsdatum = Now + 14
    .Charge = "Chargennummer String"
    .Kostenstellennummer = "Umbuchen Kostenstellennummer"
    .Auftragsnummer = "Umbuchen Auftragsnummer"
    .Belegnummer = "Umbuchen Belegnummer"
    .BelegPosition = 1
    .Buchungsdatum = CDate("01.01.2004")
    .Execute
End With

Stellplatzverwaltung

Über das erweiterte Interface IAutoLagerUmbuchen2 stehen zusätzliche Eigenschaften für die Stellplatzverwaltung und Identnummern zur Verfügung:

Eigenschaft Typ Beschreibung
AusStellplaetze String Stellplatz-Angabe für die Quelle, z. B. "1/S1/E1".
NachStellplaetze String Stellplatz-Angabe für das Ziel, z. B. "1/S1/E1".
IdentnummerUmbuchen Boolean Kennzeichen, ob Identnummern mit umgebucht werden.

Ausbuchen (Abgang)

Das Abgangs-Objekt bucht Artikel aus einem Lager aus. Es wird über Lager.Abgang erzeugt und gibt ein IAutoLagerAbgang-Interface zurück.

Eigenschaft Typ Beschreibung
LagerNr String Lagernummer, aus der ausgebucht wird.
Menge Double Anzahl der auszubuchenden Artikel.

Die Methode Execute führt den Abgang aus.

Berechtigung erforderlich

Für das Ausbuchen über die COM-Schnittstelle muss in den Berechtigungen das Kennzeichen „Lagerbestände über COM Anbindung ausbuchen" gesetzt sein.

Abgang (VBA)
With Lager.Abgang
    .LagerNr = "1"
    .Menge = 1
    .Execute
End With

Vorgabelager-Namen ermitteln

Die Methode VgbLagerName des IAutoLager2-Interfaces gibt den in den microtech Programmparametern hinterlegten Namen eines Vorgabelagers zurück. Der zurückgegebene Wert kann dann bei Einbuchen, Umbuchen und Abgang als Lagername verwendet werden.

VgbLagerName(aVgbLager As VgbLager) As String

Die VgbLager-Aufzählung definiert die folgenden festen Lager:

Wert Konstante Beschreibung
101 Einkauf Das feste Lager für Einkauf.
102 Verkauf Das feste Lager für Verkauf.
106 FertigungEingang Das feste Lager „Eingang" für die Fertigung.
107 FertigungAusgang Das feste Lager „Ausgang" für die Fertigung.

Wichtiger Hinweis: Objekte in eigenen Variablen halten

Der zu Beginn dieser Seite beschriebene Stolperstein ist einer der häufigsten Fehler bei der Arbeit mit dem Lagerobjekt und verdient eine nochmalige Zusammenfassung:

Die drei Unterobjekte Einbuchen, Umbuchen und Abgang dürfen nicht über verkettete Aufrufe am Lagerobjekt angesprochen werden. Es gibt zwei korrekte Varianten: den With-Block oder die Zuweisung an eine eigene Variable. In C# ergibt sich die zweite Variante automatisch, da With dort nicht existiert.

Praxis-Beispiel: Lageroperationen in C

Das folgende C#-Beispiel zeigt Einbuchen, Ausbuchen und Umbuchen (inkl. Seriennummern und Stellplatzverwaltung) in verschiedenen Konstellationen.

Lageroperationen in C# - Einbuchen, Ausbuchen, Umbuchen
AutoLager aLager = ComApp.GetSpecialObject(SpecialObjects.soLager) as AutoLager;

// Init der Lager für Artikelnummer 1
if (aLager.InitLager("1"))
{
    AutoSeriennummern aSrNr = aLager.SerienNrObj();
    AutoLagerUmbuchen Umbuchen = aLager.Umbuchen();
    AutoLagerEinbuchen Einbuchen = aLager.Einbuchen();
    AutoLagerAbgang Abgang = aLager.Abgang();

    // Umbuchen mit Seriennummer und Stellplatzverwaltung
    aSrNr.Add("11");
    Umbuchen.VonLager = "3";
    Umbuchen.NachLager = "1";
    Umbuchen.Menge = 1;
    Umbuchen.BewegungStatus = 4;
    Umbuchen.IdentnummerUmbuchen = true;
    Umbuchen.AusStellplaetze = "1/S1/E1";
    Umbuchen.NachStellplaetze = "1/S1/E1";

    // Lagerbestand einbuchen
    Einbuchen.LagerNummer = "1";
    Einbuchen.InLagerBuchen = true;
    Einbuchen.Einzelpreisfaktor = 1;
    Einbuchen.Mengenfaktor = 1;
    Einbuchen.Lagerzugang = 123;
    Einbuchen.Execute();

    // Lagerbestand ausbuchen
    Abgang.LagerNr = "1";
    Abgang.Menge = 99;
    Abgang.Execute();

    try
    {
        Umbuchen.Execute();
    }
    catch (System.Exception ex)
    {
        // Fehlerbehandlung
    }
}
Umbuchen mit Charge, ohne MHD (C#)
if (aLager.InitLager("2"))
{
    AutoLagerUmbuchen Umbuchen = aLager.Umbuchen();
    Umbuchen.VonLager = "3";
    Umbuchen.NachLager = "1";
    Umbuchen.Menge = 1;
    Umbuchen.Charge = "A1";
    Umbuchen.BewegungStatus = 4;
    Umbuchen.IdentnummerUmbuchen = true;
    Umbuchen.AusStellplaetze = "1/S1/E1";
    Umbuchen.NachStellplaetze = "1/S1/E1";

    try
    {
        Umbuchen.Execute();
    }
    catch (System.Exception ex)
    {
        // Fehlerbehandlung
    }
}
Umbuchen mit Charge und MHD (C#)
if (aLager.InitLager("3"))
{
    AutoLagerUmbuchen Umbuchen = aLager.Umbuchen();
    Umbuchen.VonLager = "3";
    Umbuchen.NachLager = "1";
    Umbuchen.Menge = 1;
    Umbuchen.Charge = "A1";
    Umbuchen.Verfallsdatum = DateTime.Now;
    Umbuchen.BewegungStatus = 4;
    Umbuchen.IdentnummerUmbuchen = true;
    Umbuchen.AusStellplaetze = "1/S1/E1";
    Umbuchen.NachStellplaetze = "1/S1/E1";

    try
    {
        Umbuchen.Execute();
    }
    catch (System.Exception ex)
    {
        // Fehlerbehandlung
    }
}