DATA Step, Macro, Functions and more

Unexplained unclosed DO block

Reply
Contributor
Posts: 59

Unexplained unclosed DO block

data decision3;

  set decision2a;

  by ln_no;

***Streamline***;

    if template_NM IN ('STR1','STR2') then do;

     if DEN_REASON_CD in ('DI','II','PM','NH','TI','NV','BR','IN','ID','IM','ER') then denial_count = 0.50;

    if trial_count = 1 then do; trial = 0.50; approval = 0.50; total = 0.50; final = 0.50; denial = 0.50; end;

     if final_count > 0 then do; final = 0.50; approval = 0.50; total = 0.50; trial = 0; denial = 0.50; end;

     if denial_count = 1 then do; denial = 0.50; approval = 0.50; total = 0.50; trial = 0.50; final = 0.50; end;

  end;

  else do;

  

***Not Streamline***;

  if template not IN ('STR1','STR2') then do;

  if  LM_REFERRAL_CD in ('TD3','4BN') then do;

    if DEN_REASON_CD in ('DI','II','PM','NH','TI','NV','BR','IN','ID','IM','ER') then denial_count = 1;

    if trial_count = 1 then do; trial = 0.25; approval = 0.25; total = 0.25; final = 0; denial = 0; end;

     if final_count > 0 then do; final = 0.25; approval = 0.25; total = 0.25; trial = 0; denial = 0; end;

     if denial_count = 1 then do; denial = 0.25; approval = 0; total = 0.25; trial = 0; final = 0; end;

  end;

  else do;

    if trial_count = 1 then do; trial = 1; approval = 1; total = 1; final = 0; denial = 0; end;

    if final_count > 0 then do; final = final_count; approval = final; total = final_count; trial = 0; denial = 0; end;

    if denial_count = 1 then do; denial = 1; approval = 0; total = 1; trial = 0; final = 0; end;

  end;

  if approval > 0 then LM_DEN_REASON_CD = ' ';

  PROC_STRING = strip(put(LM_REFERRAL_CD,$amname.)) || " - " || strip(LM_REFERRAL_CD);

  drop trial_count final_count denial_count; end;

run;

proc sort data=decision3;

  by LM_REFERRAL_CD ln_no;

run;

By chance do you see anything wrong with the code.  I keep getting error below. It appears I have my do; and end; accounted for but it shows the error after run; twice yet in my code I show run; once.

485       

486          drop trial_count final_count denial_count;end;

487       

488        run;

488        run;

              _

              117

ERROR 117-185: There was 1 unclosed DO block.

It looks like the problem occurs toward the end of the program.  The code only shows run; once but shows it twice in the error message

Super User
Super User
Posts: 6,500

Re: Unexplained unclosed DO block

If you fix the indentation it will be obvious, see updated code below.

It looks like these two DO statements are missing END statements.

else do;

  ***Not Streamline***;

  if template not IN ('STR1','STR2') then do;


Actually just one of them are missing ENDs as there is an END; statement on the end of the line with the DROP statement.

data decision3;

  set decision2a;

  by ln_no;

  if template_NM IN ('STR1','STR2') then do;

    ***Streamline***;

    if DEN_REASON_CD in ('DI','II','PM','NH','TI','NV','BR','IN','ID','IM','ER') then denial_count = 0.50;

    if trial_count = 1 then do;

      trial = 0.50; approval = 0.50; total = 0.50; final = 0.50; denial = 0.50;

    end;

    if final_count > 0 then do;

      final = 0.50; approval = 0.50; total = 0.50; trial = 0; denial = 0.50;

    end;

    if denial_count = 1 then do;

      denial = 0.50; approval = 0.50; total = 0.50; trial = 0.50; final = 0.50;

    end;

  end;

  else do;

    ***Not Streamline***;

    if template not IN ('STR1','STR2') then do;

      if  LM_REFERRAL_CD in ('TD3','4BN') then do;

        if DEN_REASON_CD in ('DI','II','PM','NH','TI','NV','BR','IN','ID','IM','ER') then denial_count = 1;

        if trial_count = 1 then do;

          trial = 0.25; approval = 0.25; total = 0.25; final = 0; denial = 0;

        end;

        if final_count > 0 then do;

          final = 0.25; approval = 0.25; total = 0.25; trial = 0; denial = 0;

        end;

        if denial_count = 1 then do;

          denial = 0.25; approval = 0; total = 0.25; trial = 0; final = 0;

        end;

      end;

      else do;

        if trial_count = 1 then do;

          trial = 1; approval = 1; total = 1; final = 0; denial = 0;

        end;

        if final_count > 0 then do;

          final = final_count; approval = final; total = final_count; trial = 0; denial = 0;

        end;

        if denial_count = 1 then do;

          denial = 1; approval = 0; total = 1; trial = 0; final = 0;

        end;

      end;

      if approval > 0 then LM_DEN_REASON_CD = ' ';

      PROC_STRING = strip(put(LM_REFERRAL_CD,$amname.)) || " - " || strip(LM_REFERRAL_CD);

    end;

  end;

  drop trial_count final_count denial_count;

run;

Contributor
Posts: 59

Re: Unexplained unclosed DO block

Thanks

Valued Guide
Posts: 2,175

Re: Unexplained unclosed DO block

a useful keyboard combination will help you with this DO-block problem:

within the do-block, press alt+(

in fact any bracket-type key ( ( ) { } [] ) would do

repeated presses move the cursor between beginning and end of the block

Contributor
Posts: 59

Re: Unexplained unclosed DO block

O wow. I knew you could do that with () but I did not know you accomplish the same thing with your do end statments. Thanks I will try it

Trusted Advisor
Posts: 2,113

Re: Unexplained unclosed DO block

Tom found your missing end; statement (though not analyzing the logic as to where to put it).

An easy way to see this is if you have access to EGuide 5.1.  Paste the code into a program task, it <ctrl>+I and it will reformat the code.  At that point the missing end; is obvious.

The "run;" statement appearing twice is just an artifact of how SAS reports errors.  Note that the same line number is on each "run;" so it is the same statement.

Ask a Question
Discussion stats
  • 5 replies
  • 4135 views
  • 2 likes
  • 4 in conversation