Spezielle automatische Artikelnummern-Vergabe
Allgemeine Erklärung
In diesem Beispiel unterscheidet der easyWinArt-Anwender in seinen Geschäftsprozessen im Wesentlichen zwei verschiedene Grundarten von Artikeln: Güter und Dienstleistungen. Um die Handhabung praktisch zu gestalten, wurden entsprechend zwei Verweis-Menüfunktionen angelegt, so dass sich jeweils mit einem Klick die gewünschten Artikel öffnen lassen. Als Unterscheidungsmerkmal dient das Häckchen 'Lagerfähig' in der Registerkarte 'Dispositions-Kennzeichen'.
In der weiteren Konsequenz sollen die beiden Artikelarten in verschiedenen Nummernkreisen geführt werden. Bei Anlage eines neuen Artikels bzw. bei Kopie eines vorhandenen Artikels soll entsprechend der Einstellung des Häckchens 'Lagerfähig' eine Artikelnummer von 1 bis 999 (Dienstleistungen) bzw. von 1000 bis 99999999 (Güter) vergeben werden. Es werden die vorhandenen Artikelnummern (innerhalb der angegebenen Werte) durchlaufen und die nächste freie Nummer ausgesucht, gibt es eine Lücke, so wird diese Nummer ausgewählt. Die neue Artikrelnummer wird dann in das Textfeld 'Artikelnummer' eingefügt. Wird auf das Häckchen 'Lagerfähig' geklickt, so wird die Prozedur erneut durchgeführt und eine Nummer aus dem jeweils anderen Nummernkreis verwendet.
VB.NET SDK-Programmcode:
#Region " TriggerFormFramework_NachLoad-Ereignis "
Private Sub TriggerFormFramework_NachLoad(ByVal sender As Object, ByVal e As FormFrameworkEventArgs) Handles Me.NachLoad
'>>> Bei Menüfunktion A R T I K E L
If TypeOf sender Is ArtikelFRM Then
Dim ArtFRM As ArtikelFRM
ArtFRM = CType(sender, ArtikelFRM)
'>>> Wenn der Anwender das Lagerfähig-Hückchen anklickt, soll die Artikelnummer angepasst werden
AddHandler ArtFRM.CheckBoxLagerfähigJN.EwaControlChanged, AddressOf SetzeNächsteFreieAritkelnummer
End If
End Sub
#End Region
#Region " TriggerFormFramework_NachNeu-Ereignis "
Private Sub TriggerFormFramework_NachNeu(ByVal sender As Object, ByVal e As FormFrameworkNeuEventArgs) Handles Me.NachNeu
'>>> Bei Menüfunktion A R T I K E L
If TypeOf sender Is ArtikelFRM Then
'>>> Beim Anlegen eines neuen Artikels soll die Artikelnummer angepasst werden
SetzeNächsteFreieAritkelnummer(sender, e)
End If
End Sub
#End Region
#Region " TriggerFormFramework_NachKopieren-Ereignis "
Private Sub TriggerFormFramework_NachKopieren(ByVal sender As Object, ByVal e As FormFrameworkEventArgs) Handles Me.NachKopieren
'>>> Bei Menüfunktion A R T I K E L
If TypeOf sender Is ArtikelFRM Then
'>>> Beim Anlegen eines neuen Artikels durch Kopie eines vorhandenen soll die Artikelnummer angepasst werden
SetzeNächsteFreieAritkelnummer(sender, e)
End If
End Sub
#End Region
#Region " Private Sub: SetzeNächsteFreieAritkelnummer (Entsprechend vorgegebener Regeln Artikelnummer vorgeben) "
Private Sub SetzeNächsteFreieAritkelnummer(ByVal sender As Object, ByVal e As EventArgs)
'>>> Bei Menüfunktion A R T I K E L
Dim ArtFrm As ArtikelFRM
ArtFrm = CType(CType(sender, Control).FindForm, ArtikelFRM)
'>>> Nur nach Neu und nach Kopieren soll die Artikelnummern-Vergabe ablaufen
If ArtFrm.SpeicherungsTyp = SpeichernTyp.Neu Or ArtFrm.SpeicherungsTyp = SpeichernTyp.Kopieren Then
Dim minArtikelNr, maxArtikelNr, zähler, artikelnummer, neueArtikelnummer As Integer
Dim tmpRow As DataRow
If ArtFrm.CheckBoxLagerfähigJN.Checked Then
'>>> Güter-Artikel
minArtikelNr = 1000
maxArtikelNr = 99999999
Else
'>>> Dienstleistungs-Artikel
minArtikelNr = 1
maxArtikelNr = 999
End If
'>>> Aktuelle Artikelnummern holen (nur Artikelnummern bestehend aus ganzen Zahlen)
Dim tmpDBZ As SQLServerZugriff = Datenbank.DatenDB
Dim tmpSQL As String = "SELECT CAST(" & TBL.Artikel.ArtikelNummerVC & " AS INTEGER) AS " & TBL.Artikel.ArtikelNummerVC & _
" FROM " & TBL.Artikel.TBL & _
" WHERE NOT " & TBL.Artikel.ArtikelNummerVC & " LIKE '%[^0-9]%' " & _
" ORDER BY " & TBL.Artikel.ArtikelNummerVC
tmpDBZ.LöscheParameter()
Dim tmpTable As DataTable = tmpDBZ.BildeDataTableSQL(tmpSQL, TBL.Artikel.TBL)
If tmpTable.Rows.Count <> 0 Then
'>>> Zähler initialisieren
zähler = minArtikelNr
'>>> Alle aus der Datenbank geholten Artikelnummern durchlaufen
For Each tmpRow In tmpTable.Rows
artikelnummer = C.ToIntegerX(tmpRow(TBL.Artikel.ArtikelNummerVC))
'>>> Artikelnummer nur auswerten, wenn sie in den Nummernkreis passt
If artikelnummer >= minArtikelNr AndAlso artikelnummer <= maxArtikelNr Then
If zähler <> artikelnummer Then
Exit For
Else
zähler += 1
End If
End If
Next
End If
'>>> Falls alle möglichen Nummern breits vergeben, einfach max nehmen, Hinweis kommt dann beim Versuch zu Speichern sowieso
If zähler >= maxArtikelNr Then
neueArtikelnummer = maxArtikelNr
Else
neueArtikelnummer = zähler
End If
'>>> neue Artikelnummer in Artikelnummer-Feld setzen
ArtFrm.BasisFkt.SetzeControl(ArtFrm.TextBoxArtikelNummer, neueArtikelnummer)
End If
End Sub
#End Region