- DIR3 ;SFISC/DCM,RDS-READER-MAID (PROCESS RANGE/LIST) ;6/28/2009
- ;;22.0;VA FileMan;**30,164**;Mar 30, 1999;Build 21
- ;Per VHA Directive 2004-038, this routine should not be modified.
- ;12364;2913754;3396;
- ;
- L ; LIST OR RANGE
- N %I,%I1,%I2,%BA,%X,%C,%1,%2,%3,%4,%
- K ^TMP($J,"DIR")
- S Y(0)="",%C=0,%I1=1,%I2=2,%BA=$S($D(DIR("S")):DIR("S"),1:"I 1")
- F %I=1:1 S %X=$P(X,",",%I) Q:%E!'$L($P(X,",",%I,999)) D
- . I %X'?.".".N.".".N."-".N.".".N S %E=4 Q
- . I $E(%X)="-" S %E=3 Q
- . I $L($P(%X,"."))>24 S %E=1 Q
- . I '%B3,$L($P(+%X,".",2)) S %E=2
- I '%E D @$S(%A["C"&'$D(DIR("S")):"LC",%A["C"&$D(DIR("S")):"LL",1:"LL")
- I '%E,Y(%C)="" S %E=4
- I $G(%E),'%N D
- . S %W=$P($T(@(%E)),";;",2)
- . I %W[";",%E=1 S %W=$P(%W,";")_+%B1_$P(%W,";",2)_" "_%B2
- . I %W[";",%E=2 S %W=$P(%W,";")_+%B3_$P(%W,";",2)_$S(%B3>1:"s",1:"")
- I $G(%E) K Y S Y="" Q ; Prevent Erroneous Data
- S Y=Y(0)
- Q
- ;
- LL ; handle uncompressed lists & screened compressed lists
- I %B3 D LCD
- F %I=1:1 S %X=$P(X,",",%I) Q:%E!'$L($P(X,",",%I,999)) D L0
- Q:%E
- I %A["C" D LIST
- Q
- L0 N %J
- D LCK
- Q:%E I %X?.N!(%X?1N.".".N) S %J=+%X G L1
- I %B3 D Q
- . S %J=+%X D L1 S $P(%X,"-")=%X+%I1
- . F %J=+%X:%I1:$P(%X,"-",2) D L1
- F %J=$P(%X,"-"):1:$P(%X,"-",2) D L1
- Q
- L1 I %A["C" D Q
- . S Y=%J X %BA Q:'$T
- . S (%1,%2)=%J
- . D LC1
- I $L(Y(%C)_%J)>220 S %C=%C+1,Y(%C)=""
- F %=0:1:%C I ","_Y(%)_","[(","_%J_",") S %=-1 Q
- I %'<0 S Y=%J X %BA S:$T Y(%C)=Y(%C)_%J_","
- Q
- ;
- ; check one list element
- ;%A = $P#1 "^" of DIR(0)
- ;%B = $P#2 "^" of DIR(0)
- ;%B1 = $P#1 ":" Low Value
- ;%B2 = $P#2 ":" High Value
- ;%B3 = $P#3 ":" Number of Decimals; Null If Undefined
- ;%X = Range Entered, i.e. 2-4
- ;% = End of Range Entered i.e. 4
- LCK I %X["-" D Q
- . N % S %=$P(%X,"-",2) I '% S %E=4 Q
- . I %A'["I",%<+%X S %E=4 Q
- . I %A["I",%<+%X N %3 S %3=%,%=+%X,$P(%X,"-",2)=%,$P(%X,"-")=%3
- . I %<%B1!(+%X>%B2) S %E=1 Q
- . I +%X<%B1 S %E=1 Q
- . I +%>%B2 S %E=1 Q
- . I $L($P(+%X,".",2))>%B3!($L($P(+%,".",2))>%B3) S %E=2 Q
- I +%X<%B1!(+%X>%B2) S %E=1 Q
- I %B3,$L($P(+%X,".",2))>%B3 S %E=2 Q
- Q
- ;
- LCD ; determine increment size for ranges (handle decimals)
- S %1="." I %B3>1 F %=1:1:%B3-1 S %1=%1_"0"
- S %I2=%1_2,%I1=%1_1
- Q
- ;
- LC ; handle unscreened compressed lists (no DIR("S"))
- ; LC to LIST checks the user's list in X, building ^TMP($J,"DIR")
- I %B3 D LCD
- F %=1:1:$L(X,",") S %1=$P(X,",",%) D LC0 Q:%E
- Q:'$D(^TMP($J,"DIR"))
- LIST ; transfer output list from ^TMP($J,"DIR") to Y
- S %1="",Y(%C)="" D
- . F S %1=$O(^TMP($J,"DIR",%1)) Q:%1="" D
- . . S:$D(^(%1))=1 Y(%C)=Y(%C)_%1_","
- . . S:$L(Y(%C))>220 %C=%C+1,Y(%C)=""
- . . I $D(^(%1))=10 S Y(%C)=Y(%C)_$O(^TMP($J,"DIR",%1,""))_"-"_%1_","
- I Y(%C)="" D Q:%E
- . I %C=0 S %E=4
- . E K Y(%C) S %C=%C-1
- K ^TMP($J,"DIR")
- Q
- LC0 ; check one list element, calls LC1 to put it in ^TMP($J,"DIR")
- S %E=0,%X=%1 D LCK Q:%E S (%1,%2)=%X
- I %1["-" S %1=+%1,%2=+$P(%2,"-",2)
- S %1=+%1,%2=+%2
- D LC1
- Q
- LC1 ; modify ^TMP($J,"DIR") to incorporate a list element, handle overlap
- S %3=$O(^TMP($J,"DIR",%1-%I2)) I %3]"",%3<%2 D
- . I $D(^(%3))=1,%1-%I1=%3 S %1=%3
- . I $D(^(%3))>9 S %4=$O(^(%3,"")) I %4<%1 S %1=%4
- S %3=$O(^TMP($J,"DIR",%2-$S(%B3:%I1,1:1))) I %3]"" D
- . I $D(^(%3))=1,%2+%I1=%3 S %2=%3
- . I $D(^(%3))>9 S %4=$O(^(%3,"")) S:%4'>(%2+%I1) %2=%3 S:%4<%1 %1=%4
- S %3=%1-%I1 F S %3=$O(^TMP($J,"DIR",%3)) Q:%3=""!(%3>%2) K ^(%3)
- I %1'=%2 S ^TMP($J,"DIR",%2,%1)=""
- E S ^TMP($J,"DIR",%1)=""
- Q
- ;
- 1 ;;Response should be no less than ; and no greater than
- 2 ;;Response must be no more than ; decimal digit
- 3 ;;Response must be a positive number
- 4 ;;Invalid number or range
- DIR3 ;SFISC/DCM,RDS-READER-MAID (PROCESS RANGE/LIST) ;6/28/2009
- +1 ;;22.0;VA FileMan;**30,164**;Mar 30, 1999;Build 21
- +2 ;Per VHA Directive 2004-038, this routine should not be modified.
- +3 ;12364;2913754;3396;
- +4 ;
- L ; LIST OR RANGE
- +1 NEW %I,%I1,%I2,%BA,%X,%C,%1,%2,%3,%4,%
- +2 KILL ^TMP($JOB,"DIR")
- +3 SET Y(0)=""
- SET %C=0
- SET %I1=1
- SET %I2=2
- SET %BA=$SELECT($DATA(DIR("S")):DIR("S"),1:"I 1")
- +4 FOR %I=1:1
- SET %X=$PIECE(X,",",%I)
- IF %E!'$LENGTH($PIECE(X,",",%I,999))
- QUIT
- Begin DoDot:1
- +5 IF %X'?.".".N.".".N."-".N.".".N
- SET %E=4
- QUIT
- +6 IF $EXTRACT(%X)="-"
- SET %E=3
- QUIT
- +7 IF $LENGTH($PIECE(%X,"."))>24
- SET %E=1
- QUIT
- +8 IF '%B3
- IF $LENGTH($PIECE(+%X,".",2))
- SET %E=2
- End DoDot:1
- +9 IF '%E
- DO @$SELECT(%A["C"&'$DATA(DIR("S")):"LC",%A["C"&$DATA(DIR("S")):"LL",1:"LL")
- +10 IF '%E
- IF Y(%C)=""
- SET %E=4
- +11 IF $GET(%E)
- IF '%N
- Begin DoDot:1
- +12 SET %W=$PIECE($TEXT(@(%E)),";;",2)
- +13 IF %W[";"
- IF %E=1
- SET %W=$PIECE(%W,";")_+%B1_$PIECE(%W,";",2)_" "_%B2
- +14 IF %W[";"
- IF %E=2
- SET %W=$PIECE(%W,";")_+%B3_$PIECE(%W,";",2)_$SELECT(%B3>1:"s",1:"")
- End DoDot:1
- +15 ; Prevent Erroneous Data
- IF $GET(%E)
- KILL Y
- SET Y=""
- QUIT
- +16 SET Y=Y(0)
- +17 QUIT
- +18 ;
- LL ; handle uncompressed lists & screened compressed lists
- +1 IF %B3
- DO LCD
- +2 FOR %I=1:1
- SET %X=$PIECE(X,",",%I)
- IF %E!'$LENGTH($PIECE(X,",",%I,999))
- QUIT
- DO L0
- +3 IF %E
- QUIT
- +4 IF %A["C"
- DO LIST
- +5 QUIT
- L0 NEW %J
- +1 DO LCK
- +2 IF %E
- QUIT
- IF %X?.N!(%X?1N.".".N)
- SET %J=+%X
- GOTO L1
- +3 IF %B3
- Begin DoDot:1
- +4 SET %J=+%X
- DO L1
- SET $PIECE(%X,"-")=%X+%I1
- +5 FOR %J=+%X:%I1:$PIECE(%X,"-",2)
- DO L1
- End DoDot:1
- QUIT
- +6 FOR %J=$PIECE(%X,"-"):1:$PIECE(%X,"-",2)
- DO L1
- +7 QUIT
- L1 IF %A["C"
- Begin DoDot:1
- +1 SET Y=%J
- XECUTE %BA
- IF '$TEST
- QUIT
- +2 SET (%1,%2)=%J
- +3 DO LC1
- End DoDot:1
- QUIT
- +4 IF $LENGTH(Y(%C)_%J)>220
- SET %C=%C+1
- SET Y(%C)=""
- +5 FOR %=0:1:%C
- IF ","_Y(%)_","[(","_%J_",")
- SET %=-1
- QUIT
- +6 IF %'<0
- SET Y=%J
- XECUTE %BA
- IF $TEST
- SET Y(%C)=Y(%C)_%J_","
- +7 QUIT
- +8 ;
- +9 ; check one list element
- +10 ;%A = $P#1 "^" of DIR(0)
- +11 ;%B = $P#2 "^" of DIR(0)
- +12 ;%B1 = $P#1 ":" Low Value
- +13 ;%B2 = $P#2 ":" High Value
- +14 ;%B3 = $P#3 ":" Number of Decimals; Null If Undefined
- +15 ;%X = Range Entered, i.e. 2-4
- +16 ;% = End of Range Entered i.e. 4
- LCK IF %X["-"
- Begin DoDot:1
- +1 NEW %
- SET %=$PIECE(%X,"-",2)
- IF '%
- SET %E=4
- QUIT
- +2 IF %A'["I"
- IF %<+%X
- SET %E=4
- QUIT
- +3 IF %A["I"
- IF %<+%X
- NEW %3
- SET %3=%
- SET %=+%X
- SET $PIECE(%X,"-",2)=%
- SET $PIECE(%X,"-")=%3
- +4 IF %<%B1!(+%X>%B2)
- SET %E=1
- QUIT
- +5 IF +%X<%B1
- SET %E=1
- QUIT
- +6 IF +%>%B2
- SET %E=1
- QUIT
- +7 IF $LENGTH($PIECE(+%X,".",2))>%B3!($LENGTH($PIECE(+%,".",2))>%B3)
- SET %E=2
- QUIT
- End DoDot:1
- QUIT
- +8 IF +%X<%B1!(+%X>%B2)
- SET %E=1
- QUIT
- +9 IF %B3
- IF $LENGTH($PIECE(+%X,".",2))>%B3
- SET %E=2
- QUIT
- +10 QUIT
- +11 ;
- LCD ; determine increment size for ranges (handle decimals)
- +1 SET %1="."
- IF %B3>1
- FOR %=1:1:%B3-1
- SET %1=%1_"0"
- +2 SET %I2=%1_2
- SET %I1=%1_1
- +3 QUIT
- +4 ;
- LC ; handle unscreened compressed lists (no DIR("S"))
- +1 ; LC to LIST checks the user's list in X, building ^TMP($J,"DIR")
- +2 IF %B3
- DO LCD
- +3 FOR %=1:1:$LENGTH(X,",")
- SET %1=$PIECE(X,",",%)
- DO LC0
- IF %E
- QUIT
- +4 IF '$DATA(^TMP($JOB,"DIR"))
- QUIT
- LIST ; transfer output list from ^TMP($J,"DIR") to Y
- +1 SET %1=""
- SET Y(%C)=""
- Begin DoDot:1
- +2 FOR
- SET %1=$ORDER(^TMP($JOB,"DIR",%1))
- IF %1=""
- QUIT
- Begin DoDot:2
- +3 IF $DATA(^(%1))=1
- SET Y(%C)=Y(%C)_%1_","
- +4 IF $LENGTH(Y(%C))>220
- SET %C=%C+1
- SET Y(%C)=""
- +5 IF $DATA(^(%1))=10
- SET Y(%C)=Y(%C)_$ORDER(^TMP($JOB,"DIR",%1,""))_"-"_%1_","
- End DoDot:2
- End DoDot:1
- +6 IF Y(%C)=""
- Begin DoDot:1
- +7 IF %C=0
- SET %E=4
- +8 IF '$TEST
- KILL Y(%C)
- SET %C=%C-1
- End DoDot:1
- IF %E
- QUIT
- +9 KILL ^TMP($JOB,"DIR")
- +10 QUIT
- LC0 ; check one list element, calls LC1 to put it in ^TMP($J,"DIR")
- +1 SET %E=0
- SET %X=%1
- DO LCK
- IF %E
- QUIT
- SET (%1,%2)=%X
- +2 IF %1["-"
- SET %1=+%1
- SET %2=+$PIECE(%2,"-",2)
- +3 SET %1=+%1
- SET %2=+%2
- +4 DO LC1
- +5 QUIT
- LC1 ; modify ^TMP($J,"DIR") to incorporate a list element, handle overlap
- +1 SET %3=$ORDER(^TMP($JOB,"DIR",%1-%I2))
- IF %3]""
- IF %3<%2
- Begin DoDot:1
- +2 IF $DATA(^(%3))=1
- IF %1-%I1=%3
- SET %1=%3
- +3 IF $DATA(^(%3))>9
- SET %4=$ORDER(^(%3,""))
- IF %4<%1
- SET %1=%4
- End DoDot:1
- +4 SET %3=$ORDER(^TMP($JOB,"DIR",%2-$SELECT(%B3:%I1,1:1)))
- IF %3]""
- Begin DoDot:1
- +5 IF $DATA(^(%3))=1
- IF %2+%I1=%3
- SET %2=%3
- +6 IF $DATA(^(%3))>9
- SET %4=$ORDER(^(%3,""))
- IF %4'>(%2+%I1)
- SET %2=%3
- IF %4<%1
- SET %1=%4
- End DoDot:1
- +7 SET %3=%1-%I1
- FOR
- SET %3=$ORDER(^TMP($JOB,"DIR",%3))
- IF %3=""!(%3>%2)
- QUIT
- KILL ^(%3)
- +8 IF %1'=%2
- SET ^TMP($JOB,"DIR",%2,%1)=""
- +9 IF '$TEST
- SET ^TMP($JOB,"DIR",%1)=""
- +10 QUIT
- +11 ;
- 1 ;;Response should be no less than ; and no greater than
- 2 ;;Response must be no more than ; decimal digit
- 3 ;;Response must be a positive number
- 4 ;;Invalid number or range