You might consider a 2 PROC TRANSPOSE solution, aka flip and half flop. You don't have to fiddle with arrays and the same code works for two variables as you have or any number of variables of the samve type and naming convention.
[pre]
data test;
input Product:$8. Open_date:mmddyy8. Amount_0111 Amount_0211 Amount_0311 Create_0111 Create_0211 Create_0311;
format o: date.;
cards;
Blah 01012011 100 150 180 1000 1000 1000
Blah2 01012011 100 150 180 1000 1000 1000
;;;;
run;
proc print;
run;
proc transpose data=test out=flip;
by product open_date;
run;
data tall;
set tall;
month = intck('month',open_date,input(cats('01',scan(_name_,-1,'_')),ddmmyy.));
_name_ = scan(_name_,1,'_');
run;
proc sort data=tall;
by product open_date month _name_;
run;
proc transpose data=tall out=halfflop;
by product open_date month;
run;
proc print;
run;
[/pre]
[pre]
Open_
Obs Product date month _NAME_ Amount Create
1 Blah 01JAN11 0 COL1 100 1000
2 Blah 01JAN11 1 COL1 150 1000
3 Blah 01JAN11 2 COL1 180 1000
4 Blah2 01JAN11 0 COL1 100 1000
5 Blah2 01JAN11 1 COL1 150 1000
6 Blah2 01JAN11 2 COL1 180 1000
[/pre]