<?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>Tom Tracker</title>
    <link>https://communities.sas.com/kntur85557/tracker</link>
    <description>Tom Tracker</description>
    <pubDate>Thu, 24 Sep 2026 02:15:47 GMT</pubDate>
    <dc:date>2026-09-24T02:15:47Z</dc:date>
    <item>
      <title>Re: Does hash join not honor the memsize limitation?</title>
      <link>https://communities.sas.com/t5/Administration-and-Deployment/Does-hash-join-not-honor-the-memsize-limitation/m-p/993732#M30906</link>
      <description>&lt;P&gt;That does not look like valid syntax for invoking SAS from the command line.&lt;/P&gt;
&lt;P&gt;You have two filenames specified after the -sysin option.&lt;/P&gt;
&lt;P&gt;SInce the second filename ends in .cfg perhaps you forget to include the -config option?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Are you sure your hash object will actually fit in 8G?&lt;/P&gt;</description>
      <pubDate>Wed, 16 Sep 2026 19:40:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Administration-and-Deployment/Does-hash-join-not-honor-the-memsize-limitation/m-p/993732#M30906</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-16T19:40:21Z</dc:date>
    </item>
    <item>
      <title>Re: ReWriting a CSV to remove end of file reference</title>
      <link>https://communities.sas.com/t5/SAS-Programming/ReWriting-a-CSV-to-remove-end-of-file-reference/m-p/993698#M380501</link>
      <description>&lt;P&gt;I assume you meant END OF LINE and not END OF FILE.&amp;nbsp; If you really meant END OF FILE then look at the IGNOREDOSEOF option of the INFILE statement.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Simple answer is to just use an existing program instead.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/sasutils/macros/blob/master/replace_crlf.sas" target="_blank" rel="noopener"&gt;https://github.com/sasutils/macros/blob/master/replace_crlf.sas&lt;/A&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let repA=' ';
