<?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: Sas macros help in New SAS User</title>
    <link>https://communities.sas.com/t5/New-SAS-User/Sas-macros-help/m-p/554722#M9559</link>
    <description>&lt;P&gt;Before doing anything with a macro you &lt;STRONG&gt;must&lt;/STRONG&gt; have code that performs the tasks you want for at least one case.&lt;/P&gt;
&lt;P&gt;Macros only generate code to perform tasks and without knowing the basic SAS code to generate you will not have much luck.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also many things that new SAS users think require "macro" do not.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Describe the data, best to provide a data step to generate a small example and describe what the output should be along with constraints or rules.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Post code into a code box opened using the forum's {I} or "running man" icon.&lt;/P&gt;</description>
    <pubDate>Mon, 29 Apr 2019 14:47:03 GMT</pubDate>
    <dc:creator>ballardw</dc:creator>
    <dc:date>2019-04-29T14:47:03Z</dc:date>
    <item>
      <title>Sas macros help</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Sas-macros-help/m-p/554692#M9546</link>
      <description>I will post whole code please help me out with that</description>
      <pubDate>Mon, 29 Apr 2019 13:37:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Sas-macros-help/m-p/554692#M9546</guid>
      <dc:creator>saikiran_nemani</dc:creator>
      <dc:date>2019-04-29T13:37:16Z</dc:date>
    </item>
    <item>
      <title>Re: Sas macros help</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Sas-macros-help/m-p/554722#M9559</link>
      <description>&lt;P&gt;Before doing anything with a macro you &lt;STRONG&gt;must&lt;/STRONG&gt; have code that performs the tasks you want for at least one case.&lt;/P&gt;
&lt;P&gt;Macros only generate code to perform tasks and without knowing the basic SAS code to generate you will not have much luck.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also many things that new SAS users think require "macro" do not.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Describe the data, best to provide a data step to generate a small example and describe what the output should be along with constraints or rules.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Post code into a code box opened using the forum's {I} or "running man" icon.&lt;/P&gt;</description>
      <pubDate>Mon, 29 Apr 2019 14:47:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Sas-macros-help/m-p/554722#M9559</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2019-04-29T14:47:03Z</dc:date>
    </item>
    <item>
      <title>Re: Sas macros help</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Sas-macros-help/m-p/556352#M9815</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hi Ballard,&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When I am Joining on the tables we need to Extract the Schedule Date from the&amp;nbsp;staging.ads_daily_techtrac_faults_open.I need your help.&lt;/P&gt;&lt;PRE&gt;&lt;BR /&gt;&lt;CODE class=" language-sas"&gt;Proc SQL;
Create table SROin_2 as
Select
        /* Before = Faults */
Coalesce(before.closeddate,&lt;EM&gt;&lt;STRONG&gt;&lt;U&gt;open.schedule_date&lt;/U&gt;)&lt;/STRONG&gt;&lt;/EM&gt; as faultdate,
                  before.urn,
                  before.Close_Date,
                  before.Close_Date as    dayt,
                  before.dayt             as fault_checked_date, /** 07/12/2010 - JW - Added this date in to statement **/
                  before.TECH_no1,
                  before.WORKORDER,
                  before.finding_desc,
                  before.solution_desc,
                  before.source_system_code,
                  before.franchise_Code,
                  before.account_no,
                  before.trucked_fault,
                  /* After = SROs */
                  /* PR-added COMPLETIONDATE (P0002373164)*/
                  after.ENTRYDATE,
                  after.ENTRYDATE                     as    dayt,
                  after.COMPLETIONDATE,
                  after.workorder                     as SRO_WO,
                  after.SERVICE_CODE,
                  after.TECH_NO1                      as A_Tech_No1
