1 | BMXADO2 ; IHS/CIHA/GIS - BMX ADO RECORDSET UTILS ;
|
---|
2 | ;;4.1000;BMX;;Apr 17, 2011
|
---|
3 | ;
|
---|
4 | ;
|
---|
5 | GEN(BMXY,BMXF) ;EP - Generate an ADO Schema string from a list of fields
|
---|
6 | ;BMXY Is an out-parameter called by reference.
|
---|
7 | ;On return, BMXY will be a zero-based one-dimensional array each node of which will
|
---|
8 | ;contain the schema corresponding to the fields info in BMXF
|
---|
9 | ;
|
---|
10 | ;BMXF is an in-parameter called by reference.
|
---|
11 | ;On input, BMXF will contain the field info on which to build the schema string.
|
---|
12 | ;
|
---|
13 | ;Field info in BMXF is arranged in a zero-based one-dimensional array.
|
---|
14 | ;Node 0 of BMXF contains the KEYFIELDNAME^FILENUMBER^READONLY
|
---|
15 | ;where KEYFIELDNAME is the name of the unique key field in the database and
|
---|
16 | ;FILENUMBER is the FileMan file number and
|
---|
17 | ;READONLY denotes whether the entire recordset is updateable.
|
---|
18 | ;
|
---|
19 | ;Each subsequent node of the BMXF arrray contains field info in the form
|
---|
20 | ;1FILE#^2FIELD#^3LENGTH^4DATATYPE^5ALIAS^6READONLY^7KEYFIELD^8NULLOK
|
---|
21 | ;If FILE# AND FIELD# are defined, the LENGTH and DATATYPE will be taken from the FileMan data dictionary
|
---|
22 | ;If ALIAS is defined, the schema string will use ALIAS as the column name
|
---|
23 | ;READONLY, KEYFIELD and NULLOK are binary fields. Note that there should be only one field
|
---|
24 | ;in the recordset having KEYFIELD=TRUE
|
---|
25 | ;
|
---|
26 | ;New column info format is @@@meta@@@KEYFIELD|FILE#
|
---|
27 | ; For each field: ^1FILE#|2FIELD#|3DATATYPE|4LENGTH|5FIELDNAME|6READONLY|7KEYFIELD|8NULL ALLOWED
|
---|
28 | ;example:
|
---|
29 | ;BMXY(0)="@@@meta@@@BMXIEN|2160010^"
|
---|
30 | ;BMXY(1)="2160010|.001|I|10|BMXIEN|TRUE|TRUE|FALSE^"
|
---|
31 | ;
|
---|
32 | S BMXY(0)="@@@meta@@@"_$G(BMXF(0))
|
---|
33 | N BMXI,BMXS,BMXFM,BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL
|
---|
34 | S BMXI=0
|
---|
35 | F S BMXI=$O(BMXF(BMXI)) Q:'+BMXI D
|
---|
36 | . N BMXFM,BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL
|
---|
37 | . S (BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL)=""
|
---|
38 | . S BMXFM=0 ;Flag indicating whether BMXF(BMXI) is a FileMan field
|
---|
39 | . S BMXY(BMXI)=""
|
---|
40 | . I BMXF(BMXI) S BMXY(BMXI)=$P(BMXF(BMXI),U,1,2) S BMXFM=1
|
---|
41 | . I BMXFM D ;Look in ^DD for attributes
|
---|
42 | . . S BMXDD=$G(^DD($P(BMXF(BMXI),U),$P(BMXF(BMXI),U,2),0))
|
---|
43 | . . ;column name
|
---|
44 | . . S BMXNAM=$P(BMXDD,U)
|
---|
45 | . . S BMXNAM=$TR(BMXNAM," ","_")
|
---|
46 | . . ;Data type
|
---|
47 | . . I $P(BMXDD,U,2)["P" S BMXDD=$$PTYPE(BMXDD)
|
---|
48 | . . S BMXTYP=$P(BMXDD,U,2)
|
---|
49 | . . S BMXTYP=$S(BMXTYP["F":"T",BMXTYP["S":"T",BMXTYP["D":"D")
|
---|
50 | . . I BMXTYP["N" S BMXTYP=$S($P(BMXTYP,",",2)>0:"N",1:"I")
|
---|
51 | . . ;default columnn lengths based on type
|
---|
52 | . . I BMXTYP="N"!(BMXTYP="I") S BMXLEN=$P(BMXDD,U,2),BMXLEN=$P(BMXLEN,","),BMXLEN=$E(BMXLEN,3,$L(BMXLEN))
|
---|
53 | . . I BMXTYP="I" S BMXLEN2=$P(BMXDD,U,2),BMXLEN2=$P(BMXLEN,",",2),BMXLEN=BMXLEN+BMXLEN2+1
|
---|
54 | . . I BMXTYP="T" S BMXLEN=0
|
---|
55 | . . I BMXTYP="D" S BMXLEN=30
|
---|
56 | . . S BMXNULL="TRUE" S:$P(BMXDD,U,2)["R" BMXNULL="FALSE"
|
---|
57 | . ;Look in BMXF for user-specified attributes
|
---|
58 | . S:$P(BMXF(BMXI),U,5)]"" BMXNAM=$P(BMXF(BMXI),U,5) ;Alias
|
---|
59 | . ;Set KEY, NULL and READONLY
|
---|
60 | . S BMXNULL="TRUE",BMXREAD="TRUE",BMXKEY="FALSE"
|
---|
61 | . I $P(BMXF(BMXI),U,7)="TRUE" S BMXKEY="TRUE",BMXNULL="FALSE",BMXREAD="TRUE"
|
---|
62 | . E S:$P(BMXF(BMXI),U,8)]"" BMXNULL=$P(BMXF(BMXI),U,8) S:$P(BMXF(BMXI),U,6)]"" BMXREAD=$P(BMXF(BMXI),U,6)
|
---|
63 | . ;Set BMXY node
|
---|
64 | . S $P(BMXY(BMXI),"|",3)=BMXTYP
|
---|
65 | . S $P(BMXY(BMXI),"|",4)=BMXLEN
|
---|
66 | . S $P(BMXY(BMXI),"|",5)=BMXNAM
|
---|
67 | . S $P(BMXY(BMXI),"|",6)=BMXREAD
|
---|
68 | . S $P(BMXY(BMXI),"|",7)=BMXKEY
|
---|
69 | . S $P(BMXY(BMXI),"|",8)=BMXNULL
|
---|
70 | ;
|
---|
71 | Q
|
---|
72 | PTYPE(BMXDD) ;
|
---|
73 | ;Traverse pointer chain to retrieve data type of pointed-to field
|
---|
74 | N BMXFILE
|
---|
75 | I $P(BMXDD,U,2)'["P" Q BMXDD
|
---|
76 | S BMXFILE=$P(BMXDD,U,2)
|
---|
77 | S BMXFILE=+$P(BMXFILE,"P",2)
|
---|
78 | S BMXDD=$G(^DD(BMXFILE,".01",0))
|
---|
79 | S BMXDD=$$PTYPE(BMXDD)
|
---|
80 | Q BMXDD
|
---|