%let repD=' ';
%let dsnnme="\\path\export.csv";
%let dsnnme1="\\path\export2.csv";
%replace_crlf
(infile=&amp;amp;dsnnme   /* Fileref or quoted physical name of input file */
,outfile=&amp;amp;dsnnme1  /* Fileref or quoted physical name of output file */
,cr=&amp;amp;repD /* Replacement string for carriage return */
,lf=&amp;amp;repA  /* Replacement string for linefeed */
);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The reason your program did not work is because you only wrote the replacement characters.&amp;nbsp; Add an ELSE statement so that other values of A are written.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;if open and (a='0D'x) then put &amp;amp;repD;
else if open and (a='0A'x) then put &amp;amp;repA;
else put a $char1. ;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 16 Sep 2026 01:51:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/ReWriting-a-CSV-to-remove-end-of-file-reference/m-p/993698#M380501</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-16T01:51:54Z</dc:date>
    </item>
    <item>
      <title>Re: Column shift due to unbalanced quotes</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Column-shift-due-to-unbalanced-quotes/m-p/993551#M380499</link>
      <description>&lt;P&gt;It is hard to write a program for all possible invalidly formatted delimited files.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For ones what are just clearly messed up the details of how they are messed up matter. For example why are the quotes unbalanced?&amp;nbsp; Did they not add quotes around the values that contain quotes?&amp;nbsp; Did they not double up the embedded quotes so that they could be distinguished from the quotes that surround a value?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But there are a number of delimited files that are well defined, but just don't follow SAS's rules.&amp;nbsp; For those if you can recognize them you can adjust for them.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For example SAS does not support end-of-line indicators that are embedded inside a value, even if the value is quoted.&amp;nbsp; For those you need to pre-process the file to remove/replace the end-of-line indicators.&amp;nbsp; Here is a macro that does that.&amp;nbsp; &amp;nbsp;&lt;A href="https://github.com/sasutils/macros/blob/master/replace_crlf.sas" target="_self"&gt;%replace_crlf()&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It works by counted the number of quotes to tell whether the end of line characters (carriage return or linefeed) appear inside quotes and then replaces those characters.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also SAS does not handle files that use an escape character (typically a backslash) to allow delimiters or quotes inside values.&amp;nbsp; If such values already have quotes around them then you can just replace them.&amp;nbsp; So replace \" with "" and \, with , and then SAS will be able to parse the file properly.&amp;nbsp; If there are not quotes around the values then replace the \" and \, with some other strings that do not appear in your file.&amp;nbsp; You can then read the resulting file normally.&amp;nbsp; Just remember to convert your replacement strings back to the intended value.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For more specific help with your file post examples of the lines that are poorly formed.&lt;/P&gt;</description>
      <pubDate>Sat, 12 Sep 2026 20:35:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Column-shift-due-to-unbalanced-quotes/m-p/993551#M380499</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-12T20:35:49Z</dc:date>
    </item>
    <item>
      <title>Re: Column shift due to unbalanced quotes</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Column-shift-due-to-unbalanced-quotes/m-p/993545#M380497</link>
      <description>&lt;P&gt;The SAS data step has many features to help you debug this type of file.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can use the LIST statement to dump the lines from the file to the SAS log so you can SEE what you are dealing with.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can reference the _INFILE_ automatic variable to allow you to run test against the current line (assuming the lines are less than 32K bytes long).&amp;nbsp; So you could for example use the COUNTW() function to see how many values are on a given line and make sure that each line has the same number of values.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;One simple idea to start with would be to use this &lt;A href="https://github.com/sasutils/macros/blob/master/csv2ds.sas" target="_self"&gt;%CSV2DS()&lt;/A&gt; macro which has a number of enhancements over the defaults of PROC IMPORT. (See this thread&amp;nbsp;&lt;A href="https://communities.sas.com/t5/SAS-Programming/Reading-delimited-text-files/m-p/775298" target="_blank" rel="noopener"&gt;https://communities.sas.com/t5/SAS-Programming/Reading-delimited-text-files/m-p/775298&lt;/A&gt;&amp;nbsp;)&amp;nbsp; One of the things that macro will do is setup a view that has each value as a separate observation.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data _values_(keep=row varnum length short) / view=_values_;
...&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;It uses this to gather the statistics it uses to base its guesses about how to read the variable in and whether to attach a format.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;One enhancement that I asked SAS for years (perhaps decades) ago is support for Unix style escape characters in delimited files.&amp;nbsp; They never did anything about it but now that new versions of SAS allow you to use PROC PYTHON you could probably call some python delimited file testing program from within SAS.&lt;/P&gt;</description>
      <pubDate>Sat, 12 Sep 2026 03:14:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Column-shift-due-to-unbalanced-quotes/m-p/993545#M380497</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-12T03:14:36Z</dc:date>
    </item>
    <item>
      <title>Re: SAS Macros: Error Handling Best Practices</title>
      <link>https://communities.sas.com/t5/SAS-Communities-Library/SAS-Macros-Error-Handling-Best-Practices/tac-p/993371#M12310</link>
      <description>&lt;P&gt;Parameter validation is an important tool for making macros that are easy to use and also easy to create.&amp;nbsp; The late Tom Hoffman created an excellent utility macro for implementing this idea over 30 years ago named %PARMV.&amp;nbsp; You can find an updated version of the macro on github at&amp;nbsp;&lt;A href="https://github.com/sasutils/macros/blob/master/parmv.sas" target="_blank" rel="noopener"&gt;https://github.com/sasutils/macros/blob/master/parmv.sas.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Using this macro will insure that your error messages are consistently styled and also make it easy to implement common parameter checking features such as automatic case conversion, valid value checking, default values, etc.&amp;nbsp; You can read the source code of the %PARMV() macro to see what else it can, including in the comment block some simple examples.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In your example you will want to use the _VAL= parameter of %PARMV() to pass in the list of valid values.&amp;nbsp; You will also want to use _DEF= parameter to pass in the fact that ALL should be the default value.&amp;nbsp; And leave the _CASE= parameter at its default setting (U for uppercase).&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%parmv(origin_filter,_val=all usa asia europe,_def=all)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;So using this macro your example program can be reduced to this much simpler definition.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro origin_chart
/*-----------------------------------------------------------------------
Generate a bar chart of car counts by Type from sashelp.cars
-----------------------------------------------------------------------*/
(origin /* optional filter to a single Origin value */
);

/*-----------------------------------------------------------------------
Generate a bar chart of car counts by Type from sashelp.cars

Example calls:;
%origin_chart(all)
%origin_chart(usa)
%origin_chart(europe)
-----------------------------------------------------------------------*/
%local parmerr ;
%parmv(origin,_val=all usa asia europe,_def=all)
%if (not &amp;amp;parmerr) %then %do;

title "Number of Cars by Type for &amp;amp;origin (Ordered by Descending Frequency)";            
proc sgplot data=sashelp.cars;
%if ALL ne &amp;amp;origin %then %do;
  where upcase(Origin)="&amp;amp;origin";
%end;
  vbar Type /
      stat=freq
      categoryorder=respdesc
      group=Type
      groupdisplay=cluster
      datalabel
      nooutline
  ;
run;
title;

%end;
%mend origin_chart;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Example log:&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-09-09 at 9.45.26 PM.png" style="width: 999px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/117695i6C5DC9E2596CF6EB/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2026-09-09 at 9.45.26 PM.png" alt="Screenshot 2026-09-09 at 9.45.26 PM.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There is another key feature of parameter checking that you did not get to that %PARMV() can help with.&amp;nbsp; In a complex macro that might have multiple parameters the user might have provided more than one invalid parameter value.&amp;nbsp; It is extremely frustrating to have to fix your typos or mistakes one at a time.&amp;nbsp; By using the PARMERR flag variable %PARMV() will allow the coder of the macro to implement checks for all of the parameters and report all of the mistakes on the first call.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 02:06:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Communities-Library/SAS-Macros-Error-Handling-Best-Practices/tac-p/993371#M12310</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-10T02:06:10Z</dc:date>
    </item>
    <item>
      <title>Re: Hyperlinks within text string - Export to Excel</title>
      <link>https://communities.sas.com/t5/ODS-and-Base-Reporting/Hyperlinks-within-text-string-Export-to-Excel/m-p/993325#M26989</link>
      <description>&lt;P&gt;Are you sure that is the code you ran?&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;line @1 'deadline ^{style [url="&amp;amp;ct_link" linkcolor=white]via
 the ^{style [color=blue textdecoration=underline]cost transfer form}
 available on the G&amp;amp;C webpage.} ';&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Because the use of single quotes around the string will prevent the macro processor from replacing the reference to the CT_LINK macro variable with its value.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Try using double quotes instead.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;line @1 "deadline ^{style [url='&amp;amp;ct_link' linkcolor=white]via
 the ^{style [color=blue textdecoration=underline]cost transfer form}
 available on the G&amp;amp;C webpage.} ";&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;It will also prevent the macro processor from replacing the reference to the C macro variable with its value.&amp;nbsp; But you did not provide a value for that one.&lt;/P&gt;</description>
      <pubDate>Wed, 09 Sep 2026 16:00:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/ODS-and-Base-Reporting/Hyperlinks-within-text-string-Export-to-Excel/m-p/993325#M26989</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-09T16:00:37Z</dc:date>
    </item>
    <item>
      <title>Re: How do I catch up when I am so horribly behind?</title>
      <link>https://communities.sas.com/t5/New-SAS-User/How-do-I-catch-up-when-I-am-so-horribly-behind/m-p/993126#M44027</link>
      <description>&lt;P&gt;Notice in your corrected code that MyHeart is only one word in the SET statement. So you are only trying to read from a single dataset in this step.&amp;nbsp; But since you did not specify a libref it will look for it in the WORK library.&amp;nbsp; &amp;nbsp;Since the WORK library is generally deleted when your session ends you will need another data step that creates MYHEART before you can run this step.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you had created a MYHEART dataset before then the three steps you have posted so far will run without error.&amp;nbsp; But if you try to run them again in the new SAS session the second and third will fail since the MYHEART dataset will not exist, only the MY and HEART datasets that your first data step with the typo created.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Most often a libref will point to a single file folder and most often the name used for the libref will be the same as the name of the terminal folder in the file path that it points to, but that is not always the case.&amp;nbsp; So the SASUSER libref that SAS creates when your SAS session starts normally does point to a folder named sasuser in your home directory.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are using SAS/Studio as your user interface remember that although the libraries that a libref points to might look like a file folder in the GUI.&amp;nbsp; So make sure you are in the right place in the user interface for the type of action you are trying to take.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Saving a file, such as your program or some raw data file, is different than saving a dataset. (Even though the dataset will end up as a file with the extension of .sas7bdat).&amp;nbsp; Normally to save a dataset you need to run CODE.&amp;nbsp; But to save a file you can usually use the tools of the editor you are using.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are using SAS/Studio to edit and submit your code the file save interface does take a little getting used to.&amp;nbsp; &amp;nbsp;Back sure to click on the folder where you want the file written.&lt;/P&gt;</description>
      <pubDate>Sat, 05 Sep 2026 16:46:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/How-do-I-catch-up-when-I-am-so-horribly-behind/m-p/993126#M44027</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-05T16:46:41Z</dc:date>
    </item>
    <item>
      <title>Re: How do I catch up when I am so horribly behind?</title>
      <link>https://communities.sas.com/t5/New-SAS-User/How-do-I-catch-up-when-I-am-so-horribly-behind/m-p/993116#M44020</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/482840"&gt;@Amber5&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;I was able to find a file and create a data step:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data my heart;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;set sashelp.heart;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;run;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It did do something. It is just unbelievable that chunks of knowledge just fly out of my head, even when I hand write the codes in a notebook so I can remember what I did in my last assignment. Still lost in the woods, but it's like I at least found where I was a day or so ago.&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;What is your actual assignment?&lt;/P&gt;
