使用的SAS版本是 9.13
我有 一张描述信用卡信息的 卡表(Cards),有 卡号、信用额度、余额 等字段
现在模拟交易的交易:
1、随机取一张卡
2、随机产生一个消费金额
3、判断消费额度是否超过信用卡的余额
4.1、如果未超过,则 将 原来的余额减去 这次的消费金额 为新的 余额
4.2、如果超过,则此次不消费,只对此张信用卡还款。
5、循环上面的过程,直至完成需要的次数。
我写的代码见后面。
现在存在的问题是,call execute 是在我的DATA步骤结束后,再去执行相关的MACRO。
请问在我如何在尽量小改小的前提下,实现我的目的。
%macro updatetable(Cardnum=,AfterUpdateBal=);
proc sql;
update Cards
set Bal=&AfterUpdateBal.
where Card_num="&Cardnum.";
quit;
%mend;
%macro repay(Cardnum=);
proc sql;
update Cards
set Bal=LIMIT_AMT
where Card_num="&Cardnum.";
quit;
%mend;
data trans;
do i=1 to 100;
mycardpoint=CEIL(RANUNI(0)*mycardnobs);
set Cards POINT=mycardpoint nobs=mycardnobs; /*随机取一张卡*/
Tx_Amt=1000*rand('uniform'); /*随机产生一个消费金额*/
if(Bal>=Tx_Amt) then do; /*如果余额为够此次消费,则更新余额*/
Bal=Bal-Tx_Amt; /*更新 “余额” */
call execute('%updatetable(Cardnum='||Card_num||',AfterUpdateBal='||Bal||');');
end;
else do; /*如果余额不够此次消费,则存款,使得余额 等于 信用额度 */
Tx_Amt=Bal-LIMIT_AMT; /*这里 Tx_Amt 表示存入的金额*/
call execute('%repay(Cardnum='||Card_num||');');
end;
output;
end;
stop;
run;