<?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: Using Let Statement in a Do Loop in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375397#M89995</link>
    <description>&lt;P&gt;You're making a fundamental mistake in the way that you treat macro language.&amp;nbsp; Macro language does not process your data.&amp;nbsp; Instead, it is supposed to generate SAS language statements.&amp;nbsp; Those are what process your data.&amp;nbsp; To give you an example, here is a rewrite of the beginning of your code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;%macro claims (maxnum);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; %local j;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; %let j = %eval(2 * &amp;amp;maxnum + 2);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; format claimcove1 - claimcove&amp;amp;j fmt_claimcover.;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; format homelosst1 - homelosst&amp;amp;j fmt_homelossty.;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; format amtpaidos1 - amtpaidos&amp;amp;j&amp;nbsp; best32.;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array claimcove {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array homelosst {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array propclaim {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array amtpaidos {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; do _i_ = 1 to &amp;amp;j;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; claimcove{_i_} = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; homelosst {_i_} = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propclaim{_i_} = 999;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You need to use macro language to generate SAS language statements, and to do that you need to have a firm idea of what the SAS statements should look like.&amp;nbsp; That part becomes a little cloudy in the second half of your macro.&lt;/P&gt;</description>
    <pubDate>Wed, 12 Jul 2017 16:03:58 GMT</pubDate>
    <dc:creator>Astounding</dc:creator>
    <dc:date>2017-07-12T16:03:58Z</dc:date>
    <item>
      <title>Using Let Statement in a Do Loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375390#M89991</link>
      <description>&lt;P&gt;Hi All,&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hopefully, someone can help me, I've been searching the forums all day for a solution...&lt;/P&gt;&lt;P&gt;I am trying to change a %LET variable within a maco's DO loop, using %eval. However i only want the %eval line to work under a certain condition, unfortunately, the %eval statement is always operating. I've tried to use %symput but I can't get that to work.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've&amp;nbsp;pasted an extract of code below. The issues is the variable j, which is used as an&amp;nbsp;index variable. Essentially i have two types variables: Building_Claim_Cause_0 and&amp;nbsp;Contents_Claim_Cause_0 &amp;nbsp; (both of which go up to 4, i.e&amp;nbsp;Contents_Claim_Cause_1,&amp;nbsp;Contents_Claim_Cause_2...)&lt;/P&gt;&lt;P&gt;I need to combine these two variables into one variable (HOMELOSSTx) where the buildings and contents claim variables. i.e if there is a value in&amp;nbsp;&lt;SPAN&gt;Building_Claim_Cause_0, then let HOMELOSST0 equal it, and if there is a value in Contents_Claim_Cause_0 &amp;nbsp;as well&amp;nbsp;let&amp;nbsp;HOMELOSST1 equal it. I am using j to as the index value for HOMELOSS&amp;nbsp;and k as the index value&amp;nbsp;between buildings and contents claims, and i&amp;nbsp;as the index value between 0 to 4 for the buildings/contents claims).&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%MACRO CLAIMS(MAXNUM);
	/*INTIALISE CLAIMS VARIABLES*/
	
	%LET i = 0;   	/*CYCLE THROUGH THE Specific_ItemX VARIABLE. IF THERE IS AN ITEM THEN SPECIFIED ITEM COVER HAS BEEN SELECTED*/
	%LET j = 0; 	/*CLAIM FOUND COUNT - WE ARE COLLAPSING THE BUILDING CLAIM VARIABLES AND CONTENTS CLAIM VARIABLES INTO ONE ONE CLAIM VARIABLE*/
	
	%DO %UNTIL (&amp;amp;i. = &amp;amp;MAXNUM.*2+2);	/*we have 5 potential bld or cnt claims. count starts at 0 hence maxnum is 4*/
		FORMAT CLAIMCOVE&amp;amp;i. FMT_CLAIMCOVER.;
		FORMAT HOMELOSST&amp;amp;i. FMT_HOMELOSSTY.;
		FORMAT HMELOSOTT&amp;amp;i. FMT_HMELOSOTTY.;
		FORMAT DATEOFLOS&amp;amp;i. DDMMYY8.;
		FORMAT PROPCLAIM&amp;amp;i. FMT_PROPCLAIMX.;
		FORMAT AMTPAIDOS&amp;amp;i 	best32.;

		CLAIMCOVE&amp;amp;i. = 0; 		/*Was it a contents or building incident?*/
		HOMELOSST&amp;amp;i. = 0; 		/*What type of incident was it?*/
		HMELOSOTT&amp;amp;i. = 0; 		/*Please specify:*/
		DATEOFLOS&amp;amp;i. = .; 		/*When did the incident occur?*/			 
		PROPCLAIM&amp;amp;i. = 999;	/*Did you make a claim?*/
		AMTPAIDOS&amp;amp;i. = .;		/*How much was paid out (or you have received so far) for this claim?*/

		%LET i = %eval(&amp;amp;i.+1);
	%END;
	
	%LET i = 0;/*reset counter*/
	
	%DO %UNTIL (&amp;amp;i. = &amp;amp;MAXNUM. +1);
		%LET k = 0;/*reset claim type counter (bld or cts)*/
		IF CLAIMLAST5 = 1 THEN DO;
			%DO k = 1 %TO 2;
			
				%IF &amp;amp;k. = 1 %THEN %DO; 
					
					%LET QZ_CLMType = 	Building_Claim_Cause_		;
					%LET QZ_CLMDate = 	Building_Claim_QuteDate_	;
					%LET QZ_CLMLoc	=	Building_Claim_Location_ 	;
					%LET QZ_CLMAmt	=	Building_Claim_Amount_ 		; 
				%END;
				%ELSE %DO;
					
					%LET QZ_CLMType = 	Contents_Claim_Cause_		;
					%LET QZ_CLMDate = 	Contents_Claim_QuteDate_	;
					%LET QZ_CLMLoc	=	Contents_Claim_Location_ 	;
					%LET QZ_CLMAmt	=	Contents_Claim_Amount_ 		;
				%END;
				
				SELECT (&amp;amp;QZ_CLMType.&amp;amp;i.);
					WHEN ("", "N") DO;
					END; /* DO NOTHING*/
					OTHERWISE DO;
						IF &amp;amp;k. = 1 THEN DO; 
							CLAIMCOVE&amp;amp;j. = 1; 		/*Was it a contents or building incident?*/
						END;
						ELSE DO;
							CLAIMCOVE&amp;amp;j. = 2; 		/*Was it a contents or building incident?*/
						END;
						
						SELECT (&amp;amp;QZ_CLMType.&amp;amp;i.);  
								
							WHEN ("Flood Damage") 			HOMELOSST&amp;amp;j. = 1; 	/*Flood*/
							OTHERWISE 						HOMELOSST&amp;amp;j. = 9; 												/*Other*/
						END;
						
						IF HOMELOSST&amp;amp;j. &amp;lt; 9 THEN HMELOSOTT&amp;amp;j. = 0;
						ELSE DO;
							SELECT (&amp;amp;QZ_CLMType.&amp;amp;i.);
								WHEN ("Additional Expenses") 	HMELOSOTT&amp;amp;j. = 1; 			/*Additional Expenses*/							
								OTHERWISE 						HMELOSOTT&amp;amp;j. = 99;
	
							END; /*HMELOSOTTY - CLAIM CAUSE CODES*/							
						END;  
						
						DATEOFLOS&amp;amp;j. = &amp;amp;QZ_CLMDate.&amp;amp;i.; 	/*When did the incident occur?*/			 
						SELECT (&amp;amp;QZ_CLMLoc.&amp;amp;i.);
							WHEN ("N") PROPCLAIM&amp;amp;j. = 3;
							WHEN ("Y") PROPCLAIM&amp;amp;j. = 1;
							OTHERWISE PROPCLAIM&amp;amp;j. 	= 99;
						END;											
						AMTPAIDOS&amp;amp;j. = &amp;amp;QZ_CLMAmt.&amp;amp;i.;		/*How much was paid out (or you have received so far) for this claim?*/
						%LET j = %eval(&amp;amp;j.+ 1);				/*This is the index value for claim variable we are using.*/
					END; /*OTHERWISE DO;*/
				END; /*SELECT (&amp;amp;QZ_CLMType.&amp;amp;i.);*/
																		
			%END; /*LOOP ACROSS Building_Claim_QuteDate_&amp;amp;i. and  AND Contents_Claim_Cause_&amp;amp;i.*/
																	
		END; /*IF CLAIMLAST5 = 1 THEN DO;*/
		%LET i = %eval(&amp;amp;i.+ 1);		
	%END;
