[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Dec 2016
    Beiträge
    8

    Variables Einlesen von Spalten in sqlrpgle; Problem: "INTO"

    Hallo zusammen,

    mein Anliegen ist sehr speziell und ich weiß nicht (aber hoffe sehr) ob es möglich ist.

    Code:
           dcl-proc main;
             sqlstm = 'SELECT * FROM VARIABLE';
             exec sql PREPARE stmt FROM sqlstm;
             exec sql DECLARE crsr CURSOR FOR stmt;
             exec sql OPEN crsr;
             dou 1 = 0;
               exec sql FETCH NEXT FROM crsr INTO :????????;
               if SQLCODE <> 0;
                 leave;
               endif;
               dsply 'Laeuft!';
             enddo;
           end-proc;
    In meinem Code soll das File, welches im SQL-Statement angegeben wird, variabel sein. Das bedeutet aber leider auch, dass ich nicht weiß, wie viele Felder und welche Datentypen dort herauskommen, dementsprechend weiß ich nicht was ich nach dem INTO angeben soll...

    Probiert habe ich es schon (obwohl ich es eigentlich wusste aber versucht habe ich es trotzdem :-) ) mit Feldgruppen, Datenstrukturen und Pointern. Ich glaube ja fast, dass man es irgendwie mit Pointern machen muss aber ich bekomm gerade nicht raus wie...

    Ich glaube wenn es eine Lösung dafür gibt ist die bestimmt sehr Kompliziert!?

    Hat jemand einen Tipp oder gar eine Lösung für dieses Problem? Würde mich sehr freuen :-)

    Vielen lieben Dank schon mal im Voraus für eure Mühe :-)

    Beste Grüße

    Matthias

    EDIT: Rein vorsorglich: Bitte keine Belehrung zu SQL-Injections. Ich weiß darüber bescheid :-)

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... dass das so gar nicht geht, sagt Dir bereits der Compiler - da braucht es nicht mal einen Blick in die Systemliteratur. Am einfachsten geht das mit SQL CLI, bei embedded SQL muss man da mit dynamic SQL arbeiten und per SQLDA das Resultset beschreiben. Näheres hierzu in der SQL Reference bze. im SQL CLI Handbuch.
    Der praktische Nährwert von diesem Ansatz ist allerdings mit statischen Sprachen wie RPG in der Nähe von 0,0
    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/

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Nun ja, das mit dem 0,0 muss man nicht so stehen lassen.
    Natürlich ist das in diesem Fall nicht so einfach, ins besonders da die Daten ja anschließend auch noch irgendwie bearbeitet werden sollen.
    Per "describe table" kann man sich eine SQLDA generieren lassen, allerdings muss man für einen Fetch dann ja auch Felder den Variablen zuweisen.
    Dies geht z.B. per %alloc(), der Speicher muss dann in der SQLDA als Pointer eingetragen werden.
    Alles in allem ein nicht gerade einfacher Weg.

    Daher die Frage:
    Was willst du damit erreichen?
    Ist Java (auch auf der AS/400) da nicht vielleicht der effektivere Weg?
    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
    Mar 2002
    Beiträge
    5.287
    ... das eigentliche Problem ist doch die fixe Cursor Anzahl und der Share der Dateien.

    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/

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Nunja, ich habe vor ca. 18 Jahren auf V3R2 einen SQLCPY als Kommando in COBOL genau nach diesem Prinzip gebaut. Dieser läuft heute auf V7R2 noch immer problemlos und erlaubt eben einen Insert/Update/Delete auf Basis eines Selects mit Join und Where.
    Benutzt werden da eben dynamische SQLDA's.
    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
    Mar 2002
    Beiträge
    5.287
    ... auch da würde man heute zu anderen Programmiersprachen greifen. Das ergibt doch ganz andere Aufwand/Effekt Relationen.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Dec 2016
    Beiträge
    8
    Hallo BenderD,
    Hallo Fuerchau,

    vielen Dank für eure Antworten. Der Hintergrund ist folgender:
    Wir haben im Unternehmen gerade damit angefangen uns mit Webservices zu beschäftigen. Die Daten liegen bei uns auf der DB2. Nun würden wir für jede Datei oder für jeden Select eigene Webservices brauchen. Das sind zwar kleine Programme, aber letztendlich würden es viele werden.
    Nun versuche ich (Und ich bin mir sicher, dass es auf irgendeinem Wege möglich ist) einen universalen Webservice jeweils für SELECT, INSERT, UPDATE und DELETE zu schreiben. Das ich mir da eine Mega-Aufgabe gestellt habe, habe ich mir zwar schon gedacht aber wenn das Ding halt einmal fertig ist, brauche ich mir nie wieder oder zumindest nur sehr selten Gedanken darüber zu machen, wie ich den Webservice bei zukünftigen Programmentwicklungen anpacke(Unser Dateibestand an physischen Dateien wächst in etwa um zwei PF Pro Monat).
    Für diese Mammut Aufgabe brauche ich doch ein bisschen Hilfe von Experten
    Vielleicht hat jemand sowas schonmal entwickelt oder vielleicht können später mehr Entwickler von dem know how profitieren

    Nun für heute mache ich erstmal Feierabend. Ich warte morgen gespannt auf eure Antworten. Hoffentlich kann ich schlafen :-D

    Beste Grüße

    Matthias

    EDIT(Mir fällt hinterher auch immer noch was ein -.-*): Der obige Code stammt natürlich aus einem Test und nicht aus meiner UNIWEBSRVS-Datei. 'VARIABLE' soll dann natürlich eine variable sein in der der Dateiname (PF) steht und die Fragezeichen sollen durch eine variable ersetzt werden.

  8. #8
    Registriert seit
    Dec 2016
    Beiträge
    8
    ... auch da würde man heute zu anderen Programmiersprachen greifen. Das ergibt doch ganz andere Aufwand/Effekt Relationen.
    Ich hätte es lieber über RPG gelöst aber andere Programmiersprachen wie Java, C#, C++, C,... beherrsche ich auch.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    RPG ist keine dynamische Sprache und für solche komplexen Aufgaben einfach ungeignet.
    Java ist insofern gut, als dass du mit Eclipse (o.ä.) entwickeln und testen kannst und es dann auf der AS/400 ausführen lassen kannst (wenn erforderlich).
    Es hängt ganz einfach von deiner Anforderung ab.

    Deshalb noch mal: was willst du damit erreichen? Was ist deine Aufgabe?
    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

  10. #10
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    HTTP WebServices & Dynamische Verarbeitung ... für mich wäre hier zunächst mal PHP das besser geeignete Werkzeug dafür.

    In RPG habe ich mal ein Beispiel-Code zusammengestellt um genau das was du möchtest zu realisieren.
    Ist aber sicher kein Code den man für performancekritische Anwendungen verwenden sollte:
    Code:
    D vsql s 512 
    D vtype s 10 
    D vlength s 10 0 
    D vresult_ind s 10 0 
    D vCount S 10 0 
    D i S 10 0 
    
    /Free 
    	// SQL Cursor erstellen 
    	vSql = 'Select * From tab1';
    	Exec Sql Prepare S1 from :vsql;
    	Exec Sql Declare c1 Cursor For s1;
    
    	// Descriptor mit der max. Anzahl der Spalten initialisieren 
    	Exec Sql allocate descriptor 'mydesc' with max 2;
    	EXEC SQL DESCRIBE S1 Using descriptor 'mydesc';
    
    	// Ersten Satz einlesen Exec Sql open c1;
    	Exec Sql Fetch c1 into sql descriptor 'mydesc';
    
    	// Anzahl der Spalten abrufen 
    	EXEC SQL GET DESCRIPTOR 'mydesc' :vCount = COUNT;
    
    	// Alle Spalten mit deren Werte einlesen 
    	For i=0 to vCount;
    		// Attribute der Spalte einlesen 
                    Exec Sql GET DESCRIPTOR 'mydesc' VALUE :i :vtype = TYPE, :vlength = LENGTH, :vresult_ind = INDICATOR;
    		if vresult_ind >= 0;
    			Select;
    			When vtype = '1';
    			// Character exec Sql GET DESCRIPTOR 'mydesc' VALUE :i :sp2 = DATA;
    			When vtype = '4';
    			// Integer exec Sql GET DESCRIPTOR 'mydesc' VALUE :i :sp1 = DATA;
    			endsl;
    		endif;
    	endfor;
    	Exec Sql close c1;
    
    /End-Free
    lg Andreas

  11. #11
    Registriert seit
    Dec 2016
    Beiträge
    8
    Hallo zusammen,

    zunächst einmal recht herzlichen Dank für eure Antworten und eure Mühe.

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Deshalb noch mal: was willst du damit erreichen? Was ist deine Aufgabe?
    Ich weiß nicht ob ich besser erklären kann :-) so wie es aussieht scheint andreaspr@aon.at den Punkt aber ganz gut zu treffen. Jedenfalls wenn ich den Code korrekt interpretiere.

    Allerdings kommt bei mir bei vCount immer 0 heraus, hier mein Debug:

    EDIT: Okay ein eingebettetes Bild war nicht so gut ihr findet es im Anhang^^

    Hmm. Vielleicht sollte ich es doch in php machen...
    Click image for larger version. 

