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

DITCP.m

Go to the documentation of this file.
  1. DITCP ;MSC/GFT - Namespace/UCI comparer run code ;26JAN2016
  1. ;;22.2;VA FileMan;;Jan 05, 2016;Build 42
  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. ;
  1. EN(DI1,DI2,DIDD,DIFLAG,DITCPT) ; Main Entry Point
  1. ;DI1 & DI2 are left & right roots
  1. ;DIFLAG[1 -->compare files [2-->compare entries ["L" --> IGNORE EXTRA ENTRIES ON RIGHT SIDE
  1. ;DITCPT is array of TITLES, called by reference
  1. N I '$D(@DI1),'$D(@DI2) Q
  1. N I,DIR,DID,W,DIL,DIN1,DIN2,DIV1,DIV2,DIGL,DIDDN,DIO,DIV,DIT,DIOX,DITM,DIN,D1,D2
  1. K DIRUT
  1. S DIL=+DIFLAG
  1. I '$D(DITCPT(1)),$G(DITCPT)'>DIL D
  1. .I DIDD S DITCPT(1)="ENTRIES IN FILE #"_DIDD_" ("_$P($G(^DIC(DIDD,0)),U)_")"
  1. .E S X="" D S DITCPT(1)="DATA DICTIONARY #"_$QS(DI2,1)_" ("_X_")"
  1. ..S I=$NA(@DI1,1) I '$D(@I@(0,"NM")) S I=$NA(@DI2,1)
  1. ..F S X=X_$O(@I@(0,"NM",0)) Q:'$D(@I@(0,"UP")) S X=X_" SUBFIELD" Q
  1. ;
  1. KILL S DIV=$D(^DD(DIDD,.001)),(DIOX,U)="^",IOM=$G(IOM,80) F S X=$O(^UTILITY("DITCP",$J,DIL)) Q:$D(DIRUT)!'X K ^(X)
  1. I '$D(@DI1) D Q
  1. .S D1="{Missing}" I '$D(@DI2) S D2="{Also Missing}" D WB Q
  1. .I DIL#2 S D2="" D WB Q
  1. .S DIN2=$QS(DI2,$QL(DI2)),DIGL=0,DIN=1 D RIGHT(DI2)
  1. I '$D(@DI2) D Q
  1. .I DIL#2 S D1="",D2="{Missing}" D WB Q
  1. .S DIGL=0,DIN=1,^UTILITY("DITCP",$J,"X1",DIDD,$QS(DI1,$QL(DI1)))=$P(@DI1@(0),U) G END
  1. I 'DIDD,DIL=1 D
  1. .N P,DITCPL F X=1,2 S Y=@("DI"_X),P=1,%="" D S P(X)=P-1
  1. ..F S %=$O(@Y@(0,"ID",%)) Q:%="" S A=$S(+%=%:%,1:+$P(%,"WDI",2)) S:$D(@Y@(A,0))=1 DITCPL(X,P)=$S(A:$P($G(@Y@(A,0)),U),1:%_" (Display only)"),P=P+1
  1. .I DIFLAG'["L"!$D(DITCPL(1)) D DITCPL("IDENTIFIERS")
  1. .F P="DIC","ACT" K DITCPL M DITCPL(1,1)=@DI1@(0,P),DITCPL(2,1)=@DI2@(0,P) I DIFLAG'["L"!$D(DITCPL(1)) D DITCPL($S(P="DIC":"SPECIAL LOOKUP",1:"POST-SELECTION ACTION"))
  1. S I DIL#2 S DIN1=$O(@DI1@(0)) K ^UTILITY("DITCP",$J,DIL) G ENTRY ;WE ARE AT ROOT OF A (SUB)-FILE FIND 1ST ENTRY ON LEFT SIDE
  1. S (DIN1,DIN2)=-1
  1. I DIL'<DIFLAG D ;Build a header for this Entry
  1. .N D,O S D=$G(DIDD(DIL),DIDD),O=$G(@DI2@(0)) I D-.1 S O=$P(O,U,1,D=.11+1) ;For INDEX, take FILE + NAME field
  1. .I 'D S O="FIELD: "_O
  1. ENTRYNAM .E S O=$O(^DD(D,0,"NM",0))_": "_$$EXT(O,.01,2) I D=.4!(D=.401)!(D=.402) S D=$P($G(@DI1@(0)),U,4) S:D O=O_" (File "_D_")"
  1. .I DIV S O=O_" (#"_$QS(DI2,$QL(DI2))_")"
  1. .S DITCPT(DIL)=O
  1. G INPUT:DIDD=.402,SORT:DIDD=.401,PRINT:DIDD=.4
  1. GET2D S DIN1=$O(@DI1@(DIN1)),DIN2=$O(@DI2@(DIN2))
  1. ;NOW CHECK IF WE'RE AT THE SAME NODE ON BOTH SIDES
  1. NEXTD G END:$D(DIRUT) I DIN1=DIN2 G UP:DIN1="",D2:$D(@DI2@(DIN2))>9 S DIV2=@DI2@(DIN2),DIV1=@DI1@(DIN1) G GET2D:DIV2=DIV1 S DIN="",DIGL=DIN1 D G GET2D
  1. .F S DIN=$O(^DD(DIDD,"GL",DIGL,DIN)) Q:DIN="" D
  1. ..I 'DIN S %X=+$E(DIN,2,9),%Y=$P(DIN,",",2),D2=$E(DIV2,%X,%Y),D1=$E(DIV1,%X,%Y)
  1. ..E S D1=$P(DIV1,U,DIN),D2=$P(DIV2,U,DIN) I DIN=2 S:DIDD=0 D1=$TR(D1,"a"),D2=$TR(D2,"a") I DIDD=.4031 D BLOCK(D1) ;SPECIFIER OR HEADER BLOCK
  1. ..I D1'=D2 D:D1]""!(DIFLAG'["L") DIO12($$TITLE) Q
  1. .I DIGL=0,'DIDD S D1=$P(DIV1,U,5,99),D2=$P(DIV2,U,5,99) Q:D1=D2 D DIO12($S($P(DIV1,U,2)["C":"COMPUTED EXPRESSION",1:"INPUT TRANSFORM")) Q
  1. D X G END:$D(DIRUT),NEXTD
  1. ;
  1. D2 G ENTRY:DIL#2 S Y=$O(^DD(DIDD,"GL",DIN1,0,0)) ;DOWN TO A MULTIPLE FIELD
  1. I Y,$D(^DD(DIDD,+Y,0)) S Y=$P(^(0),U,2) I Y]"",Y-.15,$D(^DD(+Y,.01,0)) G WP:$P(^(0),U,2)["W" D DN S DIDD=+Y G S
  1. G GET2D
  1. ;
  1. WP S X=$P(^(0),U),%Y=0
  1. F %X=0:0 S %X=$O(@DI1@(DIN1,%X)) Q:$D(^(+%X,0))[0 S I=^(0),%Y=$O(@DI2@(DIN2,%Y)) G WPD:$G(^(+%Y,0))'=I ;IS EVERY LINE IDENTICAL?
  1. G GET2D:'$O(@DI2@(DIN2,%Y))
  1. WPD D SUBHD W !?IOM-$L(X)\2,X,"..."
  1. G GET2D
  1. ;
  1. ;
  1. ;
  1. ;
  1. ENTRY S DIGL=0,DIN=1 G NEXTENT:'$D(@DI1@(+DIN1,0)) S X=$P(^(0),U) I DIDD=.11,$G(DITCPIF),DITCPIF-X G NEXTENT ;Skip INDEXes not for this DD
  1. I DIDD=.4032 D D BLOCK(X) G NEXTENT
  1. .N V S V=$$EXT(X,.01,1) I V]"" S V=$O(@($$NS(2)_"DIST(.404,""B"",V,0)")) I V S X=V
  1. .S ^UTILITY("DITCP",$J,DIL,X)=""
  1. S DIV=$D(^DD(DIDD,.001)) G UP:DIDD=.4032!(DIDD=19.01) ;for now, give up matching BLOCKS or MENUS
  1. I DIDD=.1 S DIN2=+DIN1,X=@DI1@(DIN1,0) G NEW:'$D(@DI2@(DIN2,0)),NEW:^(0)'=X,OLD ;CROSS-REFERENCE matches on entire 0 node
  1. BIX I $P($G(@DI2@(DIN1,0)),U)=X S DIN2=DIN1 G OLD:$$MATCH,NEW:DIV
  1. I $P(^DD(DIDD,.01,0),U,2)["P" S MSCP=$$EXT(X,.01,1) F DIN2=0:0 S DIN2=$O(@DI2@(DIN2)) G NEW:DIN2'>0 I $$EXT($P($G(^(DIN2,0)),U),2)=MSCP G OLD:$$MATCH
  1. S DIN2=0 I '$D(^DD(DIDD,0,"IX","B",DIDD,.01)) F S DIN2=$O(@DI2@(DIN2)) G NEW:DIN2'>0 I $P($G(^(DIN2,0)),U)=X G OLD:$$MATCH
  1. BI S DIN2=$O(@DI2@("B",X,DIN2)) G NMATCH:DIN2,NEW:$L(X)<31 F S DIN2=$O(@DI2@("B",$E(X,1,30),DIN2)) G NEW:'DIN2 I $D(@DI2@(DIN2,0)),$P(^(0),X)="",$$MATCH G OLD
  1. NMATCH I $D(@DI2@(DIN2,0)),$P(^(0),X)="" G OLD:$$MATCH ;COMPARE BY NAME
  1. G BI
  1. ;
  1. NEW S ^UTILITY("DITCP",$J,"X1",DIDD,DIN1)=X ;WILL SHOW EXTRA ENTRY ON LEFT SIDE
  1. NEXTENT S DIN1=$O(@DI1@(DIN1))
  1. N2 I DIN1 G ENTRY
  1. I DIFLAG'["L" F DIN2=0:0 S DIN2=$O(@DI2@(DIN2)) Q:'DIN2 Q:+DIN2'=DIN2 D Q:$D(DIRUT) ;Print extras on right
  1. .I '$D(^UTILITY("DITCP",$J,DIL,DIN2)) D RIGHT($NA(@DI2@(DIN2)))
  1. G END:$D(DIRUT),UP
  1. ;
  1. D XTRAM($P(^(0),U,1,$S(DIDD=.1:99,1:1)),2) Q ;If X-REF, compare entire node
  1. ;
  1. XTRAM(DID,X) Q:DIDD=.15 ;FORGET TRIGGERED-BY
  1. F I=DIL+(DIL#2):1 K DITCPT(I) I $O(DITCPT(I))="" Q
  1. I DIDD=.11 S DID="@DI"_X_"@(DIN"_X_",0)",DID=$P(@DID,U,2,3)
  1. S DIDDN=$S(DIDD:$O(^DD(DIDD,0,"NM","")),1:"FIELD")_$S(DIV:" #"_@("DIN"_X),$D(^DIC(DIDD)):"",1:" Multiple")_": ",Y=^DD(DIDD,.01,0) D DIT,DIO
  1. Q
  1. ;
  1. ;
  1. ;
  1. ;
  1. MATCH() I DIV,DIN1'=DIN2 Q 0 ;DO ENTRIES MATCH? NOT IF NUMBERS DON'T AND IT'S NUMBER-MEANINGFUL
  1. I $D(^UTILITY("DITCP",$J,DIL,DIN2)) Q 0 ;We already matched this one
  1. I DIDD=.11 Q '$$MISMATCH(.02) ;INDEX must match on NAME
  1. I DIDD=.403 Q '$$MISMATCH(7) ;FORM must match on PRIMARY FILE
  1. I DIDD=.4!(DIDD=.401)!(DIDD=.402) Q '$$MISMATCH(4) ;TEMPLATES must match on FILE
  1. I DIDD=19 Q 1 ;OPTION matches on NAME alone
  1. S DITM=.01
  1. ID S DITM=$O(^DD(DIDD,0,"ID",DITM)) I DITM="" Q 1
  1. S I=DITM S:I?1"W"1.NP I=$E(I,2,99) I $$MISMATCH(I) Q 0 ;MATCH EACH NON-NULL IDENTIFIER
  1. G ID
  1. ;
  1. MISMATCH(I) K B S A=$P($G(^DD(DIDD,I,0)),U,2) I A=""!(A["V") Q 0 ;DON'T TRY TO MATCH POINTERS
  1. I A["P" S A=+$P(A,"P",2) I '$D(^DD(A,.001)) Q 0
  1. D Q:W="" 0 S B=W Q:'$D(^DD(DIDD,I,0)) 0 D Q:W="" 0 Q W'=B ;If two non-null values aren't equal it's a mismatch
  1. .S A=$P(^(0),U,4),%=$P(A,";",2),W=$P(A,";"),A=$S($D(B):DI2,1:DI1) I W?." " S W="" Q
  1. .I $D(@A@($S($D(B):DIN2,1:DIN1),W))[0 S W="" Q
  1. .I % S W=$P(^(W),U,%)
  1. .E S W=$E(^(W),+$E(%,2,9),$P(%,",",2))
  1. .S:W?.E1L.E W=$$UP^DILIBF(W)
  1. ;
  1. OLD S ^UTILITY("DITCP",$J,DIL,DIN2)="" ;Remember that we found DIN2 as a match
  1. D DN G S
  1. ;
  1. ;
  1. DN S DIDD(DIL)=DIDD
  1. N X,%X F X=1,2 S %X=@("DIN"_X),(W,W(X,DIL))=@("DI"_X),W=$NA(@W@(%X)),@("DI"_X)=W ;ADD A SUBSCRIPT
  1. S DIL=DIL+1 Q
  1. ;
  1. UP ;
  1. G END:'$D(W(2,DIL-1))
  1. S DIN1=$O(@DI1) I DIL#2=0 S:$G(DITCPT)>DIL DITCPT=DIL D U G N2
  1. D LEFT Q:$D(DIRUT) S DIN2=$O(@DI2),DIDD=DIDD(DIL-1)
  1. D U G NEXTD
  1. U S (DIL,Y)=DIL-1,DI1=W(1,Y),DI2=W(2,Y)
  1. Q
  1. ;
  1. ;
  1. 2 ;
  1. X G XTRA1:DIN2="",XTRA2:DIN1="" I +DIN1=DIN1 G XTRA1:+DIN2'=DIN2!(DIN2>DIN1),XTRA2
  1. G XTRA2:+DIN2=DIN2!(DIN1]DIN2)
  1. XTRA1 S X=1,DIGL=DIN1
  1. D XTRA S DIN1=$O(@DI1@(DIN1)) Q
  1. XTRA2 S X=2,DIGL=DIN2 D:DIFLAG'["L" XTRA S DIN2=$O(@DI2@(DIN2)) Q
  1. ;
  1. XTRA S DIR="@DI"_X_"@(DIGL)" I $D(@DIR)<9 S DIN="",DIV=@DIR G GL
  1. S I=$O(^(DIGL,0)) Q:'I S I=$O(^(I)),DIN=$O(^DD(DIDD,"GL",DIGL,0,0)) Q:$D(^DD(DIDD,+DIN,0))[0
  1. S DIDDN=$P(^(0),U)_$S($P(^DD(+$P(^(0),U,2),.01,0),U,2)["W":"...",1:" Multiple"_$E("s",I>0)),(DID,DIT)="" D DIO S DIOX=0 Q
  1. ;
  1. GL S DIN=$O(^DD(DIDD,"GL",DIGL,DIN)) Q:DIN="" S Y=$O(^(DIN,0)) G GL:'$D(^DD(DIDD,+Y,0)) S DIO=$P(^(0),U)_": "
  1. I DIN S DID=$P(DIV,U,DIN) G:DID="" GL:$P(DIV,U,DIN,999)]"",Q
  1. E S DID=$E(DIV,+$E(DIN,2,9),$P(DIN,",",2)) Q:DID?." "
  1. S DIDDN=$$TITLE G GL:DIDDN="" S DIDDN=DIDDN_": "
  1. D DIO G GL:'$D(DIRUT)
  1. END D LEFT Q:$D(DIRUT)
  1. I 'DIDD,DIFLAG#2 N DITCPIF,DIDD D G ENTRY ;INDEXES for File #DITCPIF
  1. .S DITCPIF=$QS(DI1,1),DIDD=.11,DI1=$NA(@DI1,0)_"(""IX"")",DI2=$NA(@DI2,0)_"(""IX"")",(DIN1,DIN2)=0
  1. Q Q
  1. ;
  1. ;
  1. ;
  1. LEFT N DIN1 F DIN1=0:0 S DIN1=$O(^UTILITY("DITCP",$J,"X1",DIDD,DIN1)) Q:'DIN1 D XTRAM(^(DIN1),1) K ^UTILITY("DITCP",$J,"X1",DIDD,DIN1) Q:$D(DIRUT)
  1. Q
  1. ;
  1. ;
  1. ;
  1. TITLE() S Y=$$FLDNUM I '$D(^DD(DIDD,+Y,0)) Q "" ;decide whether this FIELD is interesting
  1. I $O(^(5,0)) Q "" ;Forget TRIGGERED FIELDS! (INTERESTING!)
  1. I DIDD=.403,Y'>5 Q ""
  1. I DIDD=19,DIGL\1=99!(Y=3.6) Q ""
  1. I 'DIDD,Y=50!(DIGL="DT")!(DIGL=8)!(DIGL=8.5)!(DIGL=9)!(Y=1.1) Q ""
  1. I 'DIDD,Y=.3,$G(DIV1)[":" Q "SET OF CODES" ;INSTEAD OF "POINTER"
  1. S Y=^DD(DIDD,+Y,0) D DIT Q $P(Y,U)
  1. ;
  1. FLDNUM() I DIN]"" Q $O(^DD(DIDD,"GL",DIGL,DIN,0))
  1. Q .01
  1. ;
  1. DIT ;
  1. S DIT=$P(Y,U,2),I=$P(Y,U,3) Q
  1. ;
  1. EXT(X,C,MSCSIDE) I X]"" N Y I C S C=$P($G(^DD(DIDD,C,0)),U,2),Y=X D:$G(MSCSIDE) D:$D(^(0)) S^DIQ I Y]"" Q Y ;101.41 BOMBED IN $$EXTERNAL^DIDU(DIDD,$$FLDNUM,,X)
  1. .F Q:C'["P" Q:'$D(@($$NS(MSCSIDE)_$P(^(0),U,3)_"0)")) S C=$P(^(0),U,2) Q:'$D(^(+Y,0)) S Y=$P(^(0),U),C=$P($G(^DD(+C,.01,0)),U,2)
  1. Q X
  1. ;
  1. NS(MSCSIDE) N N S N=@("DI"_MSCSIDE) I $E(N,2)="[" Q $E(N,1,$F(N,"]")-1) ;returns "^" OR "^[NS]"
  1. Q U
  1. ;
  1. DIO ;X=1 MEANS LEFT SIDE, X=2 MEANS RIGHT SIDE
  1. ;DID=WHAT WE HAVE TO PRINT
  1. S DIOX=$Y D SUBHD Q:$D(DIRUT) S DIO=DIDDN_$$EXT(DID,$$FLDNUM,X)
  1. O ;DIO IS OUTPUT
  1. I X=1 S DIOX(1)=DIDDN D LF
  1. Q:$D(DIRUT)
  1. I X=2 D:$S(DIOX-1:1,'$D(DIOX(1)):1,1:$P(DIO,DIOX(1))]"") LF Q:$D(DIRUT) W ?IOM\2 K DIOX(1)
  1. W $J("",DIL),$E(DIO,1,IOM\2-DIL-1) S DIO=$E(DIO,IOM\2-DIL,999) I $L(DIO)<$S(X=1:17,X=2:2) W DIO S DIOX=X Q ;WRITE A LITTLE MORE THAN HALF A LINE
  1. S DIOX=0 G O
  1. ;
  1. ;
  1. DIO12(T) ;WRITE D1 AND D2 SIDE BY SIDE
  1. N D,V
  1. Q:D1=D2!(T="")
  1. F D=1,2 D
  1. .S V="D"_D Q:@V=""
  1. .S @V=T_": "_$$EXT(@V,$$FLDNUM,D)
  1. Q:D1=D2 ;EXTERNAL VERSIONS MAY BE SAME
  1. WB D SUBHD
  1. F Q:D1=""&(D2="") D LF Q:$D(DIRUT) F D=1,2 S X="D"_D W:D=2 ?IOM\2 W $J("",DIL),$E(@X,1,IOM\2-DIL-1) S @X=$E(@X,IOM\2-DIL,999)
  1. Q
  1. ;
  1. ;
  1. SUBHD ;
  1. N Y,L S Y=$O(DITCPT("")) Q:Y=""
  1. I $G(DITCPT) S L=DITCPT
  1. E S L=Y F Y=$G(DIL):-1:Y D LF G Q:$D(DIRUT)
  1. F Q:L>$G(DIL)!$D(DIRUT) D LF Q:$D(DIRUT) W:$D(DITCPT(L)) ?IOM-$L(DITCPT(L))\2,DITCPT(L) S L=L+1
  1. K DITCPT S DITCPT=L-1 Q ;REMEMBER HOW DEEP WE WERE AT LAST OUTPUT
  1. ;
  1. ;
  1. LF W ! Q:$Y+3<IOSL!$D(DIRUT)
  1. D:$E($G(IOST),1,2)="C-"
  1. .N DIR,X,Y
  1. .S DIR(0)="E" W ! D ^DIR S $Y=0
  1. I '$D(DIRUT) W @IOF
  1. Q
  1. ;
  1. INPUT I $T(GET^DIETED)="" Q
  1. N DITCPL F DITCPL=1,2 D GET^DIETED($NA(DITCPL(DITCPL)),@("DI"_DITCPL))
  1. D DITCPL("EDIT FIELDS") G UP
  1. ;
  1. SORT I $T(GET^DIBTED)="" Q
  1. N DITCPL,DHD,DIBTA,DIBT0,MSCS F DITCPL=1,2 D
  1. .S DIBTA=$NA(DITCPL(DITCPL))
  1. .S DIBT0=-(DITCPL/10+$J) K ^DIBT(DIBT0) M ^DIBT(DIBT0)=@("@DI"_DITCPL),MSCS(DITCPL)=^DIBT(DIBT0,"O") ;GRAB SORT TEMPLATES INTO NEGATIVELY-NUMBERED ^DIBT NODE!
  1. .D GET^DIBTED(DIBTA) K ^DIBT(DIBT0)
  1. D DITCPL("SORT FIELDS")
  1. K DITCPL M DITCPL=MSCS D DITCPL("SEARCH SPECIFICATIONS")
  1. G UP
  1. ;
  1. PRINT I $T(GET^DIPTED)'["," Q
  1. N DITCPL,DISH,DHD F DITCPL=1,2 D GET^DIPTED($NA(DITCPL(DITCPL)),@("DI"_DITCPL))
  1. D DITCPL("PRINT FIELDS") G UP
  1. ;
  1. DITCPL(H) D EN^DITCPL("DITCPL(1)","DITCPL(2)",H)
  1. Q
  1. ;
  1. BLOCK(X) N D S D=DIL+(DIL#2=0)+1 N DIL S DIL=D,DIDD(DIL)=DIDD S:$G(DITCPT)>2 DITCPT=2 D E(.404,$P($G(^DIST(.404,+X,0)),U)) ;compare ScreenMan BLOCKs
  1. Q
  1. E(XPDI,NAME,DIFL) N X,N,MSC,S Q:NAME=""!'XPDI
  1. S MSCF=$G(^DIC(XPDI,0,"GL")) Q:MSCF'?1"^".E S MSCF=$E($$CREF^DILF(MSCF),2,99)
  1. F X=1,2 S N=$$NS(X)_MSCF D S:'S S=-999 S MSC(X)=$NA(@N@(S))
  1. .F S=0:0 S S=$O(@N@("B",NAME,S)) Q:'S Q:'$G(DIFL) Q:XPDI<.4!(XPDI>.402) Q:$P($G(@N@(S,0)),U,4)=DIFL ;TEMPLATE FILE# MUST MATCH
  1. D EN(MSC(1),MSC(2),XPDI,$G(DIL,2),.DITCPT)
  1. Q
  1. ;
  1. ;
  1. UCI ;
  1. G ^DITCP0