<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to use IF Then to end a loop in data step in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712598#M219737</link>
    <description>&lt;P&gt;It is not clear what you are trying to do.&lt;/P&gt;
&lt;P&gt;I guess you want:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro drug_ntdc(type,num,op);

	data ntdc_&amp;amp;type.&amp;amp;Num.d_wide1;
	 set ntdc_&amp;amp;type.&amp;amp;Num.d_wide ;
	    array ns {4} nodup_supd_0d nodup_supd_1d nodup_supd_2d nodup_supd_3d;
		array sp {4} supd_0d supd_1d supd_2d supd_3d; 
	    done2 = "no";
	    m=0;
	    do until (done2 = "yes" or m&amp;gt;3);
			ns(m)= sp(m);
			if ns(m) = 1 then done2='yes';
			m = m+1);
		end;
	run;
%mend;

%drug_ntdc(opioid,3,op=1);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But this is equal to:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro drug_ntdc(type,num,op);
	data ntdc_&amp;amp;type.&amp;amp;Num.d_wide1;
	 set ntdc_&amp;amp;type.&amp;amp;Num.d_wide ;
		nodup_supd_0d = supd_0d;
		nodup_supd_1d = supd_1d;
	run;
%mend;
%drug_ntdc(opioid,3,op=1);
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Is that what you want ?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 20 Jan 2021 07:08:15 GMT</pubDate>
    <dc:creator>Shmuel</dc:creator>
    <dc:date>2021-01-20T07:08:15Z</dc:date>
    <item>
      <title>How to use IF Then to end a loop in data step</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712593#M219732</link>
      <description>&lt;P&gt;I tried to create new variables called nodup_supd_&amp;amp;m.d&amp;nbsp;when&amp;nbsp;ntdc_&amp;amp;m.d=0 (m could be 0,1,2,3). I used a do-loop which should have stopped once ntdc_&amp;amp;m.d changed to 1. However, it did not stop when&amp;nbsp;ntdc_&amp;amp;m.d=1. It completed the loop until&amp;nbsp;&amp;amp;m&amp;gt;3. It seems neglect the condition of&amp;nbsp;"&amp;amp;done2" = "yes". Could someone help fix it? Thanks!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%macro drug_ntdc(type,num,op);&lt;/P&gt;&lt;P&gt;data ntdc_&amp;amp;type.&amp;amp;Num.d_wide1;&lt;BR /&gt;set ntdc_&amp;amp;type.&amp;amp;Num.d_wide ;&lt;BR /&gt;%let done2=no;&lt;BR /&gt;%let m=0;&lt;BR /&gt;%do %until (("&amp;amp;done2" = "yes") or (&amp;amp;m&amp;gt;3));&lt;BR /&gt;nodup_supd_&amp;amp;m.d= supd_&amp;amp;m.d;&lt;BR /&gt;/*this step did not work*/&lt;BR /&gt;if ntdc_&amp;amp;m.d=1 then call symput('done2','yes');&lt;/P&gt;&lt;P&gt;%let m = %eval(&amp;amp;m+1);&lt;BR /&gt;%end;&lt;BR /&gt;run;&lt;BR /&gt;%mend;&lt;/P&gt;&lt;P&gt;%drug_ntdc(opioid,3,op=1);&lt;/P&gt;</description>
      <pubDate>Wed, 20 Jan 2021 06:20:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712593#M219732</guid>
      <dc:creator>xuelingshu1047</dc:creator>
      <dc:date>2021-01-20T06:20:46Z</dc:date>
    </item>
    <item>
      <title>Re: How to use IF Then to end a loop in data step</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712595#M219734</link>
      <description>&lt;P&gt;The SAS macro language is a text generator. Macro statements are executed before Data Step Statements. So the timing is off here. In the snippet below, you have a condition in your %do %until macro statement that is based on &amp;amp;done2. You try to manipulate the value of &amp;amp;done2. during data step execution and use that value in a macro statement that has already run through the macro processor.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Try expressing your problem in terms of data step code only. Then we can see what you're actually trying to do and help you from there &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;   %do %until (("&amp;amp;done2" = "yes") or (&amp;amp;m&amp;gt;3));
      nodup_supd_&amp;amp;m.d= supd_&amp;amp;m.d;
      if ntdc_&amp;amp;m.d=1 then call symput('done2','yes');
      %let m = %eval(&amp;amp;m+1);
   %end;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 20 Jan 2021 06:48:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712595#M219734</guid>
      <dc:creator>PeterClemmensen</dc:creator>
      <dc:date>2021-01-20T06:48:33Z</dc:date>
    </item>
    <item>
      <title>Re: How to use IF Then to end a loop in data step</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712598#M219737</link>
      <description>&lt;P&gt;It is not clear what you are trying to do.&lt;/P&gt;