%MEND; /*CLAIMS*/

data toto ;
set RAWDATA.QZDATA (KEEP = Had_Any_Building_Claims Had_Any_Contents_Claims
							Building_Claim:	Contents_Claim:
					/*OBS = 12*/);
	
/*Have you, or anyone living at your property had any incidents or made a home insurance claims in the last five years? (in this or another property)*/
	IF Had_Any_Building_Claims = "" OR Had_Any_Contents_Claims = "" THEN CLAIMLAST5 = 0;
	ELSE IF Had_Any_Building_Claims = "N" AND Had_Any_Contents_Claims = "N" THEN CLAIMLAST5 = 0;
	ELSE CLAIMLAST5 = 1;	
	
	%CLAIMS(MAXNUM = 4);  
RUN;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 12 Jul 2017 15:45:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375390#M89991</guid>
      <dc:creator>Squibbles</dc:creator>
      <dc:date>2017-07-12T15:45:39Z</dc:date>
    </item>
    <item>
      <title>Re: Using Let Statement in a Do Loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375394#M89993</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/153713"&gt;@Squibbles&lt;/a&gt; wrote:&lt;BR /&gt;
&lt;P&gt;Hi All,&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Essentially i have two types variables: Building_Claim_Cause_0 and&amp;nbsp;Contents_Claim_Cause_0 &amp;nbsp; (both of which go up to 4, i.e&amp;nbsp;Contents_Claim_Cause_1,&amp;nbsp;Contents_Claim_Cause_2...)&lt;/P&gt;
&lt;P&gt;I need to combine these two variables into one variable (HOMELOSSTx) where the buildings and contents claim variables. i.e if there is a value in&amp;nbsp;&lt;SPAN&gt;Building_Claim_Cause_0, then let HOMELOSST0 equal it, and if there is a value in Contents_Claim_Cause_0 &amp;nbsp;as well&amp;nbsp;let&amp;nbsp;HOMELOSST1 equal it. I am using j to as the index value for HOMELOSS&amp;nbsp;and k as the index value&amp;nbsp;between buildings and contents claims, and i&amp;nbsp;as the index value between 0 to 4 for the buildings/contents claims).&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;It may help to provide a little example data start and end. But it looks like a few arrays would handle this without any macro logic needed at all, at least for that look at pairs(?) of values and assign a third.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Jul 2017 16:00:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375394#M89993</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2017-07-12T16:00:02Z</dc:date>
    </item>
    <item>
      <title>Re: Using Let Statement in a Do Loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375397#M89995</link>
      <description>&lt;P&gt;You're making a fundamental mistake in the way that you treat macro language.&amp;nbsp; Macro language does not process your data.&amp;nbsp; Instead, it is supposed to generate SAS language statements.&amp;nbsp; Those are what process your data.&amp;nbsp; To give you an example, here is a rewrite of the beginning of your code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;%macro claims (maxnum);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; %local j;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; %let j = %eval(2 * &amp;amp;maxnum + 2);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; format claimcove1 - claimcove&amp;amp;j fmt_claimcover.;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; format homelosst1 - homelosst&amp;amp;j fmt_homelossty.;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; format amtpaidos1 - amtpaidos&amp;amp;j&amp;nbsp; best32.;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array claimcove {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array homelosst {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array propclaim {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; array amtpaidos {&amp;amp;j};&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; do _i_ = 1 to &amp;amp;j;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; claimcove{_i_} = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; homelosst {_i_} = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propclaim{_i_} = 999;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You need to use macro language to generate SAS language statements, and to do that you need to have a firm idea of what the SAS statements should look like.&amp;nbsp; That part becomes a little cloudy in the second half of your macro.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Jul 2017 16:03:58 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375397#M89995</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2017-07-12T16:03:58Z</dc:date>
    </item>
    <item>
      <title>Re: Using Let Statement in a Do Loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375690#M90103</link>
      <description>&lt;P&gt;ok thanks both.&amp;nbsp;&lt;/P&gt;&lt;P&gt;i'll look into arrays &amp;amp; rethink the structure.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 13 Jul 2017 13:59:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Using-Let-Statement-in-a-Do-Loop/m-p/375690#M90103</guid>
      <dc:creator>Squibbles</dc:creator>
      <dc:date>2017-07-13T13:59:55Z</dc:date>
    </item>
  </channel>
</rss>

