HLEVSRV2 ;O-OIFO/LJA - Event Monitor SERVER ;02/04/2004 14:42
 ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995
 ;
QUERYSTR ; Generate $QUERY strings...
 N IOINHI,IOINORM,STRING,X
 ;
 S X="IOINHI;IOINORM" D ENDR^%ZISS
 ;
 D HD,EX,TELL^HLEVMST0("","0^0^999","Press RETURN to continue... ")
 ;
 F  S STRING=$$STRING QUIT:STRING']""  D
 .  S STRING(STRING)=""
 .  W !!,"Search string = ",IOINHI,STRING,IOINORM
 ;
 QUIT:$O(STRING(""))']""  ;->
 W !!,IOINHI,"Paste the following ""search strings"" into an email message and send to the"
 W !,"S.HLEV-INFORMATION-SERVER@REMOTE-SITE.",IOINORM
 W !!
 ;
 S STRING=""
 F  S STRING=$O(STRING(STRING)) Q:STRING']""  D
 .  W !,STRING
 ;
 Q
 ;
STRING() ; Ask user to input values to be built into a search string
 N FILTER,LIMIT,ROOT,STOP
 S ROOT=$$QUERYRT QUIT:ROOT']"" "" ;->
 S STOP=$$QUERYST(ROOT) QUIT:STOP']"" "" ;->
 S LIMIT=$$QUERYLM
 S FILTER=$$QUERYFL
 Q ROOT_U_STOP_U_LIMIT_U_FILTER
 ;
QUERYRT() ;
 N VAL
 D TAG("$QUERY ROOT")
 D EXRT
 W !
 S VAL=$$FT("Enter $QUERY ROOT") QUIT:VAL']""!(VAL=U) "" ;->
 Q VAL
 ;
EXRT N I,T F I=1:1 S T=$T(EXRT+I) QUIT:T'[";;"  W !,$P(T,";;",2,99)
 ;;Enter the $QUERY root now.  For example...
 ;;
 ;; - If you want to see all data for ^HL(772,25132), including the zero node
 ;;   and all data, enter "HL(772,25132)".
 ;; - If you want to see all data for HLMA(9132), including the zero node and
 ;;   all data, enter "^HLMA(9132)".
 ;;
 ;;NOTE:  Do not enter the leading up-arrow before a global reference.
 Q
 ;
QUERYST(ROOT) ;
 N VAL
 D TAG("$QUERY Stop Value")
 D EXST
 S VAL=$E(ROOT,$L(ROOT)),VAL=$S(VAL=")":$E(ROOT,1,$L(ROOT)-1)_",",1:ROOT)
 W !
 S VAL=$$FT("Enter $QUERY STOP VALUE",VAL) QUIT:VAL']""!(VAL=U) "" ;->
 Q VAL
 ;
EXST N I,T F I=1:1 S T=$T(EXST+I) QUIT:T'[";;"  W !,$P(T,";;",2,99)
 ;;Enter the $QUERY stop value now.  For example...
 ;;
 ;; - Assuming you entered "HL(772,25132)" (see helps under root entry above),
 ;;   you would enter a stop value of "HL(772,25132,".
 ;; - Assuming you entered "HLMA(9132)", enter a stop value of "HLMA(9132,".
 Q
 ;
QUERYLM() ;
 N VAL
 D TAG("Data Node Limit")
 D EXLM
 R !!,"Enter LIMIT: ",VAL:60 Q:VAL'>0 "" ;->
 QUIT:VAL>1000 1000 ;->
 Q VAL
 ;
EXLM N I,T F I=1:1 S T=$T(EXLM+I) QUIT:T'[";;"  W !,$P(T,";;",2,99)
 ;;You can limit the number of nodes that are returned.  This is especially 
 ;;helpful when you don't know how many data nodes exist and will be returned by
 ;;your request.  (You don't want to send a request, thinking you'll get around
 ;;20 data nodes back, when 20,000 data nodes exist!)
 ;;
 ;;Enter the maximum number of nodes you want returned.
 ;;
 ;;NOTE:  The maximum number of data nodes returnable by each $QUERY search 
 ;;       string is 1000.  So, there is no point entering any limit above 1000!
 Q
 ;
QUERYFL() ;
 N VAL
 D TAG("Filter Reference")
 D EXFL
 W !
 S VAL=$$FT("Enter FILTER REFERENCE","","O") QUIT:VAL']""!(VAL=U) "" ;->
 Q VAL
 ;
