Lange Zahl einkürzen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Lange Zahl einkürzen

    Hallo zusammen,

    ich habe folgende Problemstellung: Ich habe eine 10-stellige Zahl (Auftragsnummer), welche auf ein anderes Gerät geschrieben und im weiteren Verlauf wieder gelesen werden muss. Die Nummer setzt sich zusammen aus den letzten zwei Ziffern des Jahres (aktuell 24) und der 8-stelligen eigentlichen Auftragsnummer. Das andere Gerät unterstützt allerdings nur 32bit. Damit wäre schon im Jahr 2021 Schluss gewesen.
    Meine Idee wäre die erste Ziffer abzuschneiden, also aus 2400123456 würde 400123456 werden. In dem Moment, wo ich mir die Zahl wieder vom Gerät hole, würde ich die "2" bzw. "Zehnerstelle" wieder vorne anfügen, da ich mir das aktuelle Jahr über Now.ToString("yy") hole.

    Das Problem dabei ist nur der Jahrzehnte-Sprung. Es kann also sein, dass ein Auftrag aus dem Jahr 2029 erst im Jahr 2030 oder sogar erst 2031 gefertigt wird. Wie würdet ihr das lösen?

    Hier meine bisherigen geistigen Ergüsse :D :

    VB.NET-Quellcode

    1. Dim var1 As String = "900001234"
    2. Dim aktJahr As String
    3. Dim aktJahr2 As String
    4. Dim AuftragsJahr As Integer
    5. Dim Auftragsnummer As Long
    6. AuftragsJahr = CInt(var1.Substring(0, 1))
    7. aktJahr = "31" 'Now.ToString("yy")
    8. aktJahr2 = CInt(aktJahr.Substring(1, 1))
    9. If AuftragsJahr = aktJahr2 Then
    10. Auftragsnummer = CLng(aktJahr.Substring(0, 1) + var1)
    11. ElseIf AuftragsJahr > aktJahr2 Then
    12. Auftragsnummer = CLng(CStr(CInt(aktJahr) - 1) + var1.Substring(1, 8))
    13. ElseIf AuftragsJahr < aktJahr2 Then
    14. Auftragsnummer = CLng(aktJahr.Substring(0, 1) + var1)
    15. End If
    @RiLo UInt.MaxValue = 4294967295, passe Deinen Datentyp an uns feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RiLo schrieb:

    Das andere Gerät unterstützt allerdings nur 32bit. Damit wäre schon im Jahr 2021 Schluss gewesen
    Und das heißt das andere Gerät war jetzt 4 Jahre nicht im Einsatz? Oder war einem der Zehnersprung egal? 2030 ist noch lange hin, da lassen sich bestimmt alle möglichen Alternativen finden.
    Für mich macht es wenig Sinn den Auftragsstart generell in der Auftragsnummer zu haben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    RiLo schrieb:

    Die Nummer setzt sich zusammen aus den letzten zwei Ziffern des Jahres (aktuell 24) und der 8-stelligen eigentlichen Auftragsnummer.
    Nur einmal einfach gedacht: Dann mache einfach 2 getrennte Zahlen daraus und gebe das Jahr 4-stellig als erste Zahl an - k.A., wie ihr das jetzt bei euch programmtechnisch handhabt...

    RiLo schrieb:

    zwei Ziffern des Jahres (aktuell 24) und der 8-stelligen eigentlichen Auftragsnummer
    Kommt es überhaupt jemals vor, dass die Auftragsnummer tatsächlich achtstellig ist?
    Ansonsten könntest du sie siebenstellig machen, also eine führende Null weglassen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,
    um einmal alle aufgekommenen Fragen und Ideen zu beantworten.

    Das "Gerät" ist eine SPS (speicherprogrammierbare Steuerung) einer Anlage älteren Baujahres. Das heißt 32bit sind nur mit Vorzeichen möglich.
    Bisher hatten wir damit keine Probleme, da unsere Auftragsnummern nur 7stellig waren. Dies wird jetzt aber durch ein neues Verwaltungssystem (ERP) umgestellt.

    Die Jahre 2008 oder 2100 würden wie folgt dargestellt werden: 0800123456 bzw. 0000123456. Klingt komisch, ist aber wohl so.

    Die Frage von @petaod ist durchaus berechtigt. Um ehrlich zu sein: Wir wissen es bisher nicht, ob wir tatsächlich irgendwann einmal achstellig werden. Bisher haben die 7 Stellen ausgereicht, aber durch eine andere Vergabe der Auftragsnummern (wesentlich detaillierter für einzelne Bearbeitungsschritte) kann es durchaus passieren.

    Noch einmal kurz zum Ablauf. Ich muss diese Nummer also am Anfang zur Anlage schicken. Dabei habe ich nur zwei Speicherbereiche mit jeweils 16bit, also insgesamt 32bit (vorzeichenbehaftet).
    Im späteren Verlauf, lese ich diese Nummer wieder zurück, um beispielsweise nach Druckdaten zu suchen (Barcode muss auf das bearbeitete Teil) oder um einen Arbeitsgang rückzumelden (Bearbeitung fertig). Das geht natürlich nur mit der kompletten Auftragsnummer. Jährlich zum 1.1. wird die Auftragsnummer zurückgesetzt. Wenn es also am 31.12.2024 einen Auftrag mit der Nummer 2487654321 gibt, geht es ab 1.1.2025 mit 2500000001 weiter. Der Auftrag aus 2024 wird natürlich erst im Jahr 2025 produziert. Und ich muss in irgendeiner Art unterscheiden können aus welchem Jahr der Auftrag stammt.
    jo, bei Auftragsnummern etc ist eigentlich üblich, dass man Datentyp String wählt.
    Anders formuliert: Auftrags"nummern", Rechnungs"nummern", SerienNummer, etc. - sogar Hausnummer - sind fachlich gesehen keine Zahlen, sondern textuelle Identifikatoren.
    Daher ist an solchen Stellen ein Zahl-Datentyp problematisch.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    RiLo schrieb:

    Das heißt 32bit sind nur mit Vorzeichen möglich.
    Das lässt sich doch organisatorisch lösen, da das Bitmuster keiner arithmetischen Operation unterzogen wird, bestenfalls Shift.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oder alternativ ziehst einfach was ab von der Auftragsnummer.

    Integer mag begrenzt sein bei 2.147.483.647
    Von der Auftragsnummer ziehst einfach 1.000.000.000 ab, und beim Lesen rechnest es wieder drauf.
    Die Steuerung kriegt also statt 25000000001 15000000001

    Das kannst du beliebig weit treiben, musst eventuell irgendwann nur mehr abziehen. Setzt natürlich voraus das keine "alten" Auftragsnummern mehr an die Steuerung gesendet werden. (Die fallen sonst natürlich irgendwann auf der negativen Seite raus.)