/* Specify your metadata folder here.  This is the folder that     */
/* contains the information map definitions                        */
%let folder = /Shared Data/Maps;

/* Specify the name of the information map for which you want the  */
/* detailed report.                                                */
%let mapName = Cars;

/* SYSECHO: when this program is run within SAS Enterprise Guide,  */
/* the sysecho statements show more detailed information within    */
/* the task status list.                                           */
sysecho "Assigning library for information map";

/* NOTE: when using this LIBNAME statement in a batch environment,  */
/* you might need to add metadata host and credentials information. */
/* When running from SAS Enterprise Guide, it should not be         */
/* necessary; your metadata identity will be used automatically.    */
/* Note that the report will contain only those Information Maps    */
/* for which you have Read access permissions.                      */
libname imaps infomaps 
  
mappath="&folder"
  
aggregate=yes
  
/* use already-established metadata connection */
  metacredentials=no
  
/* uncomment the following if running in batch/DMS */
  
/*****************   
  host=metadatahost.com
  port=8561
  user=yourId
  pw="yourPassword"
  ******************/

  
PRESERVE_MAP_NAMES=YES;

footnote;
/* Report of information maps in the selected folder */
proc print data=sashelp.vinfomp noobs label;
  
var mapname description;
  label mapname = "Name" description = "Description";
  
title "Information Maps in &folder";
run;

title;

proc sql noprint;
  
sysecho "Discovering information map member name";
  
SELECT imap.memname into :_im_memname
    
from dictionary.infomaps as imap
      
where imap.mapname="%trim(%superq(mapName))";
  
sysecho "Gathering information map data items";
  
create table ITEMS as 
    
SELECT  d.dataitemname, d.name, d.id, d.path, d.description, c.label, d.class, c.type, c.length, c.format, c.informat, c.npos  
      
FROM dictionary.dataitems as d, dictionary.columns as c
        
WHERE (d.libname=c.libname and d.memname=c.memname and c.name=d.name) 
          and (d.libname =
"IMAPS" and d.memname="%trim(%superq(_im_memname))")
          and (d.isusable=
"YES")
        
ORDER BY c.npos;
  sysecho "Gathering information map filters";
  
create table FILTERS as 
    
SELECT f.filtername, f.name, f.id, f.path, f.description, f.promptusage, f.usagepromptid
      
FROM dictionary.filters as f 
        
WHERE libname ="IMAPS" and memname="%trim(%superq(_im_memname))";
  
sysecho "Gathering information map prompts";
  
create table scratch_ALLPROMPTS as 
    
SELECT p.id, p.promptname, p.name, p.description, p.type, p.dependentpid, x.order
      
FROM dictionary.prompts as p, dictionary.promptsxml as x
        
WHERE p.libname ="IMAPS" and p.memname="%trim(%superq(_im_memname))"
          and (p.id = x.id)
          and (p.memname=x.memname)
        
ORDER BY p.id, x.order ASC;
  
create table PROMPTS as 
    
SELECT f.name as filterid, p.id, p.dependentpid, p.promptname, p.name, p.description, p.type, p.order 
      
FROM scratch_ALLPROMPTS as p, FILTERS as f
        
WHERE (f.usagepromptid = p.id)
          
ORDER BY f.name, p.id, p.order ASC;
  
create table STPPROMPTS as 
    
SELECT p.id, p.promptname, p.name, p.description, p.type, p.order
      
FROM scratch_ALLPROMPTS as p FULL JOIN PROMPTS as fp on (p.id = fp.id)
        
WHERE fp.id IS MISSING;
  drop table scratch_ALLPROMPTS;
quit;

/* Report on Data items in a single Information Map */
proc report data=items nowd;
  
title "Data items in &folder./&mapName";
  
column path dataitemname name description class format;
  define path / group 'Path' missing;
  
define dataitemname / group 'Display name' missing;
  
compute dataitemname;
    if dataitemname ne ' ' then
      hold1=dataitemname;
    if dataitemname eq ' ' then
      dataitemname=hold1;
  endcomp;
  
define name / group 'Syntax Name' missing;
  
compute name;
    if name ne ' ' then
      hold2=name;
    if name eq ' ' then
      name=hold2;
  endcomp;
  
define description / group 'Description' missing;
  
compute description;
    if description ne ' ' then
      hold3=description;
    if description eq ' ' then
      description=hold3;
  endcomp;
  
define class / group 'Type' missing;
  
compute class;
    if class ne ' ' then
      hold4=class;
    if class eq ' ' then
      class=hold4;
  endcomp;
  
define format / group 'Format' missing;
  
compute format;
    if format ne ' ' then
      hold5=format;
    if format eq ' ' then
      format=hold5;
  endcomp;
run;

quit;

proc report data=filters nowd;
  
title "Filters in &folder./&mapName";
  
column path filtername name description promptusage;
  define path / group 'Path' missing;
  
define filtername / group 'Display name' missing;
  
compute filtername;
    if filtername ne ' ' then
      hold2=filtername;
    if filtername eq ' ' then
      filtername=hold2;
  endcomp;
  
define name / group 'Syntax name' missing;
  
compute name;
    if name ne ' ' then
      hold3=name;
    if name eq ' ' then
      name=hold3;
  endcomp;
  
define description / group 'Description' missing;
  
compute description;
    if description ne ' ' then
      hold4=description;
    if description eq ' ' then
      description=hold4;
  endcomp;
  
define promptusage / group 'Uses prompts?' missing;
  
compute promptusage;
    if promptusage ne ' ' then
      hold5=promptusage;
    if promptusage eq ' ' then
      promptusage=hold5;
  endcomp;
run;

quit;

proc print data=stpprompts noobs label;
  
title "Stored process prompts in &folder./&mapName";
  
var promptname description;
  label promptname="Prompt name" description="Description";
run;

title;

/* clear the libname when complete */
libname imaps clear;