unbekannte Artikelnummer (string) um eins erhöhen (+1 rechnen)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    unbekannte Artikelnummer (string) um eins erhöhen (+1 rechnen)

    Holladiho
    Ich habe mir vor einer Weile mal eine Funktion geschrieben, die eine Artikelnummer um eins erhöht.
    Also wenn die Artikelnummer 9 ist, so soll die neue Artikelnummer 10 sein.
    Problematisch ist, dass die Artikelnummer jeden beliebigen Wert haben können. Also zum Beispiel "ap123", "54cd88", "132-22"
    Meine Sub reagiert auf all diese verschiedenen Typen - aus ap123 wird ap124 - aus 54cd88 wird 54cd89, usw.
    Endet die Artikelnummer auf ein nicht numerisches Zeichen, wird eine 1 rangeklatscht.
    Das klappt alles.
    Vor einer Woche bin ich aber auf eine Eventualität gestoßen, die ich in meiner Funktionslogik vergessen habe.
    Wenn ein - gefolgt von einer 0 vorkommt (was nur selten der Fall ist), also z.B. 124-07, dann gibt meine Funktion als erhöhte Artikelnummer die 124-8 aus. Die 0 wird abgeschnitten.
    Hier fällt mir keine Lösung ein, wie ich diesen Fall abfangen und dann auch behandeln kann, damit mir die 0 nicht abhanden kommt.
    Fällt jemandem etwas ein?

    VB.NET-Quellcode

    1. Private Function increaseArtNR(ArtNr As String) As String
    2. Dim Number As Integer
    3. Dim i As Integer
    4. Dim NewArtNr As String
    5. 'Wenn Artikelnummer numerisch ist, um eins erhöhen und zurückgeben
    6. Dim ArtNrLenght As Integer = ArtNr.Length
    7. If Integer.TryParse(ArtNr, Number) Then
    8. NewArtNr = (Number + 1).ToString
    9. Else
    10. 'ArtNr von hin1ten nach vorne durchlaufen und Zahl auslesen
    11. Dim Tempnumber As Integer
    12. For i = 1 To ArtNr.Length
    13. Number = Tempnumber
    14. If Not Integer.TryParse(ArtNr.Substring(ArtNrLenght - i), Tempnumber) Then
    15. i -= 1
    16. Exit For
    17. '''Hier in Kommentaren mein bester Lösungsansatz - aber es bleibt leider beim Ansatz
    18. 'oben Dim StringNumber as string
    19. 'Else
    20. 'Stringnumber = ArtNr.Substring(ArtNrLenght - i)
    21. 'Nun hab ich beim verlassen der Schleife den kompletten Teil der Artikelnummer, der erhöht werden muss, also bei "124-07" hätte ich "-07"
    22. 'aber wie weiter machen? Und vorallem wie differenzieren, ob ich gerade überhaupt mit String arbeiten muss. Also ob -0 vorkommt, oder evtl. -000000 oder wieviele 0 auch immer, oder ob ich normal weiter machen kann.
    23. End If
    24. Next
    25. 'Wenn Number 0 bleibt ist das letzte Zeichen ein String
    26. If Number = 0 Then
    27. NewArtNr = ArtNr & 1
    28. Else
    29. If Number < 0 Then
    30. NewArtNr = (ArtNr.Substring(0, ArtNrLenght - i) & (Number - 1)).ToString
    31. Else
    32. NewArtNr = (ArtNr.Substring(0, ArtNrLenght - i) & (Number + 1)).ToString
    33. End If
    34. End If
    35. End If
    36. 'Prüfen ob ArtNr bereits vergeben, wenn ja Funktion neu aufrufen
    37. If Not ArtNrExists(NewArtNr) Then
    38. Return NewArtNr
    39. Else
    40. Return increaseArtNR(NewArtNr)
    41. End If
    42. End Function
    leidlich getestet:

    VB.NET-Quellcode

    1. Private Function increaseArtNR(ArtNr As String) As String
    2. Dim chars = ArtNr.ToList
    3. Dim NewArtNr = ""
    4. Dim i = chars.FindLastIndex(Function(c) "012345678".Contains(c))
    5. Dim numb = 0
    6. If i < 0 OrElse Not Integer.TryParse(ArtNr.Substring(i), numb) Then
    7. NewArtNr = ArtNr & "0"
    8. Else
    9. numb += 1
    10. Dim frmt = New String("0"c, chars.Count - i)
    11. NewArtNr = $"{ ArtNr.Substring(0, i)}{numb.ToString(frmt)}"
    12. End If
    13. Return NewArtNr
    14. End Function
    Nur noch die Prüfung ran, ob es die "NewArtNr" schon gibt, und es läuft wies soll:

    VB.NET-Quellcode

    1. Private Function increaseArtNR(ArtNr As String) As String
    2. Dim chars = ArtNr.ToList
    3. Dim NewArtNr = ""
    4. Dim i = chars.FindLastIndex(Function(c) "012345678".Contains(c))
    5. Dim numb = 0
    6. If i < 0 OrElse Not Integer.TryParse(ArtNr.Substring(i), numb) Then
    7. NewArtNr = ArtNr & "0"
    8. Else
    9. numb += 1
    10. Dim frmt = New String("0"c, chars.Count - i)
    11. NewArtNr = $"{ ArtNr.Substring(0, i)}{numb.ToString(frmt)}"
    12. End If
    13. 'Prüfen ob ArtNr bereits vergeben, wenn ja Funktion neu aufrufen
    14. If Not ArtNrExists(NewArtNr) Then
    15. Return NewArtNr
    16. Else
    17. Return increaseArtNR(NewArtNr)
    18. End If
    19. End Function


    Du bist ein Schatz!

    Jetzt nur noch (wie bei deinem Code für mich leider immernoch nötig), Haltepunkt rein und gucken was da überhaupt passiert.
    Öhhhm, das ist doch ein totaler Konzeptionfehler !
    Eine Artikelnummer sollte doch wohl ausschließlich au Zahlen (aka Nummern) bestehen !
    So ist es eher eine ArtikelID.

    Nur so am Rande.

    FormFollowsFunction schrieb:


    Eine Artikelnummer sollte doch wohl ausschließlich au Zahlen (aka Nummern) bestehen !
    Manche arbeiten mit sprechenden Artikelnummern (z.b. SPX-1234) um z.b. an den erst 3 Buchstaben zu erkennen das es sich um Schrauben handelt. So kann man z.B. für jede „Artikelgruppe“ einen eigenen Nummernkreis pflegen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    noch Vereinfachung

    VB.NET-Quellcode

    1. Private Function increaseArtNR(ArtNr As String) As String
    2. Dim chars = ArtNr.ToList
    3. Dim NewArtNr = ""
    4. Dim i = chars.FindLastIndex(Function(c) "012345678".Contains(c))
    5. Dim numb = 0
    6. If i < 0 OrElse Not Integer.TryParse(ArtNr.Substring(i), numb) Then
    7. NewArtNr = ArtNr & "0"
    8. Else
    9. numb += 1
    10. Dim frmt = New String("0"c, chars.Count - i)
    11. NewArtNr = $"{ ArtNr.Substring(0, i)}{numb.ToString(frmt)}"
    12. End If
    13. 'Prüfen ob ArtNr bereits vergeben, wenn ja Funktion neu aufrufen
    14. If ArtNrExists(NewArtNr) Then Return increaseArtNR(NewArtNr)
    15. Return NewArtNr
    16. End Function
    Zum Verständnis: Zeile #4 findet die letzte Ziffer, die um 1 erhöht werden kann - '9' gehört nicht dazu.
    numb.ToString(formatString) ist eine Überladung der .ToString-Methode, die wie du siehst, einen FormatString akzeptiert.
    Nun musst du die zulässigen Formatstring-Zeichenfolgen recherchieren, um zu verstehen, wie das wirkt.
    Ach guckma - da gibts auch was von RatioPharm: String.Format
    hier noch ein Bsp.
    hier werden die ersten 4 Zahlen berücksichtigt

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim strLetzteNr As String = "0950/IKL/VII/21"
    3. Dim iNummer As String = strLetzteNr.Substring(0, 4)
    4. Dim intNummer As Integer = Convert.ToInt32(iNummer)
    5. intNummer += 1
    6. Dim strNaechste As String = intNummer.ToString()
    7. strNaechste = strNaechste.PadLeft(4, "0")
    8. Dim strNeueNummer As String = strNaechste & strLetzteNr.Substring(4)
    9. MessageBox.Show(strNeueNummer)
    10. End Sub