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

    SQL nächste freie Nummer ermitteln

    Hallo,

    ich habe aus dem Forum ein tolle Sql-Routine bekommen und die nächste freie Personalnummer zu ermitteln.
    Es wird die nächste freie Nummer zwischen 10000 und 99999 gesucht.
    Ich hatte früher nur Penr als Keyfeld.
    Wie verknüpfe ich diese Abfrage mit einem zusätzlichen Key (FINR)?
    Mein Ziel ist es das die PENR eindeutig und unique ist.
    Bei diversen Tests bekomme ich eine Penr zurück die bereits vergeben ist.

    Code:
    WITH LFDNBR (LEVEL)                      
        AS  (VALUES(10000)                   
            UNION ALL                        
            SELECT LEVEL + 1 FROM LFDNBR     
            WHERE LEVEL < 99999)             
    SELECT IFNULL(LEVEL, 0) 
    FROM LFDNBR                              
    EXCEPTION JOIN PERP ON LEVEL = PENR 
    ORDER BY LEVEL                           
    FETCH FIRST ROWS ONLY
    Dank im Voraus

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    EXCEPTION JOIN PERP ON LEVEL = PENR and FINR = 'x'

    Sicher und schnell ist das allerdings nicht, da immerhin mehrere 1000 Zugriffe gemacht werden müssen.
    Andererseits werden auch Lücken (also Löschungen) wieder verwendet.
    Besser ist da schon immer eine eigene Tabelle mit der Nummernvergabe.
    Ganz extrem hatte ich mir mal eine Tabelle der Nummern von n bis m erstellt.
    Beim Ermitteln die erste Nummer genommen und gelöscht, so dass auch kein 2. Prozess dieselbe Nummer noch mal vergibt.
    Beim Löschen (am besten Trigger) wird die freie Nummer in die Tabelle zurückgeschrieben.
    Die Vorteile sind da auf meiner Seite;-).
    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

  3. #3
    Registriert seit
    Apr 2005
    Beiträge
    385
    Entweder FiNr in den Group by mit reinbringen, so das du diese mit abfragen kannst. Oder anstatt mit einer CTE zu arbeiten eine Procedure mit FiNr als Eingangsparamter...

  4. #4
    Registriert seit
    Apr 2012
    Beiträge
    360
    Zitat Zitat von Fuerchau Beitrag anzeigen
    EXCEPTION JOIN PERP ON LEVEL = PENR and FINR = 'x'
    Für was steht 'x'?
    Finr sind bei uns 3-stellig.
    Wenn ich ein Join auf eine logische Datei die den Key PENR hat und unique ist, würde das funktionieren?

    @ExAzubi: Mit Group by habe ich es funktioniert, hat aber nicht das gewünschte Ergebnis gebracht.

  5. #5
    Registriert seit
    Apr 2019
    Beiträge
    43
    Kommt auch etwas Schlankes in Frage?
    Code:
    SELECT min(a.penr)+1 
    from PERP a                                       
    left outer join PERP 
    b on a.penr  = b.penr +1 
    where b.penr is null
    mit FINR im unique key
    Code:
    SELECT min(a.penr)+1 
    from PERP a                                       
    left outer join PERP 
    b on a.penr  = b.penr +1 and a.finr = b.finr
    where b.penr is null and a.finr = '001'

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wie ist dann diese Frage zu verstehen?

    "Wie verknüpfe ich diese Abfrage mit einem zusätzlichen Key (FINR)?"

    Wenn die PENR bereits unique ist, wozu brauchst du die FINR?
    Oder ist die PENR nur incl. FINR unique?
    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

  7. #7
    Registriert seit
    Apr 2012
    Beiträge
    360
    Mit dieser Statement habe ich eigentlich angefangen, aber die Nummern von 10475 bis 12000 sind frei und er leifert mir den wert 12002 zurück.
    Code:
    SELECT min(a.penr) + 1 
    FROM PERP a 
    left outer join PERP b 
    on a.penr = b.penr + 1 
    WHERE b.penr is null 
      and a.penr > 10000

  8. #8
    Registriert seit
    Apr 2012
    Beiträge
    360
    Ich habe die Personaldatei die hat den Key FINR/PENR und ist unique.

    Dann gibt es eine Logische die den Key PENR hat und auch unique ist.

  9. #9
    Registriert seit
    Apr 2019
    Beiträge
    43
    Wenn FINR und PENR unique keys sind, dann ist natürlich der left outer join mit zusätzlich der FINR wichtig.

  10. #10
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke für eure Hilfe und Input.

    Ich habe es nun wie folgt gelöst:

    Code:
    WITH LFDNBR (LEVEL)                          
        AS  (VALUES(10000)                       
            UNION ALL                            
            SELECT LEVEL + 1 FROM LFDNBR         
            WHERE LEVEL < 99999)                 
    SELECT IFNULL(LEVEL, 0)                      
    FROM LFDNBR                                  
    WHERE LEVEL NOT IN (SELECT PENR FROM PERP)   
    EXCEPTION JOIN PERP ON LEVEL = PENR          
    ORDER BY LEVEL                               
    FETCH FIRST ROWS ONLY
    lg

Similar Threads

  1. Freie Kapazität
    By AKS1 in forum NEWSboard Server Job
    Antworten: 0
    Letzter Beitrag: 22-04-18, 16:19
  2. C9002A95 System hängt auf der Nummer
    By Mida in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 09-02-18, 23:18
  3. demnächst freie Kapazitäten
    By Robi in forum NEWSboard Server Job
    Antworten: 0
    Letzter Beitrag: 17-01-18, 10:08
  4. Antworten: 1
    Letzter Beitrag: 16-05-17, 09:47
  5. laufende Nummer in DB mit SQL aktualisieren
    By XMan in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 05-03-14, 10:54

Berechtigungen

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