EXFL N I,T F I=1:1 S T=$T(EXFL+I) QUIT:T'[";;"  W !,$P(T,";;",2,99)
 ;;$QUERY returns all data nodes no matter the structure of the subscripts.  At
 ;;times you might want to filter out the data nodes whose subscripting does not
 ;;follow a specific format.  You can define such a filter now.  Some filter
 ;;examples are shown below.
 ;;
 ;; - If you only want to see ^HL(772,IEN,"IN",1,0) enter a filter of "HL(772,#,"IN",1,0)".
 ;; - If you want to see the message text in a file 772 entry, enter a filter of
 ;;   "HL(772,#,"IN",#,0)".
 ;;
 ;;You probably noticed that the "#" symbol must be placed at every subscript
 ;;location where you want "any IEN" to be included.
 Q
 ;
TAG(TXT) W !!,$$CJ^XLFSTR("----------- "_IOINHI_TXT_IOINORM_"-----------",IOM+$L(IOINHI)+$L(IOINORM))
 Q
 ;
HD W @IOF,$$CJ^XLFSTR("$QUERY String Generator",IOM)
 W !,$$REPEAT^XLFSTR("=",IOM)
 QUIT
 ;
EX N I,T F I=1:1 S T=$T(EX+I) QUIT:T'[";;"  W !,$P(T,";;",2,99)
 ;;$QUERY-based search strings can be sent to the S.HLEV-INFORMATION-SERVER at
 ;;remote sites requesting data to be returned to the HL7SystemMonitoring mail
 ;;group.  Structuring $QUERY search strings can be complicated.  This utility
 ;;will assist you in creating these search strings.
 ;;
 ;;The search string(s) created should be pasted into the mail message sent to
 ;;the remote site.
 ;;
 ;;The parts of the $QUERY search string are listed below.
 ;;
 ;;  - $QUERY root
 ;;  - $QUERY stop value
 ;;  - # nodes to return
 ;;  - Node filter format
 QUIT
 ;
MONITOR(TXT) ; User requested that a monitor be run...
 ; XTMP -- req
 N HLEVIENE,MONM,PCE,QTIME,RECIP,VAL
 ;
 ; Email data request format: MONITOR^monitor-name^queue-time^recip's
 ;
 S MONM=$P(TXT,U) QUIT:MONM']""  ;->
 S HLEVIENE=$O(^HLEV(776.1,"B",MONM,0)) QUIT:HLEVIENE'>0  ;->
 QUIT:$P($G(^HLEV(776.1,+HLEVIENE,0)),U,5)'=1  ;-> Not remote requestable
 S QTIME=$P(TXT,U,2) I QTIME'?7N1"."1.N S QTIME=$$NOW^XLFDT
 ;
 D ADDREQHD^HLEVSRV ; Initial header
 D ADDREQ^HLEVSRV("Monitor: "_MONM_" [#"_HLEVIENE_"]")
 ;
 S ^XTMP(XTMP,"MONREQ","MON",HLEVIENE)=MONM
 ;
 S VAL=$P(TXT,U,2,999) Q:VAL']""  ;->
 F PCE=1:1:$L(VAL,U) D
 .  S RECIP=$P(VAL,U,PCE) QUIT:RECIP']""  ;->
 .  S ^XTMP(XTMP,"MONREQ","MON",+HLEVIENE,RECIP)=""
 .  D ADDREQ^HLEVSRV("         recipient = "_RECIP)
 ;
 S ^XTMP(XTMP,"MONREQ","TASK")=$$Q1TIME^HLEVAPI0(HLEVIENE,1,QTIME,XTMP)
 ;
 Q
 ;
FT(PMT,DEF,WAY) ; Return user-input text...
 N DIR,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="F"_$G(WAY)
 S DIR("A")=PMT
 I $G(DEF)]"" S DIR("B")=DEF
 D ^DIR
 I Y?1"^"1.E&($L(Y,U)=2) QUIT $P(Y,U,2) ;->
 QUIT:$D(DIRUT)!($D(DTOUT))!($D(DUOUT)) U ;->
 Q Y
 ;
