Most of has used dynamic variables in natural, with 4.1 we can abuse it further by utilizing it in dynamic array as well. Probably I should have explained what came along with 4.1 features first but one of the biggest advantages of 4.1 features is its advantage to hold more than 32K of data in work area. In fact we can have 1GB (but please check with your environment support or DBA’s before you decide to invoke these features, it may snap your system if not wisely coded). The major advantage of dynamic variable with dynamic array occurrence is the elimination of “Index not within array structure” errors since we code it in such a way as to have a upper limit based on forecasted growth. And if used wisely, we can eliminate this error completely (but please make sure someone does a good code reviewJ). The option is a double edged sword: it not only eliminates “Index not within array structure” and loads or dynamically expands array data based on growth but with the negative fallout that if it exceeds 1GB your process falls over. So be very cautious on its usage.
The simple trick in a dynamic variable with dynamic array occurrence is to capture the current occurrence by just moving the *COUNTER variable to the counter variable to expand the dynamic variable & array. The result is – a characteristic of passed field is taken as characteristics of the result field for dynamic field. And it’s most efficient usage would be to use in loading reference-data.
A sample piece of code will look like this:
DEFINE DATA LOCAL 01 REF VIEW OF REFERENCE-DATA 02 RD-KEY /* 15 BYTES OF SUPER-DESCRIPTOR 02 REDEFINE RD-KEY 03 RD-KEY1 (A5) /* FIRST HALF OF SUPER 03 RD-DATA (A10) /* SECOND HALF OF SUPER 01 #START-RD-KEY (A15) 01 #END-RD-KEY (A15) 01 #CITY-ARRAY (A/*) DYNAMIC 01 #CITY-COUNT (I4) 01 #CITY-INDEX (I4) END-DEFINE * RESET #START-RD-KEY #END-RD-KEY #CITY-COUNT COMPRESS 'MIAMI' INTO #START-RD-KEY LEAVING NO SPACE COMPRESS 'MIAMI' H'FF' INTO #END-RD-KEY LEAVING NO SPACE * HISTOGRAM MULTI-FETCH OF 1000 REF FROM #START-RD-KEY TO #END-RD-KEY ADD 1 TO #CITY-COUNT /* Or Move *COUNTER EXPAND ARRAY #CITY-ARRAY TO (1:#CITY-COUNT) /* expands the array to counter MOVE RD-DATA TO #CITY-ARRAY (#CITY-COUNT) /* resultant variable takes characteristics of moving variable END-HISTOGRAM * * Sample code to check if data is loaded IF #CITY-COUNT > 0 IF #CITY-ARRAY (*) EQ SCAN 'MIAMI' /* SCAN is a new option in 4.1 and similar to examine but just checks for existence of a value WRITE 'MATCH FOUND FOR MIAMI' ELSE WRITE 'MATCH NOT FOUDN FOR MIAMI' END-IF END-IF END |
If used wisely the advantages are limitless providing a good optimization in many fronts wherever applicable, probably opening the Pandora’s Box for another discussion (loading most frequent data to array for optimized performance :-)).