BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Srigyan
Quartz | Level 8

%macro change_date_format(&Date_1=);
%let Date_1=&date_process.;
format &Date_1._New date9.;
&Date_1._New=mdy(substr(&Date_1.,1,2),substr(&Date_1.,4,2),substr(&Date_1.,7,4));
Drop &Date_1.;
%mend;


DATA CMI_Repository_2;
SET pdata.CMI_Repository_1;

%change_date_format(BM_LaunchInitialDate2);

run;

 

showing error:

ERROR: More positional parameters found than defined.

how should i write this.

1 ACCEPTED SOLUTION

Accepted Solutions
ballardw
Super User

First off you used a macro variable in the macro definition for the parameter and defined it as a KEYWORD parameter. Keyword parameters must be used with the = in the actual macro call:

 

%macro dummy(keyword=);

definition requires use as

%dummy(keyword= some value);

when you use

%dummy(somevalue); then the parameter is assumed to be positional, meaning the first encountered value is the value for the first parameter in the definition. You did not define any positional parameters so that is the cause of the error.

 

However without knowing the value &date_1 at the time you compiled the macro we do not even know the proper name of the macro variable to use.

Where does the value from &date_process come from?

 

If the purpose of this macro is to create a new variable as a SAS date value from a string variable that has a content like 03212018 then perhaps

%macro change_date_format(datestringvar);
&datestringvar.new = input(&datestringvar,mmddyy8.);
format &datestringvar.new date9.;
%mend;

Then the call you used would be correct.

 

Note: automatically adding the same string to an existing variable name to an existing variable may have issues with the new variable name if you have some variable names that approach the 32 character limit. Example:

date_for_processing_sales_report is already 32 characters long. Adding "new" to the end would exceed the length of a valid variable.

An exercise for the interested reader is the test the result of &datestringvar.new as a valid variable name and making and adjustment if too long.

 

Also note the use of an INFORMAT specifically designed to read dates in mmddyy format like 03212018. This informat will also read "032118", "03 21 18" or "03/21/18" as March 21, 2018.

View solution in original post

6 REPLIES 6
Astounding
PROC Star

If you are going to write macros, you absolutely must understand these topics:

 

  • What is a positional parameter
  • What is a keyword parameter
  • How do you call a macro that has been defined with positional parameters
  • How do you call a macro that has been defined with keyword parameters

Those are things you need to find in the documentation, and study.

 

Secondarily, your code (once it is working) would apply SUBSTR to a variable named BM_LaunchInitialDate2.  I would hope that this is a character variable, since SUBSTR works on character strings only.

Reeza
Super User

You can't call macros like that from a data step. 

What are you trying to build a macro to do, that seems complicated.


This is what your macro should try to do:

 

date_new = input(date_old, mmddyy10.);
format date_new date9.;

So maybe:

 

%macro change_date_format(Date_1=);


&Date_1._New=input(&date_1, mmddyy10.);

format &Date_1._New date9.;
Drop &Date_1.;

%mend;

And then:

 

data cmi_repository;
set ..;

%change_date_format(date_1=bm_launchInitalDate2);
run;

Untested...

 

 

 

gamotte
Rhodochrosite | Level 12

Hello,

 

There are several problems in your code.

 

%macro change_date_format(Date_1);

    format &Date_1._New date9.;

    &Date_1._New=input(&Date_1.,mmddyy10.);

    drop &Date_1.;

%mend;

 

Also, you don't really need a macro here.

 

DATA CMI_Repository_2;
SET pdata.CMI_Repository_1;

format date1_new date2_new ... date9.;

date_1_new=input(date_1,mmddyy10.);

date2_new=...;

...

drop date1 date2 ...;

run;

 

Srigyan
Quartz | Level 8

I want to use this macro whenever I find similar situations. and my date is text hence I need to do this.

gamotte
Rhodochrosite | Level 12

Since the creation of the new variable is just one line of code, there is no nessity to create a macro as it obfuscates the code by requiring the maintener to find the macro code to see exactly what is done.
Both other instruction for format definition and dropping can be factored over all variables you want to recode.

ballardw
Super User

First off you used a macro variable in the macro definition for the parameter and defined it as a KEYWORD parameter. Keyword parameters must be used with the = in the actual macro call:

 

%macro dummy(keyword=);

definition requires use as

%dummy(keyword= some value);

when you use

%dummy(somevalue); then the parameter is assumed to be positional, meaning the first encountered value is the value for the first parameter in the definition. You did not define any positional parameters so that is the cause of the error.

 

However without knowing the value &date_1 at the time you compiled the macro we do not even know the proper name of the macro variable to use.

Where does the value from &date_process come from?

 

If the purpose of this macro is to create a new variable as a SAS date value from a string variable that has a content like 03212018 then perhaps

%macro change_date_format(datestringvar);
&datestringvar.new = input(&datestringvar,mmddyy8.);
format &datestringvar.new date9.;
%mend;

Then the call you used would be correct.

 

Note: automatically adding the same string to an existing variable name to an existing variable may have issues with the new variable name if you have some variable names that approach the 32 character limit. Example:

date_for_processing_sales_report is already 32 characters long. Adding "new" to the end would exceed the length of a valid variable.

An exercise for the interested reader is the test the result of &datestringvar.new as a valid variable name and making and adjustment if too long.

 

Also note the use of an INFORMAT specifically designed to read dates in mmddyy format like 03212018. This informat will also read "032118", "03 21 18" or "03/21/18" as March 21, 2018.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

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
  • 6 replies
  • 8113 views
  • 2 likes
  • 5 in conversation