&lt;P&gt;Your data step will create TWO output datasets.&amp;nbsp; Both of which will be copies of the input dataset named SASHELP.HEART.&amp;nbsp; That is because you include two dataset names in the DATA statement.&amp;nbsp; One was MY and the other was HEART,&amp;nbsp; Since neither included a libref they will normally be created in the WORK library.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note:&amp;nbsp; It is completely normal for data steps to be different. Then only reason they would be exactly the same would be if you wanted them to do the exact same thing.&amp;nbsp; That is generally true for any programming language.&amp;nbsp; What you need to learn is what the statements do and how the syntax works so that you know what to change to make the data step do what you want for your new situation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 05 Sep 2026 02:47:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/How-do-I-catch-up-when-I-am-so-horribly-behind/m-p/993116#M44020</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-05T02:47:26Z</dc:date>
    </item>
    <item>
      <title>Re: z/OS IDCAMS DCOLLECT OUTPUT: multi-line input record with varying length, input using derived po</title>
      <link>https://communities.sas.com/t5/SAS-Programming/z-OS-IDCAMS-DCOLLECT-OUTPUT-multi-line-input-record-with-varying/m-p/993115#M380478</link>
      <description>&lt;P&gt;I don't understand what your input is as the phrase "&lt;SPAN&gt;an IDCAMS DCOLLECT run" does not mean anything to me.&amp;nbsp; The text files you attached both appear to be SAS listing outputs.&amp;nbsp; Are you trying to write a data step to read back in a SAS listing output file?&amp;nbsp; If not then please share the an example INPUT file.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 05 Sep 2026 02:35:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/z-OS-IDCAMS-DCOLLECT-OUTPUT-multi-line-input-record-with-varying/m-p/993115#M380478</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-05T02:35:22Z</dc:date>
    </item>
    <item>
      <title>Re: How to pass macro parameter with "," ?! Is possible?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-pass-macro-parameter-with-quot-quot-Is-possible/m-p/993089#M380473</link>
      <description>&lt;P&gt;You could use macro quoting functions.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%m_test(grps=%nrstr(&amp;amp;grps),grps_note=&amp;amp;grps_note.);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But in your case it is not needed because SAS does not care if you use commas or spaces between the items listed inside the IN() operator.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let grps=2 3;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 04 Sep 2026 14:00:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-pass-macro-parameter-with-quot-quot-Is-possible/m-p/993089#M380473</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-04T14:00:16Z</dc:date>
    </item>
    <item>
      <title>Re: Remove decimal points in PROC FREQ cross tab</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Remove-decimal-points-in-PROC-FREQ-cross-tab/m-p/992994#M380465</link>
      <description>&lt;P&gt;Is PROC FREQ even what you want to use for this?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I am not sure I understand what you are trying to do.&amp;nbsp; Especially since you did not provide any actual data.&amp;nbsp; &amp;nbsp;Based on the column percents and totals you provided it looks your data looks like this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have ;
  input var1 :$1. @;
  do var2='One','Two';
    input count @;
    output;
  end;
