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

PXRMFFDB.m

Go to the documentation of this file.
  1. PXRMFFDB ;SLC/PKR - Function finding data structure builder. ;22-Jul-2015 04:23;du
  1. ;;2.0;CLINICAL REMINDERS;**4,6,12,18,26,1005**;Feb 04, 2005;Build 23
  1. ;
  1. ;===========================================
  1. BASE2(NUM) ;Convert a base 10 integer to base 2.
  1. N BD,BIN
  1. S BIN=""
  1. F Q:NUM=0 D
  1. . S BD=$S((NUM\2)=(NUM/2):0,1:1)
  1. . S BIN=BD_BIN,NUM=NUM\2
  1. Q BIN
  1. ;
  1. ;===========================================
  1. CRESLOG(NUM,FLIST,RESLOG) ;Check the resolution logic to see if
  1. ;it can be made true solely by function findings. If that is the case
  1. ;warn the user. Called by BLDRESLS^PXRMLOGX
  1. N AGEFI,BP,FI,FF,FFL,IND,JND,KND,LE,LEN,LND,NFF,NTC,SEXFI,TEMP,VALUE
  1. S (AGEFI,SEXFI)=0
  1. S NFF=0
  1. F IND=1:1:NUM D
  1. . S JND=$P(FLIST,";",IND)
  1. . I +JND=JND S FI(JND)=0 Q
  1. . I JND["FF" S NFF=NFF+1,FF=$P(JND,"FF",2),FFL(NFF)=FF
  1. I NFF=0 Q
  1. ;Generate and test all combinations of true and false FFs.
  1. S VALUE=0
  1. S NTC=$$PWR^XLFMTH(2,NFF)-1
  1. F IND=1:1:NTC Q:VALUE D
  1. . S BIN=$$BASE2(IND)
  1. . S LEN=$L(BIN)
  1. . S LE=NFF-LEN
  1. .;Fill in the values for the implied preceding 0s.
  1. . F JND=1:1:LE S KND=FFL(JND),FF(KND)=0
  1. . S LND=0
  1. . F JND=LE+1:1:NFF D
  1. .. S KND=FFL(JND),LND=LND+1
  1. .. S FF(KND)=$E(BIN,LND)
  1. . I @RESLOG
  1. . S VALUE=$T
  1. I VALUE D
  1. . N RESLSTR
  1. . S RESLSTR=RESLOG
  1. . F IND=1:1:NUM D
  1. .. S JND=$P(FLIST,";",IND)
  1. .. S TEMP=$S(JND["FF":"FF("_$P(JND,"FF",2)_")",1:"FI("_JND_")")
  1. .. S RESLOG=$$STRREP^PXRMUTIL(RESLOG,TEMP,@TEMP)
  1. . S RESLOG=$$STRREP^PXRMUTIL(RESLOG,"AGE",AGEFI)
  1. . S RESLOG=$$STRREP^PXRMUTIL(RESLOG,"SEX",SEXFI)
  1. . W !!,"Warning - your resolution logic can be satisfied by function findings only."
  1. . W !,"If this happens it will not be possible to calculate a resolution date and"
  1. . W !,"the reminder will not be resolved. Here is a case where the logic evaluates"
  1. . W !,"to true:"
  1. . W !,RESLSTR
  1. . W !,RESLOG
  1. . W !
  1. Q
  1. ;
  1. ;===========================================
  1. FFBUILD(X,DA) ;Given a function finding logical string build the data
  1. ;structure. This is called by a new-style cross-reference after
  1. ;the function string has passed the input transform so we don't need
  1. ;to validate the elements.
  1. ;Do not execute as part of a verify fields.
  1. I $G(DIUTIL)="VERIFY FIELDS" Q
  1. ;Do not execute as part of exchange.
  1. I $G(PXRMEXCH) Q
  1. N FDA,FUNNUM,FUNP,IENB,IENS,IND,JND,L2,L3,LEN,LIST,LOGIC,OPERS,MSG
  1. N PFSTACK,REPL,RS,TEMP,TS
  1. S IENB=DA_","_DA(1)_","
  1. S OPERS=$$GETOPERS
  1. ;Remove call to non-existent routine Patch 1005
  1. ;D QFIX^PXRMSTAC(X,OPERS,.PFSTACK)
  1. D POSTFIX^PXRMSTAC(X,OPERS,.PFSTACK)
  1. S (FUNNUM,L2)=0
  1. F IND=1:1:PFSTACK(0) D
  1. . S TEMP=PFSTACK(IND)
  1. . I $D(^PXRMD(802.4,"B",TEMP)) D
  1. .. S FUNP=$O(^PXRMD(802.4,"B",TEMP,""))
  1. .. S FUNNUM=FUNNUM+1,L2=L2+1
  1. .. S IENS="+"_L2_","_IENB
  1. .. S FDA(811.9255,IENS,.01)=FUNNUM
  1. .. S FDA(811.9255,IENS,.02)=FUNP
  1. .. S IND=IND+1
  1. .. S LIST=$TR(PFSTACK(IND),"~"," ")
  1. .. S REPL(FUNNUM)=TEMP_"("_LIST_")"_U_"FN("_FUNNUM_")"
  1. .. S L3=L2
  1. .. S LEN=$L(LIST,",")
  1. .. F JND=1:1:LEN D
  1. ... S L3=L3+1
  1. ... S IENS="+"_L3_",+"_L2_","_IENB
  1. ... S TS=$P(LIST,",",JND)
  1. ... S TS=$TR(TS,"""","")
  1. ... S FDA(811.9256,IENS,.01)=TS
  1. .. S L2=L3
  1. ;Build the logic string
  1. S LOGIC=X
  1. F IND=1:1:FUNNUM D
  1. . S TS=$P(REPL(IND),U,1)
  1. . S RS=$P(REPL(IND),U,2)
  1. . S LOGIC=$$STRREP^PXRMUTIL(LOGIC,TS,RS)
  1. S FDA(811.925,IENB,10)=LOGIC
  1. D UPDATE^DIE("","FDA","IENB","MSG")
  1. I $D(MSG) D
  1. . W !,"The update failed, UPDATE^DIE returned the following error message:"
  1. . D AWRITE^PXRMUTIL("MSG")
  1. Q
  1. ;
  1. ;===========================================
  1. FFKILL(X,DA) ;This is the kill logic for the function string.
  1. ;Do not execute as part of a verify fields.
  1. I $G(DIUTIL)="VERIFY FIELDS" Q
  1. ;Do not execute as part of exchange.
  1. I $G(PXRMEXCH) Q
  1. K ^PXD(811.9,DA(1),25,DA,5),^PXD(811.9,DA(1),25,DA,10)
  1. Q
  1. ;
  1. ;===========================================
  1. GETOPERS() ;Return the list of operators that can be used in a function string.
  1. Q "!&-+*/\#<>=']['='<'>'[']"
  1. ;
  1. ;===========================================
  1. ISGRV(VAR) ;VAR can be a global reminder variable by itself or used in a
  1. ;$P.
  1. N DELIM,EXPR,FROM,TO,VALID
  1. S EXPR=$P(VAR,",",1)
  1. S VALID=$S(EXPR="PXRMAGE":1,EXPR="PXRMDOB":1,EXPR="PXRMLAD":1,EXPR="PXRMSEX":1,1:0)
  1. I 'VALID Q 0
  1. S DELIM=$P(VAR,",",2)
  1. S VALID=$S(DELIM="":1,1:$$ISSTR(DELIM))
  1. I 'VALID Q 0
  1. S FROM=$P(VAR,",",3)
  1. S VALID=$S(FROM="":1,FROM=+FROM:1,1:0)
  1. I 'VALID Q 0
  1. S TO=$P(VAR,",",4)
  1. S VALID=$S(TO="":1,TO=+TO:1,1:0)
  1. Q VALID
  1. ;
  1. ;===========================================
  1. ISSTR(STRING) ;Return true if STRING really is a string and it is not
  1. ;executable MUMPS code.
  1. N VALID,X
  1. S VALID=0
  1. ;First and last character is a quote and there are an even number of
  1. ;quotes in the string.
  1. I ($E(STRING,1)=""""),($E(STRING,$L(STRING))=""""),($L(STRING,"""")#2=1) S VALID=1
  1. ;Check for ,DELIMITER,FROM,TO associated with $P.
  1. I 'VALID D
  1. . I STRING?1","1""""1.E1""""0.1(1","1.N)0.1(1","1.N) S VALID=1
  1. . I STRING?1",U"0.1(1","1.N)0.1(1","1.N) S VALID=1
  1. I 'VALID Q VALID
  1. S X=STRING
  1. D ^DIM
  1. S VALID=$S($D(X)=0:1,1:0)
  1. Q VALID
  1. ;
  1. ;===========================================
  1. VFFORM(FUN,ARGLIST,FSTRING) ;Make sure the function is followed by an argument
  1. ;list i.e., FUN(...).
  1. N TSTRING,VALID
  1. S TSTRING=FUN_"("_ARGLIST_")"
  1. S VALID=$S(FSTRING[TSTRING:1,1:0)
  1. I 'VALID D
  1. . N TEXT
  1. . S TEXT="Function "_FUN_" must be followed by an argument list!"
  1. . D EN^DDIOL(.TEXT)
  1. Q VALID
  1. ;
  1. ;===========================================
  1. VFINDING(X,DAI) ;Make sure a finding number is a valid member of the
  1. ;definition finding multiple. Input transform for function
  1. ;finding finding number.
  1. ;Do not execute as part of a verify fields.
  1. I $G(DIUTIL)="VERIFY FIELDS" Q 1
  1. ;Do not execute as part of exchange.
  1. I $G(PXRMEXCH) Q 1
  1. I '$D(DAI) Q 1
  1. ;If X is not numeric it is not a finding number.
  1. I +X'=X Q 0
  1. I $D(^PXD(811.9,DAI,20,X,0)) Q 1
  1. E D Q 0
  1. . N TEXT
  1. . S TEXT="Finding number "_X_" does not exist!"
  1. . D EN^DDIOL(TEXT)
  1. ;
  1. ;===========================================
  1. VFSTRING(FFSTRING,DA) ;Make sure a function finding string is valid.
  1. ;The elements can be functions, operators, and numbers.
  1. ;Do not execute as part of a verify fields.
  1. ;I $G(DIUTIL)="VERIFY FIELDS" Q 1
  1. ;Do not execute as part of exchange.
  1. I $G(PXRMEXCH) Q 1
  1. I '$D(DA) Q 1
  1. N DAI,DATE,FUNIEN,IND,LIST,MFUN,OPERS,PFSTACK,TEMP,TEXT,VALID
  1. S DAI=DA(1)
  1. S OPERS=$$GETOPERS
  1. ;Define the allowed M functions.
  1. S MFUN("$P")=""
  1. D POSTFIX^PXRMSTAC(FFSTRING,OPERS,.PFSTACK)
  1. S VALID=1
  1. F IND=1:1:PFSTACK(0) Q:'VALID D
  1. . S TEMP=PFSTACK(IND)
  1. . I $D(^PXRMD(802.4,"B",TEMP)) D Q
  1. .. S FUNIEN=$O(^PXRMD(802.4,"B",TEMP,""))
  1. .. S IND=IND+1
  1. .. S LIST=$G(PFSTACK(IND))
  1. .. S VALID=$$VFFORM(TEMP,LIST,X)
  1. .. I 'VALID Q
  1. .. I $G(^PXRMD(802.4,FUNIEN,2))'="" S VALID=$$VALISTS(LIST,DAI,TEMP,FUNIEN)
  1. .. I $G(^PXRMD(802.4,FUNIEN,3))'="" S VALID=$$VALISTM(LIST,DAI,TEMP,FUNIEN)
  1. .;Check for an operator. Unary operators have a "U" appended.
  1. . I OPERS[$P(TEMP,"U",1) Q
  1. .;Check for number
  1. . I TEMP=+TEMP Q
  1. .;Check for allowed M function.
  1. . I $D(MFUN(TEMP)) Q
  1. .;Check for a global reminder variable
  1. . I $$ISGRV(TEMP) Q
  1. .;Check for a non-executable string.
  1. . I $$ISSTR(TEMP) Q
  1. . S VALID=0
  1. . S TEXT=TEMP_" is not a valid function finding element!"
  1. . D EN^DDIOL(TEXT)
  1. I VALID D
  1. . N X
  1. . S X="I "_FFSTRING
  1. . D ^DIM
  1. . I $D(X)=0 S VALID=0
  1. I 'VALID D
  1. . S TEMP=FFSTRING_" is not a valid function string!"
  1. . D EN^DDIOL(TEMP)
  1. Q VALID
  1. ;
  1. ;===========================================
  1. VALISTS(LIST,DAI,FUNCTION,FUNIEN) ;Make sure the function argument list
  1. ;s valid. This check is for functions where a single pattern can
  1. ;be used.
  1. N AT,IND,LEN,PATTERN,VALID,X
  1. S LEN=$L(LIST,",")
  1. I LEN=0 D Q 0
  1. . N TEXT
  1. . S TEXT="The argument list is not defined!"
  1. . D EN^DDIOL(TEXT)
  1. S PATTERN=^PXRMD(802.4,FUNIEN,2)
  1. S VALID=$S(LIST?@PATTERN:1,1:0)
  1. I 'VALID D Q 0
  1. . N TEXT
  1. . S TEXT="Argument list "_LIST_" is not correct for function "_$P(^PXRMD(802.4,FUNIEN,0),U,1)
  1. . D EN^DDIOL(TEXT)
  1. F IND=1:1:LEN D
  1. . S X=$P(LIST,",",IND)
  1. . S AT=$$ARGTYPE^PXRMFFAT(FUNCTION,IND)
  1. . I AT="U" S VALID=0 Q
  1. . I AT="F",'$$VFINDING(X,DAI) S VALID=0
  1. Q VALID
  1. ;
  1. ;===========================================
  1. VALISTM(LIST,DAI,FUNCTION,FUNIEN) ;Make sure the function argument list
  1. ;is valid. This check is for functions where a different pattern is
  1. ;required for each argument.
  1. N ARG,AT,IND,LEN,NL,PAT,PATTERNS,TEXT,VARG,VALID
  1. S LEN=$L(LIST,",")
  1. I LEN=0 D Q 0
  1. . N TEXT
  1. . S TEXT="The argument list is not defined!"
  1. . D EN^DDIOL(TEXT)
  1. S PATTERNS=^PXRMD(802.4,FUNIEN,3)
  1. S LEN=$L(PATTERNS,"~")
  1. I LEN=0 D Q 0
  1. . N TEXT
  1. . S TEXT="The pattern list is not defined!"
  1. . D EN^DDIOL(TEXT)
  1. S NL=0,VALID=1
  1. F IND=1:1:LEN D
  1. . S ARG=$P(LIST,",",IND)
  1. . S PAT=$P(PATTERNS,"~",IND)
  1. . S VARG=ARG?@PAT
  1. . I 'VARG S VALID=0,NL=NL+1,TEXT(NL)="Function argument number "_IND_" is incorrect." Q
  1. . S AT=$$ARGTYPE^PXRMFFAT(FUNCTION,IND)
  1. . I AT="U" S VARG=0
  1. . I 'VARG S VALID=0,NL=NL+1,TEXT(NL)="Function argument number "_IND_" is the wrong type." Q
  1. . I AT="F",'$$VFINDING(ARG,DAI) S VARG=0
  1. I 'VALID D EN^DDIOL(.TEXT)
  1. Q VALID
  1. ;