&lt;P&gt;I guess you want:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro drug_ntdc(type,num,op);

	data ntdc_&amp;amp;type.&amp;amp;Num.d_wide1;
	 set ntdc_&amp;amp;type.&amp;amp;Num.d_wide ;
	    array ns {4} nodup_supd_0d nodup_supd_1d nodup_supd_2d nodup_supd_3d;
		array sp {4} supd_0d supd_1d supd_2d supd_3d; 
	    done2 = "no";
	    m=0;
	    do until (done2 = "yes" or m&amp;gt;3);
			ns(m)= sp(m);
			if ns(m) = 1 then done2='yes';
			m = m+1);
		end;
	run;
%mend;

%drug_ntdc(opioid,3,op=1);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But this is equal to:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro drug_ntdc(type,num,op);
	data ntdc_&amp;amp;type.&amp;amp;Num.d_wide1;
	 set ntdc_&amp;amp;type.&amp;amp;Num.d_wide ;
		nodup_supd_0d = supd_0d;
		nodup_supd_1d = supd_1d;
	run;
%mend;
%drug_ntdc(opioid,3,op=1);
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Is that what you want ?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 20 Jan 2021 07:08:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712598#M219737</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2021-01-20T07:08:15Z</dc:date>
    </item>
    <item>
      <title>Re: How to use IF Then to end a loop in data step</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712748#M219805</link>
      <description>&lt;P&gt;Thanks for your response. I am sorry I didn't express my problem clearly. Here I tried to express in a simple way. Whether the value of &lt;STRONG&gt;supd_0d&lt;/STRONG&gt; will be copied to &lt;STRONG&gt;nodup_supd_0d&lt;/STRONG&gt; depends on if &lt;STRONG&gt;ntdc_0d&lt;/STRONG&gt; equals to 0; once &lt;STRONG&gt;ntdc_xd&lt;/STRONG&gt;&amp;nbsp;changes to 1, the process of coping will stop and leave the rest variables called&amp;nbsp;&lt;STRONG&gt;nodup_supd_xd&amp;nbsp;&lt;/STRONG&gt;blank. I would like to use macro since I have to repeat this process for several variables, not only &lt;STRONG&gt;supd_xd&lt;/STRONG&gt; and &lt;STRONG&gt;nodup_supd_xd&lt;/STRONG&gt;&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;supd_0d&lt;/TD&gt;&lt;TD&gt;supd_1d&lt;/TD&gt;&lt;TD&gt;supd_2d&lt;/TD&gt;&lt;TD&gt;nodup_supd_0d&lt;/TD&gt;&lt;TD&gt;nodup_supd_1d&lt;/TD&gt;&lt;TD&gt;nodup_supd_2d&lt;/TD&gt;&lt;TD&gt;ntdc_0d&lt;/TD&gt;&lt;TD&gt;ntdc_1d&lt;/TD&gt;&lt;TD&gt;ntdc_2d&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;data wide1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;set wide;&lt;/P&gt;&lt;P&gt;&amp;nbsp;array ns{4}&amp;nbsp;nodup_supd_0d nodup_supd_1d nodup_supd_2d nodup_supd_3d;&lt;/P&gt;&lt;P&gt;&amp;nbsp;array sp {4} supd_0d supd_1d supd_2d supd_3d;&lt;/P&gt;&lt;P&gt;&amp;nbsp;array&amp;nbsp; ntdc {4} ntdc_0d ntdc_1d ntdc_2d ntdc_3d;&lt;/P&gt;&lt;P&gt;&amp;nbsp; done2 = "no";&lt;BR /&gt;&amp;nbsp; m=0;&lt;BR /&gt;&amp;nbsp; do until (done2 = "yes" or m&amp;gt;3);&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ns(m)= sp(m);&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if ntdc(m) = 1 then done2='yes';&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; m = m+1;&lt;BR /&gt;&amp;nbsp; end;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 20 Jan 2021 15:45:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712748#M219805</guid>
      <dc:creator>xuelingshu1047</dc:creator>
      <dc:date>2021-01-20T15:45:26Z</dc:date>
    </item>
    <item>
      <title>Re: How to use IF Then to end a loop in data step</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712755#M219807</link>
      <description>&lt;P&gt;You don't have to manually increment the loop counter, let the DO loop do that.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;  do m=1 to dim(sp) until (ntdc[m] = 1);
      ns[m]= sp[m];
  end;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 20 Jan 2021 15:59:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712755#M219807</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2021-01-20T15:59:56Z</dc:date>
    </item>
    <item>
      <title>Re: How to use IF Then to end a loop in data step</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712794#M219820</link>
      <description>&lt;P&gt;Alternative loop would be:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;do m=0 to dim(ns);
    if ntdc(m) ne 1 then ns(m) = sp(m);
    else leave;
end;;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 20 Jan 2021 17:10:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-use-IF-Then-to-end-a-loop-in-data-step/m-p/712794#M219820</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2021-01-20T17:10:55Z</dc:date>
    </item>
  </channel>
</rss>

