Ü D SPEC

 

·         D is the alphabetic code used for Definition specifications.    

 

To prompt D SPEC give the line command: IPD                                     

 


Prompt type . . .    D      Sequence number . . .  '''''''
 
Declaration                      To /
Name              E   S/U      Type              From       Length
_____________     _    _        __               _____      ______
Internal               Decimal
Data Type             Positions      Keywords
   _                     __          _____________________________
Comment
________________


 

 

Ü D SPEC Keywords

 

o   VARYING

 


D varstr        s             50A   VARYING
C                   eval      varstr = 'Amit Jaiswal'

 

Here, the maximum length of the variable varstr will be 50, but the actual length can vary as per the value assigned to this variable. Here the current size of variable will be the size of string “Amit Jaiswal”.    

o    *VARSIZE
*VARSIZE has nothing to do with the data type of the variable. All it does is disable the compiler's validity checking of the length.

 

 

o   EXPORT & IMPORT

 

Export  indicates that the variable has been defined (stored) in this module and will be used by some other module which is importing this variable using Import keyword.

 

Import  indicates that the variable has been defined (stored) in some other module and will be used here.

 

Example:

 


Columns . . . :    6  76            Edit                        AMIT/QRPGLESRC
SEU==>                                                                 MODULE1
FMT H  HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*************** Beginning of data *************************************
0001.00 HOPTION(*NODEBUGIO)
0002.00 DVAR1             S              5  0 EXPORT  INZ(11111)
0003.00 DVAR2             S              5  0 IMPORT
0003.03 C                   CALLB     'MODULE2'
0003.04 C                   EVAL      VAR1=VAR2 +33333  >>>>>>>>>>>>>>>   VAR2=55555
0005.00 C     VAR1          DSPLY
0006.00 C                   SETON                                        LR
****************** End of data ****************************************


 

 


Columns . . . :    6  76            Edit                        AMIT/QRPGLESRC
SEU==>                                                                 MODULE2
FMT D  DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
*************** Beginning of data *************************************
0002.00 DVAR1             S              5  0 IMPORT
0003.00 DVAR3             S              5  0 IMPORT
0003.07 DVAR2             S              5  0 EXPORT
0003.08 C                   CALLB     'MODULE3'
0004.00 C                   EVAL      VAR2=VAR1+VAR3   >>>>>>>>>>>>>>>   VAR2=22222
0005.00 C                   RETURN
****************** End of data ****************************************


 

         


Columns . . . :    6  76           Browse                       AMIT/QRPGLESRC
SEU==>                                                                 MODULE3
FMT D  DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
*************** Beginning of data *************************************
0002.00 DVAR3             S              5  0 EXPORT
0004.00 C                   EVAL      VAR3=11111     >>>>>>>>>> VAR3=11111
0004.01 C                   RETURN
****************** End of data ****************************************

 

 

CRTPGM PGM(AMIT/PGM1) MODULE(AMIT/MODULE1 AMIT/MODULE2 AMIT/MODULE3)

 

Below picture depicts the data flow due to import/export:

D-SPEC pic1

 

 


 

 

 

 


o   EXTPGM

This keyword is used in case of prototyping. So first of all we will go through the concept of prototyping.

 

ü Prototyping

·         A prototype tells the compiler how the parameters of a called program or procedure are defined.

 

·         Prototyping makes the compiler to verify that whatever parameters that will be passed to a called program or procedure appropriately defined.

 

·         Prototyping benefit us by showing the error at compile time rather than at run time.

 

ü Case1: Program without prototyping

Here, there is one rpgle program SENDPGM which calls a CL program ‘MSGSFLCL’ with parameters MSGID(7), MSGF(10) and MSGOPT(1).

 

Calling Program SENDPGM

 


Columns . . . :    1  71           Browse                       AMIT/QRPGLESRC
SEU==>                                                                SENDPGM
FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data *************************************
 
* SEND MSG0001 FROM MESSAGE FILE CPF9898 TO PROGRAM MESSAGE QUEUE
 
C                   MOVEL     'MSG0001'     MSGID
C                   MOVEL     'AM_MSGF'     MSGF
C                   MOVE      'I'           MSGOPT
C                   EXSR      SEND
C     SEND          BEGSR
C                   CALL      'MSGSFLCL'
C                   PARM                    MSGID             7
C                   PARM                    MSGF             10
C                   PARM                    MSGOPT            1
C                   ENDSR

 

