1 | QACVEMPX ; OAKOIFO/TKW - Return Person Data, called by RPC ;9/25/07 14:14
|
---|
2 | ;;2.0;Patient Representative;**19,21**;07/25/1995;Build 5
|
---|
3 | EN(PATSBY,LKUPVAL,PATSROWS,PATSFRM0,PATSFRM1) ; Lookup Employee by Name, then
|
---|
4 | ; Output XML formatted data from NEW PERSON file.
|
---|
5 | ; PATSBY contains the name of the output array (pass by reference)
|
---|
6 | ; LKUPVAL is the name of the person to be matched (LAST,FIRST), or
|
---|
7 | ; an array of Security Keys.
|
---|
8 | ; PATSROWS=Number of rows to return in each call
|
---|
9 | ; PATSFRM0=Employee Name value from previous call (empty on first call, pass by ref)
|
---|
10 | ; PATSFRM1=Employee IEN from previous call (empty on first call, pass by ref)
|
---|
11 | K ^TMP("DILIST",$J),^TMP("PatsPersonXml",$J)
|
---|
12 | N STDNAME,ULASTNM,NAMECOMP,IENS,PIECE,OUTCNT,TAGLIST,FROM,PART,SRVIEN,MAILCODE,TITLE,SRVRSTA,PATSMORE,PATSERR,DIERR,I,J,X,Y
|
---|
13 | ; If LKUPVAL exists, it contains an employee name, find partial matches.
|
---|
14 | I $G(LKUPVAL)]"" D
|
---|
15 | . S ULASTNM=$P(LKUPVAL,",")
|
---|
16 | . D LOOKUP1
|
---|
17 | . I (ULASTNM[" ")!(ULASTNM["'") D LOOKUP2
|
---|
18 | . Q
|
---|
19 | ; Else, it contains an array of Security Key values, find all
|
---|
20 | ; holders of those keys.
|
---|
21 | I $G(LKUPVAL)="" D
|
---|
22 | . D EN^QACVKHLD(.LKUPVAL,PATSROWS,.PATSFRM0,.PATSFRM1)
|
---|
23 | . S FROM(1)=$G(PATSFRM0),FROM(2)=$G(PATSFRM1)
|
---|
24 | . S PATSMORE=$S(FROM(1)="":0,1:1)
|
---|
25 | . Q
|
---|
26 | I '$D(^TMP("DILIST",$J)),'$D(^TMP("DIERR",$J)) Q
|
---|
27 | S PATSERR="" I $D(^TMP("DIERR",$J)) S PATSERR=$G(^TMP("DIERR",$J,1,"TEXT",1))
|
---|
28 | ; Get Station Number of Institution where server resides (IA #1518)
|
---|
29 | S SRVRSTA=$$STA^XUAF4(+$$GET1^DIQ(8989.3,1,217,"I"))
|
---|
30 | ; Set name of output array into output parameter.
|
---|
31 | S PATSBY=$NA(^TMP("PatsPersonXml",$J))
|
---|
32 | ; Now build the output.
|
---|
33 | D HDR
|
---|
34 | S OUTCNT=2
|
---|
35 | D EN2(.OUTCNT),FOOTER(.OUTCNT)
|
---|
36 | Q
|
---|
37 | ;
|
---|
38 | ;
|
---|
39 | LOOKUP1 ; Use current routine to standardize the name (IA #3065)
|
---|
40 | ; (name may contain spaces or apostrophes).
|
---|
41 | S STDNAME=LKUPVAL
|
---|
42 | I '$G(PATSROWS) S PATSROWS=10
|
---|
43 | S PATSMORE=0
|
---|
44 | I STDNAME["," S STDNAME=$$FORMAT^XLFNAME7(.STDNAME,1,35,,,,,1)
|
---|
45 | E S STDNAME=$$FORMAT^XLFNAME7(.STDNAME,1,35,,0,,1,1)
|
---|
46 | ; If we've already found all matches to current standard, get out.
|
---|
47 | N QOUT S QOUT=0
|
---|
48 | I (ULASTNM[" ")!(ULASTNM["'") D Q:QOUT
|
---|
49 | . S X=$P($G(PATSFRM0),",")
|
---|
50 | . Q:X=""
|
---|
51 | . I (X[" ")!(X["'") Q
|
---|
52 | . S QOUT=1 Q
|
---|
53 | ; Get list of matching names.
|
---|
54 | D GETLIST(STDNAME,PATSROWS,.PATSFRM0,.PATSFRM1,.PATSMORE,.FROM)
|
---|
55 | Q
|
---|
56 | LOOKUP2 ; Use old routine to standardize the name (no punctuation
|
---|
57 | ; except hyphens).)
|
---|
58 | ; Quit if the maximum number of names has been found.
|
---|
59 | Q:PATSMORE
|
---|
60 | ; Convert user input using old standardization routine
|
---|
61 | S STDNAME=LKUPVAL
|
---|
62 | D STDNAME^XLFNAME(.STDNAME,"FG")
|
---|
63 | ; Find enough names to fill the list
|
---|
64 | N NEWROWS
|
---|
65 | S NEWROWS=PATSROWS-$P($G(^TMP("DILIST",$J,0)),"^")
|
---|
66 | ; If list is already full, see whether there are more names
|
---|
67 | ; using the old standardization, then quit.
|
---|
68 | I NEWROWS'>0 D Q
|
---|
69 | . I $D(^VA(200,"B",STDNAME)) S NEWROWS=1
|
---|
70 | . E S X=$O(^VA(200,"B",STDNAME)) I $E(X,1,$L(STDNAME))=STDNAME S NEWROWS=1
|
---|
71 | . I NEWROWS=1 S PATSMORE=1,FROM(1)=STDNAME,FROM(2)=""
|
---|
72 | . Q
|
---|
73 | ; Save off names found using current name standardization.
|
---|
74 | K ^TMP("QACOLD",$J)
|
---|
75 | I $D(^TMP("DILIST",$J)) D
|
---|
76 | . M ^TMP("QACOLD",$J)=^TMP("DILIST",$J)
|
---|
77 | . K ^TMP("QACOLD",$J,0) Q
|
---|
78 | K ^TMP("DILIST",$J)
|
---|
79 | ; Get new list of matching names.
|
---|
80 | D GETLIST(STDNAME,NEWROWS,.PATSFRM0,.PATSFRM1,.PATSMORE,.FROM)
|
---|
81 | ; Merge the two lists into ^TMP("DILIST",$J).
|
---|
82 | S I=$O(^TMP("QACOLD",$J,PATSROWS+1),-1)
|
---|
83 | I I D
|
---|
84 | . S X=$P($G(^TMP("DILIST",$J,0)),"^")
|
---|
85 | . I X F J=1:1:X I $D(^TMP("DILIST",$J,J,0)) S ^TMP("QACOLD",$J,(I+J),0)=^TMP("DILIST",$J,J,0) K ^TMP("DILIST",$J,J,0)
|
---|
86 | . M ^TMP("DILIST",$J)=^TMP("QACOLD",$J)
|
---|
87 | . S $P(^TMP("DILIST",$J,0),"^")=X+I
|
---|
88 | . K ^TMP("QACOLD",$J)
|
---|
89 | . Q
|
---|
90 | Q
|
---|
91 | GETLIST(STDNAME,PATSROWS,PATSFRM0,PATSFRM1,PATSMORE,FROM) ; Get a list of names matching STDNAME
|
---|
92 | N FIRST,LAST,LEN,SCR,CURRDT
|
---|
93 | S LAST=$P(STDNAME,","),FIRST=$P(STDNAME,",",2,99)
|
---|
94 | S CURRDT=$$DT^XLFDT()
|
---|
95 | ; Screen out terminated users.
|
---|
96 | S SCR="I ($P(^(0),""^"",11)=""""!(CURRDT<$P(^(0),""^"",11)))"
|
---|
97 | ; If first name was passed, check for it with a screen.
|
---|
98 | S LEN=$L(FIRST) I LEN>0 S SCR=SCR_",$E($P($P(^(0),""^""),"","",2,99),1,"_LEN_")="_""""_FIRST_""""
|
---|
99 | ; Set the starting values, and partial match values.
|
---|
100 | I $G(PATSFRM0)="" S FROM(1)=LAST,FROM(2)=""
|
---|
101 | E S FROM(1)=PATSFRM0,FROM(2)=$G(PATSFRM1)
|
---|
102 | S PART(1)=LAST
|
---|
103 | ; Return list of standard name pointer, title and mail code (IA #10060)
|
---|
104 | D LIST^DIC(200,,"@;8;28","MP",PATSROWS,.FROM,.PART,"B",SCR)
|
---|
105 | ; Set flag telling whether there are more entries to fetch).
|
---|
106 | S PATSMORE=$S(FROM(1)="":0,1:1)
|
---|
107 | Q
|
---|
108 | ;
|
---|
109 | HDR ; Build header node
|
---|
110 | S ^TMP("PatsPersonXml",$J,1)="<?xml version=""1.0"" encoding=""utf-8""?>"
|
---|
111 | S ^TMP("PatsPersonXml",$J,2)="<PersonDataSet hasMore="""_PATSMORE_""" patsFrom0="""_FROM(1)_""" patsFrom1="""_FROM(2)_""" vistAError="""_PATSERR_""">"
|
---|
112 | Q
|
---|
113 | ;
|
---|
114 | EN2(OUTCNT) ; Build output for individual persons.
|
---|
115 | N TAGLIST,IENS,TITLE,MAILCODE,NAMECOMP,I,J,X,Y
|
---|
116 | ; Build list of XML tags to use in output.
|
---|
117 | D BLDLST(.TAGLIST)
|
---|
118 | ; Read through lister results and build output
|
---|
119 | F I=0:0 S I=$O(^TMP("DILIST",$J,I)) Q:'I S X=$G(^(I,0)) D
|
---|
120 | . S OUTCNT=OUTCNT+1
|
---|
121 | . S ^TMP("PatsPersonXml",$J,OUTCNT)="<PatsPerson>"
|
---|
122 | . S IENS=$P(X,"^") Q:IENS="" S IENS=IENS_","
|
---|
123 | . ; NOTE: removes reserved XML characters (see $$SYMENC^MXMLUTL, IA#4153)
|
---|
124 | . S TITLE=$$SYMENC^MXMLUTL($E($P(X,"^",2),1,30))
|
---|
125 | . S MAILCODE=$$SYMENC^MXMLUTL($E($P(X,"^",3),1,30))
|
---|
126 | . ; Get the individual name components and add them to the output (IA #3065)
|
---|
127 | . K NAMECOMP
|
---|
128 | . S NAMECOMP=$P($G(^VA(200,+IENS,0)),"^")
|
---|
129 | . ; If name contains apostrophes or spaces, use current standardization
|
---|
130 | . I ($P(NAMECOMP,",")["'")!($P(NAMECOMP,",")[" ") D
|
---|
131 | .. S NAMECOMP=$$FORMAT^XLFNAME7(.NAMECOMP,1,35,,,,,2)
|
---|
132 | .. S NAMECOMP=NAMECOMP("FAMILY")_"^"_NAMECOMP("GIVEN")_"^"_NAMECOMP("MIDDLE")_"^"_NAMECOMP("SUFFIX")
|
---|
133 | .. Q
|
---|
134 | . ; Else, use old standardization routine.
|
---|
135 | . E D
|
---|
136 | .. K NAMECOMP S NAMECOMP("FILE")=200,NAMECOMP("FIELD")=.01,NAMECOMP("IENS")=IENS
|
---|
137 | .. S NAMECOMP=$$HLNAME^XLFNAME(.NAMECOMP,"S")
|
---|
138 | . F J=1:1:6 D
|
---|
139 | .. S OUTCNT=OUTCNT+1
|
---|
140 | .. S Y=$P(NAMECOMP,"^",J)
|
---|
141 | .. S ^TMP("PatsPersonXml",$J,OUTCNT)="<"_TAGLIST(J)_">"_Y_"</"_TAGLIST(J)_">"
|
---|
142 | .. Q
|
---|
143 | . S OUTCNT=OUTCNT+1
|
---|
144 | . S ^TMP("PatsPersonXml",$J,OUTCNT)="<Title>"_TITLE_"</Title>"
|
---|
145 | . S OUTCNT=OUTCNT+1
|
---|
146 | . S ^TMP("PatsPersonXml",$J,OUTCNT)="<MailCode>"_MAILCODE_"</MailCode>"
|
---|
147 | . S OUTCNT=OUTCNT+1
|
---|
148 | . S ^TMP("PatsPersonXml",$J,OUTCNT)="<VistaIen>"_$P(X,"^")_"</VistaIen>"
|
---|
149 | . S OUTCNT=OUTCNT+1
|
---|
150 | . S ^TMP("PatsPersonXml",$J,OUTCNT)="</PatsPerson>"
|
---|
151 | . Q
|
---|
152 | Q
|
---|
153 | ;
|
---|
154 | FOOTER(OUTCNT) ; Add the footer
|
---|
155 | S ^TMP("PatsPersonXml",$J,OUTCNT+1)="</PersonDataSet>"
|
---|
156 | K ^TMP("DILIST",$J)
|
---|
157 | Q
|
---|
158 | ;
|
---|
159 | CONV(NAMEPART) ; Convert a name part to mixed case
|
---|
160 | N LEN,TEMP,UPPER,I,X
|
---|
161 | S LEN=$L(NAMEPART),UPPER=1,TEMP=""
|
---|
162 | F I=1:1:LEN S X=$E(NAMEPART,I,I) D
|
---|
163 | . I UPPER=1 D
|
---|
164 | .. I X?1L S X=$C($A(X)-32)
|
---|
165 | .. S UPPER=0 Q
|
---|
166 | . E I X?1U S X=$C($A(X)+32)
|
---|
167 | . S TEMP=TEMP_X
|
---|
168 | . I X'?1L,X'?1U S UPPER=1
|
---|
169 | . Q
|
---|
170 | Q TEMP
|
---|
171 | ;
|
---|
172 | BLDLST(TAGLIST) ; Build list of XML data tags
|
---|
173 | S TAGLIST(1)="LastName"
|
---|
174 | S TAGLIST(2)="FirstName"
|
---|
175 | S TAGLIST(3)="MiddleName"
|
---|
176 | S TAGLIST(4)="NameSuffix"
|
---|
177 | S TAGLIST(5)="NamePrefix"
|
---|
178 | S TAGLIST(6)="Degree"
|
---|
179 | Q
|
---|
180 | ;
|
---|