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

DIVR.m

Go to the documentation of this file.
  1. DIVR ;OIFO/GFT - VERIFY FIELD DIFLD, DATA DICTIONARY A ; Aug 09, 2022@08:21
  1. ;;22.2;VA FileMan;**2,5,23**;Jan 05, 2016;Build 2
  1. ;;Per VA Directive 6402, this routine should not be modified.
  1. ;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
  1. ;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
  1. ;;Licensed under the terms of the Apache License, Version 2.0.
  1. ;;GFT;**7,999,1004,1014,1015,1038,1041,1053,1054**
  1. ;
  1. ;'DQI' PARAMETER IS '1' WHEN CALLED FROM ALLFLDS+4^DIV
  1. BEGIN I $D(DIVFIL)[0 N DIVDAT,DIVFIL,DIVMODE,DIVPG,POP D G:$G(POP) Q^DIV
  1. . S DIVMODE="C"
  1. . D DEVSEL^DIV Q:$G(POP)
  1. . D INIT^DIV
  1. N W,I,J,V,DIVREQK,DIVTYPE,DIVTMP,DG,DIVRIX,T,TYP,E,DDC,DIVZ,DE,DR,P4,M,DIDANGL,DIVROUTT,DIPA
  1. S TYP=$P($G(^DD(A,DIFLD,0)),U,2) I TYP="" Q
  1. D IJ^DIUTL(A) S V=$O(J(""),-1)
  1. F T="N","D","P","S","V","F" Q:TYP[T
  1. F W="FREE TEXT","SET OF CODES","DATE","NUMERIC","POINTER","VARIABLE POINTER","K","" I TYP[$E(W) S:W="K" T=W,W="MUMPS" Q
  1. I TYP["C" Q
  1. TYPE S %=+$P(TYP,"t",2) I %,$D(^DI(.81,%,0)) S T="F",W=$P(^(0),U)_" Data Type"
  1. W "--FIELD #",DIFLD," ",$$LABEL^DIALOGZ(A,DIFLD),"-- (",W,")"
  1. S W="W !,""ENTRY#"_$S(V:"'S",1:"")_""",?10,"""_$$LABEL^DIALOGZ(A,.01)_""",?40,""ERROR"",!"
  1. D LF Q:$D(DIRUT) S T=$E(T),DIVZ=$P(^DD(A,DIFLD,0),U,3),DDC=$P(^(0),U,5,999),DR=$P(^(0),U,2),P4=$P(^(0),U,4)
  1. I DR["t" S DDC="N DIQUIET S DIQUIET=1 "_$$VALINT^DIETLIBF(A,DIFLD),DIVROUTT=$$OUTPUT^DIETLIBF(A,DIFLD)
  1. OUTT E I $G(^DD(A,DIFLD,2))]"" S DIVROUTT=^(2)
  1. S DIVREQK=$D(^DD("KEY","F",A,DIFLD))>9
  1. I $D(^DD("IX","F",A,DIFLD)) D
  1. . S DIVTYPE=T,T="INDEX",DIVROOT=$$FROOTDA^DIKCU(A)
  1. . D LOADVER^DIVC(A,DIFLD,"DIVTMP")
  1. F %=0:0 S %=$O(^DD(A,DIFLD,1,%)) Q:%'>0 I $D(^(%,1)) D
  1. .N X S X=$P(^(0),U,2,9) Q:X'?1.A
  1. .I ^(2)?1"K ^".E1")",^(1)?1"S ^".E D
  1. ..S DG(%)="I $D("_$E(^(2),3,99)_"),"_$E(^(1),3,99) I 'V S DIVRIX(X)="" ;Only looks at top-level X-refs
  1. UNIQ ..I DR["U",DIFLD=.01,X="B" S DDC="K % M %="_DIU_"""B"",X) K %(DA) K:$O(%(0)) X I $D(X) "_DDC
  1. I T'="INDEX",'$D(^(+$O(^DD(A,DIFLD,1,0)),1)) G E
  1. I T'="INDEX",'$D(DG) W $C(7)_"(CANNOT CHECK"
  1. E W "(CHECKING"
  1. W " CROSS-REFERENCE)" D LF I $D(DIRUT) Q:$D(DQI) G Q
  1. I $D(DG) D
  1. . I T="INDEX" S E=DIVTYPE,DIVTYPE="IX"
  1. . E S E=T,T="IX"
  1. E F Y=$F(DDC,"%DT="""):1 S X=$E(DDC,Y) Q:""""[X I X="E" S $E(DDC,Y)="" Q ;Take out "E"
  1. I DR["*" S DDC="Q" I $D(^DD(A,DIFLD,12.1)) X ^(12.1) I $D(DIC("S")) S DDC(1)=DIC("S"),DDC="X DDC(1) E K X"
  1. D 0 S X=P4,Y=$P(X,";",2),X=$P(X,";")
  1. I +X'=X S X=""""_X_"""" I Y="" S DE=DE_"S X=DA D R" G XEC
  1. S DIDANGL="S X=$S($D(^(DA,"_X_")):$"_$S(Y:"P(^("_X_"),U,"_Y,1:"E(^("_X_"),"_$E(Y,2,9))_"),1:"""")",M=DIDANGL_" D R"
  1. I $L(M)+$L(DE)>250 S DE=DE_"X DE(1)",DE(1)=M
  1. E S DE=DE_M
  1. XEC K DIC,M,Y XECUTE DE_" Q:$G(DIRUT)" Q:$G(DIRUT)
  1. ;
  1. DANGL S DIVRIX="A" F S DIVRIX=$O(DIVRIX(DIVRIX)) Q:DIVRIX="" D Q:$G(DIRUT) ;LOOK FOR BAD CROSS-REFERENCES
  1. .N IX,SN,SX,DA
  1. .S IX=I(0)_""""_DIVRIX_""")",SN=$QL(IX)
  1. .K ^UTILITY("DIVRIX",$J)
  1. .F S IX=$Q(@IX) Q:IX="" Q:$QS(IX,SN)'=DIVRIX D Q:$G(DIRUT)
  1. ..I @IX]"" Q
  1. ..S DA=$QS(IX,SN+2),SX=" """_DIVRIX_""" CROSS-REF '"_$QS(IX,SN+1)_"'"
  1. ..I '$D(@(I(0)_DA_")")) S M="DANGLING"_SX D X Q
  1. ..X DIDANGL I $E($QS(IX,SN+1),1,30)'=$E(X,1,30) S M="WRONG"_SX D X Q
  1. ..I $D(^UTILITY("DIVRIX",$J,DA)) S M="DUPLICATE"_SX D X
  1. ..S ^(DA)=""
  1. Q:$D(DQI)
  1. W:'$D(M) $C(7),!,"NO PROBLEMS"
  1. Q S M=$O(^UTILITY("DIVR",$J,0)),E=$O(^(M)),DK=J(0)
  1. I $D(ZTQUEUED) S ZTREQ="@"
  1. E I $T(^%ZISC)]"" D
  1. . D ^%ZISC
  1. E X $G(^%ZIS("C"))
  1. G:'E!$D(DIRUT)!$D(ZTQUEUED) QX K DIBT,DISV D
  1. . N C,D,I,J,L,O,Q,S,D0,DDA,DICL,DIFLD,DIU0
  1. . W ! D S2^DIBT1 Q ;STORE ENTRIES IN TEMPLATE??
  1. S DDC=0 I '$D(DIRUT) G Q:Y<0 F E=0:0 S E=$O(^UTILITY("DIVR",$J,E)) Q:E="" S DDC=DDC+1,^DIBT(+Y,1,E)=""
  1. S:DDC>0 ^DIBT(+Y,"QR")=DT_U_DDC
  1. QX K DIVINDEX,DIVKEY,DIVREQK,DIVROOT,DIVTMP,DIVTYPE
  1. K ^UTILITY("DIVR",$J),^UTILITY("DIVRIX",$J),DIRUT,DIROUT,DTOUT,DUOUT,DK,DQ,P,DR Q
  1. ;
  1. R Q:$D(DIRUT) ;Tag XEC will send us here, for every entry in the file
  1. I X?." " Q:DR'["R"&'DIVREQK D G X
  1. . I X="" S M="Missing"_$S(DIVREQK:" key value",1:"")
  1. . E S M="Equals only 1 or more spaces"
  1. DOTYPE D @T ;WAS A GOTO 'T' = 'N' or 'F' or 'S', etc
  1. I $Y+4>IOSL D LF
  1. Q
  1. ;
  1. P I @("$D(^"_DIVZ_"X,0))") S Y=X G F
  1. S M="No '"_X_"' in pointed-to File" G X
  1. ;
  1. S S Y=X X DDC I '$D(X) S M=""""_Y_""" fails screen" G X
  1. Q:";"_DIVZ[(";"_X_":") S M=""""_X_""" not in Set" G X
  1. ;
  1. D I X'=+X S M=""""_X_""" not an internal date" G X ;p23
  1. S X=$$DATE^DIUTL(X)
  1. N ;
  1. K ;
  1. F S DQ=X I X'?.ANP S M="Non-printing character" G X ;ALL DATA TYPES FALL THRU TO HERE
  1. X DDC Q:$D(X) ;TRY INPUT TRANSFORM
  1. I $G(DIVROUTT)]"" D Q:$D(X)
  1. .N Y S Y=DQ X DIVROUTT S X=Y X DDC ;TRY OUTPUT-TRANSFORMING, THEN INPUT TRANSFORM (AS WITH ^DD(2,.117), 'COUNTY')
  1. S M=""""_DQ_$S($G(DR)["t":""" is not a valid value",1:""" fails Input Transform")
  1. X I $O(^UTILITY("DIVR",$J,0))="" X W
  1. S X=$S(V:DA(V),1:DA),^UTILITY("DIVR",$J,X)=""
  1. S X=V I @(I(0)_"0)")
  1. DA I 'X D Q
  1. . D LF Q:$D(DIRUT)
  1. . W DA,?10,$S($D(^(DA,0)):$E($P(^(0),U),1,30),1:DA),?40,$E(M,1,IOM-40) ;'M' is the message!
  1. . D:V LF
  1. D LF Q:$D(DIRUT) W DA(X),?10,$S($G(^(DA(X),0))]"":$P(^(0),U),1:"***NO ZERO NODE***") S X=X-1,@("Y=$D(^("_I(V-X)_",0))") G DA
  1. ;
  1. 0 ;
  1. S Y=I(0),DE="",X=V
  1. L S DA="DA" S:X DA=DA_"("_X_")" S Y=Y_DA,DE=DE_"F "_DA_"=0:0 ",%="S "_DA_"=$O("_Y_"))" I V>2 S DE(X+X)=%,DE=DE_"X DE("_(X+X)_")"
  1. E S DE=DE_%
  1. S DE=DE_" Q:"_DA_"'>0 S D"_(V-X)_"="_DA_" "
  1. ;I X=1,DIFLD=.01 S DE=DE_"X P:$D(^(DA(1),"_I(V)_",0)) ",P="S $P(^(0),U,2)="""_$P(^DD(J(V-1),P,0),U,2)_Q
  1. S X=X-1 Q:X<0 S Y=Y_","_I(V-X)_"," G L
  1. ;
  1. IX F %=0:0 S %=$O(DG(%)) Q:+%'>0 X DG(%) I '$T S M=""""_X_""" not properly Cross-referenced" G X
  1. G @E
  1. ;
  1. V I $P(X,";",2)'?1A.AN1"(".ANP,$P(X,";",2)'?1"%".AN1"(".ANP S M=""""_X_""""_" has the wrong format" G X
  1. S M=$S($D(@(U_$P(X,";",2)_"0)")):^(0),1:"")
  1. I '$D(^DD(A,DIFLD,"V","B",+$P(M,U,2))) S M=$P(M,U)_" FILE not in the DD" G X
  1. I '$D(@(U_$P(X,";",2)_+X_",0)")) S M=U_$P(X,";",2)_+X_",0) does not exist" G X
  1. G F
  1. ;
  1. INDEX ;Check new indexes
  1. ;
  1. ;Set DIVINDEX(indexName,index#) = "" for indexes aren't set
  1. ;Set DIVKEY(file#,keyName,uiNumber) = "null" : if key field is null
  1. ; "uniq" : if key is not unique
  1. K DIVKEY,DIINDEX
  1. D VER^DIVC(A,DIVROOT,.DA,"DIVTMP",.DIVINDEX,.DIVKEY)
  1. ;
  1. ;If some indexes aren't set properly, print index info
  1. I $D(DIVINDEX) D K DIVINDEX Q:$D(DIRUT)
  1. . N DIVNAME,DIVNUM
  1. . S DIVNAME="" F S DIVNAME=$O(DIVINDEX(DIVNAME)) Q:DIVNAME="" D Q:$D(DIRUT)
  1. .. S DIVNUM=0 F S DIVNUM=$O(DIVINDEX(DIVNAME,DIVNUM)) Q:'DIVNUM D Q:$D(DIRUT)
  1. ... S M=""""_X_""": "_DIVNAME_" index (#"_DIVNUM_") not properly set"
  1. ... D IER
  1. ;
  1. ;If keys integrity is violated, print key info
  1. I $D(DIVKEY) D K DIVKEY Q:$D(DIRUT)
  1. . N DIVFILE,DIVKNM,DIVPROB,DIVXRNM
  1. . S DIVFILE="" F S DIVFILE=$O(DIVKEY(DIVFILE)) Q:DIVFILE="" D Q:$D(DIRUT)
  1. .. S DIVKNM="" F S DIVKNM=$O(DIVKEY(DIVFILE,DIVKNM)) Q:DIVKNM="" D Q:$D(DIRUT)
  1. ... S DIVXRNM="" F S DIVXRNM=$O(DIVKEY(DIVFILE,DIVKNM,DIVXRNM)) Q:DIVXRNM="" D Q:$D(DIRUT)
  1. .... S DIVPROB=DIVKEY(DIVFILE,DIVKNM,DIVXRNM)
  1. .... S M=""""_X_""": "_$S(DIVPROB="null":"Key values are missing.",1:"Key is not unique.")
  1. .... S M=M_" (File #"_DIVFILE_", Key "_DIVKNM_", Index "_DIVXRNM_")"
  1. .... D IER
  1. ;
  1. ;Continue with checking traditional xrefs (if any) and data type
  1. G @DIVTYPE
  1. ;
  1. IER ;Print info about invalid indexes. (Modeled after DA subroutine above)
  1. N DIVTXT,DIVI,X
  1. ;
  1. ;Wrap message M to within 40 columns
  1. S DIVTXT(0)=M D WRAP^DIKCU2(.DIVTXT,40)
  1. ;
  1. ;If nothing was written yet, write column headers
  1. I $O(^UTILITY("DIVR",$J,0))="" X W
  1. ;
  1. ;Set ^UTILITY("DIVR",$J,topIen)="", X = level#, naked = top level root
  1. S X=$S(V:DA(V),1:DA),^UTILITY("DIVR",$J,X)=""
  1. S X=V I @(I(0)_"0)")
  1. ;
  1. IER1 ;If top level, write record info and message
  1. I 'X D Q
  1. . D LF Q:$D(DIRUT) W DA,?10,$S($D(^(DA,0)):$P(^(0),U),1:DA)
  1. . F DIVI=0:1 Q:$D(DIVTXT(DIVI))[0 D Q:$D(DIRUT)
  1. .. I DIVI D LF Q:$D(DIRUT)
  1. .. W ?40,DIVTXT(DIVI)
  1. . D:V LF
  1. ;
  1. ;Else write subrecord info, decrement level, set naked = ^naked(node,0)
  1. D LF Q:$D(DIRUT)
  1. W DA(X),?10,$P(^(DA(X),0),U) S X=X-1,@("Y=$D(^("_I(V-X)_",0))")
  1. G IER1
  1. ;
  1. LF ;Issue a line feed or EOP read CALLED FROM DIV
  1. I $Y+3<IOSL W ! Q
  1. N DINAKED S DINAKED=$NA(^(0))
  1. I IOST?1"C-".E D
  1. . N DIR,X,Y
  1. . S DIR(0)="E" W ! D ^DIR
  1. ;
  1. I '$D(DIRUT) D
  1. . I $D(ZTQUEUED),$$S^%ZTLOAD S (ZTSTOP,DIRUT)=1
  1. . E W @IOF D HDR
  1. S:DINAKED]"" DINAKED=$S(DINAKED["""""":$O(@DINAKED),1:$D(@DINAKED))
  1. Q
  1. ;
  1. HDR ;Print header
  1. N DIVTAB
  1. S DIVPG=$G(DIVPG)+1
  1. W "VERIFY FIELDS REPORT"
  1. ;
  1. S DIVTAB=IOM-1-$L(DIVFIL)-$L(DIVDAT)-$L(DIVPG)
  1. I DIVTAB>1 W !,DIVFIL_$J("",DIVTAB)_DIVDAT_DIVPG
  1. E W !,DIVFIL,!,$J("",IOM-1-$L(DIVDAT)-$L(DIVPG))_DIVDAT_DIVPG
  1. W !,$TR($J("",IOM-1)," ","-"),!
  1. Q
  1. ;
  1. ;
  1. ;
  1. EN(A,DIFLD,DQI) ;Main Entry Point for VEN version
  1. G BEGIN