[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Schau dir die Programme und Module in den Programmen an (sollte wohl ILE sein).
    Die CCSID der Quelle wird zumindest vermerkt.

    Ansonsten reicht es nicht, nur den Job auf 037 zu setzen. Das Terminal muss auch in 037 sonst kommen die Klammern im falschen Code an.

    Alternativ versuche es nicht per STRSQL sondern mit RUNSQLSTM.
    Wenn die SRC mit 273 im Job erfasst wird und das RUNSQLSTM dann im Job mit 037 läuft, wird beim Lesen der SRC von 273 in 037 gewandelt.

    Ganz schön bescheuert vom JSON-Tool, nicht mit unterschiedlichen CCSID's arbeiten zu können!
    Da ist Java in soweit besser als das Java grundsätzlich bei Strings in Unicode arbeitet.

    Fehlermeldung an den Lieferanten, warum die Software nur auf amerikanischen Systemen läuft.
    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

  2. #2
    Registriert seit
    Sep 2015
    Beiträge
    18
    Hallo!

    Danke für Deine Worte.

    Ich stimme Dir völlig zu, echt bescheuert die Geschichte - ich schätze, das ganze Thema um JSON ist implementierungstechnisch noch in den Kinderschuhen auf er i.
    Vor allem, ich kann die CCSID meiner Terminals nicht ändern, weil firmenweit alle Terminals 273 haben und alle Jobs unter 1141 laufen.
    Egal, was ich hier rumprobiere, verwenden kann ich das dann nicht.

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Hast du es denn dann schon mal mit obigen cast's probiert?

    JSON sollte vom Grundsatz unicodebasiert sein um alle Formen abdecken zu können.
    Schließlich handelt es sich ausschließlich um Texte in allen Sprachen.
    Binärdaten (z.B. Bilder) können nur über den Umweg von MIME64 gespeichert werden.

    D.h., in der PF(Tabelle) grundsätzlich NVARCHAR bzw. falls vorhanden NLOB oder eben CLOB mit CCSID 13488. Alles andere macht überhaupt keinen Sinn.

    Per Cast in Unicode (wenn das System das nicht sogar automatisch macht) für die Funktion käme man mit jeder CCSID zurecht.
    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
    Sep 2015
    Beiträge
    18
    Hi!

    Ja, habe ich alles probiert beim Create Table.
    NLOB nicht gültig, BLOB mit CCSID 13488 versucht, CCSID nicht gültig.
    Bei CLOBS natürlich keine CCSID möglich, die haben standardmäßig 65535 in Tabelle.

    Wenn ich das bereitgestellte Tool SYSTOOLS.JSON2BSON verstehe, müßte ich schon UTF-8 reinschicken, damit das binäre JSON in das BLOB der Tabelle gespeichert wird.
    Das habe ich bis jetzt noch nicht geschafft, obwohl ich ja von einem HTTP-Rest-Webservice UTF-8 reinbekomme und ich via API iConv nach 1141 konvertiere um die Daten weiterverwenden zu können.
    Habe versucht, die UTF-8 Daten, die ich in einem ILE-RPG aus dem QtmhRdStin auslese gleich direkt in das SQL (embedded) zu stellen. Das will auch nicht recht funken, da das embedded SQL Probleme mit den UTF-8 Daten hat.

    Ich habe jetzt schon ein paar Haare weniger ;-).

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    OK, UTF-8 macht ja Sinn, das ist auch CCSID-Neutral.
    Deine Daten kommen als UTF-8 rein, dann solltest du diese nicht nach 1141 sondern nach Unicode 13488 konvertieren.
    Dies geht auch mit iConv.
    Diese Unicode-Daten stellst du in eine Zeichenvariable vom Typ "C" (USC2).
    Beim Aufruf der SQL-Funktion, die nun leider ein BLOB erwartet, castest du wieder zurück nach UTF-8 (1208) und anschließend in einen BLOB.

    Ähnlich sollte es auch in STRSQL gehen.
    Deine Eingabe ist 273/1141, die must du nach 1208 und dann in BLOB casten.

    Wenn du die Daten aus der Funktion zurück erhältst, brauchst du wohl nichts zu tun da die Daten ja bereits in UTF-8 sind. Benötigst du diese als Zeichendaten, dann per iConv von 1208 in 13488 (Unicode) wandeln.

    Ansonsten:
    CLOB kann natürlich eine CCSID (beim Create) enthalten.
    Und das Ergebnis von CLOB(xxx) als Funktion entscheidet sich an Hand der Daten von XXX.
    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
    Feb 2001
    Beiträge
    20.695
    Nachtrag:

    Statt iConv zu bemühen kannst du natürlich auch SQL verwenden:

    exec SQL set : MyVar = cast(: Myvar.....);
    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
    Aug 2014
    Beiträge
    181

    Post

    Hallo Rischer,

    ich mache relativ viel mit IBM i, Webanwendungen, AJAX und JSON.

    Die Maschine hat 7.2 mit dem neuesten PTF-Stand und CCSID 1141 im Systemwert QCCSID.
    Mit folgenden Schritten läuft das Beispiel auf meiner Maschine:

    1. JSON-SQL-Funktionen einrichten

    qsh
    /QIBM/ProdData/OS/SQLLIB/bin/db2nosql -setup enable

    2. Datei erstellen

    create or replace table tsto.wrkjson
    (jsid int generated always as identity (start with 1 increment by 1),
    json_info blob(3M) not null,
    primary key(jsid));

    Label on Column wrkjson (jsid is 'Id');
    Label on Column wrkjson (json_info is 'JSON-Info');


    3. JSON-Daten einfügen

    INSERT INTO tsto.wrkjson (JSON_INFO)
    VALUES ( SYSTOOLS.JSON2BSON('{"detail":"hilfe"}'))
    INSERT INTO tsto.wrkjson (JSON_INFO)
    VALUES ( SYSTOOLS.JSON2BSON('{"detail":"hilfe2"}'))

    4. JSON-Daten auslesen

    select jsid,json_val(json_info,'detail','s') as info
    from tsto.wrkjson


    Anfang auf Zeile . . . . . .
    ....+....1....+....2....+....3....+....4....
    Id INFO
    1 hilfe
    2 hilfe2
    ******** Datenende ********

    Jetzt mit einem komplexeren Beispiel

    PHP-Code:
    INSERT INTO tsto.wrkjson (JSON_INFO)  
    VALUES SYSTOOLS.JSON2BSON('{        
     "kunde": [                           
      {                                   
       "id"  :123456,                     
       "name":"Testname",                 
       "adresse": {                       
           "plz":86916,                   
           "ort":"Kaufering"              
       }                                  
      }]                                  
     }'
    )) 

    select jsid,                                                        
     
    json_val(json_info,'kunde.id','i') as Id,                          
     
    substr(json_val(json_info,'kunde.name','s') , 20) as Name,     
     
    json_val(json_info,'kunde.adresse.plz','i') as PLZ,                
     
    substr(json_val(json_info,'kunde.adresse.ort','s') , 20) as Ort
    from tsto
    .wrkjson                                                

    ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
               Id              ID   NAME                            PLZ   ORT       
                1         123.456   Testname                     86.916   Kaufering 
    ********   Datenende   ******** 
    Herzliche Grüße
    Rainer

    Folgende Anwendungen arbeiten mit AJAX, JSON und IBM i
    www.myhofi.com - Hotels finden - leicht gemacht
    www.myhofi.com/devhtm/spoolsorter.htm - wrkoutq in Javascript mit nur 75 Zeilen Code

  8. #8
    Registriert seit
    Sep 2015
    Beiträge
    18
    Zitat Zitat von Rainer Ross Beitrag anzeigen
    Hallo Rischer,

    ich mache relativ viel mit IBM i, Webanwendungen, AJAX und JSON.

    Die Maschine hat 7.2 mit dem neuesten PTF-Stand und CCSID 1141 im Systemwert QCCSID.
    Mit folgenden Schritten läuft das Beispiel auf meiner Maschine:

    1. JSON-SQL-Funktionen einrichten

    qsh
    /QIBM/ProdData/OS/SQLLIB/bin/db2nosql -setup enable

    2. Datei erstellen

    create or replace table tsto.wrkjson
    (jsid int generated always as identity (start with 1 increment by 1),
    json_info blob(3M) not null,
    primary key(jsid));

    Label on Column wrkjson (jsid is 'Id');
    Label on Column wrkjson (json_info is 'JSON-Info');


    3. JSON-Daten einfügen

    INSERT INTO tsto.wrkjson (JSON_INFO)
    VALUES ( SYSTOOLS.JSON2BSON('{"detail":"hilfe"}'))
    INSERT INTO tsto.wrkjson (JSON_INFO)
    VALUES ( SYSTOOLS.JSON2BSON('{"detail":"hilfe2"}'))

    4. JSON-Daten auslesen

    select jsid,json_val(json_info,'detail','s') as info
    from tsto.wrkjson


    Anfang auf Zeile . . . . . .
    ....+....1....+....2....+....3....+....4....
    Id INFO
    1 hilfe
    2 hilfe2
    ******** Datenende ********

    Jetzt mit einem komplexeren Beispiel

    PHP-Code:
    INSERT INTO tsto.wrkjson (JSON_INFO)  
    VALUES SYSTOOLS.JSON2BSON('{        
     "kunde": [                           
      {                                   
       "id"  :123456,                     
       "name":"Testname",                 
       "adresse": {                       
           "plz":86916,                   
           "ort":"Kaufering"              
       }                                  
      }]                                  
     }'
    )) 

    select jsid,                                                        
     
    json_val(json_info,'kunde.id','i') as Id,                          
     
    substr(json_val(json_info,'kunde.name','s') , 20) as Name,     
     
    json_val(json_info,'kunde.adresse.plz','i') as PLZ,                
     
    substr(json_val(json_info,'kunde.adresse.ort','s') , 20) as Ort
    from tsto
    .wrkjson                                                

    ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
               Id              ID   NAME                            PLZ   ORT       
                1         123.456   Testname                     86.916   Kaufering 
    ********   Datenende   ******** 
    Herzliche Grüße
    Rainer

    Hallo!

    Danke für die vielen Antworten und Hilfe.
    Im Prinzip funktioniert alles wie beschriebeh in den Tech Tips und auch wie Rainer Ross beschrieben hat.
    Ich hatte mich nur am Anfang mit den CCSID's verzettelt, es funkt tatsächlich wirklich alles selbst mit CCSID 1141.

    @Rainer Ross
    MIr mag eine variable Abfrage aller Elemente und aller Subfelder eines Arrays einfach nicht gelingen. Sprich lt. Deinem Beispiel eine Variable abfrage all Deiner Partner Kunden im Array (wenn Du mehrere hättest)....

  9. #9
    Registriert seit
    Aug 2014
    Beiträge
    181
    Hallo Rischer,

    anbei ein einfaches Beispiel für ein Array mit zwei Kunden

    PHP-Code:

    INSERT INTO tsto
    .wrkjson (JSON_INFO
    VALUES SYSTOOLS.JSON2BSON('{       
     "kunde": [                          
      {"id"  :123456,"name":"Testname"}, 
      {"id"  :234567,"name":"Testname2"} 
      ]                                  
     }'
    ))

    select jsid,                                                      
     
    json_val(json_info,'kunde.0.id','i') as Kunde1,                  
     
    substr(json_val(json_info,'kunde.0.name','s') , 15) as Name1,
     
    json_val(json_info,'kunde.1.id','i') as Kunde2,                  
     
    substr(json_val(json_info,'kunde.1.name','s') , 15) as Name2 
    from tsto
    .wrkjson                                                 
                                   
    ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
               Id          KUNDE1   NAME1                   KUNDE2   NAME2          
                1         123.456   Testname               234.567   Testname2      
    ********   Datenende   ******** 
    Anzahl der Kunden im Array

    PHP-Code:
    select                                 
     systools
    .json_len(json_info,'kunde')  
    from tsto.wrkjson                      

    ....+....1.... 
         
    JSON_LEN  
                2 
    In JSON fangen die Arrays mit Null an. Die erste Kunden-id ist
    kunde.0.id

    Es gibt auch die Funktion JSON_TABLE, aber damit habe ich noch keine Erfahrung.
    http://www.mcpressonline.com/databas...db2-for-i.html

    Schönes Wochenende

    Rainer

  10. #10
    Registriert seit
    Aug 2014
    Beiträge
    181
    Hallo Rischer,

    ich hab mit den Arrays etwas rumprobiert:

    PHP-Code:

    Kundendaten im 
    Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde','s:32')) as x

    Kunden
    -Ids im Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde.id','i')) as 
    Quelle: http://www.volubis.fr/news/liens/courshtm/XML/JSON.HTM

    Herzliche Grüße

    Rainer

  11. #11
    Registriert seit
    Sep 2015
    Beiträge
    18
    Zitat Zitat von Rainer Ross Beitrag anzeigen
    Hallo Rischer,

    ich hab mit den Arrays etwas rumprobiert:

    PHP-Code:

    Kundendaten im 
    Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde','s:32')) as x

    Kunden
    -Ids im Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde.id','i')) as 
    Quelle: http://www.volubis.fr/news/liens/courshtm/XML/JSON.HTM

    Herzliche Grüße

    Rainer
    Interessant, will aber bei mir nicht funken.

    Ich habe ein JSON-Array in meiner Datenbank das so aussieht:

    PHP-Code:
    {
    "displayinformation": {"detail": [{"name":"ZZESCD","contentdecimal":null,"contentstring":"""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false},{"name":"ZZIITX","contentdecimal":null,"contentstring":"ÄNDERN""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false},{"name":"Z1ZXSB","contentdecimal":null,"contentstring":"""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false}]}} 
    Setze ich ein Select darauf ab a la:

    select
    value from tsto.wrkjson,
    table(systools.json_table(json_info,'displayinform ation.detail','s:32')) as x

    bekomme ich kein Ergebnis angezeigt (aber auch keinen Fehler).

    Mache ich es so:

    select
    cast(data1.value as varchar(20) ccsid 1141) as name,
    from
    tsto.wrkjson j, table
    (systools.json_table(j.JSON_INFO,'displayinformati on.detail.name','s
    :20')) data1

    Dann bekomme ich x (Anzahl der Elemente im Array) Records mit dem Inhalt von Name.
    Ohne Cast geht es bei mir übrigends nicht (obwohl ich CCSID 1141 im Job habe), sonst bekomme ich kryptische Zeichen angezeigt.

    Was ich bräuchte wäre die dynamische Auslesung aller Inhalte eines Array-elements also name, string, colour etc. auf einmal. Das hab ich noch nicht geschafft.....

Similar Threads

  1. REST Webservices / Verwendung von SYSTOOLS
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 25
    Letzter Beitrag: 14-02-18, 11:11

Tags for this Thread

Berechtigungen

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