Message ID . . . . . . . . . :   MSG0001                              
Message file . . . . . . . . :   AM_MSGF                              
  Library  . . . . . . . . . :     AMIT                               
Message text . . . . . . . . :   THE ACCOUNT NUMBER CAN NOT BE BLANK  

 

 

 

Called program MSGSFLCL


Columns . . . :    1  71           Browse                       AMIT/QRPGLESRC
SEU==>                                                                MSGSFLCL
FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data *************************************
0001.01    PGM        PARM(&MSGID &MSGF &MSGOPT)
0002.00    DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)
0003.00    DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)
0004.00    DCL        VAR(&MSGOPT) TYPE(*CHAR) LEN(1)
0006.00
0007.00
0008.00    IF         COND(&MSGOPT *EQ 'I') THEN(SNDPGMMSG +
0009.00               MSGID(&MSGID) MSGF(&MSGF))
0010.00
0011.00    IF         COND(&MSGOPT *EQ 'C') THEN(RMVMSG PGMQ(*PRV +
0012.00                 (*)) CLEAR(*ALL))
0013.00 ENDPGM
****************** End of data ****************************************

 

 

When we run the program SENDPGM then at runtime it checks if the parameters are appropriately passed or not. If we change PARM “MSGID” to some other data type or change its length, we will get the error but not at compile time. We will get the error at run time and our program cannot continue further.

 

To make sure that the program doesn’t crash at run time, we detect the error at compile time itself by using prototyping. This is depicted in Case2 below.           

 

 

 

ü Case2: Program with prototyping

To use prototyping, we do the following modifications in the calling program SENDPFM.

 

Here we have changed the Parameter MSGID’s length from 7 TO 3.

 


Columns . . . :    1  71           Browse                       AMIT/QRPGLESRC
SEU==>                                                                SENDPGM
FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
 
DMSGID            S              3     >>>> Parm MSGID’s length changed from 7 to 3
DMSGF             S             10
DMSGOPT           S              1
DMSGSFLCL         PR                  EXTPGM('MSGSFLCL')
DMSGID                           7
DMSGF                           10
DMSGOPT                          1
* SEND MSG0001 FROM MESSAGE FILE CPF9898 TO PROGRAM MESSAGE QUEUE
C                   MOVEL     'MSG0001'     MSGID
C                   MOVEL     'AM_MSGF'     MSGF
C                   MOVE      'I'           MSGOPT
C                   EXSR      SEND
C     SEND          BEGSR
C                   CALLP     MSGSFLCL(MSGID:MSGF:MSGOPT)
C                   ENDSR

 

Now when we compile the program, we get the below error at compile time.

 

**Error: The type and attributes of the parameter do not match those of the prototype.

 

But the error that we have got here is at compile time that is what we wanted.

 

 


o   EXTPROC

If you've built modules with commands like CRTRPGMOD, CRTCLMOD, CRTCBLMOD, and CRTCMOD, you're accustomed to calling them with the CALLB op code. Just as you can with CALL, you can replace CALLB with CALLP.

 

ü Case1: Program without prototyping

Calling Program SENDPGM

 


Columns . . . :    1  71           Browse                       AMIT/QRPGLESRC
SEU==>                                                                SENDPGM
FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data *************************************
 
* SEND MSG0001 FROM MESSAGE FILE CPF9898 TO PROGRAM MESSAGE QUEUE
C                   MOVEL     'MSG0001'     MSGID
C                   MOVEL     'AM_MSGF'     MSGF
C                   MOVE      'I'           MSGOPT
C                   EXSR      SEND
C     SEND          BEGSR
C                   CALLB     'MSGSFLCL'
C                   PARM                    MSGID             7
C                   PARM                    MSGF             10
C                   PARM                    MSGOPT            1
C                   ENDSR

**Here we have compiled the same CL using CRTCLMOD to make it a module.

Called module MSGSFLCL


Columns . . . :    1  71           Browse                       AMIT/QRPGLESRC
SEU==>                                                                MSGSFLCL
FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data *************************************
0001.01    PGM        PARM(&MSGID &MSGF &MSGOPT)
0002.00    DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)
0003.00    DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)
0004.00    DCL        VAR(&MSGOPT) TYPE(*CHAR) LEN(1)
0006.00
0007.00
0008.00    IF         COND(&MSGOPT *EQ 'I') THEN(SNDPGMMSG +
0009.00               MSGID(&MSGID) MSGF(&MSGF))
0010.00
0011.00    IF         COND(&MSGOPT *EQ 'C') THEN(RMVMSG PGMQ(*PRV +
0012.00                 (*)) CLEAR(*ALL))
0013.00 ENDPGM
****************** End of data ****************************************

 