cards;    
A 54 19
B 36  8
C 18  0
D 5   1
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Why do you want to print the column percentages without the decimal places?&lt;/P&gt;
&lt;P&gt;Why do you want to print the column percentages and the raw totals in the same column of your report?&lt;/P&gt;</description>
      <pubDate>Wed, 02 Sep 2026 19:18:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Remove-decimal-points-in-PROC-FREQ-cross-tab/m-p/992994#M380465</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-02T19:18:24Z</dc:date>
    </item>
    <item>
      <title>Re: Certain keys not recognized in SAS on Mac via VMware</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Certain-keys-not-recognized-in-SAS-on-Mac-via-VMware/m-p/992846#M44015</link>
      <description>&lt;P&gt;Explain how they are not working?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Remember that Mac keyboards do not have the equivalent of the PC delete key (delete the current character).&amp;nbsp; The key marked delete on a Mac works like the backspace key on the PC keyboard (delete the previous character).&lt;/P&gt;</description>
      <pubDate>Tue, 01 Sep 2026 01:31:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Certain-keys-not-recognized-in-SAS-on-Mac-via-VMware/m-p/992846#M44015</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-09-01T01:31:24Z</dc:date>
    </item>
    <item>
      <title>Re: How to make the macro [works on column] to work on column with BY GROUP?!</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-make-the-macro-works-on-column-to-work-on-column-with-BY/m-p/992768#M380456</link>
      <description>&lt;P&gt;I am not sure I follow what exactly the question is.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Are you asking how to extend the steps in your macro to allow you to process all three Y variables in one pass?&amp;nbsp; So your macro call might look like:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%m_concaveness(data=_concave_, x=x, y=y1 y2 y3, out=_out);
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If so then add some macro logic that will add the extra statements to allow each step to handle multiple Y variables. So for example adding more assignment statements to the first data step, and more selected columns to SQL select statements.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Or are you asking how to extend the macro so that you can pass in a grouping variable?&lt;/P&gt;
&lt;P&gt;So your macro calls might look like:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%m_concaveness(data=_concave_,group=p,x=x, y=y1, out=_out_y1);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If so then add proper BY groups into the steps in the macro.&lt;/P&gt;
&lt;P&gt;So something like:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro m_concaveness(data=,group=,x=, y=, out=);
    proc sort data=&amp;amp;data;
        by &amp;amp;group &amp;amp;x;
    run;

    data _temp_concave;
        set &amp;amp;data;   
        by &amp;amp;group;   
         lag_y = lag(&amp;amp;y);
         dy = dif(&amp;amp;y);
         if first.&amp;amp;group then call missing(lag_y,dy); 
     run;

    data _prep;
        merge &amp;amp;data (rename=(&amp;amp;y=_y_prev &amp;amp;x=_x_prev))
              &amp;amp;data
              &amp;amp;data (firstobs=2 rename=(&amp;amp;y=_y_next &amp;amp;x=_x_next))
        ;
        by &amp;amp;group ;
     run;

    proc sql noprint;
        create table _second_diff as
        select a.group
            ,a.&amp;amp;x as x_val
            ,a.&amp;amp;y as y_val
            ,(c.&amp;amp;y - 2*a.&amp;amp;y + b.&amp;amp;y) as second_diff
        from &amp;amp;data as a
        left join &amp;amp;data as b
          on a.&amp;amp;group=b.&amp;amp;group 
            and a.&amp;amp;x &amp;gt; b.&amp;amp;x 
            and not exists 
               (select 1 from &amp;amp;data as c2 
                 where c2.group=a.group 
                   and c2.group=b.group
                   and c2.group=c.group 
                   and c2.&amp;amp;x &amp;gt; b.&amp;amp;x 
                   and c2.&amp;amp;x &amp;lt; a.&amp;amp;x) 
        left join &amp;amp;data as c 
           on a.&amp;amp;group=b.&amp;amp;group
             and a.&amp;amp;x &amp;lt; c.&amp;amp;x
             and not exists 
                  (select 1 from &amp;amp;data as c3
                  where c3.group=a.group 
                    and c3.group=a.group
                    and c3.group=c.group
                    and c3.&amp;amp;x &amp;lt; c.&amp;amp;x and c3.&amp;amp;x &amp;gt; a.&amp;amp;x) 
           where b.&amp;amp;y is not null and c.&amp;amp;y is not null 
      ; 
      quit; 
   proc means data=_second_diff noprint;
      by &amp;amp;group ;
      var second_diff;
      output out=&amp;amp;out mean=mean_concavity sum=sum_concavity 
                  css=variance_concavity /*concaveness*/ n=n_points
      ; 
     run; 
