CSPro does not have a constant modifier that can be used to indicate that a variable cannot be modified, but the principle of using constant values is still one that is useful for CSPro users. For example, if your task is to write an edit program that replaces invalid sex values with a random selection of the previous 10 valid sex values, here are two ways you could code it.
Version 1
array sexHD(10);
numeric sexCounter;
PROC APPLICATION_FF
preproc
sexHD(1) = 1;
sexHD(2) = 2;
sexHD(3) = 1;
sexHD(4) = 2;
sexHD(5) = 1;
sexHD(6) = 2;
sexHD(7) = 1;
sexHD(8) = 2;
sexHD(9) = 1;
sexHD(10) = 2;
sexCounter = 1;
seed(systime());
PROC SEX
if SEX in 1:2 then { valid sex }
sexHD(sexCounter) = SEX;
sexCounter = sexCounter + 1;
if sexCounter > 10 then
sexCounter = 1;
endif;
else { invalid sex, use the hotdeck }
impute(SEX,sexHD(random(1:10)));
endif;
Version 2
numeric sizeSexHD = 10;
array sexHD(sizeSexHD) = 1 2 ...;
numeric sexCounter = 1;
PROC APPLICATION_FF
preproc
seed(systime());
PROC SEX
if SEX in 1:2 then // valid sex
sexHD(sexCounter) = SEX;
inc(sexCounter);
if sexCounter > sizeSexHD then
sexCounter = 1;
endif;
else // invalid sex, use the hotdeck
impute(SEX,sexHD(random(1:sizeSexHD)));
endif;
The first version is the way you might have coded this application using older versions of CSPro. The second version uses features in CSPro 4.1. The second version shows how you can initialize the values for temporary variables and arrays while declaring them in PROC GLOBAL. It also shows the use of the inc (increment) function, as well as the new CSPro 4.1.002 feature which allows you to specify the size of your array by using a declared variable.
The advantages of the second version are two-fold. First, the amount of code is reduced. Secondly, the code is much more dynamic. If, for instance, you are told that the edit should now choose between the previous 20 valid sex values, you only need to change the value of sizeSexHD. Changing this one value affects the size of the array, the number of times that the array is initialized with the alternating values of 1 and 2, the reset of the sexCounter increment variable, and the selection of values from the array.
Using constants when possible is a great idea for edits as well. Using these arrays to store constant values makes code much clearer, and allows for the easy editing of the parameters under which your program runs. Note in the following example the use of a value set to define the size of the educationAges array. These constant values can now be accessed using the getdeck function.
array minAgeForChildbearing(P16_VS1) = 15 12;
array maxAgeForChildbearing(P16_VS1) = 99 49;
// Min Max
array educationAges(P21_VS1,2) = 0 99 // no schooling
5 12 // class 1
6 13 // class 2
7 14 // class 3
8 15 // class 4
9 16 // class 5
10 17 // class 6
11 18 // class 7
12 19 // class 8
13 20 // class 9
14 99 // class 10
16 99 // bachelor's
19 99 // master's
20 99 // PhD
21 99 // postdoc
;