[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    May 2004
    Beiträge
    470
    Also letztendlich geht es darum

    Ein String hat 1000 Zeichen. Jede Zeile dort ist mit ## getrennt. Also z.B. Zeile1##Zeile2##mehr Text##usw##
    Dieser String muss aufgeteilt werden in einzelne Felder. Die Datenbank hat maximal 18 Einzelfelder dafür.

    Das 2 ist ein String der hat auch ebenfalls 1000 Zeichen. Der muss aufgeteilt werden in einzelne Felder immer wenn eines der folgenden Zeichen vorkommt ,.; oder blank

    Alles muss über SQL gemacht werden. Leider habe ich es nicht ohne Schleife hinbekommen. Deshalb dachte ich mir, eine Funktion der ich einen 1000 stelligen String mitgebe und die mir ein Array mit de einzelnen Werten zurück gibt

    ich könnte natürlich auch einen langen String zurück geben mit fixer Länge für ein Element. Aber ich dachte nicht, dass arrays kompliziert sind

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wo ist das Problem?

    Verwende dazu die Tablefunction Split:
    https://www.ibm.com/docs/en/i/7.5?to...table-function

    select table(systools.split(charfeld, '##'))
    from mytable

    Ich habe z.B. auch das Problem, dass für Bildschirmauswahlen Multiselect-Listen angeboten werden sollen. Der User kreuzt nun mehrere Elemente an und ich bekomme eine Kommaseparierte Liste zurück.
    Diese verwende ich dann z.B. in der Where-Klausel:

    where name in (select * from table(systools.split(: Param, ','))
    Funktioniert hervorragend.

    Das Gegenstück dazu ist die Funktion LISTAGG, mit der man mehrere Zeilen wieder in einen String packen kann.

    Nachtrag:
    Deine 18 Felder kannst du ja auch u.U. per concat erst zusammen führen:
    F1 concat '##' concat F2 .....

    Wenn du leere Felder ausschließen willst:

    concat case Fx when '' then '' else '##' concat Fx end
    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
    May 2004
    Beiträge
    470
    Hat super funktioniert, vielen Dank.
    Aber das funktioniert nur mit einem Trennzeichen oder gibts da auch was wo man mehrere Trennzeichen angeben kann. Also Zeile trennen bei ,.; oder blank

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    ... nur mit Common Table Expressions oder mehreren Sub-Selects und mehreren SPLIT()s

    ... die UDTF SPLIT() steht in der Bibliothek SYSTOOLS.
    Die SQL Codes für alle SQL Routinen in SYSTOOLS können mit Generate SQL ermittelt werden.
    Die Funktionen in SYSTOOLS sind (u.a.) als Beispiele gedacht und es wird sogar empfohlen sich auf der Basis dieser Source Codes seine eigenen Funktionen zu schreiben.
    Also schau's Dir an, ob Du Dir eine neue Funktion, die Deinen Anforderungen entspricht schreiben kannst.
    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
    May 2004
    Beiträge
    470
    Zitat Zitat von B.Hauser Beitrag anzeigen
    ... nur mit Common Table Expressions oder mehreren Sub-Selects und mehreren SPLIT()s

    ... die UDTF SPLIT() steht in der Bibliothek SYSTOOLS.
    Die SQL Codes für alle SQL Routinen in SYSTOOLS können mit Generate SQL ermittelt werden.
    Die Funktionen in SYSTOOLS sind (u.a.) als Beispiele gedacht und es wird sogar empfohlen sich auf der Basis dieser Source Codes seine eigenen Funktionen zu schreiben.
    Also schau's Dir an, ob Du Dir eine neue Funktion, die Deinen Anforderungen entspricht schreiben kannst.
    Das verstehe ich nicht. Wo sind die Quellcodes und wo gibt es Beispiele dafür. Was ist generate sql

    Ah ich verstehe was du meinst. Das SQL generieren lassen von einer Funktion aus der Bibliothek SYSTOOLS und gegebenenfalls anpassen in einer eigenen Funktion

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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
    Feb 2001
    Beiträge
    20.695
    Ggf. ja, da der Separator ein langes varchar Feld ist, könnte die Angabe von '#,.;' möglicherweise funktionieren da laut Doku nur 1 Zeichen als Separator verwendet wird. '##' bringt da wohl nicht den gedachten Effekt, was du ggf. an Hand von Leerzeilen feststellen kannst.
    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

Similar Threads

  1. Statisches Embedded SQL: Verarbeitung eines Arrays möglich?
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 25-05-23, 19:04
  2. SQL Prozedur mit Cursor als Rückgabe (Embedded SQL)
    By harkne in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 16-06-20, 10:45
  3. SQL-Aufruf eines Webservices in SQL-Funktion einbauen
    By KM in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 09-02-17, 10:39
  4. Rückgabe eines Arrays aus einer Funktion
    By harkne in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 04-01-06, 16:44
  5. 2 Dimensionale Arrays mit RPG
    By Atomik in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 26-10-01, 14:07

Berechtigungen

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