| 1 | SCRPBK2 ;MJK/ALB - RPC Broker Utilities ; 27 FEB 96
 | 
|---|
| 2 |  ;;5.3;Scheduling;**41**;AUG 13, 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | SAVE(SCDATA,SCQDEF) ; -- save query definition
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ; -- SCDATA(0) -> <1 - success> ^ <new query ien> ^ <reload client>
 | 
|---|
| 7 |  ;              -> <0 - errors found> ^ <number of errors>
 | 
|---|
| 8 |  ;      (1...n) -> error text
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  ; -- SEE BOTTOM OF SCRPBK FOR VARIABLE DEFINITIONS
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  ; Related RPC: SCRP QUERY SAVE
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  N SCQREC,SCERR,SCIENS,SCSTAT,SCVM,SCLOG,SCERS,DIERR,SCPROC
 | 
|---|
| 15 |  S SCPROC="Save Template"
 | 
|---|
| 16 |  D PARSE^SCRPBK5(.SCQDEF,.SCQREC)
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ; -- do full validation mode(SCVM) check
 | 
|---|
| 19 |  S SCVM="FULL",SCLOG="SCDATA"
 | 
|---|
| 20 |  D VALCHK^SCRPBK4(SCLOG,.SCQREC,SCVM)
 | 
|---|
| 21 |  IF $G(DIERR) D  G SAVEQ
 | 
|---|
| 22 |  . D HDREC^SCUTBK3(.SCDATA,DIERR,"Save Template Validation Check")
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ; -- try to save record and get status of save
 | 
|---|
| 25 |  S SCSTAT=$$SAVEREC(.SCQREC,.SCIENS,.SCERR)
 | 
|---|
| 26 |  IF SCSTAT D
 | 
|---|
| 27 |  . S SCDATA(0)=1_U_$S(SCQREC("QUERYID")="+1":+$G(SCIENS(1)),1:"")_U_$P(SCSTAT,U,2)
 | 
|---|
| 28 |  ELSE  D
 | 
|---|
| 29 |  . D ERRCHK^SCUTBK3(.SCDATA,.SCERR,SCPROC)
 | 
|---|
| 30 | SAVEQ Q
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 | SAVEREC(SCQREC,SCIENS,SCERR) ; -- actual save process
 | 
|---|
| 33 |  N SCFILE,SCFDA,SCDFDA,SCQRY,SCNEW,SCMOD
 | 
|---|
| 34 |  S SCFILE=404.95
 | 
|---|
| 35 |  S SCFDA="SCFDA",SCDFDA="SCDFDA",SCERR="SCERR",SCIENS="SCIENS"
 | 
|---|
| 36 |  S SCQRY=SCQREC("QUERYID")
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ; -- strip out data not needed
 | 
|---|
| 39 |  ;    SCMOD = 1 means some stripping occurred and query needs to reload
 | 
|---|
| 40 |  S SCMOD=$$STRIP(.SCQREC)
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  D FDA^DILF(SCFILE,SCQRY_",",.01,"",SCQREC("NAME"),SCFDA,SCERR)
 | 
|---|
| 43 |  D FDA^DILF(SCFILE,SCQRY_",",.02,"",SCQREC("CREATORID"),SCFDA,SCERR)
 | 
|---|
| 44 |  D FDA^DILF(SCFILE,SCQRY_",",.03,"",SCQREC("ACCESSID"),SCFDA,SCERR)
 | 
|---|
| 45 |  D FDA^DILF(SCFILE,SCQRY_",",.04,"",SCQREC("REPORTID"),SCFDA,SCERR)
 | 
|---|
| 46 |  D FDA^DILF(SCFILE,SCQRY_",",.05,"",$$NOW^XLFDT(),SCFDA,SCERR)
 | 
|---|
| 47 |  IF $D(SCQREC("DESCRIPTION")) D
 | 
|---|
| 48 |  . D FDA^DILF(SCFILE,SCQRY_",",10,"",$NA(SCQREC("DESCRIPTION")),SCFDA,SCERR)
 | 
|---|
| 49 |  ; -- is this a new record?
 | 
|---|
| 50 |  S SCNEW=$S(SCQRY="+1":1,1:0)
 | 
|---|
| 51 |  D SAVFLD(.SCQREC,.SCFDA,.SCDFDA,.SCERR,.SCNEW)
 | 
|---|
| 52 |  D SAVSEL(.SCQREC,.SCFDA,.SCDFDA,.SCERR,.SCNEW)
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ; -- process any deletions (SCDFDA array holds deletion FDA)
 | 