from SROs as SRO 
left join 
Closed_Faults as before on sro.urn=before.urn 
and SRO.Opendate lt (before.dayt+1)
left join
Open as Open ON SRO.URN = OPEN.URN
and SRO.Opendate lt (OPEN.SCHEDULE_DATE+1)
where Before.URN IS NOT NULL OR OPEN.URN IS NOT NULL
order by before.dayt,urn;
QUIT;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

MACROS :


%macro grab_faults(op_dset=,
                   open_closed=,
                   start_dat=,
                   end_dat=,
                   add_counter=,
                   keep_vars=,
				   sort_by=,
				   include_xicms=N,
				   format_xicms=N,
				   Include_BC=N,
				   BC_Only=N,
				   cache=YES
                  ) / parmbuff;

%put Running grab_faults_v2_1_2;


* NS (26/8/04) - Insert a block of code to set up the fault formats for the ;

* Finding and solution codes.                                               ;
 proc format ;
value $regionw

     'UD'='Scotland'

     'ED'='Scotland'

     'GL'='Scotland'

     'SC'='Scotland'

     'NE'='North East'

     'NW'='North West'

     'YK'='Yorkshire'

     'AV'='South West'

     'CW'='South West'

     'SW'='South West'

     'MI'='Midlands'

     'MD'='Midlands'

	 'BG'='Birmingham'

     'BM'='Birmingham'

     'DE'='Eurobell South West'

     'DV'='Eurobell South West'

     'EL'='East London'

     'SE'='East London'

     'LS'='South London'

     'SL'='South London'

     'WL'='West London'

     'CL'='North London'

     'NL'='North London'

     'CR'='Eurobell South East'

     'KE'='Eurobell South East'

     'WK'='Eurobell South East'

/*	 'TV'='Thames Valley'*/



	 'AN'='Central Midlands'

	 'EM'='East Midlands'

	 'NN'='Northern England West'

	 'NO'='London North West'

	 'NS'='London North East'

	 'NT'='North East NTL'

	 'SN'='London South NTL'

	 'SO'='Southern England'

	 'YO'='Northern England East'



	 'NY'='Nynex'

	 'VC'='Videotron Cable Ltd'	

     'BL'='Bell Cable Ltd'



	 'GW'='Glasgow'

	 'LU'='Luton'

	 'RM'='Belfast'

	 'WA'='Wales'

	 'MK'='Milton Keynes'



		'MT'='Mid Tees'

		'CB'='Cambridge'

;




* import the finding table into a reporting dataset - ignore the first ;

* row as this contains the column headers.                             ;
%include "/sas/data/access_mi/mitdata/server_sas/includes/create_formats.sas";

proc import datafile="/sas/data/access_mi/mitdata/server_sas/csv_files/finding.csv" 
dbms=csv replace
out=finding_table
;quit;

data finding_table;
  length finding_code $8. finding_desc $50.;
set finding_table;
attrib finding_code label='Finding Code' ;
	  attrib finding_desc label='Finding Code Descriptor' ;
	  if length(finding_code)=1 then
		finding_code='0'||finding_code;
	run;
/*data finding_table;

  infile "&amp;amp;f_table." dsd firstobs=2 termstr=crlf;

  attrib finding_code label='Finding Code' length=$8;

  attrib finding_desc label='Finding Code Descriptor' length=$50;

  input finding_code finding_desc ;

  if length(finding_code)=1 then

	finding_code='0'||finding_code;

 /* if ((substr(finding_code,1,3)=substr(finding_desc,1,3)) or

      (substr(finding_desc,1,3)='VM ')) then

    finding_desc=left(substr(finding_desc,4,46));

  else if (substr(finding_desc,1,4)='CRW ') then

    finding_desc=left(substr(finding_desc,5,45)); */*/

run;*/



* set up an 'Other' default of 'None' for the format ;

data finding_table;

  set finding_table end=atend;

  output;

  if (atend) then

    do;

	  hlo='O';

	  finding_code='00';

	  finding_desc='None';

	  output;

	end;

run;