Now when we run the program we get the same run time error. To avoid this we will go for prototyping.

 

ü Case2: Program with prototyping


Columns . . . :    1  71           Browse                       AMIT/QRPGLESRC
SEU==>                                                                SENDPGM
FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
 
DMSGID            S              3    >>> Parm MSGID’s length changed from 7 to 3
DMSGF             S             10
DMSGOPT           S              1
DMSGSFLCL         PR                  EXTPROC('MSGSFLCL')
DMSGID                           7
DMSGF                           10
DMSGOPT                          1
* SEND MSG0001 FROM MESSAGE FILE CPF9898 TO PROGRAM MESSAGE QUEUE
C                   MOVEL     'MSG0001'     MSGID
C                   MOVEL     'AM_MSGF'     MSGF
C                   MOVE      'I'           MSGOPT
C                   EXSR      SEND
C     SEND          BEGSR
C                   CALLP     MSGSFLCL(MSGID:MSGF:MSGOPT)
C                   ENDSR

Using this we get the error at compile that we can correct and can easily avoid the situation of any run time error due to parameters wrong definition.

 

 


o   EXTNAME(file-name{:format-name}{:*ALL| *INPUT|*OUTPUT|*KEY})

 

The EXTNAME keyword is used to specify the name of the file which contains the field descriptions used as the subfield description for the data structure being defined.

 

The file-name parameter is required. Optionally a format name may be specified to direct the compiler to a specific format within a file.

 

The last parameter specifies which fields in the external record to extract:

·         *ALL extracts all fields.

·         *INPUT extracts just input capable fields.

·         *OUTPUT extracts just output capable fields.

·         *KEY extracts just key fields.

 

D  Fileds1       E DS                  Export                   

D                                     EXTNAME(file1)  

 

Structure of the externally described data structure:

 

·         Subfield name : Same as the external file’s fields name, unless it id renamed by keyword EXTFLD

                            or the PREFIX keyword on a definition specification is used to apply a prefix).

·         Subfield length

·         Subfield internal data type

 

 

All data structure keywords except LIKEDS and LIKEREC are allowed with the EXTNAME keyword.

 

D  D0220NEW     E DS                  PREFIX(D21:3)              
D                                     EXTNAME(CZGD02H0:CZTD02H2) 
D  D0220OLD     E DS                  PREFIX(D@@:3)              
D                                     EXTNAME(CZGD02H0:CZTD02H2) 

 

 

 

o   CONST(value)

 

  * Constant variables                                               
 D INTRO           C                   CONST('Introduction')         
 D PNDINT          C                   CONST('Pending Introduction') 
 D PNDCHG          C                   CONST('Pending Change')   
 

 

The keyword CONST(value) is used to identify the value of the constant.

 

 

 

o   LIKE(RPG_name) 

 

The LIKE keyword allows us to define a data element of same data type and length as another field.  This keyword may be used in place of the *LIKE  DEFINE op-code.

 

* Variables                                                 
D SAVORGCOD       S                   LIKE(D02ORGCOD) Inz    
D SAVACNTNO       S                   LIKE(D02ACNTNO) Inz 

 

 

 


o   OVERLAY(name{:pos | *NEXT})

 

The OVERLAY keyword allows us to define a field name on the basis of overlaying a data structure or a data structure subfield.

 

D DataStruct      DS
D  MainField                      10
D  Field1                         5    overlay(MainField)
D  Field2                         5    overlay(MainField:*next)

 

 

o   OCCURS

 

 

* Below DS1 is multiple occurrence data structures with 10 occurrences.

 

 


Columns . . . :    6  80                   Browse                    AMITCC/QRPGLESRC
SEU==>                                                                        MULTDS
FMT D  DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
*************** Beginning of data ****************************************************
0001.00 D DS1             DS                  OCCURS(10)  >>>>
0002.00 D FLDA                    1      5
0003.00 D FLDB                    6     10
0004.00 DX                S              2  0 INZ(1)
0005.00
0006.00 C     X             DO        10
0007.00 C     X             OCCUR     DS1    >>> OCCUR op-code sets the occurrence to X
0008.00 C                   EVAL      FLDA=%char(X)
0009.00 C                   EVAL      FLDB=%char(X)
0010.00 C                   EVAL      X=X+1
0011.00 C     DS1           DSPLY
0012.00 C                   ENDDO
0013.00 C                   SETON                                        LR
****************** End of data *******************************************************




