C0QMU12 ;JJOH/ZAG/GPL - Patient Reminder List ; 7/31/12 12:34pm ;;1.0;C0Q;;May 21, 2012;Build 63 ; ;2011 Zach Gonzales - Licensed under the terms of the GNU ;General Public License See attached copy of the License. ; ; GPL - THIS ROUTINE IS A COPY OF JJOHMU11 THAT HAS BEEN MODIFIED ; FOR MEANINGFUL USE CALCULATION FOR FISCAL YEAR 2012 AT OROVILLE HOSPITAL ; C0QPFN() Q 1130580001.401 ; PARAMETER FILE C0QPCFN() Q 1130580001.411 ; CLINIC SUBFILE C0QMFN() Q 1130580001.201 ; FILE NUMBER FOR C0Q MEASUREMENT FILE C0QMMFN() Q 1130580001.2011 ; FN FOR MEASURE SUBFILE INIT(ZARY,ZTYP) ; INITIALIZE THE PARAMETERS FOR BUILDING PATIENT LISTS ; ZARY IS PASSED BY NAME ; ZTYP IS "INP" OR "EP" N ZMU S ZMU="MU12" ; THIS IS THE ONLY HARD CODED VALUE LEFT ; TBD - CHANGE IT TO A READ FROM SYSTEM PARAMETERS K @ZARY ; CLEAR RETURN ARRAY N ZIEN,ZCNT,ZX I $O(^C0Q(401,"MUTYP",ZMU,ZTYP,""))="" D Q ; OOPS NO RECORD THERE . W !,"ERROR, NO PARAMETERS AVAILABLE" S ZIEN="" S ZCNT=0 F S ZIEN=$O(^C0Q(401,"MUTYP",ZMU,ZTYP,ZIEN)) Q:ZIEN="" D ; . S ZCNT=ZCNT+1 . S @ZARY@(ZCNT,"MU")=$$GET1^DIQ($$C0QPFN,ZIEN_",",.02) . S @ZARY@(ZCNT,"TYPE")=$$GET1^DIQ($$C0QPFN,ZIEN_",",.03) . S ZX=$$GET1^DIQ($$C0QPFN,ZIEN_",",1,"I") . S @ZARY@(ZCNT,"InpatientMeasurementSet")=ZX . S @ZARY@(ZCNT,"InpatientBeginDate")=$$GET1^DIQ($$C0QMFN,ZX_",",.02,"I") . S @ZARY@(ZCNT,"InpatientEndDate")=$$GET1^DIQ($$C0QMFN,ZX_",",.03,"I") . S @ZARY@(ZCNT,"InpatientQualitySet")=$$GET1^DIQ($$C0QPFN,ZIEN_",",1.1,"I") . S ZX=$$GET1^DIQ($$C0QPFN,ZIEN_",",2,"I") . S @ZARY@(ZCNT,"EPMeasurementSet")=ZX . S @ZARY@(ZCNT,"EPBeginDate")=$$GET1^DIQ($$C0QMFN,ZX_",",.02,"I") . S @ZARY@(ZCNT,"EPEndDate")=$$GET1^DIQ($$C0QMFN,ZX_",",.03,"I") . S @ZARY@(ZCNT,"EPQualitySet")=$$GET1^DIQ($$C0QPFN,ZIEN_",",2.1,"I") . S @ZARY@(ZCNT,"InpatientQualitySet")=$$GET1^DIQ($$C0QPFN,ZIEN_",",1.1,"I") . D CLEAN^DILF . D LIST^DIC($$C0QPCFN,","_ZIEN_",",".01I") . I $D(^TMP("DIERR",$J)) D Q ; ERROR READING CLINIC LIST . . W !,"ERROR READING CLINIC PARAMETER LIST" . M @ZARY@(ZCNT,"CLINICS")=^TMP("DILIST",$J) ; Q ; BUILD ; CALL ALL AND DIS AND BUILD THE GRSLT ARRAY or print or create ; patient lists ;N GRSLT ; ARRAY FOR RESULTS I '$D(C0QSS) S C0QSS=0 ;default don't build spreadsheet array I '$D(C0QPR) S C0QPR=0 ;default don't print out results I '$D(C0QPL) S C0QPL=1 ;default do create patient lists S ZYR="MU12-" D INITCLST ; initialize C0QLIST N G1 ; ONE SET OF VALUES - RNF1 FORMAT N C0QPARM D INIT("C0QPARM","INP") ; initialize inpatient parms I $O(C0QPARM(""))="" D Q ; no parms for inpatient . W !,"No inpatient parameters" N ZDIV S ZDIV="" F S ZDIV=$O(C0QPARM(ZDIV)) Q:ZDIV="" D ; for each inpatient division . D ALL ; all currently admitted patients in the hospital . D DIS ; all patients discharged since the reporting period began . I C0QSS D ZWRITE^C0QUTIL("GRSLT") . ;D ICUPAT ; GENERATE ICU PATIENT LIST . I C0QPL D ; . . D FILE ; FILE THE PATIENT LISTS . . D UPDATE^C0QUPDT(.G,C0QPARM(ZDIV,"InpatientMeasurementSet")) ; . . D UPDATE^C0QUPDT(.G,C0QPARM(ZDIV,"InpatientQualitySet")) ; . K C0QLIST Q ; INITCLST ; initialize C0QLIST ; INITIALIZE LISTS ; this is done so that if there are no matching patients, the patient list ; will be zeroed out K C0QLIST S C0QLIST(ZYR_"HasDemographics")="" S C0QLIST(ZYR_"Patient")="" S C0QLIST(ZYR_"HasProblem")="" S C0QLIST(ZYR_"HasAllergy")="" S C0QLIST(ZYR_"HasMed")="" S C0QLIST(ZYR_"HasVitalSigns")="" S C0QLIST(ZYR_"HasMedOrders")="" S C0QLIST(ZYR_"HasSmokingStatus")="" Q ; ALL ;retrieve active inpatients N WARD S WARD="" F D Q:WARD="" . S WARD=$O(^DIC(42,"B",WARD)) ;ward name . Q:WARD="" . N WIEN S WIEN="" . F S WIEN=$O(^DIC(42,"B",WARD,WIEN)) Q:'WIEN D ;wards IEN . . S WARDNAME=$P(^DIC(42,WIEN,0),U,2) ;ward name . . N DFN,RB S DFN="" . . F S DFN=$O(^DPT("CN",WARD,+DFN)) Q:'DFN D ;DFN of patient on ward . . . D DEMO^C0QMU122 . . . D PROBLEM . . . D ALLERGY . . . D MEDS4 . . . D RECON2 . . . D ADVDIR . . . D SMOKING . . . D VITALS . . . D VTE1 . . . D COD . . . D EDTIME . . . I C0QPR D PRINT^C0QMU121 . . . I C0QSS D SS^C0QMU121 . . . I C0QPL D PATLIST^C0QMU121 Q ; PROBLEM ; PATIENT PROBLEMS D LIST^ORQQPL(.PROBL,DFN,"A") S PBCNT="" F S PBCNT=$O(PROBL(PBCNT)) Q:PBCNT="" D . S PBDESC=$P(PROBL(PBCNT),U,2) ;problem description I PBDESC["No problems found" S C0QLIST(ZYR_"NoProblem",DFN)="" E S C0QLIST(ZYR_"HasProblem",DFN)="" K PROBL Q ; ALLERGY ; ALLERGY LIST ; WANT TO CHANGE ALLERGIES FOR 2012 TO POPULATE THE C0QLIST DIRECTLY. GPL D LIST^ORQQAL(.ALRGYL,DFN) S ALCNT="" F S ALCNT=$O(ALRGYL(ALCNT)) Q:ALCNT="" D . S ALDESC=$P(ALRGYL(ALCNT),U,2) ;allergy description I ALDESC["No Allergy" S C0QLIST(ZYR_"NoAllergy",DFN)="" E S C0QLIST(ZYR_"HasAllergy",DFN)="" K ALRGYL Q ; MEDS4 ; USE OCL^PSOORRL TO GET ALL MEDS ; DELETED MEDS, MEDS2, AND MEDS3 FOR 2012 TO USE ONLY MEDS4 N BEG,END S BEG=$$DT^C0QUTIL("JULY 3,2011") S END=$$DT^C0QUTIL("NOW") D OCL^PSOORRL(DFN,BEG,END) ;DBIA #2400 N C0QMEDS M C0QMEDS=^TMP("PS",$J) ; MEDS RETURNED FROM CALL N FOUND N ZI I '$D(C0QMEDS(1)) D Q ; QUIT IF NO MEDS . S C0QLIST(ZYR_"NoMed",DFN)="" E D ; HAS MEDS . S C0QLIST(ZYR_"HasMed",DFN)="" S ZI="" S FOUND=0 F S ZI=$O(C0QMEDS(ZI)) Q:ZI="" D ; FOR EACH MED . N ZM . S ZM=$G(C0QMEDS(ZI,0)) ;THE MEDICATION . I $P($P(ZM,"^",1),";",2)="I" D ; IE 1U;I FOR AN INPATIENT UNIT DOSE . . S FOUND=1 I FOUND S C0QLIST(ZYR_"HasMedOrders",DFN)="" ; MET CPOE MEASURE E S C0QLIST(ZYR_"NoMedOrders",DFN)="" Q ; RECON ; MEDICATIONS RECONCILIATION ; WANT TO SIMPLIFY MEDS RECON FOR 2012. GPL ; I $$HASNTYN^C0QNOTES("MED/SURG NURSING ADMISSION ASSESSMENT",DFN) D ; . S C0QLIST(ZYR_"XferOfCare",DFN)="" ; transfer of care patient N HASRECON S HASRECON=0 N GT,G S GT(4,"HasMedRecon","MEDICATION RECONCILIATION COMPLET")="" S GT(5,"HasMedRecon","Medication Reconcilation Complete")="" I $$TXTALL^C0QNOTES(.G,.GT,DFN) D ; SEARCH ALL NOTES FOR MED RECON . S HASRECON=1 ;N ZT ;S ZT="MEDICATION RECONCILIATION COMPLET" ;I $$NTTXT^C0QNOTES("ER NURSE NOTE",ZT,DFN) D ; ;. S HASRECON=1 ;E D ; ;. S ZT="Medication Reconcilation Complete" ;. I $$NTTXT^C0QNOTES("MED/SURG NURSING ADMISSION ASSESSMENT",ZT,DFN) D ; ;. . S HASRECON=1 ;I $$HFYN^C0QHF("MEDS HAVE BEEN REVIEWED",DFN) S HASRECON=1 I HASRECON D ; . S C0QLIST(ZYR_"HasMedRecon",DFN)="" E S C0QLIST(ZYR_"NoMedRecon",DFN)="" Q ; RECON2 ; USE HEALTH FACTORS FOR MEDICATION RECONCILIATION I $$HASNTYN^C0QNOTES("MED/SURG NURSING ADMISSION ASSESSMENT",DFN) D ; . S C0QLIST(ZYR_"XferOfCare",DFN)="" ; transfer of care patient I $$HFYN^C0QHF(DFN,"Medication Reconciliation Completed: Yes") D ; . S C0QLIST(ZYR_"HasMedRecon",DFN)="" E S C0QLIST(ZYR_"NoMedRecon",DFN)="" Q ; ERX ; FOR EP, WE LOOK AT ERX MEDS N ZI S ZI="" N ZERX S ZERX=$NA(^PS(55,DFN,"NVA")) F S ZI=$O(@ZERX@(ZI)) Q:ZI="" D ; . ;B . I $G(@ZERX@(ZI,1,1,0))["E-Rx Web" D ; . . S C0QLIST(ZYR_"HasMed",DFN)="" . . S C0QLIST(ZYR_"HasMedOrders",DFN)="" . . S C0QLIST(ZYR_"HasERX",DFN)="" . . S C0QLIST(ZYR_"HasMedRecon",DFN)="" . E D ; . . S C0QLIST(ZYR_"NoMed",DFN)="" . . S C0QLIST(ZYR_"NoMedOrders",DFN)="" . . S C0QLIST(ZYR_"NoERX",DFN)="" . . S C0QLIST(ZYR_"NoMedRecon",DFN)="" Q ; ADVDIR ; ADVANCE DIRECTIVE ; I $$AGE^C0QUTIL(DFN)>64 D ; ONLY FOR PATIENTS 65 AND OLDER . S C0QLIST(ZYR_"Over65",DFN)="" . I $$HASNTYN^C0QNOTES("ADVANCE DIRECTIVE",DFN) D ; . . S C0QLIST(ZYR_"HasAdvanceDirective",DFN)="" . E D ; . . S C0QLIST(ZYR_"NoAdvanceDirective",DFN)="" Q ; SMOKING G SMOKING^C0QMU121 VITALS ; ; N C0QSDT,C0QEDT D DT^DILF(,"JULY 3,2011",.C0QSDT) ; START DATE D DT^DILF(,"T",.C0QEDT) ; END DATE TODAY D VITALS^ORQQVI(.VITRSLT,DFN,C0QSDT,C0QEDT) ; CALL FAST VITALS I $D(VITRSLT) D ;ZWR VITRSLT B ; . I VITRSLT(1)["No vitals found." S C0QLIST(ZYR_"NoVitalSigns",DFN)="" . E S C0QLIST(ZYR_"HasVitalSigns",DFN)="" Q ; VTE1 ; VTE PROPHYLAXIS WITHIN 24HRS OF ARRIVAL ; I $$HFYN^C0QHF(DFN,"VTE PROPHYLAXIS WITHIN 24HRS OF ARRIVAL") D ; . S C0QLIST(ZYR_"HasVTE24",DFN)="" E S C0QLIST(ZYR_"NoVTE24",DFN)="" Q ; COD ; TEST FOR PRELIMINARY CAUSE OF DEATH NOTE I $$HASNTYN^C0QNOTES("PRELIMINARY CAUSE OF DEATH",DFN) D ; . S C0QLIST(ZYR_"CauseOfDeath",DFN)="" Q ; EDTIME ; CHECK FOR EMERGENCY DEPT TIME FACTORS N FOUND S FOUND=0 I $$HFYN^C0QHF(DFN,"ED ARRIVAL TIME") S FOUND=1 I '$$HFYN^C0QHF(DFN,"ED DEPARTURE TIME") S FOUND=0 I '$$HFYN^C0QHF(DFN,"TIME DECISION TO ADMIT MADE") S FOUND=0 I FOUND D ; . S C0QLIST(ZYR_"HasEDtime",DFN)="" E S C0QLIST(ZYR_"NoEDtime",DFN)="" Q ; ICUPAT ; CREATE LIST OF ICU PATIENTS N ZICU S ZICU=$O(^SC("B","IC","")) ; IEN OF ICU HOSPITAL LOCATION N ZI,ZJ,ZP S ZI="" F S ZI=$O(^AUPNVSIT("AHL",ZICU,ZI)) Q:ZI="" D ; EACH DATE . S ZJ="" . F S ZJ=$O(^AUPNVSIT("AHL",ZICU,ZI,ZJ)) Q:ZJ="" D ; EACH VISIT . . S ZP=$P(^AUPNVSIT(ZJ,0),"^",5) ; DFN . . S C0QLIST(ZYR_"ICUPatient",ZP)="" Q ; FILTER ; CALLED AFTER ALL THE PATIENT LISTS HAVE BEEN FILED ; WILL KILL C0QLIST AND CREATE DERIVATIVE PATIENT LISTS BY FILTERING K C0QLIST N ZPAT S ZPAT=$$PATLN(ZYR_"Patient") ; name of patient list of all patients admitted ; during the reporting period. used to filter other lists ; ; filter ICU patients against ZPAT N GN,GO,GF S GN=ZPAT S GO=$$PATLN(ZYR_"ICUPatient") ; all ICU patient S GF=$NA(C0QLIST(ZYR_"ICUReporting")) ; the filtered list destination D AND^C0QSET(GF,GN,GO) ; filter the list with the AND set operation ; ; FILTER VTE-2 DENOMINATOR FOR QUALITY MEASURE ; S GN=$NA(C0QLIST(ZYR_"ICUReporting")) ; ICU patients admitted inside rpt period S GO=$$RPATLN("MU VTE-2 DENOM PL") ; TAXONOMY BASED DENOMENATOR S GF=$NA(C0QLIST(ZYR_"VTE2DEN")) ; NEW DENOMINATOR PL D AND^C0QSET(GF,GN,GO) ; filter the list with the AND set operation ; S GN=ZPAT S GO=$$RPATLN("MU VTE-3 DENOM PL") ; TAXONOMY BASED DENOMENATOR S GF=$NA(C0QLIST(ZYR_"VTE3DEN")) ; NEW DENOMINATOR PL D AND^C0QSET(GF,GN,GO) ; filter the list with the AND set operation ; S GN=ZPAT S GO=$$RPATLN("MU VTE-4 DENOM PL") ; TAXONOMY BASED DENOMENATOR S GF=$NA(C0QLIST(ZYR_"VTE4DEN")) ; NEW DENOMINATOR PL D AND^C0QSET(GF,GN,GO) ; filter the list with the AND set operation ; S GN=ZPAT S GO=$$RPATLN("MU VTE-5 DENOM PL") ; TAXONOMY BASED DENOMENATOR S GF=$NA(C0QLIST(ZYR_"VTE5DEN")) ; NEW DENOMINATOR PL D AND^C0QSET(GF,GN,GO) ; filter the list with the AND set operation ; D FILE ; FILE ALL THE PATIENT LISTS D UPDATE^C0QUPDT(.G,5) ; UPDATE THE HOS 2011 MEANINGFUL USE measure set Q ; ED1 ; S ZYR="MU12-" D DOTIME^C0QMU121("ED DEPARTURE TIME") Q ; ED2 ; S ZYR="MU12-" D DOTIME2^C0QMU121("TIME DECISION TO ADMIT MADE") Q ; RPATLN(ZLST) ; EXTRINSIC RETURNS THE GLOBAL NAME OF THE REMINDER PATIENT LIST ; WHOSE NAME IS ZLST N ZIEN,ZN S ZIEN=$O(^PXRMXP(810.5,"B",ZLST,"")) ; ien of patient list S ZN=$NA(^PXRMXP(810.5,ZIEN,30,"B")) ; GLOBAL NAME IN REMINDER PATIENT LIST Q ZN ; PATLN(ZATTR) ; EXTRINSIC RETURNS THE NAME OF THE PATIENT LIST WITH ; THE ATTRIBUTE ZATTR N ZIEN,ZN S ZIEN=$O(^C0Q(301,"CATTR",ZATTR,"")) ; ien of patient list S ZN=$NA(^C0Q(301,ZIEN,1,"B")) ; NAME OF PATIENT LIST IN C0Q PATIENT LIST Q ZN ; INLIST(ZLIST,DFN) ; EXTRINSIC FOR IS PATIENT ALREADY IN LIST ZLIST N ZL,ZR S ZL=$O(^C0Q(301,"CATTR",ZLIST,"")) ; IEN OF LIST IN C0Q PATIENT LIST FILE I ZL="" Q 0 ; LIST DOES NOT EXIST S ZR=0 ; ASSUME NOT IN LIST I $D(^C0Q(301,ZL,1,"B",DFN)) S ZR=1 ; PATIENT IS IN LIST Q ZR ; LOCPAT(PREFIX,LOC) ;retrieve active outpatients ; PREFIX WILL GO IN C0XLIST(PREFIX_"-PATIENT",DFN)="" ; LOC IS HOSPITAL LOCATION S ULOC=$O(^SC("B",LOC,"")) ; IEN OF HOSPITAL LOCATION I ULOC="" D Q ; OOPS . W !,"HOSPITAL LOCATION NOT FOUND: ",LOC S IDTE=9999999-DTE ; INVERSE DATE N ZI S ZI="" ; BEGIN AT LATEST DATE FOR THIS LOC IN VISIT FILE F S ZI=$O(^AUPNVSIT("AHL",ULOC,ZI)) Q:(ZI="")!(ZI>IDTE) D ; FOR EACH DATE . W !,$$FMTE^XLFDT(9999999-ZI) ;B ; . I ZI="" Q ; . N ZJ S ZJ="" . F S ZJ=$O(^AUPNVSIT("AHL",ULOC,ZI,ZJ)) Q:ZJ="" D ; FOR EACH VISIT . . S DFN=$$GET1^DIQ(9000010,ZJ,.05,"I") ; PATIENT . . S C0QLIST(PREFIX_"Patient",DFN)="" Q ; EPPAT(ZYR) ; BUILD ALL PATIENT LISTS FOR CLINICS ; S DTE=3111000 S MUYR=ZYR N ZC,ZN S ZN=0 N ZI S ZI=0 F S ZI=$O(^SC(ZI)) Q:+ZI=0 D ; FOR EVERY HOSPITAL LOCATION . I $$GET1^DIQ(44,ZI_",",2,"I")'="C" Q ; NOT A CLINIC . S ZC=$$GET1^DIQ(44,ZI_",",.01) ; NAME OF CLINIC . S ZCIEN=ZI ; IEN OF CLINIC . S ZN=ZN+1 ; COUNT OF CLINICS . S PRE=MUYR_"-EP-"_ZC_"-" . D LOCPAT(PRE,ZC) W !,"NUMBER OF CLINICS: ",ZN D FILE ; CREATE ALL THE EP PATIENT LISTS Q ; DOEP ; DO EP COMPUTATIONS S ZYR="MU12-" N C0QPARM,C0QCLNC D INIT("C0QPARM","EP") ; INITIALIZE PARAMETERS K C0QLIST ; CLEAR THE LIST N ZI S ZI="" F S ZI=$O(C0QPARM(ZI)) Q:ZI="" D ; FOR EACH EP . S DTE=C0QPARM(ZI,"EPBeginDate") ; beginning of measurement period . S EDTE=C0QPARM(ZI,"EPEndDate") ; end of measurement period -- tbd use this . S C0QCLNC=C0QPARM(ZI,"CLINICS",1,1) ; only one clinic for now . S PRE=ZYR_"EP-"_C0QCLNC_"-" . D LOCPAT(PRE,C0QCLNC) ; GET THE PATIENTS . I $D(DEBUG) D ZWRITE^C0QUTIL("C0QLIST") . M C0QLIST(ZYR_"EP-ALL-PATIENTS")=C0QLIST(PRE_"Patient") S DFN="" S ZYR=ZYR_"EP-" F S DFN=$O(C0QLIST(ZYR_"ALL-PATIENTS",DFN)) Q:DFN="" D ; EACH PATIENT . D DEMO^C0QMU122 . D PROBLEM . D ALLERGY . ;D MEDS . D ERX . D SMOKING . D VITALS D FILE ; FILE THE PATIENT LISTS N C0QCIEN S ZI="" F S ZI=$O(C0QPARM(ZI)) Q:ZI="" D ; . S C0QCIEN=C0QPARM(ZI,"EPMeasurementSet") ; ien of measurement set . D UPDATE^C0QUPDT(.G,C0QCIEN) ; UPDATE THE MU MEASUREMENT SET Q ; DIS ; N DFN,DTE,EXDTE S DTE="" F D Q:DTE="" . S DTE=$O(^DGPM("B",DTE)) . Q:'DTE . ;Q:$P(DTE,".")<3110703 . Q:$P(DTE,".")<3111000 ; NEW BEGIN DATE FOR FISCAL YEAR 2012 . S EXDTE=$$FMTE^XLFDT(DTE) . N PTFM S PTFM="" . D . . S PTFM=$O(^DGPM("B",DTE,PTFM)) . . Q:'PTFM . . S DFN=$P(^DGPM(PTFM,0),U,3) . . S C0QLIST(ZYR_"Patient",DFN)="" . . D DEMO^C0QMU122 . . D PROBLEM . . D ALLERGY . . D MEDS4 . . D RECON2 . . D ADVDIR . . D SMOKING . . D VITALS . . ;D:$P(DTE,".")>3110912 VTE1 . . D VTE1 . . D COD . . D EDTIME . . I C0QPR D PRINT^C0QMU121 . . I C0QSS D SS^C0QMU121 . . I C0QPL D PATLIST^C0QMU121 Q ; C0QPLF() Q 1130580001.301 ; FILE NUMBER FOR C0Q PATIENT LIST FILE C0QALFN() Q 1130580001.311 ; FILE NUMBER FOR C0Q PATIENT LIST PATIENT SUBFILE FILE ; FILE THE PATIENT LISTS TO C0Q PATIENT LIST ; I '$D(C0QLIST) Q ; N LFN S LFN=$$C0QALFN() N ZI,ZN S ZI="" F S ZI=$O(C0QLIST(ZI)) Q:ZI="" D ; . S ZN=$O(^C0Q(301,"CATTR",ZI,"")) . I ZN="" D ; LIST NOT FOUND, CREATE IT . . K C0QFDA . . S FN=$$C0QPLF ; C0Q PATIENT LIST FILE . . S C0QFDA(FN,"+1,",.01)=ZI . . S C0QFDA(FN,"+1,",999)=ZI ; ATTRIBUTE . . W !,"CREATING ",ZI . . D UPDIE ; ADD THE RECORD . . S ZN=$O(^C0Q(301,"CATTR",ZI,"")) ; THE NEW IEN . ;I ZN="" D Q ; OOPS . ;. W !,"ERROR, ATTRIBUTE NOT FOUND IN PATIENT LIST FILE:"_ZI . ;S ZN=$$KLNCR(ZN) ; KILL AND RECREATE RECORD ZN . N C0QNEW,C0QOLD,C0QRSLT . S C0QNEW=$NA(C0QLIST(ZI)) ; THE NEW PATIENT LIST . S C0QOLD=$NA(^C0Q(301,ZN,1,"B")) ; THE OLD PATIENT LIST . D UNITY^C0QSET("C0QRSLT",C0QNEW,C0QOLD) ; FIND WHAT'S NEW . N ZJ,ZK . ; FIRST, DELETE THE OLD ONES - NO LONGER IN THE LIST . K C0QFDA . S ZJ="" . F S ZJ=$O(C0QRSLT(2,ZJ)) Q:ZJ="" D ; MARKED WITH A 2 FROM UNITY . . S ZK=$O(@C0QOLD@(ZJ,"")) ; GET THE IEN OF THE RECORD TO DELETE . . I ZK="" D Q ; OOPS SHOULDN'T HAPPEN . . . W !,"INTERNAL ERROR FINDING A PATIENT TO DELETE" . . . S $EC=",U1130580001," ; smh - instead of a BREAK . . S C0QFDA(LFN,ZK_","_ZN_",",.01)="@" . I $D(C0QFDA) D UPDIE ; PROCESS THE DELETIONS . ; SECOND, PROCESS THE ADDITIONS . K C0QFDA . S ZJ="" S ZK=1 . F S ZJ=$O(C0QRSLT(0,ZJ)) Q:ZJ="" D ; PATIENTS TO ADD ARE MARKED WITH 0 . . S C0QFDA(LFN,"+"_ZK_","_ZN_",",.01)=ZJ . . S ZK=ZK+1 . I $D(C0QFDA) D UPDIE ; PROCESS THE ADDITIONS ;. Q ;. K C0QFDA ;. N ZJ,ZC ;. S ZJ="" S ZC=1 ;. F S ZJ=$O(C0QLIST(ZI,ZJ)) Q:ZJ="" D ; FOR EACH PAT IN LIST ;. . S C0QFDA(LFN,"?+"_ZC_","_ZN_",",.01)=ZJ ;. . S ZC=ZC+1 ;. D UPDIE ;. W !,"FOUND:"_ZI Q ; KLNCR(ZREC) ; KILL AND RECREATE RECORD ZREC IN PATIENT LIST FILE ; N C0QFDA,ZFN,LIST,ATTR S ZFN=$$C0QPLF() ; FILE NUMBER FOR C0Q PATIENT LIST FILE D CLEAN^DILF S LIST=$$GET1^DIQ(ZFN,ZREC_",",.01) ; MEASURE NAME S ATTR=$$GET1^DIQ(ZFN,ZREC_",",999) ; ATTRIBUTE D CLEAN^DILF K ZERR S C0QFDA(ZFN,ZREC_",",.01)="@" ; GET READY TO DELETE THE MEASURE D FILE^DIE(,"C0QFDA","ZERR") ; KILL THE SUBFILE I $D(ZERR) S ZZERR=ZZERR ; ZZERR DOESN'T EXIST, INVOKE THE ERROR TRAP IF TASKED ;. W "ERROR",! ;. ZWR ZERR ;. B K C0QFDA S C0QFDA(ZFN,"+1,",.01)=LIST ; GET READY TO RECREATE THE RECORD S C0QFDA(ZFN,"+1,",999)=ATTR ; ATTRIBUTE D UPDIE ; CREATE THE SUBFILE N ZR ; NEW IEN FOR THE RECORD S ZR=$O(^C0Q(301,"CATTR",ATTR,"")) ; Q ZR ; UPDIE ; INTERNAL ROUTINE TO CALL UPDATE^DIE AND CHECK FOR ERRORS K ZERR D CLEAN^DILF D UPDATE^DIE("","C0QFDA","","ZERR") I $D(ZERR) S ZZERR=ZZERR ; ZZERR DOESN'T EXIST, INVOKE THE ERROR TRAP IF TASKED K C0QFDA Q ; END ;end of C0QPRML;