* sort the table and lose any duplicates ;

proc sort data=finding_table nodupkey; by finding_code; run;



* use our pre-defined macro to set up the formats for the finding code descriptor ;

%create_fmt(fmtsource=finding_table,

            fmtname=findin,

            fmttype=C,

            startvar=finding_code,

            labelvar=finding_desc );



* .. now do the same for solution codes - import the solution table into a reporting ;

* dataset - ignore the first row as this contains the column headers.                ;

proc import datafile="/sas/data/access_mi/mitdata/server_sas/csv_files/solution.csv" 
dbms=csv replace
out=solution_table
;quit;

data solution_table;
length  solution_code $8. solution_desc $50.;
set solution_table;
attrib solution_code label='solution Code' ;
	  attrib solution_desc label='solution Code Descriptor' ;
	 
	  if length(solution_code)=1 then
		solution_code='0'||solution_code;
		solution_desc=translate(solution_desc,' ','0D'x);
	run;
	/*
data solution_table;

  infile "&amp;amp;s_table." dsd firstobs=2 termstr=crlf;

  attrib solution_code label='Solution Code' length=$8;

  attrib solution_desc label='Solution Code Descriptor' length=$50;

  input solution_code solution_desc ;

  if length(solution_code)=1 then

    solution_code='0'||solution_code;

 /* if (substr(solution_code,1,3)=substr(solution_desc,1,3)) then

    solution_desc=left(substr(solution_desc,4,46));

  else if (substr(solution_desc,2,1)=' ') then

    solution_desc=left(substr(solution_desc,3,47)); */*/



  solution_desc=translate(solution_desc,' ','0D'x); * 09/04/2009 found a Carriage Return had crept into solution_desc

                                                        on the unix version....RFC;

/*run;*/



* set up an 'Other' default of 'None' for the format ;

data solution_table;

  set solution_table end=atend;

  output;

  if (atend) then

    do;

	  hlo='O';

	  solution_code='00';

	  solution_desc='None';

	  output;

	end;

run;



* sort the table and lose any duplicates ;

proc sort data=solution_table nodupkey; by solution_code; run;



* use our pre-defined macro to set up the formats for the finding code descriptor ;

%create_fmt(fmtsource=solution_table,

            fmtname=soltio,

            fmttype=C,

            startvar=solution_code,

            labelvar=solution_desc );



* (NS 6/9/04) - add an equivalent for problem codes ;

* .. now do the same for solution codes - import the solution table into a reporting ;

* dataset - ignore the first row as this contains the column headers.                ;
proc import datafile="/sas/data/access_mi/mitdata/server_sas/csv_files/problem.csv" 
dbms=csv replace
out=problem_table
;quit;

data problem_table;
length problem_code $8. problem_desc $50.;
set problem_table;
attrib problem_code label='problem Code' ;
	  attrib problem_desc label='problem Code Descriptor' ;
	  if length(problem_code)=1 then
		problem_code='0'||problem_code;
	run;
/*data problem_table;

  infile "&amp;amp;p_table." dsd firstobs=2 termstr=crlf;

  attrib problem_code label='Problem Code' length=$8;

  attrib problem_desc label='Problem Code Descriptor' length=$50;

  input problem_code problem_desc ;

  if length(problem_code)=1 then

    problem_code='0'||problem_code;

 /* problem_desc=left(substr(problem_desc,length(trim(problem_code))+1,

                    50-(length(trim(problem_code))+1))); */*/

run;*/



* set up an 'Other' default of 'None' for the format ;

data problem_table;

  set problem_table end=atend;

  output;

  if (atend) then

    do;

	  hlo='O';

	  problem_code='00';

	  problem_desc='None';

	  output;

	end;

run;



* sort the table and lose any duplicates ;

proc sort data=problem_table nodupkey; by problem_code; run;



* use our pre-defined macro to set up the formats for the finding code descriptor ;