OUTPUT

 

DSPLY  1    1       

DSPLY  2    2       

DSPLY  3    3       

DSPLY  4    4       

DSPLY  5    5       

DSPLY  6    6       

DSPLY  7    7       

DSPLY  8    8       

DSPLY  9    9       

DSPLY  10   10      

 

 

 

 


o   DTAARA{(data_area_name)}     

             

Specifies the name of the external data that is associated with a field, data structure,  data structure subfield or data area data structure.

 


    Dtime_is          S               z
     Dtime_isO         S             20
     DMATCHNF          S              1  0 INZ (0)
     DRBSPRTYM         S              1    INZ ('N')
     DACCCONVF         S              1    INZ('N')
     DLDA             UDS                  DTAARA(*LDA)
 
     DLdadateY                 1      4  0
     DLdadateM                 5      6  0
     DLdadateD                 7      8  0
 
      **Data structure for GETTING CURRENT DATE AND TIME
     DCURTIMDAT        DS
     DCURTIMDATE               1     16S 0
     DCURRYEAR                 1      4S 0
     DCURRMONTH                5      6S 0
     DCURRDAY                  7      8S 0
     DCURRHRS                  9     10S 0
     DCURRMINS                11     12S 0
     DCURRSECS                13     16S 0
 
 C     TIMECAL       BEGSR
  *
 C                   EVAL      TIME_IS=%TIMESTAMP()
 C                   EVAL      TIME_ISO=%char(TIME_IS:*iso0)
 C                   EVAL      CURRYEAR=%dec(%SUBST(TIMe_ISo:1:4):4:0)
 C                   EVAL      CURRMONTH=%dec(%SUBST(TIMe_ISo:5:2):2:0)
 C                   EVAL      CURRDAY=%dec(%SUBST(TIMe_ISo:7:2):2:0)
 C                   EVAL      CURRHRS=%dec(%SUBST(TIMe_ISo:9:2):2:0)
 C                   EVAL      CURRMINS=%dec(%SUBST(TIMe_ISo:11:2):2:0)
 C                   EVAL      CURRSECS=%dec(%SUBST(TIMe_ISo:13:4):4:0)
 C                   ENDSR

 

 

 

 

             

OUTPUT

 

TIME_IS = '2012-05-18-07.11.00.926000'             

TIME_ISO = '20120518071100926000'                

 

 

o   CTDATA                   

         

    Specifies that the array is a  compile-time array. 

    Example is given after PERRCD definition.     

 

o   DIM(numeric_constant)    

               

    Specifies the number of elements of an array or table.

    Example is given after PERRCD definition.                            

 

o   PERRCD(numeric_constant)                  

 

    Specifies the number of elements per record for a compile-time or a prerun-time array or table.           

 

Example


Columns . . . :    1 100                                      Browse          
 SEU==>                                                                        
 FMT D  .....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++
        *************** Beginning of data **************************************
0001.00      darr1             s              3P 0 dim(5) ctdata perrcd(1)     
0002.00      darr2             s              3P 0 dim(5) ctdata perrcd(1)     
0003.00      dS                s              3p 0 inz(0)                      
0004.00      dn                s              2p 0 inz(1)                      
0005.00      c     n             do        5                                   
0006.00      c                   eval      s=arr2(n)-arr1(n)                   
0007.00      c     s             dsply                                          
0008.00      c                   add       1             n                     
0009.00      c                   enddo                                         
0010.00      c                   seton                                        lr
0011.00 ** CTDATA arr1                                                         
0012.00 101                                                                    
0013.00 102                                                                    
0014.00 103                                                                    
0015.00 104                                                                    
0016.00 105                                                                     
0017.00 ** CTDATA arr2                                                         
0018.00 201                                                                    
0019.00 202                                                                     
0020.00 203                                                                       
0021.00 204                                                                       
0022.00 205                                                                        
        ****************** End of data ********************************************

 

 

O/P

DSPLY    100

DSPLY    100

DSPLY    100

DSPLY    100

DSPLY    100

 

 

 

 


o   STATIC                                      

 

Type this keyword in the D specifications of sub-procedures to indicate that a standalone field or data structure is   stored in static storage. 

 

 

Automatic Storage

 

·         By default, whatever stand-alone fields, data structures, arrays, etc. fields are defined inside a sub-procedure use automatic storage.