Name:	Debug.jpg 
Views:	48 
Size:	330,9 KB 
ID:	407
    Andreas kannst du mir noch sagen warum da bei mir eine 0 herauskommt? Die Tabelle ist in der Bibliothek definitiv vorhanden (Arbeite ich oft mit).

    Vielen Dank euch

    Besten Gruß

    Matthias Neubert

  12. #12
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Bei "With max 2" musst du sicher einen höheren Wert angeben.
    Starte einfach mal den DEBUG und schau ins Joblog oder mit Monitoring.
    In einem der beiden wirst du sicher den genauen Fehler finden können.

    lg Andreas

Similar Threads

  1. Kann keine Beiträge erstellen in zB. "System i Hauptforum"
    By lch in forum Intern - Hilfe - Feedback - Tests-Forum
    Antworten: 10
    Letzter Beitrag: 15-02-21, 11:06
  2. Antworten: 1
    Letzter Beitrag: 19-07-17, 11:38
  3. MinusField falsche Darstellung "ü" statt "-"
    By Edi in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 07-11-14, 07:52
  4. Cobol/400 - "Fett", "Unterstreichen" als HEX-Wert
    By RLurati in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 05-08-14, 09:10
  5. "zu wenig Speicher" Rational Developer for Power-Systems
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 13-02-14, 20:58

Berechtigungen

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