BookmarkSubscribeRSS Feed
CamRutherford
Fluorite | Level 6

 Hi,

 

I have the below code whereby some of my variables that I specify to be dates don't show in my output field.

 

How can I format STARTDT and ENTERDT to be date9. fields in my output?

 

 

DATA DEPOSITS_ARRAY_BASE;
ARRAY RESORT 		{3} $500.;
ARRAY INTERV 		{3} $500.;
ARRAY STARTDT 		{3} DATE9.;
ARRAY ENTERDT		{3} DATE9.;
ARRAY REGION		{3} $500.;
ARRAY CHANNEL		{3} $500.;

FLAG=0;
DO UNTIL (LAST.SBR_ID);
SET DEPOSITS;
BY SBR_ID;
FLAG + 1;
IF FLAG <= 3 THEN DO; RESORT{FLAG} = RESORT_ID;		END;
IF FLAG <= 3 THEN DO; INTERV{FLAG} = INTERVAL;		END;
IF FLAG <= 3 THEN DO; STARTDT{FLAG} = START_DT;		END;
IF FLAG <= 3 THEN DO; ENTERDT{FLAG} = ENTER_DT;		END;
IF FLAG <= 3 THEN DO; REGION{FLAG} = PRIM_REGION;	END;
IF FLAG <= 3 THEN DO; CHANNEL{FLAG} = ENTRY_OPR_ID;	END;
END;
DROP 	FLAG ROW SPB_TYPE SPB_STAT XCH_SPB_REL_NO 
RESORT_ID INTERVAL START_DT ENTER_DT PRIM_REGION ENTRY_OPR_ID; RUN;

 

 

 

 

8 REPLIES 8
Kurt_Bremser
Super User

You can only assign lengths, not formats in an array definition. Use a separate format statement like in

data have;
x1 = today();
output;
x1 = today() + 1;
output;
x1 = today() +2 ;
output;
run;

data want;
array dates{3} 4;
format dates1-dates3 date9.;
do i = 1 to 3;
  set have;
  dates{i} = x1;
end;
drop i x1;
run;
Shmuel
Garnet | Level 18

The next part of your code:

FLAG + 1;
IF FLAG <= 3 THEN DO; RESORT{FLAG} = RESORT_ID;		END;
IF FLAG <= 3 THEN DO; INTERV{FLAG} = INTERVAL;		END;
IF FLAG <= 3 THEN DO; STARTDT{FLAG} = START_DT;		END;
IF FLAG <= 3 THEN DO; ENTERDT{FLAG} = ENTER_DT;		END;
IF FLAG <= 3 THEN DO; REGION{FLAG} = PRIM_REGION;	END;
IF FLAG <= 3 THEN DO; CHANNEL{FLAG} = ENTRY_OPR_ID;	END;
END;

can be replaced into:

FLAG + 1;
IF FLAG <= 3 THEN DO; 
    RESORT{FLAG} = RESORT_ID;
    INTERV{FLAG} = INTERVAL;
    STARTDT{FLAG} = START_DT;	
    ENTERDT{FLAG} = ENTER_DT;	
    REGION{FLAG} = PRIM_REGION;
    CHANNEL{FLAG} = ENTRY_OPR_ID;
END;

having same result with less coding and easier to read.

CamRutherford
Fluorite | Level 6

Can I use an array to format numeric values already created?

 

For example, if I wanted an array to format 3 columns, StartDT1 - StartDT3 to be DATE9.

 

Cheers

CamRutherford
Fluorite | Level 6
Sorry, I don't have a clue when it comes to arrays - your response doesn't make any sense to me, I need to see the whole code to understand
Kurt_Bremser
Super User

When you assign an array to already existing variables, you must supply the list of variables in the array statement:

array mydates{*} startdate enddate somedate;

You can then use the same list in a format statement:

format startdate enddate somedate date9.;

If you create an arrray and do not supply names for the individual variables, two things can happen

- existing variables that fit the array name(+index) scheme are represented by the array:

data have;
date1 = today();
date2 = date1 + 1;
date3 = date2 + 1;
run;

data want;
set have;
array date{3};
do i = 1 to 3;
  date{i} = date{i} + 1;
end;
drop i;
run;

Note that dataset want will contain the same variables as dataset have.

- if no fitting variables exist, they will be created:

data have;
date1 = today();
date2 = date1 + 1;
date3 = date2 + 1;
run;

data want;
set have;
array dates{3};
do i = 1 to 3;
  dates{i} = date1;
end;
drop i;
run;

Note that dataset want now contains six variables.

So, when you create array dates{*} without naming any variables, you will find that it will contain variable dates1, dates2, dates3 and so on; you can use the list form in a format statement:

%let maxdates=9;

data want;
array dates{&maxdates};
format dates1-dates&maxdates date9.;
Shmuel
Garnet | Level 18

Next part of your code is wrong:

ARRAY RESORT 		{3} $500.;
ARRAY INTERV 		{3} $500.;
ARRAY STARTDT 		{3} DATE9.;
ARRAY ENTERDT		{3} DATE9.;
ARRAY REGION		{3} $500.;
ARRAY CHANNEL		{3} $500.;

ARRAY statement is a tool to assign a name to a list of variables, of same type,

in order to enable relate to an array member (a speceific variable) by index.

 

ARRAY is not the tool to assign formats to variables.

 

Example:

     array varx {3} var1 var2 var3;  /* can be shorten to var1-var3 */

in this example VARX is the name of the array combined of 3 variables.

You relate to the second variable in the array, either by VAR2 or by VARX(2);

 

If you want to assing formats to those variables use the FORMAT statement:

    format var1-var3 comma6.2;   /* or any other format */

 

Tom
Super User Tom
Super User

A format is a tool for telling SAS how to display the values of the variable.  It is NOT how you define a variable. A SAS variable is either a fixed length character string or a floating point number.  In an ARRAY statement you can optionally define the type and length of the variables, but there is no way to attach a format to the variables using the ARRAY statement.  To attach a format you need use a FORMAT or ATTRIB statement.

 

Note that when specifing a variable's length you do not need to include a period.  Periods are used when specifying a format so that the parser can distinquish them from variable names or other keywords.  SAS will silently ignore the extra periods that you had included after the lengths in your ARRAY statements.

 

proc sql noprint;
  select max(nobs) into :max_obs trimmed
  from (select sbr_id,count(*) as nobs from deposits group by 1)
  ;
quit;

data deposits_array_base;
  array resort (&max_obs) $500;
  array interv (&max_obs) $500;
  array startdt (&max_obs) 8;
  array enterdt (&max_obs) 8;
  array region (&max_obs) $500;
  array channel (&max_obs) $500;
  format startdt: enterdt: date9. ;
  do flag=1 to &max_obs until (last.sbr_id);
    set deposits;
    by sbr_id;
    resort(flag) = resort_id;
    interv(flag) = interval;
    startdt(flag) = start_dt;
    enterdt(flag) = enter_dt;
    region(flag) = prim_region;
    channel(flag) = entry_opr_id;
  end;
  drop flag row spb_type spb_stat xch_spb_rel_no resort_id interval
       start_dt enter_dt prim_region entry_opr_id
  ;
run;

 

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 8 replies
  • 14365 views
  • 1 like
  • 4 in conversation