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

PXRMEXLB.m

Go to the documentation of this file.
  1. PXRMEXLB ;SLC/PJH - Reminder Dialog Exchange ;09/27/2018
  1. ;;2.0;CLINICAL REMINDERS;**6,12,26,45**;Feb 04, 2005;Build 566
  1. ;
  1. ;=====================================================================
  1. ;Build the DLOC array.
  1. BDLOC(IEN,IND120) ;
  1. N DDATA,DNAME,JND
  1. S JND=0
  1. F S JND=$O(^PXD(811.8,IEN,120,IND120,1,JND)) Q:JND="" D
  1. .S DDATA=$G(^PXD(811.8,IEN,120,IND120,1,JND,0)) Q:DDATA=""
  1. .S DNAME=$P(DDATA,U,1)
  1. .;Save start and end in 100 node and 120 node IND and JND.
  1. .S ^TMP("PXRMEXTMP",$J,"DLOC",DNAME)=$P(DDATA,U,2,3)_U_IND120_U_JND
  1. .;Save selected dialogs 120 positions for later lookup
  1. .I $P(DDATA,U,7)=1 S ^TMP("PXRMEXTMP",$J,"DSELECT",JND)=DDATA
  1. Q
  1. ;
  1. ;Build list of dialog components
  1. ;-------------------------------
  1. DBUILD(IEN,IND120,JND120) ;
  1. N CNT,DARRAY,DATA,DDATA,DDLG,DEND,DIALNAM,DLOC,DMAP,DNAME,DNODE,DSEQ
  1. N DSTRT,DSUB,FDATA,FIELD,FILE,FILENAM,FILENUM,FNAME,IND,INDICES,ISDGRP,JND,LASTSEL,LINE
  1. N REPARR,REPCNT,RESGRP,TEMPRSEL,VERSN
  1. K ^TMP("PXRMEXTMP",$J,"DMAP")
  1. S LINE=^PXD(811.8,IEN,100,3,0)
  1. S VERSN=$$GETTAGV^PXRMEXU3(LINE,"<PACKAGE_VERSION>")
  1. S ISDGRP=$$PATTR^PXRMEXU2(IEN,"GROUPING DIALOG COMPONENTS")
  1. S DDATA=$G(^PXD(811.8,IEN,120,IND120,1,JND120,0)) Q:DDATA=""
  1. S ^TMP("PXRMEXTMP",$J,"PXRMDNAME")=$P(DDATA,U,1)
  1. S DIALNAM=$P(DDATA,U,1)
  1. S DSUB=$P(DDATA,U,2)+2
  1. I $P($G(^PXD(811.8,IEN,100,DSUB,0)),";",3)["100~NATIONAL" S ^TMP("PXRMEXTMP",$J,"PXRMDNAT")=""
  1. I '$D(^TMP("PXRMEXTMP",$J,"DLOC")) D BDLOC(IEN,IND120)
  1. S LASTSEL=+$O(^TMP("PXRMEXTMP",$J,"DSELECT",JND120),-1)
  1. S DSTRT=$P(DDATA,U,2),DEND=$P(DDATA,U,3),DSUB=DSTRT+2
  1. ;D CHECKCMP(DNAME,DSTRT,DEND,.RESGRP,.TEMPRSEL,.DARRAY)
  1. S REPCNT=0,JND=$S(ISDGRP=0:0,1:LASTSEL)
  1. ;S (JND,REPCNT)=0
  1. ;Scan the dialog components in 120 and save the name and type.
  1. F S JND=$O(^PXD(811.8,IEN,120,IND120,1,JND)) Q:JND'>0!(JND>JND120) D
  1. .S DDATA=$G(^PXD(811.8,IEN,120,IND120,1,JND,0)) Q:DDATA=""
  1. .S (DDLG,DNAME)=$P(DDATA,U,1)
  1. .S DSTRT=$P(DDATA,U,2),DEND=$P(DDATA,U,3),DSUB=DSTRT+2
  1. .;Extract dialog type and text and findings from exchange file
  1. .D DPARSE(IND120,JND,DNAME,DSTRT,DEND,.RESGRP,.TEMPRSEL)
  1. .;Scan dialog components in 120 and save dialog links
  1. .F S DSUB=$O(^PXD(811.8,IEN,100,DSUB)) Q:DSUB>DEND D
  1. ..S LINE=$G(^PXD(811.8,IEN,100,DSUB,0))
  1. .. S INDICES=$P(LINE,"~",1)
  1. .. S DATA=$P(LINE,"~",2)
  1. .. S FILE=$P(INDICES,";",1)
  1. .. S FIELD=$P(INDICES,";",3)
  1. .. I (FILE'=801.412)&(FILE'=801.41121)&(FIELD'=118)&(FILE'=801.41143) Q
  1. ..;Handle dialogs with replacement dialogs
  1. ..I FIELD=118 D
  1. ...S DNAME=DATA Q:DNAME=""
  1. ...S DLOC=^TMP("PXRMEXTMP",$J,"DLOC",DNAME)
  1. ...S REPCNT=REPCNT+1 D
  1. ....I +$P(VERSN,"P",2)>11 D
  1. .....S ^TMP("PXRMEXTMP",$J,"DREPL",DIALNAM,REPCNT,DDLG)=DNAME_U_DLOC
  1. .....S ^TMP("PXRMEXTMP",$J,"DREPL ITEMS",DDLG,DNAME)=DNAME_U_DLOC
  1. ....I +$P(VERSN,"P",2)<12 S REPARR(REPCNT,DDLG)=DNAME_U_DLOC
  1. ..I FILE=801.41143,FIELD=4 D
  1. ...S DNAME=DATA Q:DNAME=""
  1. ...S DLOC=^TMP("PXRMEXTMP",$J,"DLOC",DNAME)
  1. ...S REPCNT=REPCNT+1,^TMP("PXRMEXTMP",$J,"DREPL",DIALNAM,REPCNT,DDLG)=DNAME_U_DLOC
  1. ...S ^TMP("PXRMEXTMP",$J,"DREPL ITEMS",DDLG,DNAME)=DNAME_U_DLOC
  1. ..I FIELD'=.01 Q
  1. ..S DSEQ=DATA Q:DSEQ=""
  1. ..I FILE="801.41121" D Q
  1. ...S DNAME=DATA Q:DNAME=""
  1. ...;Quit if DLOC for the item is not defined. This should fix a problem
  1. ...;pre-patch 12 entries not containing national prompts.
  1. ...I +$P(VERSN,"P",2)<12,'$D(^TMP("PXRMEXTMP",$J,"DLOC",DNAME)) Q
  1. ...S DLOC=^TMP("PXRMEXTMP",$J,"DLOC",DNAME)
  1. ...S CNT=0
  1. ...I $D(^TMP("PXRMEXTMP",$J,"DMAP",DDLG))>0 S CNT=$O(^TMP("PXRMEXTMP",$J,"DMAP",DDLG,""),-1)
  1. ...S ^TMP("PXRMEXTMP",$J,"DMAP",DDLG,CNT+1)=DNAME
  1. ..S LINE=$G(^PXD(811.8,IEN,100,DSUB+1,0))
  1. ..I ($P(LINE,";")'="801.412") Q
  1. .. S INDICES=$P(LINE,"~",1)
  1. .. I $P(INDICES,";",3)'=2 Q
  1. .. S DATA=$P(LINE,"~",2)
  1. .. S DNAME=DATA Q:DNAME=""
  1. ..;Quit if DLOC for the item is not defined. This should fix a problem
  1. ..;pre-patch 12 entries not containing national prompts.
  1. ..I +$P(VERSN,"P",2)<12,'$D(^TMP("PXRMEXTMP",$J,"DLOC",DNAME)) Q
  1. ..S DLOC=^TMP("PXRMEXTMP",$J,"DLOC",DNAME)
  1. ..S ^TMP("PXRMEXTMP",$J,"DMAP",DDLG,DSEQ)=DNAME
  1. ;
  1. I $D(REPARR)>0 D
  1. .N CNT,DLG,REPCNT
  1. .S CNT="",REPCNT=0
  1. .F S CNT=$O(REPARR(CNT)) Q:CNT="" D
  1. ..S REPCNT=REPCNT+1,DLG=$O(REPARR(CNT,""))
  1. ..S ^TMP("PXRMEXTMP",$J,"DREPL",DIALNAM,REPCNT,DLG)=REPARR(CNT,DLG)
  1. ;
  1. ;Build index of dialog findings by name
  1. S IND=0
  1. F S IND=$O(^PXD(811.8,IEN,120,IND)) Q:'IND D
  1. .S FDATA=$G(^PXD(811.8,IEN,120,IND,0)) Q:FDATA=""
  1. .S FILENAM=$P(FDATA,U),FILENUM=$P(FDATA,U,2) Q:FILENAM="" Q:'FILENUM
  1. .;Ignore reminder dialogs
  1. .I FILENAM="REMINDER DIALOG" Q
  1. .;Ignore reminder terms
  1. .I FILENAM="REMINDER TERM" Q
  1. .;Strip off trailing S in finding file name
  1. .I $E(FILENAM,$L(FILENAM))="S" S $E(FILENAM,$L(FILENAM))=""
  1. .S JND=0
  1. .F S JND=$O(^PXD(811.8,IEN,120,IND,1,JND)) Q:'JND D
  1. ..S FNAME=$P($G(^PXD(811.8,IEN,120,IND,1,JND,0)),U) Q:FNAME=""
  1. ..;Save entry
  1. ..S ^TMP("PXRMEXFND",$J,FNAME)=FILENUM_U_FILENAM_U_IND
  1. I $D(TEMPRESL)>0 D
  1. .S DDLG="" F S DDLG=$O(TEMPRESL(DDLG)) Q:DDLG="" D
  1. ..S DSEQ=$O(^TMP("PXRMEXTMP",$J,"DMAP",DDLG,""),-1)
  1. ..S ^TMP("PXRMEXTMP",$J,"DMAP",DDLG,DSEQ+1)=TEMPRESL(DDLG)_U_RESGRP(TEMPRESL(DDLG))
  1. Q
  1. ;
  1. ;---------------------------------------
  1. ;Scan exchange file to get dialog fields
  1. ;---------------------------------------
  1. DPARSE(IND120,JND120,DNAME,DSTRT,DEND,RESGRP,TEMPRESL) ;
  1. N DARRAY,DCNT,DDATA,DFIND,DFIAD,DFNAM,DFNUM,DFQUIT,DLCT,DLINES
  1. N DSTRING,DSUB,DTEXT,DTXT,DTYP,RESNAME
  1. ;
  1. ;Find where all the field numbers are kept
  1. S DSUB=DSTRT-1,DSTRING=";.01;4;5;15;24;25;55;"
  1. F S DSUB=$O(^PXD(811.8,IEN,100,DSUB)) Q:'DSUB D Q:DSUB>DEND
  1. .S DDATA=$G(^PXD(811.8,IEN,100,DSUB,0)) Q:DDATA=""
  1. .I $P(DDATA,";")'=801.41 Q
  1. .S DFNUM=$P(DDATA,";",3),DFNUM=$P(DFNUM,"~") Q:DFNUM=""
  1. .I DSTRING[(";"_DFNUM_";") S DARRAY(DFNUM)=DSUB
  1. .I $P(DDATA,";")="801.41121" S DARRAY(55)=DSUB
  1. ;
  1. ;Determine dialog component type
  1. S DSUB=DARRAY(4) Q:'DSUB
  1. S DTYP=$P($G(^PXD(811.8,IEN,100,DSUB,0)),"~",2)
  1. I DTYP'["result" S:DTYP[" " DTYP=$P(DTYP," ",2) S:DTYP="value" DTYP="forced"
  1. ;
  1. ;Initialize text and finding fields
  1. S DTXT="*NONE*",DFIND=""
  1. ;Get text appropriate for the type of component
  1. I ((DTYP="element")!(DTYP="group"))&(DTYP'["result") D
  1. .;Search for WP text
  1. .S DSUB=$G(DARRAY(25)) D:DSUB
  1. ..S DTEXT=$P($G(^PXD(811.8,IEN,100,DSUB,0)),";",3) Q:DTEXT=""
  1. ..;Get the line count
  1. ..S DLINES=$P(DTEXT,"~",3),DCNT=0
  1. ..;Get the wp text lines
  1. ..F DLCT=DSUB+1:1:DSUB+DLINES D
  1. ...S DTEXT=$G(^PXD(811.8,IEN,100,DLCT,0))
  1. ...S DCNT=DCNT+1,DTXT(DCNT)=DTEXT
  1. ...;Check for embedded TIU templates
  1. ...D DTIU(DNAME,DTEXT)
  1. ..;Reformat text to 50 characters
  1. ..D DWP(1,50,DCNT,.DTXT)
  1. ..;Search for Result Group/Element
  1. ..S DSUB=$G(DARRAY(55)) I DSUB>0 D
  1. ...S RESNAME=$P($P($G(^PXD(811.8,IEN,100,DSUB,0)),";",3),"~",2)
  1. ...S TEMPRESL(DNAME)=RESNAME
  1. .;Search for finding item
  1. .S DSUB=$G(DARRAY(15)) D:DSUB
  1. ..S DFIND=$P($G(^PXD(811.8,IEN,100,DSUB,0)),";",3) Q:DFIND=""
  1. ..;Finding name
  1. ..S DFIND=$P(DFIND,"~",2) Q:DFIND=""
  1. ..I $P(DFIND,".")="ICD9" S DFIND=$P(DFIND," ")
  1. .;
  1. .;Search for additional finding - start after WP text
  1. .S DSUB=+$G(DARRAY(25)) D:DSUB
  1. ..S DCNT=0,DFQUIT=0
  1. ..F DLCT=DSUB+1+DLINES:1 D Q:DFQUIT Q:DLCT>DEND
  1. ...S DTEXT=$G(^PXD(811.8,IEN,100,DLCT,0))
  1. ...;Ignore line if this is not an additional finding
  1. ...I $P(DTEXT,";")'=801.4118 S:$P(DTEXT,";")>801.4118 DFQUIT=1 Q
  1. ...S DFNAM=$P(DTEXT,"~",2) Q:DFNAM=""
  1. ...I $P(DFNAM,".")="ICD9" S DFNAM=$P(DFNAM," ")
  1. ...S DCNT=DCNT+1,DFIAD(DCNT)=DFNAM
  1. ;
  1. I DTYP["result" D
  1. .S DSUB=$G(DARRAY(.01)) Q:'DSUB
  1. .S DDATA=^PXD(811.8,IEN,100,DSUB,0) Q:DDATA=""
  1. .S DTXT=$P(DDATA,"~",2)
  1. .S RESGRP(DNAME)=DSTRT_U_DEND_U_IND120_U_JND120
  1. ;
  1. I DTYP="prompt" D
  1. .;search for prompt caption
  1. .S DSUB=$G(DARRAY(24)) Q:'DSUB
  1. .S DDATA=^PXD(811.8,IEN,100,DSUB,0) Q:DDATA=""
  1. .S DTXT="Prompt caption: "_$P(DDATA,"~",2)
  1. ;
  1. I DTYP="group" D
  1. .;search for group caption
  1. .S DSUB=$G(DARRAY(5)) Q:'DSUB
  1. .S DDATA=^PXD(811.8,IEN,100,DSUB,0) Q:DDATA=""
  1. .S DTXT="Group caption: "_$P(DDATA,"~",2)
  1. ;
  1. ;Save dialog type
  1. I DTYP["result" S DTYP=$$STRREP^PXRMUTIL(DTYP,"result ","rs.")
  1. S ^TMP("PXRMEXTMP",$J,"DTYP",DNAME)=DTYP
  1. ;Save dialog component text (first line only)
  1. I ($G(DTXT)'=""),(DTXT'=DNAME) S ^TMP("PXRMEXTMP",$J,"DTXT",DNAME)=DTXT
  1. ;
  1. ;Save main finding
  1. I DFIND]"" S ^TMP("PXRMEXTMP",$J,"DFND",DNAME,1)=$P(DFIND,".",2,99)
  1. ;Save additional findings
  1. S DSUB=0
  1. F S DSUB=$O(DFIAD(DSUB)) Q:'DSUB S ^TMP("PXRMEXTMP",$J,"DFND",DNAME,DSUB+1)=$P(DFIAD(DSUB),".",2,99)
  1. ;
  1. ;Save additional WP text lines
  1. S DSUB=0
  1. F S DSUB=$O(DTXT(DSUB)) Q:'DSUB S ^TMP("PXRMEXTMP",$J,"DTXT",DNAME,DSUB)=DTXT(DSUB)
  1. Q
  1. ;
  1. ;Extract any TIU templates
  1. ;-------------------------
  1. DTIU(DNAME,TEXT) ;
  1. N IC,TCNT,TLIST,TNAM
  1. ;Templates are in format {FLD:fldname}
  1. S TCNT=0 D TIUXTR^PXRMEXU1("{FLD:","}",TEXT,.TLIST,.TCNT) Q:'TCNT
  1. ;
  1. F IC=1:1:TCNT D
  1. .S TNAM=$G(TLIST(TCNT)) Q:TNAM=""
  1. .S ^TMP("PXRMEXTMP",$J,"DTIU",DNAME,TNAM)=""
  1. Q
  1. ;
  1. ;Process WP fields
  1. ;-----------------
  1. DWP(LM,RM,NIN,TEXT) ;
  1. N NOUT,TEXTOUT
  1. D FORMAT^PXRMTEXT(LM,RM,NIN,.TEXT,.NOUT,.TEXTOUT)
  1. K TEXT
  1. M TEXT=TEXTOUT
  1. Q
  1. ;
  1. ;-----------------
  1. FINDSTRT(IEN,IND120,END) ;
  1. I END=1 Q 0
  1. N START,TEMP,ISSEL
  1. S START=0,TEMP=0
  1. F S END=$O(^PXD(811.8,IEN,120,IND120,END),-1) Q:END'>0!(START>0) D
  1. .S ISSEL=$P(^PXD(811.8,IEN,120,IND120,END,0),U,7)
  1. .I ISSEL=0 S TEMP=END Q
  1. .S START=TEMP
  1. Q START
  1. ;