A data area can be used whenever you need to store information of limited size, independent of the existence of procedures or files. Typical uses of data areas are:

  • To provide an area (perhaps within each job’s QTEMP library) to pass information within a job.
  • To provide a field that is easily and frequently changed to control references within a job, such as:
    • Supplying the next order number to be assigned
    • Supplying the next check number
    • Supplying the next save/restore media volume to be used
  • To provide a constant field for use in several jobs, such as a tax rate or distribution list.
  • To provide limited access to a larger process that requires the data area. A data area can be locked to a single user, thus preventing other users from processing at the same time.

Commands associated with data areas:

  • CHGDTAARA
  • CRTDTAARA
  • DLTDTAARA
  • DSPDTAARA
  • RTVDTAARA

RPG Code example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
      *=====================================================                                        
      *--------------------------------------------------------                                    
      *                                                                                            
      * Variable Definition                                                                        
      *                                                                                            
     d CmdLength       s             15  5 inz(0)                                                  
     d CmdString       s            256    inz(*blanks)                                            
     d reply           s              1                                                            
                                                                                                   
       //                                                                                          
       //  external calls                                                                          
       //                                                                                          
                                                                                                   
     d $command        pr                  extpgm('QCMDEXC')                                        
     d   command                   5000    options(*varsize)                                        
     d   Length                      15  5                                                          
                                                                                                   
     d program21       ds                  DTAARA('MYTWENTY1')                                      
     d   mytwenty1                   21                                                            
                                                                                                   
                                                                                                   
                                                                                                   
      /Free                                                                                        
                                                                                                   
        //--------------------------------------------------------                                  
        // MAIN PROGRAM                                                                            
        //--------------------------------------------------------                                  
                                                                                                   
             cmdstring =                                                                            
              'CRTDTAARA DTAARA(QTEMP/MYTWENTY1) TYPE(*CHAR) LEN(21)';                              
             cmdlength = %len(%trim(cmdstring));                                                    
             monitor;                                                                              
             $command (cmdstring:cmdlength);                                                        
             on-error;                                                                              
             endmon;                                                                                
                                                                                                   
           // populate it  ....                                                                    
                                                                                                   
             *in99 = *on;                                                                          
             dow *in99 = *on;                                                                      
             in(e) *lock Program21;                                                                
              *in99 = %error;                                                                      
             enddo;                                                                                
                                                                                                   
             Program21 = 'Holy Crap Batman!';                                                      
             out  Program21;                                                                        
                                                                                                   
             in Program21;                                                                          
             dsply program21 reply;                                                                
                                                                                                   
           // now clear it  ....                                                                    
                                                                                                   
             *in99 = *on;                                                                          
             dow *in99 = *on;                                                                      
             in(e) *lock Program21;                                                                
              *in99 = %error;                                                                      
             enddo;                                                                                
             clear Program21;                                                                      
                                                                                                   
             out  program21;                                                                        
                                                                                                   
             in  Program21;                                                                        
                                                                                                   
             dsply program21 reply ;                                                                
                                                                                                   
           // re-populate it  ....                                                                  
                                                                                                   
             *in99 = *on;                                                                          
             dow *in99 = *on;                                                                      
             in(e) *lock Program21;                                                                
              *in99 = %error;                                                                      
             enddo;                                                                                
                                                                                                   
             Program21 = 'Lets try this again!';                                                    
             out  Program21;                                                                        
             in Program21;                                                                          
             dsply program21 reply;                                                                
                                                                                                   
             clear MyTwenty1;                                                                      
                                                                                                   
             *inlr = *on;                                                                          
        //--------------------------------------------------------                                  
        // *inzsr - initial one time subroutine                                                    
        //--------------------------------------------------------                                  
                                                                                                   
             begsr *inzsr;                                                                          
                                                                                                   
             endsr;                                                                                
                                                                                                   
        //--------------------------------------------------------                                  
      /End-Free

Using QXXCHGDA API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     D ChgDtaAra       PR                  ExtPgm('QXXCHGDA')
     D  prQualDtaAra                       LikeDS(qualdtaara) Const
     D  prStart                            Like(startpos)
     D  prLength                           Like(length)
     D  prNewData                      *

     D QualDtaAra      DS                  Qualified
     D  Name                         10a   Inz('TESTARA')
     D  Library                      10a   Inz('TESTLIB')
     D StartPos        S             10i 0 Inz(1)
     D Length          S             10i 0 Inz(4)
     D ptrNewData      S               *   Inz(%Addr(newdata))
     D NewData         S           2000a   Inz('Test')

      ************************************************************************************
       *inlr = *on;
       ChgDtaAra(qualdtaara : startpos : length : ptrnewdata);