%create_fmt(fmtsource=problem_table,

            fmtname=proble,

            fmttype=C,

            startvar=problem_code,

            labelvar=problem_desc );

%let start_time = %sysfunc(time());

%let mrc_calling_macro = &amp;amp;sysmacroname;

%let xicms_codes = 'VC' 'BL' 'NY' 'LU' 'WA' 'RM' 'MK' 'GW' 'CB' 'MT';


/* jwalsh - ensure that the flag is Y or set to N */
	%if &amp;amp;include_xicms. ne Y %then %let include_xicms = N;
	%if &amp;amp;format_xicms. ne Y %then %let format_xicms = N;


%if %symexist(srvcon) %then
      %do;
	    %if &amp;amp;srvcon=0 and &amp;amp;SYSSCP=WIN %then %let rflag=YES;
		%else %let rflag=NO;
		%put &amp;amp;rflag;
	  %end;	
%else %let rflag=NO;

%if &amp;amp;rflag=YES %then
  %do;
    %syslput parms=&amp;amp;syspbuff;

    * send the values of our controlling macro variables to the remote session ;
  	%syslput op_dset=&amp;amp;op_dset.;
  	%syslput open_closed=&amp;amp;open_closed.;
  	%syslput start_dat=&amp;amp;start_dat.;
  	%syslput end_dat=&amp;amp;end_dat.;
  	%syslput add_counter=&amp;amp;add_counter.;
  	%syslput keep_vars=&amp;amp;keep_vars.;
  	%syslput sort_by=&amp;amp;sort_by.;
  	%syslput include_xicms=&amp;amp;include_xicms.;
  	%syslput format_xicms=&amp;amp;format_xicms.;
  	%syslput Include_BC=&amp;amp;Include_BC.;
  	%syslput BC_Only=&amp;amp;BC_Only.; 
    %syslput cache = &amp;amp;cache;
    %syslput mrc_calling_macro=&amp;amp;mrc_calling_macro;
    %syslput xicms_codes = &amp;amp;xicms_codes.;
	
  %end;

  
%if &amp;amp;rflag=YES %then
  %do;
     rsubmit;
  %end;	
  

/* See if this macro has been run before using these parameters. */

%if &amp;amp;cache = YES %then
%do;
  %inc macpath(mrc_check_cache);
  
  %mrc_check_cache(macro_name   = &amp;amp;mrc_calling_macro,

                    %if &amp;amp;rflag=YES %then
  			          params      = %str(&amp;amp;parms),;
                    %else
				      params      = %str(&amp;amp;syspbuff),;

  			       ignore_params = 1,
  			       output_dset1 = &amp;amp;op_dset
			      );
  
  %if &amp;amp;mrc_macro_called_before = YES %then
    %goto The_End;
%end;

    /*
	data _NULL_;
		call symput('start_dat',&amp;amp;start_dat);
		call symput('end_dat',&amp;amp;end_dat);
	run;
    */

/* If xICMS faults are included, then import the CSV file to format the xICMS regions.*/
/* jwalsh - updated code to only import if the format_xicms flag is Y                 */
/* 			took the import to a seperate file and used an include statement to 	  */
/*			import the data. Thus centralising the import to one location for ease.	  */
%if &amp;amp;include_xicms.=Y and &amp;amp;format_xicms.=Y %then
	%do;

	  	/* %include 'V:\sascode\mi caps\ap\includes\Import_xNTL_Franchise_List.sas'; */

		data xICMS_Fran (drop=siteid);
    *infile 'v:\SASCODE\MI CAPs\ap\Robbie_Sas_Code\Macro\CSV Files\franchise.csv' delimiter = ',' MISSOVER DSD  firstobs=2;
    infile '/sas/data/mitdata/server_sas/csv_files/franchise.csv' delimiter = ',' MISSOVER DSD  firstobs=2;
         
  informat FRANCHISE_CODE best32.;
       informat Company $4.;
       informat SiteID best32.;
       informat Franchise $50.;
       informat System $5.;
       informat Source_System_Code $2.;
       format FRANCHISE_CODE best32.;
       format Company $4.;
       format SiteID best32.;
       format Franchise $50.;
       format System $5.;
       format Source_System_Code $2.;
    input
                FRANCHISE_CODE
                Company $
                SiteID
                Franchise $
                System $
                Source_System_Code $
    ;
    run;


	
	%end;


  * Set the main processing to run remotely because of the file sizes involved ;
 /* rsubmit; */


