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

MAGDQR01.m

Go to the documentation of this file.
  1. MAGDQR01 ;WOIFO/EdM,MLH,DAC - Imaging RPCs for Query/Retrieve ; 15 Feb 2013 10:12 PM
  1. ;;3.0;IMAGING;**51,54,66,118**;Mar 19, 2002;Build 4525;May 01, 2013
  1. ;; Per VHA Directive 2004-038, this routine should not be modified.
  1. ;; +---------------------------------------------------------------+
  1. ;; | Property of the US Government. |
  1. ;; | No permission to copy or redistribute this software is given. |
  1. ;; | Use of unreleased versions of this software requires the user |
  1. ;; | to execute a written test agreement with the VistA Imaging |
  1. ;; | Development Office of the Department of Veterans Affairs, |
  1. ;; | telephone (301) 734-0100. |
  1. ;; | The Food and Drug Administration classifies this software as |
  1. ;; | a medical device. As such, it may not be changed in any way. |
  1. ;; | Modifications to this software may result in an adulterated |
  1. ;; | medical device under 21CFR820, the use of which is considered |
  1. ;; | to be a violation of US Federal Statutes. |
  1. ;; +---------------------------------------------------------------+
  1. ;;
  1. Q
  1. ;
  1. FIND(OUT,TAGS,RESULT,OFFSET,MAX,AENAME) ; RPC = MAG CFIND QUERY
  1. N ERROR,I,L,MAGDUZ,N,P,REQ,T,V,X,ZTDESC,ZTDTH,ZTRTN,ZTSAVE,ZTSK
  1. K ^TMP("MAG",$J,"ERR") ; common error array (foreground)
  1. ;
  1. S RESULT=$G(RESULT),OFFSET=$G(OFFSET),AENAME=$G(AENAME)
  1. S ERROR=0
  1. ;
  1. ; The MAGDUZ identifier is now the DUZ of the logged in user
  1. S MAGDUZ=$G(DUZ)
  1. ;
  1. I 'RESULT D Q
  1. . ; TAGS(i) = tag | VR | flag | value
  1. . S I="" F S I=$O(TAGS(I)) Q:I="" D
  1. . . S X=TAGS(I),T=$P(X,"|",1) Q:T=""
  1. . . S T=$TR(T,"abcdef","ABCDEF"),$P(TAGS(I),"|",1)=T
  1. . . S V=$P(X,"|",4,$L(X)+2) S:V="*" V=""
  1. . . S:$TR(V,"UNKOW","unkow")="<unknown>" V=""
  1. . . S L=$L(V,"\") S:V="" L=0
  1. . . S REQ(T)=L F P=1:1:L S REQ(T,P)=$P(V,"\",P)
  1. . . Q
  1. . S X=0,T="" F S T=$O(REQ(T)) Q:T="" D Q:X
  1. . . S P="" F S P=$O(REQ(T,P)) Q:P="" S:REQ(T,P)'="" X=1
  1. . . Q
  1. . D:'X ERR("No permission to query whole database.")
  1. . S T="" F S T=$O(REQ(T)) Q:T="" D:REQ(T)<-1 ERR("Missing required tag """_T_""".")
  1. . I ERROR D ERRLOG Q
  1. . ;
  1. . ; Convert DICOM name to VA name
  1. . ;
  1. . S T="0010,0010"
  1. . S P="" F S P=$O(REQ(T,P)) Q:P="" S REQ(T,P)=$$DCM2VA(REQ(T,P))
  1. . ;
  1. . ; Initialize Result Set
  1. . ;
  1. . L +^MAGDQR(2006.5732,0):1E9 ; Background process MUST wait
  1. . S X=$G(^MAGDQR(2006.5732,0))
  1. . S $P(X,"^",1,2)="DICOM QUERY RETRIEVE RESULT^2006.5732"
  1. . S RESULT=$O(^MAGDQR(2006.5732," "),-1)+1
  1. . S $P(X,"^",3)=RESULT
  1. . S $P(X,"^",4)=$P(X,"^",4)+1
  1. . S ^MAGDQR(2006.5732,0)=X
  1. . S ^MAGDQR(2006.5732,RESULT,0)=RESULT_"^IP^"_$$NOW^XLFDT()
  1. . S ^MAGDQR(2006.5732,"B",RESULT,RESULT)=""
  1. . L -^MAGDQR(2006.5732,0)
  1. . ;
  1. . ; Queue up actual query
  1. . ;
  1. . S ZTRTN="QUERY^MAGDQR02"
  1. . S ZTDESC="Perform DICOM Query, result-set="_RESULT
  1. . S ZTDTH=$H
  1. . S ZTSAVE("RESULT")=RESULT
  1. . S ZTSAVE("MAGDUZ")=$G(MAGDUZ)
  1. . S T="" F S T=$O(REQ(T)) Q:T="" D
  1. . . S ZTSAVE("REQ("""_T_""")")=REQ(T)
  1. . . S P="" F S P=$O(REQ(T,P)) Q:P="" S ZTSAVE("REQ("""_T_""","_P_")")=REQ(T,P)
  1. . . Q
  1. . D ^%ZTLOAD,HOME^%ZIS
  1. . D:'$G(ZTSK) ERR("TaskMan did not Accept Request")
  1. . S:$G(ZTSK) $P(^MAGDQR(2006.5732,RESULT,0),"^",4)=ZTSK
  1. . I ERROR D ERRLOG Q
  1. . D LOG^MAGDQRUL("TaskMan","","0,"_RESULT_",Query Started through TaskMan")
  1. . Q
  1. ;
  1. I OFFSET<0 D Q ; All done, clean up result-set
  1. . D LOG^MAGDQRUL("CleanUp","","1,Result Set Cleaned Up")
  1. . Q:'$D(^MAGDQR(2006.5732,RESULT))
  1. . L +^MAGDQR(2006.5732,0):1E9 ; Background process MUST wait
  1. . S X=$G(^MAGDQR(2006.5732,0))
  1. . S $P(X,"^",1,2)="DICOM QUERY RETRIEVE RESULT^2006.5732"
  1. . S:$P(X,"^",4)>0 $P(X,"^",4)=$P(X,"^",4)-1
  1. . S ^MAGDQR(2006.5732,0)=X
  1. . K ^MAGDQR(2006.5732,RESULT)
  1. . K ^MAGDQR(2006.5732,"B",RESULT)
  1. . L -^MAGDQR(2006.5732,0)
  1. . Q
  1. ;
  1. I 'OFFSET D Q:V'="OK" ; Is the query done?
  1. . S X=$G(^MAGDQR(2006.5732,RESULT,0))
  1. . S V=$P(X,"^",2) Q:V="OK"
  1. . I V="X" D LOG^MAGDQRUL("NoResult","","-2,No result returned") S V="OK" Q
  1. . S ZTSK=$P(X,"^",4) D STAT^%ZTLOAD
  1. . I $G(ZTSK(2))'["Inactive" S OUT(1)="-1,TaskMan still active" Q
  1. . I ZTSK(2)["Finished" S V="OK" Q
  1. . D LOG^MAGDQRUL("TaskManAbort",ZTSK(2),"-13,TaskMan aborted: "_ZTSK(2))
  1. . Q
  1. ;
  1. S:'$G(MAX) MAX=100
  1. S I=OFFSET,N=1 F S I=$O(^MAGDQR(2006.5732,RESULT,1,I)) Q:'I D Q:N>MAX
  1. . S OFFSET=I
  1. . S N=N+1,OUT(N)=$G(^MAGDQR(2006.5732,RESULT,1,I,0))
  1. . Q
  1. I N=1 D Q
  1. . S N=0,I=" " F S I=$O(^MAGDQR(2006.5732,RESULT,1,I),-1) Q:'I D Q:'I
  1. . . S X=$G(^MAGDQR(2006.5732,RESULT,1,I,0)) Q:X'["0000,0902^Result #"
  1. . . S N=$P(X," # ",2),I=0
  1. . . Q
  1. . D LOG^MAGDQRUL("Done",N,"0,No more results.")
  1. . Q
  1. I N=2,OFFSET=1 D LOG^MAGDQRUL("Error",$P(OUT(2),"^",2),"")
  1. S OUT(1)=(N-1)_","_OFFSET_",result(s)."
  1. Q
  1. ;
  1. DCM2VA(NAME) N I,P
  1. ; P66T70: Normalize PN VR from legacy comma to current carat before processing
  1. D:NAME'=""
  1. . S NAME=$TR(NAME,"abcdefghijklmnopqrstuvwxyz,","ABCDEFGHIJKLMNOPQRSTUVWXYZ^")
  1. . ; Ignore prefixes and suffices
  1. . F I=1:1:3 D
  1. . . S P(I)=$P(NAME,"^",I)
  1. . . F Q:$E(P(I),1)'=" " S P(I)=$E(P(I),2,$L(P(I)))
  1. . . F Q:$E(P(I),$L(P(I)))'=" " S P(I)=$E(P(I),1,$L(P(I))-1)
  1. . . Q
  1. . S NAME=P(1)_","_P(2) S:P(3)'="" NAME=NAME_" "_P(3)
  1. . S:$E(NAME,$L(NAME))="," NAME=NAME_"*"
  1. . Q
  1. Q NAME
  1. ;
  1. VA2DCM(NAME) N I,P
  1. ; P66T70: Prepare name for return to caller with consistent comma delimiter
  1. ; Also strip leading, trailing, interior spaces
  1. D:NAME'=""
  1. . S P(1)=$P(NAME,",",1),P(2)=$P(NAME,",",2)
  1. . F I=1,2 D
  1. . . F Q:$E(P(I),1)'=" " S P(I)=$E(P(I),2,$L(P(I)))
  1. . . F Q:$E(P(I),$L(P(I)))'=" " S P(I)=$E(P(I),1,$L(P(I))-1)
  1. . . Q
  1. . S:P(2)[" " P(3)=$P(P(2)," ",2,999),P(2)=$P(P(2)," ",1)
  1. . F I=1:1:3 D:$D(P(I))
  1. . . F Q:$E(P(I),1)'=" " S P(I)=$E(P(I),2,$L(P(I)))
  1. . . F Q:P(I)'[" " S P(I)=$P(P(I)," ",1)_" "_$P(P(I)," ",2,999)
  1. . . Q
  1. . S NAME=P(1)_","_P(2) S:$D(P(3)) NAME=NAME_","_P(3)
  1. . Q
  1. Q NAME
  1. ;
  1. ERR(X) S ^TMP("MAG",$J,"ERR",$O(^TMP("MAG",$J,"ERR"," "),-1)+1)=X
  1. Q
  1. ;
  1. ERRLOG N I,O,X
  1. S O=1,I=""
  1. F S I=$O(^TMP("MAG",$J,"ERR",I)) Q:I="" S X=$G(^(I)) D
  1. . S O=O+1,OUT(O)=X
  1. . Q
  1. D LOG^MAGDQRUL("Error","",(-O)_",Errors encountered")
  1. Q
  1. ;
  1. ERRSAV N I,O,RESGBL,X
  1. Q:'$G(RESULT) S RESGBL=$NA(^MAGDQR(2006.5732,RESULT))
  1. S $P(@RESGBL@(0),"^",2,3)="OK^"_$$NOW^XLFDT()
  1. K @RESGBL@(1)
  1. S O=0,I=""
  1. F S I=$O(^TMP("MAG",$J,"ERR",I)) Q:I="" S X=$G(^(I)) D
  1. . S O=O+1,@RESGBL@(1,O,0)="0000,0902^"_X
  1. . Q
  1. Q