SAS日期宏和压缩功能

时间:2016-12-14 19:26:52

标签: sas sas-macro

我正在努力尝试转换下面的代码中的压缩函数。

旧代码:(此代码有效并返回以下结果)

public class RoundedRectangle extends Figure {
    private final RoundedRectangle rectangle;

    public RoundedRectangle() {
        super();
        setLayoutManager(new XYLayout());
        rectangle = new RoundedRectangle();
        rectangle.setCornerDimensions(new Dimension(20, 20)); // This is where the rounding happens
        // Anything else you want to customize
        add(rectangle);
    }

    @Override
    protected void paintFigure(Graphics graphics) {
        Rectangle r = getBounds().getCopy();
        setConstraint(rectangle, new Rectangle(0, 0, r.width, r.height));
    }
}

此代码将宏变量startdt的值返回为2015/11/1,将datenum的值返回为2015/11/1。

我正在尝试使用日期的宏变量来实现类似的功能。

新代码:(此代码给我一个错误,我无法弄清楚原因)

data _null_;
%let startdt='2015/11/1'; 
date_num=compress(&startdt,"'");
call symputx('date_num',date_num);
%put &startdt;
%put &date_num;
run;

运行此新代码时出错。我想得到旧代码中的结果。 请帮忙。谢谢!

2 个答案:

答案 0 :(得分:0)

您的第一个数据步骤就是从宏变量中删除引号。您可以使用int main (void) { controller _controller; // constructor called _controller.test_func(); // destructor of controller called, because it go out of scope, // so testing destructor is called too because, there is no more // shared_ptr pointing to it! } 调用%sysfunc()函数在宏代码中执行此操作。或者甚至只使用compress()函数。

%scan()

在第二个看起来你正试图在日期值上使用INTNX()函数。但是您的宏变量不包含日期值。如果你想对待2015/11/1'如果它是一个日期,那么你将需要使用输入函数来首先转换它。

%let date_num = %scan(&startdt,1,%str(%'));

答案 1 :(得分:0)

我不确定为什么你的旧代码没有给你一个错误。第一次运行它时,您应该看到错误,

  

警告:未解析显式符号引用DATE_NUM。

然后,在数据步骤运行后,&DATE_NUM将有一个值。您无法在数据步骤中使用%PUT来显示您在数据步骤中创建的宏变量。

在第二组代码中,您创建的STARTDT宏变量的值首先没有单引号。如果您只是运行以下内容,您将获得正确的结果:

data _null_;
dt = date();
last_mth_beg = intnx('month',dt,-1,'beginning');
call symput('startdt',put(last_mth_beg,YYMMDDS10.));
run;

%put &startdt;

当我运行它时,我看到了

  

2016年11月1日