31 %macro mp_ds2cards(base_ds=, tgt_ds=
    32     ,cards_file=
"%sysfunc(pathname(work))/cardgen.sas"    40 %
if not %sysfunc(exist(&base_ds)) %then %
do;
    41    %put WARNING:  &base_ds does not exist;
    45 %
if %index(&base_ds,.)=0 %then %let base_ds=WORK.&base_ds;
    46 %
if (&tgt_ds = ) %then %let tgt_ds=&base_ds;
    47 %
if %index(&tgt_ds,.)=0 %then %let tgt_ds=WORK.%scan(&base_ds,2,.);
    48 %
if (
"&outencoding" ne 
"") %then %let outencoding=encoding=
"&outencoding";
    53 select count(*) into: nvars from dictionary.columns
    54   where libname="%scan(%upcase(&base_ds),1)"
    55     and memname="%scan(%upcase(&base_ds),2)";
    56 %if &nvars=0 %then %do;
    57   %put WARNING:  Dataset &base_ds has no variables!  It will not be converted.;
    65 %if %datatyp(&maxobs)=NUMERIC %then %do;
    69   create table &setds as select * from &base_ds
    70 %if &random_sample=YES %then %do;
    76 create table datalines1 as
    77    select name,type,length,varnum,format,label from dictionary.columns
    78    where libname="%upcase(%scan(&base_ds,1))"
    79     and memname="%upcase(%scan(&base_ds,2))";
    92   format dataline $32000.;
    93  set datalines1 (where=(upcase(name) not in
    94     ('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM')));
    95   if type='num' then dataline=
    96     cats('ifc(
int(',name,')=',name,'
    97       ,put(',name,',best32.)
    98       ,substrn(put(',name,',bestd32.),1
    99       ,findc(put(',name,',bestd32.),"0","TBK")))');
   100   else dataline=cats('strip(',name,')') ;
   104 select dataline into: datalines separated by ',' from datalines_2;
   111 %let process_dttm_flg = N;
   112 %let valid_from_dttm_flg = N;
   113 %let valid_to_dttm_flg = N;
   117   if type='
char' then type2='$';
   118   if strip(format) ne '' then format2=cats('format=',format);
   119   if strip(label) ne '' then label2=cats('label=',quote(trim(label)));
   120   str1=catx(' ',(put(name,$33.)||'length=')
   121         ,put(cats(type2,length),$7.)||format2,label2);
   125   if type='
char' then type3=':$char.';
   126   str2=put(name,$33.)||type3;
   129   if(upcase(name) = "PROCESSED_DTTM") then
   130     call symputx("process_dttm_flg", "Y", "L");
   131   if(upcase(name) = "VALID_FROM_DTTM") then
   132     call symputx("valid_from_dttm_flg", "Y", "L");
   133   if(upcase(name) = "VALID_TO_DTTM") then
   134     call symputx("valid_to_dttm_flg", "Y", "L");
   137   call symputx(cats("attrib_stmt_", put(_N_, 8.)), str1, "L");
   138   call symputx(cats("input_stmt_", put(_N_, 8.))
   139     , ifc(upcase(name) not in
   140       ('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM'), str2, ""), "L");
   144   file &cards_file. &outencoding lrecl=32767 termstr=nl;
   145   length __attrib $32767;
   152     put "data &tgt_ds ;";
   154     %do i = 1 %to &nvars;
   155       __attrib=symget("attrib_stmt_&i");
   160     %if &process_dttm_flg. eq Y %then %do;
   161       put 'retain PROCESSED_DTTM %sysfunc(datetime());';
   163     %if &valid_from_dttm_flg. eq Y %then %do;
   164       put 'retain VALID_FROM_DTTM &low_date;';
   166     %if &valid_to_dttm_flg. eq Y %then %do;
   167       put 'retain VALID_TO_DTTM &high_date;';
   170       put 'call missing(of _all_);';
   175       put "infile cards dsd delimiter=',';";
   177       %do i = 1 %to &nvars.;
   178         %if(%length(&&input_stmt_&i..)) %then
   179            put "   &&input_stmt_&i..";
   186   set &setds end=__lastobs nobs=__nobs;
   188   format _numeric_ best30.29;
   189   length __dataline $32767;
   190   __dataline=catq('cqsm',&datalines);
   192   if __lastobs then do;
   202 %if &showlog=YES %then %do;
   204     infile &cards_file lrecl=32767;
   210 %put NOTE: CARDS FILE SAVED IN:;
   211 %put NOTE-;%put NOTE-;
   212 %put NOTE- %sysfunc(dequote(&cards_file.));
   213 %put NOTE-;%put NOTE-;