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

INHSGZ1.m

Go to the documentation of this file.
  1. INHSGZ1 ; cmi/flag/maw - JSH,DGH 20 Dec 1999 09:24 Interface - script generator for OUTPUT scripts ; [ 05/10/2002 3:16 PM ]
  1. ;;3.01;BHL IHS Interfaces with GIS;**1**;JUN 01, 2002
  1. ;COPYRIGHT 1991-2000 SAIC
  1. ;CHCS TOOLS_460; GEN 7; 17-JUL-1997
  1. ;COPYRIGHT 1988, 1989, 1990 SAIC
  1. ;
  1. ;This routine enters with:
  1. ; FILE = file #
  1. ; MESS = entry # of message
  1. ; MESS(0) = zero node of message file entry
  1. ;
  1. ;This routine will set ERR to 1 if an error has occurred.
  1. ;
  1. L(%C) ;Place a line in the global
  1. ;%C = 1: place |CR| at the end 0: do not place |CR| at the end
  1. S LC=LC+1,^UTILITY("INS",$J,LC)=A_$P("|CR|",U,%C) Q
  1. ;
  1. OUT ;Create an outgoing script
  1. N LC,A,INS,SEG,X,F,LEN,FIELD,DTY,SUB,I,DL,P01,FLVL,SCREEN,INMSH9
  1. S BHLMIEN=MESS ;cmi/sitka/maw setup a local variable for message ien
  1. S (FLVL,LC)=0,FILE(0)=FILE,MESS(7)=$G(^INTHL7M(MESS,7))
  1. S INSTD=$G(INSTD,"HL7")
  1. S A=";Script generated from '"_$P(MESS(0),U)_"' "_INSTD_" message." D L(1)
  1. I $D(^INTHL7M(MESS,6)) D
  1. . S A="MUMPS:" D L(1)
  1. . S X=0 F S X=$O(^INTHL7M(MESS,6,X)) Q:'X S A=$G(^(X,0)) D L(1)
  1. . S A=" " D L(1)
  1. S A="DATA:" D L(1)
  1. ;Enhance note -- dgh -- if a call is created to specify delimiters
  1. ;by standard, it should probably go here.
  1. ;Default to standard set if nothing is specified above
  1. D
  1. .;Set field separator character ("^")
  1. .S A="DELIM="""_$$FIELD^INHUT()_"""" D L(1)
  1. .;NCPDP doesn't use subdelimiters, but null SUBDELIM needed downstream
  1. .I $G(INSTD)="NC" S A="SUBDELIM=""""" D L(1) Q
  1. .;X12 Subdelimiter - LD
  1. .;I $G(INSTD)="X12" S A="SUBDELIM="":""" D L(1) Q
  1. .I $G(INSTD)="X12" S A="SUBDELIM="":""",INEOSM=$P($G(^INTHL7M(MESS,12)),U,17) D L(1) ;cmi/maw added set of end of segment marker 7/20/2001
  1. .;Set component separator character ("\")
  1. .S A="SUBDELIM="""_$$COMP^INHUT()_"""" D L(1)
  1. ;Message Header (MSH) segment. Must be conditional on standard
  1. I $G(INSTD)="HL" D MSH
  1. ;I $G(INSTD)="X12" D ISA^INHSGZ23 maw original line
  1. ;Event Type (EVN) segment. Must only occur for HL7 messages before 2.2
  1. ;I INSTD="HL",$P(MESS(0),U,4)<2.2 S A="LINE ""EVN""^"""_$P(MESS(0),U,2)_"""^" D L(1) ;cmi/maw build EVN dynamically from file/tables orig
  1. ;Process segments
  1. S INS="" F S INS=$O(^INTHL7M(MESS,1,"AS",INS)) Q:'INS S X=$O(^(INS,0)),SEG(1)=^INTHL7M(MESS,1,X,0) D:'$P(SEG(1),U,11) SEG(X) Q:ERR
  1. S A="" D L(1)
  1. S A="END:" D L(1)
  1. Q
  1. ;
  1. MSH ;Set up Message header (MSH) segment
  1. Q ;maw added we use the file/table build for this in IHS orig
  1. ;
  1. S A="LINE ""MSH""^""\|~&""^"_$P(MESS(7),U,1)_U_$P(MESS(7),U,2)_U
  1. ;this is dave's suggested code
  1. S A="LINE ""MSH""^@INDELIMS^"_$P(MESS(7),U,1)_U_$P(MESS(7),U,2)_U ;mod
  1. ;
  1. S A=A_$P(MESS(7),U,3)_U_$P(MESS(7),U,4)_"^INTX(NOW,""TS"")^^"
  1. ;Message type \ event type
  1. S INMSH9=$P(MESS(0),U,6) D S A=A_INMSH9
  1. . ;Check for special variable
  1. . I $E(INMSH9)="@" Q
  1. . S INMSH9=""""_$P(MESS(0),U,6)
  1. . ;Check for event type
  1. . S:$L($P(MESS(0),U,2)) INMSH9=INMSH9_"\"_$P(MESS(0),U,2)
  1. . S INMSH9=INMSH9_""""
  1. ; message ID Accept Ack Appl Ack
  1. S A=A_"^@MESSID^"""_$P(MESS(0),U,3)_"""^"""_$P(MESS(0),U,4)_""""
  1. S A=A_"^@INSEQ^^"""_$P(MESS(0),U,10)_"""^"""_$P(MESS(0),U,11)_""""
  1. D L(1)
  1. Q
  1. ;
  1. SEG(SEG) ;Processes a segment
  1. ;SEG = internal entry number in SEGMENT multiple of MESSAGE file
  1. S SEG(1)=^INTHL7M(MESS,1,SEG,0),SCREEN=$G(^(4)),SEG(2)=SEG,SEG=+SEG(1)
  1. Q:'$D(^INTHL7S(SEG,0))
  1. N CH,WHILE,FDFMT,INUDI,FD,FDMT,FLEN
  1. S SEG(0)=^(0)
  1. ;Q:$P(SEG(0),U,2)="MSH" cmi/maw we use file/table build for MSH
  1. Q:($P(MESS(0),U,4)<2.2)&($P(SEG(0),U,2)="EVN")
  1. ;I INSTD="X12",",ISA,GS,ST,"[$P(SEG(0),U,2) Q ;maw orig line
  1. ;I INSTD="X12",",ISA,GS,"[$P(SEG(0),U,2) Q ;maw modified
  1. K FD,FDMT,FLEN
  1. S A=";'"_$P(SEG(0),U,2)_"' segment" D L(1)
  1. ;Support for HL7 Set ID fields
  1. S A="^SET INSETID=0" D L(1)
  1. S WHILE=$P(SEG(1),U,3)!$P(SEG(1),U,4)
  1. S INUDI=$P(SEG(1),U,12) ;User=defined index.
  1. I WHILE,(INUDI="") D Q:ERR S A="WHILE "_WHILE(1) D L(1) I SCREEN]"" S A="SCREEN="_SCREEN D L(1)
  1. . I $P(SEG(1),U,3),'$P(SEG(1),U,4) D Q
  1. .. N DIC S X=$P(SEG(1),U,8),DIC="^DD("_+FILE(FLVL)_",",DIC(0)="FMZ",DIC("S")="I $P(^(0),U,2)" D ^DIC I Y<0 D ERROR^INHSGZ2("Multiple field '"_X_"' not found in file #"_+FILE(FLVL)) Q
  1. .. S FLVL=FLVL+1,FILE(FLVL)=+$P(Y(0),U,2),WHILE(1)=$P(Y,U,2)
  1. . S FLVL=FLVL+1,FILE(FLVL)=+$P(SEG(1),U,5) I 'FILE(FLVL) D ERROR^INHSGZ2("No file specified in segment '"_$P(SEG(0),U)_"'")
  1. . S WHILE(1)=$P(^DIC(+FILE(FLVL),0),U)
  1. I $L(INUDI) S WHILE=1,A="WHILE """_INUDI_"""" D L(1) I SCREEN]"" S A="SCREEN="_SCREEN D L(1)
  1. I $D(^INTHL7M(MESS,1,SEG(2),5)) S X=0 F S X=$O(^INTHL7M(MESS,1,SEG(2),5,X)) Q:'X S A=$G(^(X,0)) I $L(A) S A=U_A D L(1)
  1. S INF="" K SUB F S INF=$O(^INTHL7S(SEG,1,"AS",INF)) Q:'INF S X=$O(^(INF,0)),FIELD=+^INTHL7S(SEG,1,X,0) D:$D(^INTHL7F(FIELD,0)) FIELD Q:ERR
  1. ;NCPDP does not use segment ID. Setting ID must be conditional
  1. S A="LINE " D
  1. .I $G(INSTD)'="NC" S A=A_""""_$P(SEG(0),U,2)_""""
  1. .S INSEGST=A
  1. F I=1:1 Q:'$D(FD(I))&'$O(FD(I)) S A=A_"^" D:$D(FD(I))
  1. . I $D(SUB(I)) D Q
  1. .. I ($L(A)+$L(SUB(I)))>240 D L(0) S A=""
  1. .. S A=A_SUB(I) Q
  1. . I FD(I) S E="$E("_$P(SEG(0),U,2)_I_",1,"_FD(I)_")"
  1. . I 'FD(I) S E=$P(SEG(0),U,2)_I
  1. .;If field is fixed or min/max, FLEN(INF) will exist
  1. .;Also set to contain field ID for NCPDP variable fields
  1. . I $D(FLEN(I)) S E=E_"="_FLEN(I)
  1. . I ($L(A)+$L(E))>240 D L(0) S A=""
  1. . S A=A_E
  1. D L(1):(A]""&(INSEGST'=A))
  1. I $D(^INTHL7M(MESS,1,"ASP",SEG)) S CH=0 F S CH=$O(^INTHL7M(MESS,1,"ASP",SEG,CH)) Q:'CH D SEG($O(^(CH,0)))
  1. I WHILE S A="ENDWHILE" S FLVL=FLVL-1 D L(1)
  1. Q
  1. ;
  1. FIELD ;Process a field
  1. N SVAR
  1. S FIELD(0)=^(0),FD(INF)="" I $O(^INTHL7F(FIELD,10,0)) G SUB
  1. S SVAR=$P(SEG(0),U,2)_INF
  1. FD1 ;set a field
  1. N I W "." S LEN=$P(FIELD(0),U,3) S:LEN="" LEN=30
  1. S DTY=$P(FIELD(0),U,2),GL="",DTY(0)=$G(^INTHL7FT(+DTY,0))
  1. I 'DTY!(DTY(0)="") D ERROR^INHSGZ2("Field '"_$P(FIELD(0),U)_"' does not have a valid data type.") Q
  1. ;Determine if field length is Variable, Fixed or Min/Max.
  1. N LENTYP,MIN,PADC,PADP,DLM,FID
  1. S LENTYP=$P(FIELD(0),U,7),FID=$P(FIELD(0),U,14) D
  1. .S:LENTYP="" LENTYP="V"
  1. .;Variable field length is the default
  1. .I LENTYP="V" D Q
  1. ..Q:$G(INSTD)'="NC"
  1. ..;If interface standard is NCPDP, set field identifier in FLEN array
  1. ..I '$L(FID) D ERROR^INHSGZ2("Field '"_$P(FIELD(0),U)_"' does not have a field identifier.") Q
  1. ..;NCPDP only needs last two characters of FID
  1. ..S:$L(FID)>2 FID=$E(FID,$L(FID)-1,$L(FID))
  1. ..S FLEN(INF)="V("_FID_")"
  1. .S MIN=+$P(FIELD(0),U,8),PADC=$P(FIELD(0),U,9),PADP=$P(FIELD(0),U,10)
  1. .;X12 uses delimiters for fixed (& min/max fields). HL7 & NCPDP do not.
  1. .S DLM=$S(INSTD="X12":1,1:0)
  1. .;Set NCPDP defaults
  1. .I $G(INSTD)="NC" D
  1. ..S PADP=$S($L(PADP):PADP,$P(DTY(0),U,2)="NM":"R",$P(DTY(0),U,2)="DL":"R",1:"L")
  1. ..S PADC=$S($L(PADC):PADC,$P(DTY(0),U,2)="NM":0,$P(DTY(0),U,2)="DL":0,1:"")
  1. .;Otherwise default pad position is right/justify left
  1. .S:PADP="" PADP="L"
  1. .;Set array into FLEN(INF), a companion to FD(INF).
  1. .S FLEN(INF)=LENTYP_PADP_"("_PADC_")"_LEN
  1. .;defaut min length equal one if there is no data for this field - LD
  1. .I LENTYP="M",'MIN S MIN=1
  1. .S:MIN FLEN(INF)=FLEN(INF)_","_MIN_","_DLM
  1. ;; Modify the character conversion
  1. I $G(^INTHL7F(FIELD,5))]"" S GL="^INTHL7F("_FIELD_",5)"
  1. I GL="",$G(^INTHL7FT(DTY,3))]"" S GL="^INTHL7FT("_DTY_",3)"
  1. N GL1 S GL1=""
  1. I $G(^INTHL7FT(DTY,5))]"",$P($G(^INTHL7F(FIELD,2)),U,4) S GL1="^INTHL7FT("_DTY_",5)"
  1. ;set precision, convert flag, add time if not a sub field
  1. I $L($TR($P($G(^INTHL7F(FIELD,2)),U,1,4),"^")) S A="^S INTHL7F2="""_$G(^INTHL7F(FIELD,2))_"""" D L(1)
  1. S A="SET "_SVAR_" = ",DL=$$LBTB^UTIL($G(^INTHL7F(FIELD,"C"))) S:+DL=DL DL="#"_DL
  1. I DL="" S A=A_"""""" D L(1) D KILL Q
  1. I $P(DTY(0),U,2)="ID" S A=A_"$E(INTERNAL("_DL_"),1,"_LEN_")" D L(1) D KILL Q
  1. ;If an outgoing transform exists, store it in script file as follows
  1. I (GL]"")!(GL1]"") S A=A_"INSGX\"_GL_"\"_GL1_"\"_LEN_"\"_DL D L(1) D KILL Q
  1. I $D(SUB(INF)) S A=A_"$E("_DL_",1,"_LEN_")" D L(1) D KILL Q
  1. S FD(INF)=LEN,A=A_DL D L(1)
  1. D KILL
  1. Q
  1. KILL ;Kill if existed and was not a sub field
  1. I $L($TR($P($G(^INTHL7F(FIELD,2)),U,1,4),"^")) S A="^K INTHL7F2" D L(1)
  1. Q
  1. ;
  1. SUB ;This field has subfields
  1. N I,I1,F S SUB(INF)=""
  1. S F=FIELD,I=0 F S I=$O(^INTHL7F(F,10,"AS",I)) Q:'I S FIELD=+^INTHL7F(F,10,+$O(^(I,0)),0) I FIELD,$D(^INTHL7F(FIELD,0)) D
  1. . S FIELD(0)=^(0),SVAR=$P(SEG(0),U,2)_INF_"."_I D FD1
  1. . S SUB(INF)=SUB(INF)_$S(SUB(INF)]"":"_SUBDELIM_",1:"")_SVAR
  1. Q
  1. CNDT ;Handle CN (composite ID number and name) data type
  1. Q
  1. ;
  1. ;D
  1. ;. ;** NEW CODE ** to auto-handle CN data type
  1. ;. S P01=0,I(0)="",J(0)=+FILE(FLVL),DICOMPX="",DA="X(",DQI="Y(",X=DL D ^DICOMP I $L(DICOMPX),$L(DICOMPX,";")=1,+DICOMPX=+FILE(FLVL),$P(DICOMPX,U,2)=.01,$P(^DD(+DICOMPX,+$P(DICOMPX,"^",2),0),"^",2)'["P" S P01=1
  1. ;. S IEN=$S(P01:"NUMBER",1:"INTERNAL("_DL_")")
  1. ;. S ROOTFILE=$P($G(^DD(+DICOMPX,+$P(DICOMPX,U,2),0)),U,2)
  1. ;. S ROOTFILE=+$P(ROOTFILE,"P",2)
  1. ;. S ROOTFILE=$S(P01:+DICOMPX,1:ROOTFILE)
  1. ;. ;S A=A_"$E($$CN^INHUT1("_IEN_";"_ROOTFILE_"),1,"_LEN_")" D L(1) Q
  1. ;. ;S A=A_"$E("_$S(GL]"":"INSGX("""_GL_""","_IEN_"_"";"_ROOTFILE_""")",1:DL)_"),1,"_LEN_")" D L(1) Q
  1. ;Must call DICOMP twice
  1. ; the $E will not be accepted in the first expression
  1. ;. S A=A_$S(GL]"":"INSGX("""_GL_""","_IEN_"_"";"_ROOTFILE_""")",1:DL) D L(1) Q
  1. ;.S A="SET "_SVAR_" = $E("_SVAR_",1,"_LEN_")" D L(1)
  1. ;
  1. ;D
  1. ;.;*** Old Code to handle CN data type ***
  1. ;. S P01=0,I(0)="",J(0)=+FILE(FLVL),DICOMPX="",DA="X(",DQI="Y(",X=DL D ^DICOMP I $L(DICOMPX),$L(DICOMPX,";")=1,+DICOMPX=+FILE(FLVL),$P(DICOMPX,U,2)=.01,$P(^DD(+DICOMPX,+$P(DICOMPX,"^",2),0),"^",2)'["P" S P01=1
  1. ;. S A=A_"$E("_$S(P01:"NUMBER",1:"INTERNAL("_DL_")")_"_SUBDELIM_("_$S(GL]"":"INSGX("""_GL_""","_DL_")",1:DL)_"),1,"_LEN_")" D L(1) Q
  1. Q
  1. ;