%Macro Excludes_SSC();

%if &amp;amp;BC_Only.=N %then
	%do;
		%if &amp;amp;include_xicms.=N %then
			%do;
				and source_system_code NOT IN (&amp;amp;xicms_codes.)
			%end;
		%if &amp;amp;Include_BC.=N %then
			%do;
				and source_system_code ne 'NC'
			%end;
	%end;
%Else
	%do;
		and source_system_code = 'NC'
	%end;

%mend Excludes_SSC;

  * Build up a dataset of all the required faults for the specified timeframe. Apply ;
  * the standard filters, add a counter if requested and then keep the variables     ;
  * that we need.                                                                    ;
  data &amp;amp;op_dset.;
    length franchise $23
           problem_desc $40
           finding_desc $40
		   solution_desc $40
           category $21 
           product $8 
           truck_type $7 
           wasted_truck_type $20
           account_number $12
           fault_number $12;
    format category $21.;       
    * start off by selecting the datasets based upon the open/closed macro var ;
    set 
      %if (%quote(&amp;amp;open_closed.) = %quote(O)) %then
	    %do;
          staging.ads_daily_techtrac_faults_open (in=a
		  											where=(source_system_code ne ""
													%Excludes_SSC
													)
											)
		%end;
      %else %if (%quote(&amp;amp;open_closed.) = %quote(C)) %then
	    %do;
          staging.ads_daily_techtrac_faults_closed (in=b rename=(category=main_category)
		  											where=(source_system_code ne ""
													%Excludes_SSC	
													)
											)
		%if &amp;amp;start_dat. &amp;lt; %sysfunc(intnx(Month,%sysfunc(today()),0)) %then 
			%do;
          		staging.ads_mthly_trac_faults_closed (in=b rename=(category=main_category)
                		                                where=(datepart(_loadtm) gt '01JAN2011'd
														%Excludes_SSC
													));
			%end;
		%end;
      %else %if (%quote(&amp;amp;open_closed.) = %quote(CC)) %then
	    %do;
         staging.ads_daily_techtrac_faults_closed (in=b rename=(category=main_category)
		  											where=(source_system_code ne ""
													%Excludes_SSC	
													)
											)
		%end;
      %else %if (%quote(&amp;amp;open_closed.) = %quote(B)) %then
	    %do;
          staging.ads_daily_techtrac_faults_closed (in=b rename=(category=main_category)
		  											where=(source_system_code ne ""
													%Excludes_SSC	
													)
											)
          staging.ads_mthly_trac_faults_closed (in=b rename=(category=main_category)
                                                where=(datepart(_loadtm) gt '01JAN2011'd
		  										%Excludes_SSC
											))
         staging.ads_daily_techtrac_faults_open	(in=a
		  											where=(source_system_code ne ""
													%Excludes_SSC	
													)
											)
		%end;
      %else %if (%quote(&amp;amp;open_closed.) = %quote(E)) %then
	    %do;
         staging.ads_daily_techtrac_faults_closed (in=b rename=(category=main_category)
		  											where=(source_system_code ne ""
													%Excludes_SSC		
													)
											)
		%if &amp;amp;start_dat. &amp;lt; %sysfunc(intnx(Month,%sysfunc(today()),0)) %then 
			%do;
	          staging.ads_mthly_trac_faults_closed (in=b rename=(category=main_category)
			                                        where=(datepart(_loadtm) gt '01JAN2011'd
			  										%Excludes_SSC	
													))
			%end;
          staging.ads_daily_techtrac_faults_open (in=a
		  											where=(source_system_code ne ""
													%Excludes_SSC	
													)
											)
		%end;
		;
	* apply the standard filters (exclusions) for status and finding code ;
    * (NS 23/9/04) - V1.1 - Modify the status filter to exclude 'CN' and  ;
    * 'ND' codes rather than trying to keep the valid ones otherwise      ;
    * we`ll have problems retaining open faults.                          ;
    * NS (6/12/04) - V1.4 - Change the exclusion logic to allow 'CN','ND' ;
	* status jobs to be retained for entered faults                       ;
    * NS (7/03/05) - V1.10 - Remove the blanket filter of all `ZM` closed ;
    * faults - introduce some date-based logic further down.              ;
    %if ((%quote(&amp;amp;open_closed.) ne %quote(O)) and
         (%quote(&amp;amp;open_closed.) ne %quote(E))) %then
		%do;
			%if &amp;amp;BC_Only.=Y %then
				%do;
					if (upcase(trim(status)) not in ('ND'));
				%end;
			%else
				%do;
					%if &amp;amp;Include_BC.=Y %then 
						%do;
							if Source_system_code = "NC" then
								do;
									if (upcase(trim(status)) not in ('ND'));
								end;
							else
								do;
									if (upcase(trim(status)) not in ('CN' 'ND'));
								end;
						%end;
					%else
						%do;
							if (upcase(trim(status)) not in ('CN' 'ND'));
						%end;
				%end;
		%end;

	* add a franchise definition `cos this will be widely used ;
    franchise=put(source_system_code,$regionw.);
