| 1 | PSUTL ;BIR/PDW - Utilities for AR/WS extracts ;12 AUG 1999
 | 
|---|
| 2 |  ;;4.0;PHARMACY BENEFITS MANAGEMENT;;MARCH, 2005
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; Reference to DOLRO^%ZOSV supported by DBIA 2500
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ; Entry Points
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ; D GETS^PSUTL(,,,,)
 | 
|---|
| 9 |  ; D GETM^PSUTL(,,,,)
 | 
|---|
| 10 |  ; $$VAL^PSUTL(,,)
 | 
|---|
| 11 |  ; $$VALI^PSUTL(,,)
 | 
|---|
| 12 |  ; ---------------------
 | 
|---|
| 13 |  ; D MOVEI^PSUTL("ref")    Moves @ref@(Fld,"I") Value to (Fld) node
 | 
|---|
| 14 |  ; D MOVEMI^PSUTL("ref")   Moves @ref@(da,Fld,"I") value to (da,Fld) node
 | 
|---|
| 15 |  ; ---------------------
 | 
|---|
| 16 |  ; ---------------------
 | 
|---|
| 17 |  ; Details & Parameters
 | 
|---|
| 18 |  ; D GETS^PSUTL(,,,,)       Returns @root@(Field Number(s))    = Value(s)
 | 
|---|
| 19 |  ;   Multiples NO
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  ; D GETM^PSUTL(,,,,)       Returns @root@(DA,Field Number(s)) = Value(s)
 | 
|---|
| 22 |  ;   Multiples YES & ONLY
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ; S X=$$VAL^PSUTL(,,)      X = External Value
 | 
|---|
| 25 |  ; S X=$$VALI^PSUTL(,,)    X = Interanl Value
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  ; [ Variables for Parameter Passing ]
 | 
|---|
| 28 |  ; PSUFILE = file number or subfile number    as described in GETS^DIQ()
 | 
|---|
| 29 |  ; PSUDA   = List or array of IENS        NOT as described in GETS^DIQ()
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  ;   A .DA array or a list of IENS left to right as they are in the
 | 
|---|
| 32 |  ;   global data arrays D0,D1,D2 as within a FM Global map
 | 
|---|
| 33 |  ;   This Iens list can be constructed with variables.
 | 
|---|
| 34 |  ;   Example: as reaching into file 200 division subfile 200.02
 | 
|---|
| 35 |  ;            "DUZ,SITE"
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  ; PSUDR   = DR string                         as described in GETS^DIQ()
 | 
|---|
| 38 |  ; PSUROOT = closed array                      as described in GETS^DIQ()
 | 
|---|
| 39 |  ; PSUFORM = format control                    as described in GETS^DIQ()
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 | GETS(PSUFILE,PSUDA,PSUDR,PSUROOT,PSUFORM) ;
 | 
|---|
| 42 |  ; Example S PSUSITE=6025
 | 
|---|
| 43 |  ; D GETS^PSUTL(200.02,"DUZ,PSUSITE",".01","DIV")
 | 
|---|
| 44 |  ; returns
 | 
|---|
| 45 |  ; DIV(.01)="HINES DEVELOPMENT"
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 |  N PSUIEN,DA
 | 
|---|
| 48 |  I $D(PSUFILE),$D(PSUDA),$D(PSUDR),$D(PSUROOT)
 | 
|---|
| 49 |  E  Q
 | 
|---|
| 50 |  I '$D(PSUFORM) S PSUFORM=""
 | 
|---|
| 51 |  D PARSE(PSUDA)
 | 
|---|
| 52 |  S PSUIEN=$$IENS^DILF(.DA)
 | 
|---|
| 53 |  K ^TMP("PSUDIQ",$J)
 | 
|---|
| 54 |  D GETS^DIQ(PSUFILE,PSUIEN,PSUDR,PSUFORM,"^TMP(""PSUDIQ"",$J)")
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  I $G(PSUMTUL) Q
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  M @PSUROOT=^TMP("PSUDIQ",$J,PSUFILE,PSUIEN)
 | 
|---|
| 59 |  K ^TMP("PSUDIQ",$J)
 | 
|---|
| 60 |  Q
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 | VAL(PSUFILE,PSUDA,PSUFLD) ; Returns External Value
 | 
