RARIC ;HISC/FPT,GJC AISC/SAW-Radiologic Image Capture and Display Routine ;08/05/08 14:35
;;5.0;Radiology/Nuclear Medicine;**23,27,101,47**;Mar 16, 1998;Build 21
;
;In response to: Remedy #330689 (Tucson); PSPO 1460
;
;Supported IA #2053 FILE/UPDATE^DIE
;Supported IA #2054 LOCK^DILF
;Supported IA #10103 $$NOW^XLFDT
;
CREATE ; >>create new stub entry in file 74<<
; --------------------------------------------------------------------
; IA: 1178 (the value of RARPT is currently null) If no report entry is
; created, RARPT is set to null or negative (negative w/report)
;
;input variables
; RADTE - ext. date/time of exam, RADFN - patient DFN,
; RADTI - int. date/time of exam), RACN - case number &
; RACNI - IEN of case record
; RATIMEOUT - An integer representing the number of seconds
; in which the process attempts to gain access
; to the node in question. RATIMEOUT is set ONLY
; on the Imaging Gateway side. All other applications
; calling the CREATE entry point will not have
; RATIMEOUT set and will use a default timeout
; value set at 1E9.
;
; Note: Imaging (Gateway) sets and kills RATIMEOUT.
;
;output variables
; RARPT - IEN of the report: null if error; or positive
;
; lock the exam node; quit if the lock fails
S RARPT="" S U=$G(U,"^")
L +^RADPT(RADFN,"DT",RADTI,"P",RACNI,0):$G(RATIMEOUT,1E9) E S RARPT="-1^radiology exam locked" Q
;
; Set RAY2 to the REGISTERED EXAMS node.
; Set RAY3 to the EXAMINATIONS node.
N RAY2,RAY3 S RAY2=$G(^RADPT(RADFN,"DT",RADTI,0))
S RAY3=$G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0))
;
;
; 1 - If the Imaging value of the case number does not match
; the case number on disk quit. 2 - Quit if the exam was purged.
; =================================================================
I $P(RAY3,U)'=RACN D UNLOCXAM Q ; - 1
I $P($G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"PURGE")),U)>0 D UNLOCXAM Q ; - 2
;
;
; If a report was created for this case while waiting
; to access the exam node (timeout) set RARPT, unlock
; the exam node & exit (XIT).
; =================================================================
S RARPT=$P(RAY3,U,17)
I RARPT D UNLOCXAM Q
;
;
; Create the accession number. The format may be that
; of the legacy accession or it may be (w/p47) a site
; specific accession (SSAN). Check if patch RA*5.0*47
; has been installed.
;
; Because we entered the Radiology application through
; a foreign source the following package wide Radiology
; variables must be defined: RAMDIV & RAMDV
; =================================================================
N RACESION,RAMDIV,RAMDV
S RAMDIV=+$P(RAY2,U,3),RAMDV=$S($D(^RA(79,RAMDIV,.1)):^(.1),1:"")
I $P(RAY3,U,31)'="" D ; use SSAN
.S RACESION=$P(RAY3,U,31)
.Q
; else use the legacy accession
E S RACESION=$E(RADTE,4,7)_$E(RADTE,2,3)_"-"_RACN
;
;
N RA1,RAERR,RAFDA,RAFDAIEN,RAIEN,RAPRTSET,RAMEMARR,RATXT,RAX,RAXIT,RAY
;
; Check if this case is part of a print set.
; =================================================================
; D EN2^RAUTL20(.RAMEMARR) is a silent call!
; RAMEMARR = # of descendents
; RAMEMARR(n)=case #^procedure IEN^report text IEN^exam status IEN
; (where 'n' is RACNI)
; If printset RAPRTSET=1, else RAPRTSET=0
D EN2^RAUTL20(.RAMEMARR) ; is this case part of a print set ?
;
;
; Find the next available RAD/NUC MED REPORTS IEN, lock that record
; & file the report specific data into that new report record.
; =================================================================
S RAFDAIEN(1)=$$NEWIEN()
;
; ** Note: ^RARPT(RAFDAIEN(1)) is locked; it is up to **
; ** YOU to unlock the record before the process quits **
;
S RAY="+1",RAX="RAFDA(74,"""_RAY_","")"
S @RAX@(.01)=RACESION
S @RAX@(2)=RADFN
S @RAX@(3)=(9999999.9999-RADTI)
S @RAX@(4)=RACN
S @RAX@(6)=DT
;
;The filing of report text is no longer required.
;K RATXT("RPT") S RATXT("RPT",1)="Images collected."
;S @RAX@(200)="RATXT(""RPT"")"
;
; Create the Activity Log (74.01) sub-file record.
S RAX="RAFDA(74.01,""+2,"_RAY_","")"
S @RAX@(.01)=$$NOW^XLFDT()
S @RAX@(2)=$S($D(RAESIG)#2:"V",1:"C")
S @RAX@(3)=$S($G(RAVERF):RAVERF,1:DUZ)
D UPDATE^DIE("","RAFDA","RAFDAIEN","RAERR")
;
;
; If there happened to be an error when calling UPDATE^DIE
; kill off the stub report record.
; =================================================================
I $D(RAERR("DIERR"))#2,($D(^RARPT(RAFDAIEN(1),0))#2) D D XIT Q
.D DELRPT(RAFDAIEN(1)) ;note: RARPT is null
.QUIT
;
;
;
; ** 70.03 - set report text field in the EXAMINATIONS node - 70.03 **
; ** 70.03 - locked at the top of RARIC - 70.03 **
; =================================================================
K RAERR,RAFDA,RAIEN,RATXT
;
S RAIEN=RACNI_","_RADTI_","_RADFN_","
S RAFDA(70.03,RAIEN,17)=RAFDAIEN(1)
D FILE^DIE("","RAFDA","RAERR")
;
; the REPORT TEXT field was not set correctly
I $D(RAERR("DIERR"))#2 D DELRPT(RAFDAIEN(1)) D XIT Q
;
;
;the report record has been created, set RARPT = RAFDAIEN(1)
S RARPT=RAFDAIEN(1)
;
;
; create a var RARIC to suppress display of info msg from PTR^RARTE2
; PTR^RARTE2 requires that RARPT the IEN of an existing report record.
; =================================================================
N RARPTN S RARPTN=$P(^RARPT(RARPT,0),U)
I RAPRTSET N RARIC S RARIC=1 D PTR^RARTE2
; don't have to check raxit, since we're quitting now
;
;
XIT ;exit the CREATE subroutine
; =================================================================
;Unlock the case node & unlock the report.
D UNLOCXAM L -^RARPT(RAFDAIEN(1))
QUIT
;
;
PTR ; associate images with a radiology report record
; --------------------------------------------------------------------
;
; input: RARPT - IEN of Rad/NM Report file #74
; MAGGP - IEN of record in file 2005 pointed to by a report
;
; returns: Y=0 - variable MAGGP does not exist
; Y=-1 - FileMan could not create an entry (may be -1 w/report)
; Y>0 - FileMan created an entry
;
S Y=0 Q:$G(MAGGP)'>0
L +^RARPT(RARPT):$G(DILOCKTM,5)
I '$T S Y="-1^radiology report locked" Q ;lock failed...
N RAFDA,RAIEN,RARSLT
S RAFDA(74.02005,"+1,"_RARPT_",",.01)=MAGGP
D UPDATE^DIE(,"RAFDA","RAIEN","RARSLT")
I $D(RARSLT("DIERR"))#2 D
.S Y=-1 ;RAIEN(1) undef
.QUIT
E I RAIEN(1)>0 S Y=RAIEN(1)
L -^RARPT(RARPT)
QUIT
;
;
DELRPT(Y) ; delete a report (RARIC). The report record should
;be locked by the software calling this function.
; --------------------------------------------------------------------
; Input: Y = the IEN of the report record
;
K RAERR,RAFDA S RAFDA(74,Y_",",.01)="@"
D FILE^DIE("","RAFDA","RAERR") K RAERR,RAFDA
Q
;
;
NEWIEN() ; ##### ALLOCATES A NEW RECORD IN THE RAD/NUC MED REPORTS FILE
; (#74) AND LOCKS IT
; --------------------------------------------------------------------
; Return Values
; =============
; >0 IEN for the new record in the RAD/NUC MED REPORTS FILE (#74)
;
; Notes
; =====
;
; The placeholder for the new record (^RARPT(IEN) node) is LOCKed
; by this function. It is responsibility of the caller to unlock the
; record after it is created or the record creation is canceled.
;
N IEN,NEWIEN,NODE
S NEWIEN=0
;---
F D Q:NEWIEN
. S IEN=$O(^RARPT(" "),-1)+1
. ;--- If the record already exists, skip it
. S NODE=$NA(^RARPT(IEN)) Q:$D(@NODE)
. ;--- Lock the placeholder in order to make sure that nobody
. ;--- else is trying to allocate it at the same time.
. D LOCK^DILF(NODE) E Q
. ;--- Double check that the record has not been created after the
. ;--- previous $D() check and the LOCK command (a race condition)
. I $D(@NODE) L -@NODE Q
. ;--- Success
. S NEWIEN=IEN
. Q
;---
Q NEWIEN
;
;
UNLOCXAM ;Unlock the EXAMINATION node locked by this process.
; --------------------------------------------------------------------
L -^RADPT(RADFN,"DT",RADTI,"P",RACNI,0) QUIT
;
RARIC ;HISC/FPT,GJC AISC/SAW-Radiologic Image Capture and Display Routine ;08/05/08 14:35
+1 ;;5.0;Radiology/Nuclear Medicine;**23,27,101,47**;Mar 16, 1998;Build 21
+2 ;
+3 ;In response to: Remedy #330689 (Tucson); PSPO 1460
+4 ;
+5 ;Supported IA #2053 FILE/UPDATE^DIE
+6 ;Supported IA #2054 LOCK^DILF
+7 ;Supported IA #10103 $$NOW^XLFDT
+8 ;
CREATE ; >>create new stub entry in file 74<<
+1 ; --------------------------------------------------------------------
+2 ; IA: 1178 (the value of RARPT is currently null) If no report entry is
+3 ; created, RARPT is set to null or negative (negative w/report)
+4 ;
+5 ;input variables
+6 ; RADTE - ext. date/time of exam, RADFN - patient DFN,
+7 ; RADTI - int. date/time of exam), RACN - case number &
+8 ; RACNI - IEN of case record
+9 ; RATIMEOUT - An integer representing the number of seconds
+10 ; in which the process attempts to gain access
+11 ; to the node in question. RATIMEOUT is set ONLY
+12 ; on the Imaging Gateway side. All other applications
+13 ; calling the CREATE entry point will not have
+14 ; RATIMEOUT set and will use a default timeout
+15 ; value set at 1E9.
+16 ;
+17 ; Note: Imaging (Gateway) sets and kills RATIMEOUT.
+18 ;
+19 ;output variables
+20 ; RARPT - IEN of the report: null if error; or positive
+21 ;
+22 ; lock the exam node; quit if the lock fails
+23 SET RARPT=""
SET U=$GET(U,"^")
+24 LOCK +^RADPT(RADFN,"DT",RADTI,"P",RACNI,0):$GET(RATIMEOUT,1E9)
IF '$TEST
SET RARPT="-1^radiology exam locked"
QUIT
+25 ;
+26 ; Set RAY2 to the REGISTERED EXAMS node.
+27 ; Set RAY3 to the EXAMINATIONS node.
+28 NEW RAY2,RAY3
SET RAY2=$GET(^RADPT(RADFN,"DT",RADTI,0))
+29 SET RAY3=$GET(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0))
+30 ;
+31 ;
+32 ; 1 - If the Imaging value of the case number does not match
+33 ; the case number on disk quit. 2 - Quit if the exam was purged.
+34 ; =================================================================
+35 ; - 1
IF $PIECE(RAY3,U)'=RACN
DO UNLOCXAM
QUIT
+36 ; - 2
IF $PIECE($GET(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"PURGE")),U)>0
DO UNLOCXAM
QUIT
+37 ;
+38 ;
+39 ; If a report was created for this case while waiting
+40 ; to access the exam node (timeout) set RARPT, unlock
+41 ; the exam node & exit (XIT).
+42 ; =================================================================
+43 SET RARPT=$PIECE(RAY3,U,17)
+44 IF RARPT
DO UNLOCXAM
QUIT
+45 ;
+46 ;
+47 ; Create the accession number. The format may be that
+48 ; of the legacy accession or it may be (w/p47) a site
+49 ; specific accession (SSAN). Check if patch RA*5.0*47
+50 ; has been installed.
+51 ;
+52 ; Because we entered the Radiology application through
+53 ; a foreign source the following package wide Radiology
+54 ; variables must be defined: RAMDIV & RAMDV
+55 ; =================================================================
+56 NEW RACESION,RAMDIV,RAMDV
+57 SET RAMDIV=+$PIECE(RAY2,U,3)
SET RAMDV=$SELECT($DATA(^RA(79,RAMDIV,.1)):^(.1),1:"")
+58 ; use SSAN
IF $PIECE(RAY3,U,31)'=""
Begin DoDot:1
+59 SET RACESION=$PIECE(RAY3,U,31)
+60 QUIT
End DoDot:1
+61 ; else use the legacy accession
+62 IF '$TEST
SET RACESION=$EXTRACT(RADTE,4,7)_$EXTRACT(RADTE,2,3)_"-"_RACN
+63 ;
+64 ;
+65 NEW RA1,RAERR,RAFDA,RAFDAIEN,RAIEN,RAPRTSET,RAMEMARR,RATXT,RAX,RAXIT,RAY
+66 ;
+67 ; Check if this case is part of a print set.
+68 ; =================================================================
+69 ; D EN2^RAUTL20(.RAMEMARR) is a silent call!
+70 ; RAMEMARR = # of descendents
+71 ; RAMEMARR(n)=case #^procedure IEN^report text IEN^exam status IEN
+72 ; (where 'n' is RACNI)
+73 ; If printset RAPRTSET=1, else RAPRTSET=0
+74 ; is this case part of a print set ?
DO EN2^RAUTL20(.RAMEMARR)
+75 ;
+76 ;
+77 ; Find the next available RAD/NUC MED REPORTS IEN, lock that record
+78 ; & file the report specific data into that new report record.
+79 ; =================================================================
+80 SET RAFDAIEN(1)=$$NEWIEN()
+81 ;
+82 ; ** Note: ^RARPT(RAFDAIEN(1)) is locked; it is up to **
+83 ; ** YOU to unlock the record before the process quits **
+84 ;
+85 SET RAY="+1"
SET RAX="RAFDA(74,"""_RAY_","")"
+86 SET @RAX@(.01)=RACESION
+87 SET @RAX@(2)=RADFN
+88 SET @RAX@(3)=(9999999.9999-RADTI)
+89 SET @RAX@(4)=RACN
+90 SET @RAX@(6)=DT
+91 ;
+92 ;The filing of report text is no longer required.
+93 ;K RATXT("RPT") S RATXT("RPT",1)="Images collected."
+94 ;S @RAX@(200)="RATXT(""RPT"")"
+95 ;
+96 ; Create the Activity Log (74.01) sub-file record.
+97 SET RAX="RAFDA(74.01,""+2,"_RAY_","")"
+98 SET @RAX@(.01)=$$NOW^XLFDT()
+99 SET @RAX@(2)=$SELECT($DATA(RAESIG)#2:"V",1:"C")
+100 SET @RAX@(3)=$SELECT($GET(RAVERF):RAVERF,1:DUZ)
+101 DO UPDATE^DIE("","RAFDA","RAFDAIEN","RAERR")
+102 ;
+103 ;
+104 ; If there happened to be an error when calling UPDATE^DIE
+105 ; kill off the stub report record.
+106 ; =================================================================
+107 IF $DATA(RAERR("DIERR"))#2
IF ($DATA(^RARPT(RAFDAIEN(1),0))#2)
Begin DoDot:1
+108 ;note: RARPT is null
DO DELRPT(RAFDAIEN(1))
+109 QUIT
End DoDot:1
DO XIT
QUIT
+110 ;
+111 ;
+112 ;
+113 ; ** 70.03 - set report text field in the EXAMINATIONS node - 70.03 **
+114 ; ** 70.03 - locked at the top of RARIC - 70.03 **
+115 ; =================================================================
+116 KILL RAERR,RAFDA,RAIEN,RATXT
+117 ;
+118 SET RAIEN=RACNI_","_RADTI_","_RADFN_","
+119 SET RAFDA(70.03,RAIEN,17)=RAFDAIEN(1)
+120 DO FILE^DIE("","RAFDA","RAERR")
+121 ;
+122 ; the REPORT TEXT field was not set correctly
+123 IF $DATA(RAERR("DIERR"))#2
DO DELRPT(RAFDAIEN(1))
DO XIT
QUIT
+124 ;
+125 ;
+126 ;the report record has been created, set RARPT = RAFDAIEN(1)
+127 SET RARPT=RAFDAIEN(1)
+128 ;
+129 ;
+130 ; create a var RARIC to suppress display of info msg from PTR^RARTE2
+131 ; PTR^RARTE2 requires that RARPT the IEN of an existing report record.
+132 ; =================================================================
+133 NEW RARPTN
SET RARPTN=$PIECE(^RARPT(RARPT,0),U)
+134 IF RAPRTSET
NEW RARIC
SET RARIC=1
DO PTR^RARTE2
+135 ; don't have to check raxit, since we're quitting now
+136 ;
+137 ;
XIT ;exit the CREATE subroutine
+1 ; =================================================================
+2 ;Unlock the case node & unlock the report.
+3 DO UNLOCXAM
LOCK -^RARPT(RAFDAIEN(1))
+4 QUIT
+5 ;
+6 ;
PTR ; associate images with a radiology report record
+1 ; --------------------------------------------------------------------
+2 ;
+3 ; input: RARPT - IEN of Rad/NM Report file #74
+4 ; MAGGP - IEN of record in file 2005 pointed to by a report
+5 ;
+6 ; returns: Y=0 - variable MAGGP does not exist
+7 ; Y=-1 - FileMan could not create an entry (may be -1 w/report)
+8 ; Y>0 - FileMan created an entry
+9 ;
+10 SET Y=0
IF $GET(MAGGP)'>0
QUIT
+11 LOCK +^RARPT(RARPT):$GET(DILOCKTM,5)
+12 ;lock failed...
IF '$TEST
SET Y="-1^radiology report locked"
QUIT
+13 NEW RAFDA,RAIEN,RARSLT
+14 SET RAFDA(74.02005,"+1,"_RARPT_",",.01)=MAGGP
+15 DO UPDATE^DIE(,"RAFDA","RAIEN","RARSLT")
+16 IF $DATA(RARSLT("DIERR"))#2
Begin DoDot:1
+17 ;RAIEN(1) undef
SET Y=-1
+18 QUIT
End DoDot:1
+19 IF '$TEST
IF RAIEN(1)>0
SET Y=RAIEN(1)
+20 LOCK -^RARPT(RARPT)
+21 QUIT
+22 ;
+23 ;
DELRPT(Y) ; delete a report (RARIC). The report record should
+1 ;be locked by the software calling this function.
+2 ; --------------------------------------------------------------------
+3 ; Input: Y = the IEN of the report record
+4 ;
+5 KILL RAERR,RAFDA
SET RAFDA(74,Y_",",.01)="@"
+6 DO FILE^DIE("","RAFDA","RAERR")
KILL RAERR,RAFDA
+7 QUIT
+8 ;
+9 ;
NEWIEN() ; ##### ALLOCATES A NEW RECORD IN THE RAD/NUC MED REPORTS FILE
+1 ; (#74) AND LOCKS IT
+2 ; --------------------------------------------------------------------
+3 ; Return Values
+4 ; =============
+5 ; >0 IEN for the new record in the RAD/NUC MED REPORTS FILE (#74)
+6 ;
+7 ; Notes
+8 ; =====
+9 ;
+10 ; The placeholder for the new record (^RARPT(IEN) node) is LOCKed
+11 ; by this function. It is responsibility of the caller to unlock the
+12 ; record after it is created or the record creation is canceled.
+13 ;
+14 NEW IEN,NEWIEN,NODE
+15 SET NEWIEN=0
+16 ;---
+17 FOR
Begin DoDot:1
+18 SET IEN=$ORDER(^RARPT(" "),-1)+1
+19 ;--- If the record already exists, skip it
+20 SET NODE=$NAME(^RARPT(IEN))
IF $DATA(@NODE)
QUIT
+21 ;--- Lock the placeholder in order to make sure that nobody
+22 ;--- else is trying to allocate it at the same time.
+23 DO LOCK^DILF(NODE)
IF '$TEST
QUIT
+24 ;--- Double check that the record has not been created after the
+25 ;--- previous $D() check and the LOCK command (a race condition)
+26 IF $DATA(@NODE)
LOCK -@NODE
QUIT
+27 ;--- Success
+28 SET NEWIEN=IEN
+29 QUIT
End DoDot:1
IF NEWIEN
QUIT
+30 ;---
+31 QUIT NEWIEN
+32 ;
+33 ;
UNLOCXAM ;Unlock the EXAMINATION node locked by this process.
+1 ; --------------------------------------------------------------------
+2 LOCK -^RADPT(RADFN,"DT",RADTI,"P",RACNI,0)
QUIT
+3 ;