1 | DVBCHLQ ;ALB/JLU-Processing HL7 Query message 1 of 2 routines ;1/28/93
|
---|
2 | ;;2.7;AMIE;;Apr 10, 1995
|
---|
3 | BEG ;Main entry point for this routine.
|
---|
4 | D START
|
---|
5 | D CHKIND:'$D(DVBCERR)
|
---|
6 | D QRD:'$D(DVBCERR)
|
---|
7 | D ACK
|
---|
8 | D EXIT
|
---|
9 | Q
|
---|
10 | ;
|
---|
11 | EXIT K DFN,DVBC,DVBC1,DVBCARY,DVBCERR,DVBCEXAM,DVBCEXTY,DVBCNT,DVBCNT1,DVBCPDFN,DVBCQRD,DVBCRDFN,DVBCRQDT,DVBCSRX,DVBCSSN,VADM,VAERR,DVBCSEG
|
---|
12 | Q
|
---|
13 | ;
|
---|
14 | START ;This subroutine will check the segment type for QRD
|
---|
15 | K DVBCERR
|
---|
16 | S DVBCSEG=4,DVBCNT=0
|
---|
17 | S DVBCARY=^HL(772,HLDA,"IN",2,0)
|
---|
18 | S DVBCQRD=DVBCARY ;using naked from start+3
|
---|
19 | I $P(DVBCQRD,HLFS,1)'="QRD" S DVBCERR="Invalid Segment Type" Q
|
---|
20 | Q
|
---|
21 | ;
|
---|
22 | CHKIND ;Checking for the requestor's DUZ
|
---|
23 | I $S('$D(HLDUZ):1,HLDUZ']"":1,1:0) S DVBCERR="Not a valid DHCP user number."
|
---|
24 | Q
|
---|
25 | ;
|
---|
26 | QRD ;This subroutine is to break apart the QRD segment of a query
|
---|
27 | S DVBCNT1=$P($P(DVBCQRD,HLFS,8),$E(HLECH),1) ;gets the max number to return
|
---|
28 | S:$P(DVBCQRD,HLFS,11)="PATIENT" DVBCSSN=$P(DVBCQRD,HLFS,9)
|
---|
29 | DO
|
---|
30 | .I '$D(DVBCSSN) S DVBCERR="Invalid Patient ID, No SSN" Q ;undefined ssn
|
---|
31 | .I (DVBCSSN'?9N),(DVBCSSN'?9N1A),(DVBCSSN'?1A4N) S DVBCERR="Invalid Patient ID, Wrong SSN Format" Q ;ssn format
|
---|
32 | .D SSN
|
---|
33 | .Q
|
---|
34 | Q
|
---|
35 | ;
|
---|
36 | SSN ;Checking the existence of the patient with ssn
|
---|
37 | S:$E(DVBCSSN)?1L DVBCSSN=$C($A($E(DVBCSSN))-32)_$E(DVBCSSN,2,5) ;lower to uppercase letter
|
---|
38 | S DVBCSRX=$S(DVBCSSN?1U4N:"BS5",1:"SSN") ;getting correct x-ref
|
---|
39 | I $L(DVBCSSN)=10 S:$E(DVBCSSN,10,10)?1L DVBCSSN=$E(DVBCSSN,1,9)_$C($A($E(DVBCSSN,10,10))-32) ;lowercase to uppercase
|
---|
40 | S DVBCPDFN=$O(^DPT(DVBCSRX,DVBCSSN,0))
|
---|
41 | DO
|
---|
42 | .I 'DVBCPDFN S DVBCERR="Invalid Patient Identifier" Q
|
---|
43 | .I $O(^DPT(DVBCSRX,DVBCSSN,DVBCPDFN)) S DVBCERR="Ambiguous Patient identifier" Q
|
---|
44 | .S DVBCRDFN=$O(^DVB(396.3,"B",DVBCPDFN,0))
|
---|
45 | .I 'DVBCRDFN S DVBCERR="No 2507 request on file for this Patient" Q
|
---|
46 | .K VADM,VAERR S DFN=DVBCPDFN D DEM^VADPT I VAERR S DVBCERR="Invalid Patient Identifier" Q
|
---|
47 | .I VADM(1)']"" S DVBCERR="Invalid Patient identifier" Q
|
---|
48 | .D CHKREQ
|
---|
49 | .Q
|
---|
50 | Q
|
---|
51 | ;
|
---|
52 | CHKREQ ;Checks for an open exam
|
---|
53 | N ENTRY1,DVBCEXN,DVBCSTAT
|
---|
54 | F DVBCEXN=0:0 S DVBCEXN=$O(^DVB(396.4,"APS",DVBCPDFN,DVBCEXN)) Q:'DVBCEXN!(DVBCNT=DVBCNT1) D
|
---|
55 | .S (DVBCEXAM,DVBCSTAT)=""
|
---|
56 | .F S DVBCSTAT=$O(^DVB(396.4,"APS",DVBCPDFN,DVBCEXN,DVBCSTAT)) Q:DVBCSTAT="" D
|
---|
57 | ..I DVBCSTAT="O" S DVBCEXAM=$O(^DVB(396.4,"APS",DVBCPDFN,DVBCEXN,DVBCSTAT,DVBCEXAM)) D
|
---|
58 | ...S ENTRY1=$P(^DVB(396.4,DVBCEXAM,0),"^",2)
|
---|
59 | ...I "PS"]$P(^DVB(396.3,ENTRY1,0),"^",18) D SET
|
---|
60 | I 'DVBCNT S DVBCERR="No Exams or Open Exams on file for this Patient"
|
---|
61 | Q
|
---|
62 | ;
|
---|
63 | ACK ;builds new QRD and MSA to send back to requestor
|
---|
64 | S:'$D(DVBCERR) $P(HLSDATA(1),HLFS,9)="ORF"
|
---|
65 | I $D(DVBCERR) S DVBC=HLSDATA(1) K HLSDATA S HLSDATA(1)=DVBC
|
---|
66 | S HLSDATA(2)="MSA"_HLFS_$S($D(DVBCERR):"AE",1:"AA")_HLFS_HLMID_$S($D(DVBCERR):HLFS_DVBCERR,1:"")
|
---|
67 | S HLSDATA(3)=DVBCQRD
|
---|
68 | S $P(HLSDATA(3),HLFS,8)=DVBCNT_$E(HLECH)_"RD"
|
---|
69 | I $D(HLTRANS) D EN1^HLTRANS
|
---|
70 | Q
|
---|
71 | ;
|
---|
72 | SET ;calls the subroutines to set PID and OBR
|
---|
73 | S DVBCRDFN=$P(^DVB(396.4,DVBCEXAM,0),U,2)
|
---|
74 | S DVBCRQDT=$P(^DVB(396.3,DVBCRDFN,0),U,2)
|
---|
75 | S DVBCEXTY=$P(^DVB(396.6,DVBCEXN,0),U,1) ;gets exam type
|
---|
76 | D PID^DVBCHLUT
|
---|
77 | K DVBCPLCR ; this is an OBR filler for the next line
|
---|
78 | D OBR^DVBCHLUT
|
---|
79 | S DVBCNT=DVBCNT+1
|
---|
80 | Q
|
---|