*franchise=source_system_code;
*format franchise $regionw.;
	* NS (31/5/05) - allow for Eurobell test jobs ;
	if (upcase(source_system_code) ne 'EU');

	* NS (8/12/04) - V1.5 - also add in definitions for the main codes ;
    finding_desc=put(finding_code,$findin.);
    solution_desc=put(solution_code,$soltio.);
    problem_desc=put(problem_code,$proble.);
*finding_desc=finding_code;
*solution_desc=solution_code;
*problem_desc=problem_code;

*format finding_desc $findin. solution_desc $soltio. problem_desc $proble.;

	* NS (15/12/04) - V1.6 - Create the category variable from a new format ;
	* that we`ve created - note that we need to create a new variable that  ;
	* is the work_order_class and finding code combined in order to use the ;
	* format - drop the new var after we`ve used it.                        ;
	format_key=trim(upcase(work_order_class))||trim(upcase(finding_code));
	category=put(format_key,$catgory.);

	* NS (28/106/05) - V1.13 - Use the new OOS format to set up the ysnoos variable ;
	if (put(format_key,$oos_fmt.)='Y') then
      ysnoos=1;
	else
	  ysnoos=0;

	* lose the format key that we no longer need ;
    drop format_key;

	* NS (22/12/04) - V1.7 - add in the product definition too ;
    *product=put(work_order_class,$fltcls.);
	product=put(work_order_class,$vtp.);
	* define common account number and fault number fields ;
	account_number=left(account_no);
	fault_number=left(workorder);

	* filter down to specific dates if required ;
    * (NS 23/9/04) - V1.1 - Choose the appropriate date based upon faults requested ;
    dayt_char = checked_date_time;

	if ((checked_date_time=' ') or ("&amp;amp;open_closed."='E')) then
	  dayt_char=entry_date_time;
    dayt=input(trim(scan(dayt_char,1,' ')),ddmmyy10.);
    %if ((%quote(&amp;amp;start_dat.) ne %quote()) and
         (%quote(&amp;amp;end_dat.) ne %quote())) %then
      %do;
        if ((dayt ge &amp;amp;start_dat.) and (dayt le &amp;amp;end_dat.));
	  %end;

    * NS (7/03/05) - V1.10 - Control the inclusion of any `ZM` closed faults using ;
    * a specific controlling date.                                                 ;
    %if ((%quote(&amp;amp;open_closed.) ne %quote(O)) and
         (%quote(&amp;amp;open_closed.) ne %quote(E))) %then
	  %do;
	    if (dayt lt '01MAR2005'd) then
		  do;
            if (upcase(trim(finding_code)) ne 'ZM');
		  end;
      %end;

	* upcase the last_change_user value in case we`re doing G2Plus joins later ;
	last_change_user=upcase(last_change_user);

	/* New Truck Roll critera added 11MAY2007 - RG */
	if office_only = 'N' and timeslot not in ('','99', '  ') then
		do;
			trucked_fault = 'Y';
			new_trucked_fault='Y';
			truck_type="SERVICE";
		end;
	else
		do;
			new_trucked_fault='N';
			trucked_fault = 'N';
		end;

	* NS (6/4/5) - V1.11 - Add in the wasted truck logic ;
		wasted_truck='N';
		wasted_truck_type='N/A';
		if (trucked_fault='Y') then
			do;
				if (upcase(finding_code) in ( 'AK' 'FX' /* 'FY' 'FZ'*/ 'AO' 'BR' 'AG' 'OJ')) then
				do;
					wasted_truck='Y';
					select (upcase(finding_code));
						when ('AK') wasted_truck_type='CPE';
						when ('FX') wasted_truck_type='Right When Tested';
						/* when ('FY') wasted_truck_type='No Access';*/
						/* when ('FZ') wasted_truck_type='No Access';*/
						when ('AO') wasted_truck_type='Data Fill';
						when ('OJ') wasted_truck_type='Data Fill'; 
						when ('AO') wasted_truck_type='Data Fill';
						when ('BR') wasted_truck_type='Channels/Packages';
						when ('AG') wasted_truck_type='Channels/Packages';
				end;
			end;
		else if (upcase(solution_code) in ('28' '31' '35' '84' '17' '32' '66' '80' '21' '72')) then
			do;
				wasted_truck='Y';
				select (upcase(solution_code));
					when ('28') wasted_truck_type='Mains Reset';
					when ('31') wasted_truck_type='Hit Sent';
					when ('35') wasted_truck_type='Mains Reset';
					when ('84') wasted_truck_type='Customer Education';
					when ('17') wasted_truck_type='Channels/Packages';
					when ('32') wasted_truck_type='Channels/Packages';
					when ('66') wasted_truck_type='Channels/Packages';
					when ('80') wasted_truck_type='Channels/Packages';
					when ('21') wasted_truck_type='Cancelled';
					when ('72') wasted_truck_type='Cancelled';
				end;

			end;
	end; 

	* set up a default counter flag ;
    counter=1;

	* RG  - 10/07/08  ;
	* Added Where Also to remove Off Net Code. ;
*	where also SOURCE_SYSTEM_CODE ne "NC";

	* if keep vars have been specified, issue the keep command - keep the counter ;
	* regardless if we`ve been asked to generate one.                             ;
    %if (%quote(&amp;amp;keep_vars.) ne %quote()) %then
      %do;
        keep &amp;amp;keep_vars. urn workorder FRANCHISE_CODE
          %if (%quote(&amp;amp;add_counter.) = %quote(Y)) %then
            %do;
              counter
	        %end;
        ;
	  %end;

  run;

