2

I have a null dataset such as

data a;
if 0;
run;

Now I wish to use proc report to print this dataset. Of course, there will be nothing in the report, but I want one sentence in the report said "It is a null dataset". Any ideas? Thanks.

Wayne
  • 33
  • 1
  • 6

2 Answers2

3

You can test to see if there are any observations in the dataset first. If there are observations, then use the dataset, otherwise use a dummy dataset that looks like this and print it:

data use_this_if_no_obs;
  msg = 'It is a null dataset';
run;

There are plenty of ways to test datasets to see if they contain any observations or not. My personal favorite is the %nobs macro found here: https://stackoverflow.com/a/5665758/214994 (other than my answer, there are several alternate approaches to pick from, or do a google search).

Using this %nobs macro we can then determine the dataset to use in a single line of code:

%let ds = %sysfunc(ifc(%nobs(iDs=sashelp.class) eq 0, use_this_if_no_obs, sashelp.class));

proc print data=&ds;
run;

Here's some code showing the alternate outcome:

data for_testing_only;
  if 0;
run;

%let ds = %sysfunc(ifc(%nobs(iDs=for_testing_only) eq 0, use_this_if_no_obs, sashelp.class));

proc print data=&ds;
run;

I've used proc print to simplify the example, but you can adapt it to use proc report as necessary.

Community
  • 1
  • 1
Robert Penridge
  • 8,424
  • 2
  • 34
  • 55
0

For the no data report you don't need to know how many observations are in the data just that there are none. This example shows how I would approach the problem.

Create example data with zero obs.

data class;
   stop;
   set sashelp.class;
   run;

Check for no obs and add one obs with missing on all vars. Note that no observation are every read from class in this step.

data class;
   if eof then output;
   stop;
   modify class end=eof;
   run;

make the report

proc report data=class missing;
   column _all_;
   define _all_ / display;
   define name / order;
   compute before name;
      retain_name=name;
      endcomp;
   compute after;
      if not missing(retain_name) then l=0;
      else l=40;
      msg = 'No data for this report';
      line msg $varying. l;
      endcomp;
   run;
data _null_
  • 8,534
  • 12
  • 14