/* This step does nothing 
data &amp;amp;out; set &amp;amp;out; run; 
*/ 
proc sql; 
  create table &amp;amp;out as 
    select group 
         , avg(second_diff) as mean_concavity label="(Mean Concavity)"
         , avg(abs(second_diff)) as mean_abs_concavity label="(Mean Absolute Curvature)" 
         , sum(second_diff) as net_concavity label="(Net Concavity)" 
         , count(*) as valid_points 
     from _second_diff 
     group by &amp;amp;group 
     ; 
quit; 

proc datasets lib=work nolist;
 delete _second_diff _temp_concave _prep; 
quit; 

proc print data=&amp;amp;out noobs; 
title "Curve Overall Concaveness Measurement"; 
run; 

%mend;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 29 Aug 2026 23:26:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-make-the-macro-works-on-column-to-work-on-column-with-BY/m-p/992768#M380456</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-29T23:26:43Z</dc:date>
    </item>
    <item>
      <title>Re: Any Wrong with this coding?!</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Any-Wrong-with-this-coding/m-p/992668#M380450</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/409584"&gt;@hellohere&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Is this due to usage of %do instead of do inside macro?!&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Become your own macro interpreter and see for yourself.&lt;/P&gt;
&lt;P&gt;With the %DO loops the macro is generating code like:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data temp_simu_sin_od;
ybase=(round(ranuni(&amp;amp;i.),0.1)+0.1)*&amp;amp;baseratio.;
  tick=&amp;amp;i.;
  ynoise=(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);
  y=ybase*sin(&amp;amp;x./200)+(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);	
  ind=&amp;amp;x.;
  output;
  ynoise=(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);
  y=ybase*sin(&amp;amp;x./200)+(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);	
  ind=&amp;amp;x.;
  output;
  ynoise=(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);
  y=ybase*sin(&amp;amp;x./200)+(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);	
  ind=&amp;amp;x.;
  output;
