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

BMXSQL1.m

Go to the documentation of this file.
  1. BMXSQL1 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ;
  1. ;;4.0;BMX;;JUN 28, 2010
  1. ;
  1. ;
  1. KW(BMXTK) ;EP
  1. ;Identify and mark keywords in BMXTK
  1. ;MODIFIES BMXTK
  1. ;
  1. N J,BMXSTOP,BMXTMP
  1. ;Combine ORDER BY and GROUP BY into a single token
  1. ;
  1. S J=0
  1. F S J=$O(BMXTK(J)) Q:'+J D
  1. . S BMXTMP=$$UCASE(BMXTK(J))
  1. . I BMXTMP="ORDER"!(BMXTMP="GROUP") D
  1. . . I $D(BMXTK(J+1)),$$UCASE(BMXTK(J+1))="BY" D
  1. . . . S BMXTK(J)=BMXTK(J)_" "_BMXTK(J+1)
  1. . . . S BMXTK(J)=$$UCASE(BMXTK(J))
  1. . . . S BMXTK(BMXTK(J))=J
  1. . . . K BMXTK(J+1)
  1. . . . Q
  1. . . Q
  1. . Q
  1. ;
  1. ;Find SELECT
  1. S J=0,BMXSTOP=0
  1. F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP
  1. . I $$UCASE(BMXTK(J))="SELECT" D
  1. . . S BMXTK(J)=$$UCASE(BMXTK(J))
  1. . . S BMXTK("SELECT")=J
  1. . . S BMXSTOP=1
  1. . . Q
  1. . Q
  1. I '+J S BMXERR="SELECT KEYWORD NOT FOUND" Q
  1. ;
  1. ;DISTINCT
  1. S BMXSTOP=0
  1. F S J=$O(BMXTK(J)) Q:'+J Q:$$UCASE(BMXTK(J))="FROM" D Q:BMXSTOP
  1. . I $$UCASE(BMXTK(J))="DISTINCT" D
  1. . . S BMXTK("DISTINCT")="TRUE"
  1. . . K BMXTK(J)
  1. . . S J=J-1
  1. . . S BMXSTOP=1
  1. . Q
  1. ;
  1. ;FROM
  1. S BMXSTOP=0
  1. S J=J-1
  1. F S J=$O(BMXTK(J)) Q:'+J Q:$$UCASE(BMXTK(J))="WHERE" D Q:BMXSTOP
  1. . I $$UCASE(BMXTK(J))="FROM" D
  1. . . S BMXTK(J)=$$UCASE(BMXTK(J))
  1. . . S BMXTK("FROM")=J
  1. . . S BMXSTOP=1
  1. . . Q
  1. . Q
  1. ;
  1. I '$D(BMXTK("FROM")) S BMXERR="'FROM' KEYWORD NOT FOUND" Q
  1. ;
  1. ;WHERE
  1. S BMXSTOP=0
  1. F S J=$O(BMXTK(J)) Q:'+J Q:BMXTK(J)="ORDER BY" Q:BMXTK(J)="GROUP BY" D Q:BMXSTOP
  1. . I $$UCASE(BMXTK(J))="WHERE" D
  1. . . S BMXTK(J)=$$UCASE(BMXTK(J))
  1. . . S BMXTK("WHERE")=J
  1. . . S BMXSTOP=1
  1. . Q
  1. ;
  1. ;SHOWPLAN
  1. S J=BMXTK("FROM")
  1. S BMXSTOP=0
  1. F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP
  1. . I $$UCASE(BMXTK(J))="SHOWPLAN" D
  1. . . S BMXTK("SHOWPLAN")="TRUE"
  1. . . K BMXTK(J)
  1. . . S J=J-1
  1. . . S BMXSTOP=1
  1. . Q
  1. ;
  1. ;MAXRECORDS
  1. S J=BMXTK("FROM")
  1. S BMXSTOP=0
  1. F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP
  1. . I $$UCASE(BMXTK(J))["MAXRECORDS" D
  1. . . S BMXXMAX=+$P(BMXTK(J),":",2)-1
  1. . . S:+BMXXMAX<0 BMXXMAX=0
  1. . . K BMXTK(J)
  1. . . S J=J-1
  1. . . S BMXSTOP=1
  1. . Q
  1. Q
  1. ;
  1. SCREEN ;EP
  1. ;Set up BMXFG() array of executable screen code
  1. N F,BMXNOD,BMXFNUM,BMXFLDNM,BMXHIT,BMXREF
  1. N BMXRNAM,BMXRET,BMXOP,Q,BMXPC,BMXV,BMXFLDLO,BMXFLDNO
  1. N BMXGL
  1. S BMXRET=""
  1. S Q=$C(34)
  1. S BMXFG=BMXFF
  1. S BMXFG("C")=0
  1. I 'BMXFF Q
  1. S F=0,BMXHIT=0
  1. F F=1:1:BMXFF S BMXNOD=BMXFF(F) D Q:$D(BMXERR) Q:BMXHIT
  1. . I $G(BMXFF(F,"INDEXED"))=1 D Q
  1. . . S BMXFG(F)="1"
  1. . . Q
  1. . I $D(BMXFF(F,"JOIN")) D Q
  1. . . S BMXFG(F)="1"
  1. . . Q
  1. . I "(^)"[BMXFF(F) D Q
  1. . . S BMXFG(F)=BMXFF(F)
  1. . . Q
  1. . I "AND^OR"[BMXFF(F) D Q
  1. . . I BMXFF(F)="AND" S BMXFG(F)="&" Q
  1. . . S BMXFG(F)="!"
  1. . . Q
  1. . S BMXFNUM=$S(+$P(BMXNOD,U):$P(BMXNOD,U),1:$O(^DIC("B",$P(BMXNOD,U),0)))
  1. . I '+BMXFNUM D ;Not a fileman field
  1. . . S BMXFLDNM=0,BMXFLDNO=""
  1. . . S BMXFLDLO=$P(BMXFF(F),U,2)
  1. . . ;
  1. . E D ;Get fileman field data
  1. . . S BMXGL=^DIC(BMXFNUM,0,"GL")
  1. . . I $D(BMXFF(F,"IEN")) D
  1. . . . S BMXFLDNM=".001"
  1. . . . S BMXFLDNO="IEN"
  1. . . E D
  1. . . . S BMXFLDNM=$O(^DD(BMXFNUM,"B",$P(BMXNOD,U,2),0))
  1. . . . S BMXFLDNO=^DD(BMXFNUM,BMXFLDNM,0)
  1. . I BMXFLDNO="IEN" D ;BMXIEN field
  1. . . N BMXEXT,C S BMXEXT=0
  1. . . ;S BMXPC=$P(BMXFLDNO,U,4)
  1. . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer
  1. . . S BMXFLDLO="D0"
  1. . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")"
  1. . I $P(BMXFLDNO,U,2)["D" D ;Date field
  1. . . N BMXEXT,C S BMXEXT=0
  1. . . S BMXPC=$P(BMXFLDNO,U,4)
  1. . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer
  1. . . S BMXFLDLO="$P($G("_BMXGL_"D0,"_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")"
  1. . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")"
  1. . I $P(BMXFLDNO,U,2)["S" D ;Set field
  1. . . N BMXEXT,C S BMXEXT=0
  1. . . S BMXPC=$P(BMXFLDNO,U,4)
  1. . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer
  1. . . S BMXFLDLO="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")"
  1. . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")"
  1. . ;
  1. . I $P(BMXFLDNO,U,2)["P" D ;Pointer field
  1. . . N C,BMXEXT
  1. . . S BMXEXT=0
  1. . . I $P(BMXFF(F),U,5)'=BMXFO(1) D
  1. . . . N R,G,BMXJN,BMXMSCR
  1. . . . S BMXMXCR=1 ;Remove after testing. Find out if the field is from a subfile.
  1. . . . I BMXMXCR D Q
  1. . . . . ;Set up a screen in BMXSCR and in BMXMFL(
  1. . . . . Q
  1. . . . ;
  1. . . . ;Find the node of BMXFF that has the join info
  1. . . . S BMXEXT=1
  1. . . . S BMXFG("C")=BMXFG("C")+1
  1. . . . S C=BMXFG("C")
  1. . . . S R=0 F S R=$O(BMXFJ("JOIN",R)) Q:'+R I R=$P(BMXFF(F),U,5) S G=BMXFJ("JOIN",R) Q
  1. . . . S BMXJN=BMXFF(G,"JOIN")
  1. . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2)
  1. . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 S X="
  1. . . . S BMXFG("C",C)=BMXJN
  1. . . S BMXFLDLO=$$SCRNP(F,BMXGL,BMXFLDNM,BMXFLDNO)
  1. . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")"
  1. . I $P(BMXFLDNO,U,2)["C" D ;Computed field
  1. . . N C
  1. . . S BMXPC=$P(BMXFLDNO,U,5,99)
  1. . . S BMXFG("C")=BMXFG("C")+1
  1. . . S C=BMXFG("C")
  1. . . ;If computed field not in primary file, connect navigation code
  1. . . I $P(BMXFF(F),U,5)'=BMXFO(1) D
  1. . . . ;Find the node of BMXFF that has the join info
  1. . . . N R,G,BMXJN
  1. . . . S R=0 F S R=$O(BMXFJ("JOIN",R)) Q:'+R I R=$P(BMXFF(F),U,5) S G=BMXFJ("JOIN",R) Q
  1. . . . S BMXJN=BMXFF(G,"JOIN")
  1. . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2)
  1. . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 "
  1. . . . S BMXJN=BMXJN_BMXPC
  1. . . . S BMXFF(F,0)=$P(BMXFF(F,0),U,1,4)
  1. . . . S $P(BMXFF(F,0),U,5)=BMXJN
  1. . . . S BMXPC=BMXJN
  1. . . S BMXFG("C",C)=BMXPC
  1. . . S BMXFLDLO="BMXSCR(""X"","_C_")"
  1. . I $P(BMXFLDNO,U,2)["N" D ;Numeric field
  1. . . N BMXEXT,C S BMXEXT=0
  1. . . S BMXPC=$P(BMXFLDNO,U,4)
  1. . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer
  1. . . S BMXFLDLO="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")"
  1. . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")"
  1. . ;
  1. . I $P(BMXFLDNO,U,2)["F" D ;Free Text field
  1. . . N BMXEXT,C S BMXEXT=0,C=0
  1. . . S BMXPC=$P(BMXFLDNO,U,4)
  1. . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D
  1. . . . N R,G,BMXJN
  1. . . . S BMXFG("C")=BMXFG("C")+1
  1. . . . S C=BMXFG("C")
  1. . . . S R=0 F S R=$O(BMXFJ("JOIN",R)) Q:'+R I R=$P(BMXFF(F),U,5) S G=BMXFJ("JOIN",R) Q
  1. . . . S BMXJN=BMXFF(G,"JOIN")
  1. . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2)
  1. . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN
  1. . . . S BMXJN=BMXJN_"I +D0 S X="
  1. . . . S BMXFG("C",C)=BMXJN
  1. . . . S BMXFLDLO="BMXSCR(""X"","_C_")"
  1. . . I $P(BMXFLDNO,U,4)["E" D
  1. . . . N BMXPC2,BMXTMP
  1. . . . S BMXPC2=$P(BMXPC,"E",2)
  1. . . . S BMXTMP="$E("_BMXGL_"D0,"_$P(BMXPC,";")_"),"_$P(BMXPC2,",")_","_$P(BMXPC2,",",2)_")"
  1. . . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXTMP
  1. . . . E S BMXFLDLO=BMXTMP
  1. . . E D
  1. . . . N BMXTMP
  1. . . . S BMXTMP="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")"
  1. . . . S BMXTMP="$S($D("_BMXGL_"D0,"_$P(BMXPC,";")_")):"_BMXTMP_",1:"""")"
  1. . . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXTMP
  1. . . . E S BMXFLDLO=BMXTMP
  1. . ;
  1. . S BMXOP=$P(BMXNOD,U,3)
  1. . S BMXV=$P(BMXFF(F),U,4)
  1. . I "<^>^=^["[BMXOP D
  1. . . I BMXOP=">",BMXV?.A S BMXOP="]"
  1. . . I BMXOP="<",BMXV?.A S BMXOP="']"
  1. . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")"
  1. . . Q
  1. . I "<>"=BMXOP D
  1. . . S BMXOP="'="
  1. . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")"
  1. . I ">="=BMXOP D
  1. . . I BMXV="" S BMXRET="(I 1)" Q
  1. . . I +BMXV=BMXV D Q
  1. . . . S BMXOP="'<"
  1. . . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")"
  1. . . S BMXV=$$DECSTR^BMXSQL2(BMXV)
  1. . . S BMXOP="]"
  1. . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")"
  1. . I "<="=BMXOP D
  1. . . I BMXV="" S BMXRET="(I 0)" Q
  1. . . I +BMXV=BMXV D Q
  1. . . . S BMXOP="'>"
  1. . . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")"
  1. . . S BMXV=$$INCSTR^BMXSQL2(BMXV)
  1. . . S BMXOP="']"
  1. . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")"
  1. . I BMXOP="BETWEEN" D
  1. . . I +$P(BMXV,"~")'=$P(BMXV,"~") D ;BMXV a string
  1. . . . N W,X,Y,Z
  1. . . . S X=$P(BMXV,"~")
  1. . . . S Y=$E(X,1,$L(X)-1)
  1. . . . S Z=$E(X,$L(X))
  1. . . . S Z=$A(Z)
  1. . . . S Z=Z-1
  1. . . . S Z=$C(Z)
  1. . . . S W=Y_Z
  1. . . . S $P(BMXV,"~")=W
  1. . . . S BMXRET="(("_BMXFLDLO_"]"_Q_$P(BMXV,"~")_Q_")&("_BMXFLDLO_"']"_Q_$P(BMXV,"~",2)_Q_"))"
  1. . . E D ;BMXV a number
  1. . . . S BMXRET="(("_BMXFLDLO_"'<"_$P(BMXV,"~")_")&("_BMXFLDLO_"'>"_$P(BMXV,"~",2)_"))"
  1. . . Q
  1. . I BMXOP="LIKE" D
  1. . . S BMXRET="("_BMXFLDLO_"?1"_Q_BMXV_Q_".E)"
  1. . I BMXRET]"" D
  1. . . S BMXFG(F)=BMXRET
  1. . . Q
  1. . ;TODO: Pointer fields
  1. . ;TODO: Computed fields
  1. . ;TODO: Sets of codes
  1. . ;TODO: Dates
  1. . Q
  1. Q
  1. ;
  1. SCRNP(F,BMXGL,BMXFLDNU,BMXFLDNO) ;
  1. ;Requires BMXFF()
  1. ;Sets up expression for pointer field
  1. N BMX,BMXCOR,BMXRET,BMXPC
  1. S BMXPC=$P(BMXFLDNO,U,4)
  1. S BMXCOR="$P($G("_BMXGL_"D0,"_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")"
  1. S BMXRET=BMXCOR
  1. Q:$D(BMXFF(F,"INTERNAL")) BMXRET
  1. S BMXFNUM=$P(BMXFLDNO,U,2)
  1. S BMXFNUM=+$P(BMXFNUM,"P",2)
  1. S BMXGL=^DIC(BMXFNUM,0,"GL")
  1. S BMXFLDNM=".01"
  1. S BMXFLDNO=^DD(BMXFNUM,BMXFLDNM,0)
  1. F D:$P(BMXFLDNO,U,2)["P" Q:$P(BMXFLDNO,U,2)'["P"
  1. . S BMXPC=$P(BMXFLDNO,U,4)
  1. . S BMXRET="$P($G("_BMXGL_BMXRET_","_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")"
  1. . S BMXFNUM=$P(BMXFLDNO,U,2)
  1. . S BMXFNUM=+$P(BMXFNUM,"P",2)
  1. . S BMXGL=^DIC(BMXFNUM,0,"GL")
  1. . S BMXFLDNM=".01"
  1. . S BMXFLDNO=^DD(BMXFNUM,BMXFLDNM,0)
  1. ;B ;SCRN2 After chain
  1. ;I 0 D ;$P(BMXFLDNO,U,2)["D" D ;Pointer to a date
  1. ;. Q:+$G(BMXFF(F,"INDEXED")) ;Dates converted when iterator built
  1. ;. N BMXD,J
  1. ;. S BMXD=$P(BMXFF(F),U,4)
  1. ;. S %DT="T"
  1. ;. F J=1:1:$L(BMXD,"~") D
  1. ;. . S X=$P(BMXD,"~",J)
  1. ;. . D ^%DT
  1. ;. . S $P(BMXD,"~",J)=Y
  1. ;. S $P(BMXFF(F),U,4)=BMXD
  1. S BMXRET="$P($G("_BMXGL_BMXRET_",0)),U,1)"
  1. S BMXRET="$S(+"_BMXCOR_":"_BMXRET_",1:"""")"
  1. Q BMXRET
  1. ;
  1. CASE(BMXTK) ;EP
  1. ;Convert keywords to uppercase
  1. N J
  1. S J=0
  1. F S J=$O(BMXTK(J)) Q:'+J D
  1. . F K="DISTINCT","SELECT","WHERE","FROM","SHOWPLAN" D
  1. . . I $$UCASE(BMXTK(J))=K S BMXTK(J)=$$UCASE(BMXTK(J))
  1. . Q
  1. Q
  1. ;
  1. UCASE(X) ;EP Convert X to uppercase
  1. F %=1:1:$L(X) S:$E(X,%)?1L X=$E(X,0,%-1)_$C($A(X,%)-32)_$E(X,%+1,999)
  1. Q X
  1. ;
  1. EXP ;Extended pointer
  1. N R,G,BMXJN
  1. S BMXEXT=1
  1. S BMXFG("C")=BMXFG("C")+1
  1. S C=BMXFG("C")
  1. S R=0 F S R=$O(BMXFJ("JOIN",R)) Q:'+R I R=$P(BMXFF(F),U,5) S G=BMXFJ("JOIN",R) Q
  1. S BMXJN=BMXFF(G,"JOIN")
  1. S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2)
  1. S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 S X="
  1. S BMXFG("C",C)=BMXJN
  1. Q