|---|
| 63 |  N PSUTMP
 | 
|---|
| 64 |  I $D(PSUFILE),$D(PSUDA),$D(PSUFLD)
 | 
|---|
| 65 |  E  Q ""
 | 
|---|
| 66 |  D GETS(PSUFILE,PSUDA,PSUFLD,"PSUTMP")
 | 
|---|
| 67 |  Q $G(PSUTMP(PSUFLD))
 | 
|---|
| 68 | VALI(PSUFILE,PSUDA,PSUFLD) ; Returns Internal Value
 | 
|---|
| 69 |  N PSUTMP
 | 
|---|
| 70 |  I $D(PSUFILE),$D(PSUDA),$D(PSUFLD)
 | 
|---|
| 71 |  E  Q ""
 | 
|---|
| 72 |  D GETS(PSUFILE,PSUDA,PSUFLD,"PSUTMP","I")
 | 
|---|
| 73 |  Q $G(PSUTMP(PSUFLD,"I"))
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 | GETM(PSUFILE,PSUDA,PSUFLD,PSUROOT,PSUFORM) ;EP RETURN MULTIPLES
 | 
|---|
| 76 |  ; PSUFILE is the immediate upper level file number of the one desired
 | 
|---|
| 77 |  ; PSUDA is the "DO,D1,Dx .." IENS to get to the immediate upper level
 | 
|---|
| 78 |  ; PSUFLD is the field notation for the multiple at the upper level
 | 
|---|
| 79 |  ;   "3*"
 | 
|---|
| 80 |  ;   appended with "^" and the list of fields ".01;.02;9.3;..."
 | 
|---|
| 81 |  ;   resulting in "3*^.01;.02;9.3;..."
 | 
|---|
| 82 |  ; PSUROOT is the target closed array reference
 | 
|---|
| 83 |  ; PSUFORM is the format as in GET^DIQ
 | 
|---|
| 84 |  ; return form is @PSUROOT@(da,fld)=VALUE
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  ; example: pulls multiple divisions from file 200
 | 
|---|
| 87 |  ; D GETM^PSUTL(200,DUZ,"16*^.01","DIV")
 | 
|---|
| 88 |  ; Returns  DIV(578,.01) ="HINES, IL"
 | 
|---|
| 89 |  ;          DIV(6020,.01)="HINES ISC"
 | 
|---|
| 90 |  ;          DIV(6025,.01)="HINES DEVELOPMENT"
 | 
|---|
| 91 |  ;        
 | 
|---|
| 92 |  N PSUMTUL,PSUSUB,PSUDID
 | 
|---|
| 93 |  I $D(PSUFILE),$D(PSUDA),$D(PSUFLD),$D(PSUROOT)
 | 
|---|
| 94 |  E  Q
 | 
|---|
| 95 |  S PSUMTUL=1
 | 
|---|
| 96 |  I '$D(PSUFORM) S PSUFORM=""
 | 
|---|
| 97 |  I PSUFLD'["^" Q
 | 
|---|
| 98 |  K PSUFLDL
 | 
|---|
| 99 |  S PSUFLDL=$P(PSUFLD,U,2),PSUFLD=$P(PSUFLD,U)
 | 
|---|
| 100 |  I +PSUFLDL,+PSUFLD
 | 
|---|
| 101 |  E  Q
 | 
|---|
| 102 |  D FIELD^DID(PSUFILE,+PSUFLD,"","SPECIFIER","PSUDID")
 | 
|---|
| 103 |  S PSUSUB=+PSUDID("SPECIFIER")
 | 
|---|
| 104 |  D GETS(PSUFILE,PSUDA,PSUFLD,PSUROOT,PSUFORM)
 | 
|---|
| 105 |  ; load multiple into target array
 | 
|---|
| 106 |  S PSUIEN=0 F  S PSUIEN=$O(^TMP("PSUDIQ",$J,PSUSUB,PSUIEN))  Q:+PSUIEN'>0  M @PSUROOT@(+PSUIEN)=^TMP("PSUDIQ",$J,PSUSUB,PSUIEN)
 | 
|---|
| 107 |  K ^TMP("PSUDIQ",$J)
 | 