|---|
| 55 |  IF $D(SCDFDA)>10 D
 | 
|---|
| 56 |  . D FILE^DIE("K",SCDFDA,SCERR)
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  ; -- process new items and changes
 | 
|---|
| 59 |  IF SCNEW D
 | 
|---|
| 60 |  . D UPDATE^DIE("",SCFDA,SCIENS,SCERR)
 | 
|---|
| 61 |  ELSE  D
 | 
|---|
| 62 |  . D FILE^DIE("K",SCFDA,SCERR)
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  ; -- ret := <success 0/1> ^ <unneeded data automatically stripped out>
 | 
|---|
| 65 | SAVERECQ Q '$G(SCERR("DIERR"))_U_SCMOD
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 | SAVFLD(SCQREC,SCFDA,SCDFDA,SCERR,SCNEW) ;
 | 
|---|
| 68 |  ; -- determine which fields were changed or deleted
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  N SCUR,SCAN,SCQRY,SCI,SCFLD
 | 
|---|
| 71 |  S SCQRY=SCQREC("QUERYID")
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ; -- scan fields multiple and build array
 | 
|---|
| 74 |  S SCI=0
 | 
|---|
| 75 |  F  S SCI=$O(^SD(404.95,SCQRY,"FIELDS",SCI)) Q:'SCI  S X=$G(^(SCI,0)) D
 | 
|---|
| 76 |  . IF $D(^SD(404.93,+X,0)) S SCAN($P(^(0),U,2))=SCI_U_$P(X,U,2)
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ; -- delete fields not passed down and set delete fda
 | 
|---|
| 79 |  S SCFLD=""
 | 
|---|
| 80 |  F  S SCFLD=$O(SCAN(SCFLD)) Q:SCFLD=""  IF '$D(SCQREC("FIELDS",SCFLD)) D
 | 
|---|
| 81 |  . D FDA^DILF(404.9502,+SCAN(SCFLD)_","_SCQRY_",",.01,"","@",SCDFDA,SCERR)
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 |  ; -- set fda for changes
 | 
|---|
| 84 |  S SCFLD=""
 | 
|---|
| 85 |  F  S SCFLD=$O(SCQREC("FIELDS",SCFLD)) Q:SCFLD=""  D
 | 
|---|
| 86 |  . N SCVAL,SCFLDI,SCIEN,SCUR
 | 
|---|
| 87 |  . S SCVAL=SCQREC("FIELDS",SCFLD)
 | 
|---|
| 88 |  . S SCFLDI=+$O(^SD(404.93,"C",SCFLD,0))
 | 
|---|
| 89 |  . S SCUR=$G(SCAN(SCFLD))
 | 
|---|
| 90 |  . S SCIEN=+SCUR IF 'SCIEN S SCNEW=SCNEW+1,SCIEN="+"_SCNEW
 | 
