[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Freie Nummer per Sql

    Hallo Kollegen,

    falls ein neuer Artikel angelegt wird muss ich eine freie Nummer in der Datei ermitteln

    Bisher habe ich die nächste freie Nummer im Artikelstamm per Schleife und Setll gesucht.
    Code:
    For I = 1 to 99999;      
      setll I FILE;       
      if Not %equal(FILE);
        // Freie Kundennummer
        ARTIKEL = I;           
        WRITE FILE;        
      LeaveSr;               
      ENDIF;                 
    EndFor;
    Kann ich das per Sql auch eleganter ermitteln?

    Gruß

    Tarki

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Ich fürchte eine elegantere lösung wirst du auch nicht in SQL bekommen.

    Ich selbst verwende wenn möglich "GENERATED ALWAYS AS IDENTITY (CYCLE)" für solche Spalten beim Erstellen einer Tabelle.
    Dadurch benötige ich die ganze Verwaltung mit dem Nummerkreis nicht.

    Beispiel
    Tabelle TAB1 hat 3 Spalten:
    ID
    SP1
    SP2

    Beim Insert mache ich dann folgendes:
    Code:
    Select ID From Final Table
    (Insert Into TAB1 (SP1, SP2)
    Values ('Wert1', 'Wert2'))
    Somit habe ich einen Satz hinzugefügt und bekomme als Ergebnis die neue Nr.

    lg Andreas

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Solange man die neuen SQL-Funktionen auch hat kann man sowas verwenden.
    Bei sog. Altsystem/-lasten geht sowas halt nicht.

    Ich habe mir für so einen Fall eine einfache Key-Datei generiert, die als Schlüssel alle Werte von 1-N enthält.

    Select Key from Keyfile
    where not exists (select * from Myfile where Key = MyFile.Key)
    fetch first 1 rows only

    erhalte ich dann die erste freie Nummer.
    Über Performance darf man dann nicht reden.

    Aber es ist schon ungewöhnlich eine Nummernverwaltung auf diesem Wege durchzuführen. Normalerweise verwendet man ja Tabellen für so was.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Na ja, so was kann man schon mit SQL (und Rekursiven Abfragen und Exception Joins) hinbekommen.

    Etwa so: Hier werden die Lücken zwischen Kunden-Nr. 10000 und 11000 ermittelt
    Code:
    With LfdNbr (Level)
                as (   Values(10000)  
                    Union All
                       Select Level + 1 from LfdNbr
                    Where Level < 11000)
    Select x.*
    from LfdNbr 
     exception join KundenStamm on Level = KundeNr
    @Andreas

    Wenn Du nur einen einzigen Satz einfügen willst, bringt Dir übrigens die Funktion IDENTITY_VAL_LOCAL die eingefügte Identity-Nr. zurück.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Mit V5R4 geht das leider wieder mal nicht.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Mit V5R4 geht das leider wieder mal nicht.
    Sehr wohl!!!

    Du musst nur den Values durch einen simplen SELECT ersetzten!

    Code:
    With LfdNbr (Level)
                as (   Select 10000 from SysIbm/SysDummy1  
                    Union All
                       Select Level + 1 from LfdNbr
                    Where Level < 11000)
    Select x.*
    from LfdNbr 
     exception join KundenStamm on Level = KundeNr
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke vielmals für eure (Nach)Hilfe.

    Grüße

    Tarki

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... vernünftigen Durchsatz hat da ja wohl nur die IDENTITY Variante. Die B&B Varianten scheitern zudem entweder an fehlender Transaktionssicherheit oder an Sperren. Ohne ausreichendes Commit-Level gibt es da Doubletten und mit ausreichendem Commit-Level Dateiweite Sperren.
    Wenn lückenlose Vergabe gefordert wird (oder später gefordert werden könnte) geht die Identity Variante auch nur ohne Transaktionssicherheit, ein Grund, warum ich da immer einen funtionalen getter mit einer zentralen Tabelle für Key-Verwaltungen vorziehe; das ist am flexibelsten und hat bei optimaler Implementierung den besten Durchsatz.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. per SQL Feld ändern...
    By svente in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 23-01-07, 09:49
  2. update per sql
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 25-09-06, 08:22
  3. Kopieren per SQL
    By steven_r in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 18-07-06, 09:36
  4. Teildateien per SQL auflisten
    By Nennewitz in forum NEWSboard Programmierung
    Antworten: 16
    Letzter Beitrag: 28-06-06, 13:49
  5. Sortierung per SQL
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 08-05-06, 12:40

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •