In reply to Leonid Batkhan.

It's useful for debugging. You can see what all of the values are at all of the break points (the whole report, groups, variables) and the order in which proc report ran them.

This example is verbose, but it illustrates several capabilities.

%macro writevalues();
call execute(cat('%put > ',
'_BREAK=', substr(_break_, 1, 10),
'Sex=', sex, ' ',
'Name=', name, ' ',
'Age=', age, ' ',
'Agemean=', agemean,
';')
);
%mend writevalues;

proc report data=sashelp.class nowindows missing;
where name =: 'J';
columns sex name age age=agemean;
define sex / order;
define name / order;
define age / display;
define agemean / mean noprint;

compute before;
call execute('%put Compute Before;');
%writevalues();
endcomp;

compute after;
call execute('%put Compute After;');
%writevalues();
endcomp;

compute before sex;
call execute('%put Compute Before Sex;');
%writevalues();
endcomp;

compute after sex;
call execute('%put ;');
endcomp;

compute age;
call execute('%put Compute Age;');
%writevalues();
endcomp;
run;

When call execute has a parameter that is entirely macro code, it executes immediately, which is why the output is shown in the log for proc report. Non-macro code is sent to the SAS parser after the procedure finishes.

Yes, this is complicated code, but sometimes it's the only way I can figure out what proc report is doing.