[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2004
    Beiträge
    19

    Question externe DS als Parameter übergeben

    Guten Tag zusammen.

    Ich stehe vor der Herausforderung, dass ich 1 RPG-Programm, das z. Zt. einfach per CALL aufgerufen wird nun als SBMJOB laufen lassen will (soll). Normalerweise ist das nicht schwer, doch leider ist hier für mich ein neues, mir unbekanntes Problem aufgetreten.

    In der Parameterliste ist eine extern beschriebene DS. Das ist ja auch noch (fast) handelbar, jedoch hat diese DS Felder mit der Definition VARLEN.

    Anbei der komprimierte, derzeitige Quellcode

    DS für Parameter

    D §iDSADR E DS EXTNAME(DATEI)









    c *ENTRY PLIST

    c PARM §iMNR 8 0

    c PARM §iLNR 7 0

    c PARM §iBEKU 2

    c PARM §iBSTNR

    c PARM §iDSADR











    c call callpgm

    c PARM §iMNR

    c PARM §iLNR

    c PARM §iBEKU

    c PARM §iEMAIL

    c PARM §iBSTNR

    c PARM §iDSADR





    Meine Experimente waren bis dato nicht sonderlich erfolgreich. Ein CL, in dem ich die Datei als DCLF und RCVF als Dummy benutzt habe, um die Felder und die Längen im Zugriff zu haben ist ebenso fehlgeschlagen, wie ein dirketer SBMJOB-Aufruf aus dem RPG über QCMD.

    Ich bin für Hinweise und Tipps dankbar.

    Schönen Tag und Gruß Malte Dols

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo,

    Datenstrukturen sind intern schnöde alfa, die Länge sieht man mit DSPFD, oder in der Umwandlungsliste eines RPG Programmes. Bei den Varlen Feldern steht binary die Länge in den ersten zwei Stellen. Zur Aufbereitung schreibt man sich am einfachsten ein kleines RPG, oder transferiert das CL Programm gleich ganz nach RPG.

    mfg

    Dieter Bender

    Zitat Zitat von psd-400
    Guten Tag zusammen.

    Ich stehe vor der Herausforderung, dass ich 1 RPG-Programm, das z. Zt. einfach per CALL aufgerufen wird nun als SBMJOB laufen lassen will (soll). Normalerweise ist das nicht schwer, doch leider ist hier für mich ein neues, mir unbekanntes Problem aufgetreten.

    In der Parameterliste ist eine extern beschriebene DS. Das ist ja auch noch (fast) handelbar, jedoch hat diese DS Felder mit der Definition VARLEN.

    Anbei der komprimierte, derzeitige Quellcode

    DS für Parameter

    D §iDSADR E DS EXTNAME(DATEI)

    ?







    c *ENTRY PLIST

    c PARM §iMNR 8 0

    c PARM §iLNR 7 0

    c PARM §iBEKU 2

    c PARM §iBSTNR

    c PARM §iDSADR







    ?



    c call callpgm

    c PARM §iMNR

    c PARM §iLNR

    c PARM §iBEKU

    c PARM §iEMAIL

    c PARM §iBSTNR

    c PARM §iDSADR





    Meine Experimente waren bis dato nicht sonderlich erfolgreich. Ein CL, in dem ich die Datei als DCLF und RCVF als Dummy benutzt habe, um die Felder und die Längen im Zugriff zu haben ist ebenso fehlgeschlagen, wie ein dirketer SBMJOB-Aufruf aus dem RPG über QCMD.

    Ich bin für Hinweise und Tipps dankbar.

    Schönen Tag und Gruß Malte Dols
    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
    Apr 2004
    Beiträge
    19
    Hallo Dieter.

    Das eine DS einfach nur intern alpha ist habe ich auch gedacht, aber da sich in der DS auch gepackte numerishce Felder befinden, kommt auf der anderen Seite bei Übergabe des SBMJOB irgendwie nur Schrott an, der nicht weiter verarbeitet werden kann.

    Daher werde ich noch weiter experimentieren.

    Trotzdem Danke.

    Gruß Malte

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo Malte,

    wenn Schrott ankommt, dann wird auch Schrott übergeben und mit experimentieren wird das nix. Da müsstest Du zumindest mal posten, wie du den Schrott erzeugst, sprich die Datenstruktur mit Werten belegst.

    mfg

    Dieter Bender

    Zitat Zitat von psd-400
    Hallo Dieter.

    Das eine DS einfach nur intern alpha ist habe ich auch gedacht, aber da sich in der DS auch gepackte numerishce Felder befinden, kommt auf der anderen Seite bei Übergabe des SBMJOB irgendwie nur Schrott an, der nicht weiter verarbeitet werden kann.

    Daher werde ich noch weiter experimentieren.

    Trotzdem Danke.

    Gruß Malte
    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.241
    Das Problem bei Datenstrukturen besteht in der Länge des Parameters, der beim CALL-CMD in Hochkomma übergeben werden muss !
    Bei gepackten Inhalten und der Längeninformation der VARLEN-Felder besteht die Gefahr, dass der Hexwert des Hochkomma vorkommen kann und der CALL ggf. fehlschlägt.
    Wenn die Struktur 1024 Byte nicht übersteigt, kann man sie vor dem SBMJOB in die LDA schreiben und im Batch die LDA wieder auslesen, da die LDA immer mit kopiert (submitted) wird.
    Ist die Struktur länger, empfiehlt sich eine Datei als Übergabe, in der man einen eindeutigen Schlüssel mit den Parametern einträgt und ein Vorprogramm mit diesem Schlüsselwert als Parameter submitted, dieses Vorprogramm liest und löscht dann diesen Satz und ruft das eigentliche Programm auf.
    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
    Apr 2004
    Beiträge
    19
    Hallo zusammen,

    anbei nun die Quellecodes.

    Hier ist der Quellcode für das aufrufende PGM

    H OPTION(*SRCSTMT)
    H DEBUG(*YES)
    fmitadress if e k disk
    D dsadr e ds extname(mitadress)
    d qcmdexc pr extpgm('QCMDEXC')
    d cmd 800A options(*varsize) const
    d cmdlen 15p 5 const
    c #keymia klist
    c kfld miadrlnrad
    c eval miadrlnrad = 1
    c #keymia chain mitadress
    /free
    qcmdexc ('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))' : %size
    ('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))'));
    c eval *inlr = *on

    und aus dem DEBUGGER die Auflösung der DSADR

    EVAL DSADR
    MIADRLNRAD OF DSADR = 0000001.
    MIADRANKEY OF DSADR = '01'
    MIADRNAME1 OF DSADR = 'Testname 1'
    MIADRNAME2 OF DSADR = 'Testname 2'
    MIADRNAME3 OF DSADR = 'Testname 3'
    MIADRFANAM OF DSADR = 'Test Familienname'
    MIADRVNAME OF DSADR = ' '
    MIADRSTRAS OF DSADR = 'Teststrasse '
    MIADRSTRNK OF DSADR = 000000.
    MIADRSTREK OF DSADR = 00000.
    MIADRHNRVO OF DSADR = 0059.
    MIADRHNRZV OF DSADR = ' '
    MIADRHNRBI OF DSADR = 0000.
    MIADRHNRZB OF DSADR = ' '
    MIADRPOSTF OF DSADR = '11 40 '
    MIADRLKZ_S OF DSADR = 'DE '
    MIADRLKZ_P OF DSADR = 'DE '
    MIADRPLZ_S OF DSADR = '68526 '
    MIADRPLZ_P OF DSADR = '68520 '
    MIADRORTST OF DSADR = ' '
    MIADRORT_S OF DSADR = ' '
    MIADROKZ_S OF DSADR = 33714000.
    MIADRORT_P OF DSADR = ' '
    MIADROKZ_P OF DSADR = 33714000.
    MIADRTEL OF DSADR = '0123456789012 '
    MIADRFAX OF DSADR = '0123456789012 '
    MIADREMAIL OF DSADR ' '
    MIADRBLD OF DSADR = 08.
    MIADRLVD OF DSADR = 0008.
    MIADRGWAA OF DSADR = 0826.
    MIADRHZA OF DSADR = 0062.
    MIADRAMG OF DSADR = 0722.
    MIADRADAT OF DSADR = '30.11.2000'
    MIADRAUSR OF DSADR = 'UEBERNAHME'
    MIADRAEDAT OF DSADR = '27.02.2004'
    MIADRAEUSR OF DSADR = 'BRINRAL0 '
    MIADRREDAT OF DSADR = '01.01.0001'
    MIADRREUSR OF DSADR = ' '
    MIADRLDAT OF DSADR = '01.01.0001'
    MIADRLUSR OF DSADR = ' '
    MIADRSKZ OF DSADR = ' '


    und nun der Quellecode für das empfangende PGM

    H OPTION(*SRCSTMT)
    H DEBUG(*YES)
    D dsadr e ds extname(mitadress)
    c *entry plist
    c parm dsadr
    c dump
    c eval *inlr = *on


    und der Auszug des Dumps

    NAME ATTRIBUTE WERT
    _QRNL_PRMCPY_DSADR POINTER SPP648846EF8001646
    _QRNL_PSTR_DSADR POINTER SPP648846EF8001646
    DSADR DS
    MIADRADAT DATE(10) ' ' '40404040404040404040'X
    MIADRAEDAT DATE(10) ' ' '40404040404040404040'X
    MIADRAEUSR CHAR(10) ' ' '40404040404040404040'X
    MIADRAMG ZONED(4,0) . '40404040'X
    MIADRANKEY CHAR(2) 'R ' 'D940'X
    MIADRAUSR CHAR(10) ' ' '40404040404040404040'X
    MIADRBLD ZONED(2,0) . '4040'X
    MIADREMAIL CHAR(50) VARYING ' '
    VALUE IN HEX '4040404040404040404040404040404040404040404040404 0404040404040404040404040404040'X
    41 '404040404040404040404040'X
    MIADRFANAM CHAR(32) VARYING ' PARM(DSADR) '
    VALUE IN HEX 'F25D40D7C1D9D44DC4E2C1C4D95D404040404040404040404 0404040404040404040'X
    MIADRFAX CHAR(22) VARYING ' '
    VALUE IN HEX '404040404040404040404040404040404040404040404040' X
    MIADRGWAA ZONED(4,0) . '40404040'X
    MIADRHNRBI ZONED(4,0) . '40404040'X
    MIADRHNRVO ZONED(4,0) . '40404040'X
    MIADRHNRZB CHAR(4) ' ' '40404040'X
    MIADRHNRZV CHAR(4) ' ' '40404040'X
    MIADRHZA ZONED(4,0) . '40404040'X
    MIADRLDAT DATE(10) ' ' '40404040404040404040'X
    MIADRLKZ_P CHAR(3) ' ' '404040'X
    MIADRLKZ_S CHAR(3) ' ' '404040'X
    MIADRLNRAD PACKED(7,0) ]4Ú2]1]. 'C4E2C1C4'X
    MIADRLUSR CHAR(10) ' ' '40404040404040404040'X
    MIADRLVD ZONED(4,0) . '40404040'X
    MIADRNAME1 CHAR(32) VARYING ' o '
    VALUE IN HEX '4040404040404040404040404040404040404040404040404 0404000019600000000'X
    MIADRNAME2 CHAR(32) VARYING ''
    VALUE IN HEX '000004E3F4D9F2860000000004D7C1D9D480000001000D000 1960000000005C4E2C1'X
    MIADRNAME3 CHAR(32) VARYING 'DR» CALL PGM(T4R2)'
    VALUE IN HEX 'E2C1C4D98B00000000004040404040404040001AC3C1D3D34 0D7C7D44DE3F4D9F25D'X


    Den Rest spare ich mir, da auch in diesen Felder keine besonderen Werte stehen.

    Was mache ich falsch?

    Wenn ich einen direkten CALL absetze, kommt im aufgerufenen PGM das richtige an. Das habe ich durch andere kleine TestPgms abgecheckt.

    Gruß Malte Dols

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    @Baldur:

    von der LDA Klamotte halte ich eher nix. Der sauberste OS400 Weg für dieses Problem ist die Definition eines eigenen Command Objektes. Wenn ich mich noch richtig an meine CL Zeiten erinnere, kommt man unter Benutzung des Parameters RQSDATA des SBMJOB ebenfalls zum Ziel.

    Dieter

    Zitat Zitat von Fuerchau
    Das Problem bei Datenstrukturen besteht in der Länge des Parameters, der beim CALL-CMD in Hochkomma übergeben werden muss !
    Bei gepackten Inhalten und der Längeninformation der VARLEN-Felder besteht die Gefahr, dass der Hexwert des Hochkomma vorkommen kann und der CALL ggf. fehlschlägt.
    Wenn die Struktur 1024 Byte nicht übersteigt, kann man sie vor dem SBMJOB in die LDA schreiben und im Batch die LDA wieder auslesen, da die LDA immer mit kopiert (submitted) wird.
    Ist die Struktur länger, empfiehlt sich eine Datei als Übergabe, in der man einen eindeutigen Schlüssel mit den Parametern einträgt und ein Vorprogramm mit diesem Schlüsselwert als Parameter submitted, dieses Vorprogramm liest und löscht dann diesen Satz und ruft das eigentliche Programm auf.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo Malte,

    du übergibst schnöderweise das Literal DSADR an das Programm.
    Du musst den String zusammen basteln.

    Dieter Bender

    Zitat Zitat von psd-400
    qcmdexc ('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))' : %size
    ('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))'));
    Dols
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Apr 2004
    Beiträge
    19
    Nochmals Hallo zusammen.

    Ich habe die Idee von Baldur aufgegriffen und das ganze über eine DTAARA abgewickelt. Und was soll ich sagen(schreiben) ES KLAPPERT!!

    Danke für die Ideen und die Hilfestellungen.

    Schönes Wochenende dann mal schon im Voraus

    Gruß Malte.

Similar Threads

  1. DS Übergabe
    By Squall in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 24-10-06, 08:44
  2. FETCH n ROws in einzelne Felder einer DS
    By pedro-zapata in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 11-09-06, 12:34
  3. sbmjob und ' im Parameter
    By muadeep in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 27-06-06, 11:31
  4. Parameter übergeben
    By Vicky-B in forum IBM i Hauptforum
    Antworten: 17
    Letzter Beitrag: 14-06-04, 14:27
  5. Anfänger, cwbtf.exe parameter übergeben?
    By thoughtless in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 03-06-04, 15:26

Berechtigungen

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