PSSPOI ;BIR/RLW-CREATE PHARMACY ORDERABLE ITEMS ; 09/01/98 7:10
;;1.0;PHARMACY DATA MANAGEMENT;**15**;9/30/97
EN ;
; variable prefixes: ADD=iv additive file SOL=iv solution file
; PD=primary drug file DD=dispense drug file
; NDF=national drug file DF=NDF dosage form
; SPD=pharmacy orderable item file SYN=synonym
;
LIVE ; populate PHARMACY ORDERABLE ITEM file, tie dispense drug to it
; loop thru ^TMP global to build 50.7
N J,ADDIEN,ADDNAME,DDIEN,DDNAME,PDIEN,PDNAME,PDNAMEDF,NDF,NDFVA,DF,DFNAME,SPDNAME,X,PSMATCH,SOLIEN,SOLNAME,SPD,SPDFN,SYNIEN,SYNONYM
S PDNAMEDF="" F S PDNAMEDF=$O(^TMP("PSSD",$J,PDNAMEDF)) Q:PDNAMEDF="" S DFNAME=$P(PDNAMEDF,"~",2),PDNAME=$P(PDNAMEDF,"~") Q:DFNAME="" S (DF,DDNAME,SPDNAME)="",DF=$O(^PS(50.606,"B",DFNAME,DF)) D
.F I=$L(PDNAME):-1:1 Q:$E(PDNAME,I)'=" "
.S SPDNAME=$E(PDNAME,1,I)
.S Y=-1,SPDIEN="" I '$D(^PS(50.7,"ADF",SPDNAME,DF)) S DIC="^PS(50.7,",DIC(0)="L",DIC("DR")=".02////"_DF,X=SPDNAME K DD,DO D FILE^DICN K DIC S:+Y>0 SPDIEN=+Y
.S:'SPDIEN SPDIEN=$O(^PS(50.7,"ADF",SPDNAME,DF,SPDIEN))
.S SYNIEN=0,PDIEN="",PDIEN=$O(^PS(50.3,"B",PDNAME,PDIEN)) Q:PDIEN="" D
..S Y=0,Y=$O(^PS(50.3,PDIEN,1,"B","U",Y)) S:Y Y=$G(^PS(50.3,PDIEN,1,Y,0)),$P(^PS(50.7,SPDIEN,0),"^",5,8)=$P(Y,"^",5,8)
..S SYNIEN=$O(^PS(50.3,PDIEN,2,SYNIEN)) Q:'SYNIEN I '$D(^PS(50.7,SPDIEN,2,0)) S ^(0)="^50.72^1^1",SYNONYM=$G(^PS(50.3,PDIEN,2,SYNIEN,0)),^PS(50.7,SPDIEN,2,1,0)=SYNONYM,J=1,^PS(50.7,SPDIEN,2,"B",SYNONYM,J)=""
..I SYNIEN F S SYNIEN=$O(^PS(50.3,PDIEN,2,SYNIEN)) Q:'SYNIEN S J=J+1,SYNONYM=$G(^PS(50.3,PDIEN,2,SYNIEN,0)),^PS(50.7,SPDIEN,2,J,0)=SYNONYM,^PS(50.7,SPDIEN,2,"B",SYNONYM,J)="" F I=3,4 S $P(^PS(50.7,SPDIEN,2,0),"^",3,4)=J_"^"_J
.I SPDIEN F S DDNAME=$O(^TMP("PSSD",$J,PDNAMEDF,DDNAME)) Q:DDNAME="" S DDIEN="",DDIEN=$O(^PSDRUG("B",DDNAME,DDIEN)) Q:'DDIEN S DIE="^PSDRUG(",DA=DDIEN,DR="2.1////"_SPDIEN D ^DIE K DIE
.Q
;
IVADD ; populate IV Additives, Solutions
S X1=DT,X2=-365 D C^%DTC S PIND=X K X1,X2
;***********DON'T EVEN USE TMP GLOBAL ************
F ADDIEN=0:0 S ADDIEN=$O(^PS(52.6,ADDIEN)) Q:'ADDIEN S DDIEN=+$P($G(^PS(52.6,ADDIEN,0)),"^",2) I DDIEN,$D(^PSDRUG(DDIEN,0)) D
.S NDND=$G(^PSDRUG(DDIEN,"ND")) Q:'$P(NDND,"^")!('$P(NDND,"^",3))
.S DA=$P(NDND,"^",1),K=$P(NDND,"^",3),X=$$PSJDF^PSNAPIS(DA,K) Q:'X
.S DFPTR=+$P(X,"^") Q:'DFPTR!('$D(^PS(50.606,+DFPTR,0)))
.S ADDNAME=$P($G(^PS(52.6,ADDIEN,0)),"^") Q:ADDNAME=""
.S PDT=+$P($G(^PS(52.6,ADDIEN,"I")),"^") I PDT,PDT<PIND Q
.S AAAFLAG=0 F AAA=0:0 S AAA=$O(^PS(50.7,"ADF",ADDNAME,DFPTR,AAA)) Q:'AAA!(AAAFLAG) S:$P($G(^PS(50.7,AAA,0)),"^",3) AAAFLAG=1
.Q:AAAFLAG
.S DIC="^PS(50.7,",X=ADDNAME,DIC(0)="L",DIC("DR")=".02////"_DFPTR_";.03////1" K DD,DO D FILE^DICN K DIC S SPDIEN=+Y
.Q:'SPDIEN
.K DIE S DIE="^PS(52.6,",DA=ADDIEN,DR="15////"_SPDIEN D ^DIE K DIE
.;NOW, LOOP THRU 3 NODE FOR SYNONYM
.S AAACT=0 F AAA=0:0 S AAA=$O(^PS(52.6,ADDIEN,3,AAA)) Q:'AAA S SYNONYM=$P($G(^(AAA,0)),"^") I SYNONYM'="" S AAACT=AAACT+1 D
..S ^PS(50.7,SPDIEN,2,AAACT,0)=SYNONYM,^PS(50.7,SPDIEN,2,"B",SYNONYM,AAACT)=""
.I AAACT S ^PS(50.7,SPDIEN,2,0)="^50.72^"_AAACT_"^"_AAACT
K PIND,PDT
;
IVSOL ;
;****************DON'T EVEN USE TMP GLOBAL **********
;DO SAME AS ADDITIVES, BUT IF DATAISIN ADF WITH A ONE, MATCH AND DO SYN, IF NOT CREATE,MATCH AND DO SYN
F SOLIEN=0:0 S SOLIEN=$O(^PS(52.7,SOLIEN)) Q:'SOLIEN S DDIEN=+$P($G(^PS(52.7,SOLIEN,0)),"^",2) I DDIEN,$D(^PSDRUG(DDIEN,0)) D
.S NDND=$G(^PSDRUG(DDIEN,"ND")) Q:'$P(NDND,"^")!('$P(NDND,"^",3))
.S DA=$P(NDND,"^",1),K=$P(NDND,"^",3),X=$$PSJDF^PSNAPIS(DA,K) Q:'X
.S DFPTR=+$P(X,"^") Q:'DFPTR!('$D(^PS(50.606,+DFPTR,0)))
.S SOLNAME=$P($G(^PS(52.7,SOLIEN,0)),"^") Q:SOLNAME=""
.S (AAAFLAG,AAAMATCH)=0 F AAA=0:0 S AAA=$O(^PS(50.7,"ADF",SOLNAME,DFPTR,AAA)) Q:'AAA!(AAAFLAG) I $P($G(^PS(50.7,AAA,0)),"^",3) S AAAFLAG=1,AAAMATCH=AAA
.I AAAFLAG D
..K DIE S DIE="^PS(52.7,",DA=SOLIEN,DR="9////"_AAAMATCH D ^DIE K DIE
..F AAA=0:0 S AAA=$O(^PS(52.7,SOLIEN,3,AAA)) Q:'AAA S SYNONYM=$P($G(^(AAA,0)),"^") I SYNONYM'="",'$O(^PS(50.7,AAAMATCH,2,"B",SYNONYM,0)) D
...S AAACT=0 F SYCT=0:0 S SYCT=$O(^PS(50.7,AAAMATCH,2,SYCT)) Q:'SYCT S AAACT=SYCT
...S AAACT=AAACT+1,^PS(50.7,AAAMATCH,2,AAACT,0)=SYNONYM,^PS(50.7,AAAMATCH,2,"B",SYNONYM,AAACT)=""
.I AAAFLAG S ATOTAL=0 F AAACT=0:0 S AAACT=$O(^PS(50.7,AAAMATCH,2,AAACT)) Q:'AAACT S ATOTAL=ATOTAL+1
.I AAAFLAG,ATOTAL S ^PS(50.7,AAAMATCH,2,0)="^50.72^"_ATOTAL_"^"_ATOTAL
.I 'AAAFLAG D
..K DIC S DIC="^PS(50.7,",X=SOLNAME,DIC(0)="L",DIC("DR")=".02////"_DFPTR_";.03////1" K DD,DO D FILE^DICN K DIC S SPDIEN=+Y
..Q:'SPDIEN
..K DIE S DIE="^PS(52.7,",DA=SOLIEN,DR="9////"_SPDIEN D ^DIE K DIE
..S AAACT=0 F AAA=0:0 S AAA=$O(^PS(52.7,SOLIEN,3,AAA)) Q:'AAA S SYNONYM=$P($G(^(AAA,0)),"^") I SYNONYM'="" S AAACT=AAACT+1 D
...S ^PS(50.7,SPDIEN,2,AAACT,0)=SYNONYM,^PS(50.7,SPDIEN,2,"B",SYNONYM,AAACT)=""
..I AAACT S ^PS(50.7,SPDIEN,2,0)="^50.72^"_AAACT_"^"_AAACT
;FOR SYN, CHECK FOR NOT ALREADY EXISTING!!
;
XREF ; do next line to xref whole file after looping thru ^TMP to populate
;******************DON'T EVEN DO THIS *******************
;I $D(PSLOAD) S DIK="^PS(50.7," D IXALL^DIK K DIK
Q
;
DUPL ; see if there's already an orderable item with the same name and dosage form
N OLDDF S SPDIEN="" F S SPDIEN=$O(^PS(50.7,"B",SOLNAME,SPDIEN)) Q:SPDIEN="" S OLDDF=$P(^PS(50.7,SPDIEN,0),"^",2) I OLDDF=DF S ^PS(50.7,"AIV",1,SOLIEN)="" Q
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSSPOI 5501 printed Nov 22, 2024@17:43:54 Page 2
PSSPOI ;BIR/RLW-CREATE PHARMACY ORDERABLE ITEMS ; 09/01/98 7:10
+1 ;;1.0;PHARMACY DATA MANAGEMENT;**15**;9/30/97
EN ;
+1 ; variable prefixes: ADD=iv additive file SOL=iv solution file
+2 ; PD=primary drug file DD=dispense drug file
+3 ; NDF=national drug file DF=NDF dosage form
+4 ; SPD=pharmacy orderable item file SYN=synonym
+5 ;
LIVE ; populate PHARMACY ORDERABLE ITEM file, tie dispense drug to it
+1 ; loop thru ^TMP global to build 50.7
+2 NEW J,ADDIEN,ADDNAME,DDIEN,DDNAME,PDIEN,PDNAME,PDNAMEDF,NDF,NDFVA,DF,DFNAME,SPDNAME,X,PSMATCH,SOLIEN,SOLNAME,SPD,SPDFN,SYNIEN,SYNONYM
+3 SET PDNAMEDF=""
FOR
SET PDNAMEDF=$ORDER(^TMP("PSSD",$JOB,PDNAMEDF))
if PDNAMEDF=""
QUIT
SET DFNAME=$PIECE(PDNAMEDF,"~",2)
SET PDNAME=$PIECE(PDNAMEDF,"~")
if DFNAME=""
QUIT
SET (DF,DDNAME,SPDNAME)=""
SET DF=$ORDER(^PS(50.606,"B",DFNAME,DF))
Begin DoDot:1
+4 FOR I=$LENGTH(PDNAME):-1:1
if $EXTRACT(PDNAME,I)'=" "
QUIT
+5 SET SPDNAME=$EXTRACT(PDNAME,1,I)
+6 SET Y=-1
SET SPDIEN=""
IF '$DATA(^PS(50.7,"ADF",SPDNAME,DF))
SET DIC="^PS(50.7,"
SET DIC(0)="L"
SET DIC("DR")=".02////"_DF
SET X=SPDNAME
KILL DD,DO
DO FILE^DICN
KILL DIC
if +Y>0
SET SPDIEN=+Y
+7 if 'SPDIEN
SET SPDIEN=$ORDER(^PS(50.7,"ADF",SPDNAME,DF,SPDIEN))
+8 SET SYNIEN=0
SET PDIEN=""
SET PDIEN=$ORDER(^PS(50.3,"B",PDNAME,PDIEN))
if PDIEN=""
QUIT
Begin DoDot:2
+9 SET Y=0
SET Y=$ORDER(^PS(50.3,PDIEN,1,"B","U",Y))
if Y
SET Y=$GET(^PS(50.3,PDIEN,1,Y,0))
SET $PIECE(^PS(50.7,SPDIEN,0),"^",5,8)=$PIECE(Y,"^",5,8)
+10 SET SYNIEN=$ORDER(^PS(50.3,PDIEN,2,SYNIEN))
if 'SYNIEN
QUIT
IF '$DATA(^PS(50.7,SPDIEN,2,0))
SET ^(0)="^50.72^1^1"
SET SYNONYM=$GET(^PS(50.3,PDIEN,2,SYNIEN,0))
SET ^PS(50.7,SPDIEN,2,1,0)=SYNONYM
SET J=1
SET ^PS(50.7,SPDIEN,2,"B",SYNONYM,J)=""
+11 IF SYNIEN
FOR
SET SYNIEN=$ORDER(^PS(50.3,PDIEN,2,SYNIEN))
if 'SYNIEN
QUIT
SET J=J+1
SET SYNONYM=$GET(^PS(50.3,PDIEN,2,SYNIEN,0))
SET ^PS(50.7,SPDIEN,2,J,0)=SYNONYM
SET ^PS(50.7,SPDIEN,2,"B",SYNONYM,J)=""
FOR I=3,4
SET $PIECE(^PS(50.7,SPDIEN,2,0),"^",3,4)=J_"^"_J
End DoDot:2
+12 IF SPDIEN
FOR
SET DDNAME=$ORDER(^TMP("PSSD",$JOB,PDNAMEDF,DDNAME))
if DDNAME=""
QUIT
SET DDIEN=""
SET DDIEN=$ORDER(^PSDRUG("B",DDNAME,DDIEN))
if 'DDIEN
QUIT
SET DIE="^PSDRUG("
SET DA=DDIEN
SET DR="2.1////"_SPDIEN
DO ^DIE
KILL DIE
+13 QUIT
End DoDot:1
+14 ;
IVADD ; populate IV Additives, Solutions
+1 SET X1=DT
SET X2=-365
DO C^%DTC
SET PIND=X
KILL X1,X2
+2 ;***********DON'T EVEN USE TMP GLOBAL ************
+3 FOR ADDIEN=0:0
SET ADDIEN=$ORDER(^PS(52.6,ADDIEN))
if 'ADDIEN
QUIT
SET DDIEN=+$PIECE($GET(^PS(52.6,ADDIEN,0)),"^",2)
IF DDIEN
IF $DATA(^PSDRUG(DDIEN,0))
Begin DoDot:1
+4 SET NDND=$GET(^PSDRUG(DDIEN,"ND"))
if '$PIECE(NDND,"^")!('$PIECE(NDND,"^",3))
QUIT
+5 SET DA=$PIECE(NDND,"^",1)
SET K=$PIECE(NDND,"^",3)
SET X=$$PSJDF^PSNAPIS(DA,K)
if 'X
QUIT
+6 SET DFPTR=+$PIECE(X,"^")
if 'DFPTR!('$DATA(^PS(50.606,+DFPTR,0)))
QUIT
+7 SET ADDNAME=$PIECE($GET(^PS(52.6,ADDIEN,0)),"^")
if ADDNAME=""
QUIT
+8 SET PDT=+$PIECE($GET(^PS(52.6,ADDIEN,"I")),"^")
IF PDT
IF PDT<PIND
QUIT
+9 SET AAAFLAG=0
FOR AAA=0:0
SET AAA=$ORDER(^PS(50.7,"ADF",ADDNAME,DFPTR,AAA))
if 'AAA!(AAAFLAG)
QUIT
if $PIECE($GET(^PS(50.7,AAA,0)),"^",3)
SET AAAFLAG=1
+10 if AAAFLAG
QUIT
+11 SET DIC="^PS(50.7,"
SET X=ADDNAME
SET DIC(0)="L"
SET DIC("DR")=".02////"_DFPTR_";.03////1"
KILL DD,DO
DO FILE^DICN
KILL DIC
SET SPDIEN=+Y
+12 if 'SPDIEN
QUIT
+13 KILL DIE
SET DIE="^PS(52.6,"
SET DA=ADDIEN
SET DR="15////"_SPDIEN
DO ^DIE
KILL DIE
+14 ;NOW, LOOP THRU 3 NODE FOR SYNONYM
+15 SET AAACT=0
FOR AAA=0:0
SET AAA=$ORDER(^PS(52.6,ADDIEN,3,AAA))
if 'AAA
QUIT
SET SYNONYM=$PIECE($GET(^(AAA,0)),"^")
IF SYNONYM'=""
SET AAACT=AAACT+1
Begin DoDot:2
+16 SET ^PS(50.7,SPDIEN,2,AAACT,0)=SYNONYM
SET ^PS(50.7,SPDIEN,2,"B",SYNONYM,AAACT)=""
End DoDot:2
+17 IF AAACT
SET ^PS(50.7,SPDIEN,2,0)="^50.72^"_AAACT_"^"_AAACT
End DoDot:1
+18 KILL PIND,PDT
+19 ;
IVSOL ;
+1 ;****************DON'T EVEN USE TMP GLOBAL **********
+2 ;DO SAME AS ADDITIVES, BUT IF DATAISIN ADF WITH A ONE, MATCH AND DO SYN, IF NOT CREATE,MATCH AND DO SYN
+3 FOR SOLIEN=0:0
SET SOLIEN=$ORDER(^PS(52.7,SOLIEN))
if 'SOLIEN
QUIT
SET DDIEN=+$PIECE($GET(^PS(52.7,SOLIEN,0)),"^",2)
IF DDIEN
IF $DATA(^PSDRUG(DDIEN,0))
Begin DoDot:1
+4 SET NDND=$GET(^PSDRUG(DDIEN,"ND"))
if '$PIECE(NDND,"^")!('$PIECE(NDND,"^",3))
QUIT
+5 SET DA=$PIECE(NDND,"^",1)
SET K=$PIECE(NDND,"^",3)
SET X=$$PSJDF^PSNAPIS(DA,K)
if 'X
QUIT
+6 SET DFPTR=+$PIECE(X,"^")
if 'DFPTR!('$DATA(^PS(50.606,+DFPTR,0)))
QUIT
+7 SET SOLNAME=$PIECE($GET(^PS(52.7,SOLIEN,0)),"^")
if SOLNAME=""
QUIT
+8 SET (AAAFLAG,AAAMATCH)=0
FOR AAA=0:0
SET AAA=$ORDER(^PS(50.7,"ADF",SOLNAME,DFPTR,AAA))
if 'AAA!(AAAFLAG)
QUIT
IF $PIECE($GET(^PS(50.7,AAA,0)),"^",3)
SET AAAFLAG=1
SET AAAMATCH=AAA
+9 IF AAAFLAG
Begin DoDot:2
+10 KILL DIE
SET DIE="^PS(52.7,"
SET DA=SOLIEN
SET DR="9////"_AAAMATCH
DO ^DIE
KILL DIE
+11 FOR AAA=0:0
SET AAA=$ORDER(^PS(52.7,SOLIEN,3,AAA))
if 'AAA
QUIT
SET SYNONYM=$PIECE($GET(^(AAA,0)),"^")
IF SYNONYM'=""
IF '$ORDER(^PS(50.7,AAAMATCH,2,"B",SYNONYM,0))
Begin DoDot:3
+12 SET AAACT=0
FOR SYCT=0:0
SET SYCT=$ORDER(^PS(50.7,AAAMATCH,2,SYCT))
if 'SYCT
QUIT
SET AAACT=SYCT
+13 SET AAACT=AAACT+1
SET ^PS(50.7,AAAMATCH,2,AAACT,0)=SYNONYM
SET ^PS(50.7,AAAMATCH,2,"B",SYNONYM,AAACT)=""
End DoDot:3
End DoDot:2
+14 IF AAAFLAG
SET ATOTAL=0
FOR AAACT=0:0
SET AAACT=$ORDER(^PS(50.7,AAAMATCH,2,AAACT))
if 'AAACT
QUIT
SET ATOTAL=ATOTAL+1
+15 IF AAAFLAG
IF ATOTAL
SET ^PS(50.7,AAAMATCH,2,0)="^50.72^"_ATOTAL_"^"_ATOTAL
+16 IF 'AAAFLAG
Begin DoDot:2
+17 KILL DIC
SET DIC="^PS(50.7,"
SET X=SOLNAME
SET DIC(0)="L"
SET DIC("DR")=".02////"_DFPTR_";.03////1"
KILL DD,DO
DO FILE^DICN
KILL DIC
SET SPDIEN=+Y
+18 if 'SPDIEN
QUIT
+19 KILL DIE
SET DIE="^PS(52.7,"
SET DA=SOLIEN
SET DR="9////"_SPDIEN
DO ^DIE
KILL DIE
+20 SET AAACT=0
FOR AAA=0:0
SET AAA=$ORDER(^PS(52.7,SOLIEN,3,AAA))
if 'AAA
QUIT
SET SYNONYM=$PIECE($GET(^(AAA,0)),"^")
IF SYNONYM'=""
SET AAACT=AAACT+1
Begin DoDot:3
+21 SET ^PS(50.7,SPDIEN,2,AAACT,0)=SYNONYM
SET ^PS(50.7,SPDIEN,2,"B",SYNONYM,AAACT)=""
End DoDot:3
+22 IF AAACT
SET ^PS(50.7,SPDIEN,2,0)="^50.72^"_AAACT_"^"_AAACT
End DoDot:2
End DoDot:1
+23 ;FOR SYN, CHECK FOR NOT ALREADY EXISTING!!
+24 ;
XREF ; do next line to xref whole file after looping thru ^TMP to populate
+1 ;******************DON'T EVEN DO THIS *******************
+2 ;I $D(PSLOAD) S DIK="^PS(50.7," D IXALL^DIK K DIK
+3 QUIT
+4 ;
DUPL ; see if there's already an orderable item with the same name and dosage form
+1 NEW OLDDF
SET SPDIEN=""
FOR
SET SPDIEN=$ORDER(^PS(50.7,"B",SOLNAME,SPDIEN))
if SPDIEN=""
QUIT
SET OLDDF=$PIECE(^PS(50.7,SPDIEN,0),"^",2)
IF OLDDF=DF
SET ^PS(50.7,"AIV",1,SOLIEN)=""
QUIT
+2 QUIT