| 1 | TMGTIU02 ;TMG/TIU Text Object Expansion Fns;04/15/10 | 
|---|
| 2 | ;;1.0;TMG-LIB;**1**;04/15/10 | 
|---|
| 3 | ; | 
|---|
| 4 | ;"Kevin Toppenberg MD | 
|---|
| 5 | ;"GNU General Public License (GPL) applies | 
|---|
| 6 | ;"04/15/10 | 
|---|
| 7 | ; | 
|---|
| 8 | ;"======================================================================= | 
|---|
| 9 | ;"PUBLIC FUNCTIONS | 
|---|
| 10 | ;"======================================================================= | 
|---|
| 11 | ; | 
|---|
| 12 | ;"======================================================================= | 
|---|
| 13 | ;"PRIVATE FUNCTIONS | 
|---|
| 14 | ;"======================================================================= | 
|---|
| 15 | ; | 
|---|
| 16 | ;"======================================================================= | 
|---|
| 17 | ; | 
|---|
| 18 | GETPTFLD(DFN,PARAM) ; | 
|---|
| 19 | ;"Purpose: This is the server-side code for the TIU TEXT OBJECT, which | 
|---|
| 20 | ;"      will allow the user to retrieve a field from the PATIENT file. | 
|---|
| 21 | ;"NOTE: This requires that patch TMG-CPRS-TEXTOBJ-PARAM*1.0*1 or later | 
|---|
| 22 | ;"      be installed, to allow passing in of parameters from the CPRS client. | 
|---|
| 23 | ;"Input: DFN -- This should be the IEN of the currently open patient | 
|---|
| 24 | ;"       Param -- Field(s)^Flags^FormatString.  Details below | 
|---|
| 25 | ;"            Field(s) -- required.  Options for input: | 
|---|
| 26 | ;"                -  A single field number or name | 
|---|
| 27 | ;"                -  A list of field numbers (or names), separated by semicolons | 
|---|
| 28 | ;"                -  A range of field numbers (or names), in the form M:N, | 
|---|
| 29 | ;"                         where M and N are the end points of the inclusive range. | 
|---|
| 30 | ;"                         All field numbers within this range are retrieved. | 
|---|
| 31 | ;"                -  A '*' for all fields at the top level (no sub-multiple record). | 
|---|
| 32 | ;"                -  A '**' for all fields including all fields and data in sub-multiple fields. | 
|---|
| 33 | ;"                -  Field number (or name) of a multiple followed by an * to indicate all | 
|---|
| 34 | ;"                         fields and records in the sub-multiple for that field. | 
|---|
| 35 | ;"                Invalid field names will be ignored | 
|---|
| 36 | ;"            Flags -- Optional. | 
|---|
| 37 | ;"                -  'F' -- include field name in results with value.  e.g. "AGE: 43" instead of just "43" | 
|---|
| 38 | ;"                -         This flag is ignored if a FormatString is provided (see below) | 
|---|
| 39 | ;"                -  'S' -- Keep all data values on a single line, separated by ';'. | 
|---|
| 40 | ;"                -         If flag not provided, and multiple data fields are requested, | 
|---|
| 41 | ;"                -         then the default is that each data value will be separated by a | 
|---|
| 42 | ;"                -         CRLF [$C(13)_$C(10)] | 
|---|
| 43 | ;"                -         This flag is ignored if a FormatString is provided (see below) | 
|---|
| 44 | ;"                -  'R' -- Resolve fields to NAMES, even if a field NUMBER was used for input request | 
|---|
| 45 | ;"                -         Note: this will affect the sorting order of the output (see FormatString | 
|---|
| 46 | ;"                -         info below).  I.e. if R not specified, and field NUMBERS are used for input, | 
|---|
| 47 | ;"                -         then results will be returned in numerical field number order by default. | 
|---|
| 48 | ;"                -         If R is specified, then field numbers are converted to field NAMES, and that | 
|---|
| 49 | ;"                -         is used to determine the order of output. | 
|---|
| 50 | ;"                -  'N' -- Don't return values for empty fields.  This is helpful if ALL fields | 
|---|
| 51 | ;"                -         were requested via '*' | 
|---|
| 52 | ;"            FormatString -- A string to determine how results are passed back.... | 
|---|
| 53 | ;"                NOTE: without a format string, results will be passed back in the order returned | 
|---|
| 54 | ;"                      by fileman.  I.e. if user requested fields "SEX;.01;AGE", then Fileman will | 
|---|
| 55 | ;"                      place results into an array, which MUMPS will sort alphabetically, e.g. | 
|---|
| 56 | ;"                      .01, then AGE, then SEX.  If "*" fields are requested, it would be even | 
|---|
| 57 | ;"                      more complex.  A format string will allow the user to specify ORDER. | 
|---|
| 58 | ;"                Format: e.g. "Any arbitrary text %FieldNameOrNum% more text %FieldNameOrNum% ..." | 
|---|
| 59 | ;"                  (The goal was to follow the method used by printf in the c language.) | 
|---|
| 60 | ;"                  -  Any arbitrary text can be included. | 
|---|
| 61 | ;"                  -  Field numbers or names should be enclosed by the '%' character | 
|---|
| 62 | ;"                       These will be replaced with actual data values. | 
|---|
| 63 | ;"                  - '\n' can be included to specify line breaks | 
|---|
| 64 | ;"                  - '%%' will be used to show a '%' in the output text | 
|---|
| 65 | ;"                  - Invalid, or non-matching, field names/numbers will be ignored. | 
|---|
| 66 | ;" | 
|---|
| 67 | ;"Results: returns a string that will be sent back to CPRS, to be included in a text note | 
|---|
| 68 | ;"NOTE: I have chosen to make this function work with only file 2 (PATIENT FILE).  I think | 
|---|
| 69 | ;"      it could be a security violation if any CPRS user was able to look at any arbitrary file. | 
|---|
| 70 | ;" | 
|---|
| 71 | ;"Examples of PARAM inputs: | 
|---|
| 72 | ;"    '.01'     -- returns .01 field, which is the patients NAME, e.g. "SMITH,JOHN A" | 
|---|
| 73 | ;"    'NAME'    -- returns same value as above, e.g. "SMITH,JOHN A" | 
|---|
| 74 | ;"    'NAME^F'  -- e.g result "NAME: SMITH,JOHN A" | 
|---|
| 75 | ;"    'NAME;SEX;AGE^F' --> "AGE: 34"_$C(13)_$C(10)_"NAME: SMITH,JOHN A"_$C(13)_$C(10)_"SEX: MALE" | 
|---|
| 76 | ;"    'NAME;SEX;AGE^S' --> "34; SMITH,JOHN A; MALE" | 
|---|
| 77 | ;"    'NAME;SEX;AGE^^"NAME: %NAME%, %AGE% yrs., %SEX%"' --> "NAME: SMITH,JOHN A, 34 YRS., MALE" | 
|---|
| 78 | ;" | 
|---|
| 79 | NEW TMGFLDS,TMGFLAGS | 
|---|
| 80 | NEW TMGFILE SET TMGFILE=2 | 
|---|
| 81 | NEW RESULT SET RESULT="" | 
|---|
| 82 | SET PARAM=$GET(PARAM) | 
|---|
| 83 | SET TMGFLDS=$PIECE(PARAM,"^",1) | 
|---|
| 84 | IF TMGFLDS="" DO  GOTO GPDN | 
|---|
| 85 | . SET RESULT="ERROR: No input parameter.  Example of use: |TMG PATIENT FLD{AGE}|" | 
|---|
| 86 | SET DFN=$GET(DFN) | 
|---|
| 87 | IF +DFN'>0 DO  GOTO GPDN | 
|---|
| 88 | . SET RESULT="ERROR: Internal patient value DFN not defined.  Contact IRM" | 
|---|
| 89 | NEW TMGIENS SET TMGIENS=DFN_"," | 
|---|
| 90 | SET TMGFLAGS="" | 
|---|
| 91 | NEW TMGTEMP SET TMGTEMP=$$UP^XLFSTR($PIECE(PARAM,"^",2)) | 
|---|
| 92 | IF TMGTEMP["N" SET TMGFLAGS=TMGFLAGS_"N" | 
|---|
| 93 | IF TMGTEMP["F" SET TMGFLAGS=TMGFLAGS_"R" | 
|---|
| 94 | NEW TMGFORMAT SET TMGFORMAT=$PIECE(PARAM,"^",3) | 
|---|
| 95 | NEW TMGOUT,TMGMSG | 
|---|
| 96 | DO GETS^DIQ(TMGFILE,TMGIENS,TMGFLDS,TMGFLAGS,"TMGOUT","TMGMSG") | 
|---|
| 97 | IF $DATA(TMGMSG("DIERR")) DO  GOTO GPDN | 
|---|
| 98 | . SET RESULT=$$GetErrStr^TMGDEBUG(.TMGMSG) | 
|---|
| 99 | NEW FLD,FLDNAME | 
|---|
| 100 | SET FLD="" | 
|---|
| 101 | IF TMGFORMAT="" DO | 
|---|
| 102 | . FOR  SET FLD=$ORDER(TMGOUT(TMGFILE,TMGIENS,FLD)) QUIT:(FLD="")  DO | 
|---|
| 103 | . . IF $DATA(TMGOUT(TMGFILE,TMGIENS,FLD,0)) QUIT  ;"For now, WP fields are not supported.  Could add later if needed. | 
|---|
| 104 | . . NEW VALUE SET VALUE=$GET(TMGOUT(TMGFILE,TMGIENS,FLD)) | 
|---|
| 105 | . . IF VALUE="",TMGTEMP["N" QUIT | 
|---|
| 106 | . . IF RESULT'="" DO | 
|---|
| 107 | . . . IF TMGTEMP["S" SET RESULT=RESULT_"; " | 
|---|
| 108 | . . . ELSE  SET RESULT=RESULT_$CHAR(13)_$CHAR(10) | 
|---|
| 109 | . . IF TMGTEMP["F" DO | 
|---|
| 110 | . . . IF FLD'=+FLD SET FLDNAME=FLD | 
|---|
| 111 | . . . ELSE  SET FLDNAME=$PIECE($GET(^DD(TMGFILE,FLD,0)),"^",1) | 
|---|
| 112 | . . . SET RESULT=RESULT_FLDNAME_": " | 
|---|
| 113 | . . SET RESULT=RESULT_VALUE | 
|---|
| 114 | ELSE  DO  ;"Handle format strings. | 
|---|
| 115 | . SET RESULT=TMGFORMAT | 
|---|
| 116 | . FOR  QUIT:(RESULT'["%")  DO | 
|---|
| 117 | . . NEW SUBA,SUBB | 
|---|
| 118 | . . SET SUBA=$PIECE(RESULT,"%",1) | 
|---|
| 119 | . . SET FLD=$PIECE(RESULT,"%",2) | 
|---|
| 120 | . . SET SUBB=$PIECE(RESULT,"%",3,999) | 
|---|
| 121 | . . NEW VALUE | 
|---|
| 122 | . . IF FLD="" SET VALUE="<@!@>"  ;"protect %%, later convert back to '%' | 
|---|
| 123 | . . ELSE  SET VALUE=$GET(TMGOUT(TMGFILE,TMGIENS,FLD)) | 
|---|
| 124 | . . IF VALUE="" DO | 
|---|
| 125 | . . . IF FLD=+FLD DO | 
|---|
| 126 | . . . . SET FLD=$PIECE($GET(^DD(TMGFILE,FLD,0)),"^",1) ;"Convert # to name | 
|---|
| 127 | . . . ELSE  DO | 
|---|
| 128 | . . . . SET FLD=$ORDER(^DD(TMGFILE,"B",FLD,"")) ;"Convert name to # | 
|---|
| 129 | . . . IF FLD'="" SET VALUE=$GET(TMGOUT(TMGFILE,TMGIENS,FLD)) | 
|---|
| 130 | . . . IF VALUE="" SET VALUE="??" | 
|---|
| 131 | . . SET RESULT=SUBA_VALUE_SUBB | 
|---|
| 132 | . NEW TMGALT | 
|---|
| 133 | . SET TMGALT("<@!@>")="%" | 
|---|
| 134 | . SET TMGALT("\n")=$CHAR(13)_$CHAR(10) | 
|---|
| 135 | . SET RESULT=$$REPLACE^XLFSTR(RESULT,.TMGALT) | 
|---|
| 136 | ; | 
|---|
| 137 | GPDN    QUIT RESULT | 
|---|