<?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 If Then Else funktioniert nicht richtig in New SAS User</title>
    <link>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/753776#M29911</link>
    <description>&lt;P&gt;Hallo liebes Forum,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ich habe folgendes Problem:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ich habe eine Makro-Variable "Monat" definiert, die die Werte 1-3 enthalten kann. Außerdem habe ich eine Datei, die Werte enthält.&lt;/P&gt;&lt;P&gt;Jetzt möchte ich, dass bestimmte Dinge passieren, je nachdem, welcher Wert der Variable Monat vorher zugewiesen wurde.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So wäre mein Vorgehen jetzt gewesen:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%let Monat = 3;&lt;/P&gt;&lt;P&gt;data work.test;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set work.test;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if &amp;amp;Monat = 1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Jan_multi=Jan*1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drop Jan;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else if &amp;amp;Monat = 2 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Jan_multi= Jan*1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Feb_multi= Feb*2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drop Jan Feb;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else if &amp;amp;Monat = 3 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Feb_multi= Feb*2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Mrz_multi= Mrz*3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;drop Jan Feb Mrz;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test=Jan;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Das Problem ist jetzt, dass der letzte Schritt, also die else do-Anweisung überflüssigerweise auch durchgeführt wird, obwohl ich oben ja nur die 3 angegeben habe. Also es wird auch eine Spalte test angelegt, die die Werte aus der Spalte Jan enthält, obwohl das nicht passieren sollte. Das macht in meinen Augen gar keinen Sinn... Woran liegt das denn, bzw. wie kann ich das verhindern?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Vielen Dank schon mal und freundliche Grüße&lt;/P&gt;</description>
    <pubDate>Tue, 13 Jul 2021 13:57:16 GMT</pubDate>
    <dc:creator>Hansi_12345</dc:creator>
    <dc:date>2021-07-13T13:57:16Z</dc:date>
    <item>
      <title>If Then Else funktioniert nicht richtig</title>
      <link>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/753776#M29911</link>
      <description>&lt;P&gt;Hallo liebes Forum,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ich habe folgendes Problem:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ich habe eine Makro-Variable "Monat" definiert, die die Werte 1-3 enthalten kann. Außerdem habe ich eine Datei, die Werte enthält.&lt;/P&gt;&lt;P&gt;Jetzt möchte ich, dass bestimmte Dinge passieren, je nachdem, welcher Wert der Variable Monat vorher zugewiesen wurde.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So wäre mein Vorgehen jetzt gewesen:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%let Monat = 3;&lt;/P&gt;&lt;P&gt;data work.test;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set work.test;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if &amp;amp;Monat = 1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Jan_multi=Jan*1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drop Jan;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else if &amp;amp;Monat = 2 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Jan_multi= Jan*1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Feb_multi= Feb*2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drop Jan Feb;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else if &amp;amp;Monat = 3 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Feb_multi= Feb*2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Mrz_multi= Mrz*3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;drop Jan Feb Mrz;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test=Jan;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Das Problem ist jetzt, dass der letzte Schritt, also die else do-Anweisung überflüssigerweise auch durchgeführt wird, obwohl ich oben ja nur die 3 angegeben habe. Also es wird auch eine Spalte test angelegt, die die Werte aus der Spalte Jan enthält, obwohl das nicht passieren sollte. Das macht in meinen Augen gar keinen Sinn... Woran liegt das denn, bzw. wie kann ich das verhindern?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Vielen Dank schon mal und freundliche Grüße&lt;/P&gt;</description>
      <pubDate>Tue, 13 Jul 2021 13:57:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/753776#M29911</guid>
      <dc:creator>Hansi_12345</dc:creator>
      <dc:date>2021-07-13T13:57:16Z</dc:date>
    </item>
    <item>
      <title>Re: If Then Else funktioniert nicht richtig</title>
      <link>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/753782#M29912</link>
      <description>&lt;P&gt;SAS scans the program for any variables it needs to create and creates them all at the start of the program. Run the program to see that Y, Z, and TEST are all created, but not always assigned:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data test;
input x @@;
datalines;
1 2 1 2 1 2 2 2
;

data A;
set test;
if x = 1 then
   y = 1;
else if x=2 then
   z = 2;
else 
   test = 3;
run;

proc print; run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Also, the DROP statement is global. It doesn't make sense to use it inside an IF-THEN/ELSE block.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 13 Jul 2021 14:28:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/753782#M29912</guid>
      <dc:creator>Rick_SAS</dc:creator>
      <dc:date>2021-07-13T14:28:57Z</dc:date>
    </item>
    <item>
      <title>Re: If Then Else funktioniert nicht richtig</title>
      <link>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/753903#M29925</link>
      <description>&lt;P&gt;Hallo&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/389307"&gt;@Hansi_12345&lt;/a&gt;&amp;nbsp;und willkommen in den SAS Support Communities,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;[Switching to English now, sorry! :-)]&amp;nbsp;If you want to create datasets of different structures (like having different sets of variables) depending on the value of a macro variable, you will need to use code generation techniques such as the SAS macro language.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Here is an example based on your code:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data work.have;
