                         S U B J O B



      L'utility batch SUBJOB in ambiente MVS ha come scopo la
sottomissione di job da librerie partitioned, con la espansione di
eventuali /INCLUDE; in altre parole e' un programma che permette di fare
un job che sottomette altri job.
      Nella PARM= della scheda EXEC si specifica il nome fisico completo
del membro da sottomettere nella forma:

      nome.libreria.pds(membro)

e il programma si preoccupa di allocare dinamicamente sia il membro da
sottomettere sia il SYSOUT redirezionato all'internal reader sul quale
scrive per sottomettere il job. L'unica DD che e' necessario scrivere
esplicitamente e' la  //SYSPRINT DD  sul quale viene tenuta traccia
delle sottomissioni e delle espansioni delle /INCLUDE che sono state
fatte.
      Si possono sottomettere piu' job uno dopo l'altro specificandoli
in PARM, separandoli con un punto e virgola; si possono dare comandi
a console iniziando la specifica con un /*; si puo infine mandare in
wait il programma scrivendo, sempre in PARM=, /nn, dove nn e' il numero
di secondi da aspettare: cio' puo' servire per distanziare nel tempo
una sottomissione dall'altra.
      Le /INCLUDE nel Job da sottomettere possono essere scritte in
due forme diverse:

      /INCLUDE  nome.libreria.include(membro)

in cui, dopo la parola chiave "/INCLUDE", che deve sempre partire da
colonna 1, va scritto il nome fisico completo del membro da espandere;
oppure si puo' anche scrivere:

      /INCLUDE  membro

in cui e' omessa la libreria in cui il membro viene cercato: in questo
caso e' necessario specificare in PARM il parametro DDINCL=ddname, in
cui il ddname e' il nome logico della DD della libreria nella quale il
programma cerchera' il membro da espandere. Nota: in questa DD si puo'
specificare una sola libreria e non una serie di librerie concatenate;
percio' tutte le /INCLUDE di un job scritte in questo modo devono
risiedere sulla stessa libreria. Nello stesso job possono essere mischiati
le /INCLUDE dei due tipi.
Altri parametri opzionali sono:

      DDIN=ddname         in cui il ddname e' relativo al membro da
                          sottomettere, che in questo caso puo' essere
                          anche un file sequenziale; in questo modo il
                          programma non fa l'allocazione dinamica

      DDOUT=ddname        in cui il ddname e' relativo al file di output
                          nel quale i job da sottomettere sono scritti:
                          in questo modo il programma non fa l'allocazione
                          dinamica di SYSOUT redirezionato all'internal
                          reader. Si puo' quindi usare questo parametro
                          per stampare i job o per scriverli su un file
                          invece che per sottometterli.

Limitazioni: sono ammesse /INCLUDE solo fino al terzo livello, cioe'
il membro richiamato da una /INCLUDE puo' a sua volta contenere /INCLUDE,
che a sua volta puo' contenere delle /INCLUDE, ma queste, a loro volta, no.
Tutte le librerie e files coinvolti si intende che abbiano lunghezza
record 80 caratteri.
Tutti i parametri DDIN=, DDOUT=, DDINCL= devono essere specificati in
PARM= prima del membro a cui si riferiscono.
Se il membro specificato da una /INCLUDE non esiste il programma va in
abend.


      Esempi:

//SUBMIT  EXEC PGM=SUBJOB,PARM='libreria.job(miojob)'
//SYSPRINT DD SYSOUT=*

      questo e' il caso piu' semplice di sottomissione di un job.



//SUBMIT  EXEC PGM=SUBJOB,
//  PARM='DDIN=MIALIB;/60;NOME.LIBRERIA(JOB2)'
//MIALIB   DD DSN=PROD.LIB.JCL(JOB1),DISP=SHR
//SYSPRINT DD SYSOUT=*

      in questo caso viene sottomesso prima il JOB1 senza allocazione
dinamica, poi il programma aspetta un minuto e sottomette JOB2 da
un'altra libreria con l'allocazione dinamica.


//STEP01  EXEC PGM=SUBJOB,
//  PARM='DDOUT=READER;DDINCL=LIBINCL;NOME.LIBRERIA(JOBPROD)'
//LIBINCL  DD DSN=PROD.LIB.PARAM,DISP=SHR
//READER   DD SYSOUT=(A,INTRDR)
//SYSPRINT DD SYSOUT=*

      in questo esempio viene sottomesso il JOBPROD usando la libreria
PROD.LIB.PARAM per espandere le /INCLUDE implicite (cioe' quelle in
cui il nome della libreria non e' specificata nella include stessa);
inoltre non e' usata la allocazione dinamica per l'internal reader.


//COMMAND EXEC PGM=SUBJOB,
//  PARM='/*$S MIAPROC;/10;/*$VS,''D A,L'''
//SYSPRINT DD SYSOUT=A

      qui vengono dati due comandi a console con dieci secondi di
intervallo l'uno dall'altro; il primo e' il comando Jes che fa partire la
procedura MIAPROC, il secondo e' il comando MVS che visualizza gli address
spaces attivi.
Si noti l'uso di '$VS' per dare comandi non al Jes e l'uso dei doppi
apici ('') per scrivere un apice singolo dentro a PARM.