/* 	If xICMS Faults are included then split the dataset into xTW and xNTL then merge the
	xNTL data with the CSV sheet to get the Source_System_Code and the Franchise. */ 

  %if &amp;amp;include_xicms.=Y %then
	%do;
		%if &amp;amp;format_xicms.=Y %then
			%do;
			Data xTW xNTL;
				Set &amp;amp;op_dset.;
				If Source_System_Code in (&amp;amp;xicms_codes.) Then
					do;
						Output xNTL;
					end;
				else
					do;
						Output xTW;
					end;
			run;
			Data xNTL;
				Set xNTL(rename=(	Franchise=Franchise_Old
									Source_System_Code=Source_system_code_old
									URN=URN_OLD));
			run;

			Proc Sort Data=xICMS_Fran; By FRANCHISE_CODE;run;
			Proc Sort Data=xNTL; By FRANCHISE_CODE;run;

			Data Merged_xNTL;
				Merge 	xNTL(in=n)
						xICMS_Fran(in=f);
				By FRANCHISE_CODE;
				if n;
			run;
			
			Data Merged_xNTL;
				Set Merged_xNTL;
				URN=trim(left(source_System_Code))||Trim(Left(substr(URN_OLD,3)));
				Drop SiteID;
				If source_system_code = "" then
					do;
						Source_system_code = "UK";
						Franchise = "Unknown";
					end;
			run;

			Data xTW;
				Set xTW;
				Franchise_Old=Franchise;
				Source_system_code_old=Source_system_code;
				URN_OLD=URN;
				Company = "xTW";
				System = "ICOMS";
			run;

			Data &amp;amp;op_dset.;
				Length Company $4;
				set xTW
					Merged_xNTL;
				format franchisecode $7.;
				franchisecode = compress(franchise_code);
			run;
		%end;
	%end;

  * make sure that we lose any duplicates based upon the urn and workorder number ;
  proc sort data=&amp;amp;op_dset. nodupkey; by urn workorder; run;

  * if requested, sort the output dataset into the specified order ;
  %if (%quote(&amp;amp;sort_by.) ne %quote()) %then
    %do;
      proc sort data=&amp;amp;op_dset.; by &amp;amp;sort_by.; run;
	%end;

  * close the remote processing ;
  /* endrsubmit; */

