5

I'm trying to create a new command on an iSeries, where one of the parameter has to be a file name using the standard LIBRARY/FILE MEMBER syntax, something like

MYCMD FILE(MYLIB/MYFILE MYMEMBER)

or even

MYCMD FILE(MYLIB/MYFILE) MEMBER(MYMEMBER)

I tried to :

  • Create a PARM statement using the FILE parameter with a *CHAR type
  • Create a special type using ELEM statements

But I can't find how to create a parameter that accepts a value that is a qualified object name, like the FROMFILE parameter used with CPYTOIMPF.

UPDATE

JamesA's answers works fine, but somehow I get two extra characters in my CL's variable :

CMD

            PARM       KWD(FILE) TYPE(FNAME) PROMPT('CL +                  
                         source' 1)                                        
FNAME:      ELEM       TYPE(FILE) PROMPT('File')                        
            ELEM       TYPE(*NAME) LEN(10) PROMPT('Source +                
                         member')                                          
FILE:       QUAL       TYPE(*NAME) LEN(10)              
            QUAL       TYPE(*NAME) DFT(*CURLIB) SPCVAL(*CURLIB) PROMPT('Library') LEN(10) MIN(0)           

CL

PGM        PARM(&PFIC &OUTFILE &CODEPAGE)        
DCL        VAR(&PFIC) TYPE(*CHAR) LEN(32)        
DCL        VAR(&LIB) TYPE(*CHAR) LEN(10)         
DCL        VAR(&FILE) TYPE(*CHAR) LEN(10)        
DCL        VAR(&MEMBER) TYPE(*CHAR) LEN(10)      

CHGVAR     VAR(&FILE) VALUE(%SST(&PFIC 3 10))  
CHGVAR     VAR(&LIB) VALUE(%SST(&PFIC 13 10))              
CHGVAR     VAR(&MEMBER) VALUE(%SST(&PFIC 23 10))     
Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
T. Fabre
  • 1,517
  • 14
  • 20

1 Answers1

6

You need to use a Qualifier Definition.

CMD

    CMD
    PARM KWD(FILE) TYPE(Q1) PROMPT('File')
    PARM KWD(MBR) TYPE(*NAME) LEN(10) DFT(*FIRST) SPCVAL(*FIRST) PROMPT('Member')

Q1: QUAL TYPE(*NAME) LEN(10) 
    QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) SPCVAL(*LIBL) PROMPT('Library')

CL

PGM PARM(&FILELIB &MBR)

DCL VAR(&FILELIB) TYPE(*CHAR) LEN(20)
DCL VAR(&MBR) TYPE(*CHAR) LEN(10)
DCL VAR(&FILE) TYPE(*CHAR) LEN(10)
DCL VAR(&LIB) TYPE(*CHAR) LEN(10)

CHGVAR VAR(&FILE) VALUE(%SST(&FILELIB 1 10))
CHGVAR VAR(&LIB) VALUE(%SST(&FILELIB 11 10))

. . .

ENDPGM
James Allman
  • 40,573
  • 11
  • 57
  • 70
  • Thanks ! Works like a charm, except that for some strange reason I need to %SST from pos. 3 instead of 1, the first two characters are garbage. I updated my post to show my definitions. Any ideas ? – T. Fabre Jul 03 '12 at 12:47
  • 2
    That's because the FILE keyword is defined as a list. It points to FNAME, which has 2 ELEMs. Follow James' answer and use the QUAL without the ELEM. – Buck Calabro Jul 03 '12 at 13:19
  • @T.Fabre When using an `ELEM` the parameter becomes a list of values and the first 2 bytes are an `*INT` value indicating how many elements are passed. – James Allman Jul 03 '12 at 15:17