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 | ;
|
---|