SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1210|回复: 1
打印 上一主题 下一主题

请教call execute的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2012-8-21 17:17:25 | 只看该作者

请教call execute的问题

使用的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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2012-8-28 17:30:31 | 只看该作者

Re: 请教call execute的问题

目测为数字型字符型转换时候的问题,还有缺少引号…… 这些都是容易忽略的细节,构架和整体思路没问题,是可以实现的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-3 21:55 , Processed in 0.068914 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表