...
ybase=(round(ranuni(&amp;amp;i.),0.1)+0.1)*&amp;amp;baseratio.;
  tick=&amp;amp;i.;
  ynoise=(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);
  y=ybase*sin(&amp;amp;x./200)+(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);	
  ind=&amp;amp;x.;
  output;
  ynoise=(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);
  y=ybase*sin(&amp;amp;x./200)+(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);	
  ind=&amp;amp;x.;
  output;
  ynoise=(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);
  y=ybase*sin(&amp;amp;x./200)+(ranuni(&amp;amp;i.)-0.5)*&amp;amp;noiseratio.*2*ranuni(&amp;amp;x.);	
  ind=&amp;amp;x.;
  output;
...

run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;So the data step will take a very long time to compile before it can even begin to generate the data.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It is always best to know what code you want the macro to emit before you start writing the macro.&lt;/P&gt;</description>
      <pubDate>Thu, 27 Aug 2026 14:13:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Any-Wrong-with-this-coding/m-p/992668#M380450</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-27T14:13:37Z</dc:date>
    </item>
    <item>
      <title>Re: sas base: working with results viewer window</title>
      <link>https://communities.sas.com/t5/SAS-Programming/sas-base-working-with-results-viewer-window/m-p/992615#M380443</link>
      <description>&lt;P&gt;I assume you mean that you are using SAS Display Manager?&amp;nbsp; &amp;nbsp;Either on an Windows machine or on a Unix machine with an X-Windows servier.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I think you are talking about the window that kind of serves as a "table of contents" for the results you have generated.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I don't think that removing an entry from the "table of contents" view of the Results Viewer will actually remove anything from the actual ODS output file.&amp;nbsp; If you want to recreate the results with some steps not run then you would need to re-run the steps in the order you want them.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Otherwise you could save the results to a file and then edit the result file using an editor of your choice.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also I think that I have noticed in the past that you can remove content from the actual Results without them disappearing from the "table of contents" of the Results Viewer window.&amp;nbsp; I remember in the past having to clear both of the windows to get back to a blank slate.&lt;/P&gt;</description>
      <pubDate>Tue, 25 Aug 2026 20:15:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/sas-base-working-with-results-viewer-window/m-p/992615#M380443</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-25T20:15:43Z</dc:date>
    </item>
    <item>
      <title>Re: Connecting all possible individuals within a family, aka connecting paired nodes</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Connecting-all-possible-individuals-within-a-family-aka/m-p/992452#M380433</link>
      <description>&lt;P&gt;For problems that are too large for the HASH based solutions I like to use this old &lt;A href="https://github.com/sasutils/macros/blob/master/subnet.sas" target="_self"&gt;%SUBNET()&lt;/A&gt; macro that uses an iterative SQL solution.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It works with your example if you tell it the connections are bi-directional.&amp;nbsp; (Note that the PERSON_ID and FAMILY_ID values need to be distinct, as is the case in your example data, so that it does not confuse PERSON number 1 with FAMILY number 1).&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%subnet