|---|
| 91 |  . IF SCIEN="+1"!($P(SCUR,U,2)'=SCVAL) D
 | 
|---|
| 92 |  . . D FDA^DILF(404.9502,SCIEN_","_SCQRY_",",.01,"",SCFLDI,SCFDA,SCERR)
 | 
|---|
| 93 |  . . D FDA^DILF(404.9502,SCIEN_","_SCQRY_",",.02,"",SCVAL,SCFDA,SCERR)
 | 
|---|
| 94 |  Q
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 | SAVSEL(SCQREC,SCFDA,SCDFDA,SCERR,SCNEW) ;
 | 
|---|
| 97 |  ;  -- determine which file selections were changed or deleted
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 |  N SCUR,SCAN,SCQRY,SCI,SCSEL,SCTYPE,SCHIT
 | 
|---|
| 100 |  S SCQRY=SCQREC("QUERYID")
 | 
|---|
| 101 |  ; -- scan fields and build array
 | 
|---|
| 102 |  S SCI=0
 | 
|---|
| 103 |  F  S SCI=$O(^SD(404.95,SCQRY,"FILES",SCI)) Q:'SCI  S X=$G(^(SCI,0)) D
 | 
|---|
| 104 |  . S SCAN($P(^(0),U))=SCI
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 |  ; -- delete fields not passed down
 | 
|---|
| 107 |  S SCSEL=""
 | 
|---|
| 108 |  F  S SCSEL=$O(SCAN(SCSEL)) Q:SCSEL=""  D
 | 
|---|
| 109 |  . S SCTYPE="",SCHIT=0
 | 
|---|
| 110 |  . F  S SCTYPE=$O(SCQREC("SELECTIONS",SCTYPE)) Q:SCTYPE=""  IF $D(SCQREC("SELECTIONS",SCTYPE,SCSEL)) S SCHIT=1 Q
 | 
|---|
| 111 |  . D:'SCHIT FDA^DILF(404.9503,+SCAN(SCSEL)_","_SCQRY_",",.01,"","@",SCDFDA,SCERR)
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  ; -- set fda
 | 
|---|
| 114 |  S SCTYPE=""
 | 
|---|
| 115 |  F  S SCTYPE=$O(SCQREC("SELECTIONS",SCTYPE)) Q:SCTYPE=""  D
 | 
|---|
| 116 |  . S SCSEL=""
 | 
|---|
| 117 |  . F  S SCSEL=$O(SCQREC("SELECTIONS",SCTYPE,SCSEL)) Q:SCSEL=""  IF '$D(SCAN(SCSEL)) D
 | 
|---|
| 118 |  . . S SCNEW=SCNEW+1,SCIEN="+"_SCNEW
 | 
|---|
| 119 |  . . D FDA^DILF(404.9503,SCIEN_","_SCQRY_",",.01,"",SCSEL,SCFDA,SCERR)
 | 
|---|
| 120 |  Q
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 | DELETE(SCDATA,SCQDEF) ; -- delete a query record
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ; -- SCDATA(0) -> <1 - success> ^
 | 
|---|
| 125 |  ;              -> <0 - errors found> ^ <number of errors>
 | 
|---|
| 126 |  ;      (1...n) -> error text
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 |  ; -- SEE BOTTOM OF SCRPBK FOR VARIABLE DEFINITIONS
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  ; Related RPC: SCRP QUERY DELETE
 | 
|---|
| 131 |  ;
 | 
|---|
| 132 |  N SCQREC,DIERR,SCLOG
 | 
|---|
| 133 |  S SCLOG="SCDATA"
 | 
|---|
| 134 |  D PARSE^SCRPBK5(.SCQDEF,.SCQREC)
 | 
|---|
| 135 |  D DELCHK(SCLOG,.SCQREC)
 | 
|---|
| 136 |  D HDREC^SCUTBK3(.SCDATA,$G(DIERR),"Template Deletion")
 | 
|---|
| 137 |  IF SCDATA(0) D DELREC(.SCQREC)
 | 
|---|
| 138 |  Q
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 | DELCHK(SCLOG,SCQREC) ; -- check to see if query can be deleted
 | 
|---|
| 141 |  ; -- is the query being used as a default by any user?
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  N SCQRY,PARAM
 | 
|---|
| 144 |  S SCQRY=SCQREC("QUERYID")
 | 
|---|
| 145 |  IF SCQRY=+SCQRY,'$D(^SCRS(403.35,"AC",SCQRY)) D  G DELCHKQ
 | 
|---|
| 146 |  . Q
 | 
|---|
| 147 |  ELSE  D
 | 
|---|
| 148 |  . S SCPARM("QUERY NAME")=SCQREC("NAME")
 | 
|---|
| 149 |  . D BLD^DIALOG(4035002.001,.SCPARM,"",SCLOG,"S")
 | 
|---|
| 150 | DELCHKQ Q
 | 
|---|
| 151 |  ;
 | 
|---|
| 152 | DELREC(SCQREC) ; -- actually delete query record
 | 
|---|
| 153 |  N DIK,DA,X
 | 
|---|
| 154 |  S DIK="^SD(404.95,",DA=SCQREC("QUERYID") D ^DIK
 | 
|---|
| 155 |  Q
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 | NAME(SCDATA,SCQNAME,SCUSER) ;
 | 
|---|
| 158 |  ; -- check to see if user has a query with same name
 | 
|---|
| 159 |  ; 
 | 
|---|
| 160 |  ; input: SCQNAME -> query name
 | 
|---|
| 161 |  ;        SCUSER  -> user id (DUZ)
 | 
|---|
| 162 |  ;output: SCDATA(1) -> 0 means no query with that name found
 | 
|---|
| 163 |  ;                  -> <n> means query with that name found has this ien
 | 
|---|
| 164 |  ; -- SEE BOTTOM OF SCRPBK FOR VARIABLE DEFINITIONS
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ; Related RPC: SCRP QUERY CHECK NAME
 | 
|---|
| 167 |  ;
 | 
|---|
| 168 |  N SCERR,SCDUP
 | 
|---|
| 169 |  IF $$NAMECHK(.SCQNAME,.SCUSER,.SCERR,.SCDUP) D
 | 
|---|
| 170 |  . S SCDATA(1)=0
 | 
|---|
| 171 |  ELSE  D
 | 
|---|
| 172 |  . S SCDATA(1)=SCDUP
 | 
|---|
| 173 |  Q
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 | NAMECHK(SCQNAME,SCUSER,SCERR,SCDUP) ; -- actuallt scan xref for query name
 | 
|---|
| 176 |  N SCOK,SDI
 | 
|---|
| 177 |  S SCOK=1,SCI=0
 | 
|---|
| 178 |  F  S SCI=$O(^SD(404.95,"AC",SCUSER,SCI)) Q:'SCI  D  Q:'SCOK
 | 
|---|
| 179 |  . IF SCQNAME=$P($G(^SD(404.95,SCI,0)),U) S SCOK=0,SCDUP=SCI
 | 
|---|
| 180 |  Q SCOK
 | 
|---|
| 181 |  ;
 | 
|---|
| 182 | STRIP(SCQREC) ; -- strip out inappropriate data for report type
 | 
|---|
| 183 |  N I,X,SCAN,SCFLD,SCMOD
 | 
|---|
| 184 |  S SCMOD=0
 | 
|---|
| 185 |  D GETFLDS(+SCQREC("REPORTID"),.SCAN)
 | 
|---|
| 186 |  S SCFLD=""
 | 
|---|
| 187 |  F  S SCFLD=$O(SCQREC("FIELDS",SCFLD)) Q:SCFLD=""  D
 | 
|---|
| 188 |  . IF '$D(SCAN(SCFLD)) K SCQREC("FIELDS",SCFLD) S SCMOD=1
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  K SCAN
 | 
|---|
| 191 |  D GETYPE(+SCQREC("REPORTID"),.SCAN)
 | 
|---|
| 192 |  S SCTYPE=""
 | 
|---|
| 193 |  F  S SCTYPE=$O(SCQREC("SELECTIONS",SCTYPE)) Q:SCTYPE=""  D
 | 
|---|
| 194 |  . IF '$D(SCAN(SCTYPE)) K SCQREC("SELECTIONS",SCTYPE) S SCMOD=1
 | 
|---|
| 195 |  Q SCMOD
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 | GETFLDS(RPTID,SCAN) ; -- build array of fields used/needed by report
 | 
|---|
| 198 |  N SCI,SCX
 | 
|---|
| 199 |  S SCI=0
 | 
|---|
| 200 |  F  S SCI=$O(^SD(404.92,RPTID,"FIELDS",SCI)) Q:'SCI  S SCX=$G(^(SCI,0)) D
 | 
|---|
| 201 |  . IF $D(^SD(404.93,+SCX,0)) S SCAN($P(^(0),U,2))=SCX
 | 
|---|
| 202 |  Q
 | 
|---|
| 203 |  ;
 | 
|---|
| 204 | GETYPE(RPTID,SCAN) ; -- build array of files used/needed by report
 | 
|---|
| 205 |  N SCI,SCX
 | 
|---|
| 206 |  S SCI=0
 | 
|---|
| 207 |  F  S SCI=$O(^SD(404.92,RPTID,"FILES",SCI)) Q:'SCI  S SCX=$G(^(SCI,0)) D
 | 
|---|
| 208 |  . S SCTYPE=$$TYPE^SCRPBK(+SCX)
 | 
|---|
| 209 |  . IF $$CHKTYPE(SCTYPE) S SCAN(SCTYPE)=SCX
 | 
|---|
| 210 |  Q
 | 
|---|
| 211 |  ;
 | 
|---|
| 212 | CHKTYPE(SCTYPE) ; -- special checks to see if file type is ok to use
 | 
|---|
| 213 |  N SCOK S SCOK=1
 | 
|---|
| 214 |  IF SCTYPE="" S SCOK=0
 | 
|---|
| 215 |  ;
 | 
|---|
| 216 |  ; -- is site using user class relationship in PCMM?
 | 
|---|
| 217 |  IF SCTYPE="USERCLASS",'$P($G(^SD(404.91,1,"PCMM")),U) S SCOK=0
 | 
|---|
| 218 |  Q SCOK
 | 
|---|
| 219 |  ;
 | 
|---|