Hello,
I think you can achieve what you want in a more readable way and with less problems by not using macros
but plain SAS language.
Here is an example based on the code you've given, that you can adapt to your needs.
proc format;
invalue denom
'A', 'F', 'M', 'O', 'Q'=100
'P'=1000
'G', 'J'=10000
'H', 'OK'=100000
other=0;
run;
%let PLN=PLN;
%let CDD_FMT_&PLN._1=G;
%let CDD_FMT_&PLN._2=A;
data want;
length CDD_FMT $2.;
CDD_TX_PLN_1="5000"; /* For the example */
CDD_TX_PLN_2="200";
format CDD_VL_PLN_1 CDD_VL_PLN_2 best.;
array TX CDD_TX_PLN:;
array VL CDD_VL:;
do W=1 to 2;
CDD_FMT=symget(cats("CDD_FMT_&PLN._",W));
denom=input(CDD_FMT, denom.);
CDD_TX=input(TX(W),30.);
if denom then VL(W)=CDD_TX/denom;
else if CDD_FMT='D' then VL(W)= input(TX(W), YYMMDD10.);
else VL(W)=CDD_TX;
end; drop denom CDD_FMT;
run;
... View more