|---|
| 108 |  Q:'$D(PSUFLDL)
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  ; process individual fields
 | 
|---|
| 111 |  N I,FLD
 | 
|---|
| 112 |  S FLD=+PSUFLDL,PSUFLDL(FLD)=0
 | 
|---|
| 113 |  F I=2:1 S FLD=$P(PSUFLDL,";",I) Q:FLD'>0  S PSUFLDL(FLD)=""
 | 
|---|
| 114 |  S PSUIEN=0 F  S PSUIEN=$O(@PSUROOT@(PSUIEN)) Q:PSUIEN'>0  D
 | 
|---|
| 115 |  . S FLD=0
 | 
|---|
| 116 |  . F  S FLD=$O(@PSUROOT@(PSUIEN,FLD)) Q:FLD'>0  I '$D(PSUFLDL(FLD)) K @PSUROOT@(PSUIEN,FLD)
 | 
|---|
| 117 |  K PSUFLDL
 | 
|---|
| 118 |  Q
 | 
|---|
| 119 | PARSE(XBDA) ;PEP - parse DA literal into da array
 | 
|---|
| 120 |  I XBDA="",$D(XBDA)=1 S DA=0 Q
 | 
|---|
| 121 |  NEW D,I,J
 | 
|---|
| 122 |  F I=1:1 S D(I)=$P(XBDA,",",I) Q:D(I)=""
 | 
|---|
| 123 |  S I=I-1
 | 
|---|
| 124 |  F J=0:1:I-1 S DA(J)=D(I-J)
 | 
|---|
| 125 |  F J=0:1:I-1 F  Q:(DA(J)=+DA(J))  S DA(J)=@(DA(J)) S:DA(J)="" DA(J)=0
 | 
|---|
| 126 |  S DA=DA(0)
 | 
|---|
| 127 |  KILL DA(0)
 | 
|---|
| 128 |  Q
 | 
|---|
| 129 | MOVEI(PSUREF) ;EP Move @PSUREF@(Fld,"I") values to @PSUREF@(Fld)
 | 
|---|
| 130 |  N PSUFLD
 | 
|---|
| 131 |  S PSUFLD=0 F  S PSUFLD=$O(@PSUREF@(PSUFLD)) Q:PSUFLD'>0  S @PSUREF@(PSUFLD)=$G(@PSUREF@(PSUFLD,"I")) K @PSUREF@(PSUFLD,"I")
 | 
|---|
| 132 |  Q
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 | MOVEMI(PSUREF) ;EP Move @PSUREF@(da,Fld,"I") values to @PSUREF@(da,Fld)
 | 
|---|
| 135 |  N PSUDA,PSUFLD
 | 
|---|
| 136 |  S PSUDA=0 F  S PSUDA=$O(@PSUREF@(PSUDA)) Q:PSUDA'>0  D
 | 
|---|
| 137 |  . S PSUFLD=0 F  S PSUFLD=$O(@PSUREF@(PSUDA,PSUFLD)) Q:PSUFLD'>0  S @PSUREF@(PSUDA,PSUFLD)=@PSUREF@(PSUDA,PSUFLD,"I") K @PSUREF@(PSUDA,PSUFLD,"I")
 | 
|---|
| 138 |  Q
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 | UPPER(PSUX) ;Convert lower case to upper case
 | 
|---|
| 141 |  Q $TR(PSUX,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 | VARKILL ;PEP Kill variable PSU* namespace 
 | 
|---|
| 144 |  ;Kills off all PSU Variables
 | 
|---|
| 145 |  S X="^TMP(""PSUVAR"",$J,"
 | 
|---|
| 146 |  D DOLRO^%ZOSV ; load symbols into ^TMP(,,var)=..
 | 
|---|
| 147 |  ;   (preserve PSU,PSUXMY*)
 | 
|---|
| 148 |  S X="" F  S X=$O(^TMP("PSUVAR",$J,X)) Q:X=""  I $E(X,1,3)="PSU",X'="PSU",($E(X,1,6)'="PSUXMY"),X'="PSUJOB" K @X
 | 
|---|
| 149 |  K ^TMP("PSUVAR",$J)
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 |  ;
 | 
|---|