source: ccr/trunk/p/C0CRNF.m@ 307

Last change on this file since 307 was 307, checked in by George Lilly, 15 years ago

improvements to RNF format routines. FILE2CSVC0CRNF to export files to csv

File size: 10.8 KB
Line 
1C0CRNF ; CCDCCR/GPL - Reference Name Format (RNF) utilities; 12/6/08
2 ;;0.1;CCDCCR;nopatch;noreleasedate
3 ;Copyright 2008 WorldVistA. Licensed under the terms of the GNU
4 ;General Public License See attached copy of the License.
5 ;
6 ;This program is free software; you can redistribute it and/or modify
7 ;it under the terms of the GNU General Public License as published by
8 ;the Free Software Foundation; either version 2 of the License, or
9 ;(at your option) any later version.
10 ;
11 ;This program is distributed in the hope that it will be useful,
12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;GNU General Public License for more details.
15 ;
16 ;You should have received a copy of the GNU General Public License along
17 ;with this program; if not, write to the Free Software Foundation, Inc.,
18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 ;
20 W "This is the Reference Name Format (RNF) Utility Library ",!
21 W !
22 Q
23 ;
24FIELDS(C0CFRTN,C0CF) ; RETURNS AN ARRAY OF THE FIELDS IN FILE C0CF,
25 ; C0CFRTN IS PASSED BY NAME, C0CF IS PASSED BY VALUE
26 ;
27 N C0CFI,C0CFJ ;INNER LOOP, OUTER LOOP
28 N C0CFN ; FIELD NAME
29 S C0CFI=0 S C0CFJ=C0CF
30 K @C0CFRTN ; CLEAR THE RETURN ARRAY
31 F Q:C0CFJ'[C0CF D ; FOR THE C0CF FILE AND ALL SUBFILES INCLUSIVE
32 . ;W "1: "_C0CFJ," ",C0CFI,!
33 . F S C0CFI=$O(^DD(C0CFJ,C0CFI)) Q:+C0CFI=0 D ; EVERY FIELD
34 . . ;W "2: "_C0CFJ," ",C0CFI,!
35 . . S C0CFN=$P(^DD(C0CFJ,C0CFI,0),"^",1) ;PULL FIELD NAME FROM ^DD
36 . . ;W "N: ",C0CFN,!
37 . . ;I C0CFN="STR" W C0CFN," ",C0CFJ,!
38 . . I $D(@C0CFRTN@(C0CFN)) D ; IS THIS A DUPLICATE?
39 . . . W "DUPLICATE FOUND! ",C0CFJ," ",C0CFI," ",C0CFN,!,@C0CFRTN@(C0CFN),!
40 . . . S @C0CFRTN@(C0CFN_"_"_C0CFJ)=C0CFJ_"^"_C0CFI
41 . . E S @C0CFRTN@(C0CFN)=C0CFJ_"^"_C0CFI
42 . S C0CFJ=$O(^DD(C0CFJ)) ; NEXT SUBFILE
43 Q
44 ;
45GETNOLD(GRTN,GFILE,GIEN,GNN) ; GET FIELDS FOR ACCESS BY NAME
46 ; GRTN IS PASSED BY NAME
47 ;
48 N C0CTMP,C0CI,C0CJ,C0CREF,C0CNAME
49 I $D(GNN) I GNN="ALL" S C0CNN=0 ; NOT NON-NULL (ALL FIELDS TO BE RETURNED)
50 E S C0CNN=1 ; NON-NULL IS TRUE (ONLY POPULATED FIELDS RETURNED)
51 S C0CREF=GIEN_"," ; OPEN ROOT REFERENCE INTO FILE
52 D CLEAN^DILF ; MAKE SURE WE ARE CLEANED UP
53 D GETS^DIQ(GFILE,C0CREF,"**","","C0CTMP")
54 D FIELDS(GRTN,GFILE) ;GET ALL THE FIELD NAMES FOR THE FILE
55 S @GRTN@(0)=GFILE_"^RNF1^"_GIEN_"^"_DT_"^"_$J ; STRUCTURE SIGNATURE
56 S (C0CI,C0CJ)=""
57 F S C0CJ=$O(C0CTMP(C0CJ)) Q:C0CJ="" D ; FOR ALL SUBFILES
58 . S C0CREF=$O(C0CTMP(C0CJ,"")) ; RECORD REFERENCE
59 . F S C0CI=$O(C0CTMP(C0CJ,C0CREF,C0CI)) Q:C0CI="" D ; ARRAY OF FIELDS
60 . . ;W C0CJ," ",C0CI,!
61 . . S C0CNAME=$P(^DD(C0CJ,C0CI,0),"^",1) ;PULL THE FIELD NAME
62 . . S C0CVALUE=C0CTMP(C0CJ,C0CREF,C0CI) ;
63 . . I C0CVALUE["C0CTMP" S C0CVALUE=C0CTMP(C0CJ,C0CREF,C0CI,1) ;1ST LINE OF WP
64 . . S $P(@GRTN@(C0CNAME),"^",3)=C0CVALUE ;RETURN VALUE IN P3
65 I C0CNN D ; IF ONLY NON-NULL VALUES ARE TO BE RETURNED
66 . S C0CI=""
67 . F S C0CI=$O(@GRTN@(C0CI)) Q:C0CI="" D ; GO THROUGH THE WHOLE ARRAY
68 . . I $P(@GRTN@(C0CI),"^",3)="" K @GRTN@(C0CI) ; KILL THE NULL ENTRIES
69 Q
70 ;
71GETN1(GRTN,GFILE,GREF,GNDX,GNN) ; NEW GET ;GPL ; RETURN A FIELD VALUE MAP
72 ; GETN IS AN EXTRINSIC WHICH RETURNS THE NEXT IEN AFTER THE CURRENT GIEN
73 ; GRTN, PASSED BY NAME, RETURNS A FIELD MAP AND A VALUE MAP
74 ; .. FIELD MAP @GRTN@("F","FIELDNAME^FILE^FIELD#")=""
75 ; ... ANY FIELD USED BY ANY RECORD PROCESSED IS IN THE FIELD MAP
76 ; .. VALUE MAP @GRTN@("V","IEN","FIELDNAME")=VALUE
77 ; .. GRTN IS NOT INITIALIZED, SO MULTIPLE CALLS ARE CUMULATIVE
78 ; .. IF GNN="ALL" THEN ALL FIELDS FOR THE FILE ARE IN THE FIELD MAP
79 ; .. EVEN IF GNN="ALL" ONLY POPULATED FIELDS ARE RETURNED IN THE VALUE MAP
80 ; .. NUL FIELDS CAN BE DETERMINED BY CHECKING FIELD MAP - THIS SAVES SPACE
81 ; IF GREF IS "" THE FIRST RECORD IS OBTAINED
82 ; IF GNDX IS NULL, GREF IS AN IEN FOR THE FILE
83 ; GNDX IS THE INDEX TO USE TO OBTAIN THE IEN
84 ; GREF IS THE VALUE FOR THE INDEX
85 ; GANN= NOT NULL - IF GANN IS "ALL" THEN EVEN NULL FIELDS WILL BE RETURNED
86 ; OTHERWISE, ONLY POPULATED FIELDS ARE RETURNED IN GRTN
87 ;
88 ;
89 N GIEN,GF
90
91 S GF=$$FILEREF(GFILE) ;CLOSED FILE REFERENCE FOR FILE NUMBER GFILE
92 I ('$D(GNDX))!(GNDX="") S GIEN=GREF ; IF NO INDEX USED, GREF IS THE IEN
93 E D ; WE ARE USING AN INDEX
94 . ;N ZG
95 . S ZG=$Q(@GF@(GNDX,GREF)) ;ACCESS INDEX
96 . I $QS(ZG,3)=GREF D ; IS GREF IN INDEX?
97 . . S GIEN=$QS(ZG,4) ; PULL OUT THE IEN
98 . E S GIEN="" ; NOT FOUND IN INDEX
99 W "IEN: ",GIEN,!
100 N C0CTMP,C0CI,C0CJ,C0CREF,C0CNAME
101 I $D(GNN) I GNN="ALL" S C0CNN=0 ; NOT NON-NULL (ALL FIELDS TO BE RETURNED)
102 E S C0CNN=1 ; NON-NULL IS TRUE (ONLY POPULATED FIELDS RETURNED)
103 S C0CREF=GIEN_"," ; OPEN ROOT REFERENCE INTO FILE
104 D CLEAN^DILF ; MAKE SURE WE ARE CLEANED UP
105 D GETS^DIQ(GFILE,C0CREF,"**","","C0CTMP")
106 D FIELDS(GRTN,GFILE) ;GET ALL THE FIELD NAMES FOR THE FILE
107 S @GRTN@(0)=GFILE_"^RNF1^"_GIEN_"^"_DT_"^"_$J_"^"_DUZ ; STRUCTURE SIGNATURE
108 S (C0CI,C0CJ)=""
109 F S C0CJ=$O(C0CTMP(C0CJ)) Q:C0CJ="" D ; FOR ALL SUBFILES
110 . S C0CREF=$O(C0CTMP(C0CJ,"")) ; RECORD REFERENCE
111 . F S C0CI=$O(C0CTMP(C0CJ,C0CREF,C0CI)) Q:C0CI="" D ; ARRAY OF FIELDS
112 . . ;W C0CJ," ",C0CI,!
113 . . S C0CNAME=$P(^DD(C0CJ,C0CI,0),"^",1) ;PULL THE FIELD NAME
114 . . S C0CVALUE=C0CTMP(C0CJ,C0CREF,C0CI) ;
115 . . I C0CVALUE["C0CTMP" S C0CVALUE=C0CTMP(C0CJ,C0CREF,C0CI,1) ;1ST LINE OF WP
116 . . S $P(@GRTN@(C0CNAME),"^",3)=C0CVALUE ;RETURN VALUE IN P3
117 I C0CNN D ; IF ONLY NON-NULL VALUES ARE TO BE RETURNED
118 . S C0CI=""
119 . F S C0CI=$O(@GRTN@(C0CI)) Q:C0CI="" D ; GO THROUGH THE WHOLE ARRAY
120 . . I $P(@GRTN@(C0CI),"^",3)="" K @GRTN@(C0CI) ; KILL THE NULL ENTRIES
121 Q
122 ;
123GETN2(GARTN,GAFILE,GAIDX,GACNT,GASTRT,GANN) ; RETURN FIELD MAP AND VALUES
124 ; GARTN, PASSED BY NAME, RETURNS A FIELD MAP AND A VALUE MAP
125 ; .. FIELD MAP @GARTN@("F","FIELDNAME")="FILE;FIELD#"
126 ; ... ANY FIELD USED BY ANY RECORD PROCESSED IS IN THE FIELD MAP
127 ; .. VALUE MAP @GARTN@("V","IEN","FIELDNAME","N")=VALUE
128 ; .. WHERE N IS THE INDEX FOR MULTIPLES.. 1 FOR SINGLE VALUES
129 ; .. GARTN IS NOT INITIALIZED, SO MULTIPLE CALLS ARE CUMULATIVE
130 ; .. IF GANN="ALL" THEN ALL FIELDS FOR THE FILE ARE IN THE FIELD MAP
131 ; .. EVEN IF GANN="ALL" ONLY POPULATED FIELDS ARE RETURNED IN THE VALUE MAP
132 ; .. NUL FIELDS CAN BE DETERMINED BY CHECKING FIELD MAP - THIS SAVES SPACE
133 ; GAFILE IS THE FILE NUMBER TO BE PROCESSED. IT IS PASSED BY VALUE
134 ; GAIDX IS THE OPTIONAL INDEX TO USE IN THE FILE. IF GAIDX IS "" THE IEN
135 ; .. OF THE FILE WILL BE USED
136 ; GACNT IS THE NUMBER OF RECORDS TO PROCESS. IT IS PASSED BY VALUE
137 ; .. IF GARCNT IS NULL, ALL RECORDS ARE PROCESSED
138 ; GASTRT IS THE IEN OF THE FIRST RECORD TO PROCESS. IT IS PASSED BY VALUE
139 ; .. IF GARSTART IS NULL, PROCESSING STARTS AT THE FIRST RECORD
140 ; GANN= NOT NULL - IF GANN IS "ALL" THEN EVEN NULL FIELDS WILL BE RETURNED
141 ; OTHERWISE, ONLY POPULATED FIELDS ARE RETURNED IN GARFLD AND GARVAL
142 ;N GATMP,GAI,GAF
143 S GAF=$$FILEREF(GAFILE) ; GET CLOSED ROOT FOR THE FILE NUMBER GAFILE
144 I '$D(GAIDX) S GAIDX="" ;DEFAULT
145 I '$D(GANN) S GANN="" ;DEFAULT ONLY POPULATED FIELDS RETURNED
146 I GAIDX'="" S GAF=$NA(@GAF@(GAIDX)) ; IF WE ARE USING AN INDEX
147 W GAF,!
148 W $O(@GAF@(0)) ;
149 S GAI=0 ;ITERATOR
150 F S GAI=$O(@GAF@(GAI)) Q:GAI="" D ;
151 . D GETN1("GATMP",GAFILE,GAI,GAIDX,GANN) ;GET ONE RECORD
152 . N GAX S GAX=0
153 . F S GAX=$O(GATMP(GAX)) Q:GAX="" D ;PULL OUT THE FIELDS
154 . . D ADDNV(GARTN,GAI,GAX,GATMP(GAX)) ;INSERT THE NAME/VALUE INTO GARTN
155 Q
156 ;
157ADDNV(GNV,GNVN,GNVF,GNVV) ; CREATE AN ELEMENT OF THE MATRIX
158 ;
159 S @GNV@("F",GNVF)=$P(GNVV,"^",1)_"^"_$P(GNVV,"^",2) ;NAME=FILE^FIELD#
160 S @GNV@("V",GNVN,GNVF,1)=$P(GNVV,"^",3) ;SET THE VALUE
161 Q
162 ;
163RNF2CSV(RNRTN,RNIN,RNSTY) ;CONVERTS AN RFN2 GLOBAL TO A CSV FORMAT
164 ; READY TO WRITE FOR USE WITH EXCEL @RNRTN@(0) IS NUMBER OF LINES
165 ; RNSTY IS STYLE OF THE OUTPUT -
166 ; .. "NV"= ROWS ARE NAMES, COLUMNS ARE VALUES
167 ; .. "VN"= ROWS ARE VALUES, COLUMNS ARE NAMES
168 ; .. DEFAULT IS "NV" BECAUSE MANY MATRICES HAVE MORE FIELDS THAN VALUES
169 N RNR,RNC ;ROW ROOT,COL ROOT
170 N RNI,RNJ,RNX
171 I '$D(RNSTY) S RNSTY="NV" ;DEFAULT
172 I RNSTY="NV" D NV(RNRTN,RNIN) ; INTERNAL SUBROUTINES DEPENDING ON ORIENTATION
173 E D VN(RNRTN,RNIN) ;
174 Q
175 ;
176NV(RNRTN,RNIN) ;
177 S RNR=$NA(@RNIN@("F"))
178 S RNC=$NA(@RNIN@("V"))
179 ;S RNY=$P(@RNIN@(0),"^",1) ; FILE NUMBER
180 S RNX="""FILE"""_"," ; FIRST COLUMN NAME IS "FIELD"
181 S RNI=""
182 F S RNI=$O(@RNC@(RNI)) Q:RNI="" D ; FOR EACH COLUMN
183 . S RNX=RNX_RNI_"," ;ADD THE COLUMM ELEMENT AND A COMMA
184 S RNX=$E(RNX,1,$L(RNX)-1) ; STRIP OFF THE LAST COMMA
185 D PUSH^GPLXPATH(RNRTN,RNX) ; FIRST LINE CONTAINS COLUMN HEADINGS
186 S RNI=""
187 F S RNI=$O(@RNR@(RNI)) Q:RNI="" D ; FOR EACH ROW
188 . S RNX=""""_RNI_""""_"," ; FIRST ELEMENT ON ROW IS THE FIELD
189 . S RNJ=""
190 . F S RNJ=$O(@RNC@(RNJ)) Q:RNJ="" D ; FOR EACH COL
191 . . I $D(@RNC@(RNJ,RNI,1)) D ; THIS ROW HAS THIS COLUMN
192 . . . S RNX=RNX_""""_@RNC@(RNJ,RNI,1)_""""_"," ; ADD THE ELEMENT PLUS A COMMA
193 . . E S RNX=RNX_"," ; NUL COLUMN
194 . S RNX=$E(RNX,1,$L(RNX)-1) ; STRIP OFF THE LAST COMMA
195 . D PUSH^GPLXPATH(RNRTN,RNX)
196 Q
197 ;
198VN(RNRTN,RNIN) ;
199 S RNR=$NA(@RNIN@("V"))
200 S RNC=$NA(@RNIN@("F"))
201 ;S RNY=$P(@RNIN@(0),"^",1) ; FILE NUMBER
202 S RNX="""FILE"""_"," ; FIRST COLUMN NAME IS "FIELD"
203 S RNI=""
204 F S RNI=$O(@RNC@(RNI)) Q:RNI="" D ; FOR EACH COLUMN
205 . S RNX=RNX_RNI_"," ;ADD THE COLUMM ELEMENT AND A COMMA
206 S RNX=$E(RNX,1,$L(RNX)-1) ; STRIP OFF THE LAST COMMA
207 D PUSH^GPLXPATH(RNRTN,RNX) ; FIRST LINE CONTAINS COLUMN HEADINGS
208 S RNI=""
209 F S RNI=$O(@RNR@(RNI)) Q:RNI="" D ; FOR EACH ROW
210 . S RNX=""""_RNI_""""_"," ; FIRST ELEMENT ON ROW IS THE FIELD
211 . S RNJ=""
212 . F S RNJ=$O(@RNC@(RNJ)) Q:RNJ="" D ; FOR EACH COL
213 . . I $D(@RNR@(RNI,RNJ,1)) D ; THIS ROW HAS THIS COLUMN
214 . . . S RNX=RNX_""""_@RNR@(RNI,RNJ,1)_""""_"," ; ADD THE ELEMENT PLUS A COMMA
215 . . E S RNX=RNX_"," ; NUL COLUMN
216 . S RNX=$E(RNX,1,$L(RNX)-1) ; STRIP OFF THE LAST COMMA
217 . D PUSH^GPLXPATH(RNRTN,RNX)
218 Q
219 ;
220FILE2CSV(FNUM,FVN) ; WRITES OUT A FILEMAN FILE TO CSV
221 ;
222 ;N G1,G2
223 I '$D(FVN) S FVN="NV" ; DEFAULT ORIENTATION OF CVS FILE
224 S G1=$NA(^TMP($J,"C0CCSV",1))
225 S G2=$NA(^TMP($J,"C0CCSV",2))
226 D GETN2(G1,FNUM) ; GET THE MATRIX
227 D RNF2CSV(G2,G1,FVN) ; PREPARE THE CVS FILE
228 K @G1
229 W $$OUTPUT^GPLXPATH(@G2@(1),"FILE_"_FNUM_".csv",^TMP("GPLCCR","ODIR"))
230 K @G2
231 Q
232 ;
233FILEREF(FNUM) ; EXTRINSIC THAT RETURNS A CLOSED ROOT FOR FILE NUMBER FNUM
234 ;
235 N C0CF
236 S C0CF=^DIC(FNUM,0,"GL") ;OPEN ROOT TO FILE
237 S C0CF=$P(C0CF,",",1)_")" ; CLOSE THE ROOT
238 I C0CF["()" S C0CF=$P(C0CF,"()",1)
239 Q C0CF
240 ;
241ZFILE(ZFN,ZTAB) ; EXTRINSIC TO RETURN FILE NUMBER FOR FIELD NAME PASSED
242 ; BY VALUE IN ZFN. FILE NUMBER IS PIECE 1 OF @ZTAB@(ZFN)
243 ; IF ZTAB IS NULL, IT DEFAULTS TO C0CA
244 I '$D(ZTAB) S ZTAB="C0CA"
245 Q $P(@ZTAB@(ZFN),"^",1)
246ZFIELD(ZFN,ZTAB) ;EXTRINSIC TO RETURN FIELD NUMBER FOR FIELD NAME PASSED
247 ; BY VALUE IN ZFN. FILE NUMBER IS PIECE 2 OF @ZTAB@(ZFN)
248 ; IF ZTAB IS NULL, IT DEFAULTS TO C0CA
249 I '$D(ZTAB) S ZTAB="C0CA"
250 Q $P(@ZTAB@(ZFN),"^",2)
251ZVALUE(ZFN,ZTAB) ;EXTRINSIC TO RETURN VALUE FOR FIELD NAME PASSED
252 ; BY VALUE IN ZFN. FILE NUMBER IS PIECE 3 OF @ZTAB@(ZFN)
253 ; IF ZTAB IS NULL, IT DEFAULTS TO C0CA
254 I '$D(ZTAB) S ZTAB="C0CA"
255 Q $P(@ZTAB@(ZFN),"^",3)
256 ;
Note: See TracBrowser for help on using the repository browser.