ONCRPC ;Hines OIFO/GWB - Extract VACCR data via ONC VACCR RPC ;09/22/11
;;2.2;ONCOLOGY;**1**;Jul 31, 2013;Build 8
;;
EN1(RESULT,DATEUSED,START,END) ;Entry point
K ^TMP("ONCRPC")
N VERSION
S VERSION=$O(^ONCO(160.16,"B","VACCR EXTRACT"))
S EXTRACT=$O(^ONCO(160.16,"B",VERSION,0))
S OUT=0
S U="^"
D SETUP
S RESULT=$NA(^TMP("ONCRPC"))
Q
;
SETUP ;Loop through appropriate cross-reference
N BLANK,DCLC,FDNUM,IEN,NC,NINE,TPG,ZERO,ZNINE,X
N DIVISION,FACPNT,ONCDST,ONCSAPI,OSPIEN,RC,RESULT,STAT1
S BLANK=" "
S (IEN,ZERO)=0
S NINE=9,ZNINE="09"
;
;VACCR/STATE EXTRACT
;Loop through DATE CASE COMPLETED (165.5,90) "AAD" cross-reference
I DATEUSED=1 S START=START-1 F S START=$O(^ONCO(165.5,"AAD",START)) Q:(START<1)!(START>END) F S IEN=$O(^ONCO(165.5,"AAD",START,IEN)) Q:IEN<1 D
.Q:$G(^ONCO(165.5,IEN,0))=""
.D LOOP
;
;VACCR/STATE EXTRACT
;Loop through DATE CASE LAST CHANGED (165.5,198) "AAE" cross-reference
I DATEUSED=2 S START=START-1 F S START=$O(^ONCO(165.5,"AAE",START)) Q:(START<1)!(START>END) F S IEN=$O(^ONCO(165.5,"AAE",START,IEN)) Q:IEN<1 D
.Q:$G(^ONCO(165.5,IEN,0))=""
.D LOOP
;
Q
;
LOOP ;Apply extract selection rules
N LINE,RULES,VALID,JUMP
S RULES=0
F S RULES=$O(^ONCO(160.16,EXTRACT,"RULES",RULES)) Q:RULES<1 D
.S LINE=^ONCO(160.16,EXTRACT,"RULES",RULES,0)
.X LINE
Q:'VALID
S DIVISION=$P($G(^ONCO(165.5,IEN,"DIV")),U,1)
Q:DIVISION=""
S OSPIEN=$O(^ONCO(160.1,"C",DIVISION,0))
Q:OSPIEN=""
S FACPNT=$P($G(^ONCO(160.1,OSPIEN,1)),U,4)
Q:FACPNT=""
S STAT1=$P($G(^ONCO(160.19,FACPNT,0)),U,1)
S:$P(^ONCO(165.5,IEN,24),U,25)="" $P(^ONCO(165.5,IEN,24),U,25)=DT
D OUTPUT(IEN,EXTRACT,JUMP,.OUT)
D END^ONCSNACR(.ONCDST)
D TRAILER^ONCSAPIR(.ONCDST)
Q
;
OUTPUT(IEN,EXTRACT,JUMP,OUT) ;Output
S ONCDST=$NA(^TMP("ONCRPC",IEN))
S RC=$$RBQPREP^ONCSED01(.ONCSAPI,.ONCDST)
S ACD160=$P(^ONCO(165.5,IEN,0),U,2)
N POS S POS=0
F S POS=$O(^ONCO(160.16,EXTRACT,"FIELD","B",POS)) Q:POS<1 D Q:OUT
.N NODE S NODE=0
.F S NODE=$O(^ONCO(160.16,EXTRACT,"FIELD","B",POS,NODE)) Q:NODE<1 D Q:OUT
..N STRING,DEFAULT,FILL,LEN
..Q:$G(^ONCO(160.16,EXTRACT,"FIELD",NODE,0))=""
..;D DISPLAY(DEVICE,$P(^ONCO(160.16,EXTRACT,"FIELD",NODE,0),U,1)_U_$P(^ONCO(160.16,EXTRACT,"FIELD",NODE,0),U,4),.OUT)
..S LEN=$P(^ONCO(160.16,EXTRACT,"FIELD",NODE,0),U,2)
..S STRING=$TR(^ONCO(160.16,EXTRACT,"FIELD",NODE,1),"~","^")
..S DEFAULT=$P(^ONCO(160.16,EXTRACT,"FIELD",NODE,2),U,1)
..S FILL=$P(^ONCO(160.16,EXTRACT,"FIELD",NODE,3),U,1)
..D DATA(IEN,ACD160,STRING,DEFAULT,FILL,LEN,JUMP,NODE,POS)
Q
;
DATA(IEN,ACD160,STRING,DEFAULT,FILL,LEN,JUMP,NODE,POS) ;Compute extract value
N ACDANS,EXIT S EXIT=0
I JUMP'="0" D
.I POS<$P(JUMP,U) Q
.I POS>$P(JUMP,U,2) Q
.N I
.S EXIT=1
.F I=1:1:LEN W BLANK
Q:EXIT
X STRING
;
;If value = "", extract DEFAULT value
I ACDANS="" D Q
.N I,X S X=""
.I DEFAULT=8 D Q
..F I=1:1:LEN D WRITE^ONCSNACR(.ONCDST,DEFAULT)
.I @DEFAULT="09" D WRITE^ONCSNACR(.ONCDST,@DEFAULT) Q
.F I=1:1:LEN D WRITE^ONCSNACR(.ONCDST,@DEFAULT)
;
;If value too long, truncate to LENGTH (160.161,1)
;If value too short, pad with FILL (160.161,6)
I $L(ACDANS)=LEN D WRITE^ONCSNACR(.ONCDST,ACDANS) Q
I $L(ACDANS)>LEN D WRITE^ONCSNACR(.ONCDST,$E(ACDANS,1,LEN)) Q
E D Q
.N JUST,STUFF,I,REM,CAL
.S JUST=$P(FILL,","),STUFF=$P(FILL,",",2)
.S REM=LEN-$L(ACDANS)
.I JUST="R" D WRITE^ONCSNACR(.ONCDST,ACDANS)
.F I=1:1:REM D WRITE^ONCSNACR(.ONCDST,@STUFF)
.I JUST="L" D WRITE^ONCSNACR(.ONCDST,ACDANS)
Q
;
CLEANUP ;Cleanup
K DATEUSED,END,START
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HONCRPC 3604 printed Dec 13, 2024@02:27:40 Page 2
ONCRPC ;Hines OIFO/GWB - Extract VACCR data via ONC VACCR RPC ;09/22/11
+1 ;;2.2;ONCOLOGY;**1**;Jul 31, 2013;Build 8
+2 ;;
EN1(RESULT,DATEUSED,START,END) ;Entry point
+1 KILL ^TMP("ONCRPC")
+2 NEW VERSION
+3 SET VERSION=$ORDER(^ONCO(160.16,"B","VACCR EXTRACT"))
+4 SET EXTRACT=$ORDER(^ONCO(160.16,"B",VERSION,0))
+5 SET OUT=0
+6 SET U="^"
+7 DO SETUP
+8 SET RESULT=$NAME(^TMP("ONCRPC"))
+9 QUIT
+10 ;
SETUP ;Loop through appropriate cross-reference
+1 NEW BLANK,DCLC,FDNUM,IEN,NC,NINE,TPG,ZERO,ZNINE,X
+2 NEW DIVISION,FACPNT,ONCDST,ONCSAPI,OSPIEN,RC,RESULT,STAT1
+3 SET BLANK=" "
+4 SET (IEN,ZERO)=0
+5 SET NINE=9
SET ZNINE="09"
+6 ;
+7 ;VACCR/STATE EXTRACT
+8 ;Loop through DATE CASE COMPLETED (165.5,90) "AAD" cross-reference
+9 IF DATEUSED=1
SET START=START-1
FOR
SET START=$ORDER(^ONCO(165.5,"AAD",START))
if (START<1)!(START>END)
QUIT
FOR
SET IEN=$ORDER(^ONCO(165.5,"AAD",START,IEN))
if IEN<1
QUIT
Begin DoDot:1
+10 if $GET(^ONCO(165.5,IEN,0))=""
QUIT
+11 DO LOOP
End DoDot:1
+12 ;
+13 ;VACCR/STATE EXTRACT
+14 ;Loop through DATE CASE LAST CHANGED (165.5,198) "AAE" cross-reference
+15 IF DATEUSED=2
SET START=START-1
FOR
SET START=$ORDER(^ONCO(165.5,"AAE",START))
if (START<1)!(START>END)
QUIT
FOR
SET IEN=$ORDER(^ONCO(165.5,"AAE",START,IEN))
if IEN<1
QUIT
Begin DoDot:1
+16 if $GET(^ONCO(165.5,IEN,0))=""
QUIT
+17 DO LOOP
End DoDot:1
+18 ;
+19 QUIT
+20 ;
LOOP ;Apply extract selection rules
+1 NEW LINE,RULES,VALID,JUMP
+2 SET RULES=0
+3 FOR
SET RULES=$ORDER(^ONCO(160.16,EXTRACT,"RULES",RULES))
if RULES<1
QUIT
Begin DoDot:1
+4 SET LINE=^ONCO(160.16,EXTRACT,"RULES",RULES,0)
+5 XECUTE LINE
End DoDot:1
+6 if 'VALID
QUIT
+7 SET DIVISION=$PIECE($GET(^ONCO(165.5,IEN,"DIV")),U,1)
+8 if DIVISION=""
QUIT
+9 SET OSPIEN=$ORDER(^ONCO(160.1,"C",DIVISION,0))
+10 if OSPIEN=""
QUIT
+11 SET FACPNT=$PIECE($GET(^ONCO(160.1,OSPIEN,1)),U,4)
+12 if FACPNT=""
QUIT
+13 SET STAT1=$PIECE($GET(^ONCO(160.19,FACPNT,0)),U,1)
+14 if $PIECE(^ONCO(165.5,IEN,24),U,25)=""
SET $PIECE(^ONCO(165.5,IEN,24),U,25)=DT
+15 DO OUTPUT(IEN,EXTRACT,JUMP,.OUT)
+16 DO END^ONCSNACR(.ONCDST)
+17 DO TRAILER^ONCSAPIR(.ONCDST)
+18 QUIT
+19 ;
OUTPUT(IEN,EXTRACT,JUMP,OUT) ;Output
+1 SET ONCDST=$NAME(^TMP("ONCRPC",IEN))
+2 SET RC=$$RBQPREP^ONCSED01(.ONCSAPI,.ONCDST)
+3 SET ACD160=$PIECE(^ONCO(165.5,IEN,0),U,2)
+4 NEW POS
SET POS=0
+5 FOR
SET POS=$ORDER(^ONCO(160.16,EXTRACT,"FIELD","B",POS))
if POS<1
QUIT
Begin DoDot:1
+6 NEW NODE
SET NODE=0
+7 FOR
SET NODE=$ORDER(^ONCO(160.16,EXTRACT,"FIELD","B",POS,NODE))
if NODE<1
QUIT
Begin DoDot:2
+8 NEW STRING,DEFAULT,FILL,LEN
+9 if $GET(^ONCO(160.16,EXTRACT,"FIELD",NODE,0))=""
QUIT
+10 ;D DISPLAY(DEVICE,$P(^ONCO(160.16,EXTRACT,"FIELD",NODE,0),U,1)_U_$P(^ONCO(160.16,EXTRACT,"FIELD",NODE,0),U,4),.OUT)
+11 SET LEN=$PIECE(^ONCO(160.16,EXTRACT,"FIELD",NODE,0),U,2)
+12 SET STRING=$TRANSLATE(^ONCO(160.16,EXTRACT,"FIELD",NODE,1),"~","^")
+13 SET DEFAULT=$PIECE(^ONCO(160.16,EXTRACT,"FIELD",NODE,2),U,1)
+14 SET FILL=$PIECE(^ONCO(160.16,EXTRACT,"FIELD",NODE,3),U,1)
+15 DO DATA(IEN,ACD160,STRING,DEFAULT,FILL,LEN,JUMP,NODE,POS)
End DoDot:2
if OUT
QUIT
End DoDot:1
if OUT
QUIT
+16 QUIT
+17 ;
DATA(IEN,ACD160,STRING,DEFAULT,FILL,LEN,JUMP,NODE,POS) ;Compute extract value
+1 NEW ACDANS,EXIT
SET EXIT=0
+2 IF JUMP'="0"
Begin DoDot:1
+3 IF POS<$PIECE(JUMP,U)
QUIT
+4 IF POS>$PIECE(JUMP,U,2)
QUIT
+5 NEW I
+6 SET EXIT=1
+7 FOR I=1:1:LEN
WRITE BLANK
End DoDot:1
+8 if EXIT
QUIT
+9 XECUTE STRING
+10 ;
+11 ;If value = "", extract DEFAULT value
+12 IF ACDANS=""
Begin DoDot:1
+13 NEW I,X
SET X=""
+14 IF DEFAULT=8
Begin DoDot:2
+15 FOR I=1:1:LEN
DO WRITE^ONCSNACR(.ONCDST,DEFAULT)
End DoDot:2
QUIT
+16 IF @DEFAULT="09"
DO WRITE^ONCSNACR(.ONCDST,@DEFAULT)
QUIT
+17 FOR I=1:1:LEN
DO WRITE^ONCSNACR(.ONCDST,@DEFAULT)
End DoDot:1
QUIT
+18 ;
+19 ;If value too long, truncate to LENGTH (160.161,1)
+20 ;If value too short, pad with FILL (160.161,6)
+21 IF $LENGTH(ACDANS)=LEN
DO WRITE^ONCSNACR(.ONCDST,ACDANS)
QUIT
+22 IF $LENGTH(ACDANS)>LEN
DO WRITE^ONCSNACR(.ONCDST,$EXTRACT(ACDANS,1,LEN))
QUIT
+23 IF '$TEST
Begin DoDot:1
+24 NEW JUST,STUFF,I,REM,CAL
+25 SET JUST=$PIECE(FILL,",")
SET STUFF=$PIECE(FILL,",",2)
+26 SET REM=LEN-$LENGTH(ACDANS)
+27 IF JUST="R"
DO WRITE^ONCSNACR(.ONCDST,ACDANS)
+28 FOR I=1:1:REM
DO WRITE^ONCSNACR(.ONCDST,@STUFF)
+29 IF JUST="L"
DO WRITE^ONCSNACR(.ONCDST,ACDANS)
End DoDot:1
QUIT
+30 QUIT
+31 ;
CLEANUP ;Cleanup
+1 KILL DATEUSED,END,START