ADDMAIL(TXT) ; Add TXT, but be sure it is on or after NUM
 N SNO
 QUIT:$G(HLEVOVER)  ;-> Over 5000 line limit...
 S SNO=$O(^XTMP(XTMP,"HLMAIL",":"),-1)+1
 I SNO<100 S SNO=100 ; Leave room at the top for messages
 I SNO>5100 D  QUIT  ;->
 .  S HLEVOVER=1
 .  S TXT="     ***** 5000 Line Limit Reached!  Some text not included. *****"
 .  S ^XTMP(XTMP,"HLMAIL",+SNO)=""
 .  S ^XTMP(XTMP,"HLMAIL",+SNO+1)=""
 .  S ^XTMP(XTMP,"HLMAIL",+SNO+2)=TXT
 .  S ^XTMP(XTMP,"HLMAIL",1)=""
 .  S ^XTMP(XTMP,"HLMAIL",2)=TXT
 .  S ^XTMP(XTMP,"HLMAIL",3)=""
 S ^XTMP(XTMP,"HLMAIL",+SNO)=TXT
 Q
 ;
EOR ;HLEVSRV2 - Event Monitor SERVER ;5/16/03 14:42
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HHLEVSRV2   6342     printed  Sep 23, 2025@19:34:01                                                                                                                                                                                                    Page 2
HLEVSRV2  ;O-OIFO/LJA - Event Monitor SERVER ;02/04/2004 14:42
 +1       ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995
 +2       ;
QUERYSTR  ; Generate $QUERY strings...
 +1        NEW IOINHI,IOINORM,STRING,X
 +2       ;
 +3        SET X="IOINHI;IOINORM"
           DO ENDR^%ZISS
 +4       ;
 +5        DO HD
           DO EX
           DO TELL^HLEVMST0("","0^0^999","Press RETURN to continue... ")
 +6       ;
 +7        FOR 
               SET STRING=$$STRING
               if STRING']""
                   QUIT 
               Begin DoDot:1
 +8                SET STRING(STRING)=""
 +9                WRITE !!,"Search string = ",IOINHI,STRING,IOINORM
               End DoDot:1
 +10      ;
 +11      ;->
           if $ORDER(STRING(""))']""
               QUIT 
 +12       WRITE !!,IOINHI,"Paste the following ""search strings"" into an email message and send to the"
 +13       WRITE !,"S.HLEV-INFORMATION-SERVER@REMOTE-SITE.",IOINORM
 +14       WRITE !!
 +15      ;
 +16       SET STRING=""
 +17       FOR 
               SET STRING=$ORDER(STRING(STRING))
               if STRING']""
                   QUIT 
               Begin DoDot:1
 +18               WRITE !,STRING
               End DoDot:1
 +19      ;
 +20       QUIT 
 +21      ;
STRING()  ; Ask user to input values to be built into a search string
 +1        NEW FILTER,LIMIT,ROOT,STOP
 +2       ;->
           SET ROOT=$$QUERYRT
           if ROOT']""
               QUIT ""
 +3       ;->
           SET STOP=$$QUERYST(ROOT)
           if STOP']""
               QUIT ""
 +4        SET LIMIT=$$QUERYLM
 +5        SET FILTER=$$QUERYFL
 +6        QUIT ROOT_U_STOP_U_LIMIT_U_FILTER
 +7       ;
QUERYRT() ;
 +1        NEW VAL
 +2        DO TAG("$QUERY ROOT")
 +3        DO EXRT
 +4        WRITE !
 +5       ;->
           SET VAL=$$FT("Enter $QUERY ROOT")
           if VAL']""!(VAL=U)
               QUIT ""
 +6        QUIT VAL
 +7       ;
EXRT       NEW I,T
           FOR I=1:1
               SET T=$TEXT(EXRT+I)
               if T'[";;"
                   QUIT 
               WRITE !,$PIECE(T,";;",2,99)
 +1       ;;Enter the $QUERY root now.  For example...
 +2       ;;
 +3       ;; - If you want to see all data for ^HL(772,25132), including the zero node
 +4       ;;   and all data, enter "HL(772,25132)".
 +5       ;; - If you want to see all data for HLMA(9132), including the zero node and
 +6       ;;   all data, enter "^HLMA(9132)".
 +7       ;;
 +8       ;;NOTE:  Do not enter the leading up-arrow before a global reference.
 +9        QUIT 
 +10      ;
QUERYST(ROOT) ;
 +1        NEW VAL
 +2        DO TAG("$QUERY Stop Value")
 +3        DO EXST
 +4        SET VAL=$EXTRACT(ROOT,$LENGTH(ROOT))
           SET VAL=$SELECT(VAL=")":$EXTRACT(ROOT,1,$LENGTH(ROOT)-1)_",",1:ROOT)
 +5        WRITE !
 +6       ;->
           SET VAL=$$FT("Enter $QUERY STOP VALUE",VAL)
           if VAL']""!(VAL=U)
               QUIT ""
 +7        QUIT VAL
 +8       ;