Jan=4; Feb=7; Mrz=13;
run;

%macro multi(Monat=, in=work.have, out=work.want);

  data &amp;amp;out;
  set &amp;amp;in;
  %if &amp;amp;Monat = 1 %then %do;
    Jan_multi=Jan*1;
    drop Jan;
  %end;
  %else %if &amp;amp;Monat = 2 %then %do;
    Jan_multi= Jan*1;
    Feb_multi= Feb*2;
    drop Jan Feb;
  %end;
  %else %if &amp;amp;Monat = 3 %then %do;
    Feb_multi= Feb*2;
    Mrz_multi= Mrz*3;
    drop Jan Feb Mrz;
  %end;
  %else test=Jan;;
  run;

%mend multi;

%multi(Monat=1, out=work.want1)
%multi(Monat=2, out=work.want2)
%multi(Monat=3, out=work.want3)
%multi(Monat=0, out=work.want0)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Each of the four macro calls (&lt;FONT face="courier new,courier"&gt;%multi(Monat=1, out=work.want1)&lt;/FONT&gt;, etc.) creates a new dataset from &lt;FONT face="courier new,courier"&gt;work.have&lt;/FONT&gt; and the four "&lt;FONT face="courier new,courier"&gt;want...&lt;/FONT&gt;" datasets have different structures.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/389307"&gt;@Hansi_12345&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Also es wird auch eine Spalte test angelegt, die die Werte aus der Spalte Jan enthält, obwohl das nicht passieren sollte.&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;If variable &lt;FONT face="courier new,courier"&gt;test&lt;/FONT&gt; is not contained in the input dataset (&lt;FONT face="courier new,courier"&gt;work.test&lt;/FONT&gt;) and the final ELSE branch is not executed (because macro variable &lt;FONT face="courier new,courier"&gt;Monat&lt;/FONT&gt; has one of the three values 1, 2 or 3), variable &lt;FONT face="courier new,courier"&gt;test&lt;/FONT&gt; will be created (as Rick has explained), but it will only contain &lt;EM&gt;missing values&lt;/EM&gt;. Most likely you were looking at a version of &lt;FONT face="courier new,courier"&gt;work.test&lt;/FONT&gt; that already contained variable &lt;FONT face="courier new,courier"&gt;test&lt;/FONT&gt; from a previous run of your data step with a different value of &lt;FONT face="courier new,courier"&gt;Monat&lt;/FONT&gt;. You should better avoid this pitfall by naming input and output datasets differently (as opposed to overwriting the input dataset with the output dataset), e.g.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;data test&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;1&lt;/STRONG&gt;&lt;/FONT&gt;;
set test;
...&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;PS: Do you know the nice subforum&amp;nbsp;&lt;A href="https://communities.sas.com/t5/CoDe-SAS-German/gh-p/code_sas_gh_0" target="_blank" rel="noopener"&gt;CoDe SAS&lt;/A&gt;? That's a great place for discussing SAS questions like yours in German.&lt;/P&gt;</description>
      <pubDate>Tue, 13 Jul 2021 19:40:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/753903#M29925</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2021-07-13T19:40:46Z</dc:date>
    </item>
    <item>
      <title>Re: If Then Else funktioniert nicht richtig</title>
      <link>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/754003#M29931</link>
      <description>&lt;P&gt;Ich würde den Makro noch massiv vereinfachen:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro mult(monat=,in=,out=);
%local monate i mm;
%let monate = JanFebMrzAprMaiJunJulAugSepOktNovDez;
data &amp;amp;out.;
set &amp;amp;in.;
%if &amp;amp;monat ge 1 and &amp;amp;monat. le 12
%then %do i = 1 %to &amp;amp;monat.;
  %let mm = %substr(&amp;amp;monate.,%eval((&amp;amp;i. - 1) * 3 + 1),3);
  &amp;amp;mm._multi = &amp;amp;mm. * &amp;amp;i.;
  drop &amp;amp;mm.;
%end;
%else %do;
  test = Jan;
%end;
run;
%mend;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 15 Jul 2021 06:56:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/754003#M29931</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2021-07-15T06:56:23Z</dc:date>
    </item>
    <item>
      <title>Re: If Then Else funktioniert nicht richtig</title>
      <link>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/754239#M29951</link>
      <description>Thanks a lot for all your advices. You helped me a lot.</description>
      <pubDate>Thu, 15 Jul 2021 06:45:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/If-Then-Else-funktioniert-nicht-richtig/m-p/754239#M29951</guid>
      <dc:creator>Hansi_12345</dc:creator>
      <dc:date>2021-07-15T06:45:02Z</dc:date>
    </item>
  </channel>
</rss>

