Mailversand aus SAS auf Basis einer Excel-Liste
Hallo,
ich habe ein Programm mit Macros geschrieben, dass auf Basis einer Excel-Liste mit je einer Mailadresse pro Zeile und der Angabe "CC" bzw. "An" (Variable Prio) die Ergebnisse eines SAS-Programmes als Mail versenden soll. Der Mailverteiler kann sich öfters ändern, daher wird die Anzeil Zeilen/Mailadressen jeweils ermittelt.
Bei Interesse...es funktioniert.
Nun möchte in gern noch mehr Flexibilität hereinbringen, d.h. z. B. Name des Mailverteilers und An/CC als Macroparameter mitgeben. Wenn ich jedoch den gesamten Code in ein Macro schreibe und im Files-Statement für die Mail aufrufe, kann z. B. das SQL-Statement nicht mehr ausgeführt werden und wenn ich ein weiters Macro verwende, klappt die Übergabe der Globalen Macrovariablen nicht mehr. Für Anregungen bin ich jederzeit dankbar.
Gruss, Friederike Grohmann
/* Upload-xls-Sheet Mailverteiler */
/************************************/
PROC IMPORT
DATAFILE="&pfadverteiler.verteiler_&JJ.&MM."
OUT= work.gfr
DBMS=Excel2000 REPLACE;
Sheet="GFR";
RUN;
Data GFRAN
GFRCC;
set gfr;
if compress(Prio) = "An" then output GFRAN;
else if compress(Prio) = "CC" then output GFRCC;
run;
/********************************************************************/
/* Macrodefinition (nach Selektion des Verteilers gemaess Angabe): */
/* Ermitteln ersten und letzten Datensatz des An- bzw. CC-Verteiler */
/* Numerische Variable fuer Macro definieren */
/* Mailadresse mit Anfuehrungszeichen definieren */
/* Alle Mailadressen in Macrovariablen aendern */
/* (AdrAn1 AdrAn2 bzw. AdrCC1 AdrCC2 ...) */
/********************************************************************/
Data GFRAN;
set GFRAN;
Nr = compress(_N_);
Adr = compress('"'!!Mailadresse!!'"');
run;
proc sort data=GFRAN; by Verteiler Prio Mailadresse;
run;
Data _NULL_;
set GFRAN;
by Verteiler Prio;
if first.Prio then CALL SYMPUT ("StartAn",Nr);
if last.Prio then CALL SYMPUT ("EndeAn",Nr);
run;
proc sql noprint;
select adr into :AdrAn&StartAn. - :AdrAn&EndeAn. from work.GFRAN;
quit;
Data GFRCC;
set GFRCC;
Nr = compress(_N_);
Adr = compress('"'!!Mailadresse!!'"');
run;
proc sort data=GFRCC; by Verteiler Prio Mailadresse;
run;
Data _NULL_;
set GFRCC;
by Verteiler Prio;
if first.Prio then CALL SYMPUT ("StartCC",Nr);
if last.Prio then CALL SYMPUT ("EndeCC",Nr);
run;
proc sql noprint;
select adr into :AdrCC&StartCC. - :AdrCC&EndeCC. from GFRCC;
quit;
%put _all_;
%macro aufruf (Prio= );
%if &Prio=An %then %do;
(
%if &&AdrAn&StartAn. = &&AdrAn&EndeAn. %then &&AdrAn&StartAn.;
%else &&AdrAn&StartAn. - &&AdrAn&EndeAn.;
)
%end;
%else %if &Prio = CC %then %do;
(
%if &&AdrAn&StartAn. = &&AdrAn&EndeAn. %then &&AdrAn&StartAn.;
%else &&AdrAn&StartAn. - &&AdrAn&EndeAn.;
)
%end;
%mend aufruf;
/******************************************/
/* Absendername fuer den Grusstext aus */
/* Globaler SAS-EG-Macrovariable "User" */
/* mit Excel-Absenderliste abgleichen */
/******************************************/
PROC IMPORT
DATAFILE="&pfadverteiler.verteiler_&JJ.&MM."
OUT= work.Absender
DBMS=Excel2000 REPLACE;
Sheet="Absender";
RUN;
Data _NULL_;
set work.Absender (where =(ComsiID = "&User"));
CALL SYMPUT("Send1",Vorname);
CALL SYMPUT("Send2",Name);
run;
/***************************************************************************/
/* Empfaenger, Absender, Text und Attachements fuer Mailversand uebergeben */
/***************************************************************************/
filename outbox email "&Send1..&Send2.@Firma.com";
data _null_;
file outbox
/* Overrides value in filename statement */
to= %aufruf (Prio=An)
cc= %aufruf (Prio=CC)
type="text/html"
subject="Test Mailversand aus SAS EG 9.1.3 &Mname &Jahr."
attach=("&pfadgfr.&Testxls."
"&pfadgfr.&Testpdf."
;
PUT "Sehr geehrte Damen und Herren,";
PUT "&send1. &send2.";
PUT "Mail generiert von &_CLIENTAPP - Programm &_CLIENTTASKLABEL am %SYSFUNC(DATE(), EURDFDE9.) um %SYSFUNC(TIME(), TIME5.)";
run;
%put _global_ ;
- Anmelden oder Registrieren um Kommentare zu schreiben

Da war ich wohl zu euphorisch...
Das oben abgebildete Programm ist nicht die endgültige Version und funktioniert nur beim Test mit einer Mailadresse, bei mehreren Empfängern nicht!
Sorry, nun die richtige Version:
/* Excel-/PDF-File per SAS-Programm an in Excel definierten Mailverteiler versenden */
/* erstellt: Friederike Grohmann, 06.07.2009, SAS EG 9.1.3 */
/*******************************************************************************************/
/************************************/
/* Upload-xls-Sheet Mailverteiler */
/************************************/
PROC IMPORT
DATAFILE="&pfadverteiler.verteiler_&JJ.&MM."
OUT= work.gfr
DBMS=Excel2000 REPLACE;
Sheet="GFR";
RUN;
Data GFRAN
GFRCC;
set gfr;
if compress(Prio) = "An" then output GFRAN;
else if compress(Prio) = "CC" then output GFRCC;
run;
/********************************************************************/
/* Macrodefinition (nach Selektion des Verteilers gemaess Angabe): */
/* Ermitteln ersten und letzten Datensatz des An- bzw. CC-Verteiler */
/* Numerische Variable fuer Macro definieren */
/* Mailadresse mit Anfuehrungszeichen definieren */
/* Alle Mailadressen in Macrovariablen aendern */
/* (AdrAn1 AdrAn2 bzw. AdrCC1 AdrCC2 ...) */
/********************************************************************/
Data GFRAN;
set GFRAN;
Nr = compress(_N_);
Adr = compress('"'!!Mailadresse!!'"');
run;
proc sort data=GFRAN; by Verteiler Prio Nr Mailadresse;
run;
Data _NULL_;
set GFRAN;
by Verteiler Prio;
if first.Prio then CALL SYMPUT ("StartAn",Nr);
if last.Prio then CALL SYMPUT ("EndeAn",Nr);
run;
proc sql noprint;
select adr into :AdrAn&StartAn. - :AdrAn&EndeAn. from work.GFRAN;
quit;
Data GFRCC;
set GFRCC;
Nr = compress(_N_);
Adr = compress('"'!!Mailadresse!!'"');
run;
proc sort data=GFRCC; by Verteiler Prio Nr Mailadresse;
run;
Data _NULL_;
set GFRCC;
by Verteiler Prio;
if first.Prio then CALL SYMPUT ("StartCC",Nr);
if last.Prio then CALL SYMPUT ("EndeCC",Nr);
run;
proc sql noprint;
select adr into :AdrCC&StartCC. - :AdrCC&EndeCC. from GFRCC;
quit;
%put _all_;
%macro aufruf (Prio= );
%if &Prio=An %then
%do;
%if &&AdrAn&StartAn. = &&AdrAn&EndeAn. %then
%do;
(
&&AdrAn&StartAn.;
)
%end;
%else
(
%do i= %sysfunc(putn(&StartAn,8.)) %to %sysfunc(putn(&EndeAn,8.));
&&AdrAn&i.
%end;
)
%end;
%else %if &Prio = CC %then
%do;
%if &&AdrAn&StartCC. = &&AdrAn&EndeCC. %then
%do;
(
&&AdrAn&StartCC.
)
%end;
%else
(
%do i= %sysfunc(putn(&StartCC,8.)) %to %sysfunc(putn(&EndeCC,8.));
&&AdrCC&i.
%end;
)
%end;
%mend aufruf;
/******************************************/
/* Absendername fuer den Grusstext aus */
/* Globaler SAS-EG-Macrovariable "User" */
/* mit Excel-Absenderliste abgleichen */
/******************************************/
PROC IMPORT
DATAFILE="&pfadverteiler.verteiler_&JJ.&MM."
OUT= work.Absender
DBMS=Excel2000 REPLACE;
Sheet="Absender";
RUN;
Data _NULL_;
set work.Absender (where =(ComsiID = "&User"));
CALL SYMPUT("Send1",Vorname);
CALL SYMPUT("Send2",Name);
run;
/***************************************************************************/
/* Empfaenger, Absender, Text und Attachements fuer Mailversand uebergeben */
/***************************************************************************/
filename outbox email "&Send1..&Send2.@firma.com";
data _null_;
file outbox
/* Overrides value in filename statement */
to= %aufruf (Prio=An)
cc= %aufruf (Prio=CC)
type="text/html"
subject="TEST: Weißbuch-Daten Neue Commerzbank (mit Dresdner Bank): EL, LaD, EaD und Cvar nach GFR &Mname &Jahr."
attach=("&pfadgfr.&GFRsheetxls."
"&pfadgfr.&GFRsheetpdf.")
;
PUT "Sehr geehrte Damen und Herren,";
PUT " ";
PUT " ";
PUT "im Anhang finden Sie...";
PUT " ";
PUT "Bitte behandeln Sie die Daten und Informationen wie immer vertraulich.";
PUT " ";
PUT " ";
PUT "Mit freundlichen Grüßen,";
PUT " ";
PUT "&send1. &send2.";
PUT " ";
PUT " ";
PUT " ";
PUT "Mail generiert von &_CLIENTAPP - Programm &_CLIENTTASKLABEL am %SYSFUNC(DATE(), EURDFDE9.) um %SYSFUNC(TIME(), TIME5.)";
run;
%put _global_ ;
Erster Datastep
Guten Morgen,
wenn Sie ihren Code in ein Makro kapseln wollen, um Mail's an verschiedene Verteiler zu senden, können Sie den ersten Datastep in Ihrem Code anpassen:
set gfr(where=(Verteiler="&Verteiler.")) ;
if compress(Prio) = "An" then output GFRAN;
else if compress(Prio) = "CC" then output GFRCC;
run;
Ausserdem könnten Sie den gesamten Code noch etwas kürzen, indem Sie die Mail-Empfänger statt in viele verschiedene Makrovariablen nur in jeweils eine für An und CC übergeben.
select distinct adr into :AdrAn separated by ';'
from work.GFR
where compress(Prio) = "An" and Verteiler="&Verteiler."
;
quit ;
Mit den besten Grüßen
Lutz Ritter