| 1 | BMXADOVJ        ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ;
 | 
|---|
| 2 |         ;;4.1000;BMX;;Apr 17, 2011
 | 
|---|
| 3 |         ; THIS ROUTINE MANAGES THE JOINS
 | 
|---|
| 4 |         ; 
 | 
|---|
| 5 |         ; 
 | 
|---|
| 6 |         ; 
 | 
|---|
| 7 |         ; THE FIFTH PARAMETER OF SS^BMXADO CONTAINS THE JOIN INSTRUCTIONS
 | 
|---|
| 8 |         ;  SYNTAX: DESCENDANT SCHEMA IEN (DETAILS FILE), JOIN FIELD FROM MASTER FILE
 | 
|---|
| 9 |         ;   THE FIRST "," PIECE STATES THAT THE MASTER FILE IS JOINED BY ITS .02 FIELD TO THE DETAILS FILE
 | 
|---|
| 10 |         ;   THE SECOND "," PIECE STARTES THAT THE DETAILS FILE IS DEFINED BY SCHEMA #6
 | 
|---|
| 11 |         ;   AN OPTIONAL 3RD "," PIECE MAY CONTAIN A SECONDARY VSTG TO MORE PRECISELY DEFINE JOIN ITERATION 
 | 
|---|
| 12 |         ;    E.G., "...~6.,.02,AA~1/1/2004~2/1/2004~~~~~|WT|R"
 | 
|---|
| 13 |         ;    IN THIS CASE, THE SECONDARY VSTG SPECIFIES THAT THE AA INDEX BE USED TO CONTROL THE ITERATOR
 | 
|---|
| 14 |         ;    THE START AND STOP DATES ARE IN EFFECT BUT MAX IS IGNORED/IRRELEVANT
 | 
|---|
| 15 |         ;    THE 1ST "|" PIECE OF THE PARAM SECTION WILL BE AUTOMATICALLY STUFFED WITH PATEINT DFN(S) DURING ITERATION
 | 
|---|
| 16 |         ;  IF MULTIPLE JOINS ARE REQUESTED, THEY ARE SPARATED BY THE '@JOIN@' DELIMTER
 | 
|---|
| 17 |         ;   "E.G., 6,.02@JOIN@1,.03@JOIN@2,.02@JOIN@9,SUB"
 | 
|---|
| 18 |         ;   IN THIS EXAPLE THE MASTER FILE IS JOIND TO THE DETAILS FILES ASSOCIATED WITH SCHEMAS 6, 1, AND 9
 | 
|---|
| 19 |         ;   NOTE THAT THE 3RD JOIN DEINED IN THE STRING SPECIFIES A SUBFILE REALTION RATHER THAN A "POINTER" RELATION
 | 
|---|
| 20 |         ; IF A SECOND RECORD SET IS CREATED TO FULFILL A JOIN REQUEST, IT WILL ONLY CONTAIN THE ROWS NECESSARY TO  COMPLETE THE JOIN
 | 
|---|
| 21 |         ;
 | 
|---|
| 22 | JOIN(SMASTER,JSTG)      ;EP - APPEND ADDITIONAL ANRS TO FULFILL JOIN REQUESTS
 | 
|---|
| 23 |         N TMP,JOIN,JINST,FMASTER
 | 
|---|
| 24 |         I '$L($G(JSTG)) Q  ; JOIN STRING MUST NOT BE NULL
 | 
|---|
| 25 |         S FMASTER=$P($G(^BMXADO(+$G(SMASTER),0)),U,2) I 'FMASTER Q  ; MASTER SCHEMA & FILE MUST EXIST
 | 
|---|
| 26 |         S TMP=$NA(^TMP("BMX JOIN",$J)) K @TMP ; JOIN INFO TEMP STORAGE ARRAY
 | 
|---|
| 27 |         S @TMP@(0,SMASTER)=$$RANGE ; GET DATA NODE RANGE FOR THE MASTER ANR
 | 
|---|
| 28 |         I '$D(@TMP@(0)) Q  ; DATA MUST EXIST IN THE MASTER FILE OR QUIT
 | 
|---|
| 29 |         F JOIN=1:1 S JINST=$P(JSTG,"@JOIN@",JOIN) Q:JINST=""  D J(SMASTER,JINST) ; MAIN LOOP FOR DOING JOINS
 | 
|---|
| 30 |         K @TMP
 | 
|---|
| 31 |         Q
 | 
|---|
| 32 |         ;
 | 
|---|
| 33 | RANGE() ; GET DATA NODE RANGE FOR LAST SCHEMA ENTERED
 | 
|---|
| 34 |         N X,FIRST,LAST,Y
 | 
|---|
| 35 |         S (X,LAST)=$O(@OUT@(999999999),-1)
 | 
