BookmarkSubscribeRSS Feed
Cristina_inet
Fluorite | Level 6

Good afternoon,
we are coding in SAS to generate a table of contents.
We are trying it with

PDF FILE="/home/test_toc.pdf" CONTENTS=YES ;

and adding

ODS PROCLABEL="Proc Label 1" ;

but somewhere in the code it exits and not everything is executed.
Do you know any other way to be able to generate a table of contents in PDF?
Thank you so much!

1 REPLY 1
Ksharp
Super User

The following is the code I wrote before to generate a PDF version of define.xml . Hope could help you a little bit.

 

%let path=%sysfunc(prxchange(s/[^\\]+$//,1,%sysget(SAS_EXECFILEPATH))); 
options orientation=landscape validvarname=any varlenchk=nowarn nonumber nodate  ; *nocenter;


/*原始数据库 的路径*/
libname data v9 "&path.SAS" access=readonly;

/*研究标识*/
%let study_id= C20LBE003;

/*第一页的title*/
%let title= 奥美拉唑胶囊-非CDISC标准原始数据库 ;

/*版本*/
%let version= 01.1 / 2020-11-12  ;











/*导入 附加 的数据说明 - 结构 , 来源 , 外部词典*/
proc import datafile="&path.数据说明.xlsx" out=add_table dbms=xlsx replace;
sheet='表单';
run;
proc import datafile="&path.数据说明.xlsx" out=add_var dbms=xlsx replace;
sheet='变量';
run;
proc import datafile="&path.数据说明.xlsx" out=add_dictionary dbms=xlsx replace;
sheet='外部词典';
run;

/*产生字典表*/
proc sql;
create table define_xml_tables as
select a.*,b.基本结构描述 ,1 as _id_ from  /*产生 _id_ 变量,用于去掉 书签'表1'*/
(
select memname,memlabel
 from dictionary.tables
  where libname='DATA' and memname ne 'CODELIST'
) as a left join add_table as b 
   on a.memname=b.数据集名
    order by 1;

create table define_xml_columns as
select a.*,b.来源 label='来源/方法/注释',1 as _id_ from   /*产生 _id_ 变量,用于去掉 书签'表1'*/
(
select memname ,name label='变量',label label='标签/描述',type label='类型',length label='长度或显示格式',varnum label='变量序号'
 from dictionary.columns
  where libname='DATA'
) as a left join add_var as b
   on a.memname=b.数据集名 and a.name=b.变量名
    order by 1,2;
quit;


/*处理 Code List, 一个变量 对应 一行*/
proc sort data=data.codelist out=codelist  ;by DS FIELD;run;
data codelist_1;
do until(last.FIELD);
 set codelist;
 by DS FIELD;
 length dictionary $ 400;
 dictionary=catx(',',dictionary,cats('"',value,'"="',TEXT,'"'));
end;
keep DS FIELD dictionary;
label dictionary='受控术语或ISO格式';
run;
/*将 CodeList 拼进 字典表 define_xml_columns*/
data define_xml_columns_1;
 merge define_xml_columns(in=ina) codelist_1(rename=(ds=memname FIELD=name));
 by memname name;
 if ina ;
run;
proc sort data=define_xml_columns_1 sortseq=linguistic(numeric_collation=on); by memname varnum;run;
proc sort data=codelist sortseq=linguistic(numeric_collation=on); by DS FIELD;run;
/* 取有 值的 CodeList*/
data codelist_2;
 set  define_xml_columns_1 ;
 if not missing(dictionary);
run;


/*添加 '位置' 列*/
data define_xml_tables;
 set define_xml_tables;
length position $ 40 ;
memname=lowcase(memname);
position=cats(memname,'.xpt');
label position='位置';
run;
/*产生 _id_ 变量,用于去掉 书签'表1'*/
data codelist;
 set codelist;
 _id_=1;
run;
/*产生 _id_ 变量,用于去掉 书签'表1'*/
data add_dictionary;
 set add_dictionary;
 _id_=1;
run;



ods _all_ close;
ods pdf  file="&path.define_xml.pdf"  style=sasweb ;

footnote j=l "版本: &version " j=r '(*ESC*){thispage} / (*ESC*){lastpage}';

title j=l "&title" j=r "研究标识: &study_id";
ods proclabel= "&title" ;
/*打印 第一张 表*/
proc report data=define_xml_tables(where=(memname is not missing)) nowd contents='' split='*'  style(report)={outputwidth=100% rules=all};
define memname/display '数据集';
define memlabel/display '描述';
define _id_/order noprint;
compute memlabel;
rtag = "#"||strip(memname);
call define(_col_,'url',rtag);
call define(_col_,'style','style={foreground=blue}');
n+1;
if mod(n,2)=1 then call define(_row_,'style','style={background=verylightgrey}');
endcomp;

compute position;
call define(_col_,'url',".\厦门恩成- 艾司奥美拉唑镁碳酸氢钠胶囊-非CDISC标准原始数据库-20201123\3.原始数据库\XPT\");
call define(_col_,'style','style={foreground=blue}');
endcomp;

break before _id_/page contents='';
run;
/*打印 各表结构*/
data _null_;
 set define_xml_tables(where=(memname is not missing));
 call execute(catt('ods pdf anchor="',strip(memname),'" startpage=now ;
                    ods proclabel="',memlabel,'";
                    title j=l "',memlabel,'" j=r "研究标识: &study_id";',
                  'proc report data=define_xml_columns_1( where=(memname="',upcase(memname),'")) nowd split="*" contents="" 
                     style(report)={outputwidth=100% rules=all}
                     style(header)={font_weight=bold} ;
					 columns memname name label type length dictionary 来源 _id_;
                     define memname/display noprint;
					 define _id_/order noprint;
					 compute dictionary;
                      rtag = "#"||strip(name);
                      call define(_col_,"url",rtag);
                      call define(_col_,"style","style={foreground=blue}");
					  n+1;
                      if mod(n,2)=1 then call define(_row_,"style","style={background=verylightgrey}");
                     endcomp;
					 break before _id_/page contents="";
                   run;title " "; ' ));
run;
/*打印 控制项 Code List*/
data _null_;
 set codelist_2(where=(memname is not missing));
 call execute(catt('ods pdf anchor="',strip(name),'" startpage=now;
                    ods proclabel="',label,'";
                    title j=l "',label,'" j=r "研究标识: &study_id";',
                  'proc report data=codelist( where=(DS="',upcase(memname),'" and FIELD="',upcase(name),'")) nowd split="*" contents="" 
                   style(report)={outputwidth=100% rules=all}
                   style(header)={font_weight=bold} ;
				   define ds/display noprint;
				   define FIELD/display noprint;
				   define value/display "允许值(代码)";
				   define text/display "显示值(解码)";
				   define _id_/order noprint;
				   compute ds;
                     n+1;
                     if mod(n,2)=1 then call define(_row_,"style","style={background=verylightgrey}");
				   endcomp;
				   break before _id_/page contents="";
                   run; title " "; ' ));  /* 或者 title; */
run;
/*打印 外部词典*/
title j=l "外部词典" j=r "研究标识: &study_id";
ods proclabel= "外部词典" ;
proc report data=add_dictionary(where=(参考名称 is not missing)) nowd contents='' split='*'  style(report)={outputwidth=100% rules=all};
define _id_/order noprint;
break before _id_/page contents=''; /*去掉左边标签*/
run;
title ' ';
ods pdf close;

Ksharp_0-1687262100667.png

 

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 1 reply
  • 218 views
  • 0 likes
  • 2 in conversation