(in=mydata
,out=want
,from=person_id
,to=family_id
,subnet=subnet
,directed=0
)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;For your example it finds 3 extended families.&lt;/P&gt;
&lt;PRE&gt; person001 family001 1
 person001 family002 1
 person002 family001 1
 person003 family001 1
 person004 family001 1
 person005 family001 1
 person006 family001 1
 person007 family001 1
 person008 family002 1
 person009 family002 1
 person010 family002 1
 person011 family002 1
 person012 family002 1
 person013 family002 1
 person014 family002 1
 person014 family003 1
 person015 family003 1
 person016 family003 1
 person016 family004 1
 person017 family004 1
 person018 family004 1
 person019 family004 1
 person020 family004 1
 person021 family005 2
 person022 family005 2
 person023 family005 2
 person024 family006 3&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 22 Aug 2026 19:00:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Connecting-all-possible-individuals-within-a-family-aka/m-p/992452#M380433</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-22T19:00:53Z</dc:date>
    </item>
    <item>
      <title>Re: Strange behavior when data are written and re-read directly from an Excel file</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Strange-behavior-when-data-are-written-and-re-read-directly-from/m-p/992279#M380424</link>
      <description>&lt;P&gt;I don't understand.&amp;nbsp; If I do what you did and use ODS EXCEL to make a column with strings that all look like numbers then when I read back in the XLSX file I get a NUMERIC variable.&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;* Create two character strings with the same values ;
