Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: BEHOVM

BEHOVM.m

Go to the documentation of this file.
  1. BEHOVM ;MSC/IND/DKM - Cover Sheet: Vital Measurements ;29-Apr-2014 13:35;DU
  1. ;;1.1;BEH COMPONENTS;**001003,001004,001005,001006,001009,001010**;Sep 18, 2007
  1. ;=================================================================
  1. ; RPC: Return patient's most recent vital measurements
  1. ; vfile ien^vital name^vital abbr^date/time taken^value+units (US & metric)^Pt status (in,out)
  1. LIST(DATA,DFN,START,END,VITS,VSTR,METRIC,PTST,FSDATA) ;EP
  1. N RMAX,O2
  1. S RMAX=1
  1. D QUERY("LISTX")
  1. Q
  1. ; Format data for list view
  1. LISTX N X
  1. S X=RESULT(VUNT)_" "_$P(VUNT(VUNT),U)_U
  1. S:VUNT(0)'=VUNT(1) X=X_RESULT('VUNT)_" "_$P(VUNT('VUNT),U)
  1. I $G(O2)'="" S QUALIF=QUALIF_" "_O2 K O2 ;EHR11
  1. D ADD(VIEN_U_VNAM_U_VABR_U_DATE_U_X_U_QUALIF)
  1. Q
  1. ; RPC: Return last vital for a specific date range
  1. LASTVIT(DATA,DFN,START,END,VITS,METRIC,FSDATA) ;EP
  1. N VSTR,RMAX
  1. S RMAX=1
  1. D QUERY("LASTVITX")
  1. Q
  1. ; Format data for list view
  1. LASTVITX N X
  1. S X=RESULT(VUNT)_" "_$P(VUNT(VUNT),U)_U
  1. S:VUNT(0)'=VUNT(1) X=X_"("_RESULT('VUNT)_" "_$P(VUNT('VUNT),U)_")"
  1. D ADD(VIEN_U_VABR_U_RESULT(VUNT)_U_DATE_U_X_U_QUALIF)
  1. Q
  1. ; Return last vital for specified type
  1. ; Return format is: DT TAKEN^DFN^VTYP^VCTL^LOC^ENTERED BY^^RATE
  1. LAST(DFN,VITS,METRIC,START,END) ;EP
  1. N VSTR,RMAX,DATA,LAST
  1. S RMAX=1
  1. D QUERY("LASTX")
  1. Q $G(LAST)
  1. LASTX S LAST=DATE_U_DFN_U_VTYP_U_VCTL_U_LOC_U_ENTERBY_U_U_RESULT(METRIC)_U_QUALIF
  1. Q
  1. ; RPC: Return data for grid view
  1. GRID(DATA,DFN,START,END,RMAX,VITS,VSTR,METRIC,SD,FSDATA,PTST) ;EP
  1. N CNT
  1. S:'$G(RMAX) RMAX=$$GET^XPAR("ALL","BEHOVM MAX RETURN","GRID")
  1. D QUERY("GRIDX",.CNT,.SD)
  1. M @DATA@(0)=VITS
  1. S @DATA@(0)=CNT(1)_U_CNT(2)_U_CNT(3)
  1. Q
  1. ; Format for grid view
  1. GRIDX I '$D(DATE(DATE(0))) D
  1. .S CNT(2)=CNT(2)+1,DATE(DATE(0))=CNT(2)
  1. .D ADD(CNT(2)_U_DATE(0),,DATE(0))
  1. I $G(O2)'="" S QUALIF=QUALIF_":"_O2 K O2 ;EHR11
  1. D ADD(DATE(DATE(0))_U_CNT(1)_U_RESULT(METRIC)_U_$$FLAG_U_VIEN_U_QUALIF,,"R")
  1. I $G(COMMENT)'="" D ADD(DATE(DATE(0))_U_CNT(1)_U_VIEN_U_COMMENT,,"C")
  1. S CNT(3)=CNT(3)+1
  1. Q
  1. ; RPC: Return data for vital entry template
  1. TEMPLATE(DATA,DFN,VSTR,METRIC) ;EP
  1. N VITS,RMAX
  1. S:'$P(VSTR,";",4) $P(VSTR,";",4)=-1
  1. D VLIST(.VITS,"BEHOVM TEMPLATE",+VSTR)
  1. ;IHS/MSC/MGH Called now to truncate to 2 decimal places
  1. S RMAX=$$GET^XPAR("ALL","BEHOVM MAX RETURN","TEMPLATE")
  1. D GRID(.DATA,DFN,,,RMAX,.VITS,VSTR,.METRIC,2)
  1. Q
  1. ; Return flag for abnormal
  1. FLAG() N LO,HI,VAL
  1. S LO=$P(VUNT(VUNT),U,2,3),HI=$P(LO,U,2),LO=$P(LO,U),VAL=RESULT(VUNT)
  1. Q $S(VAL'=+VAL:"",$L(LO)&(VAL<LO):"L",$L(HI)&(VAL>HI):"H",1:"")
  1. ; RPC: Return data for detail view
  1. DETAIL(DATA,DFN,START,END,RMAX,VITS,VSTR,METRIC) ;EP
  1. D QUERY("DETAILX")
  1. Q
  1. ; Format for detail view
  1. DETAILX I '$D(DATE(DATE(0),LOC,ENTERBY)) D
  1. .S CNT(2)=CNT(2)+1,DATE(DATE(0),LOC,ENTERBY)=CNT(2)
  1. .D ADD("",,CNT(2))
  1. .D ADD($$ENTRY^CIAUDT(DATE)_" Location: "_$P($G(^SC(LOC,0)),U)_" Entered by: "_$P($G(^VA(200,ENTERBY,0)),U),,CNT(2))
  1. .D ADD($$REPEAT^XLFSTR("-",80),,CNT(2))
  1. I $G(O2)'="" S QUALIF=QUALIF_" "_O2 K O2 ;EHR11
  1. D ADD(RESULT(METRIC)_" "_$P(VUNT(METRIC),U)_" "_QUALIF," "_VNAM,DATE(DATE(0),LOC,ENTERBY))
  1. Q
  1. ; Query logic for vitals
  1. QUERY(RTN,CNT,SD) ;
  1. N SEQ,VIEN,IDT,DATE,LOC,VTYP,VNAM,VCTL,VABR,RCNT,RESULT,ENTERBY,VMSR,VUNT,VSIT,QRY,DEFUNT,X,Y,Z
  1. N QUALS,QUALIF,QUALN,QUALIEN,COMMENT,QARY
  1. S DATA=$$TMPGBL^CIAVMRPC,START=+$G(START),END=+$G(END),RMAX=+$G(RMAX),VSTR=$G(VSTR),VSIT=+$P(VSTR,";",4),PTST=$G(PTST)
  1. S (CNT,CNT(1),CNT(2),CNT(3),SEQ)=0
  1. Q:'DFN
  1. S:'START START=DT+1
  1. S:START<END X=START,START=END,END=X
  1. S START=9999999-$S(START#1:START,1:START+.9),END=9999999-END
  1. S:'RMAX RMAX=99999999
  1. I $D(VITS)=1,$L(VITS) S VITS(1)=VITS
  1. D:$D(VITS)'>1 VLIST(.VITS,"BEHOVM VITAL LIST",+VSTR)
  1. S VMSR=$$VMSR,METRIC=$G(METRIC,-1),METRIC=$S(METRIC<0:-1,METRIC>0:1,1:0),DEFUNT=METRIC<0
  1. F S SEQ=$O(VITS(SEQ)) Q:'SEQ D
  1. .S VCTL=+VITS(SEQ)
  1. .D TYPEINFO(.VCTL,.VNAM,.VABR,.VUNT,VMSR,.VTYP)
  1. .;I VCTL'>0!(VTYP'>0) K VITS(SEQ) Q
  1. .S:DEFUNT METRIC=$$DEFUNIT(VCTL,VUNT)
  1. .K QARY D GETCATS^BEHOVM2(.QARY,VABR)
  1. .S VITS(SEQ)=VCTL_U_VTYP_U_VNAM_U_VABR_U_VUNT(METRIC)_U_$S($O(^BEHOVM(90460.01,VCTL,3,0)):"BEHOVM PCTILE",1:"")_U_($D(@(QARY))=10)
  1. .S IDT=START,RCNT=0,CNT(1)=CNT(1)+1,QRY=$G(^BEHOVM(90460.01,VCTL,10))
  1. .I $L(QRY) X QRY Q
  1. .D QRYGMR:'VMSR,QRYMSR:VMSR
  1. Q
  1. ; Query logic for Vitals package
  1. QRYGMR F Q:'IDT!(IDT>END)!(RCNT=RMAX) D
  1. .S VIEN=$C(1)
  1. .S XREF="AA"
  1. .F S VIEN=$O(^GMR(120.5,XREF,DFN,VTYP,IDT,VIEN),-1) Q:'VIEN D Q:RCNT=RMAX
  1. ..;IHS/MSC/MGH Quit if this vital was entered in error
  1. ..Q:$P($G(^GMR(120.5,VIEN,2)),U) S X=$G(^(0))
  1. ..Q:$P(X,U,2)'=DFN
  1. ..Q:$P(X,U,3)'=VTYP
  1. ..I VSIT,+$G(^GMR(120.5,VIEN,9000010))'=VSIT Q
  1. ..S RESULT(VUNT)=$$TRIM^XLFSTR($P(X,U,8)),DATE=+X,LOC=+$P(X,U,5),ENTERBY=+$P(X,U,6),RCNT=RCNT+1
  1. ..S DATE(0)=DATE*10000\1/10000
  1. ..;IHS/MSC/MGH Get qualifier informaton for GMR file patch 5
  1. ..S QUALIF="",COMMENT=""
  1. ..S QUALS=0 F S QUALS=$O(^GMR(120.5,VIEN,5,QUALS)) Q:QUALS="" D
  1. ...S QUALN=$P($G(^GMR(120.5,VIEN,5,QUALS,0)),U,1)
  1. ...I +QUALN S QUALN=$P($G(^GMRD(120.52,QUALN,0)),U,1)
  1. ...I QUALIF="" S QUALIF=QUALN
  1. ...E I QUALN'="" S QUALIF=QUALIF_"~"_QUALN
  1. ..D CALLBCK
  1. .S IDT=$O(^GMR(120.5,"AA",DFN,VTYP,IDT))
  1. Q
  1. ; Query logic for V file
  1. QRYMSR D BLDXRF(VTYP)
  1. F Q:'IDT!(RCNT=RMAX) D
  1. .S VIEN=$C(1)
  1. .F S VIEN=$O(^TMP("BEHOVM",$J,VTYP,IDT,VIEN),-1) Q:'VIEN D Q:RCNT=RMAX
  1. ..D GETMSR(VIEN,.X,.DATE,.LOC,.ENTERBY)
  1. ..S RESULT(VUNT)=X,RCNT=RCNT+1
  1. ..K O2 S O2=$P($G(^AUPNVMSR(VIEN,0)),U,10) ;EHR11
  1. ..S QUALIF=""
  1. ..S QUALS=0 F S QUALS=$O(^AUPNVMSR(VIEN,5,QUALS)) Q:'+QUALS D
  1. ...S QUALIEN=$P($G(^AUPNVMSR(VIEN,5,QUALS,0)),U,1)
  1. ...I +QUALIEN D
  1. ....S QUALN=$P($G(^GMRD(120.52,QUALIEN,0)),U,1)
  1. ....;S QUALIF=$S(QUALIF="":$S(RTN="GRIDX":QUALIEN_";"_QUALN,1:QUALN),1:$S(RTN="GRIDX":QUALIF_","_QUALIEN_";"_QUALN,1:QUALIF_","_QUALN))
  1. ....S QUALIF=$S(QUALIF="":QUALN,1:QUALIF_","_QUALN)
  1. ..D CALLBCK
  1. .S IDT=$O(^TMP("BEHOVM",$J,VTYP,IDT))
  1. K ^TMP("BEHOVM",$J)
  1. Q
  1. ; Query logic for BMI
  1. ; Redone to use same logic as health summary
  1. QRYBMI(PCTILE) ;
  1. D QRYBMI^BEHOVM2(PCTILE)
  1. Q
  1. ; Get measurement data
  1. GETMSR(VIEN,RESULT,DATE,LOC,ENTERBY) ;
  1. N X,X12,DATEE
  1. S X=$G(^AUPNVMSR(VIEN,0)),X12=$G(^(12))
  1. S DATEE=$P(X,U,7)
  1. S DATE=+X12,ENTERBY=+$P(X12,U,4)
  1. S RESULT=$$TRIM^XLFSTR($P(X,U,4)),X=+$P(X,U,3)
  1. S X=$G(^AUPNVSIT(X,0))
  1. S:'DATE DATE=+X
  1. S LOC=+$P(X,U,22),DATE(0)=DATE*10000\1/10000
  1. ;IHS/MSC/MGH Get qualifier information patch 5
  1. S QUALIF="" S COMMENT=""
  1. I $D(^AUPNVMSR(VIEN,5))>0 D
  1. .S QUALS=0 F S QUALS=$O(^AUPNVMSR(VIEN,5,QUALS)) Q:QUALS="" D
  1. ..S QUALN=$P($G(^AUPNVMSR(VIEN,5,QUALS,0)),U,1)
  1. ..I QUALN S QUALN=$P($G(^GMRD(120.52,QUALN,0)),U,1)
  1. ..I QUALIF="" S QUALIF=QUALN
  1. ..E S QUALIF=QUALIF_"~"_QUALN
  1. I +$G(FSDATA)>0 D
  1. .S COMMENT=$P($G(^AUPNVMSR(VIEN,811)),U,1)
  1. Q
  1. ; Build temp xref for measurement type
  1. BLDXRF(VTYP) ;
  1. N X,Y,Z,TT,CVISIT,CTYPE,XREF,MDATE,EIE
  1. S X=0
  1. K ^TMP("BEHOVM",$J,VTYP)
  1. ;IHS/MSC/MGH Use different cross-reference if flowsheets
  1. I +$G(FSDATA)>0 S XREF="AE"
  1. E S XREF="AA"
  1. F S X=$O(^AUPNVMSR(XREF,DFN,VTYP,X)),VIEN=0 Q:'X D
  1. .F S VIEN=$O(^AUPNVMSR(XREF,DFN,VTYP,X,VIEN)) Q:'VIEN D
  1. ..S Z=$G(^AUPNVMSR(VIEN,0)),Y=+$G(^(12)),Y=$S(Y:9999999-Y,1:X)
  1. ..S Y=$S(XREF="AA":Y,1:X)
  1. ..Q:+Z'=VTYP
  1. ..Q:$P(Z,U,2)'=DFN
  1. ..I VSIT,$P(Z,U,3)'=VSIT Q
  1. ..S MDATE=$S(XREF="AA":Y,1:X)
  1. ..Q:MDATE<START
  1. ..Q:MDATE>END
  1. ..;IHS/MSC/MGH Quit if entered in error
  1. ..S EIE=$$GET1^DIQ(9000010.01,VIEN,2,"I")
  1. ..Q:EIE=1
  1. ..;IHS/MSC/MGH Check for inpt or outpt status
  1. ..I PTST="I"!(PTST="O") D
  1. ...S CVISIT=$P($G(^AUPNVMSR(VIEN,0)),U,3)
  1. ...I CVISIT'="" S CTYPE=$P($G(^AUPNVSIT(CVISIT,0)),U,7)
  1. ...I PTST="H"&(CTYPE="H") S ^TMP("BEHOVM",$J,VTYP,MDATE,VIEN)=""
  1. ...I PTST="O"&(CTYPE'="H") S ^TMP("BEHOVM",$J,VTYP,MDATE,VIEN)=""
  1. ..I PTST="" S ^TMP("BEHOVM",$J,VTYP,MDATE,VIEN)=""
  1. Q
  1. ; Perform query callback
  1. CALLBCK S RESULT('VUNT)=$$CONVERT(RESULT(VUNT),VUNT,.SD)
  1. S RESULT(VUNT)=$$ROUND(RESULT(VUNT),.SD)
  1. D @RTN
  1. Q
  1. ; Return info for vital type
  1. TYPEINFO(VCTL,VNAM,VABR,VUNT,VMSR,VTYP) ;EP
  1. N X
  1. S VCTL=$$VCTL(VCTL)
  1. S X=$G(^BEHOVM(90460.01,VCTL,0))
  1. I '$L(X) S (VNAM,VABR,VUNT,VCTL)="" Q
  1. S VNAM=$P(X,U),VABR=$P(X,U,7)
  1. S:'$D(VMSR) VMSR=$$VMSR
  1. F X=VABR,VNAM D Q:VTYP
  1. .S VTYP=$$VTYPE(X,VMSR)
  1. ;I 'VTYP S (VNAM,VABR,VUNT,VCTL)="" Q
  1. D UNITS(.VUNT)
  1. Q
  1. ; Returns IEN of vital control ien
  1. VCTL(X) Q $S(X=+X:X,1:+$O(^BEHOVM(90460.01,"B",X,0)))
  1. ; Returns vital control IEN given measure type IEN
  1. TYP2CTL(VTYP,VMSR) ;
  1. N FNUM,X
  1. S:'$D(VMSR) VMSR=$$VMSR
  1. S FNUM=$S(VMSR:9999999.07,1:120.51)
  1. S X=$$GET1^DIQ(FNUM,VTYP,.01)
  1. S:$L(X) X=$$VCTL(X)
  1. Q:X X
  1. S X=$$GET1^DIQ(FNUM,VTYP,$S(VMSR:.02,1:7))
  1. Q $S($L(X):$$VCTL(X),1:"")
  1. ; Gets vital type based on name or abbreviation
  1. VTYPE(X,VMSR) ;
  1. N FNUM
  1. S:'$D(VMSR) VMSR=$$VMSR
  1. S FNUM=$S(VMSR:9999999.07,1:120.51)
  1. Q +$$FIND1^DIC(FNUM,"","X",$$UP^XLFSTR(X),"B^"_$S(VMSR:"D",1:"APCE^C"))
  1. ; Returns true if V file is used for vital measurements
  1. VMSR() Q ''$$GET^XPAR("ALL","BEHOVM USE VMSR")
  1. ; Get default units
  1. DEFUNIT(VCTL,VUNT) ;
  1. N UNIT
  1. D GETPAR^CIAVMRPC(.UNIT,"BEHOVM DEFAULT UNITS",,"`"_VCTL)
  1. ;S UNIT=$$GET^XPAR("ALL","BEHOVM DEFAULT UNITS","`"_VCTL)
  1. I UNIT="" D
  1. .D:$G(VUNT)="" TYPEINFO(VCTL,,,.VUNT)
  1. .S UNIT=VUNT
  1. Q UNIT
  1. ; Get vital list
  1. ; PRM = Name of parameter containing vital list
  1. ; LOC = Optional hosp location IEN
  1. VLIST(DATA,PRM,LOC) ;
  1. N ENT
  1. S ENT=$$ENT^CIAVMRPC(PRM)
  1. ;S ENT=$S($G(LOC)>0:"ALL^LOC.`"_LOC,1:"ALL")
  1. D GETLST^XPAR(.DATA,ENT,PRM,"I")
  1. Q
  1. ; Return units+normal range
  1. ; .VUNT = Returned unit values as:
  1. ; VUNT = Default system (0=US, 1=Metric)
  1. ; VUNT(0) = US unit^LO^HI
  1. ; VUNT(1) = Metric unit^LO^HI
  1. ; Return value = US unit^LO^HI^Metric unit^LO^HI
  1. UNITS(VUNT) ;
  1. N LO,HI,X
  1. I 'VCTL S VUNT=0,(VUNT(0),VUNT(1))="^^"
  1. E D
  1. .S X=^BEHOVM(90460.01,VCTL,0),VUNT=+$P(X,U,2),LO=$P(X,U,5),HI=$P(X,U,6)
  1. .S VUNT(VUNT)=$P(X,U,3+VUNT)_U_LO_U_HI
  1. .S VUNT('VUNT)=$P(X,U,4-VUNT)
  1. .I '$L(VUNT('VUNT)) S VUNT('VUNT)=VUNT(VUNT)
  1. .E S VUNT('VUNT)=VUNT('VUNT)_U_$$CONVERT(LO,VUNT)_U_$$CONVERT(HI,VUNT)
  1. Q:$Q VUNT(0)_U_VUNT(1)
  1. Q
  1. ; RPC: Return help text for vital type
  1. HELP(DATA,VCTL) ;EP
  1. M DATA=^BEHOVM(90460.01,VCTL,99)
  1. K DATA(0)
  1. S:$D(DATA)'>1 DATA(1)="No help is available for this item."
  1. Q
  1. ; RPC: Return percentile values
  1. PCTILE(DATA,VCTL,DFN,START,END,METRIC) ;EP
  1. D PCTILE^BEHOVM2(.DATA,VCTL,DFN,START,END,.METRIC)
  1. Q
  1. ; Round value to specified # fractional digits
  1. ROUND(VAL,SD) ;
  1. Q:VAL'=+VAL!($G(SD)=0) VAL
  1. Q +$J(VAL,0,$S($D(SD):SD,VAL<1:2,VAL<10:2,1:2))
  1. ; Convert between metric and US
  1. CONVERT(X,TOUS,SD) ;
  1. Q:'VCTL!'$L(X) ""
  1. X $G(^BEHOVM(90460.01,VCTL,$S(TOUS:2,1:1)))
  1. S X=$$ROUND(X,.SD)
  1. Q X
  1. ; Convert ff'ii" to inches
  1. CVTFTIN(X) ;
  1. N F,I
  1. I X'["'",X'["""" Q X
  1. S X=$TR(X," ")
  1. I X["'" S F=$P(X,"'"),I=$P(X,"'",2,99) Q:F'=+F X
  1. E S F=0,I=X
  1. I $L(I) Q:$E(I,$L(I))'="""" X S I=$E(I,1,$L(I)-1) Q:I'=+I X
  1. Q F*12+I_"IN"
  1. ; Valid blood pressure
  1. VALIDBP(VAL,SLO,SHI,DLO,DHI) ;EP
  1. N SBP,DBP
  1. I VAL'?1.N1"/"1.N S VAL="-1^Format must be <systolic>/<diastolic>." Q
  1. S SBP=+$P(VAL,"/"),DBP=+$P(VAL,"/",2)
  1. D VALIDNUM(.SBP,SLO,SHI)
  1. I SBP[U S VAL="-1^Systolic pressure "_$P(SBP," ",2,999) Q
  1. D VALIDNUM(.DBP,DLO,DHI)
  1. I DBP[U S VAL="-1^Diastolic pressure "_$P(DBP," ",2,999) Q
  1. I SBP'>DBP S VAL="-1^Systolic BP<Diastolic BP" Q
  1. S VAL=SBP_"/"_DBP
  1. Q
  1. ; Validate integer value
  1. VALIDINT(VAL,LO,HI,INC) ;EP
  1. I VAL\1'=VAL S VAL="-1^Input must be an integer value." Q
  1. D VALIDNUM(.VAL,LO,HI)
  1. I $G(INC),VAL'[U,VAL#INC S VAL="-1^Input must be in increments of "_INC_"."
  1. Q
  1. ; Validate numeric value
  1. VALIDNUM(VAL,LO,HI) ;EP
  1. I VAL'=+VAL S VAL="-1^Input must be a numeric value."
  1. E I VAL<LO!(VAL>HI) D
  1. .N UNT
  1. .I VUNT'=METRIC S LO=$$CONVERT(LO,VUNT),HI=$$CONVERT(HI,VUNT),UNT=VUNT('VUNT)
  1. .E S UNT=VUNT(VUNT)
  1. .S VAL="-1^Input must be between "_LO_" and "_HI_" "_$P(UNT,U)_"."
  1. Q
  1. ; Validate tonometric value
  1. VALIDTON(VAL) ;EP
  1. N LV,RV
  1. S VAL=$$UP^XLFSTR(VAL)
  1. I $L(VAL,"/")>2 S VAL=-1
  1. E D
  1. .S RV=$P(VAL,"/"),LV=$P(VAL,"/",2),VAL=""
  1. .I $E(RV)="L" D Q:VAL
  1. ..I LV="" S LV=RV,RV=""
  1. ..E S VAL=-1
  1. .D VT1(.RV,"R"),VT1(.LV,"L")
  1. I VAL S:VAL'[U $P(VAL,U,2)="Invalid input format."
  1. E S VAL=RV_$S($L(LV):"/",1:"")_LV
  1. Q
  1. VT1(TON,PFX) ;
  1. S:$E(TON)=PFX TON=$E(TON,2,999)
  1. Q:'$L(TON)
  1. I $TR(TON,"0123456789")'="" S VAL=-1
  1. E D
  1. .S TON=+TON
  1. .I TON>80 S VAL="-1^Value must be between 0 and 80, inclusive."
  1. .E S TON=PFX_TON
  1. Q
  1. ; RPC: Validate value X for measurement type VCTL
  1. ; Returns normalized value in DATA if valid, or -1^error if not
  1. VALIDATE(DATA,VCTL,METRIC,X) ;EP
  1. N VABR,VUNT,VMSR,LP,UNIT
  1. D TYPEINFO(.VCTL,,,.VUNT)
  1. S X=$$UP^XLFSTR($$TRIM^XLFSTR(X)),METRIC=$G(METRIC,-1),METRIC=$S(METRIC<0:$$DEFUNIT(VCTL,VUNT),METRIC>0:1,1:0),UNIT=-1
  1. S X=$$CVTFTIN(X)
  1. F LP=VUNT,1-VUNT D Q:UNIT>-1
  1. .N Y,Z
  1. .S Y=$$UP^XLFSTR($P(VUNT(LP),U))
  1. .F Z=1:1:$L(Y) D Q:UNIT>-1
  1. ..S:$E(X,$L(X)-Z+1,99)=$E(Y,1,Z) UNIT=LP,X=$$TRIM^XLFSTR($E(X,1,$L(X)-Z))
  1. S:UNIT<0 UNIT=METRIC
  1. S:UNIT'=VUNT X=$$CONVERT(X,UNIT,0),UNIT=VUNT
  1. X $G(^BEHOVM(90460.01,VCTL,4))
  1. S:$G(X)="" X="-1^Invalid entry. Try again."
  1. I X'[U,UNIT'=METRIC S X=$$CONVERT(X,UNIT,2)
  1. S DATA=X
  1. Q
  1. ; Normalize value for storage
  1. NORM(VTYP,VAL,UNT,VMSR) ;EP
  1. N VCTL,VUNT
  1. S:'$D(VMSR) VMSR=$$VMSR
  1. S VCTL=$S(VTYP=+VTYP:$$TYP2CTL(VTYP,VMSR),1:VTYP)
  1. D TYPEINFO(.VCTL,,,.VUNT,VMSR,.VTYP)
  1. Q:'VCTL!'VTYP "-1^Unrecognized measurement type."
  1. Q:VAL=" " 0
  1. D VALIDATE(.VAL,VCTL,VUNT,VAL_UNT)
  1. Q:VAL[U VAL
  1. S UNT=$P(VUNT(VUNT),U)
  1. Q 0
  1. ; RPC: Store vitals data
  1. SAVE(DATA,DFN,VITS) ;EP
  1. N VMSR,LP,VCNT
  1. S VMSR=$$VMSR,LP="",VCNT=0
  1. ;IHS/MSC/MGH EHR Patch 13 Reorder the array so that HT is first
  1. D REORDER(.VITS)
  1. F S LP=$O(VITS(LP)) Q:'LP D
  1. .N VTYP,VAL,UNT,DEL,X
  1. .S VITS=VITS(LP)
  1. .Q:$E(VITS,1,3)'="VIT"
  1. .S DEL=$P(VITS,U)["-",VTYP=$P(VITS,U,2)
  1. .S VAL=$S(DEL:" ",1:$P(VITS,U,5)),UNT=$S(DEL:"",1:$P(VITS,U,7))
  1. .I $$NORM(.VTYP,.VAL,.UNT,VMSR) S VCNT=VCNT+1
  1. .E S $P(VITS,U,2)=VTYP,$P(VITS,U,5)=VAL,$P(VITS,U,7)=UNT,VITS(LP)=VITS
  1. I VCNT S DATA="-1^"_$$SNGPLR^CIAU(VCNT," entry"," entries")_" failed validation. No results stored."
  1. E D SAVE^BEHOENPC(.DATA,.VITS)
  1. Q
  1. REORDER(VITS) ;resort the list
  1. N LP,CNT,LIST,CNT2
  1. S CNT=0,CNT2=1,LP=""
  1. F S LP=$O(VITS(LP)) Q:'LP D
  1. .S CNT=LP
  1. .I $E($P(VITS(LP),U,1),1,3)="VIT" D
  1. ..I $P(VITS(LP),U,2)="HT" D
  1. ...S LIST(1)=VITS(LP)
  1. ...K VITS(LP)
  1. ..E D
  1. ...S CNT2=CNT2+1
  1. ...S LIST(CNT2)=VITS(LP)
  1. ...K VITS(LP)
  1. S I=""
  1. F S I=$O(LIST(I)) Q:'I D
  1. .S CNT=CNT+1
  1. .S VITS(CNT)=LIST(I)
  1. Q
  1. ; Add to output global
  1. ADD(TXT,LBL,SUB) ;
  1. S CNT=CNT+1,@DATA@($G(SUB,0),CNT)=$S($D(LBL):$$LJ^XLFSTR(LBL,20),1:"")_$G(TXT),LBL=""
  1. Q