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

BSTSRPT.m

Go to the documentation of this file.
  1. BSTSRPT ;GDIT/HS/BEE-Handle retired concepts/terms ; 5 Nov 2012 9:53 AM
  1. ;;2.0;IHS STANDARD TERMINOLOGY;;Dec 01, 2016;Build 62
  1. ;
  1. EN ;EP - Main entry point
  1. ;
  1. NEW DIR,X,Y,FIX,CT,BST,TYPE,NMID,RCMP
  1. ;
  1. ;Determine whether concept or term review
  1. W !!
  1. K BST
  1. S BST(1)="This utility will loop through locally cached BSTS concepts and terms and for any that"
  1. S BST(2)="have been retired, it will attempt to find replacement concepts/terms"
  1. D EN^DDIOL(.BST)
  1. S DIR(0)="S^C:Check for retired concepts;T:Check for retired terms;Q:Quit"
  1. D ^DIR
  1. I Y'="C",Y'="T" G XEN
  1. S TYPE=Y
  1. ;
  1. ;Determine whether SNOMED or RxNorm
  1. K BST
  1. S BST(1)=" "
  1. S BST(2)="Choose the codeset to report on"
  1. D EN^DDIOL(.BST)
  1. S DIR(0)="S^S:SNOMED;R:RxNorm (Out of Order);Q:Quit"
  1. D ^DIR
  1. I Y'="S" G XEN
  1. ;I Y'="S",Y'="R" G XEN
  1. S NMID=$S(Y="S":36,1:1552)
  1. ;
  1. ;Process concepts
  1. I TYPE="C" D PRINT("CONC^BSTSRPT",NMID) G XEN
  1. ;
  1. I TYPE="T" D PRINT("TERM^BSTSRPT",NMID) G XEN
  1. ;
  1. XEN Q
  1. ;
  1. CONC ;Find list of retired concepts
  1. ;
  1. ;Validate input
  1. I $G(NMID)="" Q
  1. ;
  1. NEW OCONC
  1. ;
  1. ;Loop through Concept ID index
  1. W !,"Original",?18,"Replacement",?36,"Type",?42,"Desc ID",?54,"Preferred Term"
  1. S OCONC="" F S OCONC=$O(^BSTS(9002318.4,"C",NMID,OCONC)) Q:OCONC="" D
  1. . NEW CIEN
  1. . S CIEN=0 F S CIEN=$O(^BSTS(9002318.4,"C",NMID,OCONC,CIEN)) Q:'CIEN D
  1. .. NEW RETR,RCONC
  1. .. ;
  1. .. ;Quit if not retired or retired after current date
  1. .. S RETR=$$GET1^DIQ(9002318.4,CIEN_",",.06,"I")
  1. .. I (RETR="") Q ;No retired date
  1. .. I (RETR>DT) Q ;Retired date is in the future
  1. .. ;
  1. .. ;Look for replacements
  1. .. W !,OCONC
  1. .. D RCONC(OCONC,NMID,.RCONC)
  1. .. ;
  1. .. ;Handle Same As/Replaced By
  1. .. I $G(RCONC)]"" D Q
  1. ... W ?17,"*"
  1. ... W ?18,$P(RCONC,U),?36,$P(RCONC,U,4),?42,$P(RCONC,U,3),?54,$E($P(RCONC,U,2),1,80)
  1. .. ;
  1. .. ;Handle Multiple Results
  1. .. I $G(RCONC)="",$O(RCONC(""))]"" D Q
  1. ... NEW II
  1. ... S II="" F S II=$O(RCONC(II)) Q:II="" D
  1. .... NEW RES
  1. .... W:II'=1 ! W ?18,$P(RCONC(II),U),?36,$P(RCONC(II),U,4),?42,$P(RCONC(II),U,3),?54,$E($P(RCONC(II),U,2),1,80)
  1. .. ;
  1. .. ;No Match
  1. .. W ?18,"No Matches"
  1. ;
  1. ;Close the device
  1. I $D(IO("Q")) D ^%ZISC
  1. ;
  1. Q
  1. ;
  1. TERM ;Find list of retired terms
  1. ;
  1. ;Validate input
  1. I $G(NMID)="" Q
  1. ;
  1. NEW ODSCID,NMIEN
  1. ;
  1. ;Get internal codeset IEN
  1. S NMIEN=$O(^BSTS(9002318.1,"B",NMID,"")) Q:NMIEN=""
  1. ;
  1. ;Reset scratch global
  1. K ^TMP("BSTSRPT",$J)
  1. ;
  1. ;Loop through Description ID index
  1. W !,"Original Desc ID",?18,"Replacement Desc ID",?36,"Type",?42,"Conc ID",?54,"Term"
  1. S ODSCID="" F S ODSCID=$O(^BSTS(9002318.3,"D",NMIEN,ODSCID)) Q:ODSCID="" D
  1. . NEW TIEN
  1. . S TIEN=0 F S TIEN=$O(^BSTS(9002318.3,"D",NMIEN,ODSCID,TIEN)) Q:'TIEN D
  1. .. NEW RETR,RTERM
  1. .. ;
  1. .. ;Quit if not retired or retired after current date
  1. .. S RETR=$$GET1^DIQ(9002318.3,TIEN_",",.07,"I")
  1. .. I (RETR="") Q ;No retired date
  1. .. I (RETR>DT) Q ;Retired date is in the future
  1. .. ;
  1. .. ;Look for replacements
  1. .. W !,ODSCID
  1. .. D RTERM(ODSCID,NMID,.RTERM)
  1. .. ;
  1. .. ;Handle Exact Replacement
  1. .. I $G(RTERM)]"" D Q
  1. ... W ?17,"*"
  1. ... W ?18,$P(RTERM,U),?42,$P(RTERM,U,3),?54,$E($P(RTERM,U,2),1,80)
  1. .. ;
  1. .. ;Handle Multiple Results
  1. .. I $G(RTERM)="",$O(RTERM(""))]"" D Q
  1. ... NEW II
  1. ... S II="" F S II=$O(RTERM(II)) Q:II="" D
  1. .... NEW RES
  1. .... W:II'=1 ! W ?18,$P(RTERM(II),U),?36,$P(RTERM(II),U,4),?42,$P(RTERM(II),U,3),?54,$E($P(RTERM(II),U,2),1,80)
  1. .. ;
  1. .. ;No Match
  1. .. W ?18,"No Matches"
  1. ;
  1. ;Close the device
  1. I $D(IO("Q")) D ^%ZISC
  1. ;
  1. Q
  1. ;
  1. RCONC(CONC,NMID,BSTSRET) ;PEP - Return replacement concept(s) for a concept
  1. ;
  1. ;This routine accepts a concept and namespace ID and returns a list
  1. ;of possible replacement concepts if it is retired.
  1. ;
  1. ;Input:
  1. ;CONC - Concept ID
  1. ;NMID (Optional) - Namespace ID (36-SNOMED/1552-RxNorm) - Default is 36
  1. ;BSTSRET - Return variable array
  1. ;
  1. ;Output:
  1. ;
  1. ;If concept still active
  1. ;BSTSRET=Passed in Concept ID [1]^Preferred Term of Passed in Concept ID [2]
  1. ; ^Preferred Desc ID of Passed in Concept ID [3]
  1. ;
  1. ;If exact match:
  1. ;BSTSRET=Exact Match (EM) Concept ID [1]^EM Preferred Term [2]^EM Preferred Desc ID [3]
  1. ; ^EM Type, where: EM Type = R - Replaced By, S - Same As [4]
  1. ;
  1. ;If no single exact match but possible match(es) available:
  1. ;BSTSRET=""
  1. ;BSTSRET(#)=Possible Replacement (PR) Concept ID [1]^PR Preferred Term [2]^PR Preferred Desc ID [3]
  1. ; ^PR Type, where: PR Type = R - Replaced By, S - Same As, M - May be a [4]
  1. ;
  1. ;If inactive and no matches available
  1. ;BSTSRET=""
  1. ;
  1. ;Sample call:
  1. ;
  1. ;>D RCONC^BSTSAPI(495003,36,.RET) ZW RET
  1. ;RET="715052003^Disease caused by Capripoxvirus^3301304017^R"
  1. ;
  1. NEW STS,DTSID,CIEN,RIEN,MEXCT,BSTSCNT,ICNT,RETR,VAR,TRY,MOD,OOD,LOC
  1. ;
  1. ;Reset output
  1. S BSTSRET="" S ICNT="" F S ICNT=$O(BSTSRET(ICNT)) Q:ICNT="" K BSTSRET(ICNT)
  1. ;
  1. ;Quit if no concept or namespace ID passed in
  1. I $G(CONC)="" Q
  1. S:$G(NMID)="" NMID=36
  1. ;
  1. ;Get the CIEN and DTSID
  1. S CIEN=$O(^BSTS(9002318.4,"C",NMID,CONC,"")) Q:CIEN=""
  1. S DTSID=$$GET1^DIQ(9002318.4,CIEN_",",".08","I") Q:DTSID=""
  1. ;
  1. ;Make sure the concept is up to date
  1. S OOD=$$GET1^DIQ(9002318.4,CIEN_",",".11","I")
  1. S MOD=$$GET1^DIQ(9002318.4,CIEN_",",".12","I")
  1. S LOC=1 I (MOD="")!(OOD="Y") S LOC=""
  1. F TRY=1:1:20 S STS=$$DTSLKP^BSTSAPI("VAR",DTSID_U_NMID_U_U_LOC) Q:(+STS=2) I LOC=1,+STS=1 Q
  1. I '+STS Q
  1. ;
  1. ;Check for active concept
  1. S RETR=$G(VAR(1,"XRDT"))
  1. I (RETR="")!(RETR>DT) S BSTSRET=$G(VAR(1,"CON"))_U_$G(VAR(1,"PRE","TRM"))_U_$G(VAR(1,"PRE","DSC")) Q
  1. ;
  1. ;Look at replacement information
  1. S (BSTSCNT,MEXCT,RIEN)=0 F S RIEN=$O(^BSTS(9002318.4,CIEN,17,RIEN)) Q:'RIEN D
  1. . NEW NODE,DA,IENS,VAR,RTYPE,PRET,PREID,XRDT
  1. . S DA(1)=CIEN,DA=RIEN,IENS=$$IENS^DILF(.DA)
  1. . S CONC=$$GET1^DIQ(9002318.417,IENS,.01,"I") Q:CONC=""
  1. . S RTYPE=$$GET1^DIQ(9002318.417,IENS,.03,"I") Q:RTYPE=""
  1. . S STS=$$CNCLKP^BSTSAPI("VAR",CONC_"^"_NMID)
  1. . ;
  1. . ;Skip if not active
  1. . S XRDT=$G(VAR(1,"XRDT"))
  1. . I XRDT]"",XRDT'>DT Q
  1. . ;
  1. . S PRET=$G(VAR(1,"PRE","TRM"))
  1. . S PREID=$G(VAR(1,"PRE","DSC"))
  1. . ;
  1. . ;Look for single exact match - clear if more than one
  1. . I MEXCT=1,(RTYPE="R")!(RTYPE="S") S BSTSRET=""
  1. . I MEXCT=0,(RTYPE="R")!(RTYPE="S") D
  1. .. S BSTSRET=CONC_U_PRET_U_PREID_U_RTYPE
  1. .. S MEXCT=1
  1. . ;
  1. . S BSTSCNT=BSTSCNT+1,BSTSRET(BSTSCNT)=CONC_U_PRET_U_PREID_U_RTYPE
  1. ;
  1. ;If exact match found, clear out array
  1. I BSTSRET]"" S ICNT="" F S ICNT=$O(BSTSRET(ICNT)) Q:ICNT="" K BSTSRET(ICNT)
  1. ;
  1. Q
  1. ;
  1. RTERM(DESCID,NMID,BSTSRET) ;PEP - Return replacement term and concept for a term
  1. ;
  1. ;This routine accepts a Description ID and Namespace ID and returns a
  1. ;possible replacement if the term has been retired.
  1. ;
  1. ;Input:
  1. ;DESCID - Description ID
  1. ;NMID (Optional) - Namespace ID (36-SNOMED/1552-RxNorm) - Default to 36
  1. ;BSTSRET - Return variable array
  1. ;
  1. ;Output:
  1. ;
  1. ;If term and underlying concept are still active
  1. ;BSTSRET=Passed in Description ID [1]^Term of Passed in Description ID [2]
  1. ; ^Concept ID of Passed in Term [3]
  1. ;
  1. ;If term is inactive but underlying concept is still active
  1. ;BSTSRET=Preferred Term Description ID of Underlying Concept [1]
  1. ; ^Preferred Term of Underlying Concept [2]
  1. ; ^Concept ID of Passed in Term [3]
  1. ;
  1. ;If both term and underlying concept are inactive it will try to identify an
  1. ;exact replacement concept. If one is found:
  1. ;1) It will first look for an exact match on the original term. If found:
  1. ;BSTSRET=New Description ID of Exact Term [1]^Exact Term [2]
  1. ; ^Replacement Concept ID [3]
  1. ;2) If no exact match on original term is found:
  1. ;BSTSRET=Description ID of Preferred Term of Replacement Concept [1]^Preferred
  1. ; Term of Replacement Concept [2]^Replacement Concept ID [3]
  1. ;
  1. ;If an exact replacement is not found but multiple replacements are:
  1. ;BSTSRET=""
  1. ;BSTSRET(#)=Possible Replacement (PR) Description ID [1]^PR Term [2]
  1. ; ^PR Concept ID [3]^PR Type, where: PR Type = R - Replaced By,
  1. ; S - Same As, M - May be a [4]
  1. ;
  1. ;Sample call:
  1. ;>D RTERM^BSTSAPI(1908012,36,.RET) ZW RET
  1. ;RET="3301304017^Disease caused by Capripoxvirus^715052003"
  1. ;
  1. NEW STS,DTSID,CIEN,TIEN,RIEN,MEXCT,BSTSCNT,ICNT,RETR,VAR,TRY,MOD,OOD,NMIEN,LOC
  1. NEW OCONC,RCONC,CTERM
  1. ;
  1. ;Reset output
  1. S BSTSRET="" S ICNT="" F S ICNT=$O(BSTSRET(ICNT)) Q:ICNT="" K BSTSRET(ICNT)
  1. ;
  1. ;Quit if no concept or namespace ID passed in
  1. I $G(DESCID)="" Q
  1. S:$G(NMID)="" NMID=36
  1. ;
  1. ;Get internal codeset IEN
  1. S NMIEN=$O(^BSTS(9002318.1,"B",NMID,"")) Q:NMIEN=""
  1. ;
  1. ;Get the TIEN, CIEN and DTSID
  1. S TIEN=$O(^BSTS(9002318.3,"D",NMIEN,DESCID,"")) Q:TIEN=""
  1. S CIEN=$$GET1^DIQ(9002318.3,TIEN_",",.03,"I") Q:CIEN=""
  1. S DTSID=$$GET1^DIQ(9002318.4,CIEN_",",".08","I") Q:DTSID=""
  1. S CTERM=$$GET1^DIQ(9002318.3,TIEN_",",1,"I")
  1. ;
  1. ;Make sure the term is up to date
  1. S OOD=$$GET1^DIQ(9002318.3,TIEN_",",".11","I")
  1. S LOC=1 I OOD="Y" S LOC=""
  1. F TRY=1:1:20 S STS=$$DTSLKP^BSTSAPI("VAR",DTSID_U_NMID_U_U_LOC) Q:(+STS=2) I LOC=1,+STS=1 Q
  1. I '+STS Q
  1. ;
  1. ;Check if term and underlying concept are active
  1. S RETR=$$GET1^DIQ(9002318.3,TIEN_",",.07,"I")
  1. I (RETR="")!(RETR'<DT),($G(VAR(1,"XRDT"))="")!($G(VAR(1,"XRDT"))'<DT) D Q
  1. . S BSTSRET=DESCID_U_CTERM_U_$G(VAR(1,"CON"))
  1. ;
  1. ;Check for inactive term, active concept
  1. I (RETR]""),RETR'>DT,($G(VAR(1,"XRDT"))="")!($G(VAR(1,"XRDT"))'<DT) D Q
  1. . S BSTSRET=$G(VAR(1,"PRE","DSC"))_U_$G(VAR(1,"PRE","TRM"))_U_$G(VAR(1,"CON"))
  1. ;
  1. ;Checks for replacement concept
  1. ;
  1. S OCONC=$G(VAR(1,"CON")) Q:OCONC="" ;Original Concept ID
  1. ;
  1. ;Look for replacement concept
  1. D RCONC(OCONC,NMID,.RCONC)
  1. ;
  1. ;Exact Replacement
  1. I $G(RCONC)]"" D Q
  1. . NEW RCONCID,RVAR,STS,SYN
  1. . S RCONCID=$P(RCONC,U) Q:RCONCID=""
  1. . ;
  1. . ;Get information for replacement concept
  1. . S STS=$$CNCLKP^BSTSAPI("RVAR",RCONCID_U_NMID)
  1. . ;
  1. . ;Loop through synonyms looking for exact match
  1. . S SYN="" F S SYN=$O(RVAR(1,"SYN",SYN)) Q:SYN="" D I BSTSRET]"" Q
  1. .. NEW RT
  1. .. S RT=$G(RVAR(1,"SYN",SYN,"TRM")) Q:RT=""
  1. .. I RT'=CTERM Q
  1. .. S BSTSRET=$G(RVAR(1,"SYN",SYN,"DSC"))_U_RT_U_RCONCID
  1. . ;
  1. . ;If not exact match use preferred
  1. . S BSTSRET=$G(RVAR(1,"PRE","DSC"))_U_$G(RVAR(1,"PRE","TRM"))_U_RCONCID
  1. ;
  1. ;Multiple Replacements
  1. I $O(RCONC(""))]"" D Q
  1. . NEW RCNT,CNT
  1. . S RCNT="" F S RCNT=$O(RCONC(RCNT)) Q:RCNT="" D
  1. .. S CNT=$G(CNT)+1,BSTSRET(CNT)=$P(RCONC(RCNT),U,3)_U_$P(RCONC(RCNT),U,2)_U_$P(RCONC(RCNT),U)_U_$P(RCONC(RCNT),U,4)
  1. Q
  1. ;
  1. PRINT(TAG,NMID) ;Print the report
  1. ;
  1. N %ZIS,ZTRTN,ZTIO,ZTDESC,ZTSAVE,ZTSK,POP
  1. S %ZIS="Q"
  1. I TAG["CONC" D
  1. . S %ZIS("A")="Print Inactive Concept Report on Device: ",ZTRTN="CONC^BSTSRPT"
  1. . S ZTDESC="Inactive Concept Report"
  1. I TAG["TERM" D
  1. . S %ZIS("A")="Print Inactive Terms Report on Device: ",ZTRTN="TERM^BSTSRPT"
  1. . S ZTDESC="Inactive Term Report"
  1. ;
  1. ;Prompt for device
  1. D ^%ZIS I $G(POP) Q
  1. ;
  1. ;Report queued
  1. I $D(IO("Q")) D Q
  1. . S ZTIO=ION,ZTSAVE("NMID")="" D ^%ZTLOAD
  1. . W !!,$S($D(ZTSK):"Request queued!",1:"Unable to queue job. Request cancelled!")
  1. . D ^%ZISC
  1. ;
  1. ;Print report
  1. U IO
  1. I TAG["CONC" D CONC
  1. I TAG["TERM" D TERM
  1. ;
  1. ;Close the device
  1. D ^%ZISC
  1. Q
  1. ;
  1. REPL(CONCDA,GL) ;Update replacement concept information
  1. ;
  1. ;Called from UPDATE^BSTSDTS0
  1. ;
  1. I $G(CONCDA)="" Q 0
  1. I $G(GL)="" Q 0
  1. ;
  1. ;Clear out existing entries
  1. D
  1. . NEW REPCNT
  1. . S REPCNT=0 F S REPCNT=$O(^BSTS(9002318.4,CONCDA,17,REPCNT)) Q:'REPCNT D
  1. .. NEW DA,DIK
  1. .. S DA(1)=CONCDA,DA=REPCNT
  1. .. S DIK="^BSTS(9002318.4,"_DA(1)_",17," D ^DIK
  1. ;
  1. ;Now save Replacement Concepts
  1. I $D(@GL@("REP"))>1 D
  1. . ;
  1. . NEW REPCNT
  1. . S REPCNT="" F S REPCNT=$O(@GL@("REP",REPCNT)) Q:REPCNT="" D
  1. .. ;
  1. .. NEW DIC,DA,X,Y,IENS,DLAYGO,NODE,CONC,NMID,DTSID,IREV,OREV,NMIEN,RTYPE,BSTSC,ERROR
  1. .. S NODE=$G(@GL@("REP",REPCNT))
  1. .. ;
  1. .. ;Pull replacement information
  1. .. S CONC=$P(NODE,U) Q:CONC="" ;Replacement concept
  1. .. S NMID=$P(NODE,U,2) Q:NMID="" ;Namespace
  1. .. S NMIEN=$O(^BSTS(9002318.1,"B",NMID,"")) Q:NMIEN=""
  1. .. S DTSID=$P(NODE,U,3) Q:DTSID="" ;DTSID
  1. .. S IREV=$P(NODE,U,5) ;Revision In
  1. .. S OREV=$P(NODE,U,6) ;Revision Out
  1. .. S RTYPE=$P(NODE,U,7) ;Replacement Type
  1. .. S RTYPE=$S(RTYPE["SAME":"S",RTYPE["REPLACE":"R",RTYPE["MAY BE":"M",1:"") Q:RTYPE=""
  1. .. ;
  1. .. S DA(1)=CONCDA
  1. .. S DIC(0)="LX",DIC="^BSTS(9002318.4,"_DA(1)_",17,"
  1. .. S X=CONC
  1. .. S DLAYGO=9002318.417 D ^DIC
  1. .. ;
  1. .. ;Quit on fail
  1. .. I +Y<0 Q
  1. .. ;
  1. .. ;Save remaining fields
  1. .. S (DA)=+Y,IENS=$$IENS^DILF(.DA)
  1. .. S BSTSC(9002318.417,IENS,".02")=DTSID
  1. .. S BSTSC(9002318.417,IENS,".03")=RTYPE
  1. .. S BSTSC(9002318.417,IENS,".04")=NMIEN
  1. .. S BSTSC(9002318.417,IENS,".05")=$$DTS2FMDT^BSTSUTIL(IREV,1)
  1. .. S BSTSC(9002318.417,IENS,".06")=$$DTS2FMDT^BSTSUTIL(OREV,1)
  1. .. ;
  1. .. ;Save the information
  1. .. D FILE^DIE("","BSTSC","ERROR")
  1. ;
  1. Q