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
}
}