all free format data area definition

1
2
3
4
5
6
dcl-s myDtaara char(200) dtaara(dtaaraName);
dcl-s dtaaraName char(21);

dtaaraName = whatever ...
in *lock myDtaara;
out myDtaara;

Another RPG example

DDS for table

1
2
3
4
5
6
7
8
      * file                                                                                        
     A          R ##FILER                                                                          
    A            F1TEXT1       10          TEXT('Text-1')                                          
     A            F1TEXT2       10          TEXT('Text-2')                                          
     A            F1TEXT3       10          TEXT('Text-3')                                          
     A            F1NUM1         5  0       TEXT('Number-1')                                        
     A            F1DATE          L         DATFMT(*USA)                                            
     A          K F1DATE

RPG Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
     F##FILE    uf a e           k disk                                                            
     //-------------------------- ##FILE -------------------------                                
      // A          R ##FILER                                                                      
      // A            F1TEXT1       10          TEXT('Text-1')                                      
      // A            F1TEXT2       10          TEXT('Text-2')                                      
      // A            F1TEXT3       10          TEXT('Text-3')                                      
      // A            F1NUM1         5  0       TEXT('Number-1')                                    
      // A            F1DATE          L         DATFMT(*USA)                                        
      // A          K F1DATE                                                                        
      //-----------------------------------------------------------                                
      *                                                                                            
      * Variable Definition                                                                        
      *                                                                                            
     d CmdLength       s             15  5 inz(0)                                                  
     d CmdString       s            256    inz(*blanks)                                            
     d foundrecord     s               n                                                            
     d indataarea      s             20                                                            
     d  inDtaAra       s             10                                                            
     d  inLibrary      s             10                                                            
     d reply           s              1                                                            
                                                                                                   
     d MyTwenty1DS     ds            21    dtaara('MYTWENTY1')                                      
     d Program21                     21                                                            
                                                                                                   
     d DtaAraRcv       ds                                                                          
     d  AraBytes                     10i 0                                                          
     d  AraBytesOut                  10i 0                                                          
     d  AraDtaType                   10a                                                            
     d  AraLibrary                   10a                                                            
     d  AraLength                    10i 0                                                          
     d  AraDecimals                  10i 0                                                          
     d  AraValue                   2000a                                                            
                                                                                                   
     d APIError        ds                  Qualified                                                
     d  BytesP                       10i 0 inz(%size(apiError))                                    
     d  BytesA                       10i 0 inz(0)                                                  
     d  Messageid                     7                                                            
     d  Reserved                      1                                                            
     d  messagedta                  240                                                            
                                                                                                   
       //                                                                                          
       //  external calls                                                                          
       //                                                                                          
                                                                                                   
     d $command        pr                  extpgm('QCMDEXC')                                        
     d   command                   5000    options(*varsize)                                        
     d   Length                      15  5                                                          
                                                                                                   
     d $GetData        pr                  extpgm('QWCRDTAA')                                      
     d   thedata                           like(DtaAraRcv)                                          
     d   thedatasize                 10i 0 const                                                    
     d   libDtaara                   20    const                                                    
     d   start                       10i 0 const                                                    
     d   length                      10i 0 const                                                    
     d   Error                             Like(ApiError)                                          
                                                                                                   
       // automatically qualified by datastructure name                                            
     d beforeDS        ds                  LIKEREC(##FILER : *INPUT)                                
    d afterDS         ds                  LIKEREC(##FILER : *OUTPUT)                              
    d KeyDS           ds                  LIKEREC(##FILER : *KEY)                                  
                                                                                                   
      /free                                                                                        
                                                                                                   
        //--------------------------------------------------------                                  
        // MAIN PROGRAM                                                                            
        //--------------------------------------------------------                                  
                                                                                                   
              // this allows me to read from a file                                                
              // keep a copy of the before record in datastructure BeforeDS                        
              // keep a copy of the after record in datastructure AfterDS                          
              // and update the table using the datastructure.                                      
              // only field changed was Text2...                                                    
                                                                                                   
              read ##FILE beforeDS;                                                                
             //move the fields                                                                    
              afterDS = beforeDS;                                                                  
                                                                                                   
              // increment the number field by 1                                                    
              AfterDS.F1Num1 += 1;                                                                  
              // update the first record                                                            
              update ##FILER afterDS;                                                              
                                                                                                   
               // text2 update with dec field                                                      
              AfterDS.F1text2 = 'Counter:' + %char(AfterDS.F1Num1);                                
              // write  a new record using datastructure                                            
              write ##FILER afterDS;                                                                
                                                                                                   
              reset foundrecord;                                                                    
              keyds.F1date = %date();                                                              
              setll %kds(KEYDS) ##FILER;                                                            
             if %equal;                                                                            
               foundrecord = *on;                                                                  
              endif;                                                                                
                                                                                                   
            // more dataarea code                                                                  
                                                                                                   
             cmdstring = 'CRTDTAARA DTAARA(QTEMP/MYTWENTY1) TYPE(*CHAR)' +                          
                         ' LEN(21)';                                                                
             cmdlength = %len(%trim(cmdstring));                                                    
             monitor;                                                                              
             $command (cmdstring:cmdlength);                                                        
             on-error;                                                                              
             endmon;                                                                                
                                                                                                   
           // populate it  ....                                                                    
                                                                                                   
             *in99 = *on;                                                                          
             dow *in99 = *on;                                                                      
             in(e) *lock MyTwenty1DS;                                                              
              *in99 = %error;                                                                      
             enddo;                                                                                
                                                                                                   
             Program21 = 'Holy Crap Batman!';                                                      
             out MyTwenty1DS;                                                                      
             Unlock MyTwenty1DS;                                                                    
                                                                                                   
             in  MyTwenty1DS;         // no lock                                                    
             dsply program21 reply;                                                                
                                                                                                   
           // now clear it  ....                                                                    
                                                                                                   
             *in99 = *on;                                                                          
             dow *in99 = *on;                                                                      
             in(e) *lock MyTwenty1DS ;                                                              
              *in99 = %error;                                                                      
             enddo;                                                                                
             clear Program21;                                                                      
             out  MyTwenty1DS;                                                                      
                                                                                                   
             in  MyTwenty1DS;                                                                      
                                                                                                   
             dsply program21 reply ;                                                                
                                                                                                   
           // re-populate it  ....                                                                  
                                                                                                   
             *in99 = *on;                                                                          
             dow *in99 = *on;                                                                      
             in(e) *lock MyTwenty1DS;                                                              
              *in99 = %error;                                                                      
             enddo;                                                                                
                                                                                                   
             Program21 = 'Lets try this again!';                                                    
             out MyTwenty1DS;                                                                      
             in MyTwenty1DS;                                                                        
             dsply program21 reply;                                                                
                                                                                                   
             // use API QWCRDTAA to retrieve data from dataarea                                    
             exsr $QWCRDTAA;                                                                        
                                                                                                   
                                                                                                   
              *inlr = *on;                                                                          
                                                                                                   
        //--------------------------------------------------------                                  
        // $QWCRDTAA - read dataarea with API                                                      
        //--------------------------------------------------------                                  
                                                                                                   
             begsr $QWCRDTAA;                                                                      
                                                                                                   
              // these could be parameters nice if you need to access multiple                      
              // dataareas in multiple libraries.                                                  
              inDtaAra  = 'MYTWENTY1';                                                              
              inLibrary = 'QTEMP';                                                                  
                                                                                                   
              if InDtaAra = '*GDA' or                                                              
                 InDtaAra = '*LDA' or                                                              
                 InDtaAra = '*PDA';                                                                
               %subst(InDataArea:1:10)  = InDtaARa;                                                
               %subst(indataarea:11:10) = *blanks;                                                  
              else;                                                                                
               indataarea =  inDtaAra + inlibrary;                                                  
              endif;                                                                                
                                                                                                   
              $getData(DtaAraRcv       :                                                            
                       %Size(DtaAraRcv):                                                            
                       InDataArea      :                                                            
                       -1              :                                                            
                       512             :                                                            
                       ApiError        );                                                          
                                                                                                   
              dsply %subst(AraValue:1:25) reply;                                                    
                                                                                                   
                                                                                                   
             endsr;                                                                                
        //--------------------------------------------------------                                  
                                                                                                   
      /end-free

Reading data area using QWCRDTAA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
     dQWCRDRTN         DS
     d QWCBAVL                       10i 0                                      Qwc Rdtaa Data
     d QWCBRTN                       10i 0                                      Bytes Available
     d QWCTVRTN                      10                                         Bytes Returned
     d QWCLIBN                       10                                         Type Value Return
     d QWCLVRTN                      10i 0                                      Library Name
     d QWCNBRDP                      10i 0                                      Length returned
     d QWCVALUE                     475                                         Number Decimal
       //
       //
       //
     dQUSEC            DS
     d QUSBPRV                       10i 0
     d QUSBAVL                       10i 0
     d QUSEI                          7
     d QUSERVED                       1
     d QUSED01                        1

     drcvvarsiz        s             10i 0  inz(%size(QWCRDRTN))
     ddtaaraname       s             20    inz('IN1BSIN   LBIFIL    ')
     dstrpos           s             10i 0 inz(-1)
     dstrlen           s             10i 0 inz(%size(QWCVALUE))

      //
      //  Required Parameter Group:
      //
      //  1 Receiver variable Output Char(*)
      //  2 Length of receiver variable Input Binary(4)
      //  3 Qualified data area name Input Char(20)
      //  4 Starting position Input Binary(4)
      //  5 Length of data Input Binary(4)
      //  6 Error code I/O Char(*)
      //

     d $getdataarea    pr                  extpgm('QWCRDTAA')
     d   recieveVar                 475
     d   lengthRecvar                10i 0
     d   dataareaLib                 20
     d   startpositon                10i 0
     d   lengthofInp                 10i 0
     d   errorcode                   17

       //
       //  run the api and retrieve the data
       //  this is useful if you have same dataarea in *multiple
       //  libraries and need info from them all via RPG.
       //  just change the data in "dtaaraname" and rerun for
       //  other library/dataarea's
       //

      /free
             QUSBPRV = 0;
             $getdataarea(QWCRDRTN   :
                          rcvvarsiz  :
                          dtaaraname :
                          strpos     :
                          strlen     :
                          QUSEC
                                     );

            // The variable QWCVALUE now contains the *DTAARA value
             dsply %subst(QWCVALUE:1:30)  ' ';
             *inlr = *on;

      /end-free

here is an example where the same data area is located in 5 different libraries
and you need to display all on once screen. (in my case the intranet)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
      //
      // Variable Definition
      //
     d buyslips        s              5  0
     d cmpcount        s              3  0
     d company         s              2s 0
     d companynm       s              3
     d dataname        s             21
     d inqslips        s              5  0
     d rcvvarsiz       s             10i 0
     d strpos          s             10i 0 inz(-1)
     d strlen          s             10i 0 inz(475)


     d $retrievedta    pr                  extpgm('QWCRDTAA')
     d   QWCRDRTN                   512    const
     d   rcvvarsiz                   10i 0 const
     d   dataname                    20    const
     d   strpos                      10i 0 const
     d   strlen                      10i 0 const
     d   QUSEC                       17    const

     dQWCRDRTN         DS
     d QWCBAVL                       10i 0                                      Qwc Rdtaa Data
     d QWCBRTN                       10i 0                                      Bytes Available
     d QWCTVRTN                      10                                         Bytes Returned
     d QWCLIBN                       10                                         Type Value Return
     d QWCLVRTN                      10i 0                                      Library Name
     d QWCNBRDP                      10i 0                                      Length returned
     d QWCVALUE                     475                                         Number Decimal

     dQUSEC            DS
     d QUSBPRV                       10i 0
     d QUSBAVL                       10i 0
     d QUSEI                          7
     d QUSERVED                       1
     d QUSED01                        1

      /Free

        //--------------------------------------------------------
        // MAIN PROGRAM
        //--------------------------------------------------------


              for cmpcount = 1 to 5;
               select;
                when cmpcount = 1;
                 dataname = 'DATAARA   LIBRARY1';
                 company = 15;
                 companynm = 'LSA';
                when cmpcount = 2;
                 dataname = 'DATAARA   LIBRARY2';
                 company = 72;
                 companynm = 'GMC';
                when cmpcount = 3;
                 dataname = 'DATAARA   LIBRARY3';
                 company = 20;
                 companynm = 'HSA';
                when cmpcount = 4;
                 dataname = 'DATAARA   LIBRARY4';
                 company = 18;
                 companynm = 'LSN';
                when cmpcount = 5;
                 dataname = 'DATAARA   LIBRARY5';
                 company = 30;
                 companynm = 'LSI';
               endsl;

               $retrievedta(QWCRDRTN   :
                            rcvvarsiz  :
                            dataname   :
                            strpos     :
                            strlen     :
                            QUSEC
                                        );
               buyslips =  %dec(%subst(QWCRDRTN:37:5):5:0);
               inqslips =  %dec(%subst(QWCRDRTN:42:5):5:0);
              endfor;

              *inlr = *on;

      /End-Free

Upload files



 


Working with Data Areas
Tagged on:                                     

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.