|---|
| 36 |         F  S X=$O(@OUT@(X),-1) Q:'X  S Y=@OUT@(X) Q:Y'[$C(30)  S FIRST=X
 | 
|---|
| 37 |         I '$G(FIRST) Q ""
 | 
|---|
| 38 |         S FIRST=FIRST+1
 | 
|---|
| 39 |         Q (FIRST_U_LAST)
 | 
|---|
| 40 |         ; 
 | 
|---|
| 41 | J(SMASTER,JSTG) ; JOIN DETAILS FILE TO MASTER FILE
 | 
|---|
| 42 |         ; SMASTER=MASTER SCHMA IEN, SDETAIL=DETAILS SCHEMA IEN
 | 
|---|
| 43 |         N JARR,SEC,ERR,JIEN,SUB,IX,PARENT,JFLD,DFLD,NODE,X,STOP,VSTG2,SDETAIL,JFLD
 | 
|---|
| 44 |         S SDETAIL=$P(JSTG,C),JFLD=$P(JSTG,C,2),DFLD=$P(JSTG,C,3),VSTG2=$P(JSTG,C,4,999)
 | 
|---|
| 45 |         I JFLD="SUB" S JFLD=.001,DFLD=.0001
 | 
|---|
| 46 |         I JFLD=.001,DFLD=.0001 S SUB=1,VSTG2="~~~~~SIT~BMXADOVJ~" ; MAKE SUBFILE ITERATOR VSTG
 | 
|---|
| 47 |         D IEN(SMASTER,SDETAIL,JFLD) ; GET A LIST OF JOIN IENS FROM THE MASTER FILE
 | 
|---|
| 48 |         I '$D(@TMP@(1)) Q  ; NO MASTER FILE IENS FOR JOINS, SO QUIT
 | 
|---|
| 49 |         N FIEN,DAS,SIEN,VSTG,JSTG
 | 
|---|
| 50 |         S DAS="",SIEN=SDETAIL,VSTG=VSTG2
 | 
|---|
| 51 |         S FIEN=$P($G(^BMXADO(SIEN,0)),U,2) I 'FIEN Q
 | 
|---|
| 52 |         D JEP^BMXADO ; BUILD THE JOIN ANR
 | 
|---|
| 53 |         Q
 | 
|---|
| 54 |         ;
 | 
|---|
| 55 | IEN(SMASTER,SDETAIL,JFLD)       ; GET THE MASTER FILE IENS FOR BUILDING THE JOIN DATA SET
 | 
|---|
| 56 |         N FIEN,%,FIRST,LAST,NODE,DA,IEN
 | 
|---|
| 57 |         I JFLD["IEN" S JFLD=+JFLD
 | 
|---|
| 58 |         S FIEN=$P($G(^BMXADO(SMASTER,0)),U,2) I 'FIEN Q
 | 
|---|
| 59 |         S %=$G(@TMP@(0,SMASTER)) I '$L(%) Q
 | 
|---|
| 60 |         S FIRST=+%,LAST=$P(%,U,2),NODE=FIRST-.1
 | 
|---|
| 61 |         F  S NODE=$O(@OUT@(NODE))  Q:'NODE  Q:NODE>LAST  D
 | 
|---|
| 62 |         . S DA=+@OUT@(NODE)
 | 
|---|
| 63 |         . I 'DA Q
 | 
|---|
| 64 |         . I JFLD=.001 S @TMP@(1,SDETAIL,DA)="" Q
 | 
|---|
| 65 |         . S IEN=$$GET1^DIQ(FIEN,(DA_C),JFLD,"I") I 'IEN Q
 | 
|---|
| 66 |         . S @TMP@(1,SDETAIL,IEN)=""
 | 
|---|
| 67 |         . Q
 | 
|---|
| 68 |         Q
 | 
|---|
| 69 |         ;
 | 
|---|
| 70 | JFLD    ; EP-STUFF JOIN FIELD IDS INTO THE INTRO SEGMENT OF THE SCHEMA
 | 
|---|
| 71 |         N NODE,%
 | 
|---|
| 72 |         S NODE=999999999999
 | 
|---|
| 73 |         F  S NODE=$O(@OUT@(NODE),-1) Q:'NODE  I @OUT@(NODE)["@@@meta@@@" Q
 | 
|---|
| 74 |         I 'NODE Q
 | 
|---|
| 75 |         S %=$P(@OUT@(NODE),U),$P(%,"|",4)=$G(JFLD),$P(%,"|",5)=$G(DFLD)
 | 
|---|
| 76 |         S @OUT@(NODE)=%_U
 | 
|---|
| 77 |         Q
 | 
|---|
| 78 |         ; 
 | 
|---|