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

Good day 

 

I keep getting this syntax error below - code is fine but it keeps throwing this error.

 

ERROR 22-322: Syntax error, expecting one of the following: ;, CHECK, CODEGEN, CONSTDATETIME, DOUBLE, DQUOTE, ERRORSTOP, EXEC,

              EXITCODE, FEEDBACK, FLOW, INOBS, IPASSTHRU, LOOPS, NOCHECK, NOCODEGEN, NOCONSTDATETIME, NODOUBLE, NOERRORSTOP,

              NOEXEC, NOFEEDBACK, NOFLOW, NOIPASSTHRU, NONUMBER, NOPRINT, NOPROMPT, NOREMERGE, NOSORTMSG, NOSTIMER, NOSTOPONTRUNC,

              NOTHREADS, NOWARNRECURS, NUMBER, OUTOBS, PRINT, PROMPT, REDUCEPUT, REDUCEPUTOBS, REDUCEPUTVALUES, REMERGE, SORTMSG,

              SORTSEQ, STIMER, STOPONTRUNC, THREADS, UBUFSIZE, UNDO_POLICY, WARNRECURS. 

1 ACCEPTED SOLUTION

Accepted Solutions
EMC9
Obsidian | Level 7

Thank you - running it now and I will revert back - will also look at the change history.

 

thank you very much 1

View solution in original post

9 REPLIES 9
PeterClemmensen
Tourmaline | Level 20

Since you get an error, I suspect that your code is not fine 😉

 

Please show us your code.

EMC9
Obsidian | Level 7

Hi 

 

so I get the code could be the issue but it just started after being fine for many months:

 

code is :

 

 

 

%macro display_channel (channel);

 

data table.disp_daily_&channel.;

set table.disp_daily (where=(channel = "&channel."));

run;

 

proc sort data=table.disp_daily_&channel. nodupkey;

by co_cde LOAD_DATE COD_OFFER_TYPE CUST_NO ACCT_NO;

run;

 

proc sort data = table.disp_daily_&channel.;

                by   descending load_date;

run;

 

proc freq data=table.disp_daily_&channel. noprint;

tables co_cde*cod_offer_type*load_date /out=table.disp_daily_&channel.2;

run;

 

%datefill(&M1BDATE.,&TDATE.);

 

proc sort data=table.disp_daily_&channel.2 out=table.cod_offertypes nodupkey;

by co_cde cod_offer_type;

run;

 

proc sql;

     create table big3_daily2 as

     select     a.co_cde,

                a.cod_offer_type,

                b.load_date

     from

     table.cod_offertypes as a,

     big3_daily as b;

 

quit;

 

proc sql

     create table table.disp_daily_&channel.3 as

     select     a.co_cde,

                a.cod_offer_type,

                a.load_date,

                b.count

     from

     big3_daily2 as a

     left join

     table.disp_daily_&channel.2 as b

     on  a.cod_offer_type = b.cod_offer_type

     and a.load_date = b.load_date

    and a.co_cde = b.co_cde;

quit;

 

%offerinfo1               (table.disp_daily_&channel.3,table.disp_daily_&channel.4);

%offerinfo2               (table.disp_daily_&channel.4,table.disp_daily_&channel.4);

%month_of_load_date (table.disp_daily_&channel.4,table.disp_daily_&channel.4);

 

proc sort data=table.disp_daily_&channel.4;

by co_cde cod_offer_type month load_date;

run;

 

data table.disp_daily_&channel.5;

  set table.disp_daily_&channel.4;

  by co_cde

     cod_offer_type

     month;

  retain CUM_FREQ_ 0;

  if first.MONTH then CUM_FREQ_ = count;

  else CUM_FREQ_ = CUM_FREQ_ + count;

run;

 

proc sort data=table.disp_daily_&channel.5;

by co_cde prod load_date month day;

run;

 

proc means data=table.disp_daily_&channel.5 noprint;

by co_cde prod load_date month day;

var count;

output out=table.disp_daily_&channel.6 sum=;

run;

 

proc sort data=table.disp_daily_&channel.6;

by co_cde prod month load_date;

run;

 

data table.disp_daily_&channel.7;

  set table.disp_daily_&channel.6;

  by co_cde

     prod

     MONTH;

  retain CUM_FREQ_ 0;

  where prod ^= '';

  if first.MONTH then CUM_FREQ_ = count;

  else CUM_FREQ_ = CUM_FREQ_ + count;

run;

 

/*******************************************************/

 

/*Need to get unique displays PER CHANNEL for the table*/

 

/*******************************************************/

 

proc sort data=table.disp_daily_&channel.;

by co_cde LOAD_DATE CUST_NO ACCT_NO;

run;

 

proc sort data=table.disp_daily_&channel. nodupkey out=table.disp_un2_&channel.;

by co_cde TEMP_MONTH COD_OFFER_TYPE CUST_NO ACCT_NO;

run;

 

proc freq data=table.disp_un2_&channel. noprint;

tables co_cde*cod_offer_type*load_date /out=table.disp_un2_&channel.2;

run;

 

%datefill(&M1BDATE.,&TDATE.);

 

