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

INHUT10.m

Go to the documentation of this file.
  1. INHUT10 ; JPD ; 21 Feb 96 11:01; HL7 utilities TIME STAMP
  1. ;;3.01;BHL IHS Interfaces with GIS;;JUL 01, 2001
  1. ;COPYRIGHT 1991-2000 SAIC
  1. ;
  1. ;NO LINETAGS IN THIS ROUTINE ARE SUPPORTED FOR EXECUTION BY ANY
  1. ;SOFTWARE OUTSIDE THE GIS PACKAGE (IN*)
  1. ;
  1. TIMEIO(X,INP,INCV,IN24,INOUT) ;Convert time to input or output
  1. ;Input:
  1. ; X - date/time
  1. ; INP(opt) - Precision Y=year, L=month, D=day, H=hour, M=minute,S=second
  1. ; 1=Auto precision
  1. ; INCV(opt) - 1 convert, 0 don't convert, 2 convert no 2nd component
  1. ; 3 convert 2.3
  1. ;
  1. ; IN24(opt) - midnight offset
  1. ; outbound - INOUT flag set to 0
  1. ; 0 do nothing, 1 - add 1 day set time to 0000
  1. ; 2 - subtract one second, 3 - subtract one minute
  1. ; inbound - INOUT flag set to 1
  1. ; 0 - do nothing, 1 - subtract 1 day set time to 2400
  1. ; 2 - add one second, 3 - add one minute
  1. ; INOUT - 0 or null outbound - converts from fileman to HL7
  1. ; 1 inbound - converts from HL7 to fileman
  1. ;
  1. ;External Input:
  1. ; (opt) INSUBDEL - Sub delimeter
  1. ;
  1. ;Output:
  1. ; INP - Precision
  1. ;
  1. ;Returns: function
  1. ; date/time in converted format
  1. ;
  1. ;Outbound
  1. Q:'$G(INOUT) $$TS(.X,.INP,.INCV,.IN24)
  1. ;inbound
  1. Q $$HDT(.X,"TS",0,.INP,.INCV,.IN24,1)
  1. ;
  1. TS(X,INP,INCV,IN24) ;Transform date to HL7 time stamp format
  1. ;Input:
  1. ; X - date/time in any fileman or external format
  1. ; INP(opt) - Precision Y=year, L=month, D=day, H=hour, M=minute,S=second
  1. ; 1=Auto precision
  1. ; INCV(opt) - 1 convert, 0 don't convert
  1. ; IN24(opt) - 0 - do nothing, 1 - add 1 day set time to 0000
  1. ; 2 - subtract one second, 3 - subtract one minute
  1. ;External Input:
  1. ; (opt) INSUBDEL - Sub delimeter
  1. ;Returns:
  1. ; function - date/time in HL7 format with or without precision
  1. ;
  1. ;Ignores +/- Zulu offsets and time zone differences
  1. Q:'$L(X) ""
  1. N Y,%DT,INSD,INP2,INSD,INPREC
  1. S INSD=$S($L($G(INSUBDEL)):INSUBDEL,1:$$COMP^INHUT)
  1. S INPREC=$G(INP)
  1. S %DT="ST" D ^%DT Q:Y<0 ""
  1. ;set piece 2 to preserve time
  1. S INP2=$P(Y,".",2)
  1. ;set date to HL7 format
  1. S X=$E(Y,1,3)+1700_$E(Y,4,7)
  1. ;if auto precision get length/position of last 0
  1. I INPREC S INPREC=$L(+("."_X_INP2))-1
  1. S X=X_$E(INP2_"000000",1,6)
  1. ;if precision exists
  1. S X=$S($L(INPREC):$$PRECO(X,INPREC,$G(INCV)),1:X)
  1. S INPREC=$P(X,INSD,2)
  1. ;if we want to change 2400 and the time is 2400
  1. I $G(IN24),$E(X,9,10)=24 D
  1. .;quit if precision on and Year or Month
  1. .I INPREC]"","YL"[INPREC,$G(INCV) Q
  1. .S Y=$$DT24($$TIMEIO(X,"","","",1),IN24)
  1. .S X=$$TIMEIO(Y)
  1. .S:$L(INPREC) X=X_INSD_INPREC
  1. I $G(INCV)>1 D
  1. .;remove subcomponent delimeter
  1. .S X=$P(X,INSD)
  1. .;version 2.3
  1. .I INCV=3 S X=$E(X,1,$L(+("."_X))-1)
  1. S INTZO=$$TZ^BHLV ;cmi/maw get time zone offset for this time zone
  1. I $L(X)>8 S X=X_$G(INTZO) ;cmi/maw attach time zone to this if time
  1. Q X
  1. ;
  1. HDT(X,INTS,INVA,INP,INCNV,IN24,INTI) ;Transform HL7 date format to internal fileman format
  1. ;Input:
  1. ; X - HL7 date/time
  1. ; format- ( YYYYMMDDHHMM[SS[.SSSS]][+/-ZZZZ] \ precision )
  1. ; INTS - control variable
  1. ; used as %DT if data is validated
  1. ; T - time allowed ; S - seconds allowed
  1. ; INVA - validate data (1 - yes ; 0 - no (def))
  1. ; INP(opt) -
  1. ; Precision Y=year, L=month, D=day, H=hour, M=minute,S=second
  1. ; 1=Auto precision, 0 or nothing=do nothing
  1. ; INCNV(opt) - 1 convert, 0 don't convert, 3 convert 2.3
  1. ; IN24(opt) - 0 - do nothing, 1 - subtract 1 day set time to 2400
  1. ; 2 - add one second, 3 - add one minute
  1. ;
  1. ; INTI(opt) 1 - called from TIMEIO Function, 0 or blank not called
  1. ; from TIMEIO
  1. ;Output:
  1. ; function - date in internal fileman format
  1. ; X - date in internal fileman format (pass by reference)
  1. ; INVA - valid data (1 valid ; 0 - invalid))
  1. ;
  1. ;Suggested use:
  1. ; S OK=1,C='d/t checks' S X=$$HDT^INHUT1(X,C,.OK) I 'OK Then Error
  1. ;
  1. N IN24H,INSD,INPC,INCV,INPSV,INSAVE,INTIO
  1. ;Check for non-numeric date/times
  1. I '$G(X) S X="" Q ""
  1. S IN24H=$G(IN24),INSD=$S($L($G(INSUBDEL)):INSUBDEL,1:$$COMP^INHUT)
  1. ;Ignores +/- Zulu offsets and time zone differences
  1. S INTS=$G(INTS),INVA=$G(INVA),INCV=$G(INCNV),INTIO=$G(INTI)
  1. ;Save second component
  1. S INPSV=$P(X,INSD,2)
  1. ;check precision flag and set date before processing
  1. S INPC=$G(INP),INPC=$S(INPC&(INCV'=3):$P(X,INSD,2),INPC&(INCV=3):$L($P(X,INSD)),$L(INPC):INPC,1:"")
  1. ;Save original time 'version 2.3 or version 2.3
  1. S INSAVE=$S(INCV'=3:$E($E(X,9,14)_"000000",1,6),1:$E(X,9,14))
  1. S X=$S($L(INPC):$$PRECO(X,.INPC,INCV),1:+X\1)
  1. ;Check for invalid HL7 date/time format (not completely robust)
  1. I 'INTIO,$L(X)<8,INCV'=3 S (INP,X)="" Q ""
  1. I 'INTIO,$L(X)>8,$L(X)<12,INCV'=3 S (INP,X)="" Q ""
  1. ;Remove possibility of terminal I/O from INTS (%DT)
  1. S:INVA INTS=$TR(INTS,"AEQ")
  1. I INTIO,$L(X)<8,'$L($G(INP)),'INCV,'IN24H Q $E(X,1,4)-1700_$E(X,5,8)
  1. I 'IN24H D
  1. .;Transforming Date (DT) data type
  1. .I INTS'["T"!($L(X)<9) S X=$E(X,1,4)-1700_$E(X,5,8) S:$L(X)&($L(X)<7) X=$E(X_"000000",1,7) Q
  1. .;Transforming time stamp (TS) data type
  1. .N %
  1. .I 'INTIO S %=$E($E(X,9,14)_"000000",1,6)
  1. .I INTIO S %=$E(X,9,14)
  1. .;if coming from TIMIO and no parameters passed act like olddata type TS
  1. .I INTIO,'%,'$L($G(INP)),'INCV,'IN24H S %="0001"
  1. .;treat midnight as one second after midnight
  1. .I '%,'$L($G(INP)) S %="000001"
  1. .;Handle midnight as one minute past midnight if no seconds allowed
  1. .I %,%<60,INTS'["S",'$L($G(INP)) S %="0001"
  1. .S %=$S(INTS'["S":$E(%,1,4),1:%)
  1. .;Handle imprecise dates
  1. .I INTS["I" S:'$E(X,5,6)!'$E(X,7,8)&'$E(X,9,14) %=""
  1. .;If coming in from TIMIO then act like data type if no params
  1. .I INTIO,'$L($G(INP)),'INCV,'IN24H S %=$E(%,1,4)
  1. .;set the date to fileman format for orig data type
  1. .I INTIO,'$L($G(INP)),'INCV S X=$E(X,1,4)-1700_$E(X,5,8)_"."_% Q
  1. .;set date to fileman format
  1. .S X=+($E(X,1,4)-1700_$E(X,5,8)_"."_%)
  1. ;if convert 0000 time and time is 0000
  1. ;if convert
  1. I IN24H D
  1. .S X=+($E(X,1,4)-1700_$E(X,5,8)_"."_$E($E(X,9,14)_"000000",1,6))
  1. .;If Year Month Day precision don't convert
  1. .I INPC]"","YLD"[INPC,INCV Q
  1. .;If original time was 000000
  1. .I INCV'=3,'INSAVE S X=$$DT24(X,IN24H,1)
  1. .;version 2.3 auto precision and 0's in hours and minutes field
  1. .I INCV=3,($L(INSAVE)=4&($E(INSAVE,1,4)="0000"))!($L(INSAVE)=6&($E(INSAVE,1,6)="000000")) S X=$$DT24(X,IN24H,1)
  1. ;Validate data
  1. I INVA D
  1. .I X<0 S INVA=0,X="" Q
  1. .N %DT,Y S %DT=INTS D ^%DT S X=Y I Y<0 S INVA=0,X=""
  1. ;Set precision to second component
  1. S INP=INPSV
  1. Q X
  1. ;
  1. PRECO(X,INP,INCV) ;returns date time outbound HL7 precision date
  1. ;Input:
  1. ; X - date/time in HL7 format
  1. ; INP - Precision Y=year, L=month, D=day, H=hour, M=minute, S=second
  1. ; 1=Auto precision
  1. ; INCV - 1 convert, 0 don't convert
  1. ;External Input:
  1. ; (opt) INSUBDEL - Sub delimeter
  1. ;Returns:
  1. ; function - date/time in HL7 format with or without precision
  1. ;if we actually want to convert to the precision
  1. ;
  1. I $G(INCV) D
  1. .;year only
  1. .I INP="Y" S X=$E(X,1,4)
  1. .;year month
  1. .I INP="L" S X=$E(X,1,6)
  1. .;year month day
  1. .I INP="D" S X=$E(X,1,8)
  1. .;year month day hour
  1. .I INP="H" S X=$E(X,1,10)
  1. .;year month day hour minute
  1. .I INP="M" S X=$E(X,1,12)
  1. ;Auto precision
  1. I INP S INP=$E("YYYYLLDDMMMMSS",INP)
  1. ;set sub delimeter
  1. S INSD=$S($L($G(INSUBDEL)):INSUBDEL,1:$$COMP^INHUT)
  1. Q $E(X_"00000000000000",1,14)_INSD_INP
  1. ;
  1. DT24(X,IN24,INOUT) ;change 2400 or 0000 time
  1. ;Input:
  1. ;X - date/time in fileman format
  1. ; outbound - INOUT=0
  1. ;IN24(opt)
  1. ; Outbound
  1. ; 0 do nothing, 1 - add 1 day set time to 0000
  1. ; 2 - subtract one second, 3 - subtract one minute
  1. ; Inbound - INOUT=1
  1. ; 0 - do nothing, 1 - subtract 1 day set time to 2400
  1. ; 2 - add one second, 3 - add one minute
  1. ; INOUT - 0 Outbound, 1 Inbound
  1. ;Returns:
  1. ; changed date in fileman close to format
  1. ;
  1. N INIO,INUM
  1. S INIO=$G(INOUT),INUM=$S(INIO:1,1:-1)
  1. ;outbound add day make time 0000
  1. I IN24=1 D
  1. .;outbound add day make time 0000
  1. .I 'INIO S X=$$ADDT^%ZTFDT($P(X,"."),1)
  1. .;inbound subtract day and make time 2400
  1. .I INIO S X=$$ADDT^%ZTFDT($P(X,"."),-1)_".24"
  1. ;out subtract/in add second from date
  1. I IN24=2 S X=$$ADDT^%ZTFDT(X,0,0,0,INUM)
  1. ;out subtract/in add minute
  1. I IN24=3 S X=$$ADDT^%ZTFDT(X,0,0,INUM)
  1. Q X