*!qlist.ado
*!WvP
*!2/2/00
*Quiet listing: no output if condition not satisfied
* nobs and nodis are the default in this listing.
*1/2001: data are eformatted before listing (within subset to list) to produce compact lists.
*24/1/2001 descr option added
*23/11/2004 noljust opion added and made version 8.0 compatible
*2/2/2006   rjust() option added
program define qlist
version 8.0
syntax [varlist] [if] [, Obs Dis Header(string) DEscr STars BY(string) PBreak BLank noLJust RJust(varlist)]
if "`obs'"==""      local obs noobs 
if "`varlist'" =="" local varlist  _all
local linesize : set linesize
quietly count `if'
if r(N)>0 {	
	if "`stars'"~=""  local stars **** 
	if `"`header'"'==""&`"`if'"'!="" local header **** `if'
	else if `"`header'"'=="."  local header `stars' 
	else local header `stars' `header' 
  if upper(`"`header'"')!="NO" & `"`header'"'~="" 	display  _n `"`header'"' 
 
	preserve
	if `"`if'"'!=""  quie keep `if' 
	eformat `varlist' , vn val lab
  
  *20/11/2004 First remove all variables in the by varlist that contain only missing values
  if "`by'"!="" {
    local byold `by'
    local by
    foreach var of varlist `byold' {
      local type : type `var'
      if index("`type'","str")>0 qui count if trim(`var')!=""
      else                       qui count if `var'!=.
      if r(N)>0 local by `by' `var'
    }  

    local alvars: list by | varlist
    local alvars : list uniq alvars
  }
  else local alvars : list uniq varlist
  
  if "`descr'`dis'"!=""  varlst `alvars' ,nohead 


  if "`ljust'"=="" qui ljust _all
  if "`rjust'"!="" qui rjust `rjust' 
  
  if "`by'"!="" {
    local sorted: sortedby
    local sort `by' 
    if "`sorted'"!="" {
      foreach var of varlist `sorted' {
        if index(" `sort' "," `var' ")==0  local sort `sort' `var'
      }
    }  
    sort `sort'   
*    local byby byvar2 `by' :  /* modified 20/5/2005 */
    local byby by `by' :  
  }

  capture clist `varlist' in 1
  if _rc==0 {
*  	`byby' clist `varlist'  ,`obs' nodis   /* uses the old list command with less spaces between columns */
  	`byby' list `varlist'  ,clean `obs' nodis linesize(`linesize')   /* uses the old list command with less spaces between columns */
  }
  else {	
  	capture `byby' list `varlist'  ,`obs' nodis notrim  linesize(`linesize')
  	if _rc==0 {
    	`byby' list `varlist'  ,`obs' nodis notrim linesize(`linesize')
  	}  
  	else {
    	`byby' list `varlist'  ,`obs' nodis  linesize(`linesize')
  	}  
  }
	restore
	if "`blank'"~="" di ""
	if "`pbreak'"~=""  pbreak 
}

end