proc sort data=table.disp_un2_&channel.2 out=table.cod_offertypes nodupkey;

by co_cde cod_offer_type;

run;

 

proc sql;

     create table big3_daily2 as

     select     a.co_cde,

                a.cod_offer_type,

                b.load_date

     from

     table.cod_offertypes as a,

     big3_daily as b;

 

     create table table.disp_un2_&channel.3 as

     select     a.co_cde,

                a.cod_offer_type,

                a.load_date,

                b.count

     from

     big3_daily2 as a

     left join

     table.disp_un2_&channel.2 as b

     on  a.cod_offer_type = b.cod_offer_type

     and a.load_date = b.load_date

     and a.co_cde = b.co_cde;

quit;

 

%offerinfo1                (table.disp_un2_&channel.3,table.disp_un2_&channel.4);

%offerinfo2                (table.disp_un2_&channel.4,table.disp_un2_&channel.4);

%month_of_load_date (table.disp_un2_&channel.4,table.disp_un2_&channel.4);

 

proc sort data=table.disp_un2_&channel.4;

by co_cde cod_offer_type month load_date;

run;

 

data table.disp_un2_&channel.5;

  set table.disp_un2_&channel.4;

  by co_cde

     cod_offer_type

     month;

  retain CUM_FREQ_ 0;

  if first.MONTH then CUM_FREQ_ = count;

  else CUM_FREQ_ = CUM_FREQ_ + count;

run;

 

proc sort data=table.disp_un2_&channel.5;

by co_cde prod load_date month day;

run;

 

proc means data=table.disp_un2_&channel.5 noprint;

by co_cde prod load_date month day;

var count;

output out=table.disp_un2_&channel.6 sum=;

run;

 

proc sort data=table.disp_un2_&channel.6;

by co_cde prod month load_date;

run;

 

data table.disp_un2_&channel.7;

  set table.disp_un2_&channel.6;

  by co_cde

     prod

     MONTH;

  retain CUM_FREQ_ 0;

  where prod ^= '';

  if first.MONTH then CUM_FREQ_ = count;

  else CUM_FREQ_ = CUM_FREQ_ + count;

run;

%mend;

%display_channel (ONLINE);

%display_channel (ATM);

%display_channel (FUSION);

%display_channel (BRANCH);

%display_channel (MOBILE);

%display_channel (FNB_APP);

%display_channel (SELL_IT);

%display_channel (APEX);

 

Kurt_Bremser
Super User

That's your culprit:

proc sql
     create table table.disp_daily_&channel.3 as

Missing semicolon after the proc sql statement.

@Tom caught it right from the start.

 

"so I get the code could be the issue but it just started after being fine for many months:"

 

So somebody changed it. Look at the change history in the code repository.

EMC9
Obsidian | Level 7

Thank you - running it now and I will revert back - will also look at the change history.

 

thank you very much 1

RW9
Diamond | Level 26 RW9
Diamond | Level 26

Please do not mark your own response as the answer to the question.  Select the person who provided the correct answer and mark that as the answer to the question, that way the answer appears under the question.

EMC9
Obsidian | Level 7

Hi 

 

that missing semi colon fixed the issue- thank you !

 

im not sure how my question got marked as the answer - aplogies but this is the answer that worked.

 

thanks

Kurt_Bremser
Super User

A code cannot, by definition, be "fine" when it throws an ERROR.

 

Please post the log of the whole step that caused the ERROR message; use the 6th ({i}) or 7th ("little running man") icon to preserve formatting and special characters/character sequences.

Tom
Super User Tom
Super User

To debug an error message you need to look at the code that generated the error message. If you are using macros to generate the code then make sure to turn on the MPRINT option so that you can see the generated code in the log.

 

Because that list of valid options looks like the options on the PROC SQL statement most likely you have generate a PROC SQL statement without the ending semicolon.

133  proc sql
134   select
      ------
      22
      202
ERROR 22-322: Syntax error, expecting one of the following: ;, CHECK, CODEGEN, CONSTDATETIME, DOUBLE,
              DQUOTE, ERRORSTOP, EXEC, EXITCODE, FEEDBACK, FLOW, INOBS, IPASSTHRU, LOOPS, NOCHECK,
              NOCODEGEN, NOCONSTDATETIME, NODOUBLE, NOERRORSTOP, NOEXEC, NOFEEDBACK, NOFLOW,
              NOIPASSTHRU, NONUMBER, NOPRINT, NOPROMPT, NOREMERGE, NOSORTMSG, NOSTIMER,
              NOSTOPONTRUNC, NOTHREADS, NOWARNRECURS, NUMBER, OUTOBS, PRINT, PROMPT, REDUCEPUT,
              REDUCEPUTOBS, REDUCEPUTVALUES, REMERGE, SORTMSG, SORTSEQ, STIMER, STOPONTRUNC, THREADS,
              UBUFSIZE, UNDO_POLICY, WARNRECURS.

ERROR 202-322: The option or parameter is not recognized and will be ignored.

 

EMC9
Obsidian | Level 7

Thank you !

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
  • 9 replies
  • 1665 views
  • 4 likes
  • 5 in conversation