EXST       NEW I,T
           FOR I=1:1
               SET T=$TEXT(EXST+I)
               if T'[";;"
                   QUIT 
               WRITE !,$PIECE(T,";;",2,99)
 +1       ;;Enter the $QUERY stop value now.  For example...
 +2       ;;
 +3       ;; - Assuming you entered "HL(772,25132)" (see helps under root entry above),
 +4       ;;   you would enter a stop value of "HL(772,25132,".
 +5       ;; - Assuming you entered "HLMA(9132)", enter a stop value of "HLMA(9132,".
 +6        QUIT 
 +7       ;
QUERYLM() ;
 +1        NEW VAL
 +2        DO TAG("Data Node Limit")
 +3        DO EXLM
 +4       ;->
           READ !!,"Enter LIMIT: ",VAL:60
           if VAL'>0
               QUIT ""
 +5       ;->
           if VAL>1000
               QUIT 1000
 +6        QUIT VAL
 +7       ;
EXLM       NEW I,T
           FOR I=1:1
               SET T=$TEXT(EXLM+I)
               if T'[";;"
                   QUIT 
               WRITE !,$PIECE(T,";;",2,99)
 +1       ;;You can limit the number of nodes that are returned.  This is especially 
 +2       ;;helpful when you don't know how many data nodes exist and will be returned by
 +3       ;;your request.  (You don't want to send a request, thinking you'll get around
 +4       ;;20 data nodes back, when 20,000 data nodes exist!)
 +5       ;;
 +6       ;;Enter the maximum number of nodes you want returned.
 +7       ;;
 +8       ;;NOTE:  The maximum number of data nodes returnable by each $QUERY search 
 +9       ;;       string is 1000.  So, there is no point entering any limit above 1000!
 +10       QUIT 
 +11      ;
QUERYFL() ;
 +1        NEW VAL
 +2        DO TAG("Filter Reference")
 +3        DO EXFL
 +4        WRITE !
 +5       ;->
           SET VAL=$$FT("Enter FILTER REFERENCE","","O")
           if VAL']""!(VAL=U)
               QUIT ""
 +6        QUIT VAL
 +7       ;
EXFL       NEW I,T
           FOR I=1:1
               SET T=$TEXT(EXFL+I)
               if T'[";;"
                   QUIT 
               WRITE !,$PIECE(T,";;",2,99)
 +1       ;;$QUERY returns all data nodes no matter the structure of the subscripts.  At
 +2       ;;times you might want to filter out the data nodes whose subscripting does not
 +3       ;;follow a specific format.  You can define such a filter now.  Some filter
 +4       ;;examples are shown below.
 +5       ;;
 +6       ;; - If you only want to see ^HL(772,IEN,"IN",1,0) enter a filter of "HL(772,#,"IN",1,0)".
 +7       ;; - If you want to see the message text in a file 772 entry, enter a filter of
 +8       ;;   "HL(772,#,"IN",#,0)".
 +9       ;;
 +10      ;;You probably noticed that the "#" symbol must be placed at every subscript
 +11      ;;location where you want "any IEN" to be included.
 +12       QUIT 
 +13      ;
TAG(TXT)   WRITE !!,$$CJ^XLFSTR("----------- "_IOINHI_TXT_IOINORM_"-----------",IOM+$LENGTH(IOINHI)+$LENGTH(IOINORM))
 +1        QUIT 
 +2       ;
HD         WRITE @IOF,$$CJ^XLFSTR("$QUERY String Generator",IOM)
 +1        WRITE !,$$REPEAT^XLFSTR("=",IOM)
 +2        QUIT 
 +3       ;
EX         NEW I,T
           FOR I=1:1
               SET T=$TEXT(EX+I)
               if T'[";;"
                   QUIT 
               WRITE !,$PIECE(T,";;",2,99)
 +1       ;;$QUERY-based search strings can be sent to the S.HLEV-INFORMATION-SERVER at
 +2       ;;remote sites requesting data to be returned to the HL7SystemMonitoring mail
 +3       ;;group.  Structuring $QUERY search strings can be complicated.  This utility
 +4       ;;will assist you in creating these search strings.
 +5       ;;
 +6       ;;The search string(s) created should be pasted into the mail message sent to
 +7       ;;the remote site.
 +8       ;;
 +9       ;;The parts of the $QUERY search string are listed below.
 +10      ;;
 +11      ;;  - $QUERY root
 +12      ;;  - $QUERY stop value
 +13      ;;  - # nodes to return
 +14      ;;  - Node filter format
 +15       QUIT 
 +16      ;
