[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    426
    ich hab das
    Code:
    sys_connect_by_path(Trim(digits(KKLFDN)), ' ') as Text
    geändert in
    Code:
    char(sys_connect_by_path(Trim(digits(KKLFDN)), ' ')) as Text
    und bekomme
    Code:
     Ergebnis zu lang.
    als Meldung, (auch bei varchar)

    obwohl nur 3 Werte a 7 byte vorhanden sind

    ILEMax

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    426
    nö, immer 'Ergebnis zu lang'

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.752
    Mittels SUBSTR solltest du eigentlich einen Teil herausbekommen.
    Allerdings ist die Funktion auf 1Mb beschränkt und arbeitet nicht "distinct".
    Solltest du also doch mehr Werte haben, liegts nicht am substring sondern an der Verkettung.

    Ggf. also vorher per DISTINCT auf eindeutige Werte reduzieren.

    Das Ergebnis des sys_connect_by_path kannst du auch vorher casten:

    cast(sys_connect_by_path(...) as varchar(nn)) as Text

    Siehe auch hier:
    http://publib.boulder.ibm.com/infoce...61%74%68%22%20
    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

  5. #5
    Registriert seit
    Sep 2005
    Beiträge
    426
    Danke,
    aber ...

    das geht leider auch nicht

    hier mal mein Befehl
    Code:
    With x as (Select Row_Number() over(Order By kkmanr, rrn(a)) as seq,
    a.*           from ankkop a where kkmanr = 38),                     
    y as (Select kkmanr, cast(char(sys_connect_by_path(                 
    Trim(digits(KKLFDN)), ' ')) as varchar(10000)) as Text              
                  from x                                                
                  Start With kkmanr =  38 and seq = 1                   
                  connect by Prior Seq = Seq - 1)                       
    Select kkmanr, Max(Text) as Text                                    
    From y                                                              
    Group By kkmanr
    Die Datei hat 6 Sätze mit kkmanr = 38, kklfdn ist 7P 0 definiert

    Sql sagt: "Ergebnis zu lang"

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.752
    Schau mal deinen SQL genau an, da ist ein cast zu viel drin!

    Lass mal char(......) weg!

    Die Funktion CHAR versucht nämlich einen CAST(... as char(1000000)) und das ist natürlich zu lang!

    PS:
    Auch der TRIM bei Digits ist unsinnig, da Digits keine Leerzeichen zurückgibt.
    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
    Sep 2005
    Beiträge
    426
    Der Hammer, es funktioniert!

    Danke!!!!!!

    Wenn das jetzt noch jemand erklären könnte ...

    ok mit dem 1. With wird eine Arbeitsdatei erstellt, die ...

    ok ich versuch mal das SQL Buch zu interwiewen.
    Verstanden hab ich es nicht, aber es geht ... Klasse!!

    Der glückliche ILEMax

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.752
    Weiteres siehst du hier:
    hierarchical queries
    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

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.934
    Hier ist auch noch ein Artikel zu dem Thema Hierarchische Queries:
    Hierarchical Queries with DB2 Connect By

    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

  10. #10
    Registriert seit
    Sep 2005
    Beiträge
    426
    ich muß diese tolle sache nochmal aufwärmen.

    Während
    Code:
    With x as (Select Row_Number() over(Order By kkmanr, rrn(a)) as seq,
    a.*           from ankkop a where kkmanr = 38),                     
    y as (Select kkmanr, cast((sys_connect_by_path(                     
    Trim(digits(KKLFDN)), ' ')) as varchar(10000)) as Text              
                  from x                                                
                  Start With kkmanr =  38 and seq = 1                   
                  connect by Prior Seq = Seq - 1)                       
    Select kkmanr, Max(Text) as Text                                    
    From y                                                              
    Group By kkmanr
    toll funktioniert, habe ich versucht
    mehrere kkmanr's zu selektieren.

    Code:
    With x as (Select Row_Number()                                
    over(Order By kkmanr, rrn(a)) as seq,                         
                a.* from ankkop a where kkmanr between 38 and 50),
    y as (Select kkmanr, cast((sys_connect_by_path(               
    Trim(digits(KKLFDN)), ' ')) as varchar(20000)) as Text        
                  from x                                          
                  Start With kkmanr =  38 and seq = 1             
                  connect by Prior Seq = Seq - 1)                 
    Select kkmanr, Max(Text) as Text                              
    From y                                                        
    Group By kkmanr           order by 1
    im Ergebnis bekomme ich mit kkmanr = 38 das richtige Ergebnis. (5 Nr.)
    mit kkmanr 39 aber das von 38 und von 39. (also 7 statt 2 Nr.)
    Wenn ich den Start with in der seq verändere, z.B. auf 6, bekomme ich
    keine Zeile 38 aber die 39 startet richtig.
    Wie kann ich nun das SQL so umbauen, das ich nur die Nr. zu einer kkmanr bekomme, die dazu gehören?
    Danke
    Der ILEMax

  11. #11
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    versuch mal das für dich um zu bauen
    Code:
    With x as (Select Row_Number() over(partition                       
                                          By adadnr, adadn2             
                                                               ) as seq,
    a.*           from adresp a where (adadnr, adadn2) in(              
    select susunr, susun2 from schulp where susunr between 5 and 99)),  
     y as (Select adadnr, adadn2, cast((sys_connect_by_path(            
    Trim(digits(adadn3)), ' ')) as varchar(10000)) as Text              
                  from x                                                
                              Start With  seq = 1                       
                  connect by Prior Seq = Seq - 1 and                    
                             Prior adadnr = adadnr and                  
                             Prior adadn2 = adadn2 )                    
    Select adadnr, adadn2, max(Text) as Text                            
    From y                                                              
    group By adadnr, adadn2
    Benötige aber auch nen Tip:
    Wenn ich das in ein create view packe, bekomme ich einen SQL System fehler
    Hat da jemand eine Idee?

    Danke
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.934
    Auch Umschreiben bringt nichts!
    Sieht nach CALL bei IBM aus

    ... allerdings
    Versuch mal die erste CTE als View zu generieren und diese dann in der 2. View zu verwenden.
    Code:
    Create View MyLib/MyView1
    as (Select Row_Number() over(partition                       
                                 By adadnr, adadn2) as seq,
               a.*
          from adresp a Join schulp b on adadnr = susunr and adadn2 = susun2
          where susunr between 5 and 99);
    Code:
    Create View MyLib/MyView2
    as With y as (Select adadnr, adadn2, 
                         cast((sys_connect_by_path(Trim(digits(adadn3)), ' ')) 
                               as varchar(10000)) as Text              
                    from MyView1                                                
                    Start With  seq = 1                       
                    connect by Prior Seq    = Seq - 1 and                    
                               Prior adadnr = adadnr  and                  
                               Prior adadn2 = adadn2 )                    
    Select adadnr, adadn2, max(Text) as Text                            
    From y                                                              
    group By adadnr, adadn2;
    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

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 11:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 15:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 12:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 15:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 10:43

Berechtigungen

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