Announcement

Collapse
No announcement yet.

Seriennummer im SQL Server generieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Seriennummer im SQL Server generieren

    Hallo zusammen,

    aktuelle haben wir einen Access Datenbank in der verschiedene Daten abgespeichert werden. Unter anderem wird dort auch eine Seriennummer generiert. Wir wollen diese Access Datenbank durch einen SQL Server ersetzen.
    Das einzige was ich jetzt noch nicht umgesetzt habe ist die Generierung der Seriennummer. Da habe ich keine Ahnung wie das gehen soll.

    Hier mal ein Paar Eckdaten:
    Die Seriennummer muss eindeutig sein.
    Mehrere Clients können einen Seriennummer anfragen (vermutlich auch mal gleichzeitig !!!)
    Die Struktur der Seriennummer ist fest und kann nicht verändert werden.

    Aufbau der Seriennummer:

    1234NA20

    1234 = 4 Stellig die Laufende Nummer (Wird jedes Monat rückgesetzt und mit 0001 gestartet)
    N = Typ Bezeichnung (Idealerweise sollte diese bei der Anfrage der Seriennummer vom Client an der Server übergeben werden)
    A = (Monat: A=Januar, B=Februar, C=März,...)
    20 = (Jahr: 20=2020, 21=2021, 22=2022, ...)

    Ist das so im SQL Server realisierbar, oder muss ich da im Client noch was zusammenbauen.

    Danke schon mal für eure Unterstützung

    Gruß Alex

  • #2
    Du nimmst ein auto_increment Feld und kombinierst das mit den anderen Angaben zu Deiner Seriennummer.
    Also:
    meinAutoIncFeld,meinTyp, FunctionCurrentMonth2Alpha, format(getdate(), 'yyyy')) as Seriennummer

    Das ganze mit concat verknüpfen (geht hier nicht wegen Syntaxfehler)
    Das kann man auch sicher insgesamt als Function hinterlegen.
    Zuletzt editiert von defo; 04.02.2020, 10:25.
    Gruß, defo

    Comment


    • #3
      P.S. Ich kenne mic mit mssql nicht so aus, für die Umrechnung von Datum bzw. Monat in Buchstaben könnte man sowas ähnliches nehmen:



      char[convert[int, format[getdate[], 'MM']]+64]

      runde Klammern kann man hier im Forum offenbar nicht eintragen, seltsam

      Zuletzt editiert von defo; 04.02.2020, 10:50.
      Gruß, defo

      Comment


      • #4
        Hi,

        danke schon mal für die Antwort. Ganz habe ich es noch nicht kapiert.
        Den letzte Teil habe ich schon erstellen können. Alo TYP, MONAT und JAHR

        SelectCONCAT('N',CONCAT(char(convert(int,format(getdate(),'MM'))+64),format(getdate(),'yy')))as SNR from Seriennummer

        Was ich aber noch nicht verstanden habe ist das mit dem AutoIncFeld.

        Ich muss also eine Tabelle erstellen. Ein Feld davon heisst z.B. Nummer (Datentyp int, Is Identity = Yes, Identity Increment = 1)
        Wie soll das gehen, das dieser Wert dann am Monatsanfang wieder auf Null gesetzt wird?
        Ich muss ja dann mit einem SQL Befehl den nächsten Wert auslesen und dann auch gleich wieder schreiben, oder?
        Wie soll das gehen ?

        Comment


        • #5
          Wie soll das gehen, das dieser Wert dann am Monatsanfang wieder auf Null gesetzt wird?
          Wie ist es in Access gegangen? Am Anfang des Monats wird diese Aufgabe ein Datenbankscript übernehmen
          ch muss ja dann mit einem SQL Befehl den nächsten Wert auslesen und dann auch gleich wieder schreiben, oder?
          Du kannst mit https://www.techonthenet.com/sql_server/sequences.php arbeiten, die dir die ersten 4 Stellen liefert.

          Ich halte das Vorgehen, Daten auf die getrennt zugeriffen werden soll, in einer Spalte zu halten und diese dann ständig auseinander zu nehmen oder zusammen zu basteln
          Offernbar bei jeder Anfrage eines Clients mindestens (N = Typ Bezeichnung (Idealerweise sollte diese bei der Anfrage der Seriennummer vom Client an der Server übergeben werden))
          Sinnvoller ist es, das in eigene Spalten zu schreiben.
          Allein das Script am Anfang des Monats müsste jede betroffene Spalte neu schreiben, anstatt diese einfach auf 0 zu setzen



          Christian

          Comment


          • #6
            Der Standard in MS SQL ist eine Auto Inc, dass müsste man dann reseten und ist zugegeben etwas schräg.
            Für sowas nimmt man eigentlich eine Sequence, das kann MS SQL scheinbar auch seit einiger Zeit.

            Eine Sequence kann man wie eine Funktion dann auch unabhängig von einer Tabellenspalte abrufen.
            Gruß, defo

            Comment


            • #7
              Hallo,

              also das mit der Sequence scheint zu funktionieren. Muss mich da noch ein wenig spielen aber ich denke so klappt es.

              Vielen Dank für die Unterstützung

              Comment


              • #8
                Originally posted by Christian Marquardt View Post
                Ich halte das Vorgehen, Daten auf die getrennt zugeriffen werden soll, in einer Spalte zu halten und diese dann ständig auseinander zu nehmen oder zusammen zu basteln
                ..
                Sinnvoller ist es, das in eigene Spalten zu schreiben.
                ..
                Damit hat Christian natürlich Recht. Ich gehe aber davon aus, dass es "ringsherum" irgendwelche gewachsenen Zwänge gibt, es so darzubieten, da Du "nicht änderbar" oder sowas geschrieben hast.
                Sinnvoll ist die Bereitstellung der Basiswerte durch eigene Spalten natürlich trotzdem. Die Seriennummer dann über eine Funktion abrufen, die mit den Basiswerten oder auch nur mit dem PK der Basistabelle gefüttert wird. So hat man die Chance irgendwann mal zu ändern / umzustellen, wenn das Typalphabet alle ist oder sowas.
                Gruß, defo

                Comment


                • #9
                  Ganz habe ich es noch nicht hinbekommen. Aktuell habe ich nich das Problem, das der Zähler zum Monatsbeginn rückgesetzt wird.

                  Mit dem SQL Befehl
                  ALTER SEQUENCE Lfd_Nr RESTART WITH 1;
                  ginge es. Aber wie kann ich den automatisch ausführen lassen. Gibts da eine Möglichkeit das das der Server erledigt

                  Comment


                  • #10
                    Beitrag #5
                    Code:
                    Am Anfang des Monats wird diese Aufgabe ein Datenbankscript übernehmen
                    https://docs.microsoft.com/de-de/sql...l-server-ver15
                    Zuletzt editiert von Christian Marquardt; 05.02.2020, 13:45.
                    Christian

                    Comment


                    • #11
                      Leider haben wir bei uns im Unternehmen keine Rechte auf den SQL Server-Agent. Nur auf Datenbank Ebene. Gibt es noch eine andere Möglichkeit ?

                      Comment


                      • #12
                        Originally posted by Loipe View Post
                        Gibts da eine Möglichkeit das das der Server erledigt
                        Wenn Du das nicht kennst, solltest Du Dir nicht nur den Link zum erzeugen eines Jobs ansehen, sondern auch, wie man bestehende Jobs auflistet und wie man kontrolliert, ob ein Job fehlgeschlagen ist.

                        Gruß, defo

                        Comment


                        • #13
                          Wenn es bei MSSQL ein Kommadozeilentool gibt, könnte man das ev. anstossen (bat-Datei, WindowsScheduler) und dem ein Script als Aufrufparameter übergeben
                          Christian

                          Comment


                          • #14
                            Du musst das nicht interaktiv machen auf dem Server, das Entscheidende ist, dass Du mit irgendeinem Admin User die Rechte hast, Jobs und Schedules anzulegen. Dann kannst du das mit SQLCMD machen.
                            Gruß, defo

                            Comment

                            Working...
                            X