data xxx;
  length x $200;
  input x @@;
  y=x;
cards;
-1 -10 -100 -10 -1 
;

* Use PROC REPORT to write it to a spreadsheet ;
* Tell PROC REPORT to write X as String ;
ods excel file="%sysfunc(pathname(work))/temp.xlsx" 
  options (sheet_name="XXX" tab_color="white" flow="tables" )
;
proc report data=xxx;
  define x / style(column)={tagattr="type:String"};
run;
ods excel close;

* Check the data types of the two columns read from the spreadsheet ;
libname prvfndgs xlsx "%sysfunc(pathname(work))/temp.xlsx"; 
proc contents data=prvfndgs.XXX; 
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-08-20 at 10.53.30 AM.png" style="width: 743px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/117095iBB6AB4EC74770C6D/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2026-08-20 at 10.53.30 AM.png" alt="Screenshot 2026-08-20 at 10.53.30 AM.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You cannot really compare the original string variable to a numeric variable. Perhaps your code is just getting confused by this change of variable type?&lt;/P&gt;</description>
      <pubDate>Thu, 20 Aug 2026 14:59:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Strange-behavior-when-data-are-written-and-re-read-directly-from/m-p/992279#M380424</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-20T14:59:18Z</dc:date>
    </item>
    <item>
      <title>Re: SAS CDE creates SAS datasets with restrictive file permissions on SAS Grid environment</title>
      <link>https://communities.sas.com/t5/SAS-Viya/SAS-CDE-creates-SAS-datasets-with-restrictive-file-permissions/m-p/992132#M3131</link>
      <description>&lt;P&gt;Unless you are trying to modify existing datasets using PROC DATASETS or an PROC SQL UPDATE statement&amp;nbsp; (as opposed to the normal process of replacing them with a new dataset using the same name) then the permission issue is usually that the user does not have write access to the directory that the datasets live in not that they do not have write permission to the dataset file itself.&amp;nbsp; Not having write access to the directory means they cannot create new files or delete existing files.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Try changing the group write bit on the directory.&amp;nbsp; Also set the group sticky bit on the directory so that all files created there are in that group also.&lt;/P&gt;</description>
      <pubDate>Sun, 16 Aug 2026 14:47:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Viya/SAS-CDE-creates-SAS-datasets-with-restrictive-file-permissions/m-p/992132#M3131</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-16T14:47:31Z</dc:date>
    </item>
    <item>
      <title>Re: Create snowflake table as select from sql</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Create-snowflake-table-as-select-from-sql/m-p/992131#M380413</link>
      <description>&lt;P&gt;If the goal is to move data between two different foreign databases then you should get better results if you switch to PROC FEDSQL instead.&lt;/P&gt;</description>
      <pubDate>Sun, 16 Aug 2026 14:31:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Create-snowflake-table-as-select-from-sql/m-p/992131#M380413</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-16T14:31:09Z</dc:date>
    </item>
    <item>
      <title>Re: Create snowflake table as select from sql</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Create-snowflake-table-as-select-from-sql/m-p/992120#M380411</link>
      <description>&lt;P&gt;That is a strange error. It seems to be saying it tried to read the text string 'SOLE OWNER' into a numeric variable.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Sounds like something is causing the parsing of the bulk loaded file to fail.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Do you know where in your data you have that value?&amp;nbsp; If it only appears only a few times you might be able figure out what values are causing the trouble by looking at the values of a couple of observations before where it first appears.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You might have unbalanced quotes in your data fields and SAS and Snowflake don't agree on how to handle them.&amp;nbsp; Or perhaps your data includes values that look like the delimiter that bulkload is using to parse the records.&amp;nbsp; Or perhaps they don't agree on the encoding that is being used?&lt;/P&gt;</description>
      <pubDate>Sat, 15 Aug 2026 01:30:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Create-snowflake-table-as-select-from-sql/m-p/992120#M380411</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-08-15T01:30:46Z</dc:date>
    </item>
  </channel>
</rss>

