| 1 | RORXU002 ;HCIOFO/SG - REPORT BUILDER UTILITIES ; 5/18/06 11:13am
 | 
|---|
| 2 |  ;;1.5;CLINICAL CASE REGISTRIES;**1**;Feb 17, 2006;Build 24
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  Q
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ;***** SCANS THE TABLE DEFINITION (RORSRC) FOR COLUMN NAMES
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ; .TERM         Reference to a local variable where
 | 
|---|
| 9 |  ;               is terminator is returned
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ; Return Values:
 | 
|---|
| 12 |  ;       ""  End of definition
 | 
|---|
| 13 |  ;      ...  Name of the column
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 | COLSCAN(TERM) ;
 | 
|---|
| 16 |  N CH,I,TOKEN
 | 
|---|
| 17 |  F I=1:1  S TERM=$E(RORSRC,I)  Q:"(,)"[TERM
 | 
|---|
| 18 |  S TOKEN=$E(RORSRC,1,I-1)
 | 
|---|
| 19 |  F I=I+1:1  S CH=$E(RORSRC,I)  Q:(CH="")!("(,)"'[CH)
 | 
|---|
| 20 |  S $E(RORSRC,1,I-1)=""
 | 
|---|
| 21 |  Q TOKEN
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 |  ;***** CHECKS THE FILEMAN DATE/TIME VALUE
 | 
|---|
| 24 | DATE(DT) ;
 | 
|---|
| 25 |  Q $S(DT>0:+DT,1:"")
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  ;***** OUTPUTS THE BASIC HEADER TO THE REPORT
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  ; .RORTSK       Task number and task parameters
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  ; PARTAG        Reference (IEN) to the parent tag
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  ; Return Values:
 | 
|---|
| 34 |  ;       <0  Error code
 | 
|---|
| 35 |  ;       >0  IEN of the HEADER element
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 | HEADER(RORTSK,PARTAG) ;
 | 
|---|
| 38 |  N HEADER,IENS,REGIEN,RORBUF,RORMSG,TMP
 | 
|---|
| 39 |  S HEADER=$$ADDVAL^RORTSK11(RORTSK,"HEADER",,PARTAG)
 | 
|---|
| 40 |  Q:HEADER<0 HEADER
 | 
|---|
| 41 |  D ADDVAL^RORTSK11(RORTSK,"DATE",$$DATE($$NOW^XLFDT),HEADER)
 | 
|---|
| 42 |  D ADDVAL^RORTSK11(RORTSK,"TASK_NUMBER",RORTSK,HEADER)
 | 
|---|
| 43 |  S REGIEN=+$$PARAM^RORTSK01("REGIEN")
 | 
|---|
| 44 |  ;---
 | 
|---|
| 45 |  S IENS=REGIEN_","
 | 
|---|
| 46 |  D GETS^DIQ(798.1,IENS,"1;2","I","RORBUF","RORMSG")
 | 
|---|
| 47 |  Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.1,IENS)
 | 
|---|
| 48 |  S TMP=$G(RORBUF(798.1,IENS,1,"I"))
 | 
|---|
| 49 |  D ADDVAL^RORTSK11(RORTSK,"UPDATED_UNTIL",$$DATE(TMP),HEADER)
 | 
|---|
| 50 |  S TMP=$G(RORBUF(798.1,IENS,2,"I"))
 | 
|---|
| 51 |  D ADDVAL^RORTSK11(RORTSK,"EXTRACTED_UNTIL",$$DATE(TMP),HEADER)
 | 
|---|
| 52 |  Q HEADER
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ;***** PARSES THE COMMA-SEPARATED LIST
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  ; .LIST         Reference to a local variable that contains a list.
 | 
|---|
| 57 |  ;               Items of the list are returned as the subscripts of
 | 
|---|
| 58 |  ;               this variable.
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 | LIST(LIST) ;
 | 
|---|
| 61 |  N I,TMP,VAL
 | 
|---|
| 62 |  F I=1:1  S VAL=$P(LIST,",",I)  Q:VAL=""  D
 | 
|---|
| 63 |  . S TMP=$$TRIM^XLFSTR(VAL)
 | 
|---|
| 64 |  . S:TMP'="" LIST(TMP)=""
 | 
|---|
| 65 |  Q
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ;***** COMPILES A TEXT DESCRIPTION FOR THE REPORT OPTIONS
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ; .OPTIONS      Reference to a local variable containing
 | 
|---|
| 70 |  ;               the options as subscripts
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  ; [DLGNUM]      Number of the dialog that contains the template
 | 
|---|
| 73 |  ;               (7980000.018, by default).
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ; Return Values:
 | 
|---|
| 76 |  ;      ...  Text description of the options
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 | OPTXT(OPTIONS,DLGNUM) ;
 | 
|---|
| 79 |  N I,J,NS,RORBUF,TEXT,TMP
 | 
|---|
| 80 |  S:$G(DLGNUM)'>0 DLGNUM=7980000.018
 | 
|---|
| 81 |  D BLD^DIALOG(DLGNUM,,,"RORBUF")
 | 
|---|
| 82 |  S TEXT="",I=0
 | 
|---|
| 83 |  F  S I=$O(RORBUF(I))  Q:I=""  D:$E(RORBUF(I),1)'=" "
 | 
|---|
| 84 |  . S NS=0
 | 
|---|
| 85 |  . F J=1:1  S TMP=$TR($P(RORBUF(I),",",J)," ")  Q:TMP=""  D
 | 
|---|
| 86 |  . . S:$D(OPTIONS(TMP)) NS=2**(J-1)+NS
 | 
|---|
| 87 |  . Q:'NS
 | 
|---|
| 88 |  . S TMP=$$TRIM^XLFSTR($G(RORBUF(I+NS)))
 | 
|---|
| 89 |  . S:TMP'="" TEXT=TEXT_", "_TMP
 | 
|---|
| 90 |  Q $P(TEXT,", ",2,999)
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ;***** OUTPUTS THE PARAMETERS TO THE REPORT
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  ; .RORTSK       Task number and task parameters
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 |  ; PARTAG        Reference (IEN) to the parent tag
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 |  ; .STDT         Start and end dates of the report
 | 
|---|
| 99 |  ; .ENDT         are returned via these parameters
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 |  ; [.FLAGS]      Flags for the $$SKIP^RORXU005 are returned via this
 | 
|---|
| 102 |  ;               parameter. The "D" (skip deceased patients) and "G"
 | 
|---|
| 103 |  ;               (skip pending patients) flags are always added.
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 |  ; Return Values:
 | 
|---|
| 106 |  ;       <0  Error code
 | 
|---|
| 107 |  ;       >0  IEN of the PARAMETERS element
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 | PARAMS(RORTSK,PARTAG,STDT,ENDT,FLAGS) ;
 | 
|---|
| 110 |  N BUF,ELEMENT,I,LTAG,MODE,NAME,PARAMS,RC,REGIEN,RORMSG,TMP
 | 
|---|
| 111 |  S PARAMS=$$ADDVAL^RORTSK11(RORTSK,"PARAMETERS",,PARTAG)
 | 
|---|
| 112 |  S RC=0,(ENDT,STDT)="",FLAGS=""
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 |  ;=== Registry name
 | 
|---|
| 115 |  S REGIEN=+$$PARAM^RORTSK01("REGIEN")
 | 
|---|
| 116 |  I REGIEN>0  D  Q:RC<0 RC
 | 
|---|
| 117 |  . S TMP=$P($$REGNAME^RORUTL01(REGIEN),U)
 | 
|---|
| 118 |  . I TMP=""  S RC=-1  Q
 | 
|---|
| 119 |  . S RC=$$ADDVAL^RORTSK11(RORTSK,"REGNAME",TMP,PARAMS)
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 |  ;=== Alternate date ranges
 | 
|---|
| 122 |  F I=2:1:3  D  Q:RC<0
 | 
|---|
| 123 |  . S STDT=$$PARAM^RORTSK01("DATE_RANGE_"_I,"START")\1  Q:STDT'>0
 | 
|---|
| 124 |  . S ENDT=$$PARAM^RORTSK01("DATE_RANGE_"_I,"END")\1    Q:ENDT'>0
 | 
|---|
| 125 |  . S ELEMENT=$$ADDVAL^RORTSK11(RORTSK,"DATE_RANGE_"_I,,PARAMS)
 | 
|---|
| 126 |  . I ELEMENT<0  S RC=+ELEMENT  Q
 | 
|---|
| 127 |  . S RC=$$ADDATTR^RORTSK11(RORTSK,ELEMENT,"START",STDT)  Q:RC<0
 | 
|---|
| 128 |  . S RC=$$ADDATTR^RORTSK11(RORTSK,ELEMENT,"END",ENDT)
 | 
|---|
| 129 |  Q:RC<0 RC
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  ;=== Main date range
 | 
|---|
| 132 |  S STDT=$$PARAM^RORTSK01("DATE_RANGE","START")\1
 | 
|---|
| 133 |  S ENDT=$$PARAM^RORTSK01("DATE_RANGE","END")\1
 | 
|---|
| 134 |  I STDT>0,ENDT>0  D  Q:RC<0 RC
 | 
|---|
| 135 |  . S ELEMENT=$$ADDVAL^RORTSK11(RORTSK,"DATE_RANGE",,PARAMS)
 | 
|---|
| 136 |  . I ELEMENT<0  S RC=+ELEMENT  Q
 | 
|---|
| 137 |  . S RC=$$ADDATTR^RORTSK11(RORTSK,ELEMENT,"START",STDT)  Q:RC<0
 | 
|---|
| 138 |  . S RC=$$ADDATTR^RORTSK11(RORTSK,ELEMENT,"END",ENDT)
 | 
|---|
| 139 |  E  S (ENDT,STDT)=""
 | 
|---|
| 140 |  ;
 | 
|---|
| 141 |  ;=== Task comment
 | 
|---|
| 142 |  S TMP=$$PARAM^RORTSK01("TASK_COMMENT")
 | 
|---|
| 143 |  D:TMP'="" ADDVAL^RORTSK11(RORTSK,"TASK_COMMENT",TMP,PARAMS)
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  ;=== Patient selection and Options
 | 
|---|
| 146 |  F NAME="PATIENTS","OPTIONS"  D  Q:RC<0
 | 
|---|
| 147 |  . K BUF  M BUF=RORTSK("PARAMS",NAME,"A")  Q:$D(BUF)<10
 | 
|---|
| 148 |  . ;--- Generate the XML tags
 | 
|---|
| 149 |  . S ELEMENT=$$ADDVAL^RORTSK11(RORTSK,NAME,$$OPTXT(.BUF),PARAMS)
 | 
|---|
| 150 |  . I ELEMENT'>0  S RC=ELEMENT  Q
 | 
|---|
| 151 |  . S TMP=""
 | 
|---|
| 152 |  . F  S TMP=$O(BUF(TMP))  Q:TMP=""  D  Q:RC<0
 | 
|---|
| 153 |  . . S RC=$$ADDATTR^RORTSK11(RORTSK,ELEMENT,TMP,"1")
 | 
|---|
| 154 |  . ;--- Compile the flags
 | 
|---|
| 155 |  . D:NAME="PATIENTS"
 | 
|---|
| 156 |  . . S:'$D(BUF("DE_BEFORE")) FLAGS=FLAGS_"P"
 | 
|---|
| 157 |  . . S:'$D(BUF("DE_DURING")) FLAGS=FLAGS_"N"
 | 
|---|
| 158 |  . . S:'$D(BUF("DE_AFTER")) FLAGS=FLAGS_"F"
 | 
|---|
| 159 |  Q:RC<0 RC
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 |  ;=== Other Registries
 | 
|---|
| 162 |  I $D(RORTSK("PARAMS","OTHER_REGISTRIES","C"))>1  D  Q:RC<0 RC
 | 
|---|
| 163 |  . N NODE,REGIEN
 | 
|---|
| 164 |  . S LTAG=$$ADDVAL^RORTSK11(RORTSK,"OTHER_REGISTRIES",,PARAMS)
 | 
|---|
| 165 |  . I LTAG<0  S RC=+LTAG  Q
 | 
|---|
| 166 |  . S NODE=$NA(RORTSK("PARAMS","OTHER_REGISTRIES","C"))
 | 
|---|
| 167 |  . S REGIEN=0
 | 
|---|
| 168 |  . F  S REGIEN=$O(@NODE@(REGIEN))  Q:REGIEN'>0  D  Q:RC<0
 | 
|---|
| 169 |  . . S TMP=$P($$REGNAME^RORUTL01(REGIEN),U,2)
 | 
|---|
| 170 |  . . S MODE=+$G(@NODE@(REGIEN))
 | 
|---|
| 171 |  . . I 'MODE!(TMP="")  K @NODE@(REGIEN)  Q
 | 
|---|
| 172 |  . . S TMP=TMP_" ("_$S(MODE<0:"Exclude",1:"Include")_")"
 | 
|---|
| 173 |  . . S RC=$$ADDVAL^RORTSK11(RORTSK,"REGNAME",TMP,LTAG)
 | 
|---|
| 174 |  . S FLAGS=FLAGS_"R"
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  ;=== Local Fields
 | 
|---|
| 177 |  I $D(RORTSK("PARAMS","LOCAL_FIELDS","C"))>1  D  Q:RC<0 RC
 | 
|---|
| 178 |  . N NODE,IEN,IENS
 | 
|---|
| 179 |  . S LTAG=$$ADDVAL^RORTSK11(RORTSK,"LOCAL_FIELDS",,PARAMS)
 | 
|---|
| 180 |  . I LTAG<0  S RC=+LTAG  Q
 | 
|---|
| 181 |  . S NODE=$NA(RORTSK("PARAMS","LOCAL_FIELDS","C"))
 | 
|---|
| 182 |  . S IEN=0
 | 
|---|
| 183 |  . F  S IEN=$O(@NODE@(IEN))  Q:IEN'>0  D  Q:RC<0
 | 
|---|
| 184 |  . . S TMP=$$GET1^DIQ(799.53,IEN_",",.01,,,"RORMSG")
 | 
|---|
| 185 |  . . D:$G(DIERR) DBS^RORERR("RORMSG",-9,,,799.53,IEN_",")
 | 
|---|
| 186 |  . . S MODE=+$G(@NODE@(IEN))
 | 
|---|
| 187 |  . . I 'MODE!(TMP="")  K @NODE@(IEN)  Q
 | 
|---|
| 188 |  . . S TMP=TMP_" ("_$S(MODE<0:"Exclude",1:"Include")_")"
 | 
|---|
| 189 |  . . S RC=$$ADDVAL^RORTSK11(RORTSK,"FIELD",TMP,LTAG)
 | 
|---|
| 190 |  . S FLAGS=FLAGS_"O"
 | 
|---|
| 191 |  ;
 | 
|---|
| 192 |  ;=== Lab test ranges
 | 
|---|
| 193 |  I $D(RORTSK("PARAMS","LRGRANGES","C"))>1  D  Q:RC<0 RC
 | 
|---|
| 194 |  . N GRC,NODE
 | 
|---|
| 195 |  . S NODE=$NA(RORTSK("PARAMS","LRGRANGES","C"))
 | 
|---|
| 196 |  . S GRC=0
 | 
|---|
| 197 |  . F  S GRC=$O(@NODE@(GRC))  Q:GRC'>0  D  Q:RC<0
 | 
|---|
| 198 |  . . S RC=$$ITEMIEN^RORUTL09(3,REGIEN,GRC,.TMP)
 | 
|---|
| 199 |  . . S:RC'<0 @NODE@(GRC)=TMP
 | 
|---|
| 200 |  ;
 | 
|---|
| 201 |  ;=== Defaults
 | 
|---|
| 202 |  S TMP=$TR(FLAGS,"FNP")  S:$L(FLAGS)-$L(TMP)=3 FLAGS=TMP
 | 
|---|
| 203 |  S FLAGS=FLAGS_"DG"
 | 
|---|
| 204 |  ;
 | 
|---|
| 205 |  ;=== Success
 | 
|---|
| 206 |  Q PARAMS
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 |  ;***** GENERATES TABLE DEFINITION
 | 
|---|
| 209 |  ;
 | 
|---|
| 210 |  ; TBLREF        Reference to the definition table in the source
 | 
|---|
| 211 |  ;               code (TAG^ROUTINE). See the HEADER^RORX013 for
 | 
|---|
| 212 |  ;               examples of table definitions.
 | 
|---|
| 213 |  ;
 | 
|---|
| 214 |  ; HEADER        IEN of the HEADER element
 | 
|---|
| 215 |  ;
 | 
|---|
| 216 |  ; Return Values:
 | 
|---|
| 217 |  ;       <0  Error code
 | 
|---|
| 218 |  ;        0  Ok
 | 
|---|
| 219 |  ;
 | 
|---|
| 220 | TBLDEF(TBLREF,HEADER) ;
 | 
|---|
| 221 |  N COND,IT,NAME,RC,RORSRC,TBLDEF,TERM,TGET
 | 
|---|
| 222 |  S TGET="S RORSRC=$T("_$P(TBLREF,"^")_"+IT^"_$P(TBLREF,"^",2)_")"
 | 
|---|
| 223 |  S RC=0
 | 
|---|
| 224 |  F IT=1:1  X TGET  S RORSRC=$P(RORSRC,";;",2)  Q:RORSRC=""  D  Q:RC<0
 | 
|---|
| 225 |  . S COND=$$TRIM^XLFSTR($P(RORSRC,U,2,999))
 | 
|---|
| 226 |  . I COND'=""  X COND  E  Q
 | 
|---|
| 227 |  . S RORSRC=$$TRIM^XLFSTR($P(RORSRC,U))
 | 
|---|
| 228 |  . S NAME=$$COLSCAN(.TERM)  Q:(NAME="")!(TERM'="(")
 | 
|---|
| 229 |  . S TBLDEF=$$ADDVAL^RORTSK11(RORTSK,"TBLDEF",,HEADER)
 | 
|---|
| 230 |  . I TBLDEF<0  S RC=TBLDEF  Q
 | 
|---|
| 231 |  . D ADDATTR^RORTSK11(RORTSK,TBLDEF,"NAME",NAME)
 | 
|---|
| 232 |  . D ADDATTR^RORTSK11(RORTSK,TBLDEF,"HEADER","1")
 | 
|---|
| 233 |  . D ADDATTR^RORTSK11(RORTSK,TBLDEF,"FOOTER","1")
 | 
|---|
| 234 |  . D TBLDEF1(TBLDEF)
 | 
|---|
| 235 |  Q $S(RC<0:RC,1:0)
 | 
|---|
| 236 |  ;
 | 
|---|
| 237 |  ;***** GENERATES <COLUMN> ELEMENTS FROM TABLE DEFINITION (RORSRC)
 | 
|---|
| 238 |  ;
 | 
|---|
| 239 |  ; PTAG          IEN of the parent element
 | 
|---|
| 240 |  ;
 | 
|---|
| 241 | TBLDEF1(PTAG) ;
 | 
|---|
| 242 |  N COLUMN,NAME,TERM
 | 
|---|
| 243 |  F  S NAME=$$COLSCAN(.TERM)  Q:NAME=""  D  Q:")"[TERM
 | 
|---|
| 244 |  . S COLUMN=$$ADDVAL^RORTSK11(RORTSK,"COLUMN",,PTAG)
 | 
|---|
| 245 |  . D ADDATTR^RORTSK11(RORTSK,COLUMN,"NAME",NAME)
 | 
|---|
| 246 |  . D:TERM="(" TBLDEF1(COLUMN)
 | 
|---|
| 247 |  Q
 | 
|---|