Ignore:
Timestamp:
Dec 4, 2009, 12:11:15 AM (14 years ago)
Author:
George Lilly
Message:

revised back to 6/30/08 version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • WorldVistAEHR/trunk/r/CLINICAL_REMINDERS-PXRM/PXRMRUL1.m

    r613 r623  
    1 PXRMRUL1        ; SLC/AGP,PKR - Patient list routines. ; 03/29/2007
    2         ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123
    3         ;
    4         ;
    5 ASK(PLIEN,OPT)  ;Verify patient list name
    6         N X,Y,TEXT
    7         K DIROUT,DIRUT,DTOUT,DUOUT
    8         S DIR(0)="YA0"
    9         S DIR("A")=OPT_" patient list "_$P($G(^PXRMXP(810.5,PLIEN,0)),U)_"?: "
    10         S DIR("B")="N"
    11         S DIR("?")="Enter Y or N. For detailed help type ??"
    12         W !
    13         D ^DIR K DIR
    14         I $D(DIROUT) S DTOUT=1
    15         I $D(DTOUT)!($D(DUOUT)) Q
    16         I $E(Y(0))="N" S DUOUT=1 Q
    17         Q
    18         ;
    19 COPY(IENO)      ;Copy patient list
    20         ;Check if OK to copy
    21         D ASK(IENO,"Copy") Q:$D(DUOUT)!$D(DTOUT)
    22         N FDA,IENN,IND,MSG,NNAME,ODATA,OEPIEN,ONAME,ORULE,PATCREAT,TEXT,X,Y
    23         ;Select list to copy to
    24         S TEXT="Select PATIENT LIST name to copy to: "
    25         D PLIST^PXRMLCR(.IENN,TEXT,IENO) Q:$D(DUOUT)!$D(DTOUT)  Q:'IENN
    26         S NNAME=$P($G(^PXRMXP(810.5,IENN,0)),U)
    27         ;
    28         ;Get original Patient List record
    29         S ODATA=$G(^PXRMXP(810.5,IENO,0))
    30         S ONAME=$P(ODATA,U),OEPIEN=$P(ODATA,U,5),ORULE=$P(ODATA,U,6)
    31         ;
    32         M ^PXRMXP(810.5,IENN)=^PXRMXP(810.5,IENO)
    33         D ASK^PXRMXD(.PATCREAT,"Secure list?: ",2)
    34         ;Update header info
    35         S TYPE=$S($G(PATCREAT)="Y":"PVT",1:"PUB")
    36         S IND=IENN_","
    37         S FDA(810.5,IND,.01)=NNAME
    38         S FDA(810.5,IND,.04)=$$NOW^XLFDT
    39         S FDA(810.5,IND,.05)=OEPIEN
    40         S FDA(810.5,IND,.06)=ORULE
    41         S FDA(810.5,IND,.07)=$G(DUZ)
    42         S FDA(810.5,IND,.08)=TYPE
    43         D UPDATE^DIE("","FDA","","MSG")
    44         ;Error
    45         I $D(MSG) D ERR
    46         ;
    47         W !!,"Completed copy of '"_ONAME_"'"
    48         W !,"into '"_NNAME_"'",! H 2
    49         K ^TMP($J,"PXRMRULE")
    50         Q
    51         ;
    52 CRLST(NAME,CLASS)       ;Create new patient list
    53         N IEN
    54         ;Check if name exists
    55         S IEN=$O(^PXRMXP(810.5,"B",NAME,"")) I IEN Q IEN
    56         ;Otherwise create national entry
    57         N FDA,FDAIEN,MSG
    58         S FDA(810.5,"+1,",.01)=NAME
    59         S FDA(810.5,"+1,",100)=CLASS
    60         S FDA(810.5,"+1,",.07)=$G(DUZ)
    61         ;Make stub public
    62         S FDA(810.5,"+1,",.08)="PUB"
    63         D UPDATE^DIE("","FDA","FDAIEN","MSG")
    64         ;Error
    65         I $D(MSG) Q 0
    66         ;Otherwise list ien
    67         Q FDAIEN(1)
    68         ;
    69 COUNT(NODE)     ;Count the number of entries.
    70         N DFN,NUM
    71         S (DFN,NUM)=0
    72         F  S DFN=$O(^TMP($J,NODE,DFN)) Q:DFN=""  S NUM=NUM+1
    73         Q NUM
    74         ;
    75 DELETE(LIST)    ;Delete Patient list
    76         I '$$VEDIT^PXRMUTIL("^PXRMXP(810.5,",LIST) D  Q
    77         .W !!,?5,"VA- and national class patient lists may not be deleted" H 2
    78         .S DUOUT=1
    79         ;Check if this is the right list
    80         D ASK(LIST,"Delete") Q:$D(DUOUT)!$D(DTOUT)
    81         ;
    82         N DA,DIK,DUOUT
    83         ;Lock patient list
    84         D LOCK Q:$D(DUOUT)
    85         ;Kill List
    86         S DA=LIST,DIK="^PXRMXP(810.5,"
    87         D ^DIK
    88         ;Unlock patient list
    89         D UNLOCK
    90         Q
    91         ;
    92 DATECHK(DATE)   ;
    93         I DATE=0 Q 1
    94         S DATE=$$STRREP^PXRMUTIL(DATE,"BDT","T")
    95         Q $$VDT^PXRMINTR(DATE)
    96         ;
    97 DATES(LBBDT,LBEDT,RBDT,REDT,FARR)       ;Set the dates in the finding array to
    98         ;FileMan dates.
    99         N FI,PXRMDATE,TBDT,TEDT
    100         S FI=0
    101         F  S FI=+$O(FARR(20,FI)) Q:FI=0  D
    102         . S TBDT=$P(FARR(20,FI,0),U,8),TEDT=$P(FARR(20,FI,0),U,11)
    103         . I TBDT="",TEDT="" D
    104         .. S $P(FARR(20,FI,0),U,8)=RBDT,$P(FARR(20,FI,0),U,11)=REDT
    105         . E  D
    106         .. S PXRMDATE=$S(TBDT["BDT":LBBDT,1:LBEDT)
    107         .. S TBDT=$S(TBDT="":0,TBDT=0:0,TBDT="BDT":LBBDT,1:$$CTFMD^PXRMDATE(TBDT))
    108         .. S PXRMDATE=$S(TEDT["BDT":LBBDT,1:LBEDT)
    109         .. S TEDT=$S(TEDT="":"T",TEDT=0:"T",TEDT="BDT":LBBDT,1:TEDT)
    110         .. S TEDT=$$CTFMD^PXRMDATE(TEDT)
    111         .. S $P(FARR(20,FI,0),U,8)=TBDT,$P(FARR(20,FI,0),U,11)=TEDT
    112         Q
    113         ;
    114 ERR     ;Error Handler
    115         N ERROR,IC,REF
    116         S ERROR(1)="Unable to build patient list : "
    117         S ERROR(2)=NAME
    118         S ERROR(3)="Error in UPDATE^DIE, needs further investigation"
    119         ; Move MSG into Error
    120         S REF="MSG"
    121         F IC=4:1 S REF=$Q(@REF) Q:REF=""  S ERROR(IC)=REF_"="_@REF
    122         ;Screen message
    123         D EN^DDIOL(.ERROR)
    124         Q
    125         ;
    126 INSERT(FROUT,DFN,TNAME,TFIEV,RSTOP)     ;Save patient data.
    127         I TFIEV(1)=0 Q
    128         N DATA,DONE,IND,LEN,REF,ROOT,START,SUB,TEMP
    129         S REF="TFIEV(1,""CSUB"")"
    130         S PROOT=$P(REF,")",1)
    131         ;Build the root so we can tell when we are done.
    132         S TEMP=$NA(@REF)
    133         S ROOT=$P(TEMP,")",1)
    134         S REF=$Q(@REF)
    135         I REF'[ROOT Q
    136         S DONE=0
    137         F  Q:(REF="")!(DONE)  D
    138         . S START=$F(REF,ROOT)
    139         . S LEN=$L(REF)-1
    140         . S IND=$E(REF,START,LEN)
    141         . S DATA(TNAME_IND)=@REF
    142         . S REF=$Q(@REF)
    143         . I REF'[ROOT S DONE=1
    144         I $D(DATA) M ^TMP($J,FROUT,DFN,"DATA")=DATA
    145         Q
    146         ;
    147 INST(DFN)       ;Get the PCMM Institution.
    148         N DATE,INST
    149         ;Check PCMM
    150         S DATE=$S($G(PXRMDATE)'="":$P(PXRMDATE,"."),1:DT)
    151         ;DBIA #1916
    152         S INST=$P($$INSTPCTM^SCAPMC(DFN,DATE),U,3,4)
    153         Q INST
    154         ;
    155 LOCK    L +^PXRMXP(810.5,LIST):0
    156         E  W !!?5,"Another user is using this patient list" S DUOUT=1
    157         Q
    158         ;
    159 LOGOP(LIST1,LIST2,LOGOP)        ;Given LIST1 and LIST2 apply the logical
    160         ;operator LOGOP to generate a new list and return it in LIST1
    161         N DFN1,DFN2
    162         I LOGOP="&" D  Q
    163         . S DFN1=""
    164         . F  S DFN1=$O(^TMP($J,LIST1,DFN1)) Q:DFN1=""  D
    165         .. I $D(^TMP($J,LIST2,DFN1)) M ^TMP($J,LIST1,DFN1)=^TMP($J,LIST2,DFN1) Q
    166         .. K ^TMP($J,LIST1,DFN1)
    167         ;
    168         ;"~" represents "&'".
    169         I LOGOP="~" D  Q
    170         . S DFN1=""
    171         . F  S DFN1=$O(^TMP($J,LIST1,DFN1)) Q:DFN1=""  D
    172         .. I $D(^TMP($J,LIST2,DFN1)) K ^TMP($J,LIST1,DFN1)
    173         ;
    174         I LOGOP="!" D
    175         . S DFN2=""
    176         . F  S DFN2=$O(^TMP($J,LIST2,DFN2)) Q:DFN2=""  D
    177         .. M ^TMP($J,LIST1,DFN2)=^TMP($J,LIST2,DFN2)
    178         Q
    179         ;
    180 REM(FRACT,RIEN,LBBDT,LBEDT,RSTART,RSTOP,PNODE)  ;Process reminder finding rule
    181         N DEFFARR,PXRMDATE
    182         D DEF^PXRMLDR(RIEN,.DEFARR)
    183         D DATES(LBBDT,LBEDT,RSTART,RSTOP,.DEFARR)
    184         S PXRMDATE=RSTOP
    185         D BLDPLST^PXRMPLST(.DEFARR,PNODE,1)
    186         ;Remove, Select or Add Findings operations
    187         I FRACT="A" D LOGOP(FROUT,PNODE,"!") Q
    188         I FRACT="D" D LOGOP(FROUT,PNODE,"~") Q
    189         I FRACT="S" D LOGOP(FROUT,PNODE,"&") Q
    190         Q
    191         ;
    192 TERM(FRACT,FRTIEN,LBBDT,LBEDT,RSTART,RSTOP,PNODE,INST)  ;Process TERM finding
    193         ;rules
    194         N FINDPA,FINDING,FNAME,PLIST,PXRMDATE,PXRMDEBG
    195         N TERMARR,TFIEV,TNAME
    196         ;Get term definition array
    197         D TERM^PXRMLDR(FRTIEN,.TERMARR)
    198         S TNAME=$P(TERMARR(0),U,1)
    199         S INST=$S(FRACT'="F":0,TNAME="VA-PCMM INSTITUTION":1,TNAME="VA-IHD STATION CODE":1,1:0)
    200         ;Set begin and end dates in the term.
    201         D DATES(LBBDT,LBEDT,RSTART,RSTOP,.TERMARR)
    202         S $P(FINDPA(0),U,8)=RSTART,$P(FINDPA(0),U,11)=RSTOP,PXRMDATE=RSTOP
    203         ;
    204         ;Add operation
    205         I FRACT="A" D  Q
    206         .;Process term for date range
    207         .D EVALPL^PXRMTERL(.FINDPA,.TERMARR,PNODE)
    208         .;Merge lists if operation is add
    209         .M ^TMP($J,FROUT)=^TMP($J,PNODE,1)
    210         ;Remove, Select or Insert Findings operations
    211         I FRACT="F" S PXRMDEBG=1
    212         S DFN=0
    213         F  S DFN=$O(^TMP($J,FROUT,DFN)) Q:'DFN  D
    214         .I INST S ^TMP($J,FROUT,DFN,"INST")=$$INST(DFN) Q
    215         .;Evaluate term
    216         .K TFIEV D IEVALTER^PXRMTERM(DFN,.FINDPA,.TERMARR,1,.TFIEV)
    217         .;Delete any ^TMP patient in PLIST if action is remove
    218         .I FRACT="R",TFIEV(1) K ^TMP($J,FROUT,DFN) Q
    219         .;Delete any ^TMP patient not in PLIST if action is select
    220         .I FRACT="S",'TFIEV(1) K ^TMP($J,FROUT,DFN) Q
    221         .I FRACT="F",TFIEV(1) D
    222         .. S FINDING=TFIEV(1,"FINDING")
    223         .. I '$D(FNAME(FINDING)) S FNAME(FINDING)=$$GETFNAME^PXRMDATA(FINDING)
    224         .. S TFIEV(1,"CSUB","FINDING NAME")=FNAME(FINDING)
    225         .. D INSERT(FROUT,DFN,TNAME,.TFIEV,RSTOP)
    226         Q
    227         ;
    228 UNLOCK  L -^PXRMXP(810.5,LIST) Q
    229         ;
     1PXRMRUL1 ; SLC/AGP,PKR - Patient list routines. ; 08/11/2006
     2 ;;2.0;CLINICAL REMINDERS;**4**;Feb 04, 2005;Build 21
     3 ;
     4DATECHK(DATE) ;
     5 I DATE=0 Q 1
     6 S DATE=$$STRREP^PXRMUTIL(DATE,"BDT","T")
     7 Q $$VDT^PXRMINTR(DATE)
     8 ;
     9INSERT(FROUT,DFN,TNAME,TFIEV,RSTOP) ;Save patient data.
     10 I TFIEV(1)=0 Q
     11 N DATA,DONE,IND,LEN,REF,ROOT,START,SUB,TEMP
     12 S REF="TFIEV(1,""CSUB"")"
     13 S PROOT=$P(REF,")",1)
     14 ;Build the root so we can tell when we are done.
     15 S TEMP=$NA(@REF)
     16 S ROOT=$P(TEMP,")",1)
     17 S REF=$Q(@REF)
     18 I REF'[ROOT Q
     19 S DONE=0
     20 F  Q:(REF="")!(DONE)  D
     21 . S START=$F(REF,ROOT)
     22 . S LEN=$L(REF)-1
     23 . S IND=$E(REF,START,LEN)
     24 . S DATA(TNAME_IND)=@REF
     25 . S REF=$Q(@REF)
     26 . I REF'[ROOT S DONE=1
     27 I $D(DATA) M ^TMP($J,FROUT,DFN,"DATA")=DATA
     28 Q
     29 ;
     30INST(DFN) ;Get the PCMM Institution.
     31 N DATE,INST
     32 ;Check PCMM
     33 S DATE=$S($G(PXRMDATE)'="":$P(PXRMDATE,"."),1:DT)
     34 ;DBIA #1916
     35 S INST=$P($$INSTPCTM^SCAPMC(DFN,DATE),U,3,4)
     36 Q INST
     37 ;
     38LOGOP(LIST1,LIST2,LOGOP) ;Given LIST1 and LIST2 apply the logical
     39 ;operator LOGOP to generate a new list and return it in LIST1
     40 N DFN1,DFN2
     41 I LOGOP="&" D  Q
     42 . S DFN1=""
     43 . F  S DFN1=$O(^TMP($J,LIST1,DFN1)) Q:DFN1=""  D
     44 .. I $D(^TMP($J,LIST2,DFN1)) M ^TMP($J,LIST1,DFN1)=^TMP($J,LIST2,DFN1) Q
     45 .. K ^TMP($J,LIST1,DFN1)
     46 ;
     47 ;"~" represents "&'".
     48 I LOGOP="~" D  Q
     49 . S DFN1=""
     50 . F  S DFN1=$O(^TMP($J,LIST1,DFN1)) Q:DFN1=""  D
     51 .. I $D(^TMP($J,LIST2,DFN1)) K ^TMP($J,LIST1,DFN1)
     52 ;
     53 I LOGOP="!" D
     54 . S DFN2=""
     55 . F  S DFN2=$O(^TMP($J,LIST2,DFN2)) Q:DFN2=""  D
     56 .. M ^TMP($J,LIST1,DFN2)=^TMP($J,LIST2,DFN2)
     57 Q
     58 ;
     59REM(FRACT,RIEN,RSTART,RSTOP,PNODE) ;Process reminder finding rule
     60 D BLDPLST^PXRMPLST(RIEN,PNODE,1,RSTOP)
     61 ;Remove, Select or Add Findings operations
     62 I FRACT="A" D LOGOP(FROUT,PNODE,"!") Q
     63 I FRACT="D" D LOGOP(FROUT,PNODE,"~") Q
     64 I FRACT="S" D LOGOP(FROUT,PNODE,"&") Q
     65 Q
     66 ;
     67TERM(FRACT,FRTIEN,RSTART,RSTOP,PNODE,INST) ;Process TERM finding rule
     68 N FINDPA,FINDING,FNAME,PLIST,PXRMDATE,PXRMDEBG,TERMARR,TFIEV,TNAME
     69 ;Get term definition array
     70 D TERM^PXRMLDR(FRTIEN,.TERMARR)
     71 S TNAME=$P(TERMARR(0),U,1)
     72 S INST=$S(FRACT'="F":0,TNAME="VA-PCMM INSTITUTION":1,TNAME="VA-IHD STATION CODE":1,1:0)
     73 ;Set start and end dates
     74 S $P(FINDPA(0),U,8)=RSTART,$P(FINDPA(0),U,11)=RSTOP,PXRMDATE=RSTOP
     75 ;
     76 ;Add operation
     77 I FRACT="A" D  Q
     78 .;Process term for date range
     79 .D EVALPL^PXRMTERM(.FINDPA,.TERMARR,PNODE)
     80 .;Merge lists if operation is add
     81 .M ^TMP($J,FROUT)=^TMP($J,PNODE,1)
     82 ;Remove, Select or Insert Findings operations
     83 I FRACT="F" S PXRMDEBG=1
     84 S DFN=0
     85 F  S DFN=$O(^TMP($J,FROUT,DFN)) Q:'DFN  D
     86 .I INST S ^TMP($J,FROUT,DFN,"INST")=$$INST(DFN) Q
     87 .;Evaluate term
     88 .K TFIEV D IEVALTER^PXRMTERM(DFN,.FINDPA,.TERMARR,1,.TFIEV)
     89 .;Delete any ^TMP patient in PLIST if action is remove
     90 .I FRACT="R",TFIEV(1) K ^TMP($J,FROUT,DFN) Q
     91 .;Delete any ^TMP patient not in PLIST if action is select
     92 .I FRACT="S",'TFIEV(1) K ^TMP($J,FROUT,DFN) Q
     93 .I FRACT="F",TFIEV(1) D
     94 .. S FINDING=TFIEV(1,"FINDING")
     95 .. I '$D(FNAME(FINDING)) S FNAME(FINDING)=$$GETFNAME^PXRMDATA(FINDING)
     96 .. S TFIEV(1,"CSUB","FINDING NAME")=FNAME(FINDING)
     97 .. D INSERT(FROUT,DFN,TNAME,.TFIEV,RSTOP)
     98 Q
     99 ;
Note: See TracChangeset for help on using the changeset viewer.