1 | ORCMEDT8 ;SLC/JM-QO, Generate quick order CRC ;3/3/06
|
---|
2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**245**;Dec 17, 1997;Build 2
|
---|
3 | Q
|
---|
4 | ;
|
---|
5 | UPDQNAME(ORIEN) ; Rename personal quick order name if needed
|
---|
6 | N OLDNAME,NEWNAME,DA,DR,DIE,DIDEL
|
---|
7 | I $P($G(^ORD(101.41,ORIEN,0)),U,4)'="Q" Q
|
---|
8 | S OLDNAME=$P($G(^ORD(101.41,ORIEN,0)),U,1)
|
---|
9 | I $E($P(OLDNAME,U),1,6)'="ORWDQ " Q
|
---|
10 | S NEWNAME="ORWDQ "_$$CRC4QCK(ORIEN)
|
---|
11 | I OLDNAME'=NEWNAME D
|
---|
12 | . S NEWNAME=$$ENSURNEW(NEWNAME)
|
---|
13 | . S DA=ORIEN,DR=".01///"_NEWNAME,DIE="^ORD(101.41," D ^DIE
|
---|
14 | Q
|
---|
15 | ;
|
---|
16 | ENSURNEW(NAME) ; Ensures the name is a new entry
|
---|
17 | N IDX,BASENAME,ABC,NEWNAME
|
---|
18 | S NEWNAME=NAME
|
---|
19 | S IDX=0,BASENAME=NEWNAME,ABC=97 ; Find an unused name
|
---|
20 | F S IDX=$O(^ORD(101.41,"B",NEWNAME,0)) Q:'IDX D
|
---|
21 | . S NEWNAME=BASENAME_$C(ABC) ; append letter 'a' - 'z'
|
---|
22 | . S ABC=ABC+1 I ABC>122 S BASENAME=BASENAME_"a",ABC=97
|
---|
23 | Q NEWNAME
|
---|
24 | RAWCRC(ORIEN) ; Get a raw CRC value to determine if a record has changed
|
---|
25 | N ORDATA,RESULT,ADDCRLF,LASTLINE,LASTIDX,OLDCRC
|
---|
26 | S (RESULT,OLDCRC)=""
|
---|
27 | I $P($G(^ORD(101.41,ORIEN,0)),U,4)'="Q" G RWQ
|
---|
28 | I $E($P($G(^ORD(101.41,ORIEN,0)),U),1,6)'="ORWDQ " G RWQ
|
---|
29 | D LOADRSP^ORWDX(.ORDATA,ORIEN)
|
---|
30 | D PARSE
|
---|
31 | RWQ Q RESULT
|
---|
32 | ;
|
---|
33 | ; The following code attemps to duplicate the CRC calculated by the Delphi code
|
---|
34 | ; in CPRS for quick orders. It will not match all the time, since not all the
|
---|
35 | ; data neded to make the determination is stored on the M side, but it does it's best.
|
---|
36 | ;
|
---|
37 | CRC4QCK(ORIEN) ; Get CRC for a personal quick order
|
---|
38 | N ORDATA,DISPGRP,DEFDLG,FORMID,RESULT,FORMDATA,ADDCRLF
|
---|
39 | N LASTLINE,LASTIDX,OLDCRC,FORMINFO,IDINFO,NEXTFORM
|
---|
40 | S RESULT="",FORMID=0
|
---|
41 | ; Must be personal quick order
|
---|
42 | I $P($G(^ORD(101.41,ORIEN,0)),U,4)'="Q" G EXT
|
---|
43 | I $E($P($G(^ORD(101.41,ORIEN,0)),U),1,6)'="ORWDQ " G EXT
|
---|
44 | S OLDCRC=$E($P($G(^ORD(101.41,ORIEN,0)),U,1),7,14)
|
---|
45 | F Q:(RESULT=OLDCRC)!(FORMID="") D
|
---|
46 | . K ORDATA D LOADRSP^ORWDX(.ORDATA,ORIEN)
|
---|
47 | . ; First pass don't use any form id - get baseline CRC
|
---|
48 | . I FORMID=1 D Q:FORMID=""
|
---|
49 | . . S FORMID=""
|
---|
50 | . . S DISPGRP=$P($G(^ORD(101.41,ORIEN,0)),U,5) I '+DISPGRP Q ; Must have a valid display group
|
---|
51 | . . S DEFDLG=$P($G(^ORD(100.98,DISPGRP,0)),U,4) I '+DEFDLG Q ; Display group must have a valid default dialog
|
---|
52 | . . D FORMID^ORWDXM(.FORMID,DEFDLG) I '+FORMID S FORMID="" Q ; Default dialog must have a valid windows form ID
|
---|
53 | . . I (FORMID=130)!(FORMID=140) D
|
---|
54 | . . . N NEWFORM D CHK94^ORWDPS1(.NEWFORM) I NEWFORM=1 S FORMID=135
|
---|
55 | . . D FORMINFO(.FORMINFO,.IDINFO,.NEXTFORM)
|
---|
56 | . I FORMID=0 S FORMID=1
|
---|
57 | . E D SORTDATA I FORMDATA="" S FORMID="" Q ; Updates FORMID
|
---|
58 | . D PARSE
|
---|
59 | EXT Q RESULT
|
---|
60 | ;
|
---|
61 | PARSE ; Parse Data
|
---|
62 | N DATAIDX,IDX,LINE,CODE,CRCDATA,OUTPUT,DONE,ISMASTER,LASTMSTR,FIRST,P3,LK4SPACE
|
---|
63 | S DATAIDX="",(IDX,DONE,ISMASTER,LASTMSTR,LASTIDX)=0,LASTLINE=""
|
---|
64 | F D GETLINE Q:DONE D Q:DONE
|
---|
65 | . I ISMASTER D
|
---|
66 | . . S OUTPUT=+$P(LINE,U,1)_U_+$P(LINE,U,2)_U
|
---|
67 | . . S IDX=IDX+1,CRCDATA(IDX)=OUTPUT
|
---|
68 | . . S FIRST=1,P3=$P(LINE,U,3)
|
---|
69 | . . I P3="COMMENT" S ADDCRLF=1,LK4SPACE=1
|
---|
70 | . . E D
|
---|
71 | . . . I P3="STATEMENTS" S ADDCRLF=1,LK4SPACE=0
|
---|
72 | . . . E S ADDCRLF=0,LK4SPACE=0
|
---|
73 | . . F D GETLINE Q:DONE!ISMASTER D
|
---|
74 | . . . I CODE="i" S IDX=IDX+1,CRCDATA(IDX)=LINE
|
---|
75 | . . . I CODE="t" D
|
---|
76 | . . . . I FIRST S FIRST=0,OUTPUT=LINE
|
---|
77 | . . . . E D
|
---|
78 | . . . . . I $L(LASTLINE)=0 S OUTPUT=$C(13)_$C(10)_LINE Q
|
---|
79 | . . . . . I LK4SPACE,$L(LASTLINE)>1,$E(LASTLINE,$L(LASTLINE))=" " S OUTPUT=""
|
---|
80 | . . . . . E D
|
---|
81 | . . . . . . I ADDCRLF S OUTPUT=$C(13)_$C(10) ; ,$L(LASTLINE)<65
|
---|
82 | . . . . . . E S OUTPUT=" "
|
---|
83 | . . . . . S OUTPUT=OUTPUT_LINE
|
---|
84 | . . . . S LASTLINE=LINE
|
---|
85 | . . . . S IDX=IDX+1,CRCDATA(IDX)=OUTPUT
|
---|
86 | . . . . I ADDCRLF S LASTIDX=IDX
|
---|
87 | . . I ISMASTER,'DONE S LASTMSTR=1
|
---|
88 | S RESULT=$$CRC4ARRY^ORCRC(.CRCDATA)
|
---|
89 | ; Same data can generate 2 different CRCs - CRLF on end of comments are stripped
|
---|
90 | I OLDCRC'="",RESULT'=OLDCRC,LASTIDX>0 D
|
---|
91 | . S CRCDATA(LASTIDX)=CRCDATA(LASTIDX)_$C(13)_$C(10)
|
---|
92 | . S RESULT=$$CRC4ARRY^ORCRC(.CRCDATA)
|
---|
93 | Q
|
---|
94 | ;
|
---|
95 | SORTDATA ; Sorts data by fields according to FormID
|
---|
96 | N IN,OUT,LINE,DATA,ID,CODE,INDEX,END,IDX,RTN,SUBFORM,SUBFORM2,SUBIDX,NODE
|
---|
97 | S SUBFORM="",SUBFORM2=""
|
---|
98 | S FORMDATA=$G(FORMINFO(FORMID)) I FORMDATA="" Q
|
---|
99 | I $E(FORMDATA,1,2)'="00" S RTN="SUBID"_$E(FORMDATA,1,2) D @RTN S FORMDATA=$G(FORMINFO(FORMID)) I FORMDATA="" Q
|
---|
100 | S IN=0,OUT=0,END=1000000,IDX=0
|
---|
101 | F S IN=$O(ORDATA(IN)) Q:'+IN D
|
---|
102 | . S LINE=ORDATA(IN)
|
---|
103 | . I $E(LINE)="~" D
|
---|
104 | . . S IDX=1,ID=$P(LINE,U,3),CODE="."_IDINFO(ID)_".",NODE=$P(LINE,U,2)
|
---|
105 | . . S INDEX=$F(FORMDATA,CODE),SUBIDX=0
|
---|
106 | . . I INDEX=0,SUBFORM'="" D
|
---|
107 | . . . S INDEX=($F(FORMDATA,".ZZZ."))
|
---|
108 | . . . I INDEX>0 S SUBIDX=$F(SUBFORM,CODE) I SUBIDX<1 S INDEX=0
|
---|
109 | . . I INDEX=0,SUBFORM2'="" D
|
---|
110 | . . . S INDEX=($F(FORMDATA,".XXX."))
|
---|
111 | . . . I INDEX>0 S SUBIDX=$F(SUBFORM2,CODE) I SUBIDX<1 S INDEX=0
|
---|
112 | . . I INDEX=0 S OUT=END,END=END+1
|
---|
113 | . . E D
|
---|
114 | . . . I SUBIDX>0 D I 1
|
---|
115 | . . . . S OUT=(INDEX-4)*250
|
---|
116 | . . . . S SUBIDX=(SUBIDX-4)\4
|
---|
117 | . . . . S OUT=OUT+SUBIDX+(NODE*20)
|
---|
118 | . . . E S OUT=(INDEX-4)*250
|
---|
119 | . I IDX>0 D
|
---|
120 | . . S DATA(OUT,IDX)=LINE
|
---|
121 | . . S IDX=IDX+1
|
---|
122 | K ORDATA
|
---|
123 | S (IN,OUT,INDEX)=0
|
---|
124 | F S IN=$O(DATA(IN)) Q:'+IN D
|
---|
125 | . F S INDEX=$O(DATA(IN,INDEX)) Q:'+INDEX D
|
---|
126 | . . S OUT=OUT+1
|
---|
127 | . . S ORDATA(OUT)=DATA(IN,INDEX)
|
---|
128 | S FORMID=$G(NEXTFORM(FORMID))
|
---|
129 | Q
|
---|
130 | ;
|
---|
131 | GETLINE ;
|
---|
132 | I LASTMSTR S LASTMSTR=0 Q
|
---|
133 | S DATAIDX=$O(ORDATA(DATAIDX))
|
---|
134 | S DONE=(DATAIDX="")
|
---|
135 | I 'DONE S CODE=$E(ORDATA(DATAIDX),1),LINE=$E(ORDATA(DATAIDX),2,9999),ISMASTER=(CODE="~")
|
---|
136 | Q
|
---|
137 | ;
|
---|
138 | FORMINFO(FORMINFO,IDINFO,NEXTFORM) ; populates FORMINFO,IDINFO and NEXTFORM arrays
|
---|
139 | N IDX,LINE,CODE,RTN,NEXT
|
---|
140 | S IDX=1
|
---|
141 | F S LINE=$E($T(FORMTBL+IDX),21,999) Q:$L(LINE)<1 D
|
---|
142 | . S CODE=$E(LINE,1,3),NEXT=$E(LINE,5,7),LINE=$E(LINE,9,999)
|
---|
143 | . S FORMINFO(CODE)=LINE
|
---|
144 | . I NEXT'=" " S NEXTFORM(CODE)=NEXT
|
---|
145 | . S IDX=IDX+1
|
---|
146 | S IDX=1
|
---|
147 | F S LINE=$E($T(IDTABLE+IDX),4,999) Q:$L(LINE)<1 D
|
---|
148 | . S CODE=$E(LINE,1,3),LINE=$E(LINE,5,99)
|
---|
149 | . S IDINFO(LINE)=CODE,IDX=IDX+1
|
---|
150 | Q
|
---|
151 | ;
|
---|
152 | HASCODE(CODE) ; scans data for code
|
---|
153 | N RESULT,IDX,LINE S IDX="",RESULT=0
|
---|
154 | F S IDX=$O(ORDATA(IDX)) Q:IDX="" D Q:IDX=""
|
---|
155 | . S LINE=ORDATA(IDX)
|
---|
156 | . I $E(LINE)="~" D
|
---|
157 | . . S LINE=$P(LINE,U,3)
|
---|
158 | . . I LINE=CODE S RESULT=1,IDX=""
|
---|
159 | Q RESULT
|
---|
160 | ;
|
---|
161 | SUBID ; SubID codes are used to change the form ID depending on depending on data
|
---|
162 | ; Data below is FormID;SubID.list of ID codes in order of use
|
---|
163 | ; SubID's are used to change the FormID depending on data values.
|
---|
164 | Q
|
---|
165 | SUBID01 ; Generic Meds dialog
|
---|
166 | N INPT,COMPLEX
|
---|
167 | S INPT=$$HASCODE("NOW"),COMPLEX=$$HASCODE("DAYS")
|
---|
168 | I INPT D I 1
|
---|
169 | . I COMPLEX S FORMID="INX",SUBFORM=$G(FORMINFO("MDX"))
|
---|
170 | . E S FORMID="INP"
|
---|
171 | E I COMPLEX S FORMID="OPX",SUBFORM=$G(FORMINFO("MDX"))
|
---|
172 | Q
|
---|
173 | SUBID02 ; IV Meds
|
---|
174 | S SUBFORM=$G(FORMINFO("IVL"))
|
---|
175 | Q
|
---|
176 | SUBID03 ; Delphi code adds URGENCY prompt that does not exist in dialog on M side
|
---|
177 | I '$$HASCODE("URGENCY") D
|
---|
178 | . N X
|
---|
179 | . S X=$O(ORDATA(999999),-1)+1
|
---|
180 | . S ORDATA(X)="~0^1^URGENCY"
|
---|
181 | Q
|
---|
182 | SUBID04 ; Blood Bank will probably be wrong - quick orders not working in v26
|
---|
183 | S SUBFORM=$G(FORMINFO("BBK"))
|
---|
184 | S SUBFORM2=$G(FORMINFO("BBX"))
|
---|
185 | Q
|
---|
186 | SUBID05 ; Diet
|
---|
187 | I FORMID="117" S SUBFORM=$G(FORMINFO("DLN"))
|
---|
188 | I FORMID="TBF" S SUBFORM=$G(FORMINFO("TBL"))
|
---|
189 | Q
|
---|
190 | FORMTBL ; Form Table - Forms allowing personal quick orders, as of CPRS GUI v26 (OR*3*215)
|
---|
191 | ;;Consult ;110;CS2;00.ORD.CLS.URG.PLA.MSC.COD.PRV.COM.
|
---|
192 | ;; ;CS2; ;00.ORD.CLS.URG.PLA.MSC.COD.COM.PRV.
|
---|
193 | ;;Procedure ;112;PR2;00.SER.ORD.CLS.URG.PLA.MSC.COD.PRV.COM.
|
---|
194 | ;; ;PR2;PR3;00.SER.ORD.COM.CLS.URG.PLA.MSC.COD.PRV.
|
---|
195 | ;; ;PR3; ;00.SER.ORD.CLS.URG.PLA.MSC.COD.COM.PRV.
|
---|
196 | ;;Diet ;117;TBF;05.STT.STP.ZZZ.COM.DEL.CAN.
|
---|
197 | ;; ;TBF;OPM;05.ZZZ.COM.CAN.
|
---|
198 | ;; ;OPM; ;00.ORD.MEL.STT.STP.SCH.COM.DEL.
|
---|
199 | ;; ;DLN; ;00.ORD.
|
---|
200 | ;; ;TBL; ;00.ORD.STR.INS.
|
---|
201 | ;;Lab ;120; ;00.ORD.SAM.SPE.URG.COM.COL.STT.SCH.DAY.
|
---|
202 | ;;Blood Bank ;125;BB2;04.ZZZ.DTE.COL.URG.COM.STT.MSC.REA.YN0.XXX.
|
---|
203 | ;; ;BB2; ;04.ZZZ.URG.COM.COL.DTE.MSC.REA.YN0.STT.XXX.
|
---|
204 | ;; ;BBK; ;00.ORD.QTY.MDF.SPC.
|
---|
205 | ;; ;BBX; ;00.RES.
|
---|
206 | ;;Inpatient Meds ;130; ;00.ORD.DRG.INS.ROU.SCH.URG.COM.
|
---|
207 | ;;Generic Meds ;135; ;01.ORD.INS.DRG.DOS.STR.NAM.ROU.SCH.URG.COM.SUP.QTY.REF.SC0.PCK.PI0.SIG.
|
---|
208 | ;; ;INP; ;00.ORD.INS.DRG.DOS.STR.NAM.ROU.SCH.URG.COM.NOW.SIG.
|
---|
209 | ;; ;OPX; ;00.ORD.STR.NAM.DRG.ZZZ.URG.COM.SUP.QTY.REF.SC0.PCK.PI0.SIG.
|
---|
210 | ;; ;INX; ;00.ORD.STR.NAM.DRG.ZZZ.URG.COM.NOW.SIG.
|
---|
211 | ;; ;MDX; ;00.INS.DOS.ROU.SCH.DAY.CNJ.
|
---|
212 | ;;Outpatient Meds ;140; ;00.ORD.DRG.INS.MSC.ROU.SCH.QTY.REF.PCK.URG.COM.SC0.
|
---|
213 | ;;Non-VA Meds ;145; ;03.ORD.INS.DRG.DOS.STR.NAM.ROU.SCH.URG.COM.STT.STA.NOW.SIG.
|
---|
214 | ;;Radiology ;160; ;00.ORD.STT.URG.MOD.CLS.IML.PRG.YN0.PRE.COM.MDF.PRV.CON.RSH.LOC.
|
---|
215 | ;;IV Meds ;180; ;02.ZZZ.RAT.URG.DAY.COM.SCH.
|
---|
216 | ;; ;IVL; ;00.ORD.VOL.ADD.STR.UNT.
|
---|
217 | ;;
|
---|
218 | IDTABLE ; ID table - returns codes used in the form table IDINFO("LONGNAME")=SHORNAME
|
---|
219 | ;;ADD;ADDITIVE
|
---|
220 | ;;CAN;CANCEL
|
---|
221 | ;;CLS;CLASS
|
---|
222 | ;;COD;CODE
|
---|
223 | ;;COL;COLLECT
|
---|
224 | ;;COM;COMMENT
|
---|
225 | ;;CNJ;CONJ
|
---|
226 | ;;CON;CONTRACT
|
---|
227 | ;;DTE;DATETIME
|
---|
228 | ;;DAY;DAYS
|
---|
229 | ;;DEL;DELIVERY
|
---|
230 | ;;DOS;DOSE
|
---|
231 | ;;DRG;DRUG
|
---|
232 | ;;IML;IMLOC
|
---|
233 | ;;INS;INSTR
|
---|
234 | ;;ISO;ISOLATION
|
---|
235 | ;;LOC;LOCATION
|
---|
236 | ;;MEL;MEAL
|
---|
237 | ;;MSC;MISC
|
---|
238 | ;;MOD;MODE
|
---|
239 | ;;MDF;MODIFIER
|
---|
240 | ;;NAM;NAME
|
---|
241 | ;;NOW;NOW
|
---|
242 | ;;ORD;ORDERABLE
|
---|
243 | ;;PI0;PI
|
---|
244 | ;;PCK;PICKUP
|
---|
245 | ;;PLA;PLACE
|
---|
246 | ;;PRG;PREGNANT
|
---|
247 | ;;PRE;PREOP
|
---|
248 | ;;PRV;PROVIDER
|
---|
249 | ;;QTY;QTY
|
---|
250 | ;;RAT;RATE
|
---|
251 | ;;REA;REASON
|
---|
252 | ;;REF;REFILLS
|
---|
253 | ;;RSH:RESEARCH
|
---|
254 | ;;RES;RESULTS
|
---|
255 | ;;ROU;ROUTE
|
---|
256 | ;;SAM;SAMPLE
|
---|
257 | ;;SC0;SC
|
---|
258 | ;;SCH;SCHEDULE
|
---|
259 | ;;SER;SERVICE
|
---|
260 | ;;SIG;SIG
|
---|
261 | ;;SPE;SPECIMEN
|
---|
262 | ;;SPC;SPECSTS
|
---|
263 | ;;STT;START
|
---|
264 | ;;STA;STATEMENTS
|
---|
265 | ;;STP;STOP
|
---|
266 | ;;STR;STRENGTH
|
---|
267 | ;;SUP;SUPPLY
|
---|
268 | ;;TIM;TIME
|
---|
269 | ;;UNT;UNITS
|
---|
270 | ;;URG;URGENCY
|
---|
271 | ;;VIS;VISITSTR
|
---|
272 | ;;VOL;VOLUME
|
---|
273 | ;;XFU;XFUSION
|
---|
274 | ;;YN0;YN
|
---|
275 | ;;XXX;XXX
|
---|
276 | ;;ZZZ;ZZZ
|
---|
277 | ;;
|
---|