/* Could only have got this far if this macro has not been
   run with these parameters before. Therefore, save this data. */

%if &amp;amp;cache = YES %then
%do;
  %inc macpath(mrc_insert_into_cache);

  %mrc_insert_into_cache(macro_name   = &amp;amp;mrc_calling_macro,
					 %if &amp;amp;rflag=YES %then
  			             params      = %str(&amp;amp;parms),;
                                 %else
				         params      = %str(&amp;amp;syspbuff),;

 						 ignore_params = 1,
  			     	     output_dset1 = &amp;amp;op_dset
			            );
%end;

/* Macro jumps here if it has already been run with these parameters. */

%The_End:

%if &amp;amp;rflag=YES %then
  %do;
     endrsubmit;
  %end;


%let finish_time = %sysfunc(time());

data _null_;
  start_time  = &amp;amp;start_time;
  finish_time = &amp;amp;finish_time;
  runtime = finish_time - start_time;
  put "==============================";
  put " &amp;amp;sysmacroname  finished";
  put " Started  at " start_time time.;
  put " Finished at " finish_time time.;
  put " R U N T I M E " runtime time.;
  put "==============================";
run;


%mend grab_faults;

/*
* sample usage ;
%let start_dat=%eval(%sysfunc(today())-1);
%let end_dat=%eval(%sysfunc(today())-1);*/

/*%grab_faults(op_dset=Raw_Data,
			 open_closed=C,
			 start_dat='01mar2016'd,
			 end_dat='10mar2016'd,
			 add_counter=Y,
			 keep_vars=,
			 sort_by=,
			 include_xicms=Y,
			 format_xicms=N
			 );*/&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 06 May 2019 05:50:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Sas-macros-help/m-p/556352#M9815</guid>
      <dc:creator>saikiran_nemani</dc:creator>
      <dc:date>2019-05-06T05:50:39Z</dc:date>
    </item>
  </channel>
</rss>