MONITOR(TXT) ; User requested that a monitor be run...
 +1       ; XTMP -- req
 +2        NEW HLEVIENE,MONM,PCE,QTIME,RECIP,VAL
 +3       ;
 +4       ; Email data request format: MONITOR^monitor-name^queue-time^recip's
 +5       ;
 +6       ;->
           SET MONM=$PIECE(TXT,U)
           if MONM']""
               QUIT 
 +7       ;->
           SET HLEVIENE=$ORDER(^HLEV(776.1,"B",MONM,0))
           if HLEVIENE'>0
               QUIT 
 +8       ;-> Not remote requestable
           if $PIECE($GET(^HLEV(776.1,+HLEVIENE,0)),U,5)'=1
               QUIT 
 +9        SET QTIME=$PIECE(TXT,U,2)
           IF QTIME'?7N1"."1.N
               SET QTIME=$$NOW^XLFDT
 +10      ;
 +11      ; Initial header
           DO ADDREQHD^HLEVSRV
 +12       DO ADDREQ^HLEVSRV("Monitor: "_MONM_" [#"_HLEVIENE_"]")
 +13      ;
 +14       SET ^XTMP(XTMP,"MONREQ","MON",HLEVIENE)=MONM
 +15      ;
 +16      ;->
           SET VAL=$PIECE(TXT,U,2,999)
           if VAL']""
               QUIT 
 +17       FOR PCE=1:1:$LENGTH(VAL,U)
               Begin DoDot:1
 +18      ;->
                   SET RECIP=$PIECE(VAL,U,PCE)
                   if RECIP']""
                       QUIT 
 +19               SET ^XTMP(XTMP,"MONREQ","MON",+HLEVIENE,RECIP)=""
 +20               DO ADDREQ^HLEVSRV("         recipient = "_RECIP)
               End DoDot:1
 +21      ;
 +22       SET ^XTMP(XTMP,"MONREQ","TASK")=$$Q1TIME^HLEVAPI0(HLEVIENE,1,QTIME,XTMP)
 +23      ;
 +24       QUIT 
 +25      ;
FT(PMT,DEF,WAY) ; Return user-input text...
 +1        NEW DIR,DIRUT,DTOUT,DUOUT,X,Y
 +2        SET DIR(0)="F"_$GET(WAY)
 +3        SET DIR("A")=PMT
 +4        IF $GET(DEF)]""
               SET DIR("B")=DEF
 +5        DO ^DIR
 +6       ;->
           IF Y?1"^"1.E&($LENGTH(Y,U)=2)
               QUIT $PIECE(Y,U,2)
 +7       ;->
           if $DATA(DIRUT)!($DATA(DTOUT))!($DATA(DUOUT))
               QUIT U
 +8        QUIT Y
 +9       ;
ADDMAIL(TXT) ; Add TXT, but be sure it is on or after NUM
 +1        NEW SNO
 +2       ;-> Over 5000 line limit...
           if $GET(HLEVOVER)
               QUIT 
 +3        SET SNO=$ORDER(^XTMP(XTMP,"HLMAIL",":"),-1)+1
 +4       ; Leave room at the top for messages
           IF SNO<100
               SET SNO=100
 +5       ;->
           IF SNO>5100
               Begin DoDot:1
 +6                SET HLEVOVER=1
 +7                SET TXT="     ***** 5000 Line Limit Reached!  Some text not included. *****"
 +8                SET ^XTMP(XTMP,"HLMAIL",+SNO)=""
 +9                SET ^XTMP(XTMP,"HLMAIL",+SNO+1)=""
 +10               SET ^XTMP(XTMP,"HLMAIL",+SNO+2)=TXT
 +11               SET ^XTMP(XTMP,"HLMAIL",1)=""
 +12               SET ^XTMP(XTMP,"HLMAIL",2)=TXT
 +13               SET ^XTMP(XTMP,"HLMAIL",3)=""
               End DoDot:1
               QUIT 
 +14       SET ^XTMP(XTMP,"HLMAIL",+SNO)=TXT
 +15       QUIT 
 +16      ;
EOR       ;HLEVSRV2 - Event Monitor SERVER ;5/16/03 14:42