Nabend
Ich habe gerade schlechten Code geschrieben, da mir keine Alternative eingefallen ist.
Es werden neue Artikel angelegt, alte Artikel kopiert und alte Artikel bearbeitet.
Dabei gibt es eine Abfrage, ob sich der Einkaufspreis, sowie der Verkaufspreis geändert hat und die alten Preise ggf. gespeichert. Das soll aber natürlich nicht passieren, wenn ein Artikel kopiert wird. Hier sollen alter EK und alter VK DBNull bleiben.
Folgender Code erledigt dies (ich poste nur die relevanten Auszüge):
Das klappt soweit auch alles. Mein Problem ist aber, dass PurchasingPrise und ReailPrice nicht 0 sind, wenn ich einen Artikel kopiere.
Wenn ich also Artikel1 in 100g angelegt habe, und diesen nun kopiere, um bei der Anlegung des gleichen Artikels in 250g Felder schon vorausgefüllt zu haben, habe ich auch den EK und VK des 100g Artikels in den beiden Variablen.
Folglich erkennt mein Code eine Änderung und schreibt mir alten EK und VK. Was ja aber falsch ist, es handelt sich um einen neuen Artikel.
Mein Plan ist also dem Kopieraufruf mitzuteilen, dass ein Artikel kopiert wird. Folgendermaßen:
In meiner frmEditArticle Form kann ich dann auf diese Public bolEditArticle prüfen:
Da ich aber für
Ich habe gerade schlechten Code geschrieben, da mir keine Alternative eingefallen ist.
Es werden neue Artikel angelegt, alte Artikel kopiert und alte Artikel bearbeitet.
Dabei gibt es eine Abfrage, ob sich der Einkaufspreis, sowie der Verkaufspreis geändert hat und die alten Preise ggf. gespeichert. Das soll aber natürlich nicht passieren, wenn ein Artikel kopiert wird. Hier sollen alter EK und alter VK DBNull bleiben.
Folgender Code erledigt dies (ich poste nur die relevanten Auszüge):
VB.NET-Quellcode
- Public Class frmEditArticle
- Private PurchasingPrice As Double
- Private RetailPrice As Double
- Private Sub FrmEditArticle_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- 'aktuellen EK und VK des geöffneten Artikels speichern
- Dim SelectedArticle = DirectCast(DirectCast(ArticleBindingSource.Current, DataRowView).Row, DtsSettings.ArticleRow)
- If Not SelectedArticle.IsPurchasingPriceNull Then PurchasingPrice = SelectedArticle.PurchasingPrice
- If Not SelectedArticle.IsRetailPriceNull Then RetailPrice = SelectedArticle.RetailPrice
- End Sub
- 'Sub zum speichern des Artikels
- Private Sub SaveArticle()
- If CheckUserInput() Then
- Me.ValidateChildren()
- Me.DialogResult = DialogResult.OK
- End If
- End Sub
- Private Function CheckUserInput() As Boolean
- '[...]
- 'Prüfen ob Art.Nr gleich ist, wenn ja - wird Artikel bearbeitet
- Dim SelectedArticle = DirectCast(DirectCast(ArticleBindingSource.Current, DataRowView).Row, DtsSettings.ArticleRow)
- If SelectedArticle.ArtNr = TBArtNr.Text Then ''Diese Abfrage ist reichlich Sinnlos. Bei meiner gebundenen Textbox ist sie natürlich immer True und taugt daher nicht als "Artikel wird kopiert Abfrage"
- 'Prüfen ob EK verändert wurde
- If Not SelectedArticle.IsPurchasingPriceNull Then
- If PurchasingPrice > 0 Then
- If Double.Parse(TBPurchasingPrice.Text) <> PurchasingPrice Then
- SelectedArticle.OldPurchasingPrice = SelectedArticle.PurchasingPrice
- SelectedArticle.LastCalculation = System.DateTime.Now
- End If
- End If
- End If
- 'Prüfen ob VK verändert wurde
- If Not SelectedArticle.IsRetailPriceNull Then
- If RetailPrice > 0 Then
- If Double.Parse(TBRetailPrice.Text) <> RetailPrice Then
- SelectedArticle.OldSellingPrice = SelectedArticle.RetailPrice
- SelectedArticle.LastCalculationSP = System.DateTime.Now
- End If
- End If
- End If
- End If
- Return True
- End Function
- End Class
Das klappt soweit auch alles. Mein Problem ist aber, dass PurchasingPrise und ReailPrice nicht 0 sind, wenn ich einen Artikel kopiere.
Wenn ich also Artikel1 in 100g angelegt habe, und diesen nun kopiere, um bei der Anlegung des gleichen Artikels in 250g Felder schon vorausgefüllt zu haben, habe ich auch den EK und VK des 100g Artikels in den beiden Variablen.
Folglich erkennt mein Code eine Änderung und schreibt mir alten EK und VK. Was ja aber falsch ist, es handelt sich um einen neuen Artikel.
Mein Plan ist also dem Kopieraufruf mitzuteilen, dass ein Artikel kopiert wird. Folgendermaßen:
VB.NET-Quellcode
- Public Class FrmMainForm
- Public bolCopyArticle As Boolean = False
- 'Sub zum kopieren eines Artikels
- Private Sub CopyArticle()
- bolCopyArticle = True
- Dim Source = DirectCast(ArticleDataGridView.DataSource, BindingSource)
- 'Daten des aktuell ausgewählten Artikels auslesen
- If Source.Current Is Nothing Then Exit Sub
- Dim SelectedArticle = DirectCast(DirectCast(Source.Current, DataRowView).Row, DtsSettings.ArticleRow)
- 'Artikelnummer um eins erhöhen
- Dim ArtNr As String = increaseArtNR(SelectedArticle.ArtNr)
- 'Daten des Artikels an bearbeitenForm übergeben
- Dim tpls As New List(Of Tuple(Of DataColumn, Object))
- With DtsSettings.Article
- 'Werte die belegt sein müssen übergeben
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.ArtNrColumn, ArtNr))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.Name1Column, SelectedArticle.Name1))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.VeColumn, SelectedArticle.Ve))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.ListPriceColumn, SelectedArticle.ListPrice))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.DiscountColumn, SelectedArticle.Discount))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.PurchasingPriceColumn, SelectedArticle.PurchasingPrice))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.SalesMarginColumn, SelectedArticle.SalesMargin))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.RetailPriceColumn, SelectedArticle.RetailPrice))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.SupplierIDColumn, SelectedArticle.SupplierID))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.CategoryIDColumn, SelectedArticle.CategoryID))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.TaxColumn, SelectedArticle.Tax))
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.ExpiringColumn, SelectedArticle.Expiring))
- 'Werte die belegt sein können, übergeben, wenn gefüllt
- If Not SelectedArticle.IsName2Null() Then
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.Name2Column, SelectedArticle.Name2))
- End If
- If Not SelectedArticle.IsNoteNull() Then
- tpls.Add(Tuple.Create(Of DataColumn, Object)(.NoteColumn, SelectedArticle.Note))
- End If
- ArticleBindingSource.EditNew(Of frmEditArticle)(tpls)
- End With
- bolCopyArticle = False
- End Sub
In meiner frmEditArticle Form kann ich dann auf diese Public bolEditArticle prüfen:
VB.NET-Quellcode
- Private Function CheckUserInput() As Boolean
- '[...]
- 'Prüfen ob Art.Nr gleich ist, wenn ja - wird Artikel bearbeitet
- If Not FrmMainForm.bolCopyArticle Then
- Dim SelectedArticle = DirectCast(DirectCast(ArticleBindingSource.Current, DataRowView).Row, DtsSettings.ArticleRow)
- If SelectedArticle.ArtNr = TBArtNr.Text Then
- 'Prüfen ob EK verändert wurde
- '[...]
- 'Prüfen ob VK verändert wurde
- '[...]
- End If
- End If
- Return True
- End Function
Da ich aber für
If Not FrmMainForm.bolCopyArticle Then
und Public bolCopyArticle As Boolean = False
von euch gesteinigt werde - und vermutlich auch gesteinigt gehöre - Suche ich eine Alternative. Aber mir fällt nichts ein.