·         The scope of these sub-procedure’s fields will be till the sub-procedure runs. After that it will be reset to default value(0 or blank).

·         It has no effect of SETON  LR. It really doesn’t matter if LR is SETON or SETOFF, its value will be reinitialized each time the procedure is called.

 

Static Storage

·         Static storage has its life cycle from the time the program is called until the activation group where it is running ends, or until the job or group job ends.

·         Static fields defined inside P specs has no effect of SETON  LR, its values remain the same between multiple calls to the program.

·         Global variable is the one that is defined outside P-spec. Its values remain the same between multiple calls to the program. But it is affected by SETON  LR i.e. SETON LR resets the global variable.

 


Columns . . . :    1  80                Browse                          AMITCC/QRPGLESRC
SEU==>                                                                        STATICPGM
FMT D  .....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
*************** Beginning of data *****************************************************
0001.00      D Checkcount      PR
0002.00      D n               S              2  0 inz(1)
0003.00
0004.00      DDS1              DS
0005.00      DFiller1                        12    inz('  Autocount=')
0006.00      DAuto                            1  0
0007.00      DFiller2                        14    inz('  Staticcount=')
0008.00      DStatic                          1  0
0009.00      DFiller3                        14    inz('  Globalcount=')
0010.00      DGlobalcount                     1  0 inz(*zeros)
0011.00      C     n             DO        3
0012.00      C                   CALLP     CHECKCOUNT
0013.00      C                   ENDDO
0014.00      C***                RETURN
0015.00      C                   SETON                                        LR
0016.00
0017.00      P Checkcount      B
0018.00      D                 PI
0019.00
0020.00      D AutoCount       S              3  0
0021.00      D StaticCount     S              3  0 STATIC
0022.00      C                   EVAL      AutoCount=Autocount+1
0023.00      C                   EVAL      StaticCount=StaticCount+1
0024.00      C                   EVAL      Globalcount= Globalcount+1
0025.00
0026.00      C                   EVAL      Auto=Autocount
0027.00      C                   EVAL      Static=Staticcount
0028.00
0029.00      C     DS1           DSPLY
0030.00
0031.00      P Checkcount      E
0032.00
****************** End of data *********************************************************




Condition based OUTPUT :


Case1: 1ST CALL without RETURN op-code

Autocount=1  Staticcount=1  Globalcount=1

Autocount=1  Staticcount=2  Globalcount=2

Autocount=1  Staticcount=3  Globalcount=3

 

 

 

Case2: 2ND CALL without RETURN op-code

Autocount=1  Staticcount=4  Globalcount=1

Autocount=1  Staticcount=5  Globalcount=2

Autocount=1  Staticcount=6  Globalcount=3

 

 

Case3: 1ST CALL with RETURN op-code

Autocount=1  Staticcount=1  Globalcount=1

Autocount=1  Staticcount=2  Globalcount=2

Autocount=1  Staticcount=3  Globalcount=3

 

Case4: 2ND CALL with RETURN op-code

Autocount=1  Staticcount=4  Globalcount=4

Autocount=1  Staticcount=5  Globalcount=5

Autocount=1  Staticcount=6  Globalcount=6

 

Case5: 3RD CALL with RETURN op-code after RCLRSC or SIGNOFF or RCLACTGRP (if used in the program)

Autocount=1  Staticcount=1  Globalcount=1

Autocount=1  Staticcount=2  Globalcount=2

Autocount=1  Staticcount=3  Globalcount=3


 

 

 

 

o   INZ

 


Columns . . . :    6 100                                      Browse       
 SEU==>                                                                     
 FMT D  DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++
        *************** Beginning of data ***********************************
0001.00 Da                S             10A   inz(*ALL'Z')                  
0002.00 Db                S             10A   inz(*blanks)                  
0003.00 Dc                S             10  0 inz(*zeros)                   
0004.00 Dd                S             10A   inz                           
0005.00 De                S             10  0 inz                           
0006.00 C     a             DSPLY                                            
0007.00 C     b             DSPLY                                           
0008.00 C     c             DSPLY                                           
0009.00 C     d             DSPLY                                            
0010.00 C     e             DSPLY                                           
0011.00 C                   SETON                                        LR 
        ****************** End of data **************************************

 

O/P

 

DSPLY  ZZZZZZZZZZ

DSPLY           

DSPLY           0

DSPLY           

DSPLY           0

 











User Comments:



Copyright © www.go4as400.com, 2013-2023. Copyright notice   Terms of services   Privacy policy