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

BMXSQL3.m

Go to the documentation of this file.
  1. BMXSQL3 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ;
  1. ;;4.0;BMX;;JUN 28, 2010
  1. ;
  1. ;
  1. PLEVEL(BMXFF,BMXLVL,BMXRET) ;EP
  1. ;Analyze WHERE statement according to paren level
  1. ;Return a string to guide building of iterator(s)
  1. ;
  1. ;Basically, count the number of OR clauses on the
  1. ;same paren level
  1. ;IN: BMXFF()
  1. ;OUT: BMXLVL(), BMXRET
  1. ;
  1. ;BMXRET = 1&/!2&/!...&/!n clauses
  1. ;BMXLVL(E,"BEGIN")=Index where element E begins
  1. ;BMXLVL(E,"END") =Index where element E ends
  1. ;BMXLVL(E,"ELEMENTS")=Number of subelements in element E
  1. ;
  1. N BMXNOR,BMXNAND,J,C,BMXTMP
  1. N E,L,BMXCNT
  1. ;Test for no ORs or no ANDs
  1. S BMXNOR=1,BMXNAND=1
  1. S J=0 F S J=$O(BMXFF(J)) Q:'+J D ;Q:'BMXNOR Q:'BMXNAND
  1. . I BMXFF(J)="OR" S BMXNOR=0
  1. . I BMXFF(J)="AND" S BMXNAND=0
  1. . Q
  1. ;If no ORs or no ANDs then take all parens out of BMXFF
  1. I ((BMXNOR)!(BMXNAND)) D
  1. . S:$D(BMXFF("INDEX")) BMXTMP("INDEX")=BMXFF("INDEX")
  1. . S J=0,C=0 F S J=$O(BMXFF(J)) Q:'+J D:"(^)"'[BMXFF(J)
  1. . . S C=C+1
  1. . . S BMXTMP(C)=BMXFF(J)
  1. . . S:$D(BMXFF(J,0)) BMXTMP(C,0)=BMXFF(J,0)
  1. . . S:$D(BMXFF(J,"INTERNAL")) BMXTMP(J,"INTERNAL")=BMXFF(J,"INTERNAL")
  1. . . S:$D(BMXFF(J,"TYPE")) BMXTMP(C,"TYPE")=BMXFF(J,"TYPE")
  1. . . S:$D(BMXFF(J,"IEN")) BMXTMP(C,"IEN")=BMXFF(J,"IEN")
  1. . . S:$D(BMXFF(J,"JOIN")) BMXTMP(C,"JOIN")=BMXFF(J,"JOIN")
  1. . . S:$D(BMXFF(J,"JOIN","IEN")) BMXTMP(C,"JOIN","IEN")=BMXFF(J,"JOIN","IEN")
  1. . . ;I $D(BMXFF(J,"JOIN")) D
  1. . . ;. N K S K=0 F S K=$O(BMXFF(J,"JOIN",K)) Q:'+K D
  1. . . ;. . N L S L=0 F S L=$O(BMXFF(J,"JOIN",K,L)) Q:'+L D
  1. . . ;. . . S BMXTMP(C,"JOIN",K,L)=BMXFF(J,"JOIN",K,L)
  1. . . I $D(BMXFF(J,"SET")) D
  1. . . . N BMXSS
  1. . . . S BMXSS="" F S BMXSS=$O(BMXFF(J,"SET",BMXSS)) Q:BMXSS="" D
  1. . . . . S BMXTMP(C,"SET",BMXSS)=BMXFF(J,"SET",BMXSS)
  1. . K BMXFF
  1. . I $D(BMXTMP("INDEX")) S BMXFF("INDEX")=BMXTMP("INDEX")
  1. . S J=0 F S J=$O(BMXTMP(J)) Q:'+J D
  1. . . S BMXFF(J)=BMXTMP(J)
  1. . . S:$D(BMXTMP(J,0)) BMXFF(J,0)=BMXTMP(J,0)
  1. . . S:$D(BMXTMP(J,"TYPE")) BMXFF(J,"TYPE")=BMXTMP(J,"TYPE")
  1. . . I $D(BMXTMP(J,"JOIN")) S BMXFF(J,"JOIN")=BMXTMP(J,"JOIN") S:$D(BMXTMP(J,"JOIN","IEN")) BMXFF(J,"JOIN","IEN")=BMXTMP(J,"JOIN","IEN") S BMXFJ("JOIN",+$P($P(BMXFF(J,0),U,2),"P",2))=J
  1. . . ;I $D(BMXTMP(J,"JOIN")) D
  1. . . ;. N K S K=0 F S K=$O(BMXTMP(J,"JOIN",K)) Q:'+K D
  1. . . ;. . N L S L=0 F S L=$O(BMXTMP(J,"JOIN",K,L)) Q:'+L D
  1. . . ;. . . S BMXFF(J,"JOIN",K,L)=BMXTMP(J,"JOIN",K,L)
  1. . . I $D(BMXTMP(J,"SET")) D
  1. . . . N BMXSS
  1. . . . S BMXSS="" F S BMXSS=$O(BMXTMP(J,"SET",BMXSS)) Q:BMXSS="" D
  1. . . . . S BMXFF(J,"SET",BMXSS)=BMXTMP(J,"SET",BMXSS)
  1. . . I $D(BMXTMP(J,"INTERNAL")) S BMXFF(J,"INTERNAL")=BMXTMP(J,"INTERNAL")
  1. . . I $D(BMXTMP(J,"IEN")) S BMXFF(J,"IEN")=BMXTMP(J,"IEN")
  1. . S BMXFF=C
  1. . Q
  1. ;
  1. ;Remove excess leading and trailing parens
  1. ;Find close paren corresponding to BMXFF(1)
  1. ;If its the last paren, then remove the first and last parens
  1. ;Else, quit
  1. N BMXEND
  1. S BMXEND=0
  1. F Q:'((BMXFF(1)="(")&(BMXFF(BMXFF)=")")) Q:BMXEND D
  1. . S L=1,J=1
  1. . F S J=$O(BMXFF(J)) Q:'+J D:"(^)"[BMXFF(J) Q:BMXEND
  1. . . I BMXFF(J)="(" S L=L+1 Q
  1. . . I BMXFF(J)=")" S L=L-1
  1. . . I L=0,J<BMXFF S BMXEND=1 Q
  1. . . I L=0,J=BMXFF D Q
  1. . . . K BMXFF(1),BMXFF(BMXFF)
  1. . . . F J=2:1:BMXFF-1 D
  1. . . . . S BMXFF(J-1)=BMXFF(J)
  1. . . . . S:$D(BMXFF(J,0)) BMXFF(J-1,0)=BMXFF(J,0)
  1. . . . . K BMXFF(J)
  1. . . . S BMXFF=BMXFF-2
  1. ;
  1. S BMXRET="",E=1,L=0,BMXCNT=0
  1. K BMXLVL
  1. S J=0 F S J=$O(BMXFF(J)) Q:'+J D
  1. . I BMXFF(J)="(" D Q ;If BMXFF(J) is an open paren
  1. . . S L=1
  1. . . S BMXLVL(E,"BEGIN")=J ;Start position of this expression
  1. . . S BMXCNT=0
  1. . . ;Find corresponding close paren
  1. . . F S J=$O(BMXFF(J)) Q:'+J D Q:L=0
  1. . . . I BMXFF(J)=")" S L=L-1,BMXLVL(E,"END")=J,BMXLVL(E,"ELEMENTS")=BMXCNT Q
  1. . . . I BMXFF(J)="(" S L=L+1 Q
  1. . . . I "AND^OR"'[BMXFF(J) S BMXCNT=BMXCNT+1
  1. . . S BMXRET=BMXRET_E
  1. . . S E=E+1
  1. . . Q
  1. . I "AND^OR"[BMXFF(J) D Q ;If BMXFF(J) is an operator
  1. . . S BMXRET=BMXRET_$S(BMXFF(J)="OR":"!",1:"&")
  1. . D Q ; BMXFF(J) is an element unenclosed by parens
  1. . . S BMXLVL(E,"BEGIN")=J
  1. . . S BMXLVL(E,"END")=J
  1. . . S BMXLVL(E,"ELEMENTS")=1
  1. . . S BMXRET=BMXRET_E
  1. . . S E=E+1
  1. . Q
  1. Q
  1. ;
  1. XRTST(BMXFF,F,BMXHIT,BMXRNAM,BMXPFP) ;EP
  1. ;Returns TRUE (1) in BMXRET if 'normal' index exists
  1. ;for field in BMXFF(BMXNDX)
  1. ;ELSE returns 0
  1. ;
  1. ;IN: BMXFF
  1. ; F
  1. ;OUT:BMXRET - 1 or 0
  1. ; BMXRNAM - If BMXRET=1, Index name
  1. ;
  1. N BMXNOD0,BMXFNUM,BMXGL,BMXFLDNM,BMXREF,Q
  1. S BMXRET=0,Q=$C(34)
  1. ;
  1. Q:"AND^OR^(^)"[BMXFF(F)
  1. S BMXNOD=BMXFF(F)
  1. S BMXNOD0=BMXFF(F,0)
  1. S BMXFNUM=$P(BMXNOD,U,5)
  1. Q:'+BMXFNUM
  1. S BMXGL=$P(BMXNOD,U,7,8)
  1. S BMXFLDNM=$P(BMXNOD,U,6)
  1. S BMXHIT=0
  1. Q:$D(BMXFF("JOIN"))
  1. Q:$D(BMXFF(F,"INTERNAL"))
  1. I BMXPFF=0,$P(BMXFF(F),U,4)="" Q ;Cannot create iterator on null
  1. I $D(BMXFF(F,"IEN")) S BMXHIT=1 Q
  1. I '$D(^DD(BMXFNUM,BMXFLDNM,1)) Q
  1. I $P(BMXNOD0,U,2)'["P",$D(BMXFF("INDEX")) D Q ;Explicit index
  1. . S BMXRNAM=BMXFF("INDEX")
  1. . S BMXHIT=1
  1. S BMXREF=0
  1. F S BMXREF=$O(^DD(BMXFNUM,BMXFLDNM,1,BMXREF)) Q:'+BMXREF Q:BMXHIT D
  1. . Q:'$D(^DD(BMXFNUM,BMXFLDNM,1,BMXREF,0))
  1. . S BMXRNOD=^DD(BMXFNUM,BMXFLDNM,1,BMXREF,0)
  1. . Q:$P(BMXRNOD,U,3)]""
  1. . S BMXRNAM=$P(BMXRNOD,U,2)
  1. . S BMXTMP=BMXGL_Q_BMXRNAM_Q_")"
  1. . Q:'$D(@BMXTMP)
  1. . S BMXTMPV=0,BMXTMPV=$O(@BMXTMP@(BMXTMPV))
  1. . Q:BMXTMPV=""
  1. . S BMXTMP=BMXGL_Q_BMXRNAM_Q_","_Q_BMXTMPV_Q_")"
  1. . S BMXTMPI=0,BMXTMPI=$O(@BMXTMP@(BMXTMPI))
  1. . S BMXTMP=$S(BMXGL[",":$P(BMXGL,",")_")",1:$P(BMXGL,"("))
  1. . Q:'$D(@BMXTMP@(BMXTMPI))
  1. . S BMXTMPL=$P(BMXFF(F,0),U,4)
  1. . S BMXTMPP=$P(BMXTMPL,";",2)
  1. . S BMXTMPL=$P(BMXTMPL,";")
  1. . Q:BMXTMPL=""
  1. . S BMXTMP=BMXGL_BMXTMPI_")"
  1. . Q:'$D(@BMXTMP@(BMXTMPL))
  1. . S BMXTMPN=@BMXTMP@(BMXTMPL)
  1. . I BMXTMPP["E" D
  1. . . S BMXTMPP=$P(BMXTMPP,"E",2)
  1. . . S BMXTMPP=$E(BMXTMPN,$P(BMXTMPP,","),$P(BMXTMPP,",",2))
  1. . E D
  1. . . S BMXTMPP=$P(BMXTMPN,"^",BMXTMPP)
  1. . I $P(BMXNOD0,U,2)["P" D Q
  1. . . N BMXPFFN
  1. . . S BMXPFF(BMXPFF)=BMXFF(F)
  1. . . S BMXPFF(BMXPFF,0)=BMXFF(F,0)
  1. . . S BMXPFF(BMXPFF,1)=BMXREF
  1. . . S $P(BMXPFF(BMXPFF,1),U,2)=BMXRNAM
  1. . . S BMXPFP(BMXPFP,BMXPFF)=BMXFF(F)
  1. . . S BMXPFP(BMXPFP,BMXPFF,0)=BMXFF(F,0)
  1. . . S BMXPFP(BMXPFP,BMXPFF,1)=BMXREF
  1. . . S $P(BMXPFP(BMXPFP,BMXPFF,1),U,2)=BMXRNAM
  1. . . S BMXPFF=BMXPFF+1
  1. . . S BMXPFFN=$P(BMXNOD0,U,2)
  1. . . S BMXPFFN=+$P(BMXPFFN,"P",2)
  1. . . S $P(BMXPFF(BMXPFF),U,5)=BMXPFFN
  1. . . S $P(BMXPFF(BMXPFF),U,6)=".01"
  1. . . S $P(BMXPFF(BMXPFF),U,7)=^DIC(BMXPFFN,0,"GL")
  1. . . S BMXPFF(BMXPFF,0)=^DD(BMXPFFN,".01",0)
  1. . . S $P(BMXPFP(BMXPFP,BMXPFF),U,5)=BMXPFFN
  1. . . S $P(BMXPFP(BMXPFP,BMXPFF),U,6)=".01"
  1. . . S $P(BMXPFP(BMXPFP,BMXPFF),U,7)=^DIC(BMXPFFN,0,"GL")
  1. . . S BMXPFP(BMXPFP,BMXPFF,0)=^DD(BMXPFFN,".01",0)
  1. . . D XRTST(.BMXPFF,BMXPFF,.BMXHIT,BMXRNAM,.BMXPFP)
  1. . . Q
  1. . I BMXTMPP=BMXTMPV D Q
  1. . . S BMXHIT=1,BMXRET=1
  1. . . I BMXPFF>0 D Q
  1. . . . S BMXPFF(BMXPFF,1)=BMXREF
  1. . . . S $P(BMXPFF(BMXPFF,1),U,2)=BMXRNAM
  1. . . . S BMXPFP(BMXPFP,BMXPFF,1)=BMXREF
  1. . . . S $P(BMXPFP(BMXPFP,BMXPFF,1),U,2)=BMXRNAM
  1. . . Q
  1. . Q
  1. Q
  1. ;
  1. ;
  1. BLDIT(BMXFF,F,BMXRNAM,BMXRET,BMXPFP) ;EP - Build iterator
  1. ;
  1. K BMXRET
  1. N BMXNOD,BMXOP,BMXV,BMXGL,Q
  1. S BMXNOD=BMXFF(F)
  1. S BMXOP=$P(BMXNOD,U,3)
  1. S BMXV=$P(BMXNOD,U,4)
  1. S BMXGL=$P(BMXNOD,U,7,8)
  1. S Q=$C(34)
  1. I $D(BMXPFP(F)) D BLDIT2 Q ;Pointer
  1. ;TODO Set BMXV to the pointer or set or FM date that corresponds
  1. ; to the user-entered value
  1. I $D(BMXFF(F,"IEN")),BMXFF(F,"IEN")="TEMPLATE" D Q
  1. . N BMXTNUM
  1. . S BMXTNUM=$O(^DIBT("B",$P(BMXFF(F),U,4),0))
  1. . S BMXRET="S D0=0 F S D0=$O(^DIBT("_BMXTNUM_",1,D0)) Q:'+D0 Q:BMXM>BMXXMAX "
  1. . Q
  1. I BMXOP="=" D Q
  1. . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" Q:'+D0 Q:BMXM>BMXXMAX " Q
  1. . S BMXRET="S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. . Q
  1. ;
  1. I BMXOP=">=" D Q
  1. . I $D(BMXFF(F,"IEN")) S BMXV=BMXV-1,BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q
  1. . N BMXTMP
  1. . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)"
  1. . S @BMXTMP
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP=">" D Q
  1. . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="<>" D Q
  1. . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 I D0'="_BMXV_" Q:BMXM>BMXXMAX " Q
  1. . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="<=" D Q
  1. . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_BMXV_" Q:BMXM>BMXXMAX " Q
  1. . N BMXTMP
  1. . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))"
  1. . S @BMXTMP
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="<" D Q
  1. . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0'<"_BMXV_" Q:BMXM>BMXXMAX " Q
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="BETWEEN" D Q ;changed '< to > (inclusive BETWEEN)
  1. . I $D(BMXFF(F,"IEN")) D Q
  1. . . S BMXRET="S D0="_(+$P(BMXV,"~")-1)_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX "
  1. . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number
  1. . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q
  1. . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. . E D ;BMXV is a string
  1. . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q
  1. . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="LIKE" D Q
  1. . N BMXTMP,BMXV1
  1. . S BMXV1=BMXV
  1. . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)"
  1. . S @BMXTMP
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX "
  1. Q
  1. ;
  1. BLDIT2 ;Pointer
  1. N BMXPS,J
  1. S BMXPS=$O(BMXPFP(F,999),-1)
  1. S BMXNOD=BMXPFP(F,BMXPS)
  1. S BMXGL=$P(BMXNOD,U,7,8)
  1. I BMXOP="=" D
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . S BMXRET="S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP=">" D
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP=">=" D
  1. . N BMXTMP
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)"
  1. . S @BMXTMP
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="<=" D
  1. . N BMXTMP
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))"
  1. . S @BMXTMP
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="<>" D
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="<" D
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="BETWEEN" D
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number
  1. . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q
  1. . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. . E D ;BMXV is a string
  1. . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q
  1. . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. I BMXOP="LIKE" D
  1. . N BMXTMP,BMXV1
  1. . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2)
  1. . S BMXV1=BMXV
  1. . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)"
  1. . S @BMXTMP
  1. . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX "
  1. ;
  1. F J=BMXPS-1:-1:0 D
  1. . S BMXNOD=BMXPFP(F,J)
  1. . S BMXGL=$P(BMXNOD,U,7,8)
  1. . S BMXRNAM=$P(BMXPFP(F,J,1),U,2)
  1. . S BMXRET=BMXRET_"S D"_J_"=0 F S D"_J_"=$O("_BMXGL_Q_BMXRNAM_Q_",D"_(J+1)_",D"_J_")) Q:'+D"_J_" Q:BMXM>BMXXMAX "
  1. Q
  1. ;TODO: Computed fields
  1. ;TODO: Sets of codes
  1. ;TODO: User-specified index
  1. Q