From 782d05d28763b7fa220747323935fb893dfad99a Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 7 Dec 2009 19:21:15 +0000 Subject: [PATCH] Initial Import of BMX.net code --- cs/BMXNet20.dll | Bin 0 -> 94208 bytes cs/bmxTesterForVista_0200.cs | 96 + cs/bmxTesterForVista_0200.exe | Bin 0 -> 6656 bytes doc/bmx0210.n | 388 + doc/bmx_020i.pdf | Bin 0 -> 121162 bytes doc/bmx_020t.pdf | Bin 0 -> 238017 bytes doc/bmx_020u.pdf | Bin 0 -> 687396 bytes k/bmx0210t2WV.k | 23582 ++++++++++++++++++++++++++++++++ k/xwb_0110_113102.k | 706 + m/BMXADE1.m | 83 + m/BMXADE2.m | 90 + m/BMXADO.m | 157 + m/BMXADO2.m | 80 + m/BMXADOF.m | 228 + m/BMXADOF1.m | 75 + m/BMXADOF2.m | 57 + m/BMXADOFD.m | 84 + m/BMXADOFS.m | 204 + m/BMXADOI.m | 82 + m/BMXADOS.m | 264 + m/BMXADOS1.m | 106 + m/BMXADOV.m | 122 + m/BMXADOV1.m | 229 + m/BMXADOV2.m | 137 + m/BMXADOVJ.m | 78 + m/BMXADOX.m | 501 + m/BMXADOX1.m | 325 + m/BMXADOX2.m | 123 + m/BMXADOXX.m | 439 + m/BMXADOXY.m | 296 + m/BMXE01.m | 57 + m/BMXFIND.m | 260 + m/BMXG.m | 54 + m/BMXGETS.m | 146 + m/BMXMBRK.m | 216 + m/BMXMBRK2.m | 171 + m/BMXMEVN.m | 252 + m/BMXMON.m | 354 + m/BMXMSEC.m | 77 + m/BMXNTEG.m | 78 + m/BMXPO.m | 71 + m/BMXPRS.m | 104 + m/BMXRPC.m | 167 + m/BMXRPC1.m | 238 + m/BMXRPC2.m | 112 + m/BMXRPC3.m | 240 + m/BMXRPC4.m | 148 + m/BMXRPC5.m | 124 + m/BMXRPC6.m | 112 + m/BMXRPC7.m | 134 + m/BMXRPC8.m | 89 + m/BMXRPC9.m | 165 + m/BMXSQL.m | 406 + m/BMXSQL1.m | 336 + m/BMXSQL2.m | 97 + m/BMXSQL3.m | 330 + m/BMXSQL4.m | 33 + m/BMXSQL5.m | 181 + m/BMXSQL6.m | 343 + m/BMXSQL7.m | 232 + m/BMXSQL91.m | 141 + m/BMXTABLE.m | 7 + m/BMXTRS.m | 42 + m/BMXUTL1.m | 330 + m/BMXUTL2.m | 32 + m/BMXUTL5.m | 217 + m/BMXUTL6.m | 36 + m/BMXUTL7.m | 8 + m/XWBTCPM.m | 236 + 69 files changed, 34908 insertions(+) create mode 100644 cs/BMXNet20.dll create mode 100755 cs/bmxTesterForVista_0200.cs create mode 100755 cs/bmxTesterForVista_0200.exe create mode 100644 doc/bmx0210.n create mode 100644 doc/bmx_020i.pdf create mode 100644 doc/bmx_020t.pdf create mode 100644 doc/bmx_020u.pdf create mode 100644 k/bmx0210t2WV.k create mode 100644 k/xwb_0110_113102.k create mode 100644 m/BMXADE1.m create mode 100644 m/BMXADE2.m create mode 100644 m/BMXADO.m create mode 100644 m/BMXADO2.m create mode 100644 m/BMXADOF.m create mode 100644 m/BMXADOF1.m create mode 100644 m/BMXADOF2.m create mode 100644 m/BMXADOFD.m create mode 100644 m/BMXADOFS.m create mode 100644 m/BMXADOI.m create mode 100644 m/BMXADOS.m create mode 100644 m/BMXADOS1.m create mode 100644 m/BMXADOV.m create mode 100644 m/BMXADOV1.m create mode 100644 m/BMXADOV2.m create mode 100644 m/BMXADOVJ.m create mode 100644 m/BMXADOX.m create mode 100644 m/BMXADOX1.m create mode 100644 m/BMXADOX2.m create mode 100644 m/BMXADOXX.m create mode 100644 m/BMXADOXY.m create mode 100644 m/BMXE01.m create mode 100644 m/BMXFIND.m create mode 100644 m/BMXG.m create mode 100644 m/BMXGETS.m create mode 100644 m/BMXMBRK.m create mode 100644 m/BMXMBRK2.m create mode 100644 m/BMXMEVN.m create mode 100644 m/BMXMON.m create mode 100644 m/BMXMSEC.m create mode 100644 m/BMXNTEG.m create mode 100644 m/BMXPO.m create mode 100644 m/BMXPRS.m create mode 100644 m/BMXRPC.m create mode 100644 m/BMXRPC1.m create mode 100644 m/BMXRPC2.m create mode 100644 m/BMXRPC3.m create mode 100644 m/BMXRPC4.m create mode 100644 m/BMXRPC5.m create mode 100644 m/BMXRPC6.m create mode 100644 m/BMXRPC7.m create mode 100644 m/BMXRPC8.m create mode 100644 m/BMXRPC9.m create mode 100644 m/BMXSQL.m create mode 100644 m/BMXSQL1.m create mode 100644 m/BMXSQL2.m create mode 100644 m/BMXSQL3.m create mode 100644 m/BMXSQL4.m create mode 100644 m/BMXSQL5.m create mode 100644 m/BMXSQL6.m create mode 100644 m/BMXSQL7.m create mode 100644 m/BMXSQL91.m create mode 100644 m/BMXTABLE.m create mode 100644 m/BMXTRS.m create mode 100644 m/BMXUTL1.m create mode 100644 m/BMXUTL2.m create mode 100644 m/BMXUTL5.m create mode 100644 m/BMXUTL6.m create mode 100644 m/BMXUTL7.m create mode 100644 m/XWBTCPM.m diff --git a/cs/BMXNet20.dll b/cs/BMXNet20.dll new file mode 100644 index 0000000000000000000000000000000000000000..5f4c0c24cfdebdcf59b16e2eb2bb1a317192ceef GIT binary patch literal 94208 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 DUZ=9 D ^XUP + +Setting up programmer environment +This is a TEST account. + +Terminal Type set to: C-VT100 + +You have 46 new messages. +Select OPTION NAME: xpd main Kernel Installation & Distribution System + + + Edits and Distribution ... + Utilities ... + Installation ... + Patch Monitor Main Menu ... + +Select Kernel Installation & Distribution System Option: INStallation + + + 1 Load a Distribution + 2 Verify Checksums in Transport Global + 3 Print Transport Global + 4 Compare Transport Global to Current System + 5 Backup a Transport Global + 6 Install Package(s) + Restart Install of Package(s) + Unload a Distribution + Checksum/2nd Line Lists + Directory Listing to MailMan + Find/Delete File in Download Directory + + +Select Installation Option: 1 Load a Distribution +Enter a Host File: /opt/wv/k/bmx0210.k + +KIDS Distribution saved on Jul 22, 2009@13:07:52 +Comment: BMX.net 2.1; add support for GT.M + +This Distribution contains Transport Globals for the following Package(s): + BMX 2.1 +Distribution OK! + +Want to Continue with Load? YES// +Loading Distribution... + +Build BMX 2.1 has an Enviromental Check Routine +Want to RUN the Environment Check Routine? YES// + BMX 2.1 +Will first run the Environment Check Routine, BMXE01 + + +Hello, FIVE COORDINATOR + +Checking Environment for Install of Version 2.0 of BMX. + +Need at least FileMan 22.....FileMan 22.0 Present + +Need at least Kernel 8.0.....Kernel 8.0 Present + +Need at least XB/ZIB 3.....XB/ZIB 4.0 Present +Use INSTALL NAME: BMX 2.1 to install this Distribution. + + + + 1 Load a Distribution + 2 Verify Checksums in Transport Global + 3 Print Transport Global + 4 Compare Transport Global to Current System + 5 Backup a Transport Global + 6 Install Package(s) + Restart Install of Package(s) + Unload a Distribution + Checksum/2nd Line Lists + Directory Listing to MailMan + Find/Delete File in Download Directory + +Select Installation Option: 6 Install Package(s) +Select INSTALL NAME: BMX 2.1 Loaded from Distribution Loaded from Dis +tribution 7/22/09@13:22:57 + => BMX.net 2.1; add support for GT.M ;Created on Jul 22, 2009@13:07:52 + +This Distribution was loaded on Jul 22, 2009@13:22:57 with header of + BMX.net 2.1; add support for GT.M ;Created on Jul 22, 2009@13:07:52 + It consisted of the following Install(s): + BMX 2.1 + + Checking BMX 2.1 for overlap with VOE 1.0 ...... OK + No overlap found + + + Checking BMX 2.1 for overlap with VOE 1.1 ...... OK + No overlap found + + + Checking BMX 2.1 for overlap with NO HOME 1.0 ...... OK + No overlap found + +Checking Install for Package BMX 2.1 +Will first run the Environment Check Routine, BMXE01 + + +Hello, FIVE COORDINATOR + +Checking Environment for Install of Version 2.0 of BMX. + +Need at least FileMan 22.....FileMan 22.0 Present + +Need at least Kernel 8.0.....Kernel 8.0 Present + +Need at least XB/ZIB 3.....XB/ZIB 4.0 Present + +Install Questions for BMX 2.1 + +Incoming Files: + + + 90093.1 BMX USER + + + 90093.2 BMX APPLICATION + + + 90093.5 BMXNET MONITOR + + + 90093.9 BMX GUI REPORT + + + 90093.98 BMX ADO LOG + + + 90093.99 BMX ADO SCHEMA (including data) + +Want KIDS to Rebuild Menu Trees Upon Completion of Install? NO// + + +Want KIDS to INHIBIT LOGONs during the install? NO// +Want to DISABLE Scheduled Options, Menu Options, and Protocols? NO// + +Enter the Device you want to print the Install messages. +Enter a '^' to abort the install. + +DEVICE: HOME// ;80;999999 + + + +Install Completed + +2. Install Xinetd +================= +User is referred to their OS's documentation + +3. Configure listener in Xinetd +=============================== +Create a file in /etc/xinetd.d, with whatever name you like. I called mine BMX10502, because that's the port I am going to use. Here are the contents (don't include my comments) + +service BMX10502 +{ + socket_type = stream + type = UNLISTED + port = 10502 (that can be whatever you want it to be) + protocol = tcp + user = xxxxxxxx (that's a unix user who has access to run GT.M) + wait = no + disable = no + server = /bin/sh + server_args = /opt/wv2/BMX10502 (that's the location of the script that this listener will launch when it gets a TCP call on 10502) +} + +4. Configure shell script that that is called by Xinetd +======================================================= +Create a script that looks like this. +The essential lines are the ones defining gtm_dist, gtmgbldir, gtmroutines, and $gtm_dist/mumps - run XINETD^BMXMON. XINETD^BMXMON is the entry point responsible for receiving TCP calls from XINETD. + +#!/bin/bash +# BMX Broker started by Xinet.d +cd /opt/wv2 +date >> /opt/wv2/bmx.log + +# Get GT.M profile +export vista_home="/opt/wv2" +export gtm_dist="/opt/gtm" +export gtmgbldir="$vista_home/g/mumps.gld" +export gtmroutines="$vista_home/o($vista_home/p) $vista_home/o($vista_home/r) $gtm_dist" + +# Run +$gtm_dist/mumps -run XINETD^BMXMON 2>>/opt/wv2/bmx.log +exit + +Note: If you install XWB 1.1 patch 100001, you can use the CPRS listener. XWBTCPM will decide which protocol it is and route it accordingly. + +5. Add BMXRPC to the user's menu +================================ +GTM>D P^DI + + +VA FileMan 22.0 + + +Select OPTION: ENTER OR EDIT FILE ENTRIES + + + +INPUT TO WHAT FILE: PACKAGE// 200 NEW PERSON (77 entries) +EDIT WHICH FIELD: ALL// SECONDARY MENU OPTIONS (multiple) + EDIT WHICH SECONDARY MENU OPTIONS SUB-FIELD: ALL// .01 SECONDARY MENU OPTION +S + THEN EDIT SECONDARY MENU OPTIONS SUB-FIELD: +THEN EDIT FIELD: + + +Select NEW PERSON NAME: CLERK,EIGHT Medical Clerk +Select SECONDARY MENU OPTIONS: OR CPRS GUI CHART// + SECONDARY MENU OPTIONS: OR CPRS GUI CHART// +Select SECONDARY MENU OPTIONS: BMXRPC BMX Procedure Calls + Are you adding 'BMXRPC' as a new SECONDARY MENU OPTIONS (the 2ND for this NEW + PERSON)? No// Y (Yes) +Select SECONDARY MENU OPTIONS: + +6. (optional) Install XWB 1.1 patch 100001 +========================================== +This patch allows you to use the CPRS listener for BMX. + +GTM>d ^XPDIL + +Enter a Host File: /opt/wv/k/xwb0110_100001.k + +KIDS Distribution saved on Jul 22, 2009@13:55:06 +Comment: XWB patch to support BMX.net calls + +This Distribution contains Transport Globals for the following Package(s): + XWB*1.1*100001 +Distribution OK! + +Want to Continue with Load? YES// +Loading Distribution... + + XWB*1.1*100001 +Use INSTALL NAME: XWB*1.1*100001 to install this Distribution. + +GTM>d ^XPDI + +Select INSTALL NAME: XWB*1.1*100001 Loaded from Distribution Loaded f +rom Distribution 7/22/09@13:56:39 + => XWB patch to support BMX.net calls ;Created on Jul 22, 2009@13:55:06 + +This Distribution was loaded on Jul 22, 2009@13:56:39 with header of + XWB patch to support BMX.net calls ;Created on Jul 22, 2009@13:55:06 + It consisted of the following Install(s): + XWB*1.1*100001 + + Checking XWB*1.1*100001 for overlap with VOE 1.0 .. OK + No overlap found + +Install Completed. + +TESTING BMX.net +=============== +In the package, there is a C# file called bmxTesterForVista_0200.cs and a .Net dll called BMXNet20.dll. +To compile the file on Mono, use the generics Mono C# compiler (gmcs), referencing BMXNet20.dll and System.Data.dll. To compile on Windows, use csc with the same arguments. + + gmcs /r:BMXNet20.dll,System.Data.dll bmxTesterForVista_0200.cs + +Then you can execute it: + +mono bmxTesterForVista_0200.exe +Enter IP Address of Server: 127.0.0.1 +Enter the listener port: 9260 +Enter your Access Code: vistais#1 +Enter your Verify Code: catdog.22 +Connected: True DUZ: 47 +Simple RPC: User Name: CLERK,EIGHT +CPRS RPC with Parameters: +14^Administrator,System +65^Analyst,One^- ANALYST +66^Analyst,Three^- ANALYST +69^Analyst,Two^- ANALYST +47^Clerk,Eight^- Medical Clerk +50^Clerk,Eleven^- Medical Clerk +54^Clerk,Fifteen^- Medical Clerk +44^Clerk,Five^- Medical Clerk +43^Clerk,Four^- Medical Clerk +53^Clerk,Fourteen^- Medical Clerk +48^Clerk,Nine^- Medical Clerk +46^Clerk,Seven^- Medical Clerk +45^Clerk,Six^- Medical Clerk +49^Clerk,Ten^- Medical Clerk +52^Clerk,Thirteen^- Medical Clerk +42^Clerk,Three^- Medical Clerk +51^Clerk,Twelve^- Medical Clerk +41^Clerk,Two^- Medical Clerk +58^Coordinator,Clinical^- CLINICAL COORDINATOR +9^Coordinator,Five^- ANALYST +3^Coordinator,Four +2^Coordinator,Nine +63^Coordinator,One^- ANALYST +64^Coordinator,Seven +60^Coordinator,Six^- CLINICAL COORDINATOR +67^Coordinator,Three^- ANALYST +68^Coordinator,Two^- ANALYST +21^Doctor,Eight^- Physician +24^Doctor,Eleven^- Physician +18^Doctor,Five^- Physician +17^Doctor,Four^- Physician +22^Doctor,Nine^- Physician +11^Doctor,One^- Physician +20^Doctor,Seven^- Physician +19^Doctor,Six^- Physician +23^Doctor,Ten^- Physician +16^Doctor,Three^- Physician +26^Doctor,Twelve^- Physician +15^Doctor,Two^- Physician +62^Lab,Superuser^- ANALYST +8^Manager,System^- System Manager +33^Nurse,Eight^- Nurse +36^Nurse,Eleven^- Nurse +40^Nurse,Fifteen^- Nurse + + +SQL Statement +ZZ PATIENT,TEST ONE +FEMALE +1/24/1945 12:00:00 AM +ZZ PATIENT,TEST THREE +MALE +1/15/1968 12:00:00 AM +ZZ PATIENT,TEST TWO +MALE +12/25/1957 12:00:00 AM + +BMX Schema RPC + +ZZ PATIENT,TEST ONEF1/24/1945 12:00:00 AM +ZZ PATIENT,TEST THREEM1/15/1968 12:00:00 AM +ZZ PATIENT,TEST TWOM12/25/1957 12:00:00 AM + +More complicated SQL + +NAMESTATEABBRAGE +ZZ PATIENT,TEST ONENEW YORKNY64 +ZZ PATIENT,TEST THREEINDIANAIN41 +ZZ PATIENT,TEST TWOKANSASKS51 + +If this doesn't work, you will get error messages like this: +Unhandled Exception: IndianHealthService.BMXNet.BMXNetException: Connection refused at System.Net.Sockets.Socket.Connect (System.Net.EndPoint remote_end) [0x00000] + at System.Net.Sockets.TcpClient.Connect (System.Net.IPEndPoint remote_end_point) [0x00000] + at System.Net.Sockets.TcpClient.Connect (System.Net.IPAddress[] ipAddresses, Int32 port) [0x00000] + at IndianHealthService.BMXNet.BMXNetLib.a (System.String A_0) [0x00000] + +You may get Connection refused; connection timed out, not a valid access/verify code, verify code must be changed now, and User doesn't have access to Context BMXRPC, etc. + diff --git a/doc/bmx_020i.pdf b/doc/bmx_020i.pdf new file mode 100644 index 0000000000000000000000000000000000000000..663989c088bf2280fb5a0d2af790c15e989bd11d GIT binary patch literal 121162 zcmce;1y~i`yEhC-cT2O8R=T^pyFt2hv+3?s8bm@w1d$f$4(aX`kdO}P{`N+F;{QD7 zyyv{{b$xh^GqYyJz1ID^b7n7U6$vRuRwfQK>Tj#V<7mjNEbP1h7J!qfEkHnkS;5B9 z!USmJZD9^zWmW*NvaoV}9wJlx#ON&r@NW(@!j3ojcRvkX8Vz{AQ3 z;Nayo6cR$Sa5M*Zg$DS`9~!bJ(8BW9NNk*F$SlA9Sh)ZXR{+P~Wvra6-2W)!Vf$x2 zUY>uHv9WV-{%2b@o`0#w%l^-LygVHL*_NG!o&6tWY~25#kDZL2V{ZXOLk5FP9gHt9qPRGiRe%=m5FD}aGV7>WSgL~@ zz|dmlU{-T-0zojx0!F49v#g_~6Znqp=Z%EE0Jo^5s5lol52qxngqS!h4?B-2534x0 z6sH&~hqxGrq>um)FDtJkFR!S$n79NF8wWR!BpWZUgd{tc1Um;W7mK721gprdAQK?y zCpcNqkg2I9m8H;-|AJfq1hib>6@`cgL^>=Stw7cQc3vK4aR3Jg2eXuoJ;(ycEM;#3 zvXHPab27JJmIZL|u!BX1gN+9)Hyo^N%<2F(UM?XaR}j#`!~rY}bEd||#^7Vp%Gko# zIJ>uXI1uVagp~^(AO0nwf|zko_|!90)JEb)0|UZ2!%!alpm);x+L`}A$O zq8vgr#KjmA^N>2~WIi;m$UY|dEOXY9BQy2&L8~x*avFvoqq5eBh2PY8L9ro|ev`%O zPb1Jnak*?1Hd0kEQ+#eM`*Uv$YY4@n`OXC~Q*@JCLMBPghq`FGTGcTbiEt#=9lSx< zTBV)_o>10lIcn06B12~xXP{w?Yj^_dkO43Z9dva-u)Wn-+bcMri*w^~CMtF#S|cjq z7%DdbQ#q#&3t5llOJn!iHuu)gE^w>RLa9hJiuT0_)m%ld_(?1c+U5=eNqaTVP*IhK zVQgIB;m>#gS*@)fyhEW$tWc*!NV-}NwTNY0Sy^-jV8={R?Y~=anG3~aX%$ZSn7W&X znL0e0DTu|-2{eVxr3-|51a%$mg^7j?)>yw-^GkPuSq_2P-&oGc@^8G>)@KEP{~3Z2 zYHs1F4_2iBUUn`+=ATedF#$Tbf>9&xWbfwS=n7zmz}?)&4CDj^u(AmW{gwlEUS`2GV98lO3?dXL-GwX&c_H;sTzL2pC7pZ(oop2SP(l z`(aN0>r@^@=;u@vO@MX~QF;I}2#i}-XA?6EFm|n60W8drr(mrQ0=ij%NmF(M*@I1i zE8qeBYRrljAQN*FkO^1}Ss%nu#m2(S;#Y4!n}Y2Mq-PUXkfM{hjirr+Ih_O_8w(3J z3s|CAS-|4XN-qTdV^%S-0(Z;{RzP6chTJHacsaR&n3WwZel8WWvbYM+$=L!3vax_H zpt88MD|m4^9!3TWF0(qAN;8lK(8A)EqJW5~+Rs%K2UBV9Wc7a_Yp6MazzPfk0x&*J{?VP9g{zYr(CmR1I?ATD7G@CAWgS?+J#d2U7eqxnfaQRN z^JjOm4s75Xt_OC3XAEYl6Hpz3HOM-uLt1fwtp&K1xH_a2#B4v@Kw5G9Vg|Dmm`ZSc z4ULETzZk6XFv?G>prHY&&-q{#AnOWrGE=tz=`(}Zo>{}f69lFS%sTO(Cs{*gNl%cp zI%J;UUZsCh@c_Yxg?|u02p0dg%#cxk!r(WbG{EBVP!~d;goUda(8l>eo>@44E(8Ss z;?^cW04rE!Xxo^BtX=ilI3X1O^&dOfwSXLuGRRZNHRR03%>&?MVfh~&kh*{N$;-wH z;AUe3aB*=z91qv5tN^g*@K6r9e;AdA_h&uuGoD}9kY~T^LE1yExxmjM<&c9H%&y

4e-tuDJhYhQI0h>+BzB`n3{}o_~+|zdM6RHDneu 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

r(s`LD6N?wUgLsGC>hYZ-AfI`F+zLy?dY+qm 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 PtLfgNMW^7-HQoOg36%UE literal 0 HcmV?d00001 diff --git a/doc/bmx_020u.pdf b/doc/bmx_020u.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59b20f91ffb8a3e001e08f076146476664295008 GIT binary patch literal 687396 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

  • >Cu;p#E78@kexH9Vr^^B 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ƽ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 z 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%0A*;p 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

    xq8-&7-KzXtl#z(#r< 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 z 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 z

    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ô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≤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 a{^fuFo*h)n754R4zxvg0|MADKzxp2(R3e-J literal 0 HcmV?d00001 diff --git a/k/bmx0210t2WV.k b/k/bmx0210t2WV.k new file mode 100644 index 0000000..7b866be --- /dev/null +++ b/k/bmx0210t2WV.k @@ -0,0 +1,23582 @@ +KIDS Distribution saved on Aug 29, 2009@20:41:16 +BMX 2.1 for WV T2 +**KIDS**:BMX 2.1T2^ + +**INSTALL NAME** +BMX 2.1T2 +"BLD",7410,0) +BMX 2.1T2^BMXNET RPMS .NET UTILITIES^0^3090829^n +"BLD",7410,1,0) +^^4^4^3090829^^ +"BLD",7410,1,1,0) +BMXNet .NET Connectivity utilities for RPMS. +"BLD",7410,1,2,0) +Version 2.0 kids build to support BMXNet20.dll +"BLD",7410,1,3,0) + +"BLD",7410,1,4,0) +Version 2.1 adds support to GT.M. +"BLD",7410,4,0) +^9.64PA^90093.9^6 +"BLD",7410,4,90093.1,0) +90093.1 +"BLD",7410,4,90093.1,222) +y^y^f^^^^n +"BLD",7410,4,90093.2,0) +90093.2 +"BLD",7410,4,90093.2,222) +y^y^f^^^^n +"BLD",7410,4,90093.5,0) +90093.5 +"BLD",7410,4,90093.5,222) +y^y^f^^^^n +"BLD",7410,4,90093.9,0) +90093.9 +"BLD",7410,4,90093.9,222) +y^y^f^^^^n +"BLD",7410,4,90093.98,0) +90093.98 +"BLD",7410,4,90093.98,222) +y^y^f^^^^n +"BLD",7410,4,90093.99,0) +90093.99 +"BLD",7410,4,90093.99,222) +y^y^f^^n^^y^a^n +"BLD",7410,4,"B",90093.1,90093.1) + +"BLD",7410,4,"B",90093.2,90093.2) + +"BLD",7410,4,"B",90093.5,90093.5) + +"BLD",7410,4,"B",90093.9,90093.9) + +"BLD",7410,4,"B",90093.98,90093.98) + +"BLD",7410,4,"B",90093.99,90093.99) + +"BLD",7410,6.3) +4 +"BLD",7410,"ABPKG") +n +"BLD",7410,"INIT") + +"BLD",7410,"KRN",0) +^9.67PA^8989.52^19 +"BLD",7410,"KRN",.4,0) +.4 +"BLD",7410,"KRN",.4,"NM",0) +^9.68A^^ +"BLD",7410,"KRN",.401,0) +.401 +"BLD",7410,"KRN",.402,0) +.402 +"BLD",7410,"KRN",.402,"NM",0) +^9.68A^1^1 +"BLD",7410,"KRN",.402,"NM",1,0) +BMX MONITOR EDIT FILE #90093.5^90093.5^0 +"BLD",7410,"KRN",.402,"NM","B","BMX MONITOR EDIT FILE #90093.5",1) + +"BLD",7410,"KRN",.403,0) +.403 +"BLD",7410,"KRN",.5,0) +.5 +"BLD",7410,"KRN",.84,0) +.84 +"BLD",7410,"KRN",3.6,0) +3.6 +"BLD",7410,"KRN",3.8,0) +3.8 +"BLD",7410,"KRN",9.2,0) +9.2 +"BLD",7410,"KRN",9.8,0) +9.8 +"BLD",7410,"KRN",9.8,"NM",0) +^9.68A^116^59 +"BLD",7410,"KRN",9.8,"NM",45,0) +BMXADOV1^^0^B68620559 +"BLD",7410,"KRN",9.8,"NM",58,0) +BMXMON^^0^B117731908 +"BLD",7410,"KRN",9.8,"NM",59,0) +BMXADE1^^0^B11418056 +"BLD",7410,"KRN",9.8,"NM",60,0) +BMXADE2^^0^B13063702 +"BLD",7410,"KRN",9.8,"NM",61,0) +BMXADO^^0^B32349097 +"BLD",7410,"KRN",9.8,"NM",62,0) +BMXADO2^^0^B10227201 +"BLD",7410,"KRN",9.8,"NM",63,0) +BMXADOF^^0^B90964967 +"BLD",7410,"KRN",9.8,"NM",64,0) +BMXADOF1^^0^B12833341 +"BLD",7410,"KRN",9.8,"NM",65,0) +BMXADOF2^^0^B7123769 +"BLD",7410,"KRN",9.8,"NM",66,0) +BMXADOFD^^0^B8876207 +"BLD",7410,"KRN",9.8,"NM",67,0) +BMXADOFS^^0^B38538227 +"BLD",7410,"KRN",9.8,"NM",68,0) +BMXADOI^^0^B6267463 +"BLD",7410,"KRN",9.8,"NM",69,0) +BMXADOS^^0^B75110422 +"BLD",7410,"KRN",9.8,"NM",70,0) +BMXADOS1^^0^B9622665 +"BLD",7410,"KRN",9.8,"NM",71,0) +BMXADOV^^0^B22947698 +"BLD",7410,"KRN",9.8,"NM",72,0) +BMXADOV2^^0^B19908593 +"BLD",7410,"KRN",9.8,"NM",73,0) +BMXADOVJ^^0^B8677686 +"BLD",7410,"KRN",9.8,"NM",74,0) +BMXADOX^^0^B208011638 +"BLD",7410,"KRN",9.8,"NM",75,0) +BMXADOX1^^0^B84889528 +"BLD",7410,"KRN",9.8,"NM",76,0) +BMXADOX2^^0^B11989229 +"BLD",7410,"KRN",9.8,"NM",77,0) +BMXADOXX^^0^B166011930 +"BLD",7410,"KRN",9.8,"NM",78,0) +BMXADOXY^^0^B61093377 +"BLD",7410,"KRN",9.8,"NM",79,0) +BMXFIND^^0^B45092715 +"BLD",7410,"KRN",9.8,"NM",80,0) +BMXG^^0^B2718298 +"BLD",7410,"KRN",9.8,"NM",81,0) +BMXGETS^^0^B15016739 +"BLD",7410,"KRN",9.8,"NM",82,0) +BMXMBRK^^0^B32854296 +"BLD",7410,"KRN",9.8,"NM",83,0) +BMXMBRK2^^0^B17554247 +"BLD",7410,"KRN",9.8,"NM",84,0) +BMXMEVN^^0^B41862703 +"BLD",7410,"KRN",9.8,"NM",85,0) +BMXMSEC^^0^B8709977 +"BLD",7410,"KRN",9.8,"NM",86,0) +BMXPRS^^0^B8898368 +"BLD",7410,"KRN",9.8,"NM",87,0) +BMXRPC^^0^B17117580 +"BLD",7410,"KRN",9.8,"NM",88,0) +BMXRPC1^^0^B52168951 +"BLD",7410,"KRN",9.8,"NM",89,0) +BMXRPC2^^0^B11504982 +"BLD",7410,"KRN",9.8,"NM",90,0) +BMXRPC3^^0^B40379638 +"BLD",7410,"KRN",9.8,"NM",91,0) +BMXRPC4^^0^B28124037 +"BLD",7410,"KRN",9.8,"NM",92,0) +BMXRPC5^^0^B15030574 +"BLD",7410,"KRN",9.8,"NM",93,0) +BMXRPC6^^0^B14693179 +"BLD",7410,"KRN",9.8,"NM",94,0) +BMXRPC7^^0^B40496291 +"BLD",7410,"KRN",9.8,"NM",95,0) +BMXRPC8^^0^B5993639 +"BLD",7410,"KRN",9.8,"NM",96,0) +BMXRPC9^^0^B45877662 +"BLD",7410,"KRN",9.8,"NM",97,0) +BMXSQL^^0^B109951806 +"BLD",7410,"KRN",9.8,"NM",98,0) +BMXSQL1^^0^B112955506 +"BLD",7410,"KRN",9.8,"NM",99,0) +BMXSQL2^^0^B9590811 +"BLD",7410,"KRN",9.8,"NM",100,0) +BMXSQL3^^0^B190410807 +"BLD",7410,"KRN",9.8,"NM",101,0) +BMXSQL4^^0^B3594616 +"BLD",7410,"KRN",9.8,"NM",102,0) +BMXSQL5^^0^B51902207 +"BLD",7410,"KRN",9.8,"NM",103,0) +BMXSQL6^^0^B130304448 +"BLD",7410,"KRN",9.8,"NM",104,0) +BMXSQL7^^0^B65321243 +"BLD",7410,"KRN",9.8,"NM",105,0) +BMXSQL91^^0^B25109398 +"BLD",7410,"KRN",9.8,"NM",106,0) +BMXTABLE^^0^B130270 +"BLD",7410,"KRN",9.8,"NM",107,0) +BMXTRS^^0^B1202427 +"BLD",7410,"KRN",9.8,"NM",108,0) +BMXUTL1^^0^B39816098 +"BLD",7410,"KRN",9.8,"NM",109,0) +BMXUTL2^^0^B1806952 +"BLD",7410,"KRN",9.8,"NM",110,0) +BMXUTL5^^0^B16165811 +"BLD",7410,"KRN",9.8,"NM",111,0) +BMXUTL6^^0^B582471 +"BLD",7410,"KRN",9.8,"NM",112,0) +BMXUTL7^^0^B65930 +"BLD",7410,"KRN",9.8,"NM",114,0) +BMXE01^^0^B6931626 +"BLD",7410,"KRN",9.8,"NM",115,0) +BMXNTEG^^0^B7300059 +"BLD",7410,"KRN",9.8,"NM",116,0) +BMXPO^^0^B4666839 +"BLD",7410,"KRN",9.8,"NM","B","BMXADE1",59) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADE2",60) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADO",61) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADO2",62) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOF",63) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOF1",64) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOF2",65) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOFD",66) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOFS",67) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOI",68) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOS",69) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOS1",70) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOV",71) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOV1",45) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOV2",72) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOVJ",73) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOX",74) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOX1",75) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOX2",76) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOXX",77) + +"BLD",7410,"KRN",9.8,"NM","B","BMXADOXY",78) + +"BLD",7410,"KRN",9.8,"NM","B","BMXE01",114) + +"BLD",7410,"KRN",9.8,"NM","B","BMXFIND",79) + +"BLD",7410,"KRN",9.8,"NM","B","BMXG",80) + +"BLD",7410,"KRN",9.8,"NM","B","BMXGETS",81) + +"BLD",7410,"KRN",9.8,"NM","B","BMXMBRK",82) + +"BLD",7410,"KRN",9.8,"NM","B","BMXMBRK2",83) + +"BLD",7410,"KRN",9.8,"NM","B","BMXMEVN",84) + +"BLD",7410,"KRN",9.8,"NM","B","BMXMON",58) + +"BLD",7410,"KRN",9.8,"NM","B","BMXMSEC",85) + +"BLD",7410,"KRN",9.8,"NM","B","BMXNTEG",115) + +"BLD",7410,"KRN",9.8,"NM","B","BMXPO",116) + +"BLD",7410,"KRN",9.8,"NM","B","BMXPRS",86) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC",87) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC1",88) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC2",89) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC3",90) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC4",91) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC5",92) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC6",93) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC7",94) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC8",95) + +"BLD",7410,"KRN",9.8,"NM","B","BMXRPC9",96) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL",97) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL1",98) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL2",99) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL3",100) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL4",101) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL5",102) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL6",103) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL7",104) + +"BLD",7410,"KRN",9.8,"NM","B","BMXSQL91",105) + +"BLD",7410,"KRN",9.8,"NM","B","BMXTABLE",106) + +"BLD",7410,"KRN",9.8,"NM","B","BMXTRS",107) + +"BLD",7410,"KRN",9.8,"NM","B","BMXUTL1",108) + +"BLD",7410,"KRN",9.8,"NM","B","BMXUTL2",109) + +"BLD",7410,"KRN",9.8,"NM","B","BMXUTL5",110) + +"BLD",7410,"KRN",9.8,"NM","B","BMXUTL6",111) + +"BLD",7410,"KRN",9.8,"NM","B","BMXUTL7",112) + +"BLD",7410,"KRN",19,0) +19 +"BLD",7410,"KRN",19,"NM",0) +^9.68A^5^5 +"BLD",7410,"KRN",19,"NM",1,0) +BMX MONITOR EDIT^^0 +"BLD",7410,"KRN",19,"NM",2,0) +BMX MONITOR START^^0 +"BLD",7410,"KRN",19,"NM",3,0) +BMX MONITOR STOP^^0 +"BLD",7410,"KRN",19,"NM",4,0) +BMXMENU^^0 +"BLD",7410,"KRN",19,"NM",5,0) +BMXRPC^^0 +"BLD",7410,"KRN",19,"NM","B","BMX MONITOR EDIT",1) + +"BLD",7410,"KRN",19,"NM","B","BMX MONITOR START",2) + +"BLD",7410,"KRN",19,"NM","B","BMX MONITOR STOP",3) + +"BLD",7410,"KRN",19,"NM","B","BMXMENU",4) + +"BLD",7410,"KRN",19,"NM","B","BMXRPC",5) + +"BLD",7410,"KRN",19.1,0) +19.1 +"BLD",7410,"KRN",19.1,"NM",0) +^9.68A^1^1 +"BLD",7410,"KRN",19.1,"NM",1,0) +BMXZMENU^^0 +"BLD",7410,"KRN",19.1,"NM","B","BMXZMENU",1) + +"BLD",7410,"KRN",101,0) +101 +"BLD",7410,"KRN",101,"NM",0) +^9.68A^^ +"BLD",7410,"KRN",409.61,0) +409.61 +"BLD",7410,"KRN",409.61,"NM",0) +^9.68A^^ +"BLD",7410,"KRN",771,0) +771 +"BLD",7410,"KRN",870,0) +870 +"BLD",7410,"KRN",8989.51,0) +8989.51 +"BLD",7410,"KRN",8989.51,"NM",0) +^9.68A^^ +"BLD",7410,"KRN",8989.52,0) +8989.52 +"BLD",7410,"KRN",8994,0) +8994 +"BLD",7410,"KRN",8994,"NM",0) +^9.68A^44^44 +"BLD",7410,"KRN",8994,"NM",1,0) +BMX ADO SS^^0 +"BLD",7410,"KRN",8994,"NM",2,0) +BMX ASYNC GET^^0 +"BLD",7410,"KRN",8994,"NM",3,0) +BMX ASYNC QUEUE^^0 +"BLD",7410,"KRN",8994,"NM",4,0) +BMX AV CODE^^0 +"BLD",7410,"KRN",8994,"NM",5,0) +BMX DEMO^^0 +"BLD",7410,"KRN",8994,"NM",6,0) +BMX DENTAL REPORT 1^^0 +"BLD",7410,"KRN",8994,"NM",7,0) +BMX DENTAL REPORT 2^^0 +"BLD",7410,"KRN",8994,"NM",8,0) +BMX EVENT POLL^^0 +"BLD",7410,"KRN",8994,"NM",9,0) +BMX EVENT RAISE^^0 +"BLD",7410,"KRN",8994,"NM",10,0) +BMX EVENT REGISTER^^0 +"BLD",7410,"KRN",8994,"NM",11,0) +BMX EVENT UNREGISTER^^0 +"BLD",7410,"KRN",8994,"NM",12,0) +BMX FIELD LIST^^0 +"BLD",7410,"KRN",8994,"NM",13,0) +BMX FIND^^0 +"BLD",7410,"KRN",8994,"NM",14,0) +BMX GET VARIABLE VALUE^^0 +"BLD",7410,"KRN",8994,"NM",15,0) +BMX HEALTH SUMMARY^^0 +"BLD",7410,"KRN",8994,"NM",16,0) +BMX IM HERE^^0 +"BLD",7410,"KRN",8994,"NM",17,0) +BMX LOCK^^0 +"BLD",7410,"KRN",8994,"NM",18,0) +BMX LOOKUP^^0 +"BLD",7410,"KRN",8994,"NM",19,0) +BMX MULT LIST^^0 +"BLD",7410,"KRN",8994,"NM",20,0) +BMX NTUSER^^0 +"BLD",7410,"KRN",8994,"NM",21,0) +BMX PATIENT DEMOG DATA GET^^0 +"BLD",7410,"KRN",8994,"NM",22,0) +BMX PDATA CHART^^0 +"BLD",7410,"KRN",8994,"NM",23,0) +BMX SCHEMA ONLY^^0 +"BLD",7410,"KRN",8994,"NM",24,0) +BMX SECURITY KEY^^0 +"BLD",7410,"KRN",8994,"NM",25,0) +BMX SIGNATURE^^0 +"BLD",7410,"KRN",8994,"NM",26,0) +BMX SQL^^0 +"BLD",7410,"KRN",8994,"NM",27,0) +BMX SQL COLINFO^^0 +"BLD",7410,"KRN",8994,"NM",28,0) +BMX TABLE^^0 +"BLD",7410,"KRN",8994,"NM",29,0) +BMX TEST^^0 +"BLD",7410,"KRN",8994,"NM",30,0) +BMX TIMER TEST^^0 +"BLD",7410,"KRN",8994,"NM",31,0) +BMX TLIST^^0 +"BLD",7410,"KRN",8994,"NM",32,0) +BMX UPDATE^^0 +"BLD",7410,"KRN",8994,"NM",33,0) +BMX USER^^0 +"BLD",7410,"KRN",8994,"NM",34,0) +BMX VERSION INFO^^0 +"BLD",7410,"KRN",8994,"NM",35,0) +BMXGetFac^^0 +"BLD",7410,"KRN",8994,"NM",36,0) +BMXGetFacRS^^0 +"BLD",7410,"KRN",8994,"NM",37,0) +BMXNRC^^0 +"BLD",7410,"KRN",8994,"NM",38,0) +BMXNetGetCodes^^0 +"BLD",7410,"KRN",8994,"NM",39,0) +BMXNetSetUser^^0 +"BLD",7410,"KRN",8994,"NM",40,0) +BMXPatientInfoRS^^0 +"BLD",7410,"KRN",8994,"NM",41,0) +BMXPatientLookupRS^^0 +"BLD",7410,"KRN",8994,"NM",42,0) +BMXProviderLookupRS^^0 +"BLD",7410,"KRN",8994,"NM",43,0) +BMXSetFac^^0 +"BLD",7410,"KRN",8994,"NM",44,0) +BMXUserKeyRS^^0 +"BLD",7410,"KRN",8994,"NM","B","BMX ADO SS",1) + +"BLD",7410,"KRN",8994,"NM","B","BMX ASYNC GET",2) + +"BLD",7410,"KRN",8994,"NM","B","BMX ASYNC QUEUE",3) + +"BLD",7410,"KRN",8994,"NM","B","BMX AV CODE",4) + +"BLD",7410,"KRN",8994,"NM","B","BMX DEMO",5) + +"BLD",7410,"KRN",8994,"NM","B","BMX DENTAL REPORT 1",6) + +"BLD",7410,"KRN",8994,"NM","B","BMX DENTAL REPORT 2",7) + +"BLD",7410,"KRN",8994,"NM","B","BMX EVENT POLL",8) + +"BLD",7410,"KRN",8994,"NM","B","BMX EVENT RAISE",9) + +"BLD",7410,"KRN",8994,"NM","B","BMX EVENT REGISTER",10) + +"BLD",7410,"KRN",8994,"NM","B","BMX EVENT UNREGISTER",11) + +"BLD",7410,"KRN",8994,"NM","B","BMX FIELD LIST",12) + +"BLD",7410,"KRN",8994,"NM","B","BMX FIND",13) + +"BLD",7410,"KRN",8994,"NM","B","BMX GET VARIABLE VALUE",14) + +"BLD",7410,"KRN",8994,"NM","B","BMX HEALTH SUMMARY",15) + +"BLD",7410,"KRN",8994,"NM","B","BMX IM HERE",16) + +"BLD",7410,"KRN",8994,"NM","B","BMX LOCK",17) + +"BLD",7410,"KRN",8994,"NM","B","BMX LOOKUP",18) + +"BLD",7410,"KRN",8994,"NM","B","BMX MULT LIST",19) + +"BLD",7410,"KRN",8994,"NM","B","BMX NTUSER",20) + +"BLD",7410,"KRN",8994,"NM","B","BMX PATIENT DEMOG DATA GET",21) + +"BLD",7410,"KRN",8994,"NM","B","BMX PDATA CHART",22) + +"BLD",7410,"KRN",8994,"NM","B","BMX SCHEMA ONLY",23) + +"BLD",7410,"KRN",8994,"NM","B","BMX SECURITY KEY",24) + +"BLD",7410,"KRN",8994,"NM","B","BMX SIGNATURE",25) + +"BLD",7410,"KRN",8994,"NM","B","BMX SQL",26) + +"BLD",7410,"KRN",8994,"NM","B","BMX SQL COLINFO",27) + +"BLD",7410,"KRN",8994,"NM","B","BMX TABLE",28) + +"BLD",7410,"KRN",8994,"NM","B","BMX TEST",29) + +"BLD",7410,"KRN",8994,"NM","B","BMX TIMER TEST",30) + +"BLD",7410,"KRN",8994,"NM","B","BMX TLIST",31) + +"BLD",7410,"KRN",8994,"NM","B","BMX UPDATE",32) + +"BLD",7410,"KRN",8994,"NM","B","BMX USER",33) + +"BLD",7410,"KRN",8994,"NM","B","BMX VERSION INFO",34) + +"BLD",7410,"KRN",8994,"NM","B","BMXGetFac",35) + +"BLD",7410,"KRN",8994,"NM","B","BMXGetFacRS",36) + +"BLD",7410,"KRN",8994,"NM","B","BMXNRC",37) + +"BLD",7410,"KRN",8994,"NM","B","BMXNetGetCodes",38) + +"BLD",7410,"KRN",8994,"NM","B","BMXNetSetUser",39) + +"BLD",7410,"KRN",8994,"NM","B","BMXPatientInfoRS",40) + +"BLD",7410,"KRN",8994,"NM","B","BMXPatientLookupRS",41) + +"BLD",7410,"KRN",8994,"NM","B","BMXProviderLookupRS",42) + +"BLD",7410,"KRN",8994,"NM","B","BMXSetFac",43) + +"BLD",7410,"KRN",8994,"NM","B","BMXUserKeyRS",44) + +"BLD",7410,"KRN","B",.4,.4) + +"BLD",7410,"KRN","B",.401,.401) + +"BLD",7410,"KRN","B",.402,.402) + +"BLD",7410,"KRN","B",.403,.403) + +"BLD",7410,"KRN","B",.5,.5) + +"BLD",7410,"KRN","B",.84,.84) + +"BLD",7410,"KRN","B",3.6,3.6) + +"BLD",7410,"KRN","B",3.8,3.8) + +"BLD",7410,"KRN","B",9.2,9.2) + +"BLD",7410,"KRN","B",9.8,9.8) + +"BLD",7410,"KRN","B",19,19) + +"BLD",7410,"KRN","B",19.1,19.1) + +"BLD",7410,"KRN","B",101,101) + +"BLD",7410,"KRN","B",409.61,409.61) + +"BLD",7410,"KRN","B",771,771) + +"BLD",7410,"KRN","B",870,870) + +"BLD",7410,"KRN","B",8989.51,8989.51) + +"BLD",7410,"KRN","B",8989.52,8989.52) + +"BLD",7410,"KRN","B",8994,8994) + +"BLD",7410,"PRE") +BMXE01 +"BLD",7410,"QUES",0) +^9.62^^ +"BLD",7410,"REQB",0) +^9.611^^ +"DATA",90093.99,1,0) +TEST^2160010 +"DATA",90093.99,1,1,0) +^90093.991^6^6 +"DATA",90093.99,1,1,1,0) +.01^T^30^PATIENT^0^0^0 +"DATA",90093.99,1,1,2,0) +.02^T^6^SEX^0^0^1 +"DATA",90093.99,1,1,3,0) +.03^D^12^DOB^0^0^1 +"DATA",90093.99,1,1,4,0) +.04^T^30^LOCAL FACILITY^0^0^1 +"DATA",90093.99,1,1,5,0) +.04IEN^T^00009^LOCAL FACILITY_IEN^0^0^1 +"DATA",90093.99,1,1,6,0) +.01ID^T^99^IDENTIFIERS^1^0^1 +"DATA",90093.99,1,1,6,1) +TESTID^BMXADOV1 +"DATA",90093.99,1,2,0) +^90093.992^1^1 +"DATA",90093.99,1,2,1,0) +ALL PATIENTS +"DATA",90093.99,1,2,1,1) +ALL^BMXADO +"DATA",90093.99,1,2,1,2,0) +^90093.9922^2^2 +"DATA",90093.99,1,2,1,2,1,0) +DFN^PATIENT IEN +"DATA",90093.99,1,2,1,2,2,0) +IEN^VISIT IEN +"DATA",90093.99,2,0) +TEST1^2160010 +"DATA",90093.99,2,1,0) +^90093.991^6^6 +"DATA",90093.99,2,1,1,0) +.03^D^8^DOB^0^0^1 +"DATA",90093.99,2,1,2,0) +.04^T^40^LOCAL_FACILITY^0^1^1 +"DATA",90093.99,2,1,3,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,2,1,4,0) +.02^T^4^SEX^0^0^1 +"DATA",90093.99,2,1,5,0) +.09^T^30^SSN^0^0^1 +"DATA",90093.99,2,1,6,0) +.08^T^30^RELIGION^0^0^1 +"DATA",90093.99,3,0) +VISIT^9000010 +"DATA",90093.99,3,1,0) +^90093.991^6^6 +"DATA",90093.99,3,1,1,0) +.01^D^12^TIMESTAMP^0^0^0 +"DATA",90093.99,3,1,2,0) +.03^T^3^TYPE^0^0^0 +"DATA",90093.99,3,1,3,0) +.05^T^30^PATIENT^0^0^0 +"DATA",90093.99,3,1,4,0) +.06^T^30^FACILITY^0^0^0 +"DATA",90093.99,3,1,5,0) +.07^T^10^CATEGORY^0^0^0 +"DATA",90093.99,3,1,6,0) +.08^T^30^CLINIC^0^0^1 +"DATA",90093.99,3,2,0) +^90093.992^1^1 +"DATA",90093.99,3,2,1,0) +POSSIBLE MATCHES +"DATA",90093.99,3,2,1,1) +VLIST^BMXADOF1 +"DATA",90093.99,4,0) +GREG^2 +"DATA",90093.99,4,1,0) +^90093.991^9^6 +"DATA",90093.99,4,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,4,1,2,0) +.02^T^4^SEX^0^0^0 +"DATA",90093.99,4,1,3,0) +.03^D^12^DOB^0^0^0 +"DATA",90093.99,4,1,4,0) +.04IEN^T^00009^LOCAL FACILITY_IEN^0^0^1 +"DATA",90093.99,4,1,8,0) +.01ID^T^00017^NAME_ID^0^0^0 +"DATA",90093.99,4,1,8,1) +DEMOGR^BMXADOX +"DATA",90093.99,4,1,9,0) +.04^T^30^LOCAL FACILITY^0^0^1 +"DATA",90093.99,5,0) +TEST2^2160010.111 +"DATA",90093.99,5,1,0) +^90093.991^2^2 +"DATA",90093.99,5,1,1,0) +.01^T^30^MEDICATION INSTRUCTIONS^0^0^1 +"DATA",90093.99,5,1,2,0) +.02^T^4^LEVEL OF UNDERSTANDING^0^0^1 +"DATA",90093.99,6,0) +IHS PATIENT^9000001 +"DATA",90093.99,6,1,0) +^90093.991^3^3 +"DATA",90093.99,6,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,6,1,2,0) +.02^D^21^DATE ESTABLISHED^0^0^1 +"DATA",90093.99,6,1,3,0) +.06^T^9^PCIS ID NO.^0^0^1 +"DATA",90093.99,7,0) +VISITS^9000010^0 +"DATA",90093.99,7,1,0) +^90093.991^7^7 +"DATA",90093.99,7,1,1,0) +.01^D^21^TIMESTAMP^0^0^0 +"DATA",90093.99,7,1,2,0) +.03^T^3^TYPE^0^0^0 +"DATA",90093.99,7,1,3,0) +.05^T^30^PATIENT^0^0^0 +"DATA",90093.99,7,1,4,0) +.06^T^30^FACILITY^0^0^0 +"DATA",90093.99,7,1,5,0) +.07^T^10^CATEGORY^0^0^0 +"DATA",90093.99,7,1,6,0) +.08^T^30^CLINIC^0^0^1 +"DATA",90093.99,7,1,7,0) +.05IEN^N^15^PATIENT_IEN^1^0^0 +"DATA",90093.99,8,0) +MEASUREMENTS^9000010.01 +"DATA",90093.99,8,1,0) +^90093.991^4^4 +"DATA",90093.99,8,1,1,0) +.02^T^30^PATIENT NAME^0^0^1 +"DATA",90093.99,8,1,2,0) +.03^T^30^VISIT^0^0^1 +"DATA",90093.99,8,1,3,0) +.01^T^30^TYPE^0^0^1 +"DATA",90093.99,8,1,4,0) +.04^T^100^VALUE^0^0^1 +"DATA",90093.99,9,0) +XVISIT^2160010.01 +"DATA",90093.99,9,1,0) +^90093.991^2^2 +"DATA",90093.99,9,1,1,0) +.01^D^21^VISIT^0^0^1 +"DATA",90093.99,9,1,2,0) +.02^T^30^CLINIC^0^0^1 +"DATA",90093.99,10,0) +ICD^80 +"DATA",90093.99,10,1,0) +^90093.991^3^3 +"DATA",90093.99,10,1,1,0) +.01^T^7^CODE NUMBER^0^0^1 +"DATA",90093.99,10,1,2,0) +2^T^10^IDENTIFIER^0^0^1 +"DATA",90093.99,10,1,3,0) +3^T^30^DIAGNOSIS^0^0^1 +"DATA",90093.99,11,0) +PATIENT DEMOGRAPHICS^2^0 +"DATA",90093.99,11,1,0) +^90093.991^5^5 +"DATA",90093.99,11,1,1,0) +.01^T^30^NAME^0^0^0^0 +"DATA",90093.99,11,1,2,0) +.02^T^4^SEX^0^0^1 +"DATA",90093.99,11,1,3,0) +.03^D^21^DOB^0^0^1 +"DATA",90093.99,11,1,4,0) +.09^T^30^SSN^0^0^1 +"DATA",90093.99,11,1,5,0) +.03TRIGGER1^D^21^IDOB^1^0^1 +"DATA",90093.99,11,1,5,3) +DATE^BMXADOI +"DATA",90093.99,12,0) +VIEW POVS^9000010.07 +"DATA",90093.99,12,1,0) +^90093.991^8^8 +"DATA",90093.99,12,1,1,0) +.01^T^30^POV^0^0^0 +"DATA",90093.99,12,1,2,0) +.01IEN^T^00009^POV_IEN^0^0^0 +"DATA",90093.99,12,1,3,0) +.02^T^30^PATIENT^0^0^0 +"DATA",90093.99,12,1,4,0) +.02IEN^T^00009^PATIENT_IEN^0^0^0 +"DATA",90093.99,12,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,12,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,12,1,7,0) +.04^T^30^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,12,1,8,0) +.04IEN^T^00009^PROVIDER NARRATIVE_IEN^0^0^0 +"DATA",90093.99,13,0) +UPDATE PATIENT DEMOGRAPHICS^2 +"DATA",90093.99,13,1,0) +^90093.991^13^13 +"DATA",90093.99,13,1,1,0) +.09^T^30^SSN^0^0^0 +"DATA",90093.99,13,1,2,0) +.111^T^50^MAILING ADDRESS-STREET^0^0^1 +"DATA",90093.99,13,1,3,0) +.112^T^30^STREET ADDRESS [LINE 2]^0^0^1 +"DATA",90093.99,13,1,4,0) +.114^T^30^MAILING ADDRESS-CITY^0^0^1 +"DATA",90093.99,13,1,5,0) +.115^T^30^MAILING ADDRESS-STATE^0^0^1 +"DATA",90093.99,13,1,6,0) +.115IEN^T^00009^MAILING ADDRESS-STATE_IEN^0^0^1 +"DATA",90093.99,13,1,7,0) +.116^T^10^MAILING ADDRESS-ZIP^0^0^1 +"DATA",90093.99,13,1,8,0) +.131^T^20^HOME PHONE^0^0^1 +"DATA",90093.99,13,1,9,0) +.132^T^20^OFFICE PHONE^0^0^1 +"DATA",90093.99,13,1,10,0) +.3111^T^30^EMPLOYER^0^0^1 +"DATA",90093.99,13,1,11,0) +.31115^T^18^EMPLOYMENT STATUS^0^0^1 +"DATA",90093.99,13,1,12,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,13,1,13,0) +.01ID^T^00017^NAME_ID^0^0^0 +"DATA",90093.99,13,1,13,1) +DEMOID^BMXADOI +"DATA",90093.99,14,0) +UPDATE PVT INSURANCE INFO^9000006.11 +"DATA",90093.99,14,1,0) +^90093.991^7^7 +"DATA",90093.99,14,1,1,0) +.01^T^30^INSURER^0^0^0 +"DATA",90093.99,14,1,2,0) +.01IEN^T^00009^INSURER_IEN^0^0^0 +"DATA",90093.99,14,1,3,0) +.02^T^30^POLICY NUMBER^0^0^1 +"DATA",90093.99,14,1,4,0) +.04^T^30^NAME OF INSURED^0^0^1 +"DATA",90093.99,14,1,5,0) +.05^T^30^RELATIONSHIP^0^0^1 +"DATA",90093.99,14,1,6,0) +.06^D^21^ELIG. DATE^0^0^1 +"DATA",90093.99,14,1,7,0) +.07^D^21^ELIG. END DATE^0^0^1 +"DATA",90093.99,15,0) +UPDATE MEDICARE INFO^9000003 +"DATA",90093.99,15,1,0) +^90093.991^6^6 +"DATA",90093.99,15,1,1,0) +.01^T^30^PATIENT NAME^0^0^1 +"DATA",90093.99,15,1,2,0) +.01IEN^T^00009^PATIENT NAME_IEN^0^0^1 +"DATA",90093.99,15,1,3,0) +.03^T^9^MEDICARE NUMBER^0^0^1 +"DATA",90093.99,15,1,4,0) +.04^T^30^SUFFIX^0^0^1 +"DATA",90093.99,15,1,5,0) +.04IEN^T^00009^SUFFIX_IEN^0^0^1 +"DATA",90093.99,15,1,6,0) +.15^T^3^MEDICARE CARD COPY ON FILE^0^0^1 +"DATA",90093.99,16,0) +UPDATE MEDICARE DATES^9000003.11 +"DATA",90093.99,16,1,0) +^90093.991^3^3 +"DATA",90093.99,16,1,1,0) +.01^D^21^ELIG. DATE^0^0^1 +"DATA",90093.99,16,1,2,0) +.02^D^21^ELIG. END DATE^0^0^1 +"DATA",90093.99,16,1,3,0) +.03^T^1^COVERAGE TYPE^0^0 +"DATA",90093.99,17,0) +UPDATE MEDICAID INFO^9000004 +"DATA",90093.99,17,1,0) +^90093.991^7^7 +"DATA",90093.99,17,1,1,0) +.01^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,17,1,2,0) +.01IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,17,1,3,0) +.02^T^30^INSURER POINTER^0^0^1 +"DATA",90093.99,17,1,4,0) +.02IEN^T^00009^INSURER POINTER_IEN^0^0^1 +"DATA",90093.99,17,1,5,0) +.03^T^30^MEDICAID NUMBER^0^0^1 +"DATA",90093.99,17,1,6,0) +.04^T^30^STATE^0^0^1 +"DATA",90093.99,17,1,7,0) +.04IEN^T^00009^STATE_IEN^0^0^1 +"DATA",90093.99,18,0) +UPDATE MEDICAID DATES^9000004.11 +"DATA",90093.99,18,1,0) +^90093.991^3^3 +"DATA",90093.99,18,1,1,0) +.01^D^21^ELIG. DATE^0^0^0 +"DATA",90093.99,18,1,2,0) +.02^D^21^ELIG. END DATE^0^0^1 +"DATA",90093.99,18,1,3,0) +.03^T^2^COVERAGE TYPE^0^0^1 +"DATA",90093.99,19,0) +VIEW PROBLEMS^9000011 +"DATA",90093.99,19,1,0) +^90093.991^13^13 +"DATA",90093.99,19,1,1,0) +.01^T^30^ICD CODE^0^0^0 +"DATA",90093.99,19,1,2,0) +.01IEN^T^00009^ICD CODE_IEN^0^0^0 +"DATA",90093.99,19,1,3,0) +.02^T^30^PATIENT^0^0^0 +"DATA",90093.99,19,1,4,0) +.02IEN^T^00009^PATIENT_IEN^0^0^0 +"DATA",90093.99,19,1,5,0) +.03^D^21^DATE LAST MODIFIED^0^0^1 +"DATA",90093.99,19,1,6,0) +.04^T^16^CLASS^0^0^1 +"DATA",90093.99,19,1,7,0) +.05^T^30^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,19,1,8,0) +.05IEN^T^00009^PROVIDER NARRATIVE_IEN^0^0^1 +"DATA",90093.99,19,1,9,0) +.08^D^21^DATE ENTERED^0^0^1 +"DATA",90093.99,19,1,10,0) +.12^T^6^STATUS^0^0^1 +"DATA",90093.99,19,1,11,0) +.06^T^30^FACILITY^0^0^1 +"DATA",90093.99,19,1,12,0) +.06IEN^T^00009^FACILITY_IEN^0^0^1 +"DATA",90093.99,19,1,13,0) +.07^N^9^NMBR^0^0^1 +"DATA",90093.99,20,0) +UPDATE POVS^9000010.07 +"DATA",90093.99,20,1,0) +^90093.991^6^6 +"DATA",90093.99,20,1,1,0) +.01^T^30^POV^0^0^0 +"DATA",90093.99,20,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,20,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,20,1,4,0) +.04^T^30^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,20,1,5,0) +.08^T^11^FIRST/REVISIT^0^0^1 +"DATA",90093.99,20,1,6,0) +.12^T^7^PRIMARY/SECONDARY^0^0^1 +"DATA",90093.99,21,0) +VIEW MEASUREMENTS^9000010.01 +"DATA",90093.99,21,1,0) +^90093.991^7^7 +"DATA",90093.99,21,1,1,0) +.01^T^30^TYPE^0^0^0 +"DATA",90093.99,21,1,2,0) +.01IEN^T^00009^TYPE_IEN^0^0^0 +"DATA",90093.99,21,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,21,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,21,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,21,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,21,1,7,0) +.04^T^100^VALUE^0^0^1 +"DATA",90093.99,22,0) +UPDATE MEASUREMENTS^9000010.01 +"DATA",90093.99,22,1,0) +^90093.991^5^5 +"DATA",90093.99,22,1,1,0) +.01^T^30^TYPE^0^0^0 +"DATA",90093.99,22,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,22,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,22,1,4,0) +.04^T^100^VALUE^0^0^1 +"DATA",90093.99,22,1,5,0) +99^T^30^METHOD^0^0^1 +"DATA",90093.99,23,0) +VIEW MEDS^9000010.14 +"DATA",90093.99,23,1,0) +^90093.991^8^8 +"DATA",90093.99,23,1,1,0) +.01^T^30^MEDICATION^0^0^0 +"DATA",90093.99,23,1,2,0) +.01IEN^T^00009^MEDICATION_IEN^0^0^0 +"DATA",90093.99,23,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,23,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,23,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,23,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,23,1,7,0) +.05^T^32^SIG^0^0^1 +"DATA",90093.99,23,1,8,0) +.06^I^7^QUANTITY^0^0^1 +"DATA",90093.99,24,0) +UPDATE MEDS^9000010.14 +"DATA",90093.99,24,1,0) +^90093.991^5^5 +"DATA",90093.99,24,1,1,0) +.01^T^30^MEDICATION^0^0^0 +"DATA",90093.99,24,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,24,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,24,1,4,0) +.05^T^32^SIG^0^0^1 +"DATA",90093.99,24,1,5,0) +.06^I^7^QUANTITY^0^0^1 +"DATA",90093.99,25,0) +VIEW LABS^9000010.09 +"DATA",90093.99,25,1,0) +^90093.991^7^7 +"DATA",90093.99,25,1,1,0) +.01^T^30^LAB TEST^0^0^0 +"DATA",90093.99,25,1,2,0) +.01IEN^T^00009^LAB TEST_IEN^0^0^0 +"DATA",90093.99,25,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,25,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,25,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,25,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,25,1,7,0) +.04^T^200^RESULTS^0^0^1 +"DATA",90093.99,26,0) +UPDATE LABS^9000010.09 +"DATA",90093.99,26,1,0) +^90093.991^5^5 +"DATA",90093.99,26,1,1,0) +.01^T^30^LAB TEST^0^0^0 +"DATA",90093.99,26,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,26,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,26,1,4,0) +.04^T^200^RESULTS^0^0^0 +"DATA",90093.99,26,1,5,0) +.05^T^2^ABNORMAL^0^0^1 +"DATA",90093.99,27,0) +VIEW EXAMS^9000010.13 +"DATA",90093.99,27,1,0) +^90093.991^7^7 +"DATA",90093.99,27,1,1,0) +.01^T^30^EXAM^0^0^0 +"DATA",90093.99,27,1,2,0) +.01IEN^T^00009^EXAM_IEN^0^0^0 +"DATA",90093.99,27,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,27,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,27,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,27,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,27,1,7,0) +.04^T^8^RESULT^0^0^1 +"DATA",90093.99,28,0) +UPDATE EXAMS^9000010.13 +"DATA",90093.99,28,1,0) +^90093.991^4^4 +"DATA",90093.99,28,1,1,0) +.01^T^30^EXAM^0^0^0 +"DATA",90093.99,28,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,28,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,28,1,4,0) +.04^T^8^RESULT^0^0^1 +"DATA",90093.99,29,0) +VIEW IMM^9000010.11 +"DATA",90093.99,29,1,0) +^90093.991^7^7 +"DATA",90093.99,29,1,1,0) +.01^T^30^IMMUNIZATION^0^0^0 +"DATA",90093.99,29,1,2,0) +.01IEN^T^00009^IMMUNIZATION_IEN^0^0^0 +"DATA",90093.99,29,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,29,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,29,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,29,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,29,1,7,0) +.04^T^18^SERIES^0^0^1 +"DATA",90093.99,30,0) +UPDATE IMM^9000010.11 +"DATA",90093.99,30,1,0) +^90093.991^4^4 +"DATA",90093.99,30,1,1,0) +.01^T^30^IMMUNIZATION^0^0^0 +"DATA",90093.99,30,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,30,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,30,1,4,0) +.04^T^18^SERIES^0^0^1 +"DATA",90093.99,31,0) +VIEW PROV^9000010.06 +"DATA",90093.99,31,1,0) +^90093.991^7^7 +"DATA",90093.99,31,1,1,0) +.01^T^30^PROVIDER^0^0^0 +"DATA",90093.99,31,1,2,0) +.01IEN^T^00009^PROVIDER_IEN^0^0^0 +"DATA",90093.99,31,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,31,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,31,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,31,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,31,1,7,0) +.04^T^7^PRIMARY/SECONDARY^0^0^1 +"DATA",90093.99,32,0) +UPDATE PROV^9000010.06 +"DATA",90093.99,32,1,0) +^90093.991^4^4 +"DATA",90093.99,32,1,1,0) +.01^T^30^PROVIDER^0^0^0 +"DATA",90093.99,32,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,32,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,32,1,4,0) +.04^T^7^PRIMARY/SECONDARY^0^0^1 +"DATA",90093.99,33,0) +VIEW PROCEDURES^9000010.08 +"DATA",90093.99,33,1,0) +^90093.991^8^8 +"DATA",90093.99,33,1,1,0) +.01^T^30^PROCEDURE^0^0^0 +"DATA",90093.99,33,1,2,0) +.01IEN^T^00009^PROCEDURE_IEN^0^0^0 +"DATA",90093.99,33,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,33,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,33,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,33,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,33,1,7,0) +.05^T^30^DIAGNOSIS^0^0^1 +"DATA",90093.99,33,1,8,0) +.05IEN^T^00009^DIAGNOSIS_IEN^0^0^1 +"DATA",90093.99,34,0) +UPDATE PROCEDURES^9000010.08 +"DATA",90093.99,34,1,0) +^90093.991^4^4 +"DATA",90093.99,34,1,1,0) +.01^T^30^PROCEDURE^0^0^0 +"DATA",90093.99,34,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,34,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,34,1,4,0) +.05^T^30^DIAGNOSIS^0^0^1 +"DATA",90093.99,35,0) +VIEW CPT^9000010.18 +"DATA",90093.99,35,1,0) +^90093.991^6^6 +"DATA",90093.99,35,1,1,0) +.01^T^30^CPT^0^0^0 +"DATA",90093.99,35,1,2,0) +.01IEN^T^00009^CPT_IEN^0^0^0 +"DATA",90093.99,35,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,35,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,35,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,35,1,6,0) +.03IEN^T^00009^VISIT_IEN^0^0^0 +"DATA",90093.99,36,0) +UPDATE CPT^9000010.18 +"DATA",90093.99,36,1,0) +^90093.991^4^4 +"DATA",90093.99,36,1,1,0) +.01^T^30^CPT^0^0^0 +"DATA",90093.99,36,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,36,1,3,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,36,1,4,0) +.04^T^30^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,37,0) +VIEW HEALTH FACTORS^9000019 +"DATA",90093.99,37,1,0) +^90093.991^5^5 +"DATA",90093.99,37,1,1,0) +.01^T^30^HEALTH FACTOR^0^0^0 +"DATA",90093.99,37,1,2,0) +.01IEN^T^00009^HEALTH FACTOR_IEN^0^0^0 +"DATA",90093.99,37,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,37,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,37,1,5,0) +.03^D^21^DATE NOTED^0^0^1 +"DATA",90093.99,38,0) +UPDATE HEALTH FACTORS^9000019 +"DATA",90093.99,38,1,0) +^90093.991^3^3 +"DATA",90093.99,38,1,1,0) +.01^T^30^HEALTH FACTOR^0^0^0 +"DATA",90093.99,38,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,38,1,3,0) +.03^D^21^DATE NOTED^0^0^1 +"DATA",90093.99,39,0) +UPDATE PROBLEMS^9000011 +"DATA",90093.99,39,1,0) +^90093.991^9^9 +"DATA",90093.99,39,1,1,0) +.01^T^30^DIAGNOSIS^0^0^0 +"DATA",90093.99,39,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,39,1,3,0) +.03^D^21^DATE LAST MODIFIED^0^0^1 +"DATA",90093.99,39,1,4,0) +.04^T^16^CLASS^0^0^1 +"DATA",90093.99,39,1,5,0) +.05^T^30^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,39,1,6,0) +.06^T^30^FACILITY^0^0^0 +"DATA",90093.99,39,1,7,0) +.07^N^9^NMBR^0^0^0 +"DATA",90093.99,39,1,8,0) +.08^D^21^DATE ENTERED^0^0^1 +"DATA",90093.99,39,1,9,0) +.12^T^6^STATUS^0^0^0 +"DATA",90093.99,40,0) +WEIGHT^9000010.01 +"DATA",90093.99,40,1,0) +^90093.991^1^1 +"DATA",90093.99,40,1,1,0) +.02 +"DATA",90093.99,41,0) +VIEW PERSONAL HISTORY^9000013 +"DATA",90093.99,41,1,0) +^90093.991^8^8 +"DATA",90093.99,41,1,1,0) +.01^T^30^DIAGNOSIS^0^0^0 +"DATA",90093.99,41,1,2,0) +.01IEN^T^00009^DIAGNOSIS_IEN^0^0^0 +"DATA",90093.99,41,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,41,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,41,1,5,0) +.03^D^21^DATE NOTED^0^0^1 +"DATA",90093.99,41,1,6,0) +.04^T^30^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,41,1,7,0) +.04IEN^T^00009^PROVIDER NARRATIVE_IEN^0^0^1 +"DATA",90093.99,41,1,8,0) +.05^D^21^DATE OF ONSET^0^0^1 +"DATA",90093.99,42,0) +UPDATE PERSONAL HISTORY^9000013 +"DATA",90093.99,42,1,0) +^90093.991^5^5 +"DATA",90093.99,42,1,1,0) +.01^T^30^DIAGNOSIS^0^0^0 +"DATA",90093.99,42,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,42,1,3,0) +.03^D^21^DATE NOTED^0^0^1 +"DATA",90093.99,42,1,4,0) +.04^T^30^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,42,1,5,0) +.05^D^21^DATE OF ONSET^0^0^1 +"DATA",90093.99,43,0) +VIEW FAMILY HISTORY^9000014 +"DATA",90093.99,43,1,0) +^90093.991^7^7 +"DATA",90093.99,43,1,1,0) +.01^T^30^DIAGNOSIS^0^0^0 +"DATA",90093.99,43,1,2,0) +.01IEN^T^00009^DIAGNOSIS_IEN^0^0^0 +"DATA",90093.99,43,1,3,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,43,1,4,0) +.02IEN^T^00009^PATIENT NAME_IEN^0^0^0 +"DATA",90093.99,43,1,5,0) +.03^D^21^DATE NOTED^0^0^1 +"DATA",90093.99,43,1,6,0) +.04^T^30^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,43,1,7,0) +.04IEN^T^00009^PROVIDER NARRATIVE_IEN^0^0^0 +"DATA",90093.99,44,0) +UPDATE FAMILY HISTORY^9000014 +"DATA",90093.99,44,1,0) +^90093.991^4^4 +"DATA",90093.99,44,1,1,0) +.01^T^30^DIAGNOSIS^0^0^0 +"DATA",90093.99,44,1,2,0) +.02^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,44,1,3,0) +.03^D^21^DATE NOTED^0^0^1 +"DATA",90093.99,44,1,4,0) +.04^T^30^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,45,0) +VIEW REPRODUCTIVE FACTORS^9000017 +"DATA",90093.99,45,1,0) +^90093.991^7^7 +"DATA",90093.99,45,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,45,1,2,0) +.01IEN^T^00009^NAME_IEN^0^0^0 +"DATA",90093.99,45,1,3,0) +1^T^18^REPRODUCTIVE HISTORY^0^0^1 +"DATA",90093.99,45,1,4,0) +1.1^D^21^DATE REPRO HX OBTAINED^0^0^1 +"DATA",90093.99,45,1,5,0) +3^T^25^CONTRACEPTION METHOD^0^0^1 +"DATA",90093.99,45,1,6,0) +3.05^D^21^CONTRACEPTION BEGUN^0^0^1 +"DATA",90093.99,45,1,7,0) +3.1^D^21^DATE METHOD HX OBTAINED^0^0^1 +"DATA",90093.99,46,0) +UPDATE REPRODUCTIVE FACTORS^9000017 +"DATA",90093.99,46,1,0) +^90093.991^6^6 +"DATA",90093.99,46,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,46,1,2,0) +1^T^18^REPRODUCTIVE HISTORY^0^0^1 +"DATA",90093.99,46,1,3,0) +1.1^D^21^DATE REPRO HX OBTAINED^0^0^1 +"DATA",90093.99,46,1,4,0) +3^T^25^CONTRACEPTION METHOD^0^0^1 +"DATA",90093.99,46,1,5,0) +3.05^D^21^CONTRACEPTION BEGUN^0^0^1 +"DATA",90093.99,46,1,6,0) +3.1^D^21^DATE METHOD HX OBTAINED^0^0^1 +"DATA",90093.99,47,0) +MEASUREMENT^9000010.01 +"DATA",90093.99,47,1,0) +^90093.991^4^4 +"DATA",90093.99,47,1,1,0) +.02^T^30^PATIENT NAME^0^0^1 +"DATA",90093.99,47,1,2,0) +.03^T^30^VISIT^0^0^1 +"DATA",90093.99,47,1,3,0) +.01^T^30^TYPE^0^0^1 +"DATA",90093.99,47,1,4,0) +.04^T^100^VALUE^0^0^1 +"DATA",90093.99,48,0) +HORACE^2^0 +"DATA",90093.99,48,1,0) +^90093.991^5^5 +"DATA",90093.99,48,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,48,1,2,0) +.02^T^4^SEX^0^0^1 +"DATA",90093.99,48,1,3,0) +.03^D^21^DOB^0^0^1 +"DATA",90093.99,48,1,4,0) +.05^T^30^MARITAL STATUS^0^0^1 +"DATA",90093.99,48,1,5,0) +.05IEN^T^00009^MARITAL STATUS_IEN^0^0^1 +"DATA",90093.99,49,0) +SELECT LAB TESTS^60 +"DATA",90093.99,49,1,0) +^90093.991^1^1 +"DATA",90093.99,49,1,1,0) +.01^T^40^NAME^0^0^0 +"DATA",90093.99,50,0) +UPDATE PROBLEM NUMBER^9000011 +"DATA",90093.99,50,1,0) +^90093.991^2^2 +"DATA",90093.99,50,1,1,0) +.07^N^9^NMBR^0^0^1 +"DATA",90093.99,50,1,2,0) +.12^T^6^STATUS^0^0^1 +"DATA",90093.99,51,0) +UPDATE VA PATIENT^2 +"DATA",90093.99,51,1,0) +^90093.991^4^4 +"DATA",90093.99,51,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,51,1,2,0) +.02^T^4^SEX^0^0^0 +"DATA",90093.99,51,1,3,0) +.03^D^21^DATE OF BIRTH^0^0^0 +"DATA",90093.99,51,1,4,0) +.09^T^30^SOCIAL SECURITY NUMBER^0^0^0 +"DATA",90093.99,52,0) +FILEMAN FILES^1^1 +"DATA",90093.99,52,1,0) +^90093.991^2^2 +"DATA",90093.99,52,1,1,0) +.01^T^45^NAME^0^0^0 +"DATA",90093.99,52,1,2,0) +.01TRIGGER1^T^3^SUBFILES PRESENT?^1^0^1 +"DATA",90093.99,52,1,2,3) +SFT^BMXADOS1 +"DATA",90093.99,53,0) +SUBFILES^1^1 +"DATA",90093.99,53,1,0) +^90093.991^2^2 +"DATA",90093.99,53,1,1,0) +.01^T^45^NAME^0^0^0 +"DATA",90093.99,53,1,2,0) +.01TRIGGER1^T^3^SUBFILES PRESENT?^1^0^1 +"DATA",90093.99,53,1,2,3) +SFT^BMXADOS1 +"DATA",90093.99,54,0) +FIELDS^1^1 +"DATA",90093.99,54,1,0) +^90093.991^8^8 +"DATA",90093.99,54,1,1,0) +.01^T^45^NAME^0^0^0 +"DATA",90093.99,54,1,2,0) +.001TRIGGER1^T^7^DATA TYPE^1^0^0 +"DATA",90093.99,54,1,2,3) +DDT^BMXADOS1 +"DATA",90093.99,54,1,3,0) +.01X2^T^8^DEFAULT DATA TYPE^1^0^1 +"DATA",90093.99,54,1,4,0) +.01X3^I^5^DEFAULT FIELD LENGTH^1^0^1 +"DATA",90093.99,54,1,5,0) +.01X4^T^40^DEFAULT HEADER^1^0^1 +"DATA",90093.99,54,1,6,0) +.01X5^T^3^DEFAULT READ ONLY SETTING^1^0^1 +"DATA",90093.99,54,1,7,0) +.01X6^T^3^DEFAULT KEY FIELD SETTING^1^0^1 +"DATA",90093.99,54,1,8,0) +.01X7^T^3^DEFAULT NULL ALLOWED SETTING^1^0^1 +"DATA",90093.99,55,0) +SCHEMAS^90093.99 +"DATA",90093.99,55,1,0) +^90093.991^3^3 +"DATA",90093.99,55,1,1,0) +.01^T^30^SCHEMA^0^0^0 +"DATA",90093.99,55,1,2,0) +.02^N^15^FILE OR SUBFILE NUMBER^0^0^0 +"DATA",90093.99,55,1,3,0) +.03^T^5^DATASET IS READ ONLY^0^0^1 +"DATA",90093.99,56,0) +SCHEMA DEFINITION^90093.991^0 +"DATA",90093.99,56,1,0) +^90093.991^12^12 +"DATA",90093.99,56,1,1,0) +.01^T^30^FIELD NUMBER^0^0^0 +"DATA",90093.99,56,1,2,0) +.02^T^4^DATA TYPE^0^0^0 +"DATA",90093.99,56,1,3,0) +.03^T^5^FIELD LENGTH^0^0^0 +"DATA",90093.99,56,1,4,0) +.04^T^30^COLUMN HEADER^0^0^0 +"DATA",90093.99,56,1,5,0) +.05^T^3^READ ONLY^0^0^0 +"DATA",90093.99,56,1,6,0) +.06^T^3^KEY FIELD^0^0^0 +"DATA",90093.99,56,1,7,0) +.07^T^3^NULL ALLOWED^0^0^0 +"DATA",90093.99,56,1,8,0) +.08^T^3^IEN AUTOMATICALLY INCLUDED^0^0^1 +"DATA",90093.99,56,1,9,0) +.09^T^3^ALWAYS GET INTERNAL VALUE^0^0^1 +"DATA",90093.99,56,1,10,0) +1^T^19^AUTO IDENTIFIER EXTR FUNCT^0^0^1 +"DATA",90093.99,56,1,11,0) +2^T^19^SPECIAL UPDATE EP^0^0^1 +"DATA",90093.99,56,1,12,0) +3^T^17^EXTR FUNCT FOR TRIGGERED VALUE^0^0^1 +"DATA",90093.99,57,0) +FILEMAN FILEINFO^1 +"DATA",90093.99,57,1,0) +^90093.991^1^1 +"DATA",90093.99,57,1,1,0) +.01^T^45^NAME^0^0^0 +"DATA",90093.99,58,0) +BMXADO VIEW MEASUREMENTS^9000010.01^1 +"DATA",90093.99,58,1,0) +^90093.991^5^5 +"DATA",90093.99,58,1,1,0) +.01^T^6^MEASUREMENT MNEMONIC^1^0^0 +"DATA",90093.99,58,1,2,0) +.02^T^15^PATIENT LOOKUP VALUE^1^0^0 +"DATA",90093.99,58,1,3,0) +.03^T^15^VISIT LOOKUP VALUE^1^0^0 +"DATA",90093.99,58,1,4,0) +.04^T^30^VALUE^1^0^1 +"DATA",90093.99,58,1,5,0) +.01X^T^30^MEASUREMENT^1^0^0 +"DATA",90093.99,59,0) +VEN MOJO DE MEASUREMENT^19707.82 +"DATA",90093.99,59,1,0) +^90093.991^20^10 +"DATA",90093.99,59,1,3,0) +2.01^T^9^MEASUREMENT TYPE^0^0^0 +"DATA",90093.99,59,1,4,0) +2.03^T^30^MEASUREMENT^0^0^1 +"DATA",90093.99,59,1,5,0) +2.02^T^30^MEASUREMENT VALUE^0^0^1 +"DATA",90093.99,59,1,13,0) +.01TRIGGER3^T^30^ERROR CELL^1^0^1 +"DATA",90093.99,59,1,13,3) +ECELL^VENPCCTG +"DATA",90093.99,59,1,15,0) +.01^I^15^TRANSACTION ID^0^0^1 +"DATA",90093.99,59,1,16,0) +.02IEN^I^3^SEGMENT IEN^1^0^1 +"DATA",90093.99,59,1,17,0) +.03^T^20^TID-SID^0^0^1 +"DATA",90093.99,59,1,18,0) +100^T^80^COMMENT^1^0^0 +"DATA",90093.99,59,1,19,0) +.001TRIGGER1^I^4^MEASUREMENT IEN^0^0^1 +"DATA",90093.99,59,1,19,3) +IEN^VENPCCTG +"DATA",90093.99,59,1,20,0) +999^T^1^NEW ROW^0^0^1 +"DATA",90093.99,60,0) +VEN MOJO DE INTRO^19707.82^1 +"DATA",90093.99,60,1,0) +^90093.991^24^18 +"DATA",90093.99,60,1,1,0) +.01^T^30^TRANSACTION ID^0^0^0 +"DATA",90093.99,60,1,5,0) +.05^T^30^PATIENT NAME^0^0^1 +"DATA",90093.99,60,1,6,0) +.06^T^6^SEX^0^0^1 +"DATA",90093.99,60,1,7,0) +.07^T^10^DOB^0^0^1 +"DATA",90093.99,60,1,8,0) +.08^T^15^CHART NUMBER^0^0^1 +"DATA",90093.99,60,1,9,0) +.09^T^11^SSN^0^0^1 +"DATA",90093.99,60,1,10,0) +99.01^T^15^VCN^0^0^1 +"DATA",90093.99,60,1,11,0) +99.02^T^20^VISIT TIMESTAMP^0^0^1 +"DATA",90093.99,60,1,13,0) +99.04^T^30^VISIT TYPE^0^0^1 +"DATA",90093.99,60,1,14,0) +99.05^T^30^SERVICE CAT^0^0^1 +"DATA",90093.99,60,1,15,0) +99.06^T^30^CLINIC^0^0^1 +"DATA",90093.99,60,1,18,0) +99.09^T^30^FACILITY NAME^0^0^1 +"DATA",90093.99,60,1,19,0) +99.1^D^21^DATE VISIT CREATED^0^0^1 +"DATA",90093.99,60,1,20,0) +99.11^D^21^LAST MODIFIED^0^0^1 +"DATA",90093.99,60,1,21,0) +100^T^240^COMMENT^0^0^1 +"DATA",90093.99,60,1,22,0) +98.01^T^30^FORM^0^0^1 +"DATA",90093.99,60,1,23,0) +97.01^T^99^ImagePage1^0^0^1 +"DATA",90093.99,60,1,24,0) +97.02^T^99^ImagePage2^0^0^1 +"DATA",90093.99,61,0) +GREG2^9000010^1 +"DATA",90093.99,61,1,0) +^90093.991^4^4 +"DATA",90093.99,61,1,1,0) +.01^D^15^VISIT/ADMIT DATE&TIME^1^0^0 +"DATA",90093.99,61,1,2,0) +.02^D^15^DATE VISIT CREATED^1^0^0 +"DATA",90093.99,61,1,3,0) +.05^T^30^PATIENT NAME^1^0^0 +"DATA",90093.99,61,1,4,0) +.08^T^40^CLINIC^0^0^0 +"DATA",90093.99,62,0) +HW OPTION SCHEDULING^19.2^1 +"DATA",90093.99,62,1,0) +^90093.991^4^4 +"DATA",90093.99,62,1,1,0) +.01^T^30^NAME^1^0^0^0 +"DATA",90093.99,62,1,2,0) +2^T^30^QUEUED TO RUN AT WHAT TIME^1^0^1^0 +"DATA",90093.99,62,1,3,0) +6^T^30^RESCHEDULING FREQUENCY^0^0^1^0 +"DATA",90093.99,62,1,4,0) +9^T^30^SPECIAL QUEUEING^0^0^1^0 +"DATA",90093.99,63,0) +HW SD DEVICE1^3.5^1 +"DATA",90093.99,63,1,0) +^90093.991^8^8 +"DATA",90093.99,63,1,1,0) +.01^T^30^NAME^1 +"DATA",90093.99,63,1,2,0) +1^T^30^$I^1 +"DATA",90093.99,63,1,3,0) +2^T^30^TYPE^1 +"DATA",90093.99,63,1,4,0) +3^T^30^SUBTYPE^1 +"DATA",90093.99,63,1,5,0) +4^T^30^ASK DEVICE^0 +"DATA",90093.99,63,1,6,0) +5^T^30^ASK PARAMETERS^0 +"DATA",90093.99,63,1,7,0) +7^T^30^NEAREST PHONE^0 +"DATA",90093.99,63,1,8,0) +8^T^30^KEY OPERATOR^0^^1 +"DATA",90093.99,64,0) +HW SD NEW PERSON^200^1 +"DATA",90093.99,64,1,0) +^90093.991^6^6 +"DATA",90093.99,64,1,1,0) +.01^T^30^NAME^0^0 +"DATA",90093.99,64,1,2,0) +1^T^30^INITIAL^0^0 +"DATA",90093.99,64,1,3,0) +4^T^30^SEX^0^0 +"DATA",90093.99,64,1,4,0) +5^D^15^DOB^0^0 +"DATA",90093.99,64,1,5,0) +9^T^30^SSN^0^0 +"DATA",90093.99,64,1,6,0) +13^T^30^NICK NAME^0^0 +"DATA",90093.99,65,0) +HW SD VISIT1^9000010^1 +"DATA",90093.99,65,1,0) +^90093.991^3^3 +"DATA",90093.99,65,1,1,0) +.01^D^20^VISIT/ADMIT DATE&TIME^1^0^0 +"DATA",90093.99,65,1,2,0) +.05^T^30^PATIENT NAME^1^0^0 +"DATA",90093.99,65,1,3,0) +.08^T^30^CLINIC^1^0^0 +"DATA",90093.99,66,0) +ScottsdaleDemo^9000001^1 +"DATA",90093.99,66,1,0) +^90093.991^3^3 +"DATA",90093.99,66,1,1,0) +.01^T^30^NAME^1^0^0 +"DATA",90093.99,66,1,2,0) +1102.2^D^30^DOB^1^0^1 +"DATA",90093.99,66,1,3,0) +1101.2^T^30^SEX^0^0^1 +"DATA",90093.99,67,0) +BMXADO MEASUREMENT TYPES^9999999.07 +"DATA",90093.99,67,1,0) +^90093.991^3^3 +"DATA",90093.99,67,1,1,0) +.02^T^30^MEASUREMENT NAME^0^0^0 +"DATA",90093.99,67,1,2,0) +.01^T^4^MEASUREMENT MNEMONIC^0^0^0 +"DATA",90093.99,67,1,3,0) +.03^T^2^CODE^0^0^0 +"DATA",90093.99,68,0) +BMXADO DX^19707.82^1 +"DATA",90093.99,68,1,0) +^90093.991^16^16 +"DATA",90093.99,68,1,1,0) +.01^T^7^ACTION^0^0^0 +"DATA",90093.99,68,1,2,0) +.02^T^30^PATIENT IEN^0^0^0^^1 +"DATA",90093.99,68,1,3,0) +.03^T^30^VISIT IEN^0^0^0 +"DATA",90093.99,68,1,4,0) +.04^D^21^VISIT DATE^0^0^0 +"DATA",90093.99,68,1,5,0) +.05^T^30^ICD IEN^0^0^1^^1 +"DATA",90093.99,68,1,6,0) +.06^T^9^ICD CODE^0^0^1 +"DATA",90093.99,68,1,7,0) +.07^T^30^FACILITY IEN^0^0^1^^1 +"DATA",90093.99,68,1,8,0) +.08^T^30^FACILITY ABBR^0^0^1 +"DATA",90093.99,68,1,9,0) +.09^I^3^PROBLEM NUMBER^0^0^1 +"DATA",90093.99,68,1,10,0) +.1^T^30^PROBLEM IEN^0^0^1^^1 +"DATA",90093.99,68,1,11,0) +.11^I^2^NOTE NUMBER^0^0^1 +"DATA",90093.99,68,1,12,0) +.12^I^3^NOTE IEN^0^0^1^^1 +"DATA",90093.99,68,1,13,0) +.13^I^2^FAC NOTE IEN^0^0^1^^1 +"DATA",90093.99,68,1,14,0) +.14^T^80^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,68,1,15,0) +.15^I^2^PRIMARY-SECONDARY^0^0^1 +"DATA",90093.99,68,1,16,0) +.16^T^6^PROBLEM STATUS^0^0^1 +"DATA",90093.99,69,0) +BMXADO ADD POV^9000010.07 +"DATA",90093.99,69,1,0) +^90093.991^5^5 +"DATA",90093.99,69,1,1,0) +.01^T^9^ICD CODE^0^0^0 +"DATA",90093.99,69,1,2,0) +.02^T^15^PATIENT LOOKUP VALUE^0^0^0 +"DATA",90093.99,69,1,3,0) +.03^T^15^VISIT LOOKUP VALUE^0^0^0 +"DATA",90093.99,69,1,4,0) +.04^T^80^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,69,1,5,0) +.12^T^2^PRIMARY-SECONDARY^0^0^1 +"DATA",90093.99,70,0) +BMXADO ADD PROBLEM^9000011 +"DATA",90093.99,70,1,0) +^90093.991^7^7 +"DATA",90093.99,70,1,1,0) +.01^T^9^ICD CODE^0^0^0 +"DATA",90093.99,70,1,2,0) +.02^T^15^PATIENT LOOKUP VALUE^0^0^0 +"DATA",90093.99,70,1,3,0) +.03^D^15^DATE LAST MODIFIED^0^0^0 +"DATA",90093.99,70,1,4,0) +.05^T^80^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,70,1,5,0) +.06^T^15^FACILITY LOOKUP VALUE^0^0^0 +"DATA",90093.99,70,1,6,0) +.08^D^15^DATE ENTERED^0^0^0 +"DATA",90093.99,70,1,7,0) +.12^T^6^STATUS^0^0^0 +"DATA",90093.99,71,0) +BMXADO EDIT PROBLEM^9000011 +"DATA",90093.99,71,1,0) +^90093.991^4^4 +"DATA",90093.99,71,1,1,0) +.01^T^9^ICD CODE^0^0^0 +"DATA",90093.99,71,1,2,0) +.03^D^15^DATE LAST MODIFIED^0^0^0 +"DATA",90093.99,71,1,3,0) +.05^T^80^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,71,1,4,0) +.12^T^6^PROBLEM STATUS^0^0^0 +"DATA",90093.99,72,0) +BMXADO ADD FHX^9000014 +"DATA",90093.99,72,1,0) +^90093.991^4^4 +"DATA",90093.99,72,1,1,0) +.01^T^9^ICD CODE^0^0^0 +"DATA",90093.99,72,1,2,0) +.02^T^15^PATIENT LOOKUP VALUE^0^0^0 +"DATA",90093.99,72,1,3,0) +.03^D^15^DATE NOTED^0^0^0 +"DATA",90093.99,72,1,4,0) +.04^T^80^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,73,0) +BMXADO ADD PERSONAL HISTORY^9000013 +"DATA",90093.99,73,1,0) +^90093.991^4^4 +"DATA",90093.99,73,1,1,0) +.01^T^9^ICD CODE^0^0^0 +"DATA",90093.99,73,1,2,0) +.02^T^15^PATIENT LOOKUP VALUE^0^0^0 +"DATA",90093.99,73,1,3,0) +.03^D^15^DATE NOTED^0^0^0 +"DATA",90093.99,73,1,4,0) +.04^T^80^PROVIDER NARRATIVE^0^0^0 +"DATA",90093.99,74,0) +BMXADO ADD NOTE^9000011.1111 +"DATA",90093.99,74,1,0) +^90093.991^1^1 +"DATA",90093.99,74,1,1,0) +.03^T^44^NOTE^0^0^0 +"DATA",90093.99,75,0) +BMXADO DATA ENTRY TRANSACTION^19707.82 +"DATA",90093.99,75,1,0) +^90093.991^21^21 +"DATA",90093.99,75,1,1,0) +.01^T^30^TRANSACTION ID^0^0^0 +"DATA",90093.99,75,1,2,0) +.02^T^30^SEGMENT^0^0^0 +"DATA",90093.99,75,1,3,0) +.03^T^3^ACCEPT NON FATAL ERRORS^0^0^1 +"DATA",90093.99,75,1,4,0) +1.01^T^7^DX ACTION^0^0^1 +"DATA",90093.99,75,1,5,0) +1.02^T^30^PATIENT IEN^0^0^1 +"DATA",90093.99,75,1,6,0) +1.03^T^30^VISIT IEN^0^0^1 +"DATA",90093.99,75,1,7,0) +1.04^D^21^VISIT DATE^0^0^1 +"DATA",90093.99,75,1,8,0) +1.05^T^30^ICD IEN^0^0^1 +"DATA",90093.99,75,1,9,0) +1.06^T^9^ICD CODE^0^0^1 +"DATA",90093.99,75,1,10,0) +1.07^T^30^FACILITY IEN^0^0^1 +"DATA",90093.99,75,1,11,0) +1.08^T^9^FACILITY ABBREVIATION^0^0^1 +"DATA",90093.99,75,1,12,0) +1.09^I^3^PROBLEM NUMBER^0^0^1 +"DATA",90093.99,75,1,13,0) +1.1^T^30^PROBLEM IEN^0^0^1 +"DATA",90093.99,75,1,14,0) +1.11^I^2^NOTE NUMBER^0^0^1 +"DATA",90093.99,75,1,15,0) +1.12^I^3^NOTE IEN^0^0^1 +"DATA",90093.99,75,1,16,0) +1.13^I^2^FAC-NOTE IEN^0^0^1 +"DATA",90093.99,75,1,17,0) +1.14^T^80^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,75,1,18,0) +1.15^I^2^PRIMARY-SECONDARY^0^0^1 +"DATA",90093.99,75,1,19,0) +1.16^T^6^PROBLEM STATUS^0^0^1 +"DATA",90093.99,75,1,20,0) +2.01^T^30^MEASUREMENT TYPE^0^0^1 +"DATA",90093.99,75,1,21,0) +2.02^T^80^MEASUREMENT VALUE^0^0^1 +"DATA",90093.99,76,0) +VEN MOJO DE CLINIC^19707.82 +"DATA",90093.99,76,1,0) +^90093.991^17^8 +"DATA",90093.99,76,1,7,0) +3.01^I^4^CLINIC IEN^0^0^0 +"DATA",90093.99,76,1,8,0) +3.02^T^30^CLINIC^0^0^0 +"DATA",90093.99,76,1,11,0) +.01TRIGGER3^T^30^ERROR CELL^1^0^1 +"DATA",90093.99,76,1,11,3) +ECELL^VENPCCTG +"DATA",90093.99,76,1,13,0) +.01^I^15^TRANSACTION ID^0^0^1 +"DATA",90093.99,76,1,14,0) +.02IEN^I^3^SEGMENT IEN^1^0^1 +"DATA",90093.99,76,1,15,0) +.03^T^20^TID-SID^0^0^1 +"DATA",90093.99,76,1,16,0) +100^T^80^COMMENT^1^0^0 +"DATA",90093.99,76,1,17,0) +999^T^1^NEW ROW^0^0^1 +"DATA",90093.99,77,0) +VEN MOJO DE PROVIDER^19707.82 +"DATA",90093.99,77,1,0) +^90093.991^18^9 +"DATA",90093.99,77,1,7,0) +4.01^I^5^PROVIDER IEN^0^0^0 +"DATA",90093.99,77,1,8,0) +4.02^T^30^PROVIDER^0^0^0 +"DATA",90093.99,77,1,11,0) +.01TRIGGER3^T^30^ERROR CELL^1^0^1 +"DATA",90093.99,77,1,11,3) +ECELL^VENPCCTG +"DATA",90093.99,77,1,13,0) +4.03^T^12^PRIMARY OR SECONDARY^0^0^1 +"DATA",90093.99,77,1,14,0) +.01^I^15^TRANSACTION ID^0^0^1 +"DATA",90093.99,77,1,15,0) +.02IEN^I^3^SEGMENT IEN^1^0^1 +"DATA",90093.99,77,1,16,0) +.03^T^20^TID-SID^0^0^1 +"DATA",90093.99,77,1,17,0) +100^T^80^COMMENT^1^0^0 +"DATA",90093.99,77,1,18,0) +999^T^1^NEW ROW^0^0^1 +"DATA",90093.99,78,0) +VEN MOJO LIST PENDING FORMS^19707.81^1 +"DATA",90093.99,78,1,0) +^90093.991^4^4 +"DATA",90093.99,78,1,1,0) +.01^T^30^VISIT^0^0^0 +"DATA",90093.99,78,1,2,0) +.02^D^21^VISIT DATE^0^0^1 +"DATA",90093.99,78,1,3,0) +.03^T^30^PATIENT^0^0^1 +"DATA",90093.99,78,1,4,0) +.04^T^30^LOCATION^0^0^1 +"DATA",90093.99,79,0) +VEN MOJO LIST DE FIFO^19707.81 +"DATA",90093.99,79,1,0) +^90093.991^3^2 +"DATA",90093.99,79,1,1,0) +.01^T^30^VISIT^0^0^0 +"DATA",90093.99,79,1,3,0) +.03^T^30^PATIENT^0^0^0 +"DATA",90093.99,80,0) +VEN MOJO DRUG LIST^50 +"DATA",90093.99,80,1,0) +^90093.991^2^2 +"DATA",90093.99,80,1,1,0) +.01^T^40^GENERIC NAME^0^0^0 +"DATA",90093.99,80,1,2,0) +5^T^60^STANDARD SIG^0^0^1 +"DATA",90093.99,81,0) +VEN MOJO RX LIST^9000010.14 +"DATA",90093.99,81,1,0) +^90093.991^5^5 +"DATA",90093.99,81,1,1,0) +.01^T^30^MEDICATION^0^0^0 +"DATA",90093.99,81,1,2,0) +.01IEN^I^00009^MEDICATION_IEN^0^0^0 +"DATA",90093.99,81,1,3,0) +.06^I^7^QUANTITY^0^0^1 +"DATA",90093.99,81,1,4,0) +.05^T^32^SIG^0^0^1 +"DATA",90093.99,81,1,5,0) +.03^T^30^VISIT^0^0^0 +"DATA",90093.99,82,0) +VEN MOJO LIST PROVIDERS^200^1 +"DATA",90093.99,82,1,0) +^90093.991^2^2 +"DATA",90093.99,82,1,1,0) +.01^T^35^LABEL^0^0^0 +"DATA",90093.99,82,1,2,0) +.001TRIGGER1^I^9^IEN^1^0^1 +"DATA",90093.99,82,1,2,3) +IEN^VENPCCTG +"DATA",90093.99,83,0) +VEN MOJO LIST CLINICS^40.7 +"DATA",90093.99,83,1,0) +^90093.991^4^4 +"DATA",90093.99,83,1,1,0) +.01^T^30^CLINIC NAME^0^0^0 +"DATA",90093.99,83,1,2,0) +1^T^2^CLINIC CODE^0^0^0 +"DATA",90093.99,83,1,3,0) +.001TRIGGER2^I^9^CLINIC NAME IEN^1^0^1 +"DATA",90093.99,83,1,3,3) +IEN^VENPCCTG +"DATA",90093.99,83,1,4,0) +.001TRIGGER1^T^36^LABEL^1^0^1 +"DATA",90093.99,83,1,4,3) +CLNN^VENPCCTG +"DATA",90093.99,84,0) +VEN MOJO LIST MEASUREMENTS^9999999.07^1 +"DATA",90093.99,84,1,0) +^90093.991^3^3 +"DATA",90093.99,84,1,1,0) +.01^T^4^MEASUREMENT TYPE^1^0^0 +"DATA",90093.99,84,1,2,0) +.02^T^30^LABEL^1^0^0 +"DATA",90093.99,84,1,3,0) +.001TRIGGER1^I^9^IEN^1^0^1 +"DATA",90093.99,84,1,3,3) +IEN^VENPCCTG +"DATA",90093.99,85,0) +VEN MOJO DE FMT UHC^19707.47 +"DATA",90093.99,85,1,0) +^90093.991^1^1 +"DATA",90093.99,85,1,1,0) +.01^T^30^HIDDEN COLUMN NAME^0^0^0 +"DATA",90093.99,86,0) +VEN MOJO DE DX PROBLEM^9000011 +"DATA",90093.99,86,1,0) +^90093.991^5^5 +"DATA",90093.99,86,1,1,0) +.01^T^9^ICD CODE^0^0^1 +"DATA",90093.99,86,1,2,0) +.05^T^80^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,86,1,3,0) +.12^T^6^PROBLEM STATUS^0^0^0 +"DATA",90093.99,86,1,4,0) +.001TRIGGER1^I^15^PROBLEM IEN^0^0^0 +"DATA",90093.99,86,1,4,3) +PRBIEN^VENPCCTG +"DATA",90093.99,86,1,5,0) +.01IEN^I^15^ICD IEN^0^0^1 +"DATA",90093.99,87,0) +VEN MOJO DE DX DXHX^19707.82 +"DATA",90093.99,87,1,0) +^90093.991^22^20 +"DATA",90093.99,87,1,1,0) +.01^T^30^TRANSACTION ID^0^0^0 +"DATA",90093.99,87,1,2,0) +.02IEN^I^3^SEGMENT IEN^1^0^0 +"DATA",90093.99,87,1,3,0) +1.02^T^30^ACTION^0^0^1 +"DATA",90093.99,87,1,5,0) +1.05^I^15^ICD IEN^0^0^1 +"DATA",90093.99,87,1,6,0) +1.14^T^80^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,87,1,7,0) +1.06^T^9^ICD CODE^0^0^1 +"DATA",90093.99,87,1,8,0) +1.15^T^9^P/S^0^0^1 +"DATA",90093.99,87,1,9,0) +1.18^T^3^ADD TO PROBLEM LIST^0^0^1 +"DATA",90093.99,87,1,10,0) +1.16^T^6^PROBLEM STATUS^0^0^1 +"DATA",90093.99,87,1,12,0) +.01TRIGGER3^T^60^ERROR CELL^1^0^1 +"DATA",90093.99,87,1,12,3) +ECELL^VENPCCTG +"DATA",90093.99,87,1,13,0) +1.1^T^15^PROBLEM IEN^0^0^1 +"DATA",90093.99,87,1,14,0) +.03^T^20^TID-SID^0^0^1 +"DATA",90093.99,87,1,15,0) +1.11^I^2^NOTE NUMBER^0^0^1 +"DATA",90093.99,87,1,16,0) +1.12^I^3^NOTE IEN^0^0^1 +"DATA",90093.99,87,1,17,0) +1.13^I^2^FAC-NOTE IEN^0^0^1 +"DATA",90093.99,87,1,18,0) +1.17^T^44^NOTE NARRATIVE^0^0^1 +"DATA",90093.99,87,1,19,0) +1.21^T^10^NOTE STATUS^0^0^1 +"DATA",90093.99,87,1,20,0) +99.01^T^9^NOTE FACILITY^1^0^1 +"DATA",90093.99,87,1,21,0) +999^T^1^NEW ROW^0^0^1 +"DATA",90093.99,87,1,22,0) +100^T^240^COMMENT^0^0^1 +"DATA",90093.99,88,0) +VEN MOJO DE DX NOTE^19707.82^1 +"DATA",90093.99,88,1,0) +^90093.991^11^11 +"DATA",90093.99,88,1,1,0) +.001FAC^T^9^NOTE FACILITY^1^0^1 +"DATA",90093.99,88,1,2,0) +.01^T^3^NOTE NUMBER^1^0^1 +"DATA",90093.99,88,1,3,0) +.03^T^44^NOTE NARRATIVE^1^0^1 +"DATA",90093.99,88,1,4,0) +.001DA2^I^15^PROBLEM IEN^1^0^1 +"DATA",90093.99,88,1,5,0) +.001DA1^I^3^FAC-NOTE IEN^1^0^1 +"DATA",90093.99,88,1,6,0) +.001DA^I^3^NOTE IEN^1^0^1 +"DATA",90093.99,88,1,7,0) +99ICD^T^9^ICD CODE^1^0^1 +"DATA",90093.99,88,1,8,0) +.04^T^9^NOTE STATUS^1^0^1 +"DATA",90093.99,88,1,9,0) +99.01^I^15^TRANSACTION ID^1^0^1 +"DATA",90093.99,88,1,10,0) +99.02^T^20^TID-SID^1^0^1 +"DATA",90093.99,88,1,11,0) +99.03^T^20^ACTION^1^0^1 +"DATA",90093.99,89,0) +VEN MOJO DE FMT GRID^19707.48 +"DATA",90093.99,89,1,0) +^90093.991^7^7 +"DATA",90093.99,89,1,1,0) +.01^T^30^SCHEMA^0^0^0 +"DATA",90093.99,89,1,2,0) +.02^T^3^ADD MODE^0^0^1 +"DATA",90093.99,89,1,3,0) +.03^T^4^STYLE^0^0^1 +"DATA",90093.99,89,1,4,0) +1^T^240^HIDE COLUMN^0^0^1 +"DATA",90093.99,89,1,5,0) +2^T^240^BLOCK CELL^0^0^1 +"DATA",90093.99,89,1,6,0) +3^T^240^COMBO BOX^0^0^1 +"DATA",90093.99,89,1,7,0) +4^T^240^COLUMN WIDTH^0^0^1 +"DATA",90093.99,90,0) +VEN MOJO DE ICD MATCH^80 +"DATA",90093.99,90,1,0) +^90093.991^3^3 +"DATA",90093.99,90,1,1,0) +.01^T^7^ICD CODE^0^0^0 +"DATA",90093.99,90,1,2,0) +3^T^30^DIAGNOSIS^0^0^1 +"DATA",90093.99,90,1,3,0) +10^T^250^DESCRIPTION^0^0^1 +"DATA",90093.99,91,0) +VEN MOJO DE SEGMENT^19707.44 +"DATA",90093.99,91,1,0) +^90093.991^2^2 +"DATA",90093.99,91,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,91,1,2,0) +.03^T^30^SCHEMA^0^0^1 +"DATA",90093.99,92,0) +VEN MOJO DE SEG IMAGE^19707.461 +"DATA",90093.99,92,1,0) +^90093.991^7^7 +"DATA",90093.99,92,1,1,0) +.01^T^30^SEGMENT^0^0^0 +"DATA",90093.99,92,1,2,0) +.02^I^1^PAGE^0^0^1 +"DATA",90093.99,92,1,3,0) +.03^I^3^X POSITION^0^0^1 +"DATA",90093.99,92,1,4,0) +.04^I^3^Y POSITION^0^0^1 +"DATA",90093.99,92,1,5,0) +.05^I^3^WIDTH^0^0^1 +"DATA",90093.99,92,1,6,0) +.06^I^3^HEIGHT^0^0^1 +"DATA",90093.99,92,1,7,0) +.01TRIGGER1^N^3^SEGMENT IEN^0^0^1 +"DATA",90093.99,92,1,7,3) +IEN^VENPCCTG +"DATA",90093.99,93,0) +VEN MOJO CHECKIN PATIENTS^2^1 +"DATA",90093.99,93,1,0) +^90093.991^6^6 +"DATA",90093.99,93,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,93,1,2,0) +.02^T^4^SEX^0^0^0^^1 +"DATA",90093.99,93,1,3,0) +.03^D^21^DOB^0^0^0 +"DATA",90093.99,93,1,4,0) +.09^T^30^SSN^0^0^1 +"DATA",90093.99,93,1,5,0) +.001TRIGGER1^T^20^CHART +"DATA",90093.99,93,1,5,3) +HRN^BMXADOV2 +"DATA",90093.99,93,1,6,0) +.001TRIGGER2^T^20^PATIENT IEN^1^0^1 +"DATA",90093.99,94,0) +VEN MOJO CHECKIN CLINICS^19707.95^1 +"DATA",90093.99,94,1,0) +^90093.991^4^4 +"DATA",90093.99,94,1,1,0) +.01^T^30^CLINIC^0^0^0 +"DATA",90093.99,94,1,2,0) +.001TRIGGER1^I^4^CLINIC IEN^1^0^1 +"DATA",90093.99,94,1,2,3) +IEN^VENPCCTG +"DATA",90093.99,94,1,3,0) +2.05^T^30^DEFAULT ENCOUNTER FORM^0^0^1 +"DATA",90093.99,94,1,4,0) +2.02^T^30^DEFAULT PROVIDER^0^0^1 +"DATA",90093.99,95,0) +VEN MOJO CHECKIN PROVIDERS^200^1 +"DATA",90093.99,95,1,0) +^90093.991^3^3 +"DATA",90093.99,95,1,1,0) +.01^T^35^PROVIDER^0^0^0 +"DATA",90093.99,95,1,2,0) +9999999.02^T^3^CODE^0^0^0 +"DATA",90093.99,95,1,3,0) +.001TRIGGER1^I^15^PROVIDER IEN^1^0^1 +"DATA",90093.99,95,1,3,3) +IEN^VENPCCTG +"DATA",90093.99,96,0) +VEN MOJO CHECKIN FORMS^19707.41^1 +"DATA",90093.99,96,1,0) +^90093.991^4^4 +"DATA",90093.99,96,1,1,0) +.01^T^30^FORM^0^0^0 +"DATA",90093.99,96,1,2,0) +.001TRIGGER1^I^4^FORM IEN^1^0^1 +"DATA",90093.99,96,1,2,3) +IEN^VENPCCTG +"DATA",90093.99,96,1,3,0) +11.01^T^30^FORM ID^0^0^1 +"DATA",90093.99,96,1,4,0) +11.02^T^3^DIGITAL VERSION ONLY^0^0^1 +"DATA",90093.99,97,0) +VEN MOJO LIST TABLET QUEUE^19707.23^1 +"DATA",90093.99,97,1,0) +^90093.991^13^13 +"DATA",90093.99,97,1,1,0) +.01^T^30^PATIENT NAME^0^0^0 +"DATA",90093.99,97,1,2,0) +.02^T^4^SEX^0^0^1 +"DATA",90093.99,97,1,3,0) +.03^D^21^DOB^0^0^1 +"DATA",90093.99,97,1,4,0) +.04^T^20^CHART NUMBER^0^0^1 +"DATA",90093.99,97,1,5,0) +.05^D^21^TIMESTAMP^0^0^1 +"DATA",90093.99,97,1,6,0) +.06^T^7^STATUS^0^0^1 +"DATA",90093.99,97,1,7,0) +.07^T^30^USER^0^0^1 +"DATA",90093.99,97,1,8,0) +.08^T^30^CLINIC^0^0^1 +"DATA",90093.99,97,1,9,0) +.01TRIGGER1^I^15^PATIENT IEN^1^0^1 +"DATA",90093.99,97,1,9,3) +IEN^VENPCCTG +"DATA",90093.99,97,1,10,0) +.07TRIGGER1^I^15^USER IEN^1^0^1 +"DATA",90093.99,97,1,10,3) +IEN^VENPCCTG +"DATA",90093.99,97,1,11,0) +.08TRIGGER1^I^4^CLINIC IEN^1^0^1 +"DATA",90093.99,97,1,11,3) +IEN^VENPCCTG +"DATA",90093.99,97,1,12,0) +.001TRIGGER1^I^6^TABLET QUEUE IEN^1^0^1 +"DATA",90093.99,97,1,12,3) +IEN^VENPCCTG +"DATA",90093.99,97,1,13,0) +.13^T^30^UID^0^0^1 +"DATA",90093.99,98,0) +VEN MOJO DE RESUME^19707.82 +"DATA",90093.99,98,1,0) +^90093.991^6^6 +"DATA",90093.99,98,1,1,0) +.01^T^30^TRANSACTION ID^0^0^0 +"DATA",90093.99,98,1,2,0) +.05^T^30^PATIENT NAME^0^0^1 +"DATA",90093.99,98,1,3,0) +99.03^D^21^VISIT DATE^0^0^1 +"DATA",90093.99,98,1,4,0) +98.01^T^30^FORM^0^0^1 +"DATA",90093.99,98,1,5,0) +99.12^T^30^UPDATED BY^0^0^1 +"DATA",90093.99,98,1,6,0) +99.13^T^10^WORKFLOW STATUS^0^0^1 +"DATA",90093.99,99,0) +VEN MOJO DE DX PRB1^19707.82 +"DATA",90093.99,99,1,0) +^90093.991^9^9 +"DATA",90093.99,99,1,1,0) +.01^T^30^TRANSACTION ID^0^0^0 +"DATA",90093.99,99,1,2,0) +.02IEN^I^3^SEGMENT^0^0^1 +"DATA",90093.99,99,1,2,3) +IEN^VENPCCT +"DATA",90093.99,99,1,3,0) +.03^T^20^TID-SID^0^0^1 +"DATA",90093.99,99,1,4,0) +1.06^T^9^ICD CODE^0^0^1 +"DATA",90093.99,99,1,5,0) +1.14^T^80^PROVIDER NARRATIVE^0^0^1 +"DATA",90093.99,99,1,6,0) +1.16^T^8^PROBLEM STATUS^0^0^1 +"DATA",90093.99,99,1,7,0) +1.1^T^15^PROBLEM IEN^0^0^1 +"DATA",90093.99,99,1,8,0) +1.05^T^15^ICD IEN^0^0^1 +"DATA",90093.99,99,1,9,0) +999^T^1^NEW ROW^0^0^1 +"DATA",90093.99,100,0) +VEN MOJO DE DX NOTE1^19707.82 +"DATA",90093.99,100,1,0) +^90093.991^10^10 +"DATA",90093.99,100,1,1,0) +.01^T^30^TRANSACTION ID^0^0^0 +"DATA",90093.99,100,1,2,0) +.02IEN^T^30^SEGMENT^0^0^1 +"DATA",90093.99,100,1,3,0) +.03^T^20^TID-SID^0^0^1 +"DATA",90093.99,100,1,4,0) +1.1^T^15^PROBLEM IEN^0^0^1 +"DATA",90093.99,100,1,5,0) +1.13^I^2^FAC-NOTE IEN^0^0^1 +"DATA",90093.99,100,1,6,0) +1.12^I^3^NOTE IEN^0^0^1 +"DATA",90093.99,100,1,7,0) +1.11^I^2^NOTE NUMBER^0^0^1 +"DATA",90093.99,100,1,8,0) +1.17^T^44^NOTE NARRATIVE^0^0^1 +"DATA",90093.99,100,1,9,0) +1.21^T^6^NOTE STATUS^0^0^1 +"DATA",90093.99,100,1,10,0) +999^T^1^NEW ROW^0^0^1 +"DATA",90093.99,101,0) +VEN MOJO DE CPT^19707.82 +"DATA",90093.99,101,1,0) +^90093.991^8^8 +"DATA",90093.99,101,1,1,0) +5.01^T^9^CPT CODE^0^0^1 +"DATA",90093.99,101,1,2,0) +5.02^T^60^CPT TEXT^0^0^1 +"DATA",90093.99,101,1,3,0) +.01TRIGGER1^T^30^ERROR CELL^1^0^1 +"DATA",90093.99,101,1,3,3) +ECELL^VENPCCTG +"DATA",90093.99,101,1,4,0) +.01^I^15^TRANSACTION ID^1^1^0 +"DATA",90093.99,101,1,5,0) +.02IEN^I^3^SEGMENT IEN^1^0^0 +"DATA",90093.99,101,1,6,0) +.03^T^20^TID-SID^1^0^0 +"DATA",90093.99,101,1,7,0) +100^T^80^COMMENT^1^0^1 +"DATA",90093.99,101,1,8,0) +999^T^1^NEW ROW^0^0^1 +"DATA",90093.99,102,0) +VEN KB CATEGORY^19707.11^1 +"DATA",90093.99,102,1,0) +^90093.991^2^2 +"DATA",90093.99,102,1,1,0) +.01^T^30^KB GROUP^1^0^0 +"DATA",90093.99,102,1,2,0) +.001TRIGGER1^N^4^IEN^1^0^1 +"DATA",90093.99,102,1,2,3) +IEN^VENPCCU +"DATA",90093.99,103,0) +VEN KB ITEM^19707.12 +"DATA",90093.99,103,1,0) +^90093.991^12^12 +"DATA",90093.99,103,1,1,0) +.01^T^30^TYPE^0^0^0 +"DATA",90093.99,103,1,2,0) +.02^T^80^TITLE^0^0^1 +"DATA",90093.99,103,1,3,0) +.04^T^16^EXTERNAL CODE^0^0^1 +"DATA",90093.99,103,1,4,0) +.07^I^2^START WKS GESTATION^0^0^1 +"DATA",90093.99,103,1,5,0) +.08^I^2^STOP WKS GESTATON^0^0^1 +"DATA",90093.99,103,1,6,0) +.09^T^8^SCHEDULING INTERVAL^0^0^1 +"DATA",90093.99,103,1,7,0) +.1^T^4^GENDER SCREEN^0^0^1 +"DATA",90093.99,103,1,8,0) +.11^T^3^INACTIVATED^0^0^1 +"DATA",90093.99,103,1,9,0) +.12^T^60^MODIFIER TEXT^0^0^1 +"DATA",90093.99,103,1,10,0) +.13^N^8^EXTERNAL START AGE^0^0^1 +"DATA",90093.99,103,1,11,0) +.14^N^8^EXTERNAL STOP AGE^0^0^1 +"DATA",90093.99,103,1,12,0) +.15^T^30^ICD TAXONOMY^0^0^1 +"DATA",90093.99,104,0) +VEN KB TEMPLATES^19707.41 +"DATA",90093.99,104,1,0) +^90093.991^2^2 +"DATA",90093.99,104,1,1,0) +.01^T^30^TEMPLATE^0^0^0 +"DATA",90093.99,104,1,2,0) +.001TRIGGER1^N^4^IEN +"DATA",90093.99,104,1,2,3) +IEN^VENPCCU +"DATA",90093.99,105,0) +VEN KB TAXONOMY^9002226 +"DATA",90093.99,105,1,0) +^90093.991^2^2 +"DATA",90093.99,105,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,105,1,2,0) +.001TRIGGER1^N^6^IEN^1^0^1 +"DATA",90093.99,105,1,2,3) +IEN^VENPCCU +"DATA",90093.99,106,0) +VEN UP DISCIPLINES^7 +"DATA",90093.99,106,1,0) +^90093.991^2^2 +"DATA",90093.99,106,1,1,0) +.01^T^30^DISCIPLINE^0^0^0 +"DATA",90093.99,106,1,2,0) +.001TRIGGER1^N^4^IEN^1^0^1 +"DATA",90093.99,106,1,2,3) +IEN^VENPCCU +"DATA",90093.99,107,0) +VEN UP CLINIC STOPS^40.7 +"DATA",90093.99,107,1,0) +^90093.991^2^2 +"DATA",90093.99,107,1,1,0) +.01^T^30^CLINIC^0^0^0 +"DATA",90093.99,107,1,2,0) +.001TRIGGER1^N^4^CLINIC^1^0^1 +"DATA",90093.99,107,1,2,3) +IEN^VENPCCU +"DATA",90093.99,108,0) +VEN UP ICD GROUPS^19707.33 +"DATA",90093.99,108,1,0) +^90093.991^1^1 +"DATA",90093.99,108,1,1,0) +.001TRIGGER1^N^4^IDC PREFERENCE SET^1^0^1 +"DATA",90093.99,108,1,1,3) +IEN^VENPCCU +"DATA",90093.99,109,0) +VEN UP ICD ITEMS^19707.34 +"DATA",90093.99,109,1,0) +^90093.991^22^22 +"DATA",90093.99,109,1,1,0) +.01^T^30^OWNER^0^0^0 +"DATA",90093.99,109,1,2,0) +.02^T^30^DX PREFERENCE GROUP^0^0^1 +"DATA",90093.99,109,1,3,0) +.03^T^80^PRINTED NAME^0^0^1 +"DATA",90093.99,109,1,4,0) +.04^T^9^ICD CODE^0^0^1 +"DATA",90093.99,109,1,5,0) +.07^T^80^ICD TEXT^0^0^1 +"DATA",90093.99,109,1,6,0) +.08^I^6^SORT ORDER NUMBER^0^0^1 +"DATA",90093.99,109,1,7,0) +1.01^T^3^INFANT^0^0^1 +"DATA",90093.99,109,1,8,0) +1.02^I^7^INFANT TOTAL^0^0^1 +"DATA",90093.99,109,1,9,0) +1.03^T^3^CHILD^0^0^1 +"DATA",90093.99,109,1,10,0) +1.04^I^7^CHILD TOTAL^0^0^1 +"DATA",90093.99,109,1,11,0) +1.05^T^3^TEEN FEMALE^0^0^1 +"DATA",90093.99,109,1,12,0) +1.06^I^7^TEEN FEMALE TOTAL^0^0^1 +"DATA",90093.99,109,1,13,0) +1.07^T^3^TEEN MALE^0^0^1 +"DATA",90093.99,109,1,14,0) +1.08^I^7^TEEN MALE TOTAL^0^0^1 +"DATA",90093.99,109,1,15,0) +1.09^T^3^ADULT FEMALE^0^0^1 +"DATA",90093.99,109,1,16,0) +1.1^I^7^ADULT FEMALE TOTAL^0^0^1 +"DATA",90093.99,109,1,17,0) +1.11^T^3^ADULT MALE^0^0^1 +"DATA",90093.99,109,1,18,0) +1.12^I^7^ADULT MALE TOTAL^0^0^1 +"DATA",90093.99,109,1,19,0) +1.13^T^3^SENIOR FEMALE^0^0^1 +"DATA",90093.99,109,1,20,0) +1.14^I^7^SENIOR FEMALE TOTAL^0^0^1 +"DATA",90093.99,109,1,21,0) +1.15^T^3^SENIOR MALE^0^0^1 +"DATA",90093.99,109,1,22,0) +1.16^I^7^SENIOR MALE TOTAL^0^0^1 +"DATA",90093.99,110,0) +VEN CL GROUPS^19707.9 +"DATA",90093.99,110,1,0) +^90093.991^6^6 +"DATA",90093.99,110,1,1,0) +.01^T^30^NAME^0^0^0 +"DATA",90093.99,110,1,2,0) +.02^T^30^TYPE^0^0^1 +"DATA",90093.99,110,1,3,0) +.03^T^9^PRE^0^0^1 +"DATA",90093.99,110,1,4,0) +.04^T^9^POST^0^0^1 +"DATA",90093.99,110,1,5,0) +1^T^240^BRIEF DESCRIPTION^0^0^1 +"DATA",90093.99,110,1,6,0) +.001TRIGGER1^N^3^CHLECK LIST CATEGORY^1^0^1 +"DATA",90093.99,110,1,6,3) +IEN^VENPCCU +"DATA",90093.99,111,0) +VEN CL ITEMS^19707.91 +"DATA",90093.99,111,1,0) +^90093.991^8^8 +"DATA",90093.99,111,1,1,0) +.01^T^30^ITEM^0^0^0 +"DATA",90093.99,111,1,2,0) +.03^T^3^INFANTS^0^0^1 +"DATA",90093.99,111,1,3,0) +.04^T^3^CHILDREN^0^0^1 +"DATA",90093.99,111,1,4,0) +.05^T^3^MEN^0^0^1 +"DATA",90093.99,111,1,5,0) +.07^T^30^CODE1^0^0^1 +"DATA",90093.99,111,1,6,0) +.08^T^30^CODE2^0^0^1 +"DATA",90093.99,111,1,7,0) +.09^I^4^POSITION^0^0^1 +"DATA",90093.99,111,1,8,0) +.001TRIGGER1^N^6^IEN^1^0^1 +"DATA",90093.99,111,1,8,3) +IEN^VENPCCU +"DATA",90093.99,112,0) +HWADA^9999999.31^0 +"DATA",90093.99,112,1,0) +^90093.991^8^5 +"DATA",90093.99,112,1,1,0) +.01^T^30^CODE^1^0^0 +"DATA",90093.99,112,1,2,0) +.02^T^60^DESCRIPTION^0^0^1 +"DATA",90093.99,112,1,5,0) +.09^T^10^NO OPSITE^0^0^1 +"DATA",90093.99,112,1,7,0) +.04^I^10^ESTIMATED MINUTES^0^0^1 +"DATA",90093.99,112,1,8,0) +.08^D^10^INACTIVE^0^0^1 +"FIA",90093.1) +BMX USER +"FIA",90093.1,0) +^BMXUSER( +"FIA",90093.1,0,0) +90093.1 +"FIA",90093.1,0,1) +y^y^f^^^^n +"FIA",90093.1,0,10) + +"FIA",90093.1,0,11) + +"FIA",90093.1,0,"RLRO") + +"FIA",90093.1,0,"VR") +2.1T2^BMX +"FIA",90093.1,90093.1) +0 +"FIA",90093.2) +BMX APPLICATION +"FIA",90093.2,0) +^BMXAPPL( +"FIA",90093.2,0,0) +90093.2 +"FIA",90093.2,0,1) +y^y^f^^^^n +"FIA",90093.2,0,10) + +"FIA",90093.2,0,11) + +"FIA",90093.2,0,"RLRO") + +"FIA",90093.2,0,"VR") +2.1T2^BMX +"FIA",90093.2,90093.2) +0 +"FIA",90093.5) +BMXNET MONITOR +"FIA",90093.5,0) +^BMXMON( +"FIA",90093.5,0,0) +90093.5 +"FIA",90093.5,0,1) +y^y^f^^^^n +"FIA",90093.5,0,10) + +"FIA",90093.5,0,11) + +"FIA",90093.5,0,"RLRO") + +"FIA",90093.5,0,"VR") +2.1T2^BMX +"FIA",90093.5,90093.5) +0 +"FIA",90093.9) +BMX GUI REPORT +"FIA",90093.9,0) +^BMXGUIR( +"FIA",90093.9,0,0) +90093.9 +"FIA",90093.9,0,1) +y^y^f^^^^n +"FIA",90093.9,0,10) + +"FIA",90093.9,0,11) + +"FIA",90093.9,0,"RLRO") + +"FIA",90093.9,0,"VR") +2.1T2^BMX +"FIA",90093.9,90093.9) +0 +"FIA",90093.9,90093.911) +0 +"FIA",90093.98) +BMX ADO LOG +"FIA",90093.98,0) +^BMXADOL( +"FIA",90093.98,0,0) +90093.98D +"FIA",90093.98,0,1) +y^y^f^^^^n +"FIA",90093.98,0,10) + +"FIA",90093.98,0,11) + +"FIA",90093.98,0,"RLRO") + +"FIA",90093.98,0,"VR") +2.1T2^BMX +"FIA",90093.98,90093.98) +0 +"FIA",90093.98,90093.981) +0 +"FIA",90093.99) +BMX ADO SCHEMA +"FIA",90093.99,0) +^BMXADO( +"FIA",90093.99,0,0) +90093.99 +"FIA",90093.99,0,1) +y^y^f^^n^^y^a^n +"FIA",90093.99,0,10) + +"FIA",90093.99,0,11) + +"FIA",90093.99,0,"RLRO") + +"FIA",90093.99,0,"VR") +2.1T2^BMX +"FIA",90093.99,90093.99) +0 +"FIA",90093.99,90093.991) +0 +"FIA",90093.99,90093.992) +0 +"FIA",90093.99,90093.9922) +0 +"FIA",90093.99,90093.9923) +0 +"KRN",.402,1722,-1) +0^1 +"KRN",.402,1722,0) +BMX MONITOR EDIT^3040928.1231^@^90093.5^^@^3061103 +"KRN",.402,1722,"DR",1,90093.5) +.01;.02;.03;.04; +"KRN",19,10840,-1) +0^5 +"KRN",19,10840,0) +BMXRPC^BMX Procedure Calls^^B^^^^^^^^ +"KRN",19,10840,99.1) +59512,54859 +"KRN",19,10840,"RPC",0) +^19.05P^81^81 +"KRN",19,10840,"RPC",1,0) +BMX SQL +"KRN",19,10840,"RPC",2,0) +BMX SQL COLINFO +"KRN",19,10840,"RPC",3,0) +BMX FIELD LIST +"KRN",19,10840,"RPC",4,0) +BMX FIND +"KRN",19,10840,"RPC",5,0) +BMX LOOKUP +"KRN",19,10840,"RPC",6,0) +BMX NTUSER +"KRN",19,10840,"RPC",7,0) +BMX TABLE +"KRN",19,10840,"RPC",8,0) +BMX TLIST +"KRN",19,10840,"RPC",9,0) +BMX USER +"KRN",19,10840,"RPC",10,0) +BMX SECURITY KEY +"KRN",19,10840,"RPC",11,0) +BMX SIGNATURE +"KRN",19,10840,"RPC",12,0) +BMX MULT LIST +"KRN",19,10840,"RPC",13,0) +BMXGetFacRS +"KRN",19,10840,"RPC",14,0) +BMXSetFac +"KRN",19,10840,"RPC",15,0) +BMXPatientLookupRS +"KRN",19,10840,"RPC",16,0) +BMXPatientInfoRS +"KRN",19,10840,"RPC",20,0) +BMX HEALTH SUMMARY +"KRN",19,10840,"RPC",21,0) +BMX DENTAL REPORT 1 +"KRN",19,10840,"RPC",22,0) +BMXGetFac +"KRN",19,10840,"RPC",23,0) +BMXUserKeyRS +"KRN",19,10840,"RPC",24,0) +BMX PDATA CHART +"KRN",19,10840,"RPC",26,0) +BMX DENTAL REPORT 2 +"KRN",19,10840,"RPC",27,0) +BMX GET VARIABLE VALUE +"KRN",19,10840,"RPC",29,0) +BMX PATIENT DEMOG DATA GET +"KRN",19,10840,"RPC",30,0) +BMXProviderLookupRS +"KRN",19,10840,"RPC",61,0) +BMXNetGetCodes +"KRN",19,10840,"RPC",62,0) +BMXNetSetUser +"KRN",19,10840,"RPC",63,0) +BMX DEMO +"KRN",19,10840,"RPC",64,0) +BMX AV CODE +"KRN",19,10840,"RPC",65,0) +BMXNRC +"KRN",19,10840,"RPC",66,0) +BMX LOCK +"KRN",19,10840,"RPC",67,0) +BMX VERSION INFO +"KRN",19,10840,"RPC",68,0) +BMX IM HERE +"KRN",19,10840,"RPC",69,0) +BMX TEST +"KRN",19,10840,"RPC",70,0) +BMX SCHEMA ONLY +"KRN",19,10840,"RPC",71,0) +BMX UPDATE +"KRN",19,10840,"RPC",74,0) +BMX ADO SS +"KRN",19,10840,"RPC",75,0) +BMX EVENT REGISTER +"KRN",19,10840,"RPC",76,0) +BMX EVENT RAISE +"KRN",19,10840,"RPC",77,0) +BMX EVENT UNREGISTER +"KRN",19,10840,"RPC",78,0) +BMX EVENT POLL +"KRN",19,10840,"RPC",79,0) +BMX TIMER TEST +"KRN",19,10840,"RPC",80,0) +BMX ASYNC GET +"KRN",19,10840,"RPC",81,0) +BMX ASYNC QUEUE +"KRN",19,10840,"U") +BMX PROCEDURE CALLS +"KRN",19,10841,-1) +0^2 +"KRN",19,10841,0) +BMX MONITOR START^Start All BMXNet Monitors^^R^^^^^^^^^y +"KRN",19,10841,1,0) +^19.06^7^7^3040919^^ +"KRN",19,10841,1,1,0) +Use this option to start or restart all BMXNet monitors in the +"KRN",19,10841,1,2,0) +BMXNET MONITOR file. This option should be scheduled as a STARTUP +"KRN",19,10841,1,3,0) +type option in TaskMan. Do not use this option to start a +"KRN",19,10841,1,4,0) +specific monitor. To do this, in programmer mode, do STRT^BMXMON(PORT). +"KRN",19,10841,1,5,0) +See the product documentation for instructions on how to start +"KRN",19,10841,1,6,0) +session monitors in a particular namespace and on how to +"KRN",19,10841,1,7,0) +enable or disable Windows Integrated Security. +"KRN",19,10841,25) +RESTART^BMXMON +"KRN",19,10841,200.9) +s +"KRN",19,10841,"U") +START ALL BMXNET MONITORS +"KRN",19,10842,-1) +0^4 +"KRN",19,10842,0) +BMXMENU^BMXNet Management^^M^^BMXZMENU^^^^^^^^1 +"KRN",19,10842,1,0) +^^1^1^3040928^ +"KRN",19,10842,1,1,0) +Menu contains options in the BMX namespace +"KRN",19,10842,10,0) +^19.01IP^3^3 +"KRN",19,10842,10,1,0) +10844^EDIT^5 +"KRN",19,10842,10,1,"^") +BMX MONITOR EDIT +"KRN",19,10842,10,2,0) +10841^STRT^10 +"KRN",19,10842,10,2,"^") +BMX MONITOR START +"KRN",19,10842,10,3,0) +10843^STOP^15 +"KRN",19,10842,10,3,"^") +BMX MONITOR STOP +"KRN",19,10842,20) +D MENU^BMXMON +"KRN",19,10842,99) +61560,42565 +"KRN",19,10842,"U") +BMXNET MANAGEMENT +"KRN",19,10843,-1) +0^3 +"KRN",19,10843,0) +BMX MONITOR STOP^Stop All BMXNet Monitors^^R^^^^^^^^ +"KRN",19,10843,1,0) +^^1^1^3040928^ +"KRN",19,10843,1,1,0) +Use this option to stop all BMXNet monitors. +"KRN",19,10843,25) +STOPALL^BMXMON +"KRN",19,10843,"U") +STOP ALL BMXNET MONITORS +"KRN",19,10844,-1) +0^1 +"KRN",19,10844,0) +BMX MONITOR EDIT^Add/Edit BMXNet Monitor Entries^^E^^^^^^^^ +"KRN",19,10844,30) +BMXMON( +"KRN",19,10844,31) +AEMQL +"KRN",19,10844,50) +BMXMON( +"KRN",19,10844,51) +[BMX MONITOR EDIT] +"KRN",19,10844,63) + +"KRN",19,10844,99) +59806,44943 +"KRN",19,10844,"U") +ADD/EDIT BMXNET MONITOR ENTRIE +"KRN",19.1,456,-1) +0^1 +"KRN",19.1,456,0) +BMXZMENU +"KRN",8994,2245,-1) +0^21 +"KRN",8994,2245,0) +BMX PATIENT DEMOG DATA GET^PDATA^BMXRPC1^1 +"KRN",8994,2246,-1) +0^18 +"KRN",8994,2246,0) +BMX LOOKUP^LOOKUP^BMXRPC^4 +"KRN",8994,2247,-1) +0^12 +"KRN",8994,2247,0) +BMX FIELD LIST^FLDLIST^BMXRPC2^4 +"KRN",8994,2248,-1) +0^13 +"KRN",8994,2248,0) +BMX FIND^FIND^BMXFIND^4 +"KRN",8994,2249,-1) +0^28 +"KRN",8994,2249,0) +BMX TABLE^TABLE^BMXFIND^4 +"KRN",8994,2250,-1) +0^26 +"KRN",8994,2250,0) +BMX SQL^SQL^BMXSQL^4 +"KRN",8994,2251,-1) +0^31 +"KRN",8994,2251,0) +BMX TLIST^TLIST^BMXSQL^4 +"KRN",8994,2252,-1) +0^27 +"KRN",8994,2252,0) +BMX SQL COLINFO^SQLCOL^BMXSQL^4 +"KRN",8994,2253,-1) +0^14 +"KRN",8994,2253,0) +BMX GET VARIABLE VALUE^VARVAL^BMXRPC3^1 +"KRN",8994,2254,-1) +0^33 +"KRN",8994,2254,0) +BMX USER^USER^BMXRPC3^1 +"KRN",8994,2255,-1) +0^20 +"KRN",8994,2255,0) +BMX NTUSER^NTUSER^BMXRPC3^1 +"KRN",8994,2256,-1) +0^43 +"KRN",8994,2256,0) +BMXSetFac^SETFCRS^BMXRPC3^1 +"KRN",8994,2257,-1) +0^35 +"KRN",8994,2257,0) +BMXGetFac^GETFC^BMXRPC3^1 +"KRN",8994,2258,-1) +0^24 +"KRN",8994,2258,0) +BMX SECURITY KEY^APSEC^BMXRPC3^1 +"KRN",8994,2259,-1) +0^25 +"KRN",8994,2259,0) +BMX SIGNATURE^SIGCHK^BMXRPC3^1 +"KRN",8994,2260,-1) +0^19 +"KRN",8994,2260,0) +BMX MULT LIST^MLTLIST^BMXRPC2^4 +"KRN",8994,2261,-1) +0^36 +"KRN",8994,2261,0) +BMXGetFacRS^GETFCRS^BMXRPC3^1 +"KRN",8994,2262,-1) +0^41 +"KRN",8994,2262,0) +BMXPatientLookupRS^PTLOOKRS^BMXRPC4^1 +"KRN",8994,2263,-1) +0^40 +"KRN",8994,2263,0) +BMXPatientInfoRS^PTINFORS^BMXRPC4^1 +"KRN",8994,2264,-1) +0^15 +"KRN",8994,2264,0) +BMX HEALTH SUMMARY^HS^BMXRPC5^4 +"KRN",8994,2265,-1) +0^6 +"KRN",8994,2265,0) +BMX DENTAL REPORT 1^BMXADE^BMXADE1^4 +"KRN",8994,2266,-1) +0^44 +"KRN",8994,2266,0) +BMXUserKeyRS^USRKEYRS^BMXRPC6^1 +"KRN",8994,2267,-1) +0^42 +"KRN",8994,2267,0) +BMXProviderLookupRS^PRVLKRS^BMXQA2^1 +"KRN",8994,2268,-1) +0^22 +"KRN",8994,2268,0) +BMX PDATA CHART^PDATA^BMXRPC6^4 +"KRN",8994,2269,-1) +0^7 +"KRN",8994,2269,0) +BMX DENTAL REPORT 2^BMXADE^BMXADE2^4 +"KRN",8994,2270,-1) +0^37 +"KRN",8994,2270,0) +BMXNRC^ZTM^BMXNRC^4 +"KRN",8994,2271,-1) +0^38 +"KRN",8994,2271,0) +BMXNetGetCodes^NTUGET^BMXRPC3^4 +"KRN",8994,2272,-1) +0^39 +"KRN",8994,2272,0) +BMXNetSetUser^NTUSET^BMXRPC3^4 +"KRN",8994,2273,-1) +0^5 +"KRN",8994,2273,0) +BMX DEMO^PDEMO^BMXRPC6^4 +"KRN",8994,2274,-1) +0^4 +"KRN",8994,2274,0) +BMX AV CODE^WINVAL^BMXRPC7^2 +"KRN",8994,2275,-1) +0^17 +"KRN",8994,2275,0) +BMX LOCK^BMXLOCK^BMXRPC8^1 +"KRN",8994,2276,-1) +0^34 +"KRN",8994,2276,0) +BMX VERSION INFO^BMXVER^BMXRPC8^4 +"KRN",8994,2277,-1) +0^16 +"KRN",8994,2277,0) +BMX IM HERE^IMHERE^BMXRPC8^1^P +"KRN",8994,2277,1,0) +^8994.01^2^2^3040304^^^ +"KRN",8994,2277,1,1,0) +Returns a simple value to client. Used to establish continued existence +"KRN",8994,2277,1,2,0) +of the client to the server; resets the server READ timeout. +"KRN",8994,2278,-1) +0^32 +"KRN",8994,2278,0) +BMX UPDATE^FILE^BMXADOF^1 +"KRN",8994,2279,-1) +0^29 +"KRN",8994,2279,0) +BMX TEST^TESTRPC^BMXRPC9^4 +"KRN",8994,2280,-1) +0^23 +"KRN",8994,2280,0) +BMX SCHEMA ONLY^SONLY^BMXRPC9^1 +"KRN",8994,2281,-1) +0^1 +"KRN",8994,2281,0) +BMX ADO SS^SS^BMXADO^4 +"KRN",8994,2282,-1) +0^9 +"KRN",8994,2282,0) +BMX EVENT RAISE^RAISEVNT^BMXMEVN^4 +"KRN",8994,2283,-1) +0^10 +"KRN",8994,2283,0) +BMX EVENT REGISTER^REGEVNT^BMXMEVN^4 +"KRN",8994,2284,-1) +0^11 +"KRN",8994,2284,0) +BMX EVENT UNREGISTER^UNREG^BMXMEVN^4 +"KRN",8994,2285,-1) +0^8 +"KRN",8994,2285,0) +BMX EVENT POLL^POLL^BMXMEVN^4 +"KRN",8994,2286,-1) +0^30 +"KRN",8994,2286,0) +BMX TIMER TEST^TTEST^BMXMEVN^4 +"KRN",8994,2287,-1) +0^2 +"KRN",8994,2287,0) +BMX ASYNC GET^ASYNCGET^BMXMEVN^4 +"KRN",8994,2288,-1) +0^3 +"KRN",8994,2288,0) +BMX ASYNC QUEUE^ASYNCQUE^BMXMEVN^4 +"MBREQ") +0 +"ORD",3,19.1) +19.1;3;1;;KEY^XPDTA1;;;KEYF2^XPDIA1;;KEYDEL^XPDIA1 +"ORD",3,19.1,0) +SECURITY KEY +"ORD",7,.402) +.402;7;;;EDEOUT^DIFROMSO(.402,DA,"",XPDA);FPRE^DIFROMSI(.402,"",XPDA);EPRE^DIFROMSI(.402,DA,$E("N",$G(XPDNEW)),XPDA,"",OLDA);;EPOST^DIFROMSI(.402,DA,"",XPDA);DEL^DIFROMSK(.402,"",%) +"ORD",7,.402,0) +INPUT TEMPLATE +"ORD",16,8994) +8994;16;1;;;;;;;RPCDEL^XPDIA1 +"ORD",16,8994,0) +REMOTE PROCEDURE +"ORD",18,19) +19;18;;;OPT^XPDTA;OPTF1^XPDIA;OPTE1^XPDIA;OPTF2^XPDIA;;OPTDEL^XPDIA +"ORD",18,19,0) +OPTION +"PKG",207,-1) +1^1 +"PKG",207,0) +BMXNET RPMS .NET UTILITIES^BMX^.NET CONNECTIVITY UTILITIES +"PKG",207,1,0) +^9.41A^2^2^3061031^^^^ +"PKG",207,1,1,0) +BMXNet supports connection, authentication and data exchange between +"PKG",207,1,2,0) +Windows applications written for the .NET environment. +"PKG",207,20,0) +^9.402P^^ +"PKG",207,22,0) +^9.49I^1^1 +"PKG",207,22,1,0) +2.1T2^3090829 +"PKG",207,22,1,1,0) +^^4^4^3090829 +"PKG",207,22,1,1,1,0) +BMXNet .NET Connectivity utilities for RPMS. +"PKG",207,22,1,1,2,0) +Version 2.0 kids build to support BMXNet20.dll +"PKG",207,22,1,1,3,0) + +"PKG",207,22,1,1,4,0) +Version 2.1 adds support to GT.M. +"PKG",207,"DEV") +IHS/ITSC/HWHITT +"PKG",207,"VERSION") +2.1T2 +"PRE") +BMXE01 +"QUES","XPF1",0) +Y +"QUES","XPF1","??") +^D REP^XPDH +"QUES","XPF1","A") +Shall I write over your |FLAG| File +"QUES","XPF1","B") +YES +"QUES","XPF1","M") +D XPF1^XPDIQ +"QUES","XPF2",0) +Y +"QUES","XPF2","??") +^D DTA^XPDH +"QUES","XPF2","A") +Want my data |FLAG| yours +"QUES","XPF2","B") +YES +"QUES","XPF2","M") +D XPF2^XPDIQ +"QUES","XPI1",0) +YO +"QUES","XPI1","??") +^D INHIBIT^XPDH +"QUES","XPI1","A") +Want KIDS to INHIBIT LOGONs during the install +"QUES","XPI1","B") +NO +"QUES","XPI1","M") +D XPI1^XPDIQ +"QUES","XPM1",0) +PO^VA(200,:EM +"QUES","XPM1","??") +^D MG^XPDH +"QUES","XPM1","A") +Enter the Coordinator for Mail Group '|FLAG|' +"QUES","XPM1","B") + +"QUES","XPM1","M") +D XPM1^XPDIQ +"QUES","XPO1",0) +Y +"QUES","XPO1","??") +^D MENU^XPDH +"QUES","XPO1","A") +Want KIDS to Rebuild Menu Trees Upon Completion of Install +"QUES","XPO1","B") +NO +"QUES","XPO1","M") +D XPO1^XPDIQ +"QUES","XPZ1",0) +Y +"QUES","XPZ1","??") +^D OPT^XPDH +"QUES","XPZ1","A") +Want to DISABLE Scheduled Options, Menu Options, and Protocols +"QUES","XPZ1","B") +NO +"QUES","XPZ1","M") +D XPZ1^XPDIQ +"QUES","XPZ2",0) +Y +"QUES","XPZ2","??") +^D RTN^XPDH +"QUES","XPZ2","A") +Want to MOVE routines to other CPUs +"QUES","XPZ2","B") +NO +"QUES","XPZ2","M") +D XPZ2^XPDIQ +"RTN") +59 +"RTN","BMXADE1") +0^59^B11418056 +"RTN","BMXADE1",1,0) +BMXADE1 ; IHS/OIT/HMW - BMXNet ADO.NET PROVIDER ; +"RTN","BMXADE1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADE1",3,0) + ; +"RTN","BMXADE1",4,0) + ; +"RTN","BMXADE1",5,0) + ;Dental Excel report demo +"RTN","BMXADE1",6,0) + ; +"RTN","BMXADE1",7,0) +BMXADE(BMXGBL,BMXBEG,BMXEND) ;EP +"RTN","BMXADE1",8,0) + ;Returns recordset containing services and minutes by reporting facility, patient's community and service unit +"RTN","BMXADE1",9,0) + ; +"RTN","BMXADE1",10,0) + N BMXBEGDT,BMXENDDT,BMXTMP,BMXDT,BMXRD,BMXIEN,BMXNOD,BMXPAT,BMXCOM,BMXFAC,BMXSU,BMXCOMP,BMXSUP,BMXFACP,BMXSVC,BMXMIN,BMXFEE +"RTN","BMXADE1",11,0) + S U="^",BMXRD=$C(30) +"RTN","BMXADE1",12,0) + K ^BMXTEMP($J),^BMXTMP($J) +"RTN","BMXADE1",13,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXADE1",14,0) + S ^BMXTEMP($J,0)="T00030FACILITY^T00030PT_COMMUNITY^T00030PT_SERVICE_UNIT^I00030SERVICES^I00030MINUTES^I00030FEE"_BMXRD +"RTN","BMXADE1",15,0) + S X=BMXBEG,%DT="P" D ^%DT S BMXBEGDT=Y +"RTN","BMXADE1",16,0) + S X=BMXEND,%DT="P" D ^%DT S BMXENDDT=Y +"RTN","BMXADE1",17,0) + I BMXENDDTBMXENDDT D +"RTN","BMXADE1",25,0) + . S BMXIEN=0 F S BMXIEN=$O(^ADEPCD("AC",BMXDT,BMXIEN)) Q:'+BMXIEN D +"RTN","BMXADE1",26,0) + . . Q:'$D(^ADEPCD(BMXIEN,0)) +"RTN","BMXADE1",27,0) + . . S BMXNOD=^ADEPCD(BMXIEN,0) +"RTN","BMXADE1",28,0) + . . S BMXPAT=$P(BMXNOD,U) +"RTN","BMXADE1",29,0) + . . S BMXFACP=+$P(BMXNOD,U,3) +"RTN","BMXADE1",30,0) + . . S BMXCOMP=$$GETCOMP(BMXPAT) +"RTN","BMXADE1",31,0) + . . D CALCMIN(BMXIEN,.BMXSVC,.BMXMIN,.BMXFEE) +"RTN","BMXADE1",32,0) + . . Q:BMXSVC=0 +"RTN","BMXADE1",33,0) + . . S:'$D(^BMXTMP($J,BMXFACP,BMXCOMP)) ^BMXTMP($J,BMXFACP,BMXCOMP)="0^0^0" +"RTN","BMXADE1",34,0) + . . S $P(^BMXTMP($J,BMXFACP,BMXCOMP),U)=$P(^(BMXCOMP),U)+BMXSVC +"RTN","BMXADE1",35,0) + . . S $P(^BMXTMP($J,BMXFACP,BMXCOMP),U,2)=$P(^(BMXCOMP),U,2)+BMXMIN +"RTN","BMXADE1",36,0) + . . S $P(^BMXTMP($J,BMXFACP,BMXCOMP),U,3)=$P(^(BMXCOMP),U,3)+BMXFEE +"RTN","BMXADE1",37,0) + . . Q +"RTN","BMXADE1",38,0) + . Q +"RTN","BMXADE1",39,0) + ; +"RTN","BMXADE1",40,0) + ;Traverse ^BMXTMP and fill in ^BMXTEMP +"RTN","BMXADE1",41,0) + S BMXI=0 +"RTN","BMXADE1",42,0) + S BMXFACP=-1 F S BMXFACP=$O(^BMXTMP($J,BMXFACP)) Q:BMXFACP="" D +"RTN","BMXADE1",43,0) + . I BMXFACP=0 S BMXFAC="UNKNOWN" +"RTN","BMXADE1",44,0) + . E S BMXFAC=$P($G(^DIC(4,BMXFACP,0)),U) S:BMXFAC="" BMXFAC="UNKNOWN" +"RTN","BMXADE1",45,0) + . S BMXCOMP=-1 F S BMXCOMP=$O(^BMXTMP($J,BMXFACP,BMXCOMP)) Q:BMXCOMP="" D +"RTN","BMXADE1",46,0) + . . I BMXCOMP=0 S BMXCOM="UNKNOWN" +"RTN","BMXADE1",47,0) + . . E S BMXCOM=$P($G(^AUTTCOM(BMXCOMP,0)),U) S:BMXCOM="" BMXCOM="UNKNOWN" +"RTN","BMXADE1",48,0) + . . S BMXSU=+$P($G(^AUTTCOM(BMXCOMP,0)),U,5) +"RTN","BMXADE1",49,0) + . . I BMXSU=0 S BMXSU="UNKNOWN" +"RTN","BMXADE1",50,0) + . . E S BMXSU=$P($G(^AUTTSU(BMXSU,0)),U) +"RTN","BMXADE1",51,0) + . . S BMXI=BMXI+1 +"RTN","BMXADE1",52,0) + . . S BMXSVC=$P(^BMXTMP($J,BMXFACP,BMXCOMP),U) +"RTN","BMXADE1",53,0) + . . S BMXMIN=$P(^BMXTMP($J,BMXFACP,BMXCOMP),U,2) +"RTN","BMXADE1",54,0) + . . S BMXFEE=$P(^BMXTMP($J,BMXFACP,BMXCOMP),U,3) +"RTN","BMXADE1",55,0) + . . S ^BMXTEMP($J,BMXI)=BMXFAC_U_BMXCOM_U_BMXSU_U_BMXSVC_U_BMXMIN_U_BMXFEE_BMXRD +"RTN","BMXADE1",56,0) + . . Q +"RTN","BMXADE1",57,0) + . Q +"RTN","BMXADE1",58,0) + S BMXI=BMXI+1 +"RTN","BMXADE1",59,0) + S ^BMXTEMP($J,BMXI)=$C(31) +"RTN","BMXADE1",60,0) + Q +"RTN","BMXADE1",61,0) + ; +"RTN","BMXADE1",62,0) +GETCOMP(BMXPAT) ; +"RTN","BMXADE1",63,0) + ;Returns Patient Community Pointer +"RTN","BMXADE1",64,0) + I '$D(^AUPNPAT(BMXPAT,11)) Q 0 +"RTN","BMXADE1",65,0) + Q +$P(^AUPNPAT(BMXPAT,11),U,17) +"RTN","BMXADE1",66,0) + ; +"RTN","BMXADE1",67,0) +CALCMIN(BMXIEN,BMXSVC,BMXMIN,BMXFEE) ; +"RTN","BMXADE1",68,0) + ;Returns count of lvl 1 - 6 services and minutes for entry BMXIEN +"RTN","BMXADE1",69,0) + ;Uses ANMC rogue FEE field in AUTTADA to calculate FEE data +"RTN","BMXADE1",70,0) + N BMXA,BMXCOD,BMXALVL +"RTN","BMXADE1",71,0) + S BMXSVC=0,BMXMIN=0,BMXFEE=0 +"RTN","BMXADE1",72,0) + Q:'$D(^ADEPCD(BMXIEN,"ADA")) +"RTN","BMXADE1",73,0) + S BMXA=0 F S BMXA=$O(^ADEPCD(BMXIEN,"ADA",BMXA)) Q:'+BMXA D +"RTN","BMXADE1",74,0) + . S BMXCOD=+^ADEPCD(BMXIEN,"ADA",BMXA,0) +"RTN","BMXADE1",75,0) + . Q:'$D(^AUTTADA(BMXCOD,0)) +"RTN","BMXADE1",76,0) + . S BMXANOD=^AUTTADA(BMXCOD,0) +"RTN","BMXADE1",77,0) + . S BMXALVL=$P(BMXANOD,U,5) +"RTN","BMXADE1",78,0) + . Q:BMXALVL=0 +"RTN","BMXADE1",79,0) + . Q:BMXALVL>6 +"RTN","BMXADE1",80,0) + . S BMXSVC=BMXSVC+1 +"RTN","BMXADE1",81,0) + . S BMXMIN=BMXMIN+$P(BMXANOD,U,4) +"RTN","BMXADE1",82,0) + . S BMXFEE=BMXFEE+$P(BMXANOD,U,12) +"RTN","BMXADE1",83,0) + Q +"RTN","BMXADE2") +0^60^B13063702 +"RTN","BMXADE2",1,0) +BMXADE2 ; IHS/OIT/HMW - BMXNet ADO.NET PROVIDER ; +"RTN","BMXADE2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADE2",3,0) + ; +"RTN","BMXADE2",4,0) + ; +"RTN","BMXADE2",5,0) + ;Dental Excel report demo +"RTN","BMXADE2",6,0) + ; +"RTN","BMXADE2",7,0) +BMXADE(BMXGBL,BMXBEG,BMXEND) ;EP +"RTN","BMXADE2",8,0) + ;Returns recordset containing services and minutes by reporting facility, Provider, and ADA Code +"RTN","BMXADE2",9,0) + ; +"RTN","BMXADE2",10,0) + N BMXBEGDT,BMXENDDT,BMXTMP,BMXDT,BMXRD,BMXIEN,BMXNOD,BMXCOM,BMXFAC,BMXSU,BMXCOMP,BMXSUP,BMXFACP,BMXSVC,BMXMIN,BMXLVL,BMXFEE +"RTN","BMXADE2",11,0) + S U="^",BMXRD=$C(30) +"RTN","BMXADE2",12,0) + K ^BMXTEMP($J),^BMXTMP($J) +"RTN","BMXADE2",13,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXADE2",14,0) + S ^BMXTEMP($J,0)="T00030FACILITY^T00030PROVIDER^T00030ADA_CODE^T00030LEVEL^I00030SERVICES^I00030MINUTES^I00030FEE"_BMXRD +"RTN","BMXADE2",15,0) + S X=BMXBEG,%DT="P" D ^%DT S BMXBEGDT=Y +"RTN","BMXADE2",16,0) + S X=BMXEND,%DT="P" D ^%DT S BMXENDDT=Y +"RTN","BMXADE2",17,0) + I BMXENDDTBMXENDDT D +"RTN","BMXADE2",25,0) + . S BMXIEN=0 F S BMXIEN=$O(^ADEPCD("AC",BMXDT,BMXIEN)) Q:'+BMXIEN D +"RTN","BMXADE2",26,0) + . . Q:'$D(^ADEPCD(BMXIEN,0)) +"RTN","BMXADE2",27,0) + . . S BMXNOD=^ADEPCD(BMXIEN,0) +"RTN","BMXADE2",28,0) + . . S BMXFACP=+$P(BMXNOD,U,3) +"RTN","BMXADE2",29,0) + . . S BMXPRVP=+$P(BMXNOD,U,4) +"RTN","BMXADE2",30,0) + . . S BMXCODP=0 F S BMXCODP=$O(^ADEPCD(BMXIEN,"ADA","B",BMXCODP)) Q:'+BMXCODP D +"RTN","BMXADE2",31,0) + . . . D CALCMIN(BMXCODP,.BMXMIN) +"RTN","BMXADE2",32,0) + . . . D CALCFEE(BMXCODP,.BMXFEE) +"RTN","BMXADE2",33,0) + . . . S BMXCODPS=0,BMXSVC=0 F S BMXCODPS=$O(^ADEPCD(BMXIEN,"ADA","B",BMXCODP,BMXCODPS)) Q:'+BMXCODPS D +"RTN","BMXADE2",34,0) + . . . . S BMXSVC=BMXSVC+1 +"RTN","BMXADE2",35,0) + . . . S:'$D(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP)) ^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP)="0^0" +"RTN","BMXADE2",36,0) + . . . S $P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U)=$P(^(BMXCODP),U)+BMXSVC +"RTN","BMXADE2",37,0) + . . . S $P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,2)=$P(^(BMXCODP),U,2)+(BMXSVC*BMXMIN) +"RTN","BMXADE2",38,0) + . . . S $P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,3)=$P(^(BMXCODP),U,3)+(BMXSVC*BMXFEE) +"RTN","BMXADE2",39,0) + . . . Q +"RTN","BMXADE2",40,0) + . . Q +"RTN","BMXADE2",41,0) + . Q +"RTN","BMXADE2",42,0) + ; +"RTN","BMXADE2",43,0) + ;Traverse ^BMXTMP and fill in ^BMXTEMP +"RTN","BMXADE2",44,0) + S BMXI=0 +"RTN","BMXADE2",45,0) + S BMXFACP=-1 F S BMXFACP=$O(^BMXTMP($J,BMXFACP)) Q:BMXFACP="" D +"RTN","BMXADE2",46,0) + . I BMXFACP=0 S BMXFAC="UNKNOWN" +"RTN","BMXADE2",47,0) + . E S BMXFAC=$P($G(^DIC(4,BMXFACP,0)),U) S:BMXFAC="" BMXFAC="UNKNOWN" +"RTN","BMXADE2",48,0) + . S BMXPRVP=-1 F S BMXPRVP=$O(^BMXTMP($J,BMXFACP,BMXPRVP)) Q:BMXPRVP="" D +"RTN","BMXADE2",49,0) + . . S BMXPRV=$P($G(^DIC(16,BMXPRVP,0)),U) S:BMXPRV="" BMXPRV="UNKNOWN" +"RTN","BMXADE2",50,0) + . . S BMXCODP=-1 F S BMXCODP=$O(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP)) Q:'+BMXCODP D +"RTN","BMXADE2",51,0) + . . . D CODLVL(BMXCODP,.BMXCOD,.BMXLVL) +"RTN","BMXADE2",52,0) + . . . S BMXI=BMXI+1 +"RTN","BMXADE2",53,0) + . . . S BMXSVC=$P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U) +"RTN","BMXADE2",54,0) + . . . S BMXMIN=$P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,2) +"RTN","BMXADE2",55,0) + . . . S BMXFEE=$P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,3) +"RTN","BMXADE2",56,0) + . . . S ^BMXTEMP($J,BMXI)=BMXFAC_U_BMXPRV_U_BMXCOD_U_BMXLVL_U_BMXSVC_U_BMXMIN_U_BMXFEE_BMXRD +"RTN","BMXADE2",57,0) + . . . Q +"RTN","BMXADE2",58,0) + . . Q +"RTN","BMXADE2",59,0) + . Q +"RTN","BMXADE2",60,0) + S BMXI=BMXI+1 +"RTN","BMXADE2",61,0) + S ^BMXTEMP($J,BMXI)=$C(31) +"RTN","BMXADE2",62,0) + Q +"RTN","BMXADE2",63,0) + ; +"RTN","BMXADE2",64,0) +CALCMIN(BMXCODP,BMXMIN) ; +"RTN","BMXADE2",65,0) + ;Returns Minutes for code BMXCOD +"RTN","BMXADE2",66,0) + N BMXANOD +"RTN","BMXADE2",67,0) + S BMXMIN=0 +"RTN","BMXADE2",68,0) + Q:'$D(^AUTTADA(BMXCODP,0)) +"RTN","BMXADE2",69,0) + S BMXANOD=^AUTTADA(BMXCODP,0) +"RTN","BMXADE2",70,0) + ;S BMXLVL=$P(BMXANOD,U,5) +"RTN","BMXADE2",71,0) + S BMXMIN=$P(BMXANOD,U,4) +"RTN","BMXADE2",72,0) + Q +"RTN","BMXADE2",73,0) + ; +"RTN","BMXADE2",74,0) +CALCFEE(BMXCODP,BMXFEE) ; +"RTN","BMXADE2",75,0) + ;Returns FEE for code BMXCOD. Only works for ANMC local fee field +"RTN","BMXADE2",76,0) + N BMXANOD +"RTN","BMXADE2",77,0) + S BMXFEE=0 +"RTN","BMXADE2",78,0) + Q:'$D(^AUTTADA(BMXCODP,0)) +"RTN","BMXADE2",79,0) + S BMXANOD=^AUTTADA(BMXCODP,0) +"RTN","BMXADE2",80,0) + S BMXFEE=+$P(BMXANOD,U,12) +"RTN","BMXADE2",81,0) + Q +"RTN","BMXADE2",82,0) + ; +"RTN","BMXADE2",83,0) +CODLVL(BMXCODP,BMXCOD,BMXLVL) ; +"RTN","BMXADE2",84,0) + ;Returns Name and Level of code at ADACODP +"RTN","BMXADE2",85,0) + N BMXANOD +"RTN","BMXADE2",86,0) + S BMXCOD="",BMXLVL="" +"RTN","BMXADE2",87,0) + Q:'$D(^AUTTADA(BMXCODP,0)) +"RTN","BMXADE2",88,0) + S BMXANOD=^AUTTADA(BMXCODP,0) +"RTN","BMXADE2",89,0) + S BMXCOD=$P(BMXANOD,U) +"RTN","BMXADE2",90,0) + S BMXLVL=$P(BMXANOD,U,5) +"RTN","BMXADO") +0^61^B32349097 +"RTN","BMXADO",1,0) +BMXADO ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; +"RTN","BMXADO",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADO",3,0) + ; SS^BMXADO: RPC EP FROM WINDOWS/WEB APP TO GENERATE A SCHEMEA STRING (& OPTIONALLY, A DATA SET AS WELL) +"RTN","BMXADO",4,0) + ; THE SCHEMA DEFINITION AND MAP IS STORED IN THE 'BMX ADO SCHEMA' FILE +"RTN","BMXADO",5,0) + ; THIS ROUTINE GENERATES THE SCHEMA STRING. BMXADOV GENERATES THE DATA SET THAT GOES WITH THE SCHEMA STRING. +"RTN","BMXADO",6,0) + ; IF THERE IS AN ERROR, XXX(1) WILL CONTAIN "ERROR|msg"_$C(30) WHERE 'msg' IS THE ERROR MESSAGE +"RTN","BMXADO",7,0) + ; E.G."ERROR|Invalid schema IEN" +"RTN","BMXADO",8,0) + ; +"RTN","BMXADO",9,0) + ; +"RTN","BMXADO",10,0) +SSD(OUT,SIEN,DAS,VSTG,JSTG) ;Debug entry point +"RTN","BMXADO",11,0) + D DEBUG^%Serenji("SS^BMXADO(.OUT,SIEN,DAS,VSTG,JSTG)") ; DEBUGGER ENTRY POINT +"RTN","BMXADO",12,0) + Q +"RTN","BMXADO",13,0) + ; +"RTN","BMXADO",14,0) + ; +"RTN","BMXADO",15,0) +SS(OUT,SIEN,DAS,VSTG,JSTG) ; EP - RETURN THE SCHEMA STRING IN AN ARRAY +"RTN","BMXADO",16,0) + ; OUT=OUTPUT VARIABLE (PASSED BY REFERENCE) +"RTN","BMXADO",17,0) + ; THE OUTPUT ARRAY IS GENERATED FROM DATA IN THE 'BMX ADO SCHEMA' FILE AND THE FILEMAN DATABASE +"RTN","BMXADO",18,0) + ; RECORDS ARE SEPARATED WITH $C(30). FIELDS ARE SEPARATED BY "^". FIELD PROPERTIES ARE SEPARATED BY "|". +"RTN","BMXADO",19,0) + ; ONE RECORD PER OUTPUT NODE. +"RTN","BMXADO",20,0) + ; 1ST RECORD IS THE "INTRODUCTION RECORD": "@@@meta@@@BMXIEN|FILE #|DA STRING" +"RTN","BMXADO",21,0) + ; THE SECOND RECORD IS THE HEADER RECORD. THE REST ARE THE DATA RECORDS +"RTN","BMXADO",22,0) + ; RECORD FORMAT: FILE#|FIELD#|DATA TYPE|LENGTH|FIELDNAME|READONLY|KEYFIELD|NULLOK_$C(30) +"RTN","BMXADO",23,0) + ; SIEN=SCHEMA NAME OR IEN FROM BMX ADO SCHEMA FILE +"RTN","BMXADO",24,0) + ; DAS= "DA" STRING: STRING FOR DEFINING PARENT FILES +"RTN","BMXADO",25,0) + ; EXAMPLE: "4,8," CORRESPONDS TO DA(2), DA(1). +"RTN","BMXADO",26,0) + ; PRIMARILY USED AS A "SEED" FOR RE-ENTRY - IF INDEX IS PRESENT. +"RTN","BMXADO",27,0) + ; IF NOT A SEED, DO NOT INCLUDE THE BOTTOM LEVEL IEN: DA; E.G., "4,8," +"RTN","BMXADO",28,0) + ; DO NOT CONFUSE WITH "IENS STRING" OF FILEMAN SILENT CALLS +"RTN","BMXADO",29,0) + ; VSTG=VIEW STRING INSTRUCTIONS (SEE BMXADOV FOR DETAILS) +"RTN","BMXADO",30,0) + ; JSTG=JOIN STRING INSTRUCTIONS (SEE BMXADOVJ FOR DETAILS) +"RTN","BMXADO",31,0) + ; +"RTN","BMXADO",32,0) + N X,Y,DIC,ERR +"RTN","BMXADO",33,0) + S OUT=$NA(^TMP("BMX ADO",$J)) K @OUT ; DEFINE THE OUTPUT ARRAY CLOSED REFERENCE +"RTN","BMXADO",34,0) + X ("S "_$C(68)_"UZ(0)=$C(64)") ; INSURE PRIVELEGES +"RTN","BMXADO",35,0) + S X="MERR^BMXADO",@^%ZOSF("TRAP") ; SET MUMPS ERROR TRAP +"RTN","BMXADO",36,0) + I '$L(SIEN) S ERR="Missing schema ID" D ERR(ERR) Q +"RTN","BMXADO",37,0) + I 'SIEN S DIC="^BMXADO(",DIC(0)="M",X=SIEN D ^DIC S SIEN=+Y I Y=-1 S ERR="Invalid schema ID" D ERR(ERR) Q +"RTN","BMXADO",38,0) + I '$D(^BMXADO(SIEN,0)) S ERR="Invalid/missing schema" D ERR(ERR) Q ; SCHEMA MUST EXIST +"RTN","BMXADO",39,0) + N FIEN,FLDIEN,TOT,STG,B,C,X,%,LEVEL,Y,SF +"RTN","BMXADO",40,0) + S FIEN=$P(^BMXADO(SIEN,0),U,2) +"RTN","BMXADO",41,0) + I '$D(^DD(FIEN,0)) S ERR="Invalid/missing file number in schema file" D ERR(ERR) Q ; INVALID FILE NUMBER +"RTN","BMXADO",42,0) + S SF=$$CKSUB(FIEN,DAS) I SF=-1 S ERR="Invalid DA string" D ERR(ERR) Q ; INVALID DA STRING +"RTN","BMXADO",43,0) + S C=",",B="|",TOT=0 ; THESE LOCALS, ALONG WITH KERNEL VARIABLES, ARE ALWAYS AVAILABLE TO ALL ROUTINES AND SUBROUTINES +"RTN","BMXADO",44,0) +JEP ; EP-RECURSION RE-ENTRY POINT FOR JOINS +"RTN","BMXADO",45,0) + I $G(SUB),$G(SF) S ERR="Invalid request" D ERR(ERR) Q ; CAN'T DO JOIN WITH A SUBFILE AS THE PRIMARY FILE +"RTN","BMXADO",46,0) + S TOT=TOT+1,@OUT@(TOT)="@@@meta@@@BMXIEN"_B_FIEN_B_DAS_U +"RTN","BMXADO",47,0) + I $G(SUB) S TOT=TOT+1,@OUT@(TOT)=FIEN_"|.0001|N|15|DA(1)|TRUE|FALSE|FALSE^" +"RTN","BMXADO",48,0) + I $G(SF) D SFH(SF) ; SUBFILE HEADERS +"RTN","BMXADO",49,0) + S TOT=TOT+1,@OUT@(TOT)=FIEN_"|.001|N|15|BMXIEN|TRUE|TRUE|FALSE^" ; KEY FIELD PART OF HEADER RECORD +"RTN","BMXADO",50,0) + S FLDIEN=0 +"RTN","BMXADO",51,0) + F S FLDIEN=$O(^BMXADO(SIEN,1,FLDIEN)) Q:'FLDIEN S STG=$G(^BMXADO(SIEN,1,FLDIEN,0)) I $L(STG) D ; REST OF HEADER RECORD +"RTN","BMXADO",52,0) + . S X=FIEN_B_$P(STG,U)_B_$P(STG,U,2)_B_$P(STG,U,3)_B_$P(STG,U,4)_B +"RTN","BMXADO",53,0) + . S %=$S($P(STG,U,5):"TRUE",$P($G(^BMXADO(+$G(IEN),0)),U,3):"TRUE",1:"FALSE") S X=X_%_B ; READ ONLY +"RTN","BMXADO",54,0) + . S %=$S($P(STG,U,6):"TRUE",1:"FALSE") S X=X_%_B ; THIS IS A KEY FIELD +"RTN","BMXADO",55,0) + . S %=$S($P(STG,U,7):"TRUE",1:"FALSE") S X=X_%_U ; NULL VALUE IS OK (NOT MANDATORY FOR TRANSACTION) +"RTN","BMXADO",56,0) + . S TOT=TOT+1 +"RTN","BMXADO",57,0) + . S @OUT@(TOT)=X +"RTN","BMXADO",58,0) + . Q +"RTN","BMXADO",59,0) + I TOT'>2 Q ; NOTHING TO PROCESS +"RTN","BMXADO",60,0) + S %=@OUT@(TOT) I $E(%,$L(%))=U S $E(%,$L(%))=$C(30),@OUT@(TOT)=% ; END OF RECORD MARKER +"RTN","BMXADO",61,0) + I $G(VSTG)="",$G(DFLD)=.001 S VSTG="~~~" ; SIMPLE LOOKUP INTO DETAILS FILE BY IEN +"RTN","BMXADO",62,0) + I '$L($G(VSTG)) Q ; REQUEST IS FOR SCHEMA ONLY - NO DATA +"RTN","BMXADO",63,0) +DATASET S VSTG=SIEN_"~"_DAS_"~"_VSTG +"RTN","BMXADO",64,0) + I $O(^TMP("BMX JOIN",$J,1,+$G(SDETAIL),0)) D JVIEW Q ; JOIN ITERATION ; NO SUPPORT FOR EXTENDED JOINS +"RTN","BMXADO",65,0) + D VIEW^BMXADOV(.OUT,VSTG,.TOT) ; APPEND A DATA SET TO A SCHEMA STRING +"RTN","BMXADO",66,0) + I '$L($G(JSTG)) S JSTG=$P(VSTG,"~",11,999) ; INCLUDED FOR BKWD COMPATIBILITY ;JOIN INSTRUCTIONS SPAN MULTIPLE ~ PIECES (11,999) BECAUSE OF POSSIBLE NESTED VSTG +"RTN","BMXADO",67,0) + I $L(JSTG) D JOIN^BMXADOVJ(SIEN,JSTG) ; ADD DATA SET(S) TO FULFIL THE JOIN REQUEST +"RTN","BMXADO",68,0) + Q +"RTN","BMXADO",69,0) + ; +"RTN","BMXADO",70,0) +JVIEW ; JOIN VIEW - SET XCNT AND RESET THE VSTG +"RTN","BMXADO",71,0) + N XCNT,DA,NODE,% +"RTN","BMXADO",72,0) + S NODE=999999999999 +"RTN","BMXADO",73,0) + F S NODE=$O(@OUT@(NODE),-1) Q:'NODE I @OUT@(NODE)["|.001|" Q +"RTN","BMXADO",74,0) + I 'NODE Q ; INVALID SCHEMA - JOIN CANCELLED +"RTN","BMXADO",75,0) + I '$L($P(VSTG,"~",3)),'$G(SUB),$G(DFLD)'=.001 Q ; THERE MUST BE AN INDEX OR SUBFILE FOR A JOIN TO TAKE PLACE +"RTN","BMXADO",76,0) + D JFLD^BMXADOVJ ; STUFF VALUES FOR JOIN FLDS INTO INTRO SEGMENT OF THE SCHEMA +"RTN","BMXADO",77,0) + S XCNT=NODE +"RTN","BMXADO",78,0) + S DA=0 +"RTN","BMXADO",79,0) + F S DA=$O(^TMP("BMX JOIN",$J,1,SDETAIL,DA)) Q:'DA D D VIEW^BMXADOV(.OUT,VSTG,.TOT) ; APPEND JOINED DATA SETS TO A SCHEMA STRING +"RTN","BMXADO",80,0) + . I $P(VSTG,"~",3)="AA",$L($P(VSTG,"~",10)) D Q +"RTN","BMXADO",81,0) + .. S %=$P(VSTG,"~",10) +"RTN","BMXADO",82,0) + .. S $P(%,"|",1)=DA +"RTN","BMXADO",83,0) + .. S $P(VSTG,"~",10)=% +"RTN","BMXADO",84,0) + .. Q +"RTN","BMXADO",85,0) + . I $G(SUB) S DAS=DA_",",VSTG=SDETAIL_"~"_DA_",~~" Q ; SUBFILE ITERATOR +"RTN","BMXADO",86,0) + . I $P(VSTG,"~",3)="AA",$G(FIEN)=9000011 S $P(VSTG,"~",4,5)=DA_"~"_DA Q ; PROBLEM LIST ITERATOR +"RTN","BMXADO",87,0) + . S $P(VSTG,"~",4,5)=DA_"~"_DA ; SINGLE IEN ITERATOR +"RTN","BMXADO",88,0) + . Q +"RTN","BMXADO",89,0) + Q +"RTN","BMXADO",90,0) + ; +"RTN","BMXADO",91,0) +SFH(DAS) ; SUBFILE HEADERS +"RTN","BMXADO",92,0) + N L,LEV,PCE,X,%,Z,FLD +"RTN","BMXADO",93,0) + S Z="000000000",L=$L(DAS,",") +"RTN","BMXADO",94,0) + F PCE=1:1:L-1 D +"RTN","BMXADO",95,0) + . S LEV=(L+1)-PCE +"RTN","BMXADO",96,0) + . S FLD="."_$E(Z,1,LEV+1)_1 +"RTN","BMXADO",97,0) + . S TOT=TOT+1 +"RTN","BMXADO",98,0) + . S @OUT@(TOT)=FIEN_B_FLD_"|I|10|BMXIEN"_(LEV-1)_"|TRUE|TRUE|FALSE"_U ; FIX +"RTN","BMXADO",99,0) + . Q +"RTN","BMXADO",100,0) + Q +"RTN","BMXADO",101,0) + ; +"RTN","BMXADO",102,0) +CKSUB(FILE,DAS) ; CHECK THE DA STRING FOR VALIDITY AND MAKE THE DA ARRAY +"RTN","BMXADO",103,0) + N LEVEL,FIEN +"RTN","BMXADO",104,0) + S FIEN=FILE +"RTN","BMXADO",105,0) + F LEVEL=1:1 S FIEN=$G(^DD(FIEN,0,"UP")) Q:'FIEN ; COUNT THE LEVELS +"RTN","BMXADO",106,0) + I LEVEL'=$L($G(DAS),",") Q -1 ; LEVEL MATCHES DA STRING +"RTN","BMXADO",107,0) + I LEVEL=1 Q "" ; INVALID DA STRING +"RTN","BMXADO",108,0) + Q DAS +"RTN","BMXADO",109,0) + ; +"RTN","BMXADO",110,0) +LINE(FILE) ; GET FIELD VALUES +"RTN","BMXADO",111,0) + N LINE,NODE,STG,DIR,FLD,PF,SET,X,DS,DP +"RTN","BMXADO",112,0) + S LINE="" +"RTN","BMXADO",113,0) + S NODE=2,Y="" F S NODE=$O(ARR(NODE)) Q:'NODE S STG=ARR(NODE) I $L(STG) D I Y=U Q +"RTN","BMXADO",114,0) + . S FLD=$P(STG,B,2) I 'FLD S Y=U Q +"RTN","BMXADO",115,0) + . I $P(STG,B,6)="TRUE" Q ; READ ONLY +"RTN","BMXADO",116,0) + . S DIR("A")=$P(STG,B,5) I '$L(DIR("A")) S Y=U Q +"RTN","BMXADO",117,0) + . S X=$P($G(^DD(+$G(FILE),FLD,0)),U,2) +"RTN","BMXADO",118,0) + . I X["P" D Q +"RTN","BMXADO",119,0) + .. S PF=+$P(X,"P",2) I 'PF S Y=U Q +"RTN","BMXADO",120,0) + .. S DIR(0)="P^"_PF_":EQMZ" +"RTN","BMXADO",121,0) + .. D DIR +"RTN","BMXADO",122,0) + .. Q +"RTN","BMXADO",123,0) + . I X["S" D Q +"RTN","BMXADO",124,0) + .. S DIR(0)="S^"_$P(^DD(FILE,FLD,0),U,3) +"RTN","BMXADO",125,0) + .. D DIR +"RTN","BMXADO",126,0) + .. Q +"RTN","BMXADO",127,0) + . I X["D" D Q +"RTN","BMXADO",128,0) + .. S DS=$P(^DD(FILE,FLD,0),U,5) +"RTN","BMXADO",129,0) + .. I DS'["%DT=""" S DIR(0)="D^::EX" D DIR Q +"RTN","BMXADO",130,0) + .. S DP=$P(DS,"%DT="_$C(34),2) S DP=$P(DP,$C(34,32),1) +"RTN","BMXADO",131,0) + .. S DIR(0)="D^::"_DP +"RTN","BMXADO",132,0) + .. D DIR +"RTN","BMXADO",133,0) + .. Q +"RTN","BMXADO",134,0) + . S DIR="F" +"RTN","BMXADO",135,0) + . D DIR +"RTN","BMXADO",136,0) + . Q +"RTN","BMXADO",137,0) + Q LINE +"RTN","BMXADO",138,0) + ; +"RTN","BMXADO",139,0) +DIR D ^DIR +"RTN","BMXADO",140,0) + I Y?1."^" S Y=U Q +"RTN","BMXADO",141,0) + I Y?1.N1"^".E S Y="`"_+Y +"RTN","BMXADO",142,0) + S LINE=LINE_U_Y +"RTN","BMXADO",143,0) + Q +"RTN","BMXADO",144,0) + ; +"RTN","BMXADO",145,0) +MERR ; MUMPS ERROR TRAP +"RTN","BMXADO",146,0) + N X +"RTN","BMXADO",147,0) + X ("S X=$"_"ZE") +"RTN","BMXADO",148,0) + S X="MUMPS error: """_X_"""" +"RTN","BMXADO",149,0) + D ERR(X) +"RTN","BMXADO",150,0) + Q +"RTN","BMXADO",151,0) + ; +"RTN","BMXADO",152,0) +ERR(ERR) ;EP - BMX ADO SCHEMA ERROR PROCESSOR +"RTN","BMXADO",153,0) + N X +"RTN","BMXADO",154,0) + S X="ERROR|"_ERR_$C(30) +"RTN","BMXADO",155,0) + S @OUT@(1)=X +"RTN","BMXADO",156,0) + Q +"RTN","BMXADO",157,0) + ; +"RTN","BMXADO2") +0^62^B10227201 +"RTN","BMXADO2",1,0) +BMXADO2 ; IHS/CIHA/GIS - BMX ADO RECORDSET UTILS ; +"RTN","BMXADO2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADO2",3,0) + ; +"RTN","BMXADO2",4,0) + ; +"RTN","BMXADO2",5,0) +GEN(BMXY,BMXF) ;EP - Generate an ADO Schema string from a list of fields +"RTN","BMXADO2",6,0) + ;BMXY Is an out-parameter called by reference. +"RTN","BMXADO2",7,0) + ;On return, BMXY will be a zero-based one-dimensional array each node of which will +"RTN","BMXADO2",8,0) + ;contain the schema corresponding to the fields info in BMXF +"RTN","BMXADO2",9,0) + ; +"RTN","BMXADO2",10,0) + ;BMXF is an in-parameter called by reference. +"RTN","BMXADO2",11,0) + ;On input, BMXF will contain the field info on which to build the schema string. +"RTN","BMXADO2",12,0) + ; +"RTN","BMXADO2",13,0) + ;Field info in BMXF is arranged in a zero-based one-dimensional array. +"RTN","BMXADO2",14,0) + ;Node 0 of BMXF contains the KEYFIELDNAME^FILENUMBER^READONLY +"RTN","BMXADO2",15,0) + ;where KEYFIELDNAME is the name of the unique key field in the database and +"RTN","BMXADO2",16,0) + ;FILENUMBER is the FileMan file number and +"RTN","BMXADO2",17,0) + ;READONLY denotes whether the entire recordset is updateable. +"RTN","BMXADO2",18,0) + ; +"RTN","BMXADO2",19,0) + ;Each subsequent node of the BMXF arrray contains field info in the form +"RTN","BMXADO2",20,0) + ;1FILE#^2FIELD#^3LENGTH^4DATATYPE^5ALIAS^6READONLY^7KEYFIELD^8NULLOK +"RTN","BMXADO2",21,0) + ;If FILE# AND FIELD# are defined, the LENGTH and DATATYPE will be taken from the FileMan data dictionary +"RTN","BMXADO2",22,0) + ;If ALIAS is defined, the schema string will use ALIAS as the column name +"RTN","BMXADO2",23,0) + ;READONLY, KEYFIELD and NULLOK are binary fields. Note that there should be only one field +"RTN","BMXADO2",24,0) + ;in the recordset having KEYFIELD=TRUE +"RTN","BMXADO2",25,0) + ; +"RTN","BMXADO2",26,0) + ;New column info format is @@@meta@@@KEYFIELD|FILE# +"RTN","BMXADO2",27,0) + ; For each field: ^1FILE#|2FIELD#|3DATATYPE|4LENGTH|5FIELDNAME|6READONLY|7KEYFIELD|8NULL ALLOWED +"RTN","BMXADO2",28,0) + ;example: +"RTN","BMXADO2",29,0) + ;BMXY(0)="@@@meta@@@BMXIEN|2160010^" +"RTN","BMXADO2",30,0) + ;BMXY(1)="2160010|.001|I|10|BMXIEN|TRUE|TRUE|FALSE^" +"RTN","BMXADO2",31,0) + ; +"RTN","BMXADO2",32,0) + S BMXY(0)="@@@meta@@@"_$G(BMXF(0)) +"RTN","BMXADO2",33,0) + N BMXI,BMXS,BMXFM,BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL +"RTN","BMXADO2",34,0) + S BMXI=0 +"RTN","BMXADO2",35,0) + F S BMXI=$O(BMXF(BMXI)) Q:'+BMXI D +"RTN","BMXADO2",36,0) + . N BMXFM,BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL +"RTN","BMXADO2",37,0) + . S (BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL)="" +"RTN","BMXADO2",38,0) + . S BMXFM=0 ;Flag indicating whether BMXF(BMXI) is a FileMan field +"RTN","BMXADO2",39,0) + . S BMXY(BMXI)="" +"RTN","BMXADO2",40,0) + . I BMXF(BMXI) S BMXY(BMXI)=$P(BMXF(BMXI),U,1,2) S BMXFM=1 +"RTN","BMXADO2",41,0) + . I BMXFM D ;Look in ^DD for attributes +"RTN","BMXADO2",42,0) + . . S BMXDD=$G(^DD($P(BMXF(BMXI),U),$P(BMXF(BMXI),U,2),0)) +"RTN","BMXADO2",43,0) + . . ;column name +"RTN","BMXADO2",44,0) + . . S BMXNAM=$P(BMXDD,U) +"RTN","BMXADO2",45,0) + . . S BMXNAM=$TR(BMXNAM," ","_") +"RTN","BMXADO2",46,0) + . . ;Data type +"RTN","BMXADO2",47,0) + . . I $P(BMXDD,U,2)["P" S BMXDD=$$PTYPE(BMXDD) +"RTN","BMXADO2",48,0) + . . S BMXTYP=$P(BMXDD,U,2) +"RTN","BMXADO2",49,0) + . . S BMXTYP=$S(BMXTYP["F":"T",BMXTYP["S":"T",BMXTYP["D":"D") +"RTN","BMXADO2",50,0) + . . I BMXTYP["N" S BMXTYP=$S($P(BMXTYP,",",2)>0:"N",1:"I") +"RTN","BMXADO2",51,0) + . . ;default columnn lengths based on type +"RTN","BMXADO2",52,0) + . . I BMXTYP="N"!(BMXTYP="I") S BMXLEN=$P(BMXDD,U,2),BMXLEN=$P(BMXLEN,","),BMXLEN=$E(BMXLEN,3,$L(BMXLEN)) +"RTN","BMXADO2",53,0) + . . I BMXTYP="I" S BMXLEN2=$P(BMXDD,U,2),BMXLEN2=$P(BMXLEN,",",2),BMXLEN=BMXLEN+BMXLEN2+1 +"RTN","BMXADO2",54,0) + . . I BMXTYP="T" S BMXLEN=0 +"RTN","BMXADO2",55,0) + . . I BMXTYP="D" S BMXLEN=30 +"RTN","BMXADO2",56,0) + . . S BMXNULL="TRUE" S:$P(BMXDD,U,2)["R" BMXNULL="FALSE" +"RTN","BMXADO2",57,0) + . ;Look in BMXF for user-specified attributes +"RTN","BMXADO2",58,0) + . S:$P(BMXF(BMXI),U,5)]"" BMXNAM=$P(BMXF(BMXI),U,5) ;Alias +"RTN","BMXADO2",59,0) + . ;Set KEY, NULL and READONLY +"RTN","BMXADO2",60,0) + . S BMXNULL="TRUE",BMXREAD="TRUE",BMXKEY="FALSE" +"RTN","BMXADO2",61,0) + . I $P(BMXF(BMXI),U,7)="TRUE" S BMXKEY="TRUE",BMXNULL="FALSE",BMXREAD="TRUE" +"RTN","BMXADO2",62,0) + . 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) +"RTN","BMXADO2",63,0) + . ;Set BMXY node +"RTN","BMXADO2",64,0) + . S $P(BMXY(BMXI),"|",3)=BMXTYP +"RTN","BMXADO2",65,0) + . S $P(BMXY(BMXI),"|",4)=BMXLEN +"RTN","BMXADO2",66,0) + . S $P(BMXY(BMXI),"|",5)=BMXNAM +"RTN","BMXADO2",67,0) + . S $P(BMXY(BMXI),"|",6)=BMXREAD +"RTN","BMXADO2",68,0) + . S $P(BMXY(BMXI),"|",7)=BMXKEY +"RTN","BMXADO2",69,0) + . S $P(BMXY(BMXI),"|",8)=BMXNULL +"RTN","BMXADO2",70,0) + ; +"RTN","BMXADO2",71,0) + Q +"RTN","BMXADO2",72,0) +PTYPE(BMXDD) ; +"RTN","BMXADO2",73,0) + ;Traverse pointer chain to retrieve data type of pointed-to field +"RTN","BMXADO2",74,0) + N BMXFILE +"RTN","BMXADO2",75,0) + I $P(BMXDD,U,2)'["P" Q BMXDD +"RTN","BMXADO2",76,0) + S BMXFILE=$P(BMXDD,U,2) +"RTN","BMXADO2",77,0) + S BMXFILE=+$P(BMXFILE,"P",2) +"RTN","BMXADO2",78,0) + S BMXDD=$G(^DD(BMXFILE,".01",0)) +"RTN","BMXADO2",79,0) + S BMXDD=$$PTYPE(BMXDD) +"RTN","BMXADO2",80,0) + Q BMXDD +"RTN","BMXADOF") +0^63^B90964967 +"RTN","BMXADOF",1,0) +BMXADOF ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; +"RTN","BMXADOF",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOF",3,0) + ; THIS IS THE ADO RECORDSET FILER: ADO -> FILEMAN +"RTN","BMXADOF",4,0) + ; VISIT FILE UPDATES REPRESENT A SPECIAL CASE HTAT IS MANAGED IN BMXADOF1 +"RTN","BMXADOF",5,0) + ; INCLUDES TRANSACTION CONTROLS +"RTN","BMXADOF",6,0) + ; +"RTN","BMXADOF",7,0) + ; +"RTN","BMXADOF",8,0) + ; +"RTN","BMXADOF",9,0) + N DAS,FILE,DATA,OUT S DAS=7,FILE=19707.82,DATA="2.02|120/83" D FILE(.OUT,FILE,DAS,DATA) W !,OUT Q +"RTN","BMXADOF",10,0) + ; +"RTN","BMXADOF",11,0) +FILED(OUT,FILE,DAS,DATA) ; RPC CALL: UNIVERSAL FILEMAN RECORD UPDATER UTILITY +"RTN","BMXADOF",12,0) + D DEBUG^%Serenji("FILE^BMXADOF(.OUT,FILE,DAS,DATA)") ; DEBUGGER ENTRY POINT +"RTN","BMXADOF",13,0) + ; K ^GREG S ^GREG("OUT")=$G(OUT),^("FILE")=$G(FILE),^("DAS")=$G(DAS),^("DATA")=$G(DATA) D FILE(.OUT,FILE,DAS,DATA) +"RTN","BMXADOF",14,0) + Q +"RTN","BMXADOF",15,0) + ; +"RTN","BMXADOF",16,0) +FILEX(OUT,FILE,DAS,DATA) ; EP - RPC CALL: INSURES THAT BMXIEN IS VALID - MOJO ONLY +"RTN","BMXADOF",17,0) + I '$L($G(DATA)) D +"RTN","BMXADOF",18,0) + . S DATA="",%="" +"RTN","BMXADOF",19,0) + . F S %=$O(DATA(%)) Q:'% S DATA=DATA_DATA(%) ; CONVERT DATA ARRAY INTO A DATA STRING +"RTN","BMXADOF",20,0) + . Q +"RTN","BMXADOF",21,0) + I '$L(DATA) Q +"RTN","BMXADOF",22,0) + I DATA["999|" S DAS=+$P(DATA,"999|",2) I 'DAS S DAS="" ; FORCE NEW ENTRY +"RTN","BMXADOF",23,0) + D FILE(.OUT,FILE,$G(DAS),DATA) +"RTN","BMXADOF",24,0) + Q +"RTN","BMXADOF",25,0) + ; +"RTN","BMXADOF",26,0) +FILE(OUT,FILE,DAS,DATA) ;EP - RPC CALL: UNIVERSAL FILEMAN RECORD UPDATER UTILITY +"RTN","BMXADOF",27,0) + ; +"RTN","BMXADOF",28,0) + ; OUT = OUTBOUND MESSAGE RETURNED TO CALLINING APP. 'OK'=SUCCESSFUL TRANSACTION, 'OK|5' NEW RECORD DAS=5 ADDED +"RTN","BMXADOF",29,0) + ; IF TRANSACTION FAILS, AN ERROR MESSAGE IS PASSED +"RTN","BMXADOF",30,0) + ; FILE = VALID FILEMAN FILE OR SUB-FILE NUMBER - WHERE UPDATE IS TO OCCUR +"RTN","BMXADOF",31,0) + ; DAS = THE DA STRING - TYPICALLY THE FILE INTERNAL ENTRY NUMBER OF THE RECORD TO BE UPDATED +"RTN","BMXADOF",32,0) + ; IF THIS IS A SUB-FILE, DAS MUST BE PRECEDED BY PARENT DAS(S) IN COMMA SEPARATED STRING - TOP TO BOTTOM ORDER +"RTN","BMXADOF",33,0) + ; DAS MAY BE PRECEDED BY '+' = ALL FIELDS ARE MANDATORY (REQD FOR TRANSACTION) OR '-' = DELETE THIS ENTRY +"RTN","BMXADOF",34,0) + ; IF DAS STRING = NULL OR = '+', THIS MEANS ADD A NEW RECORD WITH DATA SUPPLIED IN DATA PARAMETER +"RTN","BMXADOF",35,0) + ; EXAMPLES OF DAS STRINGS: '1' (EDIT RECORD #1), '5,2,-7' (DELETE RECORD #7 IN 3RD LEVEL SUBFILE) +"RTN","BMXADOF",36,0) + ; DATA = DATA STRING OR ARRAY REFERENCE. DATA CAN BE PASSED USING THE .PARAM SYNTAX +"RTN","BMXADOF",37,0) + ; DATA STRING FORMAT: FIELD#|VALUE_$C(30)_FIELD#|VALUE_$C(30)_...FIELD#|VALUE_$C(30) +"RTN","BMXADOF",38,0) + ; $C(30) [AKA EOR] IS THE DATA ELEMENT SEPARATOR +"RTN","BMXADOF",39,0) + ; $C(30) IS USED AS THE DATA DELIMITER BECAUSE OTHER CHARACTERS LIKE '^' COULD APPEAR IN THE VALUE PIECE! +"RTN","BMXADOF",40,0) + ; EA FIELD# MAY BE PRECEED BY '+' = MANDATORY (REQD FOR TRANSACTION) OR '-' = DELETE THE VALUE OF THIS FIELD +"RTN","BMXADOF",41,0) + ; EXAMPLE: ".03|1/5/46"_EOR_"-.02|"_EOR_"+.09|139394444"_EOR NOTE -.02| IS SAME AS .02|@ OR .02| +"RTN","BMXADOF",42,0) + ; '+' IN FRONT OF THE DAS IS THE SAME AS PUTTING A '+' IN FRONT OF EVERY FIELD# IN THE DATA STRING +"RTN","BMXADOF",43,0) + ; +"RTN","BMXADOF",44,0) + ; +"RTN","BMXADOF",45,0) + ; +"RTN","BMXADOF",46,0) + N VENDUZ,VUZ +"RTN","BMXADOF",47,0) + M VENDUZ=DUZ S VUZ=$C(68,85,90) +"RTN","BMXADOF",48,0) + N OREF,CREF,DIC,DIE,DA,DR,X,Y,%,I,FLD,CNT,FNO,VAL,@VUZ,TFLG,DFLG,TOT,UFLG,XTFLG,GTFLG,GDFLG,LVLS,IENS +"RTN","BMXADOF",49,0) + I $G(FILE)=9000010 N AUPNPAT,AUPNDOB,AUPNDOD,AUPNVSIT,AUPNTALK,APCDOVRR S (APCDOVRR,AUPNTALK)=1 ; THE VISIT FILE IS UPDATED IN THIS TRANSACTION +"RTN","BMXADOF",50,0) + X ("M "_$C(68,85,90)_"=VENDUZ S "_$C(68,85,90)_"(0)="_$C(34,64,34)) K VENDUZ ; ELININATES PERMISSION PROBLEMS +"RTN","BMXADOF",51,0) + S OUT="",FLD="",GTFLG=0,GDFLG=0 +"RTN","BMXADOF",52,0) + S X="MERR^BMXADOF",@^%ZOSF("TRAP") ; SET MUMPS ERROR TRAP +"RTN","BMXADOF",53,0) + I '$D(^DD(+$G(FILE))) S OUT="Invalid file number" Q ; FILE # MUST BE VALID +"RTN","BMXADOF",54,0) + S DAS=$G(DAS) I $E(DAS)="," S DAS=$E(DAS,2,99) ; ACCURATE IF NON SUB-FILE DAS STRING DOSN'T CONTAIN A "," +"RTN","BMXADOF",55,0) + S LVLS=$L(DAS,",") +"RTN","BMXADOF",56,0) + S %=FILE F CNT=1:1 S %=$G(^DD(%,0,"UP")) I '% Q ; COUNT FILE/SUB-FILE LEVELS IN THE DATA DICTIONARY +"RTN","BMXADOF",57,0) + I LVLS'=CNT S OUT="Invalid DAS string" Q ; LEVELS IN DAS STRING MUST MATCH LEVELS IN THE DATA DICTIONARY +"RTN","BMXADOF",58,0) + I $E(DAS)="-" S DAS=$E(DAS,2,99),GDFLG=1 ; GLOBAL DELETE FLAG +"RTN","BMXADOF",59,0) + I $E(DAS)="+" S DAS=$E(DAS,2,99),GTFLG=1 ; GLOBAL TRANSACTION FLAG, ROLLBACK IF ANY FIELD FAILS TO UPDATE +"RTN","BMXADOF",60,0) + I LVLS>1 F I=1:1:LVLS D I DAS="ERR" S OUT="Invalid DAS string" Q ; MAKE DAS ARRAY. MIRRORS THE DA() ARRAY +"RTN","BMXADOF",61,0) + . I I=LVLS S DAS=$P(DAS,",",I) Q ; SET DAS OF SUBFILE +"RTN","BMXADOF",62,0) + . S %=$P(DAS,",",I) I '% S DAS="ERR" Q +"RTN","BMXADOF",63,0) + . S DAS(LVLS-I)=% ; SET DAS(S) OF PARENT FILE(S). LIKE DA(), THE LARGER THE DAS SUBSCRIPT, THE HIGHER THE LEVEL +"RTN","BMXADOF",64,0) + . Q +"RTN","BMXADOF",65,0) + I DAS="ERR" S OUT="Update cancelled. Invalid DAS string" Q +"RTN","BMXADOF",66,0) + I DAS="Add"!(DAS="ADD") S DAS="" +"RTN","BMXADOF",67,0) + S %=$E(DAS) I %="-" S GDFLG=1,DAS=$E(DAS,2,99) ; YET ANOTHER WAY TO SET GLOBAL DELETE FLAG +"RTN","BMXADOF",68,0) + S %=$$REF(FILE,.DAS) ; GET OPEN REF, CLOSED REF, AND IENS STRING +"RTN","BMXADOF",69,0) + S OREF=$P(%,"|"),CREF=$P(%,"|",2),IENS=$P(%,"|",3) I $L(OREF),$L(CREF) +"RTN","BMXADOF",70,0) + E S OUT="Update cancelled. Invalid file definition/global reference" Q ; ERROR REPORT +"RTN","BMXADOF",71,0) + I DAS,'$D(@CREF@(DAS)) S OUT="Update cancelled. Invalid DAS" Q ; IF THERE IS AN DAS, IT MUST BE VALID +"RTN","BMXADOF",72,0) + I '$G(DAS),FILE=9000010,'$$VVAR^BMXADOF2(DATA) Q ; VISIT FILE ADD REQUIRES THAT SPECIAL VARIABLES BE PRESENT AND VALID +"RTN","BMXADOF",73,0) + I 'GDFLG,DAS,DATA[".01|@" S GDFLG=1 ; ALTERNATE WAY TO SET GLOBAL DELETE FLAG: REMOVE .01 FIELD +"RTN","BMXADOF",74,0) + I GDFLG,'DAS S OUT="Deletion cancelled. Missing DAS" Q ; CAN'T DO DELETE WITHOUT AN DAS +"RTN","BMXADOF",75,0) + I GDFLG D DIK(OREF,DAS) S OUT="Record deleted|"_DAS Q ; DELETE AND QUIT +"RTN","BMXADOF",76,0) + S UFLG=$S($G(DAS):"E",1:"A") ; SET UPDATE FLAG: ADD OR EDIT +"RTN","BMXADOF",77,0) + I '$L($G(DATA)) D I '$L($G(DATA)) S OUT="Update cancelled. Missing/invalid data string" Q ; COMPRESS DATA ARRAY INTO A SINGLE STRING +"RTN","BMXADOF",78,0) + . S DATA="",%="" +"RTN","BMXADOF",79,0) + . F S %=$O(DATA(%)) Q:'% S DATA=DATA_DATA(%) ; CONVERT DATA ARRAY INTO A DATA STRING +"RTN","BMXADOF",80,0) + . Q +"RTN","BMXADOF",81,0) + S %=$L(DATA) S %=$E(DATA,%-1,%) D ; CHECK FOR PROPER TERMINATION OF DATA STRING +"RTN","BMXADOF",82,0) + . I %=$C(30,31) Q ; PROPER TERMINATION +"RTN","BMXADOF",83,0) + . I $E(%,2)=$C(30) S DATA=DATA_$C(31) Q +"RTN","BMXADOF",84,0) + . I $E(%,2)=$C(31) S DATA=$E(DATA,1,$L(DATA-1))_$C(30,31) +"RTN","BMXADOF",85,0) + . S DATA=DATA_$C(30,31) +"RTN","BMXADOF",86,0) + . Q +"RTN","BMXADOF",87,0) + S TOT=$L(DATA,$C(30)) I 'TOT S OUT="Update cancelled. Missing data string" Q +"RTN","BMXADOF",88,0) +SPEC S DATA=$$SPEC^BMXADOFS(FILE,DATA,UFLG) ; BASED ON FILE IEN, SPECIAL MODS MAY BE MADE TO THE DATA STRING +"RTN","BMXADOF",89,0) + S TOT=$L(DATA,$C(30)) I 'TOT S OUT="Update cancelled. SPEC analysis failed." Q +"RTN","BMXADOF",90,0) + F CNT=1:1:TOT S %=$P(DATA,$C(30),CNT) I $L(%) S DATA(CNT)=% ; BUILD PRIMARY FIELD ARRAY +"RTN","BMXADOF",91,0) + S %=$G(DATA(1)) I %=""!(%=$C(31)) S OUT="Update cancelled. Missing data string" Q +"RTN","BMXADOF",92,0) + S %=DATA(CNT) I %[$C(31) S %=$P(%,$C(31),1),DATA(CNT)=% ; STRIP OFF END OF FILE MARKER +"RTN","BMXADOF",93,0) + F CNT=1:1:TOT S X=$G(DATA(CNT)) I $L(X) D ; BUILD SECONDARY FIELD ARRAY +"RTN","BMXADOF",94,0) + . S TFLG=0,DFLG=0 +"RTN","BMXADOF",95,0) + . I $E(X)="+" S TFLG=1,X=$E(X,2,999),$P(FLD,U)=1 +"RTN","BMXADOF",96,0) + . I $E(X)="-" S DFLG=1,X=$E(X,2,999) +"RTN","BMXADOF",97,0) + . S FNO=$P(X,"|"),VAL=$P(X,"|",2) +"RTN","BMXADOF",98,0) + . I '$D(^DD(FILE,+$G(FNO),0)) S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid field number" Q +"RTN","BMXADOF",99,0) + . I DFLG,VAL'="" S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid deletion syntax" Q ; CANT DELETE IF A VALUE IS SENT +"RTN","BMXADOF",100,0) + . I VAL="@" S DFLG=1 ; SYNC DFLG AND VAL +"RTN","BMXADOF",101,0) + . S FLD(FNO)=VAL_U_TFLG_U_DFLG +"RTN","BMXADOF",102,0) + . I FNO=.01,TFLG S $P(FLD,U,2)=1 +"RTN","BMXADOF",103,0) + . Q +"RTN","BMXADOF",104,0) + I $P($G(FLD(.01)),U,3),UFLG="A" S OUT="Record deletion cancelled. Missing DAS" Q ; CAN'T DELETE A RECORD WITHOUT A VALID DAS +"RTN","BMXADOF",105,0) + I $P($G(FLD(.01)),U,3)!($G(GDFLG)) S UFLG="D" ; DELETION +"RTN","BMXADOF",106,0) +DELREC I UFLG="D" D DIK(OREF,DAS) S OUT="OK" Q ; DELETE THE RECORD +"RTN","BMXADOF",107,0) + I UFLG="A",'$L($P($G(FLD(.01)),U)) S OUT="Record addition cancelled. Missing .01 field" Q ; CAN'T ADD A RECORD WITHOUT A VALID .01 FIELD +"RTN","BMXADOF",108,0) +DINUM I UFLG="A",$G(^DD(FILE,.01,0))["DINUM=X" D ; IF DINUM'D RECORD EXISTS, SWITCH TO MOD MODE +"RTN","BMXADOF",109,0) + . S %=FLD(.01) +"RTN","BMXADOF",110,0) + . I $E(%)="`" S %=+$E(%,2,99) +"RTN","BMXADOF",111,0) + . I '$D(@CREF@(%,0)) Q ; OK TO ADD BRAND NEW RECORD BUT EXISTING RECORDS MUST BE EDITED +"RTN","BMXADOF",112,0) + . K FLD(.01) +"RTN","BMXADOF",113,0) + . S DAS=%,UFLG="E" +"RTN","BMXADOF",114,0) + . Q +"RTN","BMXADOF",115,0) +ADDREC I UFLG="A" D ADD(OREF) Q ; ADD A NEW ENTRY TO A FILE +"RTN","BMXADOF",116,0) +EDITREC I UFLG="E" D EDIT(OREF,DAS) Q ; EDIT AN EXISTING RECORD +"RTN","BMXADOF",117,0) + Q +"RTN","BMXADOF",118,0) + ; +"RTN","BMXADOF",119,0) +DIK(DIK,DA) ; DELETE A RECORD +"RTN","BMXADOF",120,0) + ; PATCHED BY GIS 9/28/04 TO FIX PROBLEMS WITH SUBFILE DELETION +"RTN","BMXADOF",121,0) + I '$G(DAS(1)) G DIK1 ; CHECK FOR SUBFILE DELETION +"RTN","BMXADOF",122,0) + N DA,IENS,I,DIK +"RTN","BMXADOF",123,0) + I '$G(FILE) Q +"RTN","BMXADOF",124,0) + S I=0,IENS=DAS_"," +"RTN","BMXADOF",125,0) + M DA=DAS +"RTN","BMXADOF",126,0) + F S I=$O(DAS(I)) Q:'I S IENS=IENS_DAS(I)_"," +"RTN","BMXADOF",127,0) + S DIK=$$ROOT^DILFD(FILE,IENS) I '$L(DIK) Q +"RTN","BMXADOF",128,0) +DIK1 D ^DIK +"RTN","BMXADOF",129,0) + D ^XBFMK +"RTN","BMXADOF",130,0) + Q +"RTN","BMXADOF",131,0) + ; +"RTN","BMXADOF",132,0) +ADD(DIC) ; ADD A NEW ENTRY TO A FILE +"RTN","BMXADOF",133,0) + N X,Y,%,DA,DN,UP,SB,DNODE,ERR +"RTN","BMXADOF",134,0) + S X=$P($G(FLD(.01)),U) I '$L(X) S OUT="Unable to add a new record" Q +"RTN","BMXADOF",135,0) + S X=$$POINT(FILE,.01,X) ; ADD ACCENT GRAV IF NECESSARY +"RTN","BMXADOF",136,0) + S X=""""_X_"""" ; FORCE A NEW ENTRY +"RTN","BMXADOF",137,0) + S DIC(0)="L" +"RTN","BMXADOF",138,0) + I $O(DAS(0)) D I $G(ERR) S Y=-1 G AFAIL ; GET DIC("P") IF NECESSARY +"RTN","BMXADOF",139,0) + . S %=0 F S %=$O(DAS(%)) Q:'% S DA(%)=DAS(%) ; CREATE THE DA ARRAY +"RTN","BMXADOF",140,0) + . S UP=$G(^DD(FILE,0,"UP")) I 'UP S ERR=1 Q +"RTN","BMXADOF",141,0) + . S SB=$O(^DD(UP,"SB",FILE,0)) I 'SB S ERR=1 Q +"RTN","BMXADOF",142,0) + . S DIC("P")=$P($G(^DD(UP,SB,0)),U,2) I '$L(DIC("P")) S ERR=1 Q +"RTN","BMXADOF",143,0) + . S DN=DIC_"1,0)" I $D(DN) Q +"RTN","BMXADOF",144,0) + . S @DN=(U_DIC("P")_U_U) ; CREATE THE DICTIONARY NODE +"RTN","BMXADOF",145,0) + . Q +"RTN","BMXADOF",146,0) +ADIC D ^DIC +"RTN","BMXADOF",147,0) +AFAIL I Y=-1 S OUT="Unable to add a new record" G AX +"RTN","BMXADOF",148,0) + I $O(FLD(0)) D EDIT(DIC,+Y) Q +"RTN","BMXADOF",149,0) + S OUT="OK"_"|"_+Y +"RTN","BMXADOF",150,0) +AX D ^XBFMK +"RTN","BMXADOF",151,0) + Q +"RTN","BMXADOF",152,0) + ; +"RTN","BMXADOF",153,0) +EDIT(DIE,DA) ; EDIT AN EXISTING RECORD +"RTN","BMXADOF",154,0) + N DR,RFLG,ERR,FNO,VAL,TFLG,RESULT,MSG,DIERR,DISYS,SF,APCDALVR +"RTN","BMXADOF",155,0) + S FNO=0,DR="",APCDALVR="" +"RTN","BMXADOF",156,0) + I UFLG="A" S OUT="OK New record added|"_DA +"RTN","BMXADOF",157,0) + F S FNO=$O(FLD(FNO)) Q:'FNO S X=FLD(FNO) I $L(X) D I $G(RFLG) Q ; CHECK EA FIELD AND BUILD THE DR STRING AND ERROR STRING +"RTN","BMXADOF",158,0) + . S VAL(FNO)=$P(X,U),TFLG=$P(X,U,2) I '$L(VAL(FNO)) Q +"RTN","BMXADOF",159,0) + . S SF=$$WP(FILE,FNO) +"RTN","BMXADOF",160,0) + . I SF D WORD(FILE,DA,FNO,CREF,VAL(FNO)) Q ; WORD PROCESSING FIELDS MANAGED SEPARATELY +"RTN","BMXADOF",161,0) + . S VAL(FNO)=$$POINT(FILE,FNO,VAL(FNO)) ; ADD ACCENT GRAV IF NECESSARY +"RTN","BMXADOF",162,0) + . K ERR,RESULT +"RTN","BMXADOF",163,0) + . I VAL(FNO)="@"!(VAL(FNO)="") S RESULT="@" +"RTN","BMXADOF",164,0) + . I FNO=.01,UFLG="A" S:$E(VAL(.01))="`" VAL(.01)=$E(VAL(.01),2,999) Q ; NO NEED TO EDIT THE .01 FIELD OF A RECORD THAT HAS JUST BEEN CREATED +"RTN","BMXADOF",165,0) + . I FILE\1=9000010,$L($P(FILE,".",2))=2,UFLG="E",(FNO=.02!(FNO=.03)) Q ; CAN'T EDIT EXISTING PT AND VISIT FIELDS OF V FILES +"RTN","BMXADOF",166,0) + . I FILE\1=9000010,$L($P(FILE,".",2))=2,UFLG="A",FNO=.03,VAL(.03)?1"`"1.N S %=+$E(VAL(.03),2,99) I $D(^AUPNVSIT(%,0)) S RESULT=% G E1 +"RTN","BMXADOF",167,0) + . I FILE=9000011,FNO=.07,VAL(.07)?1.N S RESULT=VAL(.07) G E1 ; THE VALIDITY CHECK FAILS - SO BYPASS THIS +"RTN","BMXADOF",168,0) +CHK . I VAL(FNO)'="@" D CHK^DIE(FILE,FNO,"",VAL(FNO),.RESULT,.ERR) +"RTN","BMXADOF",169,0) +E1 . I RESULT=U D Q +"RTN","BMXADOF",170,0) + .. S MSG=$G(ERR("DIERR",1,"TEXT",1),"Failed FileMan data validation") +"RTN","BMXADOF",171,0) + .. I $L(OUT) S OUT=OUT_"~" +"RTN","BMXADOF",172,0) + .. I TFLG!GTFLG S RFLG=1,OUT=FNO_"|"_MSG Q +"RTN","BMXADOF",173,0) + .. S OUT=OUT_FNO_"|"_MSG +"RTN","BMXADOF",174,0) + .. Q +"RTN","BMXADOF",175,0) + . S VAL(FNO)=RESULT +"RTN","BMXADOF",176,0) + . I $L(DR) S DR=DR_";" +"RTN","BMXADOF",177,0) + . I RESULT="@" S DR=DR_FNO_"////@" Q ; DELETE THIS VALUE +"RTN","BMXADOF",178,0) + . S DR=DR_FNO_"////^S X=VAL("_FNO_")" ; BUILD DR STRING +"RTN","BMXADOF",179,0) + . Q +"RTN","BMXADOF",180,0) + I $G(RFLG) D:UFLG="A" DIK(DIE,DA) S OUT="Record update cancelled"_"|"_OUT G EX ; TRANSACTION ROLLBACK FLAG IS SET, ENTRY DELETED (ADD MODE) OR UPDATE CANCELLED (EDIT MODE) +"RTN","BMXADOF",181,0) + S %=0 F S %=$O(DAS(%)) Q:'% S DA(%)=DAS(%) ; JUST IN CASE THIS IS A MILTIPLE, CREATE THE DA ARRAY +"RTN","BMXADOF",182,0) +DIE L +@CREF@(DA):2 I $T D ^DIE L -@CREF@(DA) G:OUT["valid" EX S OUT="OK" S:UFLG="A" OUT=OUT_"|"_DA G EX ; SUCCESS!!!! +"RTN","BMXADOF",183,0) + S OUT="Update cancelled. File locked" ; FILE LOCKED. UNABLE TO UPDATE +"RTN","BMXADOF",184,0) + I $L(FLD),UFLG="A" D DIK(DIE,DA) ; ROLLBACK THE NEW RECORD +"RTN","BMXADOF",185,0) +EX D ^XBFMK ; CLEANUP +"RTN","BMXADOF",186,0) + Q +"RTN","BMXADOF",187,0) + ; +"RTN","BMXADOF",188,0) +REF(FILE,DAS) ; GIVEN A FILE/SUBFILE NUMBER & DAS ARRAY, RETURN THE FM GLOBAL REFERENCE INFO: OREF|CREF|IENS +"RTN","BMXADOF",189,0) + N OREF,CREF,IENS,I,X +"RTN","BMXADOF",190,0) + S IENS=$$IENS^DILF(.DAS) I '$L(IENS) Q "" +"RTN","BMXADOF",191,0) + S OREF=$$ROOT^DILFD(FILE,IENS) I '$L(OREF) Q "" +"RTN","BMXADOF",192,0) + S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" +"RTN","BMXADOF",193,0) + Q (OREF_"|"_CREF_"|"_IENS) +"RTN","BMXADOF",194,0) + ; +"RTN","BMXADOF",195,0) +POINT(FILE,FNO,VAL) ; ADD ACCENT GRAV IF NECESSARY +"RTN","BMXADOF",196,0) + I $E(VAL)="`" Q VAL +"RTN","BMXADOF",197,0) + I $P($G(^DD(FILE,FNO,0)),U,2)["P",VAL=+VAL,VAL\1=VAL S VAL="`"_VAL +"RTN","BMXADOF",198,0) + Q VAL +"RTN","BMXADOF",199,0) + ; +"RTN","BMXADOF",200,0) +WP(FILE,FLD) ; RETURN THE SUBFILE NUMBER IF IT IS A WORD PROCESSING FIELD +"RTN","BMXADOF",201,0) + N SF,DTYPE +"RTN","BMXADOF",202,0) + S SF=$P($G(^DD(+$G(FILE),+$G(FLD),0)),U,2) I 'SF Q 0 +"RTN","BMXADOF",203,0) + S DTYPE=$P($G(^DD(SF,.01,0)),U,2) +"RTN","BMXADOF",204,0) + I DTYPE["W" Q SF +"RTN","BMXADOF",205,0) + Q 0 +"RTN","BMXADOF",206,0) + ; +"RTN","BMXADOF",207,0) +WORD(FILE,DA,FLD,CREF,VAL) ; SUFF TEXT ENTRY INTO THE WP MULTIPLE FIELD +"RTN","BMXADOF",208,0) + N SS,TOT,A,B,I +"RTN","BMXADOF",209,0) + S SS=+$P($G(^DD(FILE,FLD,0)),U,4) I SS="" Q +"RTN","BMXADOF",210,0) + I VAL="@"!(VAL="") K @CREF@(DA,SS) Q ; DELETE THE WP RECORD: REMOVE DICTIONARY NODE AND DATA +"RTN","BMXADOF",211,0) + S TOT=0 +"RTN","BMXADOF",212,0) + F Q:'$L(VAL) D +"RTN","BMXADOF",213,0) + . S A=$E(VAL,1,80),VAL=$E(VAL,81,999999) ; PEEL OFF AN 80 CHARACTER DATA BLOCK FROM THE FRONT OF THE TEXT STRING +"RTN","BMXADOF",214,0) + . I $L(A) S TOT=TOT+1,B(TOT)=A ; BUILD THE TEMP ARRAY +"RTN","BMXADOF",215,0) + . Q +"RTN","BMXADOF",216,0) + I '$D(B(1)) Q ; NOTHING TO STORE SO QUIT +"RTN","BMXADOF",217,0) + S @CREF@(DA,SS,0)="^^"_TOT_U_TOT_U_DT ; SET DICTIONARY NODE +"RTN","BMXADOF",218,0) + F I=1:1:TOT S @CREF@(DA,SS,I,0)=B(I) ; SET DATA NODES +"RTN","BMXADOF",219,0) + Q +"RTN","BMXADOF",220,0) + ; +"RTN","BMXADOF",221,0) +MERR ; MUMPS ERROR TRAP +"RTN","BMXADOF",222,0) + N ERR,X +"RTN","BMXADOF",223,0) + X ("S X=$"_"ZE") +"RTN","BMXADOF",224,0) + S ERR="M ERROR: "_X +"RTN","BMXADOF",225,0) + S ^GREG("ERR")=ERR +"RTN","BMXADOF",226,0) + S OUT=ERR +"RTN","BMXADOF",227,0) + Q +"RTN","BMXADOF",228,0) + ; +"RTN","BMXADOF1") +0^64^B12833341 +"RTN","BMXADOF1",1,0) +BMXADOF1 ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; +"RTN","BMXADOF1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOF1",3,0) + ; UPDATE FILEMAN WITH AN ADO RECORD SET FROM A WINDOWS/WEB APPLICATION +"RTN","BMXADOF1",4,0) + ; +"RTN","BMXADOF1",5,0) + ; +"RTN","BMXADOF1",6,0) + D BAFM(.OUT,$NA(^TMP("BMX ADO",6))) ; W !!! ZW OUT K OUT Q +"RTN","BMXADOF1",7,0) + ; +"RTN","BMXADOF1",8,0) +BAFM(OUT,CREF) ; EP- RPC: PASS DATA FROM A STD BROKER ADO ARRAY TO FILEMAN AND RETURN THE ACK MSG IN 'OUT' ARRAY +"RTN","BMXADOF1",9,0) + I '$L($G(CREF)) Q ; REFERENCE MUST EXIST +"RTN","BMXADOF1",10,0) + I '$D(@CREF) Q ; DATASET MUST EXIST +"RTN","BMXADOF1",11,0) + N NODE,STG,DATA,SCHEMA,X,ECNT,CNT +"RTN","BMXADOF1",12,0) + S OUT="DONE",ECNT=0,CNT=0 +"RTN","BMXADOF1",13,0) +PEEL S NODE=0,STG="" ; PEEL DATA OFF THE ARRAY AND FILE IT +"RTN","BMXADOF1",14,0) + F S NODE=$O(@CREF@(NODE)) Q:'NODE D ; LOOP THRU THE NODES TO BUILD A STRING. +"RTN","BMXADOF1",15,0) + . S X=@CREF@(NODE) I X="" Q +"RTN","BMXADOF1",16,0) + . S STG=STG_X +"RTN","BMXADOF1",17,0) + . I STG[$C(30) D S STG="" Q ; WHEN YOU HIT $C(30), PROCESS THE CURRENT STRING, AND THEN START A NEW STRING. +"RTN","BMXADOF1",18,0) + .. S STG=$TR(STG,$C(30),"") ; REMOVE THE EOR CHARACTER $C(30) FROM THE END OF THE STRING +"RTN","BMXADOF1",19,0) + .. I STG["@@@meta@@@" S SCHEMA=STG Q ; GET SCHEMA STRING. THEN KEEP LOOPING TO GET THE DATA STRINGS +"RTN","BMXADOF1",20,0) + .. D PREP(.OUT,SCHEMA,STG) ; PREP DATA STRING FOR FILING, AND THEN FILE THE DATA +"RTN","BMXADOF1",21,0) + .. Q +"RTN","BMXADOF1",22,0) + . Q +"RTN","BMXADOF1",23,0) + K @CREF ; CLEAN UP +"RTN","BMXADOF1",24,0) + I ECNT=0 S OUT(0)="OK" Q ; SUMMARY NODE OF THE OUTPUT ARRAY +"RTN","BMXADOF1",25,0) + S OUT(0)=ECNT_" error(s) detected in this transaction" +"RTN","BMXADOF1",26,0) + Q +"RTN","BMXADOF1",27,0) + ; +"RTN","BMXADOF1",28,0) +PREP(OUT,SCHEMA,DATA) ; PREPARE DATA FOR THE ADO FILER +"RTN","BMXADOF1",29,0) + N TOP,LEV,C,B,%,DA,DAS,PCE,MAX,S,D,FILE,DSTG,MAND,FLD,VAL,MSG +"RTN","BMXADOF1",30,0) + S C=",",B="|",DAS="" +"RTN","BMXADOF1",31,0) + S %=$P(SCHEMA,U,2) S TOP=$P(%,B,2) +"RTN","BMXADOF1",32,0) + S LEV=$L(TOP)-3 I LEV=2 S DAS=+DATA_C +"RTN","BMXADOF1",33,0) + S SCHEMA=$P(SCHEMA,U,2,999) +"RTN","BMXADOF1",34,0) + S MAX=$L(SCHEMA,U) +"RTN","BMXADOF1",35,0) + S FILE=+SCHEMA I '$D(^DD(FILE,0)) S ERR="Update failed. Missing/invalid file number" D ERR(ERR) Q +"RTN","BMXADOF1",36,0) +SPEC ; CHECK FOR SPECIAL CASES +"RTN","BMXADOF1",37,0) + I FILE=9000011,SCHEMA'["|.05|" G DSTG +"RTN","BMXADOF1",38,0) + I FILE=9000010.07,SCHEMA'["|.04|" G DSTG +"RTN","BMXADOF1",39,0) + I FILE=9000010.18,SCHEMA'["|.04|" G DSTG +"RTN","BMXADOF1",40,0) + I FILE=9000013,SCHEMA'["|.04|" G DSTG +"RTN","BMXADOF1",41,0) + I FILE=9000014,SCHEMA'["|.04|" G DSTG +"RTN","BMXADOF1",42,0) + I FILE'=9000010.07,FILE'=9000011,FILE'=9000013,FILE'=9000014,FILE'=9000010.18 +"RTN","BMXADOF1",43,0) + E I '$$NARR^BMXADOF2 Q ; GET IEN OF PROVIDER NARRATIVE AND SUBSTITUE THIS VALUE IN THE DATA STG +"RTN","BMXADOF1",44,0) +DSTG ; BUILD THE ADD/UPDATE STRING FOR THE EBCU FILER +"RTN","BMXADOF1",45,0) + S DA=+DATA,DAS=DAS_DA,DSTG="" +"RTN","BMXADOF1",46,0) + F PCE=2:1:MAX D +"RTN","BMXADOF1",47,0) + . S S=$P(SCHEMA,U,PCE),VAL=$P(DATA,U,PCE) +"RTN","BMXADOF1",48,0) + . I $P(S,B,6)="TRUE" Q ; READ ONLY +"RTN","BMXADOF1",49,0) + . S FLD=$P(S,B,2) I 'FLD Q ; INVALID SCHEMA PIECE +"RTN","BMXADOF1",50,0) + . I $E(FLD,1,3)=".00" Q ; IEN NOT DATA +"RTN","BMXADOF1",51,0) + . I FLD["ID" Q ; DON'T FILE THE IDENTIFIERS +"RTN","BMXADOF1",52,0) + . I SCHEMA[(B_FLD_"IEN"),FLD'["IEN",$L(VAL) Q ; WAIT FOR THE LOOKUP VALUE, BYPASS CURRENT FIELD +"RTN","BMXADOF1",53,0) + . S FLD=+FLD +"RTN","BMXADOF1",54,0) + . I $P(S,B,8)'="TRUE" S FLD="+"_FLD ; MANDATORY FIELD +"RTN","BMXADOF1",55,0) + . E I VAL="" S FLD="-"_FLD ; DELETE THE VALUE +"RTN","BMXADOF1",56,0) + . I FLD?.1E1".01" D Q ; MAKE SURE THAT THE .01 FIELD IS FIRST! +"RTN","BMXADOF1",57,0) + .. I $L(DSTG) S DSTG=FLD_B_VAL_$C(30)_DSTG Q ; APPEND .01 FIELD TO THE FRONT OF AN EXISTING UPDATE STRING +"RTN","BMXADOF1",58,0) + .. S DSTG=FLD_B_VAL ; START A NEW UPDATE STRING WITH THE .01 FIELD +"RTN","BMXADOF1",59,0) + .. Q +"RTN","BMXADOF1",60,0) + . I $L(DSTG) S DSTG=DSTG_$C(30) ; $C(30) IS THE "COLUMN" DELIMITER FOR DATA TO BE ENETERED IN THE TABLE +"RTN","BMXADOF1",61,0) + . S DSTG=DSTG_FLD_B_VAL ; "|" IS THE DATA ELEMENT DELIMITER, SEPARATING FIELD NAME AND FIELD VALUE +"RTN","BMXADOF1",62,0) + . Q +"RTN","BMXADOF1",63,0) +FILE D FILE^BMXADOF(.MSG,FILE,DAS,DSTG) ; THE DATA STRING IS PREPARED. NOW SEND IT TO THE EBCU FILER. +"RTN","BMXADOF1",64,0) + I $E(MSG,1,2)'="OK" S ECNT=ECNT+1 +"RTN","BMXADOF1",65,0) + S CNT=CNT+1 S OUT(CNT)=MSG +"RTN","BMXADOF1",66,0) + ; S DSTG=$TR(DSTG,$C(30),"}") W !,DSTG ; TEMP OUTPUT - REMOVE THIS LINE AFTER TESTING COMPLETED! +"RTN","BMXADOF1",67,0) + Q +"RTN","BMXADOF1",68,0) + ; +"RTN","BMXADOF1",69,0) +ERR(ERR) ; +"RTN","BMXADOF1",70,0) + I '$L($G(ERR)) Q +"RTN","BMXADOF1",71,0) + S ECNT=$G(ECNT)+1 +"RTN","BMXADOF1",72,0) + S CNT=CNT+1 +"RTN","BMXADOF1",73,0) + S OUT(CNT)=ERR +"RTN","BMXADOF1",74,0) + Q +"RTN","BMXADOF1",75,0) + ; +"RTN","BMXADOF2") +0^65^B7123769 +"RTN","BMXADOF2",1,0) +BMXADOF2 ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; +"RTN","BMXADOF2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOF2",3,0) + ; THIS ROUTINE CONTAINS SPECIAL ENTRY POINTS FOR UPDATING RPMS +"RTN","BMXADOF2",4,0) + ; +"RTN","BMXADOF2",5,0) + ; +"RTN","BMXADOF2",6,0) + ; +"RTN","BMXADOF2",7,0) +VVAR(DATA) ; EP-CHECK SPECIAL VARIABLES REQUIRED FOR UPDATING THE VISIT FILE +"RTN","BMXADOF2",8,0) + I '$L(DATA) S OUT="Update cancelled. Missing data string" Q 0 +"RTN","BMXADOF2",9,0) + N X,I,Y,VDATE,%DT +"RTN","BMXADOF2",10,0) + K AUPNPAT,AUPNDOB,AUPNDOD,AUPNVSIT ; THE VARS ARE NOT NEW'D SINCE THEY WILL BE USED BY THE CALLING ROUTINE +"RTN","BMXADOF2",11,0) + S AUPNTALK=1,AUPNOVRR=1 +"RTN","BMXADOF2",12,0) + S X=DATA S X=$TR(X,($C(30)_"+"),$C(30)) S X=$TR(X,($C(30)_"-"),$C(30)) S X=$TR(X,($C(30)_"`"),$C(30)) S DATA=X ; STRIP OFF TRANSACTION FLAGS FROM FIELD NUMBERS +"RTN","BMXADOF2",13,0) + S X=$P(DATA,"|",2),X=$P(X,$C(30)),VDATE=-1 +"RTN","BMXADOF2",14,0) + I $E(X,1,7)?7N S VDATE=X +"RTN","BMXADOF2",15,0) + E S %DT="T" D ^%DT S VDATE=Y +"RTN","BMXADOF2",16,0) + I VDATE=-1 S OUT="Update cancelled. Visit timestamp misssing/invalid" Q 0 +"RTN","BMXADOF2",17,0) + S Y=+$P(DATA,($C(30)_".05|"),2) I 'Y S OUT="Update cancelled. Patient data missing" Q 0 ; FAILED TO FIND THE PATIENT IEN +"RTN","BMXADOF2",18,0) + S AUPNPAT=Y +"RTN","BMXADOF2",19,0) + S AUPNDOB=$P($G(^DPT(AUPNPAT,0)),U,3) I 'AUPNDOB S OUT="Update cancelled. Missing DOB" Q 0 +"RTN","BMXADOF2",20,0) + I AUPNDOB>VDATE S OUT="Update cancelled. Patient born afer visit date???" Q 0 +"RTN","BMXADOF2",21,0) + S AUPNDOD=$P($G(^DPT(AUPNPAT,.35)),U) +"RTN","BMXADOF2",22,0) + I AUPNDOD,AUPNDOD FILEMAN +"RTN","BMXADOFD",4,0) + ; CONTAINS SPECIAL ENTRY POINT FOR RPMS DATA ENTRY +"RTN","BMXADOFD",5,0) + ; +"RTN","BMXADOFD",6,0) + ; +"RTN","BMXADOFD",7,0) + ; +"RTN","BMXADOFD",8,0) + ; D SS^BMXADO(.XXX,53,"","~~~~~VMEAS~BMXADOFD~1.244A||PU\60|WT\175|HT\70") Q +"RTN","BMXADOFD",9,0) + ; D SS^BMXADO(.XXX,58,"X","AC~53~53~~~NOTES~BMXADOFD~53") Q +"RTN","BMXADOFD",10,0) + N FILE,DAS,DATA S FILE=9000010.07,DAS="+" +"RTN","BMXADOFD",11,0) + S DATA=".01|`8718"_$C(30)_".02|`1"_$C(30)_".03|`71168"_$C(30)_".04|DM--2"_$C(30,31) +"RTN","BMXADOFD",12,0) + D FILE^BMXADOF(.XXX,FILE,DAS,DATA) Q +"RTN","BMXADOFD",13,0) + ; +"RTN","BMXADOFD",14,0) +VMEAS(DATA,IENS,MAX,OUT,TOT) ; VIEW MEASUREMENTS: CUSTOM ITERATOR +"RTN","BMXADOFD",15,0) + ; DATA=VCN|ALL|MTYPE1\VAL1|MTYPE2\VAL2|...|MTYPEn\VALn +"RTN","BMXADOFD",16,0) + N VAL,CNT,P,S,PTIEN,VIEN,%,X,Y,TYPE,N,ALL,STG,MEAS,MIEN,IX +"RTN","BMXADOFD",17,0) + S P="|",S="\",N=0 +"RTN","BMXADOFD",18,0) + I '$G(TOT) Q "" +"RTN","BMXADOFD",19,0) + I '$L(OUT) Q "" +"RTN","BMXADOFD",20,0) + S VIEN=$P(DATA,P) I '$L(VCN) Q "" +"RTN","BMXADOFD",21,0) + S PTIEN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'PTIEN Q "" +"RTN","BMXADOFD",22,0) + F CNT=2:1 S X=$P(DATA,P,CNT) Q:'$L(X) D ; CREATE PRELIMINARY DATA ARRAYS +"RTN","BMXADOFD",23,0) + . S VAL=$P(X,S,2) ; VALUE MUST EXIST +"RTN","BMXADOFD",24,0) + . I '$L(VAL) Q +"RTN","BMXADOFD",25,0) + . S TYPE=$P(X,S) ; TYPE MUST EXIST +"RTN","BMXADOFD",26,0) + . I '$L(TYPE) Q +"RTN","BMXADOFD",27,0) + . S MIEN=$O(^AUTTMSR("B",TYPE,0)) I 'MIEN Q +"RTN","BMXADOFD",28,0) + . S MEAS=$P($G(^AUTTMSR(MIEN,0)),U,2) I '$L(MEAS) Q +"RTN","BMXADOFD",29,0) + . S N=N+1 +"RTN","BMXADOFD",30,0) + . S VAL(N)=VAL +"RTN","BMXADOFD",31,0) + . S TYPE(N)=MIEN_U_TYPE_U_MEAS +"RTN","BMXADOFD",32,0) + . S IX(MIEN)=N +"RTN","BMXADOFD",33,0) + . Q +"RTN","BMXADOFD",34,0) +MG S N=0 F S N=$O(VAL(N)) Q:'N D +"RTN","BMXADOFD",35,0) + . S TOT=TOT+1 +"RTN","BMXADOFD",36,0) + . S @OUT@(TOT)=+TYPE(N)_U_$P(TYPE(N),U,2)_U_"`"_PTIEN_U_"`"_VIEN_U_VAL(N)_U_$P(TYPE(N),U,3)_$C(30) +"RTN","BMXADOFD",37,0) + . Q +"RTN","BMXADOFD",38,0) + Q "" +"RTN","BMXADOFD",39,0) + ; +"RTN","BMXADOFD",40,0) +ICDVAL(CODE) ; EP-RPC-VERIFY ICD CODE BY RETURNING ITS IEN +"RTN","BMXADOFD",41,0) + I '$L($G(CODE)) Q "" +"RTN","BMXADOFD",42,0) + N IEN +"RTN","BMXADOFD",43,0) + S IEN=$O(^ICD9("BA",CODE_" ",0)) +"RTN","BMXADOFD",44,0) + I 'IEN Q "" +"RTN","BMXADOFD",45,0) + Q IEN +"RTN","BMXADOFD",46,0) + ; +"RTN","BMXADOFD",47,0) +FACNIEN(PIEN,FIEN) ;EP - GIVEN A PROBLEM IEN AND FACILITY IEN, RETURN THE FACILITY-NOTE IEN +"RTN","BMXADOFD",48,0) + I '$D(^AUPNPROB(+$G(PIEN),0)) Q "" +"RTN","BMXADOFD",49,0) + I '$D(^DIC(4,+$G(FIEN),0)) Q "" +"RTN","BMXADOFD",50,0) + N NFIEN +"RTN","BMXADOFD",51,0) + S FNIEN=$O(^AUPNPROB(PIEN,11,"B",FIEN,0)) I FNIEN Q FNIEN ; IF AN FNIEN EXISTS RETURN IT +"RTN","BMXADOFD",52,0) + ; OTHERWISE-CREATE THE FM STUB NODES FOR THE FACILITY SUBFILE +"RTN","BMXADOFD",53,0) + S FNIEN=$O(^AUPNPROB(PIEN,11,999999),-1)+1 +"RTN","BMXADOFD",54,0) + S ^AUPNPROB(PIEN,11,FNIEN,0)=FIEN +"RTN","BMXADOFD",55,0) + S ^AUPNPROB(PIEN,11,FNIEN,11,0)="^9000011.1111IA^^" +"RTN","BMXADOFD",56,0) + S ^AUPNPROB(PIEN,11,"B",FIEN,FNIEN)="" +"RTN","BMXADOFD",57,0) + Q FNIEN +"RTN","BMXADOFD",58,0) + ; +"RTN","BMXADOFD",59,0) +NEXTPBN(DFN,FIEN) ; RETURN THE NEXT AVAILABLE PROBLEM NUMBER FOR A PATIENT AT THE FACILITY +"RTN","BMXADOFD",60,0) + N MAX,PIEN,X,Y +"RTN","BMXADOFD",61,0) + S MAX=0,PIEN=0 +"RTN","BMXADOFD",62,0) + F S PIEN=$O(^AUPNPROB("AC",DFN,PIEN)) Q:'PIEN D ; FIND ALL PROBLEMS FOR THIS PATIENT +"RTN","BMXADOFD",63,0) + . S X=$G(^AUPNPROB(PIEN,0)) I '$L(X) Q "" +"RTN","BMXADOFD",64,0) + . I $P(X,U,6)'=FIEN Q ; ONLY CHECK NUMBERS AT THIS FACILITY +"RTN","BMXADOFD",65,0) + . S Y=$P(X,U,7) +"RTN","BMXADOFD",66,0) + . I Y>MAX S MAX=Y ; GET THE HIGHEST NUMBER THUS FAR +"RTN","BMXADOFD",67,0) + . Q +"RTN","BMXADOFD",68,0) + S MAX=(MAX\1)+1 ; GET NEXT AVAILABLE INTEGER +"RTN","BMXADOFD",69,0) + Q MAX +"RTN","BMXADOFD",70,0) + ; +"RTN","BMXADOFD",71,0) +NN W $$NEXTNOTE(221,4585) Q +"RTN","BMXADOFD",72,0) +NEXTNOTE(PIEN,FIEN) ; RETRUN THE NEXT NOTE NUMBER FOR A PROBLEM AND FACILITY +"RTN","BMXADOFD",73,0) + I '$D(^AUPNPROB(+$G(PIEN),0)) Q "" +"RTN","BMXADOFD",74,0) + I '$D(^DIC(4,+$G(FIEN),0)) Q "" +"RTN","BMXADOFD",75,0) + N MAX,NIEN,FNIEN,X,Y +"RTN","BMXADOFD",76,0) + S MAX=0,NIEN=0 +"RTN","BMXADOFD",77,0) + S FNIEN=$$FACNIEN^BMXADOFD(PIEN,FIEN) I 'FNIEN Q "" +"RTN","BMXADOFD",78,0) + F S NIEN=$O(^AUPNPROB(PIEN,11,FNIEN,11,NIEN)) Q:'NIEN D +"RTN","BMXADOFD",79,0) + . S X=$G(^AUPNPROB(PIEN,11,FNIEN,11,NIEN,0)) I '$L(X) Q +"RTN","BMXADOFD",80,0) + . S Y=+X +"RTN","BMXADOFD",81,0) + . I Y>MAX S MAX=Y +"RTN","BMXADOFD",82,0) + . Q +"RTN","BMXADOFD",83,0) + S MAX=MAX+1 +"RTN","BMXADOFD",84,0) + Q MAX +"RTN","BMXADOFS") +0^67^B38538227 +"RTN","BMXADOFS",1,0) +BMXADOFS ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; +"RTN","BMXADOFS",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOFS",3,0) + ; THIS IS THE ADO RECORDSET FILER: ADO -> FILEMAN +"RTN","BMXADOFS",4,0) + ; CONTAINS SPECIAL CODE RELATED TO FILING PROPLEMS, POVS, FAMILY HX, PERSONAL HX AND NOTES. +"RTN","BMXADOFS",5,0) + ; +"RTN","BMXADOFS",6,0) + ; +"RTN","BMXADOFS",7,0) + ; +"RTN","BMXADOFS",8,0) +PAT ; TEST PROBLEM ADD +"RTN","BMXADOFS",9,0) + S DATA=".01|`8257"_$C(30)_".02|`53"_$C(30)_".03|"_DT_$C(30)_".05|C-POX"_$C(30)_".06|`4585"_$C(30)_".12|I"_$C(30,31) +"RTN","BMXADOFS",10,0) + D FILE^BMXADOF(.XXX,9000011,"",DATA) W !,XXX K XXX,DATA Q +"RTN","BMXADOFS",11,0) + ; +"RTN","BMXADOFS",12,0) +PET ; TEST PROB EDIT +"RTN","BMXADOFS",13,0) + S DATA=".01|250.00"_$C(30)_".03|"_DT_$C(30)_".05|HI MOM"_$C(30)_".12|I"_$C(30,31) +"RTN","BMXADOFS",14,0) + D FILE^BMXADOF(.XXX,9000011,"1757",DATA) W !,XXX K XXX,DATA Q +"RTN","BMXADOFS",15,0) + ; +"RTN","BMXADOFS",16,0) +TDP ; TEST PROBLEM DELETE +"RTN","BMXADOFS",17,0) + S DATA=$C(31) +"RTN","BMXADOFS",18,0) + D FILE^BMXADOF(.XXX,9000011,"-1757",DATA) W !,XXX K XXX,DATA Q +"RTN","BMXADOFS",19,0) + ; +"RTN","BMXADOFS",20,0) +TPOV ; ADD POV TEST +"RTN","BMXADOFS",21,0) + S DATA=".01|`8718"_$C(30)_".02|`53"_$C(30)_".03|`3909"_$C(30)_".04|DM---I"_$C(30)_".12|P"_$C(30,31) +"RTN","BMXADOFS",22,0) + D FILE^BMXADOF(.XXX,9000010.07,"",DATA) W !,XXX K XXX,DATA Q +"RTN","BMXADOFS",23,0) + ; +"RTN","BMXADOFS",24,0) +TH ; HX TEST +"RTN","BMXADOFS",25,0) + S DATA=".01|250.00"_$C(30)_".02|`53"_$C(30)_".03|JUL 15,2004"_$C(30)_".04|FAMILY HX OF LUNG CA"_$C(30,31) +"RTN","BMXADOFS",26,0) + D FILE^BMXADOF(.XXX,9000014,"",DATA) W !,XXX K XXX,DATA Q +"RTN","BMXADOFS",27,0) + ; +"RTN","BMXADOFS",28,0) +TNOTE ; TEST ADDING A NOTE TO A PROBLEM +"RTN","BMXADOFS",29,0) + N DATA,XXX,PROBIEN,FACNIEN,FACIEN,DAS +"RTN","BMXADOFS",30,0) + S PROBIEN=3,FACIEN=4587 +"RTN","BMXADOFS",31,0) + S FACNIEN=$$FACNIEN(PROBIEN,FACIEN) ; YOU MUST SPECIFY THE PROBLEM IEN AND THE FACILITY IEN +"RTN","BMXADOFS",32,0) + S DAS=PROBIEN_","_FACNIEN_"," +"RTN","BMXADOFS",33,0) + S DATA=".03|NEW NOTE #2"_$C(30,31) ; THE DATA STRING JUST CONTAINS THE NOTE FIELD. +"RTN","BMXADOFS",34,0) + ; THE OTHER FIELDS (INCLUDING .01) ARE ADDED BY BMXADOF +"RTN","BMXADOFS",35,0) + D FILE^BMXADOF(.XXX,9000011.1111,DAS,DATA) W !,XXX +"RTN","BMXADOFS",36,0) + Q +"RTN","BMXADOFS",37,0) + ; +"RTN","BMXADOFS",38,0) + ; ----------------------------------------------------------------------------------------------------- +"RTN","BMXADOFS",39,0) + ; +"RTN","BMXADOFS",40,0) +SPEC(FILE,DATA,UFLG) ;EP - SPECIAL DATA MODS FOR SPECIFIC FILES +"RTN","BMXADOFS",41,0) + I FILE=9000010.07 S DATA=$$POV(DATA) Q DATA +"RTN","BMXADOFS",42,0) + I FILE=9000011 S DATA=$$PROB(DATA,$G(UFLG)) Q DATA +"RTN","BMXADOFS",43,0) + I FILE=9000013!(FILE=9000014) S DATA=$$HX(DATA) Q DATA +"RTN","BMXADOFS",44,0) + I FILE=9000011.1111 S DATA=$$NOTE(DATA,$G(DAS(2)),$G(DAS(1))) Q DATA +"RTN","BMXADOFS",45,0) + ; I FILE=9000010.18,DATA'["|.04|" G DSTG +"RTN","BMXADOFS",46,0) + Q DATA +"RTN","BMXADOFS",47,0) + ; +"RTN","BMXADOFS",48,0) +HX(DATA) ; INPUT STRING TRANSFORM FOR PHX AND FHX +"RTN","BMXADOFS",49,0) + N NARR,NIEN,%,A,B,X,Y,%DT +"RTN","BMXADOFS",50,0) + I DATA[".01|`" G HNARR +"RTN","BMXADOFS",51,0) + S DATA=$$ICD(DATA,.01) I DATA="" Q "" +"RTN","BMXADOFS",52,0) +HNARR I DATA'[".04|'" G HDT +"RTN","BMXADOFS",53,0) + S DATA=$$NARR(DATA,.04) +"RTN","BMXADOFS",54,0) +HDT I DATA'[".03|" Q DATA +"RTN","BMXADOFS",55,0) + S X=+$P(DATA,".03|",2) I X?7N Q DATA +"RTN","BMXADOFS",56,0) + S %DT="" D ^%DT +"RTN","BMXADOFS",57,0) + I Y'?7N Q DATA +"RTN","BMXADOFS",58,0) + S A=$P(DATA,".03|") +"RTN","BMXADOFS",59,0) + S B=$P(DATA,".03|",2) S B=$P(B,$C(30),2) +"RTN","BMXADOFS",60,0) + S DATA=A_".03|"_Y +"RTN","BMXADOFS",61,0) + I $L(B) S DATA=DATA_$C(30)_B +"RTN","BMXADOFS",62,0) + Q DATA +"RTN","BMXADOFS",63,0) + ; +"RTN","BMXADOFS",64,0) +POV(DATA) ; POV INPUT STRING TRANSFORM +"RTN","BMXADOFS",65,0) + N NARR,NIEN,% +"RTN","BMXADOFS",66,0) + I DATA[".01|`" G PVNARR +"RTN","BMXADOFS",67,0) + S DATA=$$ICD(DATA,.01) I DATA="" Q "" +"RTN","BMXADOFS",68,0) +PVNARR I DATA'[".04|'" Q DATA +"RTN","BMXADOFS",69,0) + S DATA=$$NARR(DATA,.04) +"RTN","BMXADOFS",70,0) + Q DATA +"RTN","BMXADOFS",71,0) + ; +"RTN","BMXADOFS",72,0) +PROB(DATA,UFLG) ; PROBLEM LIST INPUT STRING TRANSFORM +"RTN","BMXADOFS",73,0) + N NARR,NIEN,%,PNUM,FACIEN,DFN,X,A,B +"RTN","BMXADOFS",74,0) +PNARR I DATA'[".05|" G PICD +"RTN","BMXADOFS",75,0) + S %=$P(DATA,".05|",2) +"RTN","BMXADOFS",76,0) + S NARR=$P(%,$C(30)) +"RTN","BMXADOFS",77,0) + I NARR'?1"`"1.N S DATA=$$NARR(DATA,.05) ; STUFF THE NARR LOOKUP VALUE IN THE DATA STRING +"RTN","BMXADOFS",78,0) + I '$L(DATA) Q "" +"RTN","BMXADOFS",79,0) +PICD S %=$P(DATA,"|") I %'=.01,DATA'[($C(30)_".01|") G PNUM +"RTN","BMXADOFS",80,0) + S DATA=$$ICD(DATA,.01) I DATA="" Q "" +"RTN","BMXADOFS",81,0) +PNUM I $G(UFLG)="E" Q DATA ; STOP HERE IF IN EDIT MODE +"RTN","BMXADOFS",82,0) + I $P(DATA,($C(30)_".07|"),2) G TODAY ; GET NEXT PROB NUM +"RTN","BMXADOFS",83,0) + S DFN=+$P(DATA,".02|`",2) +"RTN","BMXADOFS",84,0) + I 'DFN S DATA="" Q "" +"RTN","BMXADOFS",85,0) + S FACIEN=+$P(DATA,".06|`",2) +"RTN","BMXADOFS",86,0) + I 'FACIEN Q "" +"RTN","BMXADOFS",87,0) + S PNUM=$$NEXTPBN(DFN,FACIEN) +"RTN","BMXADOFS",88,0) + I 'PNUM Q "" +"RTN","BMXADOFS",89,0) + S X=$L(DATA,$C(30)) +"RTN","BMXADOFS",90,0) + S A=$P(DATA,$C(30),1,X-1),B=$P(DATA,$C(30),X) +"RTN","BMXADOFS",91,0) + S DATA=A_$C(30)_".07|"_PNUM_$C(30)_B +"RTN","BMXADOFS",92,0) +TODAY I $P(DATA,($C(30)_".08|"),2) Q DATA ; GET TODAY'S DATE +"RTN","BMXADOFS",93,0) + S X=$L(DATA,$C(30)) +"RTN","BMXADOFS",94,0) + S A=$P(DATA,$C(30),1,X-1),B=$P(DATA,$C(30),X) +"RTN","BMXADOFS",95,0) + S DATA=A_$C(30)_".08|"_$G(DT)_$C(30)_B +"RTN","BMXADOFS",96,0) + Q DATA +"RTN","BMXADOFS",97,0) + ; +"RTN","BMXADOFS",98,0) +NOTE(DATA,PIEN,FNIEN) ; GIVEN A DATA STRING CONTAINING THE NOTE, THE PROBLEM IEN, AND THE FAC-NOTE IEN: +"RTN","BMXADOFS",99,0) + ; ADD NOTE # AND STATUS TO THE DATA STRING +"RTN","BMXADOFS",100,0) + I $G(DATA)'[".03|" Q "" +"RTN","BMXADOFS",101,0) + I '$D(^AUPNPROB(+$G(PIEN),11,+$G(FNIEN),0)) Q "" +"RTN","BMXADOFS",102,0) + N NUM +"RTN","BMXADOFS",103,0) + I DATA'[".04|" S DATA=".04|A"_$C(30)_DATA +"RTN","BMXADOFS",104,0) + I DATA'[".01|" D +"RTN","BMXADOFS",105,0) + . S NUM=$$NEXTNOTE(PIEN,FNIEN) +"RTN","BMXADOFS",106,0) + . I 'NUM Q +"RTN","BMXADOFS",107,0) + . S DATA=".01|"_NUM_$C(30)_DATA +"RTN","BMXADOFS",108,0) + Q DATA +"RTN","BMXADOFS",109,0) + ; +"RTN","BMXADOFS",110,0) +TI N XXX S XXX=$$ICD(".01|250.00"_$C(30)_".02|123"_$C(30)_".03|ABC",.01) W !,$TR(XXX,$C(30),"{") Q +"RTN","BMXADOFS",111,0) +ICD(DATA,FLD) ; VERIFY ICD CODE AND GET LOOKUP VALUE +"RTN","BMXADOFS",112,0) + I '$G(FLD) Q "" +"RTN","BMXADOFS",113,0) + I '$L($G(DATA)) Q "" +"RTN","BMXADOFS",114,0) + N %,A,B +"RTN","BMXADOFS",115,0) + S %=$P(DATA,"|") +"RTN","BMXADOFS",116,0) + I %=FLD D Q DATA +"RTN","BMXADOFS",117,0) + . S %=$P(DATA,"|",2) +"RTN","BMXADOFS",118,0) + . S %=$P(%,$C(30)) +"RTN","BMXADOFS",119,0) + . I %?1"`"1.N Q +"RTN","BMXADOFS",120,0) + . S %=$O(^ICD9("BA",%_" ",0)) +"RTN","BMXADOFS",121,0) + . I '% S DATA="" Q +"RTN","BMXADOFS",122,0) + . S A=$P(DATA,"|") +"RTN","BMXADOFS",123,0) + . S B=$P(DATA,"|",2,999) +"RTN","BMXADOFS",124,0) + . S B=$P(B,$C(30),2,999) +"RTN","BMXADOFS",125,0) + . S DATA=A_"|`"_% +"RTN","BMXADOFS",126,0) + . I $L(B) S DATA=DATA_$C(30)_B +"RTN","BMXADOFS",127,0) + . Q +"RTN","BMXADOFS",128,0) + S %=$P(DATA,($C(30)_FLD_"|"),2) D +"RTN","BMXADOFS",129,0) + . S %=$P(%,$C(30)) +"RTN","BMXADOFS",130,0) + . I %?1"`"1.N Q DATA +"RTN","BMXADOFS",131,0) + . S %=$O(^ICD9("BA",%_" ",0)) +"RTN","BMXADOFS",132,0) + . I '% S DATA="" Q +"RTN","BMXADOFS",133,0) + . S A=$P(DATA,($C(30)_FLD_"|")) +"RTN","BMXADOFS",134,0) + . S B=$P(DATA,($C(30)_FLD_"|"),2,999) +"RTN","BMXADOFS",135,0) + . S B=$P(B,$C(30),2,999) +"RTN","BMXADOFS",136,0) + . S DATA=A_$C(30)_FLD_"|`"_% +"RTN","BMXADOFS",137,0) + . I $L(B) S DATA=DATA_$C(30)_B +"RTN","BMXADOFS",138,0) + . Q +"RTN","BMXADOFS",139,0) + Q DATA +"RTN","BMXADOFS",140,0) + ; +"RTN","BMXADOFS",141,0) +NARR(DATA,FLD) ; SUBSTITUTE A LOOKUP VALUE FOR NARRATIVE DATA IN THE DATA STRING +"RTN","BMXADOFS",142,0) + N A,B,C,X,Y,DIC,Z +"RTN","BMXADOFS",143,0) + I '$G(FLD) Q "" +"RTN","BMXADOFS",144,0) + I '$L($G(DATA)) Q "" +"RTN","BMXADOFS",145,0) + S Z=FLD_"|" +"RTN","BMXADOFS",146,0) + S A=$P(DATA,Z) +"RTN","BMXADOFS",147,0) + S B=$P(DATA,Z,2) +"RTN","BMXADOFS",148,0) + S NARR=$P(B,$C(30)) +"RTN","BMXADOFS",149,0) + S NARR=$$UP^XLFSTR(NARR) ; CONVERT ALL NARRATIVE TO UPPERCASE +"RTN","BMXADOFS",150,0) + S C=$P(B,$C(30),2,999) +"RTN","BMXADOFS",151,0) + S DIC="^AUTNPOV(",DIC(0)="L",X=NARR +"RTN","BMXADOFS",152,0) + D ^DIC I Y=-1 Q "" +"RTN","BMXADOFS",153,0) + S DATA=A_FLD_"|`"_+Y +"RTN","BMXADOFS",154,0) + I $L(C) S DATA=DATA_$C(30)_C +"RTN","BMXADOFS",155,0) + D ^XBFMK +"RTN","BMXADOFS",156,0) + Q DATA +"RTN","BMXADOFS",157,0) + ; +"RTN","BMXADOFS",158,0) +FACNIEN(PIEN,FIEN) ; GIVEN A PROBLEM IEN AND FACILITY IEN, RETURN THE FACILITY-NOTE IEN +"RTN","BMXADOFS",159,0) + I '$D(^AUPNPROB(+$G(PIEN),0)) Q "" +"RTN","BMXADOFS",160,0) + I '$D(^DIC(4,+$G(FIEN),0)) Q "" +"RTN","BMXADOFS",161,0) + N FNIEN +"RTN","BMXADOFS",162,0) + S FNIEN=$O(^AUPNPROB(PIEN,11,"B",FIEN,0)) I FNIEN Q FNIEN ; IF AN FNIEN EXISTS RETURN IT +"RTN","BMXADOFS",163,0) + ; OTHERWISE-CREATE THE FM STUB NODES FOR THE FACILITY SUBFILE +"RTN","BMXADOFS",164,0) + S FNIEN=$O(^AUPNPROB(PIEN,11,999999),-1)+1 +"RTN","BMXADOFS",165,0) + S ^AUPNPROB(PIEN,11,FNIEN,0)=FIEN +"RTN","BMXADOFS",166,0) + S ^AUPNPROB(PIEN,11,FNIEN,11,0)="^9000011.1111IA^^" +"RTN","BMXADOFS",167,0) + S ^AUPNPROB(PIEN,11,"B",FIEN,FNIEN)="" +"RTN","BMXADOFS",168,0) + Q FNIEN +"RTN","BMXADOFS",169,0) + ; +"RTN","BMXADOFS",170,0) +NEXTPBN(DFN,FIEN) ; RETURN THE NEXT AVAILABLE PROBLEM NUMBER FOR A PATIENT AT THE FACILITY +"RTN","BMXADOFS",171,0) + N MAX,PIEN,X,Y +"RTN","BMXADOFS",172,0) + S MAX=0,PIEN=0 +"RTN","BMXADOFS",173,0) + F S PIEN=$O(^AUPNPROB("AC",DFN,PIEN)) Q:'PIEN D ; FIND ALL PROBLEMS FOR THIS PATIENT +"RTN","BMXADOFS",174,0) + . S X=$G(^AUPNPROB(PIEN,0)) I '$L(X) Q "" +"RTN","BMXADOFS",175,0) + . I $P(X,U,6)'=FIEN Q ; ONLY CHECK NUMBERS AT THIS FACILITY +"RTN","BMXADOFS",176,0) + . S Y=$P(X,U,7) +"RTN","BMXADOFS",177,0) + . I Y>MAX S MAX=Y ; GET THE HIGHEST NUMBER THUS FAR +"RTN","BMXADOFS",178,0) + . Q +"RTN","BMXADOFS",179,0) + S MAX=(MAX\1)+1 ; GET NEXT AVAILABLE INTEGER +"RTN","BMXADOFS",180,0) + Q MAX +"RTN","BMXADOFS",181,0) + ; +"RTN","BMXADOFS",182,0) +NN W $$NEXTNOTE(3,1) Q +"RTN","BMXADOFS",183,0) +NEXTNOTE(PIEN,FNIEN) ; RETRUN THE NEXT NOTE NUMBER FOR A PROBLEM AND FACILITY-NOTE IEN +"RTN","BMXADOFS",184,0) + I '$D(^AUPNPROB(+$G(PIEN),11,+$G(FNIEN),0)) Q "" +"RTN","BMXADOFS",185,0) + N MAX,NIEN,X,Y +"RTN","BMXADOFS",186,0) + S MAX=0,NIEN=0 +"RTN","BMXADOFS",187,0) + F S NIEN=$O(^AUPNPROB(PIEN,11,FNIEN,11,NIEN)) Q:'NIEN D +"RTN","BMXADOFS",188,0) + . S X=$G(^AUPNPROB(PIEN,11,FNIEN,11,NIEN,0)) I '$L(X) Q +"RTN","BMXADOFS",189,0) + . S Y=+X +"RTN","BMXADOFS",190,0) + . I Y>MAX S MAX=Y +"RTN","BMXADOFS",191,0) + . Q +"RTN","BMXADOFS",192,0) + S MAX=MAX+1 +"RTN","BMXADOFS",193,0) + Q MAX +"RTN","BMXADOFS",194,0) + ; +"RTN","BMXADOFS",195,0) +PIENN(PIEN) ; GIVEN A PROBLEM IEN, RETURN PROBLEM NARRATIVE (ICD) +"RTN","BMXADOFS",196,0) + N X,IIEN,NIEN,NARR,ICD +"RTN","BMXADOFS",197,0) + S X=$G(^AUPNPROB(PIEN,0)) I '$L(X) Q "" +"RTN","BMXADOFS",198,0) + S IIEN=$P(X,U) I 'IIEN Q "" +"RTN","BMXADOFS",199,0) + S NIEN=$P(X,U,5) I 'NIEN Q "" +"RTN","BMXADOFS",200,0) + S ICD=$P($G(^ICD9(IIEN,0)),U) I '$L(ICD) Q "" +"RTN","BMXADOFS",201,0) + S NARR=$P($G(^AUTNPOV(NIEN,0)),U) I '$L(NARR) Q "" +"RTN","BMXADOFS",202,0) + S X=NARR_" ("_ICD_")" +"RTN","BMXADOFS",203,0) + Q X +"RTN","BMXADOFS",204,0) + ; +"RTN","BMXADOI") +0^68^B6267463 +"RTN","BMXADOI",1,0) +BMXADOI ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ; +"RTN","BMXADOI",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOI",3,0) + ; CUSTOM IDENTIFIERS +"RTN","BMXADOI",4,0) + ; +"RTN","BMXADOI",5,0) + ; +"RTN","BMXADOI",6,0) + ; +"RTN","BMXADOI",7,0) +DEMOID(DA) ; EP-RETURN RPMS DEMOGRAPHIC INFO FOR IDENTIFIER FIELD +"RTN","BMXADOI",8,0) + N SEX,DOB,CHART,AGE,TRIBE,CC,X,Y,%,STG,FMDOB,NAME,S,SSN,CSTG,LOC,ABB +"RTN","BMXADOI",9,0) + I '$D(^DPT(+$G(DA),0)) Q "" +"RTN","BMXADOI",10,0) + S S=" " +"RTN","BMXADOI",11,0) + S X=$G(^DPT(DA,0)),SEX=$P(X,U,2),Y=$P(X,U,3),NAME=$P(X,U),SSN=$P(X,U,9) +"RTN","BMXADOI",12,0) + I '$L(NAME) Q "" +"RTN","BMXADOI",13,0) + I Y,$G(DT) S AGE=(DT-Y)\10000 +"RTN","BMXADOI",14,0) + I Y X ^DD("DD") S DOB=Y +"RTN","BMXADOI",15,0) + S LOC=0,CSTG="" +"RTN","BMXADOI",16,0) + F S LOC=$O(^AUPNPAT(DA,41,"B",LOC)) Q:'LOC D ; GET ALL THE CHART NUMBERS +"RTN","BMXADOI",17,0) + . S CHART=$O(^AUPNPAT(DA,41,"B",LOC,0)) I '$L(CHART) Q +"RTN","BMXADOI",18,0) + . S ABB=$P($G(^AUTTLOC(LOC,0)),U,7) I '$L(ABB) Q +"RTN","BMXADOI",19,0) + . I $L(CSTG) S CSTG=CSTG_", " +"RTN","BMXADOI",20,0) + . S CSTG=CSTG_ABB_" #"_CHART +"RTN","BMXADOI",21,0) + . Q +"RTN","BMXADOI",22,0) + I $G(DUZ(2)) S CHART=$P($G(^AUPNPAT(DA,41,DUZ(2),0)),U,2) +"RTN","BMXADOI",23,0) + S %=$P($G(^AUPNPAT(DA,11)),U,8) I % S TRIBE=$P($G(^AUTTTRI(%,0)),U) +"RTN","BMXADOI",24,0) + S CC=$P($G(^AUPNPAT(DA,11)),U,18) +"RTN","BMXADOI",25,0) + S STG=NAME +"RTN","BMXADOI",26,0) + I $L(CSTG) S STG=STG_CSTG_" --" +"RTN","BMXADOI",27,0) + I $G(AGE),$L(SEX) S STG=STG_S_AGE_" y/o "_SEX +"RTN","BMXADOI",28,0) + I '$G(AGE),$L(SEX) S STG=STG_S_SEX +"RTN","BMXADOI",29,0) + I $L($G(DOB)) S STG=STG_S_DOB +"RTN","BMXADOI",30,0) + I $L($G(SSN)) S STG=STG_S_$E(SSN,1,3)_"-"_$E(SSN,4,5)_"-"_$E(SSN,6,9) +"RTN","BMXADOI",31,0) + I $L($G(TRIBE)) S STG=STG_S_TRIBE +"RTN","BMXADOI",32,0) + I $L($G(CC)) S STG=STG_S_CC +"RTN","BMXADOI",33,0) + Q STG +"RTN","BMXADOI",34,0) + ; +"RTN","BMXADOI",35,0) +DATE(DATE) ; TEST TRIGGER +"RTN","BMXADOI",36,0) + Q DATE +"RTN","BMXADOI",37,0) + ; +"RTN","BMXADOI",38,0) +NAME(VIEN) ; RETURN THE PATIENT'S NAME +"RTN","BMXADOI",39,0) + I '$G(VIEN) Q "" +"RTN","BMXADOI",40,0) + N DFN +"RTN","BMXADOI",41,0) + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" +"RTN","BMXADOI",42,0) + Q $$GET1^DIQ(2,DFN_",",.01) +"RTN","BMXADOI",43,0) + ; +"RTN","BMXADOI",44,0) +SEX(VIEN) ; RETURN THE PATIENT'S SEX +"RTN","BMXADOI",45,0) + I '$G(VIEN) Q "" +"RTN","BMXADOI",46,0) + N DFN +"RTN","BMXADOI",47,0) + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" +"RTN","BMXADOI",48,0) + Q $$GET1^DIQ(2,DFN_",",.02) +"RTN","BMXADOI",49,0) + ; +"RTN","BMXADOI",50,0) +HRN(VIEN) ; RETURN THE CHART NUMBER FOR VISIT TRIGGER +"RTN","BMXADOI",51,0) + I '$G(VIEN) Q "" +"RTN","BMXADOI",52,0) + N DFN,LOC +"RTN","BMXADOI",53,0) + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" +"RTN","BMXADOI",54,0) + S LOC=$P($G(^AUPNVSIT(VIEN,0)),U,6) I 'LOC Q "" +"RTN","BMXADOI",55,0) + Q $$HRN^AUPNPAT(DFN,LOC,2) +"RTN","BMXADOI",56,0) + ; +"RTN","BMXADOI",57,0) +DOB(VIEN) ; RETURN THE PATIENT'S DOB +"RTN","BMXADOI",58,0) + I '$G(VIEN) Q "" +"RTN","BMXADOI",59,0) + N DFN,LOC +"RTN","BMXADOI",60,0) + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" +"RTN","BMXADOI",61,0) + Q $$DOB^AUPNPAT(DFN,"E") +"RTN","BMXADOI",62,0) + ; +"RTN","BMXADOI",63,0) +SSN(VIEN) ; RETURN THE PATIENTS DOB +"RTN","BMXADOI",64,0) + I '$G(VIEN) Q "" +"RTN","BMXADOI",65,0) + N DFN,LOC +"RTN","BMXADOI",66,0) + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" +"RTN","BMXADOI",67,0) + Q $$SSN^AUPNPAT(DFN) +"RTN","BMXADOI",68,0) + ; +"RTN","BMXADOI",69,0) +VISDATE(VIEN) ; RETURN THE DATE OF THE VISIT +"RTN","BMXADOI",70,0) + I '$G(VIEN) Q "" +"RTN","BMXADOI",71,0) + N FMDT +"RTN","BMXADOI",72,0) + S FMDT=+$G(^AUPNVSIT(VIEN,0))\1 I 'FMDT Q "" +"RTN","BMXADOI",73,0) + S %=$$FMTE^XLFDT(FMDT,1) +"RTN","BMXADOI",74,0) + G TD1 +"RTN","BMXADOI",75,0) + ; +"RTN","BMXADOI",76,0) +TODAY(VIEN) ; RETURN TODAY'S DATE +"RTN","BMXADOI",77,0) + I '$G(DT) Q "" +"RTN","BMXADOI",78,0) + S %=$$FMTE^XLFDT(DT,1) +"RTN","BMXADOI",79,0) +TD1 S %=$$UP^XLFSTR(%) +"RTN","BMXADOI",80,0) + S %=$P(%," ",1,2)_$P(%," ",3) +"RTN","BMXADOI",81,0) + Q % +"RTN","BMXADOI",82,0) + ; +"RTN","BMXADOS") +0^69^B75110422 +"RTN","BMXADOS",1,0) +BMXADOS ; IHS/CIHA/GIS - UPDATE THE BMX ADO SCHEMA FILE ; +"RTN","BMXADOS",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOS",3,0) + ; ENABLES NAVIGATION TO SUBFILES PRIOR TO UPDATING THE SCHEMA FILE ENTRY +"RTN","BMXADOS",4,0) + ; +"RTN","BMXADOS",5,0) + ; +"RTN","BMXADOS",6,0) + ; +"RTN","BMXADOS",7,0) +UPDATE ; UPDATE THE SCHEMA FILE +"RTN","BMXADOS",8,0) + N DIC,X,Y,%,STOP,FIEN,FNAME,SNAME,SIEN +"RTN","BMXADOS",9,0) +UDIC S DIC("A")="Enter schema name: " ; EP FROM VENPCCTU +"RTN","BMXADOS",10,0) + S DIC(0)="AEQLM",DIC="^BMXADO(" +"RTN","BMXADOS",11,0) + D ^DIC I Y=-1 G FIN +"RTN","BMXADOS",12,0) +SCHEMA S SNAME=$P(Y,U,2),SIEN=+Y +"RTN","BMXADOS",13,0) + S FIEN=$$FILE(SIEN) I 'FIEN G FIN +"RTN","BMXADOS",14,0) + I FIEN'=$P($G(^BMXADO(SIEN,0)),U,2) S DIE=DIC,DA=SIEN,DR=".02////^S X=FIEN" D ^DIE +"RTN","BMXADOS",15,0) + F D FLD(FIEN,SIEN) I $G(STOP) Q ; GET FIELD INFO +"RTN","BMXADOS",16,0) +FIN D ^XBFMK +"RTN","BMXADOS",17,0) + Q +"RTN","BMXADOS",18,0) + ; +"RTN","BMXADOS",19,0) +FLD(FIEN,SIEN) ; GET THE FIELD +"RTN","BMXADOS",20,0) + N DIC,X,Y,DIE,DA,DR,FLDIEN,FLDNAME,FLDTYPE,FDEF,TRANS +"RTN","BMXADOS",21,0) + N %,%Y,HDR,DTYPE,LEN,FARR,I,TOT,PAUSE,PFLAG,IFLAG,IMSG,STG,READ +"RTN","BMXADOS",22,0) + D FLIST(.FARR,FIEN,0) +"RTN","BMXADOS",23,0) + S TOT=$O(FARR(9999),-1) I 'TOT S STOP=1 Q +"RTN","BMXADOS",24,0) + W !,"Select a field from this "_$S($D(^DD(FIEN,0,"UP")):"sub-",1:"")_"file: " +"RTN","BMXADOS",25,0) + S I=0 F S I=$O(FARR(I)) Q:'I S PAUSE=$$PAUSE(I) Q:PAUSE'="" W I,?3,FARR(I) +"RTN","BMXADOS",26,0) + I $G(PAUSE)=U S STOP=1 Q +"RTN","BMXADOS",27,0) + I $G(PAUSE) S Y=PAUSE G FLD1 +"RTN","BMXADOS",28,0) + S DIR(0)="NO^1:"_TOT_":",DIR("A")="Select a field from the list" K DA D ^DIR K DIR +"RTN","BMXADOS",29,0) + I 'Y S STOP=1 Q +"RTN","BMXADOS",30,0) +FLD1 S %=FARR(+Y) +"RTN","BMXADOS",31,0) + S FLDIEN=+$P(%," [",2),FLDNAME=$P(%," [") +"RTN","BMXADOS",32,0) + I $$FDEL(SIEN,FLDIEN) Q ; FIELD DELETED +"RTN","BMXADOS",33,0) + S X=$$FDEF(FIEN,FLDIEN) I '$L(X) W " ??" Q +"RTN","BMXADOS",34,0) + S DTYPE=$E(X),LEN=+$E(X,2,6) +"RTN","BMXADOS",35,0) + S DIR(0)="F^1:30",DIR("A")="Column header",DIR("B")=FLDNAME D ^DIR K DIR +"RTN","BMXADOS",36,0) + S HDR=Y,TRANS=0 +"RTN","BMXADOS",37,0) + S %=$P($G(^DD(FIEN,FLDIEN,0)),U,2) ; CHECK FM DD TO SEE IF FIELD IS REQUIRED +"RTN","BMXADOS",38,0) + I %["R" W !,"FileMan requires a non-null value for this field" S %=2 +"RTN","BMXADOS",39,0) + E W !,"Is null allowed" S %=$S(FLDIEN=.01:2,1:1) D YN^DICN I %Y?1."^" Q +"RTN","BMXADOS",40,0) + I %=2 S TRANS=1 ; NON NULL VALUE REQUIRED TO COMPLETE THE TRANSACTION OR THERE WILL BE ROLLBACK +"RTN","BMXADOS",41,0) + I $G(PFLAG) D ; IF POINTER, ASK IF USER WANTS TO AUTOMATICALLY INSERT THE LOOKUP VALUE FIELD IN THE SCHEMA +"RTN","BMXADOS",42,0) + . W !,"This field is a pointer value (IEN)." +"RTN","BMXADOS",43,0) + . W !,"Want to automatically insert the lookup value in the schema" +"RTN","BMXADOS",44,0) + . S %=2 D YN^DICN W ! I %=1 S PFLAG=2 +"RTN","BMXADOS",45,0) + . Q +"RTN","BMXADOS",46,0) +IFLG I $G(IFLAG) D ; NON-POINTER .01 FIELD. ASK IF USER WANTS TO REFERENCE IDENTIFIER EP +"RTN","BMXADOS",47,0) + . W !,"Want to display identifiers with this field" +"RTN","BMXADOS",48,0) + . S %=2 D YN^DICN W ! I %'=1 Q +"RTN","BMXADOS",49,0) + . S IMSG="Respond with a valid entry point in the format 'TAG^ROUTINE'." +"RTN","BMXADOS",50,0) + . W !,"Entry Point to generate Identifiers: " R Y:$G(DTIME,60) E Q +"RTN","BMXADOS",51,0) + . I Y?1."^" Q +"RTN","BMXADOS",52,0) + . I Y?1."?" W !,IMSG S IFLAG(0)="!" Q +"RTN","BMXADOS",53,0) + . I Y'?1U.7UN1"^"1U.7UN S IFLAG(0)="!" W " ??" +"RTN","BMXADOS",54,0) + . I $L(Y)>2 S IFLAG(0)=Y,IFLAG=2 +"RTN","BMXADOS",55,0) + . Q +"RTN","BMXADOS",56,0) + I $G(IFLAG(0))="!" W !,IMSG K IPFLAG(0),IMSG W !!! G IFLG +"RTN","BMXADOS",57,0) + S DA(1)=SIEN,DIC="^BMXADO("_DA(1)_",1," +"RTN","BMXADOS",58,0) + S DIC("P")=90093.991,DIC(0)="L",X=FLDIEN +"RTN","BMXADOS",59,0) + I '$D(^BMXADO(SIEN,1,0)) S ^BMXADO(SIEN,1,0)="^90093.991^^" +"RTN","BMXADOS",60,0) + D ^DIC I Y=-1 Q +"RTN","BMXADOS",61,0) + S READ=($P($G(^DD(FIEN,FLDIEN,0)),U,2)["C") ; COMPUTED FIELDS ARE READ ONLY! +"RTN","BMXADOS",62,0) + S DIE=DIC,DA=+Y +"RTN","BMXADOS",63,0) + S DR=".02///^S X=DTYPE;.03///^S X=LEN;.04///^S X=HDR;.05///^S X=READ;.06///0;.07///^S X=('TRANS)" +"RTN","BMXADOS",64,0) + D ^DIE +"RTN","BMXADOS",65,0) + I $G(IFLAG)=2 D ID +"RTN","BMXADOS",66,0) + I $G(PFLAG)'=2 Q +"RTN","BMXADOS",67,0) +LKUP ; AUTOMATICALLY ADD A LOOKUP FIELD TO THE SCHEMA +"RTN","BMXADOS",68,0) + S X=FLDIEN_"IEN" +"RTN","BMXADOS",69,0) + D ^DIC I Y=-1 Q +"RTN","BMXADOS",70,0) + W !,"The LOOKUP field '"_X_"' has been added to the schema",! +"RTN","BMXADOS",71,0) + S HDR=HDR_"_IEN",DTYPE="I",LEN="00009" +"RTN","BMXADOS",72,0) + S DIE=DIC,DA=+Y +"RTN","BMXADOS",73,0) + S DR=".02///^S X=DTYPE;.03///^S X=LEN;.04///^S X=HDR;.05///^S X=READ;.06///0;.07///^S X=('TRANS)" +"RTN","BMXADOS",74,0) + D ^DIE +"RTN","BMXADOS",75,0) + Q +"RTN","BMXADOS",76,0) + ; +"RTN","BMXADOS",77,0) +ID ; AUTOMATICALLY ADD AN IDENTIFIER REFERENCE +"RTN","BMXADOS",78,0) + N X,Y,DIE,DR,DA,REF +"RTN","BMXADOS",79,0) + S X=".01ID",DA(1)=SIEN +"RTN","BMXADOS",80,0) + S REF=IFLAG(0) I '$L(REF) Q +"RTN","BMXADOS",81,0) + D ^DIC I Y=-1 Q +"RTN","BMXADOS",82,0) + W !,"The identifier field '"_X_"' has been added to the schema",! +"RTN","BMXADOS",83,0) + S HDR=HDR_"_ID",DTYPE="T",LEN="00017" +"RTN","BMXADOS",84,0) + S DIE=DIC,DA=+Y +"RTN","BMXADOS",85,0) + S DR=".02///^S X=DTYPE;.03///^S X=LEN;.04///^S X=HDR;.05///^S X=READ;.06///0;.07///^S X=('TRANS);1///^S X=REF" +"RTN","BMXADOS",86,0) + D ^DIE +"RTN","BMXADOS",87,0) + Q +"RTN","BMXADOS",88,0) + ; +"RTN","BMXADOS",89,0) +FDEL(SIEN,FIELD) ; DELETE AN EXISTING ENTRY FROM THE 'FIELD' MULTIPLE. RETURN '1' IF THE RECORD WAS DELETED +"RTN","BMXADOS",90,0) + N FIEN,DA,DIK +"RTN","BMXADOS",91,0) + S FIEN=$O(^BMXADO(SIEN,1,"B",FIELD,0)) I 'FIEN Q 0 ; THIS IS A NEW ENTRY +"RTN","BMXADOS",92,0) + W !,"This field already is attached to the schema. Want to delete it" +"RTN","BMXADOS",93,0) + S %=2 D YN^DICN +"RTN","BMXADOS",94,0) + I %'=1 Q 0 +"RTN","BMXADOS",95,0) + S DA(1)=SIEN,DIK="^BMXADO("_DA(1)_",1,",DA=FIEN +"RTN","BMXADOS",96,0) + D ^DIK +"RTN","BMXADOS",97,0) + S FIEN=$O(^BMXADO(SIEN,1,"B",(FIELD_"IEN"),0)) +"RTN","BMXADOS",98,0) + I FIEN S DA=FIEN D ^DIK ; DELETE LOOKUP VALUE FIELD AS WELL +"RTN","BMXADOS",99,0) + W " Done!",! +"RTN","BMXADOS",100,0) + Q 1 +"RTN","BMXADOS",101,0) + ; +"RTN","BMXADOS",102,0) +FDEF(FILE,FIELD) ;EP - GIVEN A FILEMAN FILE AND FIELD, RETURN THE DATA DEFINITION IN ADO FORMAT +"RTN","BMXADOS",103,0) + N %,X,Y,Z,STG,I,DTYPE,FNAME,LEN,DNAME +"RTN","BMXADOS",104,0) + I '$D(^DD(+$G(FILE),+$G(FIELD),0)) Q "" +"RTN","BMXADOS",105,0) + S STG=$G(^DD(FILE,FIELD,0)) I '$L(STG) Q "" ; GET DATA DEF STRING +"RTN","BMXADOS",106,0) +DTYPE S %="DNSFWCPVM",X=$P(STG,U,2),DTYPE="" ; GET DATA TYPE +"RTN","BMXADOS",107,0) + F I=1:1:$L(%) S Y=$E(%,I) I X[Y S DTYPE=Y Q +"RTN","BMXADOS",108,0) + I DTYPE="" Q "" +"RTN","BMXADOS",109,0) +FNAME S DNAME=$P(STG,U) I '$L(DNAME) Q "" ; FIELD NAME +"RTN","BMXADOS",110,0) +DDA ; ADO FORMAT +"RTN","BMXADOS",111,0) + I DTYPE="D" D Q "D"_LEN_DNAME +"RTN","BMXADOS",112,0) + . S LEN="00021" +"RTN","BMXADOS",113,0) + . I STG["S %DT=" S %=$P(STG,"S %DT=",2),%=$P(%,$C(34)) +"RTN","BMXADOS",114,0) + . I $G(FLDIEN)=.01 S IFLAG=1 +"RTN","BMXADOS",115,0) + . I %["S" S LEN="00019" Q +"RTN","BMXADOS",116,0) + . I %["T" S LEN="00018" Q +"RTN","BMXADOS",117,0) + . Q +"RTN","BMXADOS",118,0) + I DTYPE="N",STG["1N.N" D Q:'LEN "" Q "I"_LEN_DNAME ; INTEGER +"RTN","BMXADOS",119,0) + . S %=+$P(STG,"K:+X'=X!(X>",2) +"RTN","BMXADOS",120,0) + . S Y=$L(%) +"RTN","BMXADOS",121,0) + . S LEN=$E("00000",1,5-$L(Y))_Y +"RTN","BMXADOS",122,0) + . Q +"RTN","BMXADOS",123,0) + I DTYPE="N" D Q:'LEN "" Q "N"_LEN_DNAME ; NUMBER (COULD HAVE A DECIMAL VALUE) +"RTN","BMXADOS",124,0) + . S %=+$P(STG,"!(X?.E1"".""",2) +"RTN","BMXADOS",125,0) + . S X=+$P(STG,"K:+X'=X!(X>",2) +"RTN","BMXADOS",126,0) + . S Y=%+($L(+X)) +"RTN","BMXADOS",127,0) + . S LEN=$E("00000",1,5-$L(Y))_Y +"RTN","BMXADOS",128,0) + . Q +"RTN","BMXADOS",129,0) + I DTYPE="F" D Q:'LEN "" Q "T"_LEN_DNAME +"RTN","BMXADOS",130,0) + . S Y=+$P(STG,"K:$L(X)>",2) +"RTN","BMXADOS",131,0) + . S LEN=$E("00000",1,5-$L(Y))_Y +"RTN","BMXADOS",132,0) + . I 'LEN S LEN="00030" +"RTN","BMXADOS",133,0) + . I $G(FLDIEN)=.01 S IFLAG=1 +"RTN","BMXADOS",134,0) + . Q +"RTN","BMXADOS",135,0) + I DTYPE="S" D Q:'LEN "" Q "T"_LEN_DNAME +"RTN","BMXADOS",136,0) + . S X=$P(STG,U,3),Y=0 +"RTN","BMXADOS",137,0) + . F I=1:1:$L(X,":") S Z=$P(X,":",2),Z=$P(Z,";"),%=$L(Z) I %>Y S Y=% +"RTN","BMXADOS",138,0) + . S LEN=$E("00000",1,5-$L(Y))_Y +"RTN","BMXADOS",139,0) + . Q +"RTN","BMXADOS",140,0) + I DTYPE="P" S PFLAG=1 Q "T00030"_DNAME +"RTN","BMXADOS",141,0) + I DTYPE="W" Q "T05000"_DNAME +"RTN","BMXADOS",142,0) + I DTYPE="V" Q "" +"RTN","BMXADOS",143,0) + Q "T00250"_DNAME +"RTN","BMXADOS",144,0) + ; +"RTN","BMXADOS",145,0) +FILE(SIEN) ; GET THE FILE OR SUBFILE NUMBER +"RTN","BMXADOS",146,0) + N FNO,FIEN,DIC,X,Y,%,FILE,NSTG,GBL,FNAME,SUB,FARR,TOT,I +"RTN","BMXADOS",147,0) + S (FILE,FNO)=$P(^BMXADO(SIEN,0),U,2) +"RTN","BMXADOS",148,0) +OLD I FNO D I $G(FIEN) Q FIEN +"RTN","BMXADOS",149,0) + . S NSTG=$O(^DD(FNO,0,"NM","")) +"RTN","BMXADOS",150,0) + . F S FNO=$G(^DD(FNO,0,"UP")) Q:'FNO S NSTG=$O(^DD(FNO,0,"NM",""))_"/"_NSTG +"RTN","BMXADOS",151,0) +OLD1 . W !,$S(NSTG["/":"Sub-",1:""),"File #",FILE," (",NSTG,") is linked to this schema." +"RTN","BMXADOS",152,0) + . W !,"Want to keep it" S %=1 +"RTN","BMXADOS",153,0) + . D YN^DICN I %'=2 W:%=1 " OK" S FIEN=FILE Q +"RTN","BMXADOS",154,0) + . W !!,"If you change or delete this file number,",!,"all the information in this schema will be deleted." +"RTN","BMXADOS",155,0) + . W !,"Are you sure you want to do this" S %=2 D YN^DICN +"RTN","BMXADOS",156,0) + . I %'=1 W !! G OLD1 +"RTN","BMXADOS",157,0) + . S GBL="^BMXADO("_SIEN_")" +"RTN","BMXADOS",158,0) + . K @GBL@(1),@GBL@(2) +"RTN","BMXADOS",159,0) + . S $P(@GBL@(0),U,2)="" +"RTN","BMXADOS",160,0) + . W !,"This schema definition has been deleted. You may redefine it now" +"RTN","BMXADOS",161,0) + . Q +"RTN","BMXADOS",162,0) +NEW S DIC=1,DIC(0)="AEQM" D ^DIC I Y=-1 Q "" +"RTN","BMXADOS",163,0) + S FNO=+Y,FNAME=$P(Y,U,2) +"RTN","BMXADOS",164,0) +NEW1 D SC(.FARR,FNO,1) +"RTN","BMXADOS",165,0) + S TOT=$O(FARR(999999),-1) I 'TOT Q FNO ; NO SUBFILES FOUND +"RTN","BMXADOS",166,0) + W !!,"The ",FNAME," file contains the following sub-file" I TOT>1 W "s" +"RTN","BMXADOS",167,0) + W ! +"RTN","BMXADOS",168,0) + S I=0 F S I=$O(FARR(I)) Q:'I S PAUSE=$$PAUSE(I) Q:PAUSE'="" W I,?3,FARR(I) +"RTN","BMXADOS",169,0) + I $G(PAUSE)=U Q "" +"RTN","BMXADOS",170,0) + I $G(PAUSE) S Y=PAUSE G NEW2 +"RTN","BMXADOS",171,0) + W !!,"Is the schema linked to a sub-file in this list" +"RTN","BMXADOS",172,0) + S %=2 D YN^DICN I %=2 Q FNO +"RTN","BMXADOS",173,0) + S DIR(0)="NO^1:"_TOT_":",DIR("A")="Select a sub-file from the list" K DA D ^DIR K DIR +"RTN","BMXADOS",174,0) + I 'Y Q "" +"RTN","BMXADOS",175,0) +NEW2 Q +$P(FARR(+Y)," (",2) +"RTN","BMXADOS",176,0) + ; +"RTN","BMXADOS",177,0) +PAUSE(I) ; SCROLL CHECK +"RTN","BMXADOS",178,0) + N % +"RTN","BMXADOS",179,0) + W ! +"RTN","BMXADOS",180,0) + I (I#20) Q "" +"RTN","BMXADOS",181,0) + W "Select a number from the list (1-",(I-1),") or press to continue: " +"RTN","BMXADOS",182,0) + R %:$G(DTIME,60) E Q "" +"RTN","BMXADOS",183,0) + I %?1."^" Q U +"RTN","BMXADOS",184,0) + I $L(%),$D(FARR(I)) Q % +"RTN","BMXADOS",185,0) + I $L(%) W " ??" H 2 +"RTN","BMXADOS",186,0) + W $C(13),?79,$C(13) +"RTN","BMXADOS",187,0) + Q "" +"RTN","BMXADOS",188,0) + ; +"RTN","BMXADOS",189,0) +SC(OUT,FILE,MODE) ;EP - SUB CRAWLER. GIVEN A FILE NUMBER RETURN ALL OF ITS DESCENDANT FILES IN AN ARRAY +"RTN","BMXADOS",190,0) + I '$D(^DD(FILE,"SB")) Q ; NO DESCENDANTS +"RTN","BMXADOS",191,0) + N TOT,FNO,FNAME,FIEN,LEVEL,NODE,SARR,STG,X,%,UP,ARR +"RTN","BMXADOS",192,0) + S FIEN=FILE,TOT=0 +"RTN","BMXADOS",193,0) + D PASS1 +"RTN","BMXADOS",194,0) + I '$O(ARR(0)) Q +"RTN","BMXADOS",195,0) +SC2 ; SECOND PASS. BUILD THE INTERMEDIATE ARRAY +"RTN","BMXADOS",196,0) + S FNO=0 F S FNO=$O(ARR(FNO)) Q:'FNO D +"RTN","BMXADOS",197,0) + . I $P($G(^DD(FNO,.01,0)),U,2)["W" K ARR(FNO) Q ; WORD PROCESSING FIELDS DO NOT COUNT +"RTN","BMXADOS",198,0) + . S STG=FNO,UP=FNO +"RTN","BMXADOS",199,0) + . F S UP=$G(^DD(UP,0,"UP")) Q:'UP S STG=UP_","_STG ; BUILD DESCENDANT STRING +"RTN","BMXADOS",200,0) + . I $G(MODE) S STG=$$ASTG(STG) +"RTN","BMXADOS",201,0) + . S STG=$P(STG,",",2,99) ; DONT NEED TOP LEVEL FILE +"RTN","BMXADOS",202,0) + . I '$L(STG) Q ; SOMETHING IS SCREWED UP +"RTN","BMXADOS",203,0) + . S LEVEL=$L(STG,",") +"RTN","BMXADOS",204,0) + . S FNAME=$O(^DD(FNO,0,"NM","")) +"RTN","BMXADOS",205,0) + . S X="SARR("_STG_")" +"RTN","BMXADOS",206,0) + . S @X=FNAME_U_LEVEL_U_FNO +"RTN","BMXADOS",207,0) + . K ARR(FNO) +"RTN","BMXADOS",208,0) + . Q +"RTN","BMXADOS",209,0) +SC3 ; 3RD PASS. BUILD OUTPUT ARAY +"RTN","BMXADOS",210,0) + S NODE="SARR" +"RTN","BMXADOS",211,0) + F S NODE=$Q(@NODE) Q:NODE="" D +"RTN","BMXADOS",212,0) + . S X=@NODE +"RTN","BMXADOS",213,0) + . S TOT=TOT+1 +"RTN","BMXADOS",214,0) + . S FNAME=$P(X,U) +"RTN","BMXADOS",215,0) + . S LEVEL=$P(X,U,2) +"RTN","BMXADOS",216,0) + . S FNO=$P(X,U,3) +"RTN","BMXADOS",217,0) + . S OUT(TOT)=$E(" ",1,LEVEL)_FNAME_" ("_FNO_")" +"RTN","BMXADOS",218,0) + . Q +"RTN","BMXADOS",219,0) + Q +"RTN","BMXADOS",220,0) + ; +"RTN","BMXADOS",221,0) +PASS1 ; PASS 1. BUILD THE ARRAY OF ALL SUBFILES +"RTN","BMXADOS",222,0) + N FNO S FNO=0 +"RTN","BMXADOS",223,0) + F S FNO=$O(^DD(FIEN,"SB",FNO)) Q:'FNO D +"RTN","BMXADOS",224,0) + . S ARR(FNO)="" +"RTN","BMXADOS",225,0) + . I '$D(^DD(FNO,"SB")) Q +"RTN","BMXADOS",226,0) + . N FIEN S FIEN=FNO +"RTN","BMXADOS",227,0) + . D PASS1 ; RECURSION!! +"RTN","BMXADOS",228,0) + . Q +"RTN","BMXADOS",229,0) + Q +"RTN","BMXADOS",230,0) + ; +"RTN","BMXADOS",231,0) +ASTG(STG) ; CONVERT STRING FROM FILE NUMBERS TO FILE NAMES +"RTN","BMXADOS",232,0) + N PCE,LEV,FNO,NAME +"RTN","BMXADOS",233,0) + S LEV=$L(STG,",") +"RTN","BMXADOS",234,0) + F PCE=1:1:LEV S FNO=+$P(STG,",",PCE) D I '$L(STG) Q "" +"RTN","BMXADOS",235,0) + . S NAME=$O(^DD(FNO,0,"NM","")) +"RTN","BMXADOS",236,0) + . I $E(NAME)="*" S NAME=$E(NAME,2,99) +"RTN","BMXADOS",237,0) + . I '$L(NAME) S STG="" Q +"RTN","BMXADOS",238,0) + . S $P(STG,",",PCE)=""""_NAME_"""" +"RTN","BMXADOS",239,0) + . Q +"RTN","BMXADOS",240,0) + Q STG +"RTN","BMXADOS",241,0) + ; +"RTN","BMXADOS",242,0) +FLIST(OUT,FILE,MODE) ;EP - GIVEN A FILE RETURN THE FILEDS IN AN ARRAY MODE=0: NUMERIC ORDER, MODE=1: ALPHA ORDER +"RTN","BMXADOS",243,0) + ; ONLY NON MULTIPLES AND WORD PROCESSING FIELDS ARE LISTED +"RTN","BMXADOS",244,0) + N FLD,TOT,NAME,ARR,SS,%,WP +"RTN","BMXADOS",245,0) + S FLD=0,TOT=0 +"RTN","BMXADOS",246,0) +F1 F S FLD=$O(^DD(FILE,FLD)) Q:'FLD D ; PASS 1 +"RTN","BMXADOS",247,0) + . S STG=$G(^DD(FILE,FLD,0)) I '$L(STG) Q +"RTN","BMXADOS",248,0) + . S %=$P(STG,U,2) +"RTN","BMXADOS",249,0) + . I %,$P($G(^DD(%,.01,0)),U,2)'["W" Q ; EXCLUDE ALL MULTIPLE FIELDS EXCEPT WORD PROCESSING FIELDS +"RTN","BMXADOS",250,0) + . S WP=0 I % S WP=1 +"RTN","BMXADOS",251,0) + . S NAME=$P(STG,U) +"RTN","BMXADOS",252,0) + . S SS=FLD +"RTN","BMXADOS",253,0) + . I $G(MODE)=1 S %=NAME S:$E(%)="*" %=$E(%,2,99) S SS=% +"RTN","BMXADOS",254,0) + . S ARR(SS)=FLD_U_NAME_U_WP +"RTN","BMXADOS",255,0) + . Q +"RTN","BMXADOS",256,0) +F2 S SS="" +"RTN","BMXADOS",257,0) + F S SS=$O(ARR(SS)) Q:SS="" D +"RTN","BMXADOS",258,0) + . S TOT=TOT+1 +"RTN","BMXADOS",259,0) + . S %=ARR(SS) +"RTN","BMXADOS",260,0) + . S OUT(TOT)=$P(%,U,2)_" ["_+%_"]"_$S($P(%,U,3):" (word processing)",1:"") +"RTN","BMXADOS",261,0) + . K ARR(SS) +"RTN","BMXADOS",262,0) + . Q +"RTN","BMXADOS",263,0) + Q +"RTN","BMXADOS",264,0) + ; +"RTN","BMXADOS1") +0^70^B9622665 +"RTN","BMXADOS1",1,0) +BMXADOS1 ; IHS/CIHA/GIS - UPDATE THE BMX ADO SCHEMA FILE GUI VERSION ; +"RTN","BMXADOS1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOS1",3,0) + ; RPC CALLS +"RTN","BMXADOS1",4,0) + ; +"RTN","BMXADOS1",5,0) + ; +"RTN","BMXADOS1",6,0) + ; +"RTN","BMXADOS1",7,0) +DISP(OUT) ; TEMP DISPLAY +"RTN","BMXADOS1",8,0) + N I,X +"RTN","BMXADOS1",9,0) + S I=0 W ! +"RTN","BMXADOS1",10,0) + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X +"RTN","BMXADOS1",11,0) + Q +"RTN","BMXADOS1",12,0) + ; +"RTN","BMXADOS1",13,0) +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN +"RTN","BMXADOS1",14,0) + N IEN +"RTN","BMXADOS1",15,0) + S IEN=$O(^BMXADO("B",NAME,0)) +"RTN","BMXADOS1",16,0) + Q IEN +"RTN","BMXADOS1",17,0) + ; +"RTN","BMXADOS1",18,0) +FILE ; RETURN A LIST OF FILES +"RTN","BMXADOS1",19,0) + N OUT,%,SIEN +"RTN","BMXADOS1",20,0) + S SIEN=$$SCHEMA("FILEMAN FILES") +"RTN","BMXADOS1",21,0) + D SS^BMXADO(.OUT,SIEN,"","B~B~C~") +"RTN","BMXADOS1",22,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOS1",23,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOS1",24,0) + Q +"RTN","BMXADOS1",25,0) + ; +"RTN","BMXADOS1",26,0) +SF ; RETURN A LIST OF SUBFILES +"RTN","BMXADOS1",27,0) + N OUT,%,SIEN +"RTN","BMXADOS1",28,0) + S SIEN=$$SCHEMA("SUBFILES") +"RTN","BMXADOS1",29,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~SFIT~BMXADOS1~2~") +"RTN","BMXADOS1",30,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOS1",31,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOS1",32,0) + Q +"RTN","BMXADOS1",33,0) + ; +"RTN","BMXADOS1",34,0) +FLD ; RETURN LIST OF FIELDS FOR A FILE OR SUBFILE +"RTN","BMXADOS1",35,0) + N OUT,%,SIEN +"RTN","BMXADOS1",36,0) + S SIEN=$$SCHEMA("FIELDS") +"RTN","BMXADOS1",37,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~FLDIT~BMXADOS1~2~") +"RTN","BMXADOS1",38,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOS1",39,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOS1",40,0) + Q +"RTN","BMXADOS1",41,0) + ; +"RTN","BMXADOS1",42,0) +SCH ; RETURN A LIST OF SCHEMAS +"RTN","BMXADOS1",43,0) + N OUT,%,SIEN +"RTN","BMXADOS1",44,0) + S SIEN=$$SCHEMA("SCHEMAS") +"RTN","BMXADOS1",45,0) + D SS^BMXADO(.OUT,SIEN,"","B~~~") +"RTN","BMXADOS1",46,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOS1",47,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOS1",48,0) + Q +"RTN","BMXADOS1",49,0) + ; +"RTN","BMXADOS1",50,0) +SD ; RETURN THE SCHEMA DEFINITION +"RTN","BMXADOS1",51,0) + N OUT,%,SIEN +"RTN","BMXADOS1",52,0) + S SIEN=$$SCHEMA("SCHEMA DEFINITION") +"RTN","BMXADOS1",53,0) + D SS^BMXADO(.OUT,SIEN,"52,","~~~") +"RTN","BMXADOS1",54,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOS1",55,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOS1",56,0) + Q +"RTN","BMXADOS1",57,0) + ; +"RTN","BMXADOS1",58,0) +FLDIT(PARAM,IENS,MAX,OUT,TOT) ; CUSTOM ITERATOR TO DISPLAY FIELDS +"RTN","BMXADOS1",59,0) + N SFARR,CNT,DEL,NUM,NAME,DDT,DLEN,DHDR,DRO,DKEY,DNA,X,Y +"RTN","BMXADOS1",60,0) + D FLIST^BMXADOS(.SFARR,PARAM) +"RTN","BMXADOS1",61,0) + S CNT=0,DEL=" [" +"RTN","BMXADOS1",62,0) + F S CNT=$O(SFARR(CNT)) Q:'CNT D +"RTN","BMXADOS1",63,0) + . S X=SFARR(CNT) I '$L(X) Q +"RTN","BMXADOS1",64,0) + . S NAME=$P(X,DEL) +"RTN","BMXADOS1",65,0) + . ; F Q:$E(NAME)'=" " S NAME=$E(NAME,2,999) +"RTN","BMXADOS1",66,0) + . I '$L(NAME) Q +"RTN","BMXADOS1",67,0) + . S NUM=+$P(X,DEL,2) I 'NUM Q +"RTN","BMXADOS1",68,0) + . S TOT=TOT+1 +"RTN","BMXADOS1",69,0) + . S Y=$$FDEF^BMXADOS(PARAM,NUM) I '$L(Y) Q ; "" +"RTN","BMXADOS1",70,0) + . S DDT=$E(Y),DLEN=+$E(Y,2,6),DHDR=$E(Y,7,99) +"RTN","BMXADOS1",71,0) + . S DRO="NO" S DKEY="NO" S DNA="YES" +"RTN","BMXADOS1",72,0) + . S ^TMP("BMX ADO",$J,TOT)=NUM_U_NAME_U_DDT_U_DLEN_U_DHDR_U_DRO_U_DKEY_U_DNA_$C(30) +"RTN","BMXADOS1",73,0) + Q "" +"RTN","BMXADOS1",74,0) + ; +"RTN","BMXADOS1",75,0) +FNIT(PARAM,IENS,MAX,OUT,TOT) ; CUSTOM ITERATOR TO DISPLAY FILE OR SUBFILE NAME GIVEN FILE NUMBER +"RTN","BMXADOS1",76,0) + N NUM,NAME +"RTN","BMXADOS1",77,0) + S NUM=+PARAM +"RTN","BMXADOS1",78,0) + S NAME="" +"RTN","BMXADOS1",79,0) + Q:'$D(^DD(NUM,0,"NM")) "" +"RTN","BMXADOS1",80,0) + S NAME=$O(^DD(NUM,0,"NM",0)) +"RTN","BMXADOS1",81,0) + S TOT=TOT+1 +"RTN","BMXADOS1",82,0) + S ^TMP("BMX ADO",$J,TOT)=NUM_U_NAME_$C(30) +"RTN","BMXADOS1",83,0) + Q "" +"RTN","BMXADOS1",84,0) + ; +"RTN","BMXADOS1",85,0) +SFIT(PARAM,IENS,MAX,OUT,TOT) ; CUSTOM ITERATOR TO DISPLAY SUBFILES +"RTN","BMXADOS1",86,0) + N SFARR,CNT,DEL,NUM,NAME +"RTN","BMXADOS1",87,0) + D SC^BMXADOS(.SFARR,PARAM) +"RTN","BMXADOS1",88,0) + S CNT=0,DEL=" (" +"RTN","BMXADOS1",89,0) + F S CNT=$O(SFARR(CNT)) Q:'CNT D +"RTN","BMXADOS1",90,0) + . S X=SFARR(CNT) I '$L(X) Q +"RTN","BMXADOS1",91,0) + . S NAME=$P(X,DEL) +"RTN","BMXADOS1",92,0) + . ; F Q:$E(NAME)'=" " S NAME=$E(NAME,2,999) +"RTN","BMXADOS1",93,0) + . I '$L(NAME) Q +"RTN","BMXADOS1",94,0) + . S NUM=+$P(X,DEL,2) I 'NUM Q +"RTN","BMXADOS1",95,0) + . S TOT=TOT+1 +"RTN","BMXADOS1",96,0) + . S ^TMP("BMX ADO",$J,TOT)=NUM_U_NAME_$C(30) +"RTN","BMXADOS1",97,0) + Q "" +"RTN","BMXADOS1",98,0) + ; +"RTN","BMXADOS1",99,0) +SFT(FNAME) ; TRIGGER "YES" TO INDICATE THAT A SUBFILE IS PRESENT WITHIN A FILE +"RTN","BMXADOS1",100,0) + I '$L($G(FNAME)) Q "" +"RTN","BMXADOS1",101,0) + N FIEN +"RTN","BMXADOS1",102,0) + S FIEN=$O(^DIC("B",FNAME,0)) +"RTN","BMXADOS1",103,0) + I 'FIEN Q "" +"RTN","BMXADOS1",104,0) + I '$O(^DD(FIEN,"SB",0)) Q "" +"RTN","BMXADOS1",105,0) + Q "+" +"RTN","BMXADOS1",106,0) + ; +"RTN","BMXADOV") +0^71^B22947698 +"RTN","BMXADOV",1,0) +BMXADOV ; CIHA/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET +"RTN","BMXADOV",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOV",3,0) + ; +"RTN","BMXADOV",4,0) + ; +"RTN","BMXADOV",5,0) + ; +"RTN","BMXADOV",6,0) + ; VSTG = VIEW STRING: SCHEMA NAME OR IEN~DAS~INDEX~START~STOP~MAX~FORMAT~TAG~ROUTINE~PARAM~JOIN +"RTN","BMXADOV",7,0) + ; SCHEMA NAME/IEN: FROM THE BMX ADO SCHEMA FILE +"RTN","BMXADOV",8,0) + ; DAS: THE DA STRING. HIGHEST LEVEL IS FIRST, FOLLOWED BY SUBFILE IENS. CAN BE CONVERTED TO AN 'IENS' STRING. +"RTN","BMXADOV",9,0) + ; IF THE LAST ',' PIECE OF DAS IS DEFINED, THAT IS USED AS THE CURRENT STARTING SEED POINT FOR THE ITERATOR +"RTN","BMXADOV",10,0) + ; THE NEXT INDEX VALUE AFTER THE SEED POINT WILL BE THE FIRST ENTRY SELECTED FOR THE CURRENT TRANSACTION +"RTN","BMXADOV",11,0) + ; INDEX: THE INDEX THAT RUNS THE ITERATOR. IF NULL, THE ITERATOR WULL CYCLE BY IEN +"RTN","BMXADOV",12,0) + ; START: STARTING LOOKUP VALUE IN THE OVERALL ITERATION (THE FIRST VALUE THAT CAN BE USED IN SPECIFIED INDEX) +"RTN","BMXADOV",13,0) + ; STOP: THE LAST LOOKUP VALUE IN THE OVERALL ITERATION (THE LAST VALUE USED IN SPECIFIED INDEX) +"RTN","BMXADOV",14,0) + ; START AND STOP MUST BE IN THE FORMAT (INTERNAL OR EXTERNAL) USED BY THE INDEX +"RTN","BMXADOV",15,0) + ; IF THE INDEX IS ON A POINTER FIELD, AND POINTED TO FILED IS DINUMNED, THEN THE EXTERNAL VALUE CAN BE USED +"RTN","BMXADOV",16,0) + ; MAX: MAXIMUM NUMBER OF ENTRIES REURNED IN THE TRANSACTION +"RTN","BMXADOV",17,0) + ; FORMAT: RETURN INTERNAL OR EXTERNAL VALUES IN THE DATASET +"RTN","BMXADOV",18,0) + ; TAG AND ROUTINE: ENTRY POINT FOR CUSTOM/COMPLEX ITERATION +"RTN","BMXADOV",19,0) + ; PARAM: PARAMETER STRING PASSED TO THE ITERATOR ENTRY POINT. +"RTN","BMXADOV",20,0) + ; ALSO USED WITH THE AA INDEX TO DEFINE PATIENT DFN, V FILE ATTRIBUTE TYPE AND SORT ORDER (C OR R) +"RTN","BMXADOV",21,0) + ; E.G., 1|WT|R COULD BE PATIENT #1, MEASUREMENT TYPE="WEIGHT" AND REVERSE CHRONOLICAL PRESENTATION OF DATA +"RTN","BMXADOV",22,0) + ; JOIN: JOIN INSTRUCTIONS; E.G., ...~2,4,.04|2,5,.07|4,9,SUB" +"RTN","BMXADOV",23,0) + ; +"RTN","BMXADOV",24,0) + ; +"RTN","BMXADOV",25,0) +VIEW(OUT,VSTG,TOT) ; EP-VIEW A DATA SET ; GATEWAY TO ALL ITERATORS +"RTN","BMXADOV",26,0) + ; +"RTN","BMXADOV",27,0) + ; DON'T CALL THIS EP UNLESS YOU WANT DATA RETURNED WITH THE SCHEMA! +"RTN","BMXADOV",28,0) + ; INPUT: VSTG AND THE TOTAL NUMBER OF NODES IN THE SCHEMA ARRAY +"RTN","BMXADOV",29,0) + ; OUTPUT: THE DATA NODES AND THE SEED (SEED IS STUFFED INTO 3RD PIECE OF INTRODUCTORY NODE OF SCHEMA ARRAY) +"RTN","BMXADOV",30,0) + ; RETURNS THE ADO DATASET IN THE ARRAY SPECIFIED BY 'OUT' +"RTN","BMXADOV",31,0) + ; THE SEED IS ALWAYS RETURNED IN 'LDA' REGARDLESS OF WHAT ITERATOR IS USED +"RTN","BMXADOV",32,0) + ; IF ITERATION IS COMPLETED THE SEED WILL HAVE A NULL VALUE +"RTN","BMXADOV",33,0) + ; +"RTN","BMXADOV",34,0) + ; +"RTN","BMXADOV",35,0) + ; +"RTN","BMXADOV",36,0) + N DAS,DA,IX,START,STOP,MAX,FMT,EP,IENS,OREF,CREF,FIEN,TAG,ROUTINE,X,Y,%,PARAM,NUM,FINFO,LIEN,LDA,LFILE,%DT,T +"RTN","BMXADOV",37,0) + S SIEN=+$G(VSTG) I SIEN,'$D(^BMXADO(SIEN,0)) S ERR="Invalid schema IEN" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",38,0) + I $G(TOT)<2 S ERR="Missing schema string" D ERR^BMXADO(ERR) Q ; MUST HAVE A VALID SCHEMA STRING FOR EACH TRANSACTION +"RTN","BMXADOV",39,0) +INIT ; INITIALIZE VARIABLES +"RTN","BMXADOV",40,0) + S T="~" +"RTN","BMXADOV",41,0) + S FIEN=$P(^BMXADO(SIEN,0),U,2) I '$D(^DD(FIEN,0)) S ERR="Invalid file number in schema file" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",42,0) + S DAS=$P(VSTG,T,2),IX=$P(VSTG,T,3) +"RTN","BMXADOV",43,0) + S START=$P(VSTG,T,4),STOP=$P(VSTG,T,5),MAX=$P(VSTG,T,6) +"RTN","BMXADOV",44,0) + I $L(START),$L(STOP),START,START=+START,STOP,STOP=+STOP +"RTN","BMXADOV",45,0) + S %=$T ; NUMERIC START AND STOP +"RTN","BMXADOV",46,0) + I %,START>STOP S ERR="Invalid start stop pair" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",47,0) + I '%,$L(START),$L(STOP),START]STOP S ERR="Invalid start stop pair" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",48,0) + I $L(MAX),(MAX'>0!(MAX'=MAX\1)) S ERR="Invalid MAX parameter" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",49,0) + S FMT=$P(VSTG,T,7),TAG=$P(VSTG,T,8),ROUTINE=$P(VSTG,T,9),PARAM=$P(VSTG,T,10),NUM=0 +"RTN","BMXADOV",50,0) + I $L(TAG),'$L(ROUTINE) S ERR="Invalid EP info" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",51,0) + S EP=TAG_U_ROUTINE I EP=U S EP="" +"RTN","BMXADOV",52,0) + I $L(EP) X ("S %=$L($T("_EP_"))") I '% S ERR="Invalid EP info" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",53,0) + I FMT='"I" S FMT="" +"RTN","BMXADOV",54,0) + I MAX="" S MAX=100 +"RTN","BMXADOV",55,0) + I $G(JOIN) S MAX=999999999 ; MAX IS UNLIMITED FOR SECONDARY DATA SETS DURING JOINS +"RTN","BMXADOV",56,0) + S IENS=$$IENS(DAS) ; CONVERT DA STRING TO IEN STRING ; DAS AND IENS MUST BE AVAILABLE TO ALL ITERATORS +"RTN","BMXADOV",57,0) + S OREF=$$ROOT^DILFD(FIEN,IENS) I '$L(OREF) S ERR="Unable to generate a vaild open reference" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",58,0) + S CREF=$$CREF^DILF(OREF) I '$L(CREF) S ERR="Unable to generate a vaild closed reference" D ERR^BMXADO(ERR) Q +"RTN","BMXADOV",59,0) +DATA ; GET DATA +"RTN","BMXADOV",60,0) +SPEC I $L(EP) D Q ; SPECIAL CASE: USE CUSTOM ITERATOR +"RTN","BMXADOV",61,0) + . I '$G(LDA) S LDA="" +"RTN","BMXADOV",62,0) + . X ("S LDA=$$"_EP_"(PARAM,IENS,MAX,.OUT,.TOT)") +"RTN","BMXADOV",63,0) + . D SEED(LDA) +"RTN","BMXADOV",64,0) + . Q +"RTN","BMXADOV",65,0) + I IX="" S LDA=$$NUMIT^BMXADOV1(+$G(DA)) D SEED(LDA) Q ; NO INDEX USED: ITERATE IN IEN ORDER +"RTN","BMXADOV",66,0) + I IX="AA",FIEN=9000013!(FIEN=9000019) S IX="AC" ; 'AA' ITERATION UNNECESSARY FOR SOME FILES. BETTER TO USE 'AC' +"RTN","BMXADOV",67,0) + I '$L($O(@CREF@(IX,""))) Q ; NO INDEXED DATA AVAILABLE, SO QUIT NOW +"RTN","BMXADOV",68,0) + I IX="AA" D Q ; SPECIAL CASE: AA INDEX +"RTN","BMXADOV",69,0) + . I FIEN=9000011 S LDA=$$AAP^BMXADOV1 Q ; THE AA INDEX FOR 'PROBLEMS'; LDA ALWAYS NULL +"RTN","BMXADOV",70,0) + . S LDA=$$AA^BMXADOV1 D SEED(LDA) ; THE VISIT/V-FILE AA INDEX +"RTN","BMXADOV",71,0) + . Q +"RTN","BMXADOV",72,0) + S FINFO=$$IXFLD(FIEN,IX) I FINFO="" Q ; FILE INFO: IX FIELD NUMBER, TYPE, AND DINUM SUBTYPE +"RTN","BMXADOV",73,0) + I $P(FINFO,U,2)="D" D ; PREP FOR DATE INDEX LOOKUP +"RTN","BMXADOV",74,0) + . I $L(START) S X=START D ^%DT S START=+Y +"RTN","BMXADOV",75,0) + . I $L(STOP) S X=STOP D ^%DT S STOP=+Y +"RTN","BMXADOV",76,0) + . Q +"RTN","BMXADOV",77,0) + I $P(FINFO,U,2)="P",$E(START)="`" D Q ; SPECIAL CASE: SHORTCUT TO POINTER LOOKUP FOR A SINGLE, SPECIFIC IEN. +"RTN","BMXADOV",78,0) + . S LIEN=+$E(START,2,99) +"RTN","BMXADOV",79,0) + . S LDA=$$LOOK^BMXADOV1(LIEN) +"RTN","BMXADOV",80,0) + . D SEED(LDA) +"RTN","BMXADOV",81,0) + . Q +"RTN","BMXADOV",82,0) + I $P(FINFO,U,4) S LFILE=$P(FINFO,U,3) I LFILE D Q ; SPECIAL CASE: DINUM -> TEXT LOOKUP. +"RTN","BMXADOV",83,0) + . S LDA=$$LOOK2^BMXADOV1(LFILE) +"RTN","BMXADOV",84,0) + . D SEED(LDA) +"RTN","BMXADOV",85,0) + . Q +"RTN","BMXADOV",86,0) + S LDA=$$LOOK1^BMXADOV1 ; STD INDEX LOOKUP: START FROM SCRATCH +"RTN","BMXADOV",87,0) + D SEED(LDA) ; CAPTURE RE-ENTRY SEED +"RTN","BMXADOV",88,0) + Q +"RTN","BMXADOV",89,0) + ; +"RTN","BMXADOV",90,0) +SEED(LDA) ; UPDATE THE SCHEMA STRING WITH THE SEED PARAMETER +"RTN","BMXADOV",91,0) + N X,Y +"RTN","BMXADOV",92,0) + S X=@OUT@(1) +"RTN","BMXADOV",93,0) + S Y=$P(X,U) +"RTN","BMXADOV",94,0) + S $P(Y,"|",3)=LDA +"RTN","BMXADOV",95,0) + S $P(X,U,1)=Y +"RTN","BMXADOV",96,0) + S @OUT@(1)=X +"RTN","BMXADOV",97,0) + Q +"RTN","BMXADOV",98,0) + ; +"RTN","BMXADOV",99,0) +IENS(DAS) ;EP - CONVERT DAS STRING TO IENS STRING +"RTN","BMXADOV",100,0) + N I,L,IENS +"RTN","BMXADOV",101,0) + S DAS=$G(DAS) +"RTN","BMXADOV",102,0) + S DAS=$TR(DAS,"+","") +"RTN","BMXADOV",103,0) + S DAS=$TR(DAS,"-","") +"RTN","BMXADOV",104,0) + I '$L(DAS) Q "," +"RTN","BMXADOV",105,0) + I DAS="," S DAS="" +"RTN","BMXADOV",106,0) + S L=$L(DAS,C) +"RTN","BMXADOV",107,0) + S IENS="" +"RTN","BMXADOV",108,0) + F I=L:-1:1 S IENS=IENS_$P(DAS,C,I)_C +"RTN","BMXADOV",109,0) + Q IENS +"RTN","BMXADOV",110,0) + ; +"RTN","BMXADOV",111,0) +IXFLD(FIEN,IX) ;EP - GIVEN AN FILE NUMMER AND INDEX NAME, RETURIN THE FIELD NUMBER, TYPE, AND DINUM SUBTYPE +"RTN","BMXADOV",112,0) + N FLD,TYPES,T,X,I +"RTN","BMXADOV",113,0) + I '$G(FIEN) Q "" +"RTN","BMXADOV",114,0) + I '$L($G(IX)) Q "" +"RTN","BMXADOV",115,0) + S FLD=$O(^DD(FIEN,0,"IX",IX,FIEN,0)) +"RTN","BMXADOV",116,0) + I 'FLD Q FLD +"RTN","BMXADOV",117,0) + S TYPES="DNSFWCPVM",T=$P($G(^DD(FIEN,FLD,0)),U,2) +"RTN","BMXADOV",118,0) + F I=1:1 S X=$E(TYPES,I) Q:'$L(X) I T[X Q +"RTN","BMXADOV",119,0) + I X="P" S X=X_U_+$P(T,"P",2) I $P(^DD(FIEN,FLD,0),U,5)["DINUM" S X=X_U_1 +"RTN","BMXADOV",120,0) + S FLD=FLD_U_X +"RTN","BMXADOV",121,0) + Q FLD +"RTN","BMXADOV",122,0) + ; +"RTN","BMXADOV1") +0^45^B68620559 +"RTN","BMXADOV1",1,0) +BMXADOV1 ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ; +"RTN","BMXADOV1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOV1",3,0) + ; CONTINUATION FILE FOR BMXADOV +"RTN","BMXADOV1",4,0) + ; MANAGES ITERATION FOR INDIVIDUAL INDEX TYPES +"RTN","BMXADOV1",5,0) + ; ASSUMES CERTAIN LOCAL VARS: CREF,FIEN,IENS,DAS (<-THESE CAN'T BE NULL),START,STOP,MAX,TOT,NUM,IX +"RTN","BMXADOV1",6,0) + ; +"RTN","BMXADOV1",7,0) + ; +"RTN","BMXADOV1",8,0) + ; +"RTN","BMXADOV1",9,0) +DATA(IENS,DA,XCNT) ;EP - ADD DATA NODES TO ARRAY +"RTN","BMXADOV1",10,0) + ; ASSUMES THAT VSTG VARIABLES AND THE OUT ARRAY ARE PRESENT +"RTN","BMXADOV1",11,0) + I '$G(DA) Q +"RTN","BMXADOV1",12,0) + I '$L(IENS) Q +"RTN","BMXADOV1",13,0) + S $P(IENS,C)=DA +"RTN","BMXADOV1",14,0) + N STG,X,Y,%,FLD,STOP,VAL,CNT,FIEN,LINE,IFLAG,IDEP,TFLD,TNO,TEF +"RTN","BMXADOV1",15,0) + S STG=DA +"RTN","BMXADOV1",16,0) + I $G(DAS),$E(DAS,$L(DAS))="," S STG=$TR(DAS,",",U)_STG ; FIX FOR SUBFILE +"RTN","BMXADOV1",17,0) + S CNT=$L(IENS,",") ; START AFTER THE .001 FIELD +"RTN","BMXADOV1",18,0) + I $G(SUB) S STG=$P(IENS,C,2)_U_DA ; MAKE DAS FOR A SUBFILE. THIS WILL BE THE IST PIECE OF THE DATA STRING +"RTN","BMXADOV1",19,0) + I $G(XCNT) S CNT=XCNT ; USED WITH JOINS +"RTN","BMXADOV1",20,0) + F S CNT=$O(@OUT@(CNT)) Q:'CNT Q:$G(STOP) D I @OUT@(CNT)[$C(30) Q ; LOOP TO CREATE THE DATA STRING +"RTN","BMXADOV1",21,0) + . K IFLAG,IDEP +"RTN","BMXADOV1",22,0) + . S FIEN=+@OUT@(CNT) I '$D(^DD(FIEN,0)) S STOP=1 Q +"RTN","BMXADOV1",23,0) + . S FLD=$P(@OUT@(CNT),B,2) +"RTN","BMXADOV1",24,0) + . I FLD=".01ID" D Q ; PROCESS THE IDENTIFIER FIELD +"RTN","BMXADOV1",25,0) + .. I '$G(SIEN) Q +"RTN","BMXADOV1",26,0) + .. S %=$O(^BMXADO(SIEN,1,"B",".01ID",0)) I '% Q +"RTN","BMXADOV1",27,0) + .. S IDEP=$G(^BMXADO(SIEN,1,%,1)) I '$L(IDEP) Q +"RTN","BMXADOV1",28,0) + .. X ("S VAL=$$"_IDEP_"("_+STG_")") ; PASS THE DA TO THE IDENTIFIER EXTRINSIC FUNCTION, RETURN IDENTIFIERS +"RTN","BMXADOV1",29,0) + .. S VAL=$TR(VAL,"^",""),VAL=$TR(VAL,B,"") +"RTN","BMXADOV1",30,0) + .. S STG=STG_U_VAL +"RTN","BMXADOV1",31,0) + .. Q +"RTN","BMXADOV1",32,0) + . I $G(SIEN),FLD S %=$O(^BMXADO(SIEN,1,"B",FLD,0)) I %,$P($G(^BMXADO(SIEN,1,%,0)),U,9) S IFLAG=1 ; SCHEMA FILE SAYS FORCE INTERNAL VALUE FOR THIS FIELD +"RTN","BMXADOV1",33,0) + . K TFLD +"RTN","BMXADOV1",34,0) + . I FLD["TRIGGER" S TFLD=FLD,FLD=+FLD,IFLAG=1 +"RTN","BMXADOV1",35,0) + . I FLD["IEN" S FLD=+FLD,IFLAG=1 ; LOOKUP VALUE FIELD (IEN) +"RTN","BMXADOV1",36,0) + . I '$D(^DD(FIEN,FLD,0)),FLD'=.001 S STOP=1 Q +"RTN","BMXADOV1",37,0) + . I $D(TFLD),FLD=.001 S VAL=+IENS +"RTN","BMXADOV1",38,0) + . E S VAL=$$GET1^DIQ(FIEN,IENS,FLD,$S($G(IFLAG):"I",$G(TFLAG):"I",1:$G(FMT))) +"RTN","BMXADOV1",39,0) + . I $G(TFLD) D S STG=STG_U_VAL Q ; GENERATE A TRIGGERED VALUE FOR THIS FIELD +"RTN","BMXADOV1",40,0) + .. S TNO=$O(^BMXADO(SIEN,1,"B",TFLD,0)) I 'TNO S VAL="" Q +"RTN","BMXADOV1",41,0) + .. S TEF=$G(^BMXADO(SIEN,1,TNO,3)) I '$L(TEF) S VAL="" Q ; GET EXTR FUNCT THAT GENERATES A SECONDARY VALUE +"RTN","BMXADOV1",42,0) + .. X ("S VAL=$$"_TEF_"(VAL)") +"RTN","BMXADOV1",43,0) + .. Q +"RTN","BMXADOV1",44,0) + . I FLD=.01,VAL="" S STOP=1 Q ; INVALID FILEMAN ENTRY! SKIP IT +"RTN","BMXADOV1",45,0) + . S VAL=$TR(VAL,"^",""),VAL=$TR(VAL,B,"") +"RTN","BMXADOV1",46,0) + . S STG=STG_U_VAL +"RTN","BMXADOV1",47,0) + . Q +"RTN","BMXADOV1",48,0) + I $G(STOP) Q ; DON'T ADD NODE IF DD INFO IS INVALID +"RTN","BMXADOV1",49,0) + F S LINE=$E(STG,1,250),STG=$E(STG,251,999999) D I '$L(STG) Q ; PREVENTS DATA LENGTH FROM EXCEEDING 250 BYTES +"RTN","BMXADOV1",50,0) + . S TOT=TOT+1 +"RTN","BMXADOV1",51,0) + . I '$L(STG) S LINE=LINE_$C(30),NUM=NUM+1 ; END OF RECORD, RECORD TOTAL IS UPDATED +"RTN","BMXADOV1",52,0) + . S @OUT@(TOT)=LINE ; NODE IS ADDED +"RTN","BMXADOV1",53,0) + . Q +"RTN","BMXADOV1",54,0) + Q +"RTN","BMXADOV1",55,0) + ; +"RTN","BMXADOV1",56,0) +NUMIT(DA) ; EP-ITERATE BY NUMBER +"RTN","BMXADOV1",57,0) + N XIT,LDA +"RTN","BMXADOV1",58,0) + I IENS S DA=+IENS ; RE-ENTRY FROM SEED +"RTN","BMXADOV1",59,0) + I '$G(DA),$G(START) S DA=START-1 +"RTN","BMXADOV1",60,0) + I '$G(DA) S DA=0 +"RTN","BMXADOV1",61,0) + S LDA="" +"RTN","BMXADOV1",62,0) + F S DA=$O(@CREF@(DA)) D I $G(XIT) Q +"RTN","BMXADOV1",63,0) + . I 'DA S XIT=1,LDA="" Q ; NO MORE IENS - THE END OF THE LINE +"RTN","BMXADOV1",64,0) + . D DATA(IENS,DA,+$G(XCNT)) +"RTN","BMXADOV1",65,0) + . I $G(STOP),$O(@CREF@(DA))>STOP S LDA="",XIT=1 Q ; AS FAR AS YOU ARE ALLOWED TO GO FOR NUMBER ITERATION +"RTN","BMXADOV1",66,0) + . I NUM=MAX S LDA=DA,XIT=1 Q ; REACHED THE MAX TRANSACTION LIMIT - GET MORE NEXT TIME +"RTN","BMXADOV1",67,0) + . Q +"RTN","BMXADOV1",68,0) + I LDA,'$O(@CREF@(LDA)) S LDA="" ; END OF THE LINE SO SET LDA TO NULL +"RTN","BMXADOV1",69,0) + Q LDA +"RTN","BMXADOV1",70,0) + ; +"RTN","BMXADOV1",71,0) +LOOK(LIEN) ; EP-ITERATE BY A SINGLE STANDARD INDEX THAT IS A POINTER VALUE +"RTN","BMXADOV1",72,0) + N XIT,LDA +"RTN","BMXADOV1",73,0) + S DA=+IENS +"RTN","BMXADOV1",74,0) + F S DA=$O(@CREF@(IX,LIEN,DA)) D I $G(XIT) Q +"RTN","BMXADOV1",75,0) + . I 'DA S XIT=1,LDA="" Q ; NO MORE IENS - THE END OF THE LINE +"RTN","BMXADOV1",76,0) + . D DATA(IENS,DA,$G(XCNT)) +"RTN","BMXADOV1",77,0) + . I NUM=MAX S LDA=DA,XIT=1 Q ; REACHED THE MAX TRANSACTION LIMIT - GET MORE NEXT TIME +"RTN","BMXADOV1",78,0) + . Q +"RTN","BMXADOV1",79,0) + I '$O(@CREF@(IX,LIEN,DA)) Q "" +"RTN","BMXADOV1",80,0) + Q LDA +"RTN","BMXADOV1",81,0) + ; +"RTN","BMXADOV1",82,0) +LOOK1() ; EP-ITERATE USING A STANDARD INDEX +"RTN","BMXADOV1",83,0) + N XIT,LDA,VAL,DA,% +"RTN","BMXADOV1",84,0) + S DA=+IENS I 'DA G SCRATCH ; CHECK FOR RE-RENTRY +"RTN","BMXADOV1",85,0) +REENTER ; RE-ENTER STD ITERATION USING DA AS THE SEED +"RTN","BMXADOV1",86,0) + S %=$$IXVAL(FIEN,IX,DAS) I '$L(%) Q "" ; GET STARTUP INFO +"RTN","BMXADOV1",87,0) +LR S VAL=$P(%,B,3) +"RTN","BMXADOV1",88,0) + I VAL="" Q "" ; NO VAL FOUND FOR INITIAL ITERATION, SO QUIT +"RTN","BMXADOV1",89,0) + F S DA=$O(@CREF@(IX,VAL,DA)) Q:'DA D DATA(IENS,DA,+$G(XCNT)) I NUM=MAX S LDA=DA,XIT=1 Q ; SWEEP UP ALL THE REMAINING DAS UNDER THE CURRENT VALUE +"RTN","BMXADOV1",90,0) + I $G(XIT) Q:'$O(@CREF@(IX,VAL,LDA)) "" Q LDA ; IF NO MORE AFTER MAX, SET LDA = NULL +"RTN","BMXADOV1",91,0) + G LOOK1R ; SEED IS DEFINED +"RTN","BMXADOV1",92,0) +SCRATCH S VAL="" ; STD LOOKUP STARTING FROM SCRATCH +"RTN","BMXADOV1",93,0) + I $L(START) S VAL=$O(@CREF@(IX,START),-1) ; GET SEED FOR ITERATION +"RTN","BMXADOV1",94,0) +LOOK1R F S VAL=$O(@CREF@(IX,VAL)) D I $G(XIT) Q ; EP - RE-ENTRY POINT IF SEED IS DEFINED +"RTN","BMXADOV1",95,0) + . I VAL="" S LDA="",XIT=1 Q ; END OF THE LINE +"RTN","BMXADOV1",96,0) + . I STOP=+STOP,VAL=+VAL,VAL>STOP S LDA="",XIT=1 Q +"RTN","BMXADOV1",97,0) + . I $L(STOP),VAL]STOP S LDA="",XIT=1 Q ; LOOKUP LIMITS +"RTN","BMXADOV1",98,0) + . S DA=0 +"RTN","BMXADOV1",99,0) + . F S DA=$O(@CREF@(IX,VAL,DA)) Q:'DA D I $G(XIT) Q +"RTN","BMXADOV1",100,0) + .. D DATA(IENS,DA,+$G(XCNT)) +"RTN","BMXADOV1",101,0) + .. I NUM=MAX S LDA=DA,XIT=1 D ; TRANSACTION LIMIT ; CHECK FOR MORE +"RTN","BMXADOV1",102,0) + ... I $O(@CREF@(IX,VAL,DA)) Q +"RTN","BMXADOV1",103,0) + ... S %=$O(@CREF@(IX,VAL)) I %="" S LDA="" Q +"RTN","BMXADOV1",104,0) + ... I $L(STOP),%]STOP S LDA="" Q +"RTN","BMXADOV1",105,0) + ... I '$O(@CREF@(IX,%,0)) S LDA="" Q +"RTN","BMXADOV1",106,0) + ... Q +"RTN","BMXADOV1",107,0) + .. Q +"RTN","BMXADOV1",108,0) + . Q +"RTN","BMXADOV1",109,0) + Q LDA +"RTN","BMXADOV1",110,0) + ; +"RTN","BMXADOV1",111,0) +LOOK2(LFILE) ; EP-TEXT POINTER LOOKUP +"RTN","BMXADOV1",112,0) + ; CHANGE THE GLOBAL REFERENCE FOR THE LOOKUP TO THE POINTED-TO FILE BEFORE PROCEEDING +"RTN","BMXADOV1",113,0) + N XIT,LDA,OREF,CREF,VAL,DA +"RTN","BMXADOV1",114,0) + S OREF=$$ROOT^DILFD(LFILE,IENS) I '$L(OREF) Q "" +"RTN","BMXADOV1",115,0) + S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" +"RTN","BMXADOV1",116,0) + S DA=+IENS +"RTN","BMXADOV1",117,0) + I '$G(DA) G SCRATCH ; START FROM SCRATCH +"RTN","BMXADOV1",118,0) + S %=$$IXVAL(LFILE,IX,DAS) I '$L(%) Q "" +"RTN","BMXADOV1",119,0) + G LR ; RE-ENTER +"RTN","BMXADOV1",120,0) + ; +"RTN","BMXADOV1",121,0) +IXVAL(FIEN,IX,DAS) ; GIVEN A FILE IEN, INDEX NAME, AND DAS STRING, RETURN THE VALUE USED IN THE INDEX +"RTN","BMXADOV1",122,0) + N DA,FLD,IENS,OREF,CREF,XREF,VAL,UP,LEV,L +"RTN","BMXADOV1",123,0) + I '$D(^DD(+$G(FIEN),0)) Q "" ; MISSING OR INVALID FILE NUMBER +"RTN","BMXADOV1",124,0) + I '$L($G(IX)) Q "" ; NO INDEX SPECIFIED +"RTN","BMXADOV1",125,0) + S UP=FIEN F LEV=1:1 S UP=$G(^DD(UP,0,"UP")) Q:'UP +"RTN","BMXADOV1",126,0) + I LEV'=$L(DAS,C) Q "" ; DAS LEVELS MUST MATCH FILE OR SUBFILE LEVEL +"RTN","BMXADOV1",127,0) + S IENS=$$IENS^BMXADOV($G(DAS)) I IENS=U Q "" +"RTN","BMXADOV1",128,0) + S OREF=$$ROOT^DILFD(FIEN,IENS) I '$L(OREF) Q "" +"RTN","BMXADOV1",129,0) + S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" +"RTN","BMXADOV1",130,0) + I '$D(@CREF@(IX)) Q CREF_"||" ; NO INDEX VALUES TO CHECK +"RTN","BMXADOV1",131,0) + S XREF=OREF_IX_")" +"RTN","BMXADOV1",132,0) + S DA=+IENS I 'DA Q CREF_"||" +"RTN","BMXADOV1",133,0) + I '$D(@CREF@(DA)) Q CREF_"||" ; NO ENTRY EXISTS +"RTN","BMXADOV1",134,0) + I IX="AA" G AA +"RTN","BMXADOV1",135,0) + S FLD=+$$IXFLD^BMXADOV(FIEN,IX) I 'FLD Q "" ; INVALID DD +"RTN","BMXADOV1",136,0) + S VAL=$$GET1^DIQ(FIEN,IENS,FLD,"I") I VAL="" Q "" ; VALUE IS NULL - NOTHING TO INDEX +"RTN","BMXADOV1",137,0) + I '$D(@CREF@(IX,VAL,DA)) Q "" ; INVALID INDEX +"RTN","BMXADOV1",138,0) + Q XREF_B_DA_B_VAL +"RTN","BMXADOV1",139,0) + ; +"RTN","BMXADOV1",140,0) +AA() ;EP - VISIT/V-FILE ITERATION USING THE 'AA' INDEX +"RTN","BMXADOV1",141,0) + N LDA,XIT,AAINFO,DA,%,X,Y,DFN,TYPE,ORD,ISTART,ISTOP,IDT,AAREF,%DT,DIC +"RTN","BMXADOV1",142,0) + S X=OREF_"""AA"")",%=$Q(@X) I %="" Q "" +"RTN","BMXADOV1",143,0) + S TYPE="" I $L(%,C)=5 S TYPE=$P(PARAM,B,2) I TYPE="" Q "" ; FOR CERTAIN V FILES, TYPE MUST BE DEFINED +"RTN","BMXADOV1",144,0) + I $E(TYPE)="`" S TYPE=$E(TYPE,2,99) I 'TYPE Q "" ; REMOVE ` FROM TYPE IEN +"RTN","BMXADOV1",145,0) + I $L(TYPE),'TYPE D I TYPE'>0 Q "" ; QUIT IF INVALID TYPE +"RTN","BMXADOV1",146,0) + . S %=$P($G(^DD(FIEN,.01,0)),U,2) +"RTN","BMXADOV1",147,0) + . S DIC=+$P(%,"P",2) I '$D(^DD(DIC,.01,0)) Q +"RTN","BMXADOV1",148,0) + . S X=TYPE,DIC(0)="M" D ^DIC I Y=-1 Q +"RTN","BMXADOV1",149,0) + . S TYPE=+Y +"RTN","BMXADOV1",150,0) + . Q +"RTN","BMXADOV1",151,0) + S DFN=+PARAM +"RTN","BMXADOV1",152,0) + I '$D(^DPT(DFN,0)) Q "" ; PATIENT DFN MUST BE DEFINED +"RTN","BMXADOV1",153,0) + I 'TYPE S AAREF=OREF_"""AA"","_DFN_")" +"RTN","BMXADOV1",154,0) + E S AAREF=OREF_"""AA"","_DFN_","_TYPE_")" +"RTN","BMXADOV1",155,0) + I '$D(@AAREF) Q "" ; IF NOTHING UNDER AA INDEX, DON'T BOTHER LOOKING +"RTN","BMXADOV1",156,0) + S ISTART=9999999 I START S X=START,%DT="P" D ^%DT S ISTART=9999999-Y +"RTN","BMXADOV1",157,0) + S ISTOP=0 I STOP S X=STOP,%DT="P" D ^%DT S ISTOP=9999999-Y +"RTN","BMXADOV1",158,0) + S ORD=-1 I $P(PARAM,B,$L(PARAM,B))="R" S ORD=1 ; SORT IN CHRONOLOGICAL OR REVERSE CHRONOLOGICAL ORDER +"RTN","BMXADOV1",159,0) + I ORD=-1 S X=$G(ISTART),Y=$G(ISTOP),ISTOP=X,ISTART=Y ; CHANGES REQUIRED TO PRESENT DATA IN CHRONOLIGICAL ORDER +"RTN","BMXADOV1",160,0) + S IDT=0,LDA="" +"RTN","BMXADOV1",161,0) + I ISTOP S IDT=ISTOP-.0000001 +"RTN","BMXADOV1",162,0) + S DA=+IENS +"RTN","BMXADOV1",163,0) + I DA S IDT=$$AAR I 'IDT Q LDA ; SWEEP UP REMAINING IENS FOR CURRENT IDT AND RESET IDT FOR RE-ENTRY +"RTN","BMXADOV1",164,0) + F S IDT=$O(@AAREF@(IDT),ORD) Q:'IDT D I $G(XIT) Q +"RTN","BMXADOV1",165,0) + . I ORD=1,IDT>ISTART S LDA="",XIT=1 Q +"RTN","BMXADOV1",166,0) + . I ORD=-1,IDTDATE S DATE=+X,MAX=DA +"RTN","BMXADOV2",16,0) + . Q +"RTN","BMXADOV2",17,0) + I 'MAX Q "" +"RTN","BMXADOV2",18,0) + S DA=MAX +"RTN","BMXADOV2",19,0) + D DATA^BMXADOV1(IENS,DA) +"RTN","BMXADOV2",20,0) + Q "" +"RTN","BMXADOV2",21,0) + ; +"RTN","BMXADOV2",22,0) +MCDIEN(DFN) ; EP-GIVEN A PATIENT IEN, RETRUN THE IEN OF THAT PT'S MOST RECENT RECORD IN MEDICAID ELIGIBILITY FILE +"RTN","BMXADOV2",23,0) + N MIEN,DA,DATE,MAX,X +"RTN","BMXADOV2",24,0) + S DFN=+$G(DFN),MAX="",DATE=0 +"RTN","BMXADOV2",25,0) + S MIEN=0 F S MIEN=$O(^AUPNMCD("B",DFN,MIEN)) Q:'MIEN D +"RTN","BMXADOV2",26,0) + . S DA=0 F S DA=$O(^AUPNMCD(MIEN,11,DA)) Q:'DA D +"RTN","BMXADOV2",27,0) + .. S X=+$P($G(^AUPNMCD(MIEN,11,DA,0)),U,2) +"RTN","BMXADOV2",28,0) + .. I X>DATE S DATE=X,MAX=MIEN +"RTN","BMXADOV2",29,0) + .. Q +"RTN","BMXADOV2",30,0) + . Q +"RTN","BMXADOV2",31,0) + Q MAX +"RTN","BMXADOV2",32,0) + ; +"RTN","BMXADOV2",33,0) +MEDICAID(PARAM,IENS,MAX,OUT,TOT) ; +"RTN","BMXADOV2",34,0) + ; NO PARAM REQUIRED BUT SINCE THIS IS A SUBFILE, THE PATIENT IEN MUST BE IH IENS +"RTN","BMXADOV2",35,0) + ; FETCHES THE MOST RECENT MEDICARE RECORD FOR THE PATIENT +"RTN","BMXADOV2",36,0) + N MIEN,DA,X,Y,%,LIM,DATE,MAX +"RTN","BMXADOV2",37,0) + S LIM=DT-10000,DA=0,DATE=0,MAX=0 +"RTN","BMXADOV2",38,0) + S MIEN=$P(IENS,C,2) I 'MIEN Q "" +"RTN","BMXADOV2",39,0) + F S DA=$O(^AUPNMCD(MIEN,11,DA)) Q:'DA D +"RTN","BMXADOV2",40,0) + . S X=$G(^AUPNMCD(MIEN,11,DA,0)) +"RTN","BMXADOV2",41,0) + . I +X>DATE S DATE=+X,MAX=DA +"RTN","BMXADOV2",42,0) + . Q +"RTN","BMXADOV2",43,0) + I 'MAX Q "" +"RTN","BMXADOV2",44,0) + S DA=MAX +"RTN","BMXADOV2",45,0) + D DATA^BMXADOV1(IENS,DA) +"RTN","BMXADOV2",46,0) + Q "" +"RTN","BMXADOV2",47,0) + ; +"RTN","BMXADOV2",48,0) +PT(VAL,IENS,MAX,OUT,TOT) ; EP - PATIENT LOOKUP ; GIVEN A LOOKUP VALUE, GENERATE A LIST OF PATIENTS +"RTN","BMXADOV2",49,0) + N DFN,BMXNOID,DA,X,Y,%,LIM,FILE,NUM,IXS,GBL,CNT,SS +"RTN","BMXADOV2",50,0) + I $G(VAL)="" Q "" +"RTN","BMXADOV2",51,0) + S BMXNOID=1 +"RTN","BMXADOV2",52,0) + I '$G(MAX) S MAX=999 +"RTN","BMXADOV2",53,0) + I $G(^DD("2","0","ID","IHS0"))="D ^AUPNLKID" S ^("IHS0")="D:'$G(BMXNOID) ^AUPNLKID" ; MUST BE A SILENT CALL +"RTN","BMXADOV2",54,0) + S SS="BMX DFN2",GBL=$NA(^TMP(SS,$J)) K @GBL +"RTN","BMXADOV2",55,0) + S CNT=0,DFN=0 +"RTN","BMXADOV2",56,0) + F S DFN=$O(^AUPNPAT("D",VAL,DFN)) Q:'DFN S CNT=CNT+1 S @GBL@("DILIST",2,CNT)=DFN ; FIRST, TRY TO MATCH CHART NUMBER +"RTN","BMXADOV2",57,0) + I CNT G PTIT +"RTN","BMXADOV2",58,0) + I VAL?3N1"-"2N1"-"4N S VAL=$TR(VAL,"-","") ; TRANSFORM SSN +"RTN","BMXADOV2",59,0) + I VAL?9N G PT1 +"RTN","BMXADOV2",60,0) + S %=$L(VAL),X=$E(VAL,%-1,%) +"RTN","BMXADOV2",61,0) + I X?2N S X=VAL,%DT="P" D ^%DT S VAL=Y ; TRANSFORM DATE TO INTERNAL VALUE +"RTN","BMXADOV2",62,0) +PT1 K @GBL S SS="BMX DFN1",GBL=$NA(^TMP(SS,$J)) K @GBL +"RTN","BMXADOV2",63,0) + D FIND^DIC(2,"","","",VAL,999,"B^ADOB^SSN","","",GBL,"") +"RTN","BMXADOV2",64,0) + I '$D(^TMP(SS,$J,"DILIST",2)) Q "" ; UNSUCCESSFUL LOOKUP +"RTN","BMXADOV2",65,0) +PTIT ; ITERATE +"RTN","BMXADOV2",66,0) + S CNT=0,NUM=0 +"RTN","BMXADOV2",67,0) + F S CNT=$O(^TMP(SS,$J,"DILIST",2,CNT)) Q:'CNT S DA=^(CNT) I DA D DATA^BMXADOV1(IENS,DA) +"RTN","BMXADOV2",68,0) + I $G(^DD("2","0","ID","IHS0"))="D:'$G(BMXNOID) ^AUPNLKID" S ^("IHS0")="D ^AUPNLKID" ; RESTORE DD NODE +"RTN","BMXADOV2",69,0) + ; K @GBL ; CLEANUP +"RTN","BMXADOV2",70,0) + Q "" +"RTN","BMXADOV2",71,0) + ; +"RTN","BMXADOV2",72,0) +HRN(DFN) ; EP - GIVEN A PATIENT DFN, RETURN THE LOCAL CHART NUMBER +"RTN","BMXADOV2",73,0) + Q $P($G(^AUPNPAT(+$G(DFN),41,+$G(DUZ(2)),0)),U,2) +"RTN","BMXADOV2",74,0) + ; +"RTN","BMXADOV2",75,0) +PVTINS ; +"RTN","BMXADOV2",76,0) + ; NO PARAM REQUIRED BUT SINCE THIS IS A SUBFILE, THE PATIENT IEN MUST BE IH IENS +"RTN","BMXADOV2",77,0) + N DFN,DA,X,Y,%,LIM +"RTN","BMXADOV2",78,0) + S LIM=DT-10000,DA=0 +"RTN","BMXADOV2",79,0) + S DFN=$P(IENS,C,2) I 'DFN Q "" +"RTN","BMXADOV2",80,0) + F S DA=$O(^AUPNPRVT(DFN,11,DA)) Q:'DA D +"RTN","BMXADOV2",81,0) + . S X=$G(^AUPNPRVT(DFN,11,DA,0)) +"RTN","BMXADOV2",82,0) + . I '$L(X) Q +"RTN","BMXADOV2",83,0) + . S %=$P(X,U,7) +"RTN","BMXADOV2",84,0) + . I '%!(%>LIM) D DATA^BMXADOV1(IENS,DA) +"RTN","BMXADOV2",85,0) + . Q +"RTN","BMXADOV2",86,0) + Q "" +"RTN","BMXADOV2",87,0) + ; +"RTN","BMXADOV2",88,0) +DUPV(PARAM,IENS,MAX,OUT,TOT) ; EP - DUPLICATE VISIT ITERATION +"RTN","BMXADOV2",89,0) + ; PARAM: 'DFN|VISIT TIMESTAMP|TYPE|LOCATION|CATEGORY +"RTN","BMXADOV2",90,0) + ; PATIENT DFN AND VISIT TIMESTAMP (EXTERNAL DATE FORMAT) MUST EXIST. +"RTN","BMXADOV2",91,0) + ; THE OTHER 3 DUP PARAMETERS WILL BE CHECKED ONLY IF THEY ARE DEFINED. +"RTN","BMXADOV2",92,0) + ; ALL DUPS ARE RETURNED. MAX,START,STOP ARE IGNORED +"RTN","BMXADOV2",93,0) + N DFN,TIME,TYPE,LOC,CAT,IDT,VIEN,DAY,X,PATIENT,Y,%DT,FMTIME,DA,IENS +"RTN","BMXADOV2",94,0) + S DFN=+PARAM,TIME=$P(PARAM,B,2),TYPE=$P(PARAM,B,3),LOC=$P(PARAM,B,4),CAT=$P(PARAM,B,5) +"RTN","BMXADOV2",95,0) + I $D(^DPT(+$G(DFN),0)),$L($G(TIME)) +"RTN","BMXADOV2",96,0) + E Q "" +"RTN","BMXADOV2",97,0) + S X=TIME,%DT="T" D ^%DT I Y=-1 Q +"RTN","BMXADOV2",98,0) + S FMTIME=Y +"RTN","BMXADOV2",99,0) + S (IDT,DAY)=9999999-(FMTIME\1),IDT=IDT-.0000001 +"RTN","BMXADOV2",100,0) + F S IDT=$O(^AUPNVSIT("AA",DFN,IDT)) Q:$E(IDT,1,7)'=DAY S VIEN=999999999999 F S VIEN=$O(^AUPNVSIT("AA",DFN,IDT,VIEN),-1) Q:'VIEN D +"RTN","BMXADOV2",101,0) + . S X=$G(^AUPNVSIT(VIEN,0)) I '$L(X) Q ; VISIT DATA MUST EXIT +"RTN","BMXADOV2",102,0) + . I $P(X,U,11) Q ; MUST BE AN 'ACTIVE' VISIT - NOT 'DELETED' +"RTN","BMXADOV2",103,0) + . I $L(TYPE),TYPE'=$P(X,U,3) Q +"RTN","BMXADOV2",104,0) + . I $L(LOC),LOC'=$P(X,U,6) Q +"RTN","BMXADOV2",105,0) + . I $L(CAT),CAT'=$P(X,U,7) Q +"RTN","BMXADOV2",106,0) + . S DA=VIEN,IENS=DA_C +"RTN","BMXADOV2",107,0) + . D DATA^BMXADOV1(IENS,DA) +"RTN","BMXADOV2",108,0) + . Q +"RTN","BMXADOV2",109,0) + Q "" +"RTN","BMXADOV2",110,0) + ; +"RTN","BMXADOV2",111,0) +DAIT(DSTG,IENS,MAX,OUT,TOT) ; EP - SET OF IENS ITERATION. +"RTN","BMXADOV2",112,0) + ; THE DSTG CONTAINS A "|" SET OF DAS STRINGS +"RTN","BMXADOV2",113,0) + ; ALL VALUES ARE RETURNED. MAX IS NOT CHECKED. START AND STOP ARE IRRELEVANT +"RTN","BMXADOV2",114,0) + N PCE,DA,XIT,IENS,L,DAS +"RTN","BMXADOV2",115,0) + S L=$L(DSTG,B) +"RTN","BMXADOV2",116,0) + F PCE=1:1:L S DAS=$P(DSTG,B,PCE) D I $G(XIT) Q +"RTN","BMXADOV2",117,0) + . I 'DAS S XIT=1 Q ; NO MORE IENS - THE END OF THE LINE +"RTN","BMXADOV2",118,0) + . I DAS'[C S IENS=DAS_C +"RTN","BMXADOV2",119,0) + . E S IENS=$$IENS^BMXADOV(DAS) +"RTN","BMXADOV2",120,0) + . S DA=+IENS +"RTN","BMXADOV2",121,0) + . D DATA^BMXADOV1(IENS,DA) +"RTN","BMXADOV2",122,0) + . Q +"RTN","BMXADOV2",123,0) + Q "" +"RTN","BMXADOV2",124,0) + ; +"RTN","BMXADOV2",125,0) +APRV(PARAM,IENS,MAX,OUT,TOT) ; EP - RETURN A LIST OF ALL ACTIVE PROVIDERS +"RTN","BMXADOV2",126,0) + ; ALL VALUES ARE RETURNED. MAX IS NOT CHECKED. START AND STOP ARE IRRELEVANT +"RTN","BMXADOV2",127,0) + N NAME,DA,STG +"RTN","BMXADOV2",128,0) + S NAME="" +"RTN","BMXADOV2",129,0) + F S NAME=$O(^VA(200,"B",NAME)) Q:NAME="" D +"RTN","BMXADOV2",130,0) + . S DA=0 +"RTN","BMXADOV2",131,0) + . F S DA=$O(^VA(200,"B",NAME,DA)) Q:'DA D +"RTN","BMXADOV2",132,0) + .. I $P($G(^VA(200,DA,"PS")),U,4) Q ; CHECK INACTIVE DATE FIELD +"RTN","BMXADOV2",133,0) + .. D DATA^BMXADOV1(IENS,DA) +"RTN","BMXADOV2",134,0) + .. Q +"RTN","BMXADOV2",135,0) + . Q +"RTN","BMXADOV2",136,0) + Q "" +"RTN","BMXADOV2",137,0) + ; +"RTN","BMXADOVJ") +0^73^B8677686 +"RTN","BMXADOVJ",1,0) +BMXADOVJ ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ; +"RTN","BMXADOVJ",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOVJ",3,0) + ; THIS ROUTINE MANAGES THE JOINS +"RTN","BMXADOVJ",4,0) + ; +"RTN","BMXADOVJ",5,0) + ; +"RTN","BMXADOVJ",6,0) + ; +"RTN","BMXADOVJ",7,0) + ; THE FIFTH PARAMETER OF SS^BMXADO CONTAINS THE JOIN INSTRUCTIONS +"RTN","BMXADOVJ",8,0) + ; SYNTAX: DESCENDANT SCHEMA IEN (DETAILS FILE), JOIN FIELD FROM MASTER FILE +"RTN","BMXADOVJ",9,0) + ; THE FIRST "," PIECE STATES THAT THE MASTER FILE IS JOINED BY ITS .02 FIELD TO THE DETAILS FILE +"RTN","BMXADOVJ",10,0) + ; THE SECOND "," PIECE STARTES THAT THE DETAILS FILE IS DEFINED BY SCHEMA #6 +"RTN","BMXADOVJ",11,0) + ; AN OPTIONAL 3RD "," PIECE MAY CONTAIN A SECONDARY VSTG TO MORE PRECISELY DEFINE JOIN ITERATION +"RTN","BMXADOVJ",12,0) + ; E.G., "...~6.,.02,AA~1/1/2004~2/1/2004~~~~~|WT|R" +"RTN","BMXADOVJ",13,0) + ; IN THIS CASE, THE SECONDARY VSTG SPECIFIES THAT THE AA INDEX BE USED TO CONTROL THE ITERATOR +"RTN","BMXADOVJ",14,0) + ; THE START AND STOP DATES ARE IN EFFECT BUT MAX IS IGNORED/IRRELEVANT +"RTN","BMXADOVJ",15,0) + ; THE 1ST "|" PIECE OF THE PARAM SECTION WILL BE AUTOMATICALLY STUFFED WITH PATEINT DFN(S) DURING ITERATION +"RTN","BMXADOVJ",16,0) + ; IF MULTIPLE JOINS ARE REQUESTED, THEY ARE SPARATED BY THE '@JOIN@' DELIMTER +"RTN","BMXADOVJ",17,0) + ; "E.G., 6,.02@JOIN@1,.03@JOIN@2,.02@JOIN@9,SUB" +"RTN","BMXADOVJ",18,0) + ; IN THIS EXAPLE THE MASTER FILE IS JOIND TO THE DETAILS FILES ASSOCIATED WITH SCHEMAS 6, 1, AND 9 +"RTN","BMXADOVJ",19,0) + ; NOTE THAT THE 3RD JOIN DEINED IN THE STRING SPECIFIES A SUBFILE REALTION RATHER THAN A "POINTER" RELATION +"RTN","BMXADOVJ",20,0) + ; IF A SECOND RECORD SET IS CREATED TO FULFILL A JOIN REQUEST, IT WILL ONLY CONTAIN THE ROWS NECESSARY TO COMPLETE THE JOIN +"RTN","BMXADOVJ",21,0) + ; +"RTN","BMXADOVJ",22,0) +JOIN(SMASTER,JSTG) ;EP - APPEND ADDITIONAL ANRS TO FULFILL JOIN REQUESTS +"RTN","BMXADOVJ",23,0) + N TMP,JOIN,JINST,FMASTER +"RTN","BMXADOVJ",24,0) + I '$L($G(JSTG)) Q ; JOIN STRING MUST NOT BE NULL +"RTN","BMXADOVJ",25,0) + S FMASTER=$P($G(^BMXADO(+$G(SMASTER),0)),U,2) I 'FMASTER Q ; MASTER SCHEMA & FILE MUST EXIST +"RTN","BMXADOVJ",26,0) + S TMP=$NA(^TMP("BMX JOIN",$J)) K @TMP ; JOIN INFO TEMP STORAGE ARRAY +"RTN","BMXADOVJ",27,0) + S @TMP@(0,SMASTER)=$$RANGE ; GET DATA NODE RANGE FOR THE MASTER ANR +"RTN","BMXADOVJ",28,0) + I '$D(@TMP@(0)) Q ; DATA MUST EXIST IN THE MASTER FILE OR QUIT +"RTN","BMXADOVJ",29,0) + F JOIN=1:1 S JINST=$P(JSTG,"@JOIN@",JOIN) Q:JINST="" D J(SMASTER,JINST) ; MAIN LOOP FOR DOING JOINS +"RTN","BMXADOVJ",30,0) + K @TMP +"RTN","BMXADOVJ",31,0) + Q +"RTN","BMXADOVJ",32,0) + ; +"RTN","BMXADOVJ",33,0) +RANGE() ; GET DATA NODE RANGE FOR LAST SCHEMA ENTERED +"RTN","BMXADOVJ",34,0) + N X,FIRST,LAST,Y +"RTN","BMXADOVJ",35,0) + S (X,LAST)=$O(@OUT@(999999999),-1) +"RTN","BMXADOVJ",36,0) + F S X=$O(@OUT@(X),-1) Q:'X S Y=@OUT@(X) Q:Y'[$C(30) S FIRST=X +"RTN","BMXADOVJ",37,0) + I '$G(FIRST) Q "" +"RTN","BMXADOVJ",38,0) + S FIRST=FIRST+1 +"RTN","BMXADOVJ",39,0) + Q (FIRST_U_LAST) +"RTN","BMXADOVJ",40,0) + ; +"RTN","BMXADOVJ",41,0) +J(SMASTER,JSTG) ; JOIN DETAILS FILE TO MASTER FILE +"RTN","BMXADOVJ",42,0) + ; SMASTER=MASTER SCHMA IEN, SDETAIL=DETAILS SCHEMA IEN +"RTN","BMXADOVJ",43,0) + N JARR,SEC,ERR,JIEN,SUB,IX,PARENT,JFLD,DFLD,NODE,X,STOP,VSTG2,SDETAIL,JFLD +"RTN","BMXADOVJ",44,0) + S SDETAIL=$P(JSTG,C),JFLD=$P(JSTG,C,2),DFLD=$P(JSTG,C,3),VSTG2=$P(JSTG,C,4,999) +"RTN","BMXADOVJ",45,0) + I JFLD="SUB" S JFLD=.001,DFLD=.0001 +"RTN","BMXADOVJ",46,0) + I JFLD=.001,DFLD=.0001 S SUB=1,VSTG2="~~~~~SIT~BMXADOVJ~" ; MAKE SUBFILE ITERATOR VSTG +"RTN","BMXADOVJ",47,0) + D IEN(SMASTER,SDETAIL,JFLD) ; GET A LIST OF JOIN IENS FROM THE MASTER FILE +"RTN","BMXADOVJ",48,0) + I '$D(@TMP@(1)) Q ; NO MASTER FILE IENS FOR JOINS, SO QUIT +"RTN","BMXADOVJ",49,0) + N FIEN,DAS,SIEN,VSTG,JSTG +"RTN","BMXADOVJ",50,0) + S DAS="",SIEN=SDETAIL,VSTG=VSTG2 +"RTN","BMXADOVJ",51,0) + S FIEN=$P($G(^BMXADO(SIEN,0)),U,2) I 'FIEN Q +"RTN","BMXADOVJ",52,0) + D JEP^BMXADO ; BUILD THE JOIN ANR +"RTN","BMXADOVJ",53,0) + Q +"RTN","BMXADOVJ",54,0) + ; +"RTN","BMXADOVJ",55,0) +IEN(SMASTER,SDETAIL,JFLD) ; GET THE MASTER FILE IENS FOR BUILDING THE JOIN DATA SET +"RTN","BMXADOVJ",56,0) + N FIEN,%,FIRST,LAST,NODE,DA,IEN +"RTN","BMXADOVJ",57,0) + I JFLD["IEN" S JFLD=+JFLD +"RTN","BMXADOVJ",58,0) + S FIEN=$P($G(^BMXADO(SMASTER,0)),U,2) I 'FIEN Q +"RTN","BMXADOVJ",59,0) + S %=$G(@TMP@(0,SMASTER)) I '$L(%) Q +"RTN","BMXADOVJ",60,0) + S FIRST=+%,LAST=$P(%,U,2),NODE=FIRST-.1 +"RTN","BMXADOVJ",61,0) + F S NODE=$O(@OUT@(NODE)) Q:'NODE Q:NODE>LAST D +"RTN","BMXADOVJ",62,0) + . S DA=+@OUT@(NODE) +"RTN","BMXADOVJ",63,0) + . I 'DA Q +"RTN","BMXADOVJ",64,0) + . I JFLD=.001 S @TMP@(1,SDETAIL,DA)="" Q +"RTN","BMXADOVJ",65,0) + . S IEN=$$GET1^DIQ(FIEN,(DA_C),JFLD,"I") I 'IEN Q +"RTN","BMXADOVJ",66,0) + . S @TMP@(1,SDETAIL,IEN)="" +"RTN","BMXADOVJ",67,0) + . Q +"RTN","BMXADOVJ",68,0) + Q +"RTN","BMXADOVJ",69,0) + ; +"RTN","BMXADOVJ",70,0) +JFLD ; EP-STUFF JOIN FIELD IDS INTO THE INTRO SEGMENT OF THE SCHEMA +"RTN","BMXADOVJ",71,0) + N NODE,% +"RTN","BMXADOVJ",72,0) + S NODE=999999999999 +"RTN","BMXADOVJ",73,0) + F S NODE=$O(@OUT@(NODE),-1) Q:'NODE I ^(NODE)["@@@meta@@@" Q +"RTN","BMXADOVJ",74,0) + I 'NODE Q +"RTN","BMXADOVJ",75,0) + S %=$P(@OUT@(NODE),U),$P(%,"|",4)=$G(JFLD),$P(%,"|",5)=$G(DFLD) +"RTN","BMXADOVJ",76,0) + S @OUT@(NODE)=%_U +"RTN","BMXADOVJ",77,0) + Q +"RTN","BMXADOVJ",78,0) + ; +"RTN","BMXADOX") +0^74^B208011638 +"RTN","BMXADOX",1,0) +BMXADOX ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; +"RTN","BMXADOX",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOX",3,0) + ; EXMAPLES OF RPMS SCHEMAE GENERATION +"RTN","BMXADOX",4,0) + ; +"RTN","BMXADOX",5,0) + ; +"RTN","BMXADOX",6,0) +DISP(OUT) ;EP - TEMP DISPLAY +"RTN","BMXADOX",7,0) + N I,X +"RTN","BMXADOX",8,0) + S I=0 W ! +"RTN","BMXADOX",9,0) + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X +"RTN","BMXADOX",10,0) + Q +"RTN","BMXADOX",11,0) + ; +"RTN","BMXADOX",12,0) +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN +"RTN","BMXADOX",13,0) + N IEN +"RTN","BMXADOX",14,0) + S IEN=$O(^BMXADO("B",NAME,0)) +"RTN","BMXADOX",15,0) + Q IEN +"RTN","BMXADOX",16,0) + ; +"RTN","BMXADOX",17,0) +NEXTNUM(DFN,LOC) ; RETURN THE NEXT PROBLEM NUMBER FOR A PATIENT +"RTN","BMXADOX",18,0) + N X,LAST,MAX,NUM +"RTN","BMXADOX",19,0) + S NUM=0,MAX="" +"RTN","BMXADOX",20,0) + F S NUM=$O(^AUPNPROB("AA",DFN,LOC,NUM)) Q:NUM="" S X=$E(NUM,2,99) I +X>MAX S MAX=+X +"RTN","BMXADOX",21,0) + I 'MAX Q 1 +"RTN","BMXADOX",22,0) + S X=X+1 S X=X\1 +"RTN","BMXADOX",23,0) + Q X +"RTN","BMXADOX",24,0) + ; +"RTN","BMXADOX",25,0) +DEMOG ; VIEW DEMOGRAPHICS +"RTN","BMXADOX",26,0) + N OUT,%,DFN,MAX,SIEN +"RTN","BMXADOX",27,0) + S DFN=1,MAX=1000 +"RTN","BMXADOX",28,0) + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") +"RTN","BMXADOX",29,0) + D SS^BMXADO(.OUT,SIEN,"",("~"_DFN_"~"_DFN_"~"_MAX)) +"RTN","BMXADOX",30,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",31,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",32,0) + Q +"RTN","BMXADOX",33,0) + ; +"RTN","BMXADOX",34,0) +MEDICARE ; UPDATE MEDICARE DATES/INFO +"RTN","BMXADOX",35,0) + N OUT,%,DAS,PIEN,JIEN,DFN,MAX +"RTN","BMXADOX",36,0) + S DFN=1,MAX=1000 +"RTN","BMXADOX",37,0) + S DAS=DFN_"," +"RTN","BMXADOX",38,0) + S PIEN=$$SCHEMA("UPDATE MEDICARE DATES") +"RTN","BMXADOX",39,0) + S JIEN=$$SCHEMA("UPDATE MEDICARE INFO") +"RTN","BMXADOX",40,0) + D SS^BMXADO(.OUT,PIEN,DAS,("~"_DFN_"~"_DFN_"~"_MAX_"~~"_"MEDICARE~BMXADOV2~~"_JIEN_",PARENT")) +"RTN","BMXADOX",41,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",42,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",43,0) + Q +"RTN","BMXADOX",44,0) + ; +"RTN","BMXADOX",45,0) +MEDICAID ; VIEW MEDICAID DATES/INFO +"RTN","BMXADOX",46,0) + N OUT,%,DAS,PIEN,JIEN,DFN,DA +"RTN","BMXADOX",47,0) + S DFN=3 +"RTN","BMXADOX",48,0) + S DA(1)=$$MCDIEN^BMXADOV2(DFN) I 'DA(1) Q +"RTN","BMXADOX",49,0) + S DAS=DA(1)_"," +"RTN","BMXADOX",50,0) + S PIEN=$$SCHEMA("UPDATE MEDICAID DATES") +"RTN","BMXADOX",51,0) + S JIEN=$$SCHEMA("UPDATE MEDICAID INFO") +"RTN","BMXADOX",52,0) + D SS^BMXADO(.OUT,PIEN,DAS,("~~~~~MEDICAID~BMXADOV2~~"_JIEN_",PARENT")) +"RTN","BMXADOX",53,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",54,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",55,0) + Q +"RTN","BMXADOX",56,0) + ; +"RTN","BMXADOX",57,0) +PVTINS ; VIEW PRIVATE INSURANCE DATES/INFO +"RTN","BMXADOX",58,0) + N OUT,%,DAS,SIEN,DFN +"RTN","BMXADOX",59,0) + S DFN=1 +"RTN","BMXADOX",60,0) + S DAS=DFN_"," +"RTN","BMXADOX",61,0) + S SIEN=$$SCHEMA("UPDATE PVT INSURANCE INFO") +"RTN","BMXADOX",62,0) + D SS^BMXADO(.OUT,SIEN,DAS,"~~~~~PVTINS~BMXADOV2~~") +"RTN","BMXADOX",63,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",64,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",65,0) + Q +"RTN","BMXADOX",66,0) + ; +"RTN","BMXADOX",67,0) +VISIT ; VIEW VISITS +"RTN","BMXADOX",68,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",69,0) + S DFN=1 +"RTN","BMXADOX",70,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOX",71,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~100~~~~1|R") +"RTN","BMXADOX",72,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",73,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",74,0) + Q +"RTN","BMXADOX",75,0) + ; +"RTN","BMXADOX",76,0) +DUPVIS ; DISPLAY POSSIBLE DUPLICATE VISITS +"RTN","BMXADOX",77,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",78,0) + S DFN=1 +"RTN","BMXADOX",79,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOX",80,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~1|4/19/04@1PM|I|4585|A~") +"RTN","BMXADOX",81,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",82,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",83,0) + Q +"RTN","BMXADOX",84,0) + ; +"RTN","BMXADOX",85,0) +ADDVIS ; ADD A NEW VISIT +"RTN","BMXADOX",86,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",87,0) + S DFN=3 +"RTN","BMXADOX",88,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOX",89,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",90,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",91,0) + S ^TMP("BMX ADO",$J,NODE)="^JUN 03, 2004@09:32^I^`3^`4585^A^`1"_$C(30) +"RTN","BMXADOX",92,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",93,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",94,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",95,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",96,0) + Q +"RTN","BMXADOX",97,0) + ; +"RTN","BMXADOX",98,0) +POV ; DISPLAY POVS +"RTN","BMXADOX",99,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",100,0) + S DFN=1 +"RTN","BMXADOX",101,0) + S SIEN=$$SCHEMA("VIEW POVS") +"RTN","BMXADOX",102,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~100~~~~1|C") +"RTN","BMXADOX",103,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",104,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",105,0) + Q +"RTN","BMXADOX",106,0) + ; +"RTN","BMXADOX",107,0) +FLDS ; GET FILEMAN FIELDS +"RTN","BMXADOX",108,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",109,0) + S SIEN=$$SCHEMA("FIELDS") +"RTN","BMXADOX",110,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~FLDIT~BMXADOS1~3.7~") +"RTN","BMXADOX",111,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",112,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",113,0) + Q +"RTN","BMXADOX",114,0) + ; +"RTN","BMXADOX",115,0) +FINFO ; GET FILEMAN FILEINFO +"RTN","BMXADOX",116,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",117,0) + S SIEN=$$SCHEMA("FILEMAN FILEINFO") +"RTN","BMXADOX",118,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~FNIT~BMXADOS1~3.7~") +"RTN","BMXADOX",119,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",120,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",121,0) + Q +"RTN","BMXADOX",122,0) + ; +"RTN","BMXADOX",123,0) +ADDPOV ; ADD A POV TO AN EXISITING VISIT +"RTN","BMXADOX",124,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",125,0) + S DFN=1 +"RTN","BMXADOX",126,0) + S SIEN=$$SCHEMA("UPDATE POVS") +"RTN","BMXADOX",127,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",128,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",129,0) + S ^TMP("BMX ADO",$J,NODE)="^`8718^`1^`71164^DM II ON NEW MEDS^2^P"_$C(30) +"RTN","BMXADOX",130,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",131,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",132,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",133,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",134,0) + Q +"RTN","BMXADOX",135,0) + ; +"RTN","BMXADOX",136,0) +EDITPOV ; ADD A POV TO AN EXISITING VISIT +"RTN","BMXADOX",137,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",138,0) + S DFN=1 +"RTN","BMXADOX",139,0) + S SIEN=$$SCHEMA("UPDATE POVS") +"RTN","BMXADOX",140,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",141,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",142,0) + S ^TMP("BMX ADO",$J,NODE)="100123^`8718^`1^`71164^DM II ON SPECIAL MEDS^2^P"_$C(30) +"RTN","BMXADOX",143,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",144,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",145,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",146,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",147,0) + Q +"RTN","BMXADOX",148,0) + ; +"RTN","BMXADOX",149,0) +PROB ; DISPLAY PROBLEMS +"RTN","BMXADOX",150,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",151,0) + S DFN=1 +"RTN","BMXADOX",152,0) + S SIEN=$$SCHEMA("VIEW PROBLEMS") +"RTN","BMXADOX",153,0) + D SS^BMXADO(.OUT,SIEN,"","AA~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOX",154,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",155,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",156,0) + Q +"RTN","BMXADOX",157,0) + ; +"RTN","BMXADOX",158,0) +ADDPROB ; ADD A PROBLEM TO THE PROBLEM LIST +"RTN","BMXADOX",159,0) + N OUT,%,SIEN,DFN,NODE,NUM,LOC,ICD,TEXT,AIR,IEN +"RTN","BMXADOX",160,0) + S ICD=2477 +"RTN","BMXADOX",161,0) + S TEXT="HYPERTENSION ON SPECIAL MEDS" +"RTN","BMXADOX",162,0) + S DFN=1,LOC=DUZ(2),AIR="A" +"RTN","BMXADOX",163,0) + S SIEN=$$SCHEMA("UPDATE PROBLEMS") +"RTN","BMXADOX",164,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",165,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",166,0) + S ^TMP("BMX ADO",$J,NODE)=U_"`"_ICD_U_"`"_DFN_U_DT_U_U_TEXT_U_"`"_LOC_U_DT_$C(30) +"RTN","BMXADOX",167,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",168,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",169,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",170,0) + S IEN=+$P(OUT(1),"|",2) I '$D(^AUPNPROB(IEN,0)) Q +"RTN","BMXADOX",171,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",172,0) + K OUT +"RTN","BMXADOX",173,0) + S NUM=$$NEXTNUM(DFN,LOC) I 'NUM Q ; PROBLEM NUMBER & STATUS MUST BE ADDED SEPARATELY +"RTN","BMXADOX",174,0) + S SIEN=$$SCHEMA("UPDATE PROBLEM NUMBER") +"RTN","BMXADOX",175,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",176,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",177,0) + S ^TMP("BMX ADO",$J,NODE)=IEN_U_NUM_U_"A"_$C(30) +"RTN","BMXADOX",178,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",179,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",180,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",181,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",182,0) + Q +"RTN","BMXADOX",183,0) + ; +"RTN","BMXADOX",184,0) +MEAS ; DISPLAY MEASUREMENTS +"RTN","BMXADOX",185,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",186,0) + S DFN=1 +"RTN","BMXADOX",187,0) + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOX",188,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~10~~~~"_DFN_"|WT|C") +"RTN","BMXADOX",189,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",190,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",191,0) + Q +"RTN","BMXADOX",192,0) + ; +"RTN","BMXADOX",193,0) +ADDMEAS ; UPDATE V MEASUREMENT FILE +"RTN","BMXADOX",194,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",195,0) + S DFN=1 +"RTN","BMXADOX",196,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOX",197,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",198,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",199,0) + S ^TMP("BMX ADO",$J,NODE)="^`2^`"_DFN_"^`71164^177.5^`6"_$C(30) +"RTN","BMXADOX",200,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",201,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",202,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",203,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",204,0) + Q +"RTN","BMXADOX",205,0) + ; +"RTN","BMXADOX",206,0) +MEDS ; DISPLAY MEDS +"RTN","BMXADOX",207,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",208,0) + S DFN=3 +"RTN","BMXADOX",209,0) + S SIEN=$$SCHEMA("VIEW MEDS") +"RTN","BMXADOX",210,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1989~12/31/1990~10~~~~"_DFN_"|C") +"RTN","BMXADOX",211,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",212,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",213,0) + Q +"RTN","BMXADOX",214,0) + ; +"RTN","BMXADOX",215,0) +ADDMEDS ; UPDATE V MED FILE +"RTN","BMXADOX",216,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",217,0) + S DFN=3 +"RTN","BMXADOX",218,0) + S SIEN=$$SCHEMA("UPDATE MEDS") +"RTN","BMXADOX",219,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",220,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",221,0) + S ^TMP("BMX ADO",$J,NODE)="^`305^`"_DFN_"^`71164^T1T QID^40"_$C(30) +"RTN","BMXADOX",222,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",223,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",224,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",225,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",226,0) + Q +"RTN","BMXADOX",227,0) + ; +"RTN","BMXADOX",228,0) +LAB ; DISPLAY LAB TEST RESULTS +"RTN","BMXADOX",229,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",230,0) + S DFN=1 +"RTN","BMXADOX",231,0) + S SIEN=$$SCHEMA("VIEW LABS") +"RTN","BMXADOX",232,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1985~12/31/1987~10~~~~"_DFN_"|175|C") +"RTN","BMXADOX",233,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",234,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",235,0) + Q +"RTN","BMXADOX",236,0) + ; +"RTN","BMXADOX",237,0) +ADDLAB ; UPDATE V LAB +"RTN","BMXADOX",238,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",239,0) + S DFN=1 +"RTN","BMXADOX",240,0) + S SIEN=$$SCHEMA("UPDATE LABS") +"RTN","BMXADOX",241,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",242,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",243,0) + S ^TMP("BMX ADO",$J,NODE)="^`175^`"_DFN_"^`71164^216"_$C(30) +"RTN","BMXADOX",244,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",245,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",246,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",247,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",248,0) + Q +"RTN","BMXADOX",249,0) + ; +"RTN","BMXADOX",250,0) +EXAMS ; DISPLAY EXAMS +"RTN","BMXADOX",251,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",252,0) + S DFN=1 +"RTN","BMXADOX",253,0) + S SIEN=$$SCHEMA("VIEW EXAMS") +"RTN","BMXADOX",254,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1986~12/31/1990~10~~~~"_DFN_"|6|C") +"RTN","BMXADOX",255,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",256,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",257,0) + Q +"RTN","BMXADOX",258,0) + ; +"RTN","BMXADOX",259,0) +ADDEXAMS ; UPDATE V EXAM +"RTN","BMXADOX",260,0) + S DFN=1 +"RTN","BMXADOX",261,0) + S SIEN=$$SCHEMA("UPDATE EXAMS") +"RTN","BMXADOX",262,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",263,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",264,0) + S ^TMP("BMX ADO",$J,NODE)="^`6^`"_DFN_"^`71164^NORMAL"_$C(30) +"RTN","BMXADOX",265,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",266,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",267,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",268,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",269,0) + Q +"RTN","BMXADOX",270,0) + ; +"RTN","BMXADOX",271,0) +IMM ; DISPLAY IMMUNIZATIONS +"RTN","BMXADOX",272,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",273,0) + S DFN=2 +"RTN","BMXADOX",274,0) + S SIEN=$$SCHEMA("VIEW IMM") +"RTN","BMXADOX",275,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1986~12/31/1988~10~~~~"_DFN_"|12|C") +"RTN","BMXADOX",276,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",277,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",278,0) + Q +"RTN","BMXADOX",279,0) + ; +"RTN","BMXADOX",280,0) +ADDIMM ; UPDATE V IMMUNIZATION FILE +"RTN","BMXADOX",281,0) + S DFN=2 +"RTN","BMXADOX",282,0) + S SIEN=$$SCHEMA("UPDATE IMM") +"RTN","BMXADOX",283,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",284,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",285,0) + S ^TMP("BMX ADO",$J,NODE)="^`12^`"_DFN_"^`71164^2"_$C(30) +"RTN","BMXADOX",286,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",287,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",288,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",289,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",290,0) + Q +"RTN","BMXADOX",291,0) + ; +"RTN","BMXADOX",292,0) +PROV ; DISPLAY PROVIDERS FOR A VISIT +"RTN","BMXADOX",293,0) + N OUT,%,SIEN,VIEN +"RTN","BMXADOX",294,0) + S VIEN=11 +"RTN","BMXADOX",295,0) + S SIEN=$$SCHEMA("VIEW PROV") +"RTN","BMXADOX",296,0) + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") +"RTN","BMXADOX",297,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",298,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",299,0) + Q +"RTN","BMXADOX",300,0) + ; +"RTN","BMXADOX",301,0) +ADDPROV ; UPDATE V PROVIDER FILE +"RTN","BMXADOX",302,0) + N OUT,%,SIEN,NODE,PIEN,DFN +"RTN","BMXADOX",303,0) + S PIEN=5,DFN=1 +"RTN","BMXADOX",304,0) + I $P(^DD(9000010.06,.01,0),U,3)["DIC(6" S PIEN=$P(^VA(200,PIEN,0),U,16) ; CONVERT FILE 200 TO FILE 16 IF NECESS. +"RTN","BMXADOX",305,0) + S SIEN=$$SCHEMA("UPDATE PROV") +"RTN","BMXADOX",306,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",307,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",308,0) + S ^TMP("BMX ADO",$J,NODE)="^`"_PIEN_"^`"_DFN_"^`71164^P"_$C(30) +"RTN","BMXADOX",309,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",310,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",311,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",312,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",313,0) + Q +"RTN","BMXADOX",314,0) + ; +"RTN","BMXADOX",315,0) +PROC ; DISPLAY PROCEDURES +"RTN","BMXADOX",316,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",317,0) + S DFN=4 +"RTN","BMXADOX",318,0) + S SIEN=$$SCHEMA("VIEW PROCEDURES") +"RTN","BMXADOX",319,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1985~12/31/1985~10~~~~"_DFN_"|C") +"RTN","BMXADOX",320,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",321,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",322,0) + Q +"RTN","BMXADOX",323,0) + ; +"RTN","BMXADOX",324,0) +ADDPROC ; UPDATE V PROCEDURES FILE +"RTN","BMXADOX",325,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",326,0) + S DFN=1 +"RTN","BMXADOX",327,0) + S SIEN=$$SCHEMA("UPDATE PROCEDURES") +"RTN","BMXADOX",328,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",329,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",330,0) + S ^TMP("BMX ADO",$J,NODE)="^`2198^`"_DFN_"^`71164^`8718"_$C(30) +"RTN","BMXADOX",331,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",332,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",333,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",334,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",335,0) + Q +"RTN","BMXADOX",336,0) + ; +"RTN","BMXADOX",337,0) +CPT ; DISPLAY CPT CODES +"RTN","BMXADOX",338,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",339,0) + S VIEN=71164 +"RTN","BMXADOX",340,0) + S SIEN=$$SCHEMA("VIEW CPT") +"RTN","BMXADOX",341,0) + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") +"RTN","BMXADOX",342,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",343,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",344,0) + Q +"RTN","BMXADOX",345,0) + ; +"RTN","BMXADOX",346,0) +ADDCPT ; UPDATE V CPT FILE +"RTN","BMXADOX",347,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",348,0) + S DFN=1 +"RTN","BMXADOX",349,0) + S SIEN=$$SCHEMA("UPDATE CPT") +"RTN","BMXADOX",350,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",351,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",352,0) + S ^TMP("BMX ADO",$J,NODE)="^`10000^`"_DFN_"^`71164^WOUND CARE"_$C(30) +"RTN","BMXADOX",353,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",354,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",355,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",356,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",357,0) + Q +"RTN","BMXADOX",358,0) + ; +"RTN","BMXADOX",359,0) +PH ; DISPLAY PERSONAL HISTORY +"RTN","BMXADOX",360,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",361,0) + S DFN=632 +"RTN","BMXADOX",362,0) + S SIEN=$$SCHEMA("VIEW PERSONAL HISTORY") +"RTN","BMXADOX",363,0) + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOX",364,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",365,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",366,0) + Q +"RTN","BMXADOX",367,0) + ; +"RTN","BMXADOX",368,0) +ADDPH ; UPDATE PERSONAL HX +"RTN","BMXADOX",369,0) + N OUT,%,SIEN,DFN,NODE,ICD,TEXT +"RTN","BMXADOX",370,0) + S ICD=2477 +"RTN","BMXADOX",371,0) + S TEXT="PERSONAL HISTORY OF SERIOUS PROBLEMS" +"RTN","BMXADOX",372,0) + S DFN=632 +"RTN","BMXADOX",373,0) + S SIEN=$$SCHEMA("UPDATE PERSONAL HISTORY") +"RTN","BMXADOX",374,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",375,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",376,0) + S ^TMP("BMX ADO",$J,NODE)="^`11353^`"_DFN_"^2851219^"_TEXT_"^2810303"_$C(30) +"RTN","BMXADOX",377,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",378,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",379,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",380,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",381,0) + Q +"RTN","BMXADOX",382,0) + ; +"RTN","BMXADOX",383,0) +FH ; DISPLAY FAMILY HX +"RTN","BMXADOX",384,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",385,0) + S DFN=631 +"RTN","BMXADOX",386,0) + S SIEN=$$SCHEMA("VIEW FAMILY HISTORY") +"RTN","BMXADOX",387,0) + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOX",388,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",389,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",390,0) + Q +"RTN","BMXADOX",391,0) + ; +"RTN","BMXADOX",392,0) +ADDFH ; UPDATE FAMILY HISTORY +"RTN","BMXADOX",393,0) + N OUT,%,SIEN,DFN,NODE,ICD,TEXT +"RTN","BMXADOX",394,0) + S ICD=2477 +"RTN","BMXADOX",395,0) + S TEXT="FAMILY HISTORY OF SERIOUS PROBLEMS" +"RTN","BMXADOX",396,0) + S DFN=631 +"RTN","BMXADOX",397,0) + S SIEN=$$SCHEMA("UPDATE FAMILY HISTORY") +"RTN","BMXADOX",398,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",399,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",400,0) + S ^TMP("BMX ADO",$J,NODE)="^`7571^`"_DFN_"^2851219^"_TEXT_$C(30) +"RTN","BMXADOX",401,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",402,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",403,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",404,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",405,0) + Q +"RTN","BMXADOX",406,0) + ; +"RTN","BMXADOX",407,0) +HF ; DISPLAY HEALTH FACTORS +"RTN","BMXADOX",408,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",409,0) + S DFN=1 +"RTN","BMXADOX",410,0) + S SIEN=$$SCHEMA("VIEW HEALTH FACTORS") +"RTN","BMXADOX",411,0) + D SS^BMXADO(.OUT,SIEN,"","AC"_"~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOX",412,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",413,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",414,0) + Q +"RTN","BMXADOX",415,0) + ; +"RTN","BMXADOX",416,0) +ADDHF ; UPDATE HEALTH FACTORS FILE +"RTN","BMXADOX",417,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",418,0) + S DFN=1 +"RTN","BMXADOX",419,0) + S SIEN=$$SCHEMA("UPDATE HEALTH FACTORS") +"RTN","BMXADOX",420,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",421,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",422,0) + S ^TMP("BMX ADO",$J,NODE)="^`3^`"_DFN_U_DT_$C(30) +"RTN","BMXADOX",423,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",424,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",425,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",426,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",427,0) + Q +"RTN","BMXADOX",428,0) + ; +"RTN","BMXADOX",429,0) +REPRO ; DISPLAY REPRODUCTIVE FACTORS +"RTN","BMXADOX",430,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOX",431,0) + S DFN=5 +"RTN","BMXADOX",432,0) + S SIEN=$$SCHEMA("VIEW REPRODUCTIVE FACTORS") +"RTN","BMXADOX",433,0) + D SS^BMXADO(.OUT,SIEN,"","B"_"~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOX",434,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",435,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",436,0) + Q +"RTN","BMXADOX",437,0) + ; +"RTN","BMXADOX",438,0) +ADDREPRO ; UPDATE REPRODUCTIVE FACTORS +"RTN","BMXADOX",439,0) + ; THE .O1 FIELD IS DINUMED +"RTN","BMXADOX",440,0) + ; THEREFORE, THE FILER WILL AUTOMATICALLY SWITCH TO MOD MODE IF A RECORD ALREADY EXISTS FOR THIS PATIENT +"RTN","BMXADOX",441,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOX",442,0) + S DFN=5 +"RTN","BMXADOX",443,0) + ; I $D(^AUPNREP(DFN)) G ERF +"RTN","BMXADOX",444,0) + S SIEN=$$SCHEMA("ADD REPRODUCTIVE FACTORS") +"RTN","BMXADOX",445,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX",446,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX",447,0) + S ^TMP("BMX ADO",$J,NODE)="^`"_DFN_"^G5P4LC3SA1TA0^"_DT_"^2^3040101^"_DT_$C(30) +"RTN","BMXADOX",448,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",449,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOX",450,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",451,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOX",452,0) + Q +"RTN","BMXADOX",453,0) + ; +"RTN","BMXADOX",454,0) + ; ---------------------------------- GRIDS --------------------------------------------- +"RTN","BMXADOX",455,0) + ; +"RTN","BMXADOX",456,0) +GRID ; POPULATE THE INTRO GRID +"RTN","BMXADOX",457,0) + N OUT,%,SIEN,NODE,NEXT +"RTN","BMXADOX",458,0) + S NEXT="70470;0" +"RTN","BMXADOX",459,0) + S SIEN=$$SCHEMA("VEN MOJO DE INTRO") +"RTN","BMXADOX",460,0) + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA +"RTN","BMXADOX",461,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",462,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",463,0) + Q +"RTN","BMXADOX",464,0) + ; +"RTN","BMXADOX",465,0) +MGRID ; POPULATE THE MEASUREMENT GRID +"RTN","BMXADOX",466,0) + N OUT,%,SIEN,NODE,NEXT,START,STOP +"RTN","BMXADOX",467,0) + S NEXT="70470;2" +"RTN","BMXADOX",468,0) + S SIEN=$$SCHEMA("VEN MOJO DE MEASUREMENT") +"RTN","BMXADOX",469,0) + ; D SS^BMXADO(.OUT,SIEN,"","~~~~~GRIDIT~VENPCCTG~"_NEXT) ; GET SCHEMA +"RTN","BMXADOX",470,0) + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA +"RTN","BMXADOX",471,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",472,0) + ; K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",473,0) + Q +"RTN","BMXADOX",474,0) + ; +"RTN","BMXADOX",475,0) +PRVGRID ; POPULATE THE PROVIDER GRID +"RTN","BMXADOX",476,0) + N OUT,%,SIEN,NODE,NEXT +"RTN","BMXADOX",477,0) + S NEXT="70470;4" +"RTN","BMXADOX",478,0) + S SIEN=$$SCHEMA("VEN MOJO DE PROVIDER") +"RTN","BMXADOX",479,0) + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA +"RTN","BMXADOX",480,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",481,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",482,0) + Q +"RTN","BMXADOX",483,0) + ; +"RTN","BMXADOX",484,0) +CLGRID ; POPULATE THE CLINIC GRID +"RTN","BMXADOX",485,0) + N OUT,%,SIEN,NODE,NEXT +"RTN","BMXADOX",486,0) + S NEXT="70470;8" +"RTN","BMXADOX",487,0) + S SIEN=$$SCHEMA("VEN MOJO DE CLINIC") +"RTN","BMXADOX",488,0) + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA +"RTN","BMXADOX",489,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",490,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",491,0) + Q +"RTN","BMXADOX",492,0) + ; +"RTN","BMXADOX",493,0) +DXGRID ; POPULATE THE DX GRID +"RTN","BMXADOX",494,0) + N OUT,%,SIEN,NODE,NEXT +"RTN","BMXADOX",495,0) + S NEXT="70470;1" +"RTN","BMXADOX",496,0) + S SIEN=$$SCHEMA("VEN MOJO DE DX DXHX") +"RTN","BMXADOX",497,0) + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA +"RTN","BMXADOX",498,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX",499,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX",500,0) + Q +"RTN","BMXADOX",501,0) + ; +"RTN","BMXADOX1") +0^75^B84889528 +"RTN","BMXADOX1",1,0) +BMXADOX1 ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; +"RTN","BMXADOX1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOX1",3,0) + ; EXMAPLES OF FILEMAN SCHEMA GENERATION +"RTN","BMXADOX1",4,0) + ; +"RTN","BMXADOX1",5,0) + ; +"RTN","BMXADOX1",6,0) + ; N OUT,DAX,% S DAX=0 D SS^BMXADO(.OUT,1,DAX,"^^^5^I^^^^3,XSUB,2160010.03") D DISP(OUT) Q ; TEST EXTENDED SUBJOIN +"RTN","BMXADOX1",7,0) + ; +"RTN","BMXADOX1",8,0) +DISP(OUT) ; +"RTN","BMXADOX1",9,0) + D DISP^BMXADOX(OUT) +"RTN","BMXADOX1",10,0) + Q +"RTN","BMXADOX1",11,0) + ; +"RTN","BMXADOX1",12,0) +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN +"RTN","BMXADOX1",13,0) + N IEN +"RTN","BMXADOX1",14,0) + S IEN=$O(^BMXADO("B",NAME,0)) +"RTN","BMXADOX1",15,0) + Q IEN +"RTN","BMXADOX1",16,0) + ; +"RTN","BMXADOX1",17,0) +NUM ; ITERATE BY IEN +"RTN","BMXADOX1",18,0) + ; IX="",START WITH IEN=1, STOP AFTER IEN=20, MAX # RECORDS RETURNED = 5 +"RTN","BMXADOX1",19,0) + ; TO VIEW INTERNAL VALUES SET VSTG="~1~20~5~I" +"RTN","BMXADOX1",20,0) + N OUT,%,SIEN +"RTN","BMXADOX1",21,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOX1",22,0) + D SS^BMXADO(.OUT,SIEN,"","~1~20~5") +"RTN","BMXADOX1",23,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",24,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",25,0) + Q +"RTN","BMXADOX1",26,0) + ; +"RTN","BMXADOX1",27,0) +IX ; ITERATE BY INDEX +"RTN","BMXADOX1",28,0) + ; ITERATE USING THE "B" INDEX +"RTN","BMXADOX1",29,0) + ; START WITH PT NAME "C", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 +"RTN","BMXADOX1",30,0) + N OUT,%,SIEN +"RTN","BMXADOX1",31,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOX1",32,0) + D SS^BMXADO(.OUT,SIEN,"","B~C~D~5") +"RTN","BMXADOX1",33,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",34,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",35,0) + Q +"RTN","BMXADOX1",36,0) + ; +"RTN","BMXADOX1",37,0) +VCN ; SHOW VALUES FOR A SINGLE VISIT THAT AS A DEFINED VCN +"RTN","BMXADOX1",38,0) + N OUT,%,SIEN +"RTN","BMXADOX1",39,0) + S SIEN=$$SCHEMA("BMXADO DATA ENTRY IDENTIFIERS") +"RTN","BMXADOX1",40,0) + D SS^BMXADO(.OUT,SIEN,"","VCN~1.242A~1.242A~") +"RTN","BMXADOX1",41,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",42,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",43,0) + Q +"RTN","BMXADOX1",44,0) + ; +"RTN","BMXADOX1",45,0) +MT ; MEASUREMNT TYPES +"RTN","BMXADOX1",46,0) + N OUT,%,SIEN +"RTN","BMXADOX1",47,0) + S SIEN=$$SCHEMA("BMXADO MEASUREMENT TYPES") +"RTN","BMXADOX1",48,0) + D SS^BMXADO(.OUT,SIEN,"","B~~") +"RTN","BMXADOX1",49,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",50,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",51,0) + Q +"RTN","BMXADOX1",52,0) + ; +"RTN","BMXADOX1",53,0) +PROB ; PATIENT PROBLEMS +"RTN","BMXADOX1",54,0) + N OUT,%,SIEN +"RTN","BMXADOX1",55,0) + S SIEN=$$SCHEMA("BMXADO PROBLEMS") +"RTN","BMXADOX1",56,0) + D SS^BMXADO(.OUT,SIEN,"","AA~53~53") +"RTN","BMXADOX1",57,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",58,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",59,0) + Q +"RTN","BMXADOX1",60,0) + ; +"RTN","BMXADOX1",61,0) +PB1 ; ALT PROB RETRIEVAL TEST +"RTN","BMXADOX1",62,0) + N OUT,%,SIEN +"RTN","BMXADOX1",63,0) + S SIEN=$$SCHEMA("BMXADO PROBLEMS") +"RTN","BMXADOX1",64,0) + D SS^BMXADO(.OUT,SIEN,"","~221~221~") +"RTN","BMXADOX1",65,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",66,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",67,0) + Q +"RTN","BMXADOX1",68,0) + ; +"RTN","BMXADOX1",69,0) +POV ; RETURN THE POV SCHEMA +"RTN","BMXADOX1",70,0) + N OUT,%,SIEN +"RTN","BMXADOX1",71,0) + S SIEN=$$SCHEMA("BMXADO ADD POV") +"RTN","BMXADOX1",72,0) + D SS^BMXADO(.OUT,SIEN,"","") +"RTN","BMXADOX1",73,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",74,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",75,0) + Q +"RTN","BMXADOX1",76,0) + ; +"RTN","BMXADOX1",77,0) +NOTES ; RETURN NOTES FOR A SPECIFIC PATIENT PROBLEMS +"RTN","BMXADOX1",78,0) + N OUT,%,SIEN +"RTN","BMXADOX1",79,0) + S SIEN=$$SCHEMA("BMXADO NOTES") +"RTN","BMXADOX1",80,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~NOTES~BMXADOFD~53") +"RTN","BMXADOX1",81,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",82,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",83,0) + Q +"RTN","BMXADOX1",84,0) + ; +"RTN","BMXADOX1",85,0) +RENT ; ITERATE IN CHUNKS +"RTN","BMXADOX1",86,0) + ; RE-ITERATE USING THE "B" INDEX +"RTN","BMXADOX1",87,0) + ; START WITH PT IEN 5 AS THE "SEED", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 +"RTN","BMXADOX1",88,0) + N OUT,%,SIEN,SEED,LSEED,X,Y +"RTN","BMXADOX1",89,0) + S SEED=0,LSEED="" +"RTN","BMXADOX1",90,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOX1",91,0) +RIT F D I '$G(SEED) Q +"RTN","BMXADOX1",92,0) + . ; D SS^BMXADO(.OUT,SIEN,SEED,"B~CA~CB~5") +"RTN","BMXADOX1",93,0) + . D SS^BMXADO(.OUT,SIEN,SEED,"~~~5") +"RTN","BMXADOX1",94,0) + . D DISP(OUT) R %:$G(DTIME,60) E S SEED="" Q +"RTN","BMXADOX1",95,0) + . I %?1"^" S SEED="" Q +"RTN","BMXADOX1",96,0) + . S X=$P(@OUT@(1),U,1) +"RTN","BMXADOX1",97,0) + . S SEED=$P(X,"|",3) +"RTN","BMXADOX1",98,0) + . I SEED=LSEED S SEED="" Q +"RTN","BMXADOX1",99,0) + . S LSEED=SEED +"RTN","BMXADOX1",100,0) + . K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",101,0) + . Q +"RTN","BMXADOX1",102,0) + Q +"RTN","BMXADOX1",103,0) + ; +"RTN","BMXADOX1",104,0) +SUB ; SUBFILE ITERATION +"RTN","BMXADOX1",105,0) + ; THE SCHEMA IS ATTACHED TO THE MEDICARE ELIGIBILITY FILE/ELIG DATE SUBFILE +"RTN","BMXADOX1",106,0) + ; THE DA STRING HAS A VALUE OF '1,',: THE IEN IN THE PARENT FILE. +"RTN","BMXADOX1",107,0) + ; NOTE THE COMMA IN THE DA STRING. THIS INDICATES THAT THE FILE IEN IS 1 BUT THE SUBFILE IEN IS UNSPECIFIED +"RTN","BMXADOX1",108,0) + N OUT,%,SIEN +"RTN","BMXADOX1",109,0) + S SIEN=$$SCHEMA("UPDATE MEDICARE DATES") +"RTN","BMXADOX1",110,0) + D SS^BMXADO(.OUT,SIEN,"1,","~~~") +"RTN","BMXADOX1",111,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",112,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",113,0) + Q +"RTN","BMXADOX1",114,0) + ; +"RTN","BMXADOX1",115,0) +DINUM ; DINUMED POINTER ITERATION +"RTN","BMXADOX1",116,0) + ; THE SCHEMA IS ATTACHED TO THE IHS PATIENT FILE (9000001) +"RTN","BMXADOX1",117,0) + ; THE IHS PATIENT FILE IS DINUM'D AND ITS .01 FIELD POINTS TO THE VA PATIENT FILE (2) +"RTN","BMXADOX1",118,0) + ; BECAUSE OF THE SPECIAL RELATIONSHIP BETWEEN THE FILES, WE CAN USE THE B INDEX OF FILE 2 TO ITERATE FILE 9000001. +"RTN","BMXADOX1",119,0) + N OUT,%,SIEN +"RTN","BMXADOX1",120,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOX1",121,0) + D SS^BMXADO(.OUT,SIEN,"","B~A~B~5") +"RTN","BMXADOX1",122,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",123,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",124,0) + Q +"RTN","BMXADOX1",125,0) + ; +"RTN","BMXADOX1",126,0) +IXP ; INDEXED POINTER ITERATION +"RTN","BMXADOX1",127,0) + ; THE SCHEMA IS ATTACHED TO THE V POV FILE +"RTN","BMXADOX1",128,0) + ; THE AC CROSS REFERENCE INDEXES THE PATIENT FIELD +"RTN","BMXADOX1",129,0) + ; BY STARTING AND STOPING WITH PATIENT 1 (MAX=5) WE COLLECT THE FIRST 5 POVS FOR PATIENT 1 IN THE FILE +"RTN","BMXADOX1",130,0) + N OUT,%,SIEN +"RTN","BMXADOX1",131,0) + S SIEN=$$SCHEMA("VIEW POVS") +"RTN","BMXADOX1",132,0) + D SS^BMXADO(.OUT,SIEN,"","AC~1~1~5") +"RTN","BMXADOX1",133,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",134,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",135,0) + Q +"RTN","BMXADOX1",136,0) + ; +"RTN","BMXADOX1",137,0) +AA ; ITERATE USING AA INDEX +"RTN","BMXADOX1",138,0) + ; INDEX IS 'AA" THE START AND STOP DATES ARE SPECIFIED IN EXTERNAL FORMAT. MAX=10 +"RTN","BMXADOX1",139,0) + ; THE FOLLOWING FILTERS ARE SPECIFIED IN THE LAST PARAMETER ("1|WT|C"): +"RTN","BMXADOX1",140,0) + ; 1=PATIENT DFN #1 +"RTN","BMXADOX1",141,0) + ; WT=RETURN ONLY WEIGHTS. MEASUREMENT TYPE MUST BE SPECIFIED WITH A VALID, UNAMBIGUOUS LOOKUP VALUE. +"RTN","BMXADOX1",142,0) + ; C=RETRUN VALUES IN CHRONOLOGICAL ORDER USE 'R' INSTEAD OF 'C' FOR REVERSE CHRONOLOGICAL ORDER. DEFAULT=C +"RTN","BMXADOX1",143,0) + ; THE SEED PARAMTER IS SET AND CAN BE USED TO RETURN DATA IN CHUNKS +"RTN","BMXADOX1",144,0) + N OUT,%,SIEN +"RTN","BMXADOX1",145,0) + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOX1",146,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~5~~~~1|WT|C") +"RTN","BMXADOX1",147,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",148,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",149,0) + Q +"RTN","BMXADOX1",150,0) + ; +"RTN","BMXADOX1",151,0) +AA2 ; ITERATE USING AA INDEX +"RTN","BMXADOX1",152,0) + ; THIS SCHEMA IS ATTACHED TO THE VISIT FILE (9000010) +"RTN","BMXADOX1",153,0) + ; IN THIS CASE THERE IS NO ATTRIBUTE TYPE SO THE FILTER PARAM HAS ONLY 2 PIECES "1|R" +"RTN","BMXADOX1",154,0) + ; 1=PATIENT DFN +"RTN","BMXADOX1",155,0) + ; R=RETURN DATA IN REVERSE CHRONOLOGICAL ORDER +"RTN","BMXADOX1",156,0) + N OUT,%,SIEN +"RTN","BMXADOX1",157,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOX1",158,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~5~~~~1|R") +"RTN","BMXADOX1",159,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",160,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",161,0) + Q +"RTN","BMXADOX1",162,0) + ; +"RTN","BMXADOX1",163,0) +CIT ; CUSTOM ITERATOR +"RTN","BMXADOX1",164,0) + ; IF COMPLEX OR UNUSUAL SORTING/FILTERING IS REQUITED, USE A CUSTOM ITERATOR +"RTN","BMXADOX1",165,0) + ; THE CUSTOM ITERATOR IS DEFINED BY 6TH, 7TH AND 8TH PIECES IN THE VSTG +"RTN","BMXADOX1",166,0) + ; PIECE 8=TAG, PIECE 9=ROUTINE, PIECE 8=A PARAMETER PASSED TO THE ENTRY POINT +"RTN","BMXADOX1",167,0) + ; THE 9TH PIECE CONTAINS PT DFN, TIMESTAMP, VISIT TYPE, LOC IEN, AND SERVICE CATEGORY IN A "|" DELIMTED STRING +"RTN","BMXADOX1",168,0) + ; THE ITERATOR CALL TAG^ROUTINE(PARAM) TO GENERATE IENS +"RTN","BMXADOX1",169,0) + ; IN THIS CASE THE SCHEMA IS ATTACHED TO THE VISIT FILE. +"RTN","BMXADOX1",170,0) + ; GIVEN THE INFORMATION IN THE PARAMETER, THE CUSTOM ITERATOR RETURNS POSSIBLE DUPLICATE VISITS +"RTN","BMXADOX1",171,0) + N OUT,%,SIEN +"RTN","BMXADOX1",172,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOX1",173,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~1|4/19/04@1PM|I|4585|A~") +"RTN","BMXADOX1",174,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",175,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",176,0) + Q +"RTN","BMXADOX1",177,0) + ; +"RTN","BMXADOX1",178,0) +TRIGGER ; TEXT TRIGGER FUNCTION +"RTN","BMXADOX1",179,0) + N OUT,%,SIEN +"RTN","BMXADOX1",180,0) + S SIEN=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOX1",181,0) + D SS^BMXADO(.OUT,SIEN,"","~1~5") +"RTN","BMXADOX1",182,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",183,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",184,0) + Q +"RTN","BMXADOX1",185,0) + ; +"RTN","BMXADOX1",186,0) +ID ; IDENTIFIER FIELD +"RTN","BMXADOX1",187,0) + ; THE SCHEMA IS ATTACHED TO THE VA PATIENT FILE (2) +"RTN","BMXADOX1",188,0) + ; THE SCHEMA HAS A BUILT IN FIELD (.01ID) THAT RETURNS THE IDENTIFIERS +"RTN","BMXADOX1",189,0) + ; THE ENTRY POINT THAT GENERATES THE IDETIFIERS IS STORED IN THE BMX ADO SCHEMA FILE +"RTN","BMXADOX1",190,0) + N OUT,%,SIEN +"RTN","BMXADOX1",191,0) + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") +"RTN","BMXADOX1",192,0) + D SS^BMXADO(.OUT,SIEN,"","~1~1~") +"RTN","BMXADOX1",193,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",194,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",195,0) + Q +"RTN","BMXADOX1",196,0) + ; +"RTN","BMXADOX1",197,0) +JMD ; JOIN MASTER TO DETAIL +"RTN","BMXADOX1",198,0) + N OUT,%,SIEN1,SIEN2,VSTG,SIEN3,JSTG +"RTN","BMXADOX1",199,0) + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOX1",200,0) + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOX1",201,0) + S SIEN3=$$SCHEMA("VIEW MEDS") +"RTN","BMXADOX1",202,0) + S VSTG="~1~5" ; INSTRUCTIONS FOR GATHERING DATA SET FOR PTS 1-5 FROM THE MASTER FILE +"RTN","BMXADOX1",203,0) + S JSTG=SIEN3_",.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C" ; + INSTRUCTIONS FOR 1ST JOIN TO GET MEDS +"RTN","BMXADOX1",204,0) + S JSTG=JSTG_"@JOIN@"_SIEN2_",.001,.02IEN,AA~1/1/1988~12/31/1988~~~~~|WT|R" ; + INSTRUCTIONS FOR 2ND JOIN TO GET MSRMNTS +"RTN","BMXADOX1",205,0) + D SS^BMXADO(.OUT,SIEN1,"",VSTG,JSTG) +"RTN","BMXADOX1",206,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",207,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",208,0) + Q +"RTN","BMXADOX1",209,0) + ; +"RTN","BMXADOX1",210,0) +JVPT ; JOIN PT DEMOG TO VISIT +"RTN","BMXADOX1",211,0) + N OUT,%,SIEN1,SIEN2,VSTG,JSTG +"RTN","BMXADOX1",212,0) + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOX1",213,0) + S SIEN2=$$SCHEMA("VISITS") +"RTN","BMXADOX1",214,0) + S VSTG="~1~1" ; INSTRUCTIONS FOR GATHERING DATA SET FOR PT 5 FROM THE MASTER FILE +"RTN","BMXADOX1",215,0) + S JSTG=SIEN2_",.05IEN,.001,AC" ; + INSTRUCTIONS FOR 1ST JOIN TO GET VISIT INFO +"RTN","BMXADOX1",216,0) + D SS^BMXADO(.OUT,SIEN1,"",VSTG,JSTG) +"RTN","BMXADOX1",217,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",218,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",219,0) + Q +"RTN","BMXADOX1",220,0) + ; +"RTN","BMXADOX1",221,0) +JAC ; TEST AC INDEX +"RTN","BMXADOX1",222,0) + N OUT,%,SIEN1,SIEN2 +"RTN","BMXADOX1",223,0) + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOX1",224,0) + S SIEN2=$$SCHEMA("VIEW LABS") +"RTN","BMXADOX1",225,0) + S SIEN3=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOX1",226,0) + D SS^BMXADO(.OUT,SIEN1,"","~3~5~~~~~~"_SIEN2_",.001,.02IEN,AC@JOIN@"_SIEN3_",.001,.02IEN,AC") +"RTN","BMXADOX1",227,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",228,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",229,0) + Q +"RTN","BMXADOX1",230,0) + ; +"RTN","BMXADOX1",231,0) +JPB ; TEST AA INDEX JOINS FOR PROBLEM LIST +"RTN","BMXADOX1",232,0) + N OUT,%,SIEN1,SIEN2 +"RTN","BMXADOX1",233,0) + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOX1",234,0) + S SIEN2=$$SCHEMA("VIEW PROBLEMS") +"RTN","BMXADOX1",235,0) + D SS^BMXADO(.OUT,SIEN1,"","~1~5~~~~~~"_SIEN2_",.001,.02IEN,AA") +"RTN","BMXADOX1",236,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",237,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",238,0) + Q +"RTN","BMXADOX1",239,0) + ; +"RTN","BMXADOX1",240,0) +JSUB ; SUBFILE JOIN +"RTN","BMXADOX1",241,0) + ; IN THIS CASE THE RECORDS IN A PARENT FILE ARE "JOINED" TO THE RECORDS IN ONE OF ITS SUB FILES +"RTN","BMXADOX1",242,0) + ; THE SCHEMA IS ATTACHED TO THE "MEDICARE ELIGIBLE" FILE +"RTN","BMXADOX1",243,0) + ; IT IS JOINED TO ITS SUBFILE, "ELIG DATES", VIA THE UPDATE MEDICARE DATES SCHEMA +"RTN","BMXADOX1",244,0) + N OUT,%,SIEN1,SIEN2 +"RTN","BMXADOX1",245,0) + S SIEN1=$$SCHEMA("UPDATE MEDICARE INFO") +"RTN","BMXADOX1",246,0) + S SIEN2=$$SCHEMA("UPDATE MEDICARE DATES") +"RTN","BMXADOX1",247,0) + D SS^BMXADO(.OUT,SIEN1,"","~1~5~~~~~~"_SIEN2_",SUB") +"RTN","BMXADOX1",248,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX1",249,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",250,0) + Q +"RTN","BMXADOX1",251,0) + ; +"RTN","BMXADOX1",252,0) +ADD ; ADD A NEW ENTRY +"RTN","BMXADOX1",253,0) + ; THIS IS A 2 STEP PROCESS: +"RTN","BMXADOX1",254,0) + ; FIRST GET THE SCHEMA FOR THE FILE YOU WISH TO UPDATE +"RTN","BMXADOX1",255,0) + ; THIS SCHEMA TYPICALLY BEGINS WITH THE WORD "UPDATE" +"RTN","BMXADOX1",256,0) + ; IT CONTAINS NO ID IR IEN FIELDS +"RTN","BMXADOX1",257,0) + ; SECOND ADD THE DATA NODE TO THE ARRAY +"RTN","BMXADOX1",258,0) + ; IT HAS THE SAME FORMAT AS A DATA STRING ASSOCIATED WITH THE SCHEMA EXCEPT THE FIRST "^" PIECE IS NULL +"RTN","BMXADOX1",259,0) + ; THIS PIECE CORRESPONDS TO THE IEN OF THE RECORD. SINCE THE RECORD HASNOT BEEN ADDED YET, IT IS NULL. +"RTN","BMXADOX1",260,0) + ; IN THE DATA STRING, ALL POINTER VALUES ARE PRECEDED BY THE '`' CHARACTER AND EA. STRING ENDS IN $C(30) +"RTN","BMXADOX1",261,0) + ; MULTIPLE DATA STRINGS CAN BE APPENDED AS NEW NODES AT THE BOTTOM OF THE ARRAY +"RTN","BMXADOX1",262,0) + ; IN THIS CASE WE ARE ADDING A RECORD TO THE V MEASUREMENT FILE +"RTN","BMXADOX1",263,0) + ; DATA STRING="^MEASUREMENT TYPE IEN^PATIENT DFN^VISIT IEN^RESULT"_$C(30) +"RTN","BMXADOX1",264,0) + ; THERE ARE 2 INPUT PARAMS: +"RTN","BMXADOX1",265,0) + ; THE CLOSED REF WHERE THE INPUT ARRAY IS STORED +"RTN","BMXADOX1",266,0) + ; SINCE IT IS PASSED BY REFERENCE "OUT" CAN BE NULL OR UNDEFIEND. +"RTN","BMXADOX1",267,0) + ; OUT WILL BE DEFINED AT THE CONCLUSION OF THE TRANSACTION. +"RTN","BMXADOX1",268,0) + ; THE OUTPUT IS IN THE OUT ARRAY +"RTN","BMXADOX1",269,0) + ; OUT(1)="OK|ien" WHERE ien IS THE IEN OF THE RECORD THAT HAS BEE ADDED. +"RTN","BMXADOX1",270,0) + ; IF THE TRANSACTION FAILED, AN ERROR MSG WILL BE IN THE OUT ARRAY +"RTN","BMXADOX1",271,0) + ; +"RTN","BMXADOX1",272,0) + N OUT,%,SIEN,NODE +"RTN","BMXADOX1",273,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOX1",274,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX1",275,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX1",276,0) + S ^TMP("BMX ADO",$J,NODE)="^`2^`1^`71164^175.75"_$C(30) +"RTN","BMXADOX1",277,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOX1",278,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOX1",279,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",280,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOX1",281,0) + Q +"RTN","BMXADOX1",282,0) + ; +"RTN","BMXADOX1",283,0) +DELREC ; DELETE AN ENTRY +"RTN","BMXADOX1",284,0) + ; THE SIMPLEST WAY TO DELETE AN ENTRY IS TO PUT THE RECORD IEN IN THE DA STRING PRECEDED BY A MINUS SIGN +"RTN","BMXADOX1",285,0) + ; YOU CAN ALSO SET THE VALUE OF THE .01 FIELD TO "@" +"RTN","BMXADOX1",286,0) + ; IF THE VALUE OF THE .01 FIELD IS NULL AND THE DA STRING IS NOT PRECEDED BY A MINUS SIGN, THE TRANSACTION WILL BE CANCELLED +"RTN","BMXADOX1",287,0) + ; IF THE DA STRING IS NULL, THE TRANSACTION WILL BE CANCELLED +"RTN","BMXADOX1",288,0) + N OUT,%,SIEN,NODE,DEL +"RTN","BMXADOX1",289,0) + S DEL=51385 +"RTN","BMXADOX1",290,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOX1",291,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX1",292,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX1",293,0) + S ^TMP("BMX ADO",$J,NODE)="-"_DEL_$C(30) +"RTN","BMXADOX1",294,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOX1",295,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOX1",296,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",297,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOX1",298,0) + Q +"RTN","BMXADOX1",299,0) + ; +"RTN","BMXADOX1",300,0) +EDIT ; EDIT AN EXISTING ENTRY +"RTN","BMXADOX1",301,0) + ; SIMILAR TO ABOVE EXCEPT THAT THE FIRST "^" PIECE OF THE DATA NODE IS THE IEN OF THE RECORD TO BE EDITIED +"RTN","BMXADOX1",302,0) + ; NOTE THAT THERE IS NO '`' IN FRONT OF THE FIRST PIECE. IT IS A PURE INTEGER +"RTN","BMXADOX1",303,0) + N OUT,%,SIEN,NODE +"RTN","BMXADOX1",304,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOX1",305,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX1",306,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX1",307,0) + S ^TMP("BMX ADO",$J,NODE)="51385^^^^176^`6"_$C(30) +"RTN","BMXADOX1",308,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOX1",309,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOX1",310,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",311,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOX1",312,0) + Q +"RTN","BMXADOX1",313,0) + ; +"RTN","BMXADOX1",314,0) +DELVAL ; DELETE A VALUE IN A FIELD +"RTN","BMXADOX1",315,0) + ; SIMILAR TO EDIT EXCEPT THE VALUE IS "@" +"RTN","BMXADOX1",316,0) + N OUT,%,SIEN,NODE +"RTN","BMXADOX1",317,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOX1",318,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOX1",319,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOX1",320,0) + S ^TMP("BMX ADO",$J,NODE)="51385^^^^^@"_$C(30) +"RTN","BMXADOX1",321,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOX1",322,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOX1",323,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX1",324,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOX1",325,0) + Q +"RTN","BMXADOX2") +0^76^B11989229 +"RTN","BMXADOX2",1,0) +BMXADOX2 ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; +"RTN","BMXADOX2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOX2",3,0) + ; EXMAPLES OF FILEMAN SCHEMA GENERATION +"RTN","BMXADOX2",4,0) + ; +"RTN","BMXADOX2",5,0) +DISP(OUT) ; +"RTN","BMXADOX2",6,0) + D DISP^BMXADOX(OUT) +"RTN","BMXADOX2",7,0) + Q +"RTN","BMXADOX2",8,0) + ; +"RTN","BMXADOX2",9,0) +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN +"RTN","BMXADOX2",10,0) + N IEN +"RTN","BMXADOX2",11,0) + S IEN=$O(^BMXADO("B",NAME,0)) +"RTN","BMXADOX2",12,0) + Q IEN +"RTN","BMXADOX2",13,0) + ; +"RTN","BMXADOX2",14,0) + ; ---------------------------------------- LISTS ------------------------------------------ +"RTN","BMXADOX2",15,0) + ; +"RTN","BMXADOX2",16,0) +FIFOLIST N OUT,%,SIEN,NODE,NEXT +"RTN","BMXADOX2",17,0) + S NEXT="70470;8" +"RTN","BMXADOX2",18,0) + S SIEN=$$SCHEMA("VEN MOJO LIST DE FIFO") +"RTN","BMXADOX2",19,0) + D SS^BMXADO(.OUT,SIEN,"","~~~") ; GET ENCOUNTER LIST TO BE PROCESSED BY DATA ENTRY +"RTN","BMXADOX2",20,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",21,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",22,0) + Q +"RTN","BMXADOX2",23,0) + ; +"RTN","BMXADOX2",24,0) +PROBLIST ; LIST PROBLEMS +"RTN","BMXADOX2",25,0) + S SIEN=$$SCHEMA("VEN MOJO DE DX PROBLEM") +"RTN","BMXADOX2",26,0) + D SS^BMXADO(.OUT,SIEN,"","AC~5~5~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY +"RTN","BMXADOX2",27,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",28,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",29,0) + Q +"RTN","BMXADOX2",30,0) + ; +"RTN","BMXADOX2",31,0) +PTLIST ; LIST PATIENT WITH A SPECIFIC LOOKUP VALUE +"RTN","BMXADOX2",32,0) + N VAL +"RTN","BMXADOX2",33,0) + R "PATIENT: ",VAL:DTIME E Q +"RTN","BMXADOX2",34,0) + I '$L(VAL) Q +"RTN","BMXADOX2",35,0) + I VAL?1."^" Q +"RTN","BMXADOX2",36,0) + S SIEN=$$SCHEMA("VEN MOJO LIST PATIENTS") +"RTN","BMXADOX2",37,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~PT~BMXADOV2~"_VAL) +"RTN","BMXADOX2",38,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",39,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",40,0) + Q +"RTN","BMXADOX2",41,0) + ; +"RTN","BMXADOX2",42,0) +CLINLIST ; LIST CLINICS +"RTN","BMXADOX2",43,0) + S SIEN=$$SCHEMA("VEN MOJO LIST CLINICS") +"RTN","BMXADOX2",44,0) + D SS^BMXADO(.OUT,SIEN,"","B~~~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY +"RTN","BMXADOX2",45,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",46,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",47,0) + Q +"RTN","BMXADOX2",48,0) + ; +"RTN","BMXADOX2",49,0) +SEGLIST ; LIST DE SEGMENTS +"RTN","BMXADOX2",50,0) + S SIEN=$$SCHEMA("VEN MOJO DE SEGMENT") +"RTN","BMXADOX2",51,0) + D SS^BMXADO(.OUT,SIEN,"","~~~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY +"RTN","BMXADOX2",52,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",53,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",54,0) + Q +"RTN","BMXADOX2",55,0) + ; +"RTN","BMXADOX2",56,0) +NOTELIST ; LIST NOTES +"RTN","BMXADOX2",57,0) + ;N SIEN +"RTN","BMXADOX2",58,0) + ;D NOTELIST^VENPCCTG(.OUT,"70470") +"RTN","BMXADOX2",59,0) + ;D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",60,0) + ;K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",61,0) + Q +"RTN","BMXADOX2",62,0) + ; +"RTN","BMXADOX2",63,0) +PRVLIST ; PROVIDER LIST +"RTN","BMXADOX2",64,0) + N SIEN,OUT +"RTN","BMXADOX2",65,0) + S SIEN=$$SCHEMA("VEN MOJO LIST PROVIDERS") +"RTN","BMXADOX2",66,0) + D SS^BMXADO(.OUT,SIEN,"","B~~~5000") ; GET NOTE LIST TO BE PROCESSED BY DATA ENTRY +"RTN","BMXADOX2",67,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",68,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",69,0) + Q +"RTN","BMXADOX2",70,0) + ; +"RTN","BMXADOX2",71,0) +MLIST ; LIST MEASUREMNTS +"RTN","BMXADOX2",72,0) + S SIEN=$$SCHEMA("VEN MOJO LIST MEASUREMENTS") +"RTN","BMXADOX2",73,0) + D SS^BMXADO(.OUT,SIEN,"","B~~~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY +"RTN","BMXADOX2",74,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",75,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",76,0) + Q +"RTN","BMXADOX2",77,0) + ; +"RTN","BMXADOX2",78,0) +RXLIST ; A RX LIST FOR A PATIENT +"RTN","BMXADOX2",79,0) + N SIEN,OUT +"RTN","BMXADOX2",80,0) + S SIEN=$$SCHEMA("VEN MOJO RX LIST") +"RTN","BMXADOX2",81,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~MED~MOJORX~3") ; GET RX LIST +"RTN","BMXADOX2",82,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",83,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",84,0) + Q +"RTN","BMXADOX2",85,0) + ; +"RTN","BMXADOX2",86,0) +TQLIST ; TABLET QUEUE LIST +"RTN","BMXADOX2",87,0) + N SIEN,OUT +"RTN","BMXADOX2",88,0) + S SIEN=$$SCHEMA("VEN MOJO LIST TABLET QUEUE") +"RTN","BMXADOX2",89,0) + D SS^BMXADO(.OUT,SIEN,"","ATS~~~") ; GET PATIENT LIST +"RTN","BMXADOX2",90,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",91,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",92,0) + Q +"RTN","BMXADOX2",93,0) + ; +"RTN","BMXADOX2",94,0) +UHCLIST ; LIST HIDDEN COLUMNS +"RTN","BMXADOX2",95,0) + N SIEN,OUT +"RTN","BMXADOX2",96,0) + ; S SIEN=$$SCHEMA("VEN MOJO DE GFMT UHC") +"RTN","BMXADOX2",97,0) + D SS^BMXADO(.OUT,"VEN MOJO DE FMT GRID","","~~~") ; GET RX LIST +"RTN","BMXADOX2",98,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",99,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",100,0) + Q +"RTN","BMXADOX2",101,0) + ; +"RTN","BMXADOX2",102,0) +GSEGLIST ; LIST GRID PROPERTIES FOR SEGMENTS +"RTN","BMXADOX2",103,0) + N SIEN,OUT +"RTN","BMXADOX2",104,0) + D SS^BMXADO(.OUT,"VEN MOJO DE GRID FMT","","B~~~") ; GET RX LIST +"RTN","BMXADOX2",105,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",106,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",107,0) + Q +"RTN","BMXADOX2",108,0) + ; +"RTN","BMXADOX2",109,0) +ICDLIST ; LIST ICD CODE MATCHES +"RTN","BMXADOX2",110,0) + ;N NARR,OUT +"RTN","BMXADOX2",111,0) + ;W !,"Provider narrative: " R NARR:60 E Q +"RTN","BMXADOX2",112,0) + ;I '$L(NARR) Q +"RTN","BMXADOX2",113,0) + ;D ICDMATCH^VENPCCTP(.OUT,NARR) W !! +"RTN","BMXADOX2",114,0) + ;D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",115,0) + ;K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",116,0) + Q +"RTN","BMXADOX2",117,0) + ; +"RTN","BMXADOX2",118,0) +IMAGE ; LIST SEGMENT IMAGE CONTROL PARAMETERS +"RTN","BMXADOX2",119,0) + N SIEN,OUT +"RTN","BMXADOX2",120,0) + D SS^BMXADO(.OUT,"VEN MOJO DE SEG IMAGE","1,","~~~") ; GET RX LIST +"RTN","BMXADOX2",121,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOX2",122,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOX2",123,0) + Q +"RTN","BMXADOXX") +0^77^B166011930 +"RTN","BMXADOXX",1,0) +BMXADOXX ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; +"RTN","BMXADOXX",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOXX",3,0) + ; EXMAPLES OF RPMS SCHEMAE GENERATION +"RTN","BMXADOXX",4,0) + ; +"RTN","BMXADOXX",5,0) + ; +"RTN","BMXADOXX",6,0) +ADDPAT ; +"RTN","BMXADOXX",7,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",8,0) + ;S DFN=9285 +"RTN","BMXADOXX",9,0) + S SIEN=$$SCHEMA("UPDATE VA PATIENT") +"RTN","BMXADOXX",10,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",11,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",12,0) + S ^TMP("BMX ADO",$J,NODE)="^KANGAROO,KAP^M^1-1-83^151515555"_$C(30) +"RTN","BMXADOXX",13,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",14,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",15,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",16,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",17,0) + ; +"RTN","BMXADOXX",18,0) + Q +"RTN","BMXADOXX",19,0) + ; +"RTN","BMXADOXX",20,0) +DISP(OUT) ; TEMP DISPLAY +"RTN","BMXADOXX",21,0) + N I,X +"RTN","BMXADOXX",22,0) + S I=0 W ! +"RTN","BMXADOXX",23,0) + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X +"RTN","BMXADOXX",24,0) + Q +"RTN","BMXADOXX",25,0) + ; +"RTN","BMXADOXX",26,0) +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN +"RTN","BMXADOXX",27,0) + N IEN +"RTN","BMXADOXX",28,0) + S IEN=$O(^BMXADO("B",NAME,0)) +"RTN","BMXADOXX",29,0) + Q IEN +"RTN","BMXADOXX",30,0) + ; +"RTN","BMXADOXX",31,0) +NEXTNUM(DFN,LOC) ; RETURN THE NEXT PROBLEM NUMBER FOR A PATIENT +"RTN","BMXADOXX",32,0) + N X,LAST,MAX,NUM +"RTN","BMXADOXX",33,0) + S NUM=0,MAX="" +"RTN","BMXADOXX",34,0) + F S NUM=$O(^AUPNPROB("AA",DFN,LOC,NUM)) Q:NUM="" S X=$E(NUM,2,99) I +X>MAX S MAX=+X +"RTN","BMXADOXX",35,0) + I 'MAX Q 1 +"RTN","BMXADOXX",36,0) + S X=X+1 S X=X\1 +"RTN","BMXADOXX",37,0) + Q X +"RTN","BMXADOXX",38,0) + ; +"RTN","BMXADOXX",39,0) +DEMOG ; VIEW DEMOGRAPHICS +"RTN","BMXADOXX",40,0) + N OUT,%,DFN,MAX,SIEN +"RTN","BMXADOXX",41,0) + S DFN=1373,MAX=1000 +"RTN","BMXADOXX",42,0) + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") +"RTN","BMXADOXX",43,0) + D SS^BMXADO(.OUT,SIEN,"",("~"_DFN_"~"_DFN_"~"_MAX)) +"RTN","BMXADOXX",44,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",45,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",46,0) + Q +"RTN","BMXADOXX",47,0) + ; +"RTN","BMXADOXX",48,0) +MEDICARE ; UPDATE MEDICARE DATES/INFO +"RTN","BMXADOXX",49,0) + N OUT,%,DAS,PIEN,JIEN,DFN,MAX +"RTN","BMXADOXX",50,0) + S DFN=1,MAX=1000 +"RTN","BMXADOXX",51,0) + S DAS=DFN_"," +"RTN","BMXADOXX",52,0) + S PIEN=$$SCHEMA("UPDATE MEDICARE DATES") +"RTN","BMXADOXX",53,0) + S JIEN=$$SCHEMA("UPDATE MEDICARE INFO") +"RTN","BMXADOXX",54,0) + D SS^BMXADO(.OUT,PIEN,DAS,("~"_DFN_"~"_DFN_"~"_MAX_"~~"_"MEDICARE~BMXADOV2~~"_JIEN_",PARENT")) +"RTN","BMXADOXX",55,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",56,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",57,0) + Q +"RTN","BMXADOXX",58,0) + ; +"RTN","BMXADOXX",59,0) +MEDICAID ; VIEW MEDICAID DATES/INFO +"RTN","BMXADOXX",60,0) + N OUT,%,DAS,PIEN,JIEN,DFN,DA +"RTN","BMXADOXX",61,0) + S DFN=322 +"RTN","BMXADOXX",62,0) + S DA(1)=$$MCDIEN^BMXADOV2(DFN) I 'DA(1) Q +"RTN","BMXADOXX",63,0) + S DAS=DA(1)_"," +"RTN","BMXADOXX",64,0) + S PIEN=$$SCHEMA("UPDATE MEDICAID DATES") +"RTN","BMXADOXX",65,0) + S JIEN=$$SCHEMA("UPDATE MEDICAID INFO") +"RTN","BMXADOXX",66,0) + D SS^BMXADO(.OUT,PIEN,DAS,("~~~~~MEDICAID~BMXADOV2~~"_JIEN_",PARENT")) +"RTN","BMXADOXX",67,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",68,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",69,0) + Q +"RTN","BMXADOXX",70,0) + ; +"RTN","BMXADOXX",71,0) +PVTINS ; VIEW PRIVATE INSURANCE DATES/INFO +"RTN","BMXADOXX",72,0) + N OUT,%,DAS,SIEN,DFN +"RTN","BMXADOXX",73,0) + S DFN=96 +"RTN","BMXADOXX",74,0) + S DAS=DFN_"," +"RTN","BMXADOXX",75,0) + S SIEN=$$SCHEMA("UPDATE PVT INSURANCE INFO") +"RTN","BMXADOXX",76,0) + D SS^BMXADO(.OUT,SIEN,DAS,"~~~~~PVTINS~BMXADOV2~~") +"RTN","BMXADOXX",77,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",78,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",79,0) + Q +"RTN","BMXADOXX",80,0) + ; +"RTN","BMXADOXX",81,0) +VISIT ; VIEW VISITS +"RTN","BMXADOXX",82,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",83,0) + S DFN=9285 +"RTN","BMXADOXX",84,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOXX",85,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1968~6/4/2004~100~~~~9285|C") +"RTN","BMXADOXX",86,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",87,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",88,0) + Q +"RTN","BMXADOXX",89,0) + ; +"RTN","BMXADOXX",90,0) +DUPVIS ; DISPLAY POSSIBLE DUPLICATE VISITS +"RTN","BMXADOXX",91,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",92,0) + S DFN=9285 +"RTN","BMXADOXX",93,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOXX",94,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~9285|5/24/04@1PM|I|516|~") +"RTN","BMXADOXX",95,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",96,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",97,0) + Q +"RTN","BMXADOXX",98,0) + ; +"RTN","BMXADOXX",99,0) +ADDVIS ; ADD A NEW VISIT +"RTN","BMXADOXX",100,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",101,0) + S DFN=9285 +"RTN","BMXADOXX",102,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOXX",103,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",104,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",105,0) + S ^TMP("BMX ADO",$J,NODE)="^JUN 03, 2004@01:32^I^`9285^`516^A^`2"_$C(30) +"RTN","BMXADOXX",106,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",107,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",108,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",109,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",110,0) + Q +"RTN","BMXADOXX",111,0) + ; +"RTN","BMXADOXX",112,0) +POV ; DISPLAY POVS +"RTN","BMXADOXX",113,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",114,0) + S DFN=9285 +"RTN","BMXADOXX",115,0) + S SIEN=$$SCHEMA("VIEW POVS") +"RTN","BMXADOXX",116,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~100~~~~9285|C") +"RTN","BMXADOXX",117,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",118,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",119,0) + Q +"RTN","BMXADOXX",120,0) + ; +"RTN","BMXADOXX",121,0) +ADDPOV ; ADD A POV TO AN EXISITING VISIT +"RTN","BMXADOXX",122,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",123,0) + S DFN=9285 +"RTN","BMXADOXX",124,0) + S SIEN=$$SCHEMA("UPDATE POVS") +"RTN","BMXADOXX",125,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",126,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",127,0) + S ^TMP("BMX ADO",$J,NODE)="^`8718^`9285^`8337^DM II ON EXPMTL MEDS^2^P"_$C(30) +"RTN","BMXADOXX",128,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",129,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",130,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",131,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",132,0) + Q +"RTN","BMXADOXX",133,0) + ; +"RTN","BMXADOXX",134,0) +EDITPOV ; ADD A POV TO AN EXISITING VISIT +"RTN","BMXADOXX",135,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",136,0) + S DFN=1 +"RTN","BMXADOXX",137,0) + S SIEN=$$SCHEMA("UPDATE POVS") +"RTN","BMXADOXX",138,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",139,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",140,0) + S ^TMP("BMX ADO",$J,NODE)="2815^`8718^`9285^`8337^DM II ON SPECIAL MEDS^2^P"_$C(30) +"RTN","BMXADOXX",141,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",142,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",143,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",144,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",145,0) + Q +"RTN","BMXADOXX",146,0) + ; +"RTN","BMXADOXX",147,0) +PROB ; DISPLAY PROBLEMS +"RTN","BMXADOXX",148,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",149,0) + S DFN=1373 +"RTN","BMXADOXX",150,0) + S SIEN=$$SCHEMA("VIEW PROBLEMS") +"RTN","BMXADOXX",151,0) + D SS^BMXADO(.OUT,SIEN,"","AA~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOXX",152,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",153,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",154,0) + Q +"RTN","BMXADOXX",155,0) + ; +"RTN","BMXADOXX",156,0) +ADDPROB ; ADD A PROBLEM TO THE PROBLEM LIST +"RTN","BMXADOXX",157,0) + N OUT,%,SIEN,DFN,NODE,NUM,LOC,ICD,TEXT,AIR,IEN +"RTN","BMXADOXX",158,0) + S ICD=2477 +"RTN","BMXADOXX",159,0) + S TEXT="HYPERTENSION ON SPECIAL MEDS" +"RTN","BMXADOXX",160,0) + S DFN=1373,LOC=DUZ(2) +"RTN","BMXADOXX",161,0) + S SIEN=$$SCHEMA("UPDATE PROBLEMS") +"RTN","BMXADOXX",162,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",163,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",164,0) + S ^TMP("BMX ADO",$J,NODE)=U_"`"_ICD_U_"`"_DFN_U_DT_U_U_TEXT_U_"`"_LOC_U_DT_U_$C(30) +"RTN","BMXADOXX",165,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",166,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",167,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",168,0) + S IEN=+$P(OUT(1),"|",2) I '$D(^AUPNPROB(IEN,0)) Q +"RTN","BMXADOXX",169,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",170,0) + K OUT +"RTN","BMXADOXX",171,0) + S NUM=$$NEXTNUM(DFN,LOC) I 'NUM Q +"RTN","BMXADOXX",172,0) + S SIEN=$$SCHEMA("UPDATE PROBLEM NUMBER") +"RTN","BMXADOXX",173,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",174,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",175,0) + S ^TMP("BMX ADO",$J,NODE)=IEN_U_NUM_U_"A"_$C(30) +"RTN","BMXADOXX",176,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",177,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",178,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",179,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",180,0) + Q +"RTN","BMXADOXX",181,0) + ; +"RTN","BMXADOXX",182,0) +MEAS ; DISPLAY MEASUREMENTS +"RTN","BMXADOXX",183,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",184,0) + S DFN=2 +"RTN","BMXADOXX",185,0) + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOXX",186,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~10~~~~"_DFN_"|WT|C") +"RTN","BMXADOXX",187,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",188,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",189,0) + Q +"RTN","BMXADOXX",190,0) + ; +"RTN","BMXADOXX",191,0) +ADDMEAS ; UPDATE V MEASUREMENT FILE +"RTN","BMXADOXX",192,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",193,0) + S DFN=2 +"RTN","BMXADOXX",194,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOXX",195,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",196,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",197,0) + S ^TMP("BMX ADO",$J,NODE)="^`2^`"_DFN_"^`7806^172.75"_$C(30) +"RTN","BMXADOXX",198,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",199,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",200,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",201,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",202,0) + Q +"RTN","BMXADOXX",203,0) + ; +"RTN","BMXADOXX",204,0) +MEDS ; DISPLAY MEDS +"RTN","BMXADOXX",205,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",206,0) + S DFN=152 +"RTN","BMXADOXX",207,0) + S SIEN=$$SCHEMA("VIEW MEDS") +"RTN","BMXADOXX",208,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1969~12/31/2004~10~~~~"_DFN_"|C") +"RTN","BMXADOXX",209,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",210,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",211,0) + Q +"RTN","BMXADOXX",212,0) + ; +"RTN","BMXADOXX",213,0) +ADDMEDS ; UPDATE V MED FILE +"RTN","BMXADOXX",214,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",215,0) + S DFN=2 +"RTN","BMXADOXX",216,0) + S SIEN=$$SCHEMA("UPDATE MEDS") +"RTN","BMXADOXX",217,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",218,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",219,0) + S ^TMP("BMX ADO",$J,NODE)="^`305^`"_DFN_"^`7806^T1T QID^40"_$C(30) +"RTN","BMXADOXX",220,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",221,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",222,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",223,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",224,0) + Q +"RTN","BMXADOXX",225,0) + ; +"RTN","BMXADOXX",226,0) +LAB ; DISPLAY LAB TEST RESULTS +"RTN","BMXADOXX",227,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",228,0) + S DFN=280 +"RTN","BMXADOXX",229,0) + S SIEN=$$SCHEMA("VIEW LABS") +"RTN","BMXADOXX",230,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1965~12/31/2003~10~~~~"_DFN_"|175|C") +"RTN","BMXADOXX",231,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",232,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",233,0) + Q +"RTN","BMXADOXX",234,0) + ; +"RTN","BMXADOXX",235,0) +ADDLAB ; UPDATE V LAB +"RTN","BMXADOXX",236,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",237,0) + S DFN=2 +"RTN","BMXADOXX",238,0) + S SIEN=$$SCHEMA("UPDATE LABS") +"RTN","BMXADOXX",239,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",240,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",241,0) + S ^TMP("BMX ADO",$J,NODE)="^`175^`"_DFN_"^`7806^216"_$C(30) +"RTN","BMXADOXX",242,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",243,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",244,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",245,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",246,0) + Q +"RTN","BMXADOXX",247,0) + ; +"RTN","BMXADOXX",248,0) +EXAMS ; DISPLAY EXAMS +"RTN","BMXADOXX",249,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",250,0) + S DFN=1373 +"RTN","BMXADOXX",251,0) + S SIEN=$$SCHEMA("VIEW EXAMS") +"RTN","BMXADOXX",252,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1966~12/31/2003~10~~~~"_DFN_"|6|C") +"RTN","BMXADOXX",253,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",254,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",255,0) + Q +"RTN","BMXADOXX",256,0) + ; +"RTN","BMXADOXX",257,0) +ADDEXAMS ; UPDATE V EXAM +"RTN","BMXADOXX",258,0) + S DFN=2 +"RTN","BMXADOXX",259,0) + S SIEN=$$SCHEMA("UPDATE EXAMS") +"RTN","BMXADOXX",260,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",261,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",262,0) + S ^TMP("BMX ADO",$J,NODE)="^`6^`"_DFN_"^`7806^NORMAL"_$C(30) +"RTN","BMXADOXX",263,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",264,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",265,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",266,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",267,0) + Q +"RTN","BMXADOXX",268,0) + ; +"RTN","BMXADOXX",269,0) +IMM ; DISPLAY IMMUNIZATIONS +"RTN","BMXADOXX",270,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",271,0) + S DFN=54 +"RTN","BMXADOXX",272,0) + S SIEN=$$SCHEMA("VIEW IMM") +"RTN","BMXADOXX",273,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1966~12/31/2003~10~~~~"_DFN_"|101|C") +"RTN","BMXADOXX",274,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",275,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",276,0) + Q +"RTN","BMXADOXX",277,0) + ; +"RTN","BMXADOXX",278,0) +PROV ; DISPLAY PROVIDERS FOR A VISIT +"RTN","BMXADOXX",279,0) + N OUT,%,SIEN,VIEN +"RTN","BMXADOXX",280,0) + S VIEN=4703 +"RTN","BMXADOXX",281,0) + S SIEN=$$SCHEMA("VIEW PROV") +"RTN","BMXADOXX",282,0) + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") +"RTN","BMXADOXX",283,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",284,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",285,0) + Q +"RTN","BMXADOXX",286,0) + ; +"RTN","BMXADOXX",287,0) +ADDPROV ; UPDATE V PROVIDER FILE +"RTN","BMXADOXX",288,0) + N OUT,%,SIEN,NODE,PIEN,DFN +"RTN","BMXADOXX",289,0) + S PIEN=DUZ,DFN=2 +"RTN","BMXADOXX",290,0) + I $P(^DD(9000010.06,.01,0),U,3)["DIC(6" S PIEN=$P(^VA(200,PIEN,0),U,16) ; CONVERT FILE 200 TO FILE 16 IF NECESS. +"RTN","BMXADOXX",291,0) + S SIEN=$$SCHEMA("UPDATE PROV") +"RTN","BMXADOXX",292,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",293,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",294,0) + S ^TMP("BMX ADO",$J,NODE)="^`"_PIEN_"^`"_DFN_"^`7806^P"_$C(30) +"RTN","BMXADOXX",295,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",296,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",297,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",298,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",299,0) + Q +"RTN","BMXADOXX",300,0) + ; +"RTN","BMXADOXX",301,0) +PROC ; DISPLAY PROCEDURES +"RTN","BMXADOXX",302,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",303,0) + S DFN=235 +"RTN","BMXADOXX",304,0) + S SIEN=$$SCHEMA("VIEW PROCEDURES") +"RTN","BMXADOXX",305,0) + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1965~12/31/2003~10~~~~"_DFN_"|C") +"RTN","BMXADOXX",306,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",307,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",308,0) + Q +"RTN","BMXADOXX",309,0) + ; +"RTN","BMXADOXX",310,0) +ADDPROC ; UPDATE V PROCEDURES FILE +"RTN","BMXADOXX",311,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",312,0) + S DFN=2 +"RTN","BMXADOXX",313,0) + S SIEN=$$SCHEMA("UPDATE PROCEDURES") +"RTN","BMXADOXX",314,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",315,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",316,0) + S ^TMP("BMX ADO",$J,NODE)="^`2198^`"_DFN_"^`7806^`8718"_$C(30) +"RTN","BMXADOXX",317,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",318,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",319,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",320,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",321,0) + Q +"RTN","BMXADOXX",322,0) + ; +"RTN","BMXADOXX",323,0) +CPT ; DISPLAY CPT CODES +"RTN","BMXADOXX",324,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",325,0) + S VIEN=8082 +"RTN","BMXADOXX",326,0) + S SIEN=$$SCHEMA("VIEW CPT") +"RTN","BMXADOXX",327,0) + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") +"RTN","BMXADOXX",328,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",329,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",330,0) + Q +"RTN","BMXADOXX",331,0) + ; +"RTN","BMXADOXX",332,0) +ADDCPT ; UPDATE V CPT FILE +"RTN","BMXADOXX",333,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",334,0) + S DFN=2 +"RTN","BMXADOXX",335,0) + S SIEN=$$SCHEMA("UPDATE CPT") +"RTN","BMXADOXX",336,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",337,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",338,0) + S ^TMP("BMX ADO",$J,NODE)="^`10000^`"_DFN_"^`7806"_$C(30) +"RTN","BMXADOXX",339,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",340,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",341,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",342,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",343,0) + Q +"RTN","BMXADOXX",344,0) + ; +"RTN","BMXADOXX",345,0) +PH ; DISPLAY PERSONAL HISTORY +"RTN","BMXADOXX",346,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",347,0) + S DFN=1373 +"RTN","BMXADOXX",348,0) + S SIEN=$$SCHEMA("VIEW PERSONAL HISTORY") +"RTN","BMXADOXX",349,0) + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOXX",350,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",351,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",352,0) + Q +"RTN","BMXADOXX",353,0) + ; +"RTN","BMXADOXX",354,0) +ADDPH ; UPDATE PERSONAL HX +"RTN","BMXADOXX",355,0) + N OUT,%,SIEN,DFN,NODE,ICD,TEXT +"RTN","BMXADOXX",356,0) + S ICD=2477 +"RTN","BMXADOXX",357,0) + S TEXT="PERSONAL HISTORY OF SERIOUS PROBLEMS" +"RTN","BMXADOXX",358,0) + S DFN=2 +"RTN","BMXADOXX",359,0) + S SIEN=$$SCHEMA("UPDATE PERSONAL HISTORY") +"RTN","BMXADOXX",360,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",361,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",362,0) + S ^TMP("BMX ADO",$J,NODE)="^`11353^`"_DFN_"^2851219^"_TEXT_"^2810303"_$C(30) +"RTN","BMXADOXX",363,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",364,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",365,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",366,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",367,0) + Q +"RTN","BMXADOXX",368,0) + ; +"RTN","BMXADOXX",369,0) +FH ; DISPLAY FAMILY HX +"RTN","BMXADOXX",370,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",371,0) + S DFN=631 +"RTN","BMXADOXX",372,0) + S SIEN=$$SCHEMA("VIEW FAMILY HISTORY") +"RTN","BMXADOXX",373,0) + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOXX",374,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",375,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",376,0) + Q +"RTN","BMXADOXX",377,0) + ; +"RTN","BMXADOXX",378,0) +ADDFH ; UPDATE FAMILY HISTORY +"RTN","BMXADOXX",379,0) + N OUT,%,SIEN,DFN,NODE,ICD,TEXT +"RTN","BMXADOXX",380,0) + S ICD=2477 +"RTN","BMXADOXX",381,0) + S TEXT="FAMILY HISTORY OF SERIOUS PROBLEMS" +"RTN","BMXADOXX",382,0) + S DFN=2 +"RTN","BMXADOXX",383,0) + S SIEN=$$SCHEMA("UPDATE FAMILY HISTORY") +"RTN","BMXADOXX",384,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",385,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",386,0) + S ^TMP("BMX ADO",$J,NODE)="^`7571^`"_DFN_"^2851219^"_TEXT_$C(30) +"RTN","BMXADOXX",387,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",388,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",389,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",390,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",391,0) + Q +"RTN","BMXADOXX",392,0) + ; +"RTN","BMXADOXX",393,0) +HF ; DISPLAY HEALTH FACTORS +"RTN","BMXADOXX",394,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",395,0) + S DFN=2390 +"RTN","BMXADOXX",396,0) + S SIEN=$$SCHEMA("VIEW HEALTH FACTORS") +"RTN","BMXADOXX",397,0) + D SS^BMXADO(.OUT,SIEN,"","AC"_"~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOXX",398,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",399,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",400,0) + Q +"RTN","BMXADOXX",401,0) + ; +"RTN","BMXADOXX",402,0) +ADDHF ; UPDATE HEALTH FACTORS FILE +"RTN","BMXADOXX",403,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",404,0) + S DFN=2 +"RTN","BMXADOXX",405,0) + S SIEN=$$SCHEMA("UPDATE HEALTH FACTORS") +"RTN","BMXADOXX",406,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",407,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",408,0) + S ^TMP("BMX ADO",$J,NODE)="^`3^`"_DFN_U_DT_$C(30) +"RTN","BMXADOXX",409,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",410,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",411,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",412,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",413,0) + Q +"RTN","BMXADOXX",414,0) + ; +"RTN","BMXADOXX",415,0) +REPRO ; DISPLAY REPRODUCTIVE FACTORS +"RTN","BMXADOXX",416,0) + N OUT,%,SIEN,DFN +"RTN","BMXADOXX",417,0) + S DFN=1373 +"RTN","BMXADOXX",418,0) + S SIEN=$$SCHEMA("VIEW REPRODUCTIVE FACTORS") +"RTN","BMXADOXX",419,0) + D SS^BMXADO(.OUT,SIEN,"","B"_"~"_DFN_"~"_DFN_"~~~~~") +"RTN","BMXADOXX",420,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",421,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",422,0) + Q +"RTN","BMXADOXX",423,0) + ; +"RTN","BMXADOXX",424,0) +ADDREPRO ; UPDATE REPRODUCTIVE FACTORS +"RTN","BMXADOXX",425,0) + ; THE .O1 FIELD IS DINUMED +"RTN","BMXADOXX",426,0) + ; THEREFORE, THE FILER WILL AUTOMATICALLY SWITCH TO MOD MODE IF A RECORD ALREADY EXISTS FOR THIS PATIENT +"RTN","BMXADOXX",427,0) + N OUT,%,SIEN,DFN,NODE +"RTN","BMXADOXX",428,0) + S DFN=2 +"RTN","BMXADOXX",429,0) + ; I $D(^AUPNREP(DFN)) G ERF +"RTN","BMXADOXX",430,0) + S SIEN=$$SCHEMA("UPDATE REPRODUCTIVE FACTORS") +"RTN","BMXADOXX",431,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXX",432,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXX",433,0) + S ^TMP("BMX ADO",$J,NODE)="^`"_DFN_"^G5P4LC3SA1TA0^"_DT_"^2^3040101^"_DT_$C(30) +"RTN","BMXADOXX",434,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXX",435,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) +"RTN","BMXADOXX",436,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXX",437,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) +"RTN","BMXADOXX",438,0) + Q +"RTN","BMXADOXX",439,0) + ; +"RTN","BMXADOXY") +0^78^B61093377 +"RTN","BMXADOXY",1,0) +BMXADOXY ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; +"RTN","BMXADOXY",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXADOXY",3,0) + ; EXMAPLES OF FILEMAN SCHEMA GENERATION +"RTN","BMXADOXY",4,0) + ; +"RTN","BMXADOXY",5,0) + ; +"RTN","BMXADOXY",6,0) + ; +"RTN","BMXADOXY",7,0) +DISP(OUT) ; TEMP DISPLAY OF THE ANR +"RTN","BMXADOXY",8,0) + N I,X +"RTN","BMXADOXY",9,0) + S I=0 W ! +"RTN","BMXADOXY",10,0) + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X +"RTN","BMXADOXY",11,0) + Q +"RTN","BMXADOXY",12,0) + ; +"RTN","BMXADOXY",13,0) +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN +"RTN","BMXADOXY",14,0) + N IEN +"RTN","BMXADOXY",15,0) + S IEN=$O(^BMXADO("B",NAME,0)) +"RTN","BMXADOXY",16,0) + Q IEN +"RTN","BMXADOXY",17,0) + ; +"RTN","BMXADOXY",18,0) +NUM ; ITERATE BY IEN +"RTN","BMXADOXY",19,0) + ; IX="",START WITH IEN=1, STOP AFTER IEN=20, MAX # RECORDS RETURNED = 5 +"RTN","BMXADOXY",20,0) + ; TO VIEW INTERNAL VALUES SET VSTG="~1~20~5~I" +"RTN","BMXADOXY",21,0) + N OUT,%,SIEN +"RTN","BMXADOXY",22,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOXY",23,0) + D SS^BMXADO(.OUT,SIEN,"","~1~20~5") +"RTN","BMXADOXY",24,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",25,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",26,0) + Q +"RTN","BMXADOXY",27,0) + ; +"RTN","BMXADOXY",28,0) +IX ; ITERATE BY INDEX +"RTN","BMXADOXY",29,0) + ; ITERATE USING THE "B" INDEX +"RTN","BMXADOXY",30,0) + ; START WITH PT NAME "C", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 +"RTN","BMXADOXY",31,0) + N OUT,%,SIEN +"RTN","BMXADOXY",32,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOXY",33,0) + D SS^BMXADO(.OUT,SIEN,"","B~C~D~5") +"RTN","BMXADOXY",34,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",35,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",36,0) + Q +"RTN","BMXADOXY",37,0) + ; +"RTN","BMXADOXY",38,0) +RENT ; ITERATE IN CHUNKS +"RTN","BMXADOXY",39,0) + ; RE-ITERATE USING THE "B" INDEX +"RTN","BMXADOXY",40,0) + ; START WITH PT IEN 5 AS THE "SEED", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 +"RTN","BMXADOXY",41,0) + N OUT,%,SIEN,SEED,LSEED,X,Y +"RTN","BMXADOXY",42,0) + S SEED=0,LSEED="" +"RTN","BMXADOXY",43,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOXY",44,0) +RIT F D I '$G(SEED) Q +"RTN","BMXADOXY",45,0) + . D SS^BMXADO(.OUT,SIEN,SEED,"B~CA~CB~5") +"RTN","BMXADOXY",46,0) + . D DISP(OUT) R %:$G(DTIME,60) E S SEED="" Q +"RTN","BMXADOXY",47,0) + . I %?1"^" S SEED="" Q +"RTN","BMXADOXY",48,0) + . S X=$P(@OUT@(1),U,1) +"RTN","BMXADOXY",49,0) + . S SEED=$P(X,"|",3) +"RTN","BMXADOXY",50,0) + . I SEED=LSEED S SEED="" Q +"RTN","BMXADOXY",51,0) + . S LSEED=SEED +"RTN","BMXADOXY",52,0) + . K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",53,0) + . Q +"RTN","BMXADOXY",54,0) + Q +"RTN","BMXADOXY",55,0) + ; +"RTN","BMXADOXY",56,0) +SUB ; SUBFILE ITERATION +"RTN","BMXADOXY",57,0) + ; THE SCHEMA IS ATTACHED TO THE MEDICARE ELIGIBILITY FILE/ELIG DATE SUBFILE +"RTN","BMXADOXY",58,0) + ; THE DA STRING HAS A VALUE OF '4,',: THE IEN IN THE PARENT FILE (PATIENT DFN). +"RTN","BMXADOXY",59,0) + ; NOTE THE COMMA IN THE DA STRING. THIS INDICATES THAT THE FILE IEN IS 4 BUT THE SUBFILE IEN IS UNSPECIFIED +"RTN","BMXADOXY",60,0) + N OUT,%,SIEN +"RTN","BMXADOXY",61,0) + S SIEN=$$SCHEMA("UPDATE MEDICARE DATES") +"RTN","BMXADOXY",62,0) + ;D SS^BMXADO(.OUT,SIEN,"1,","~~~") +"RTN","BMXADOXY",63,0) + D SS^BMXADO(.OUT,18,"1,","~~~") +"RTN","BMXADOXY",64,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",65,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",66,0) + Q +"RTN","BMXADOXY",67,0) + ; +"RTN","BMXADOXY",68,0) +DINUM ; DINUMED POINTER ITERATION +"RTN","BMXADOXY",69,0) + ; THE SCHEMA IS ATTACHED TO THE PATIENT FILE (9000001) +"RTN","BMXADOXY",70,0) + ; THE PATIENT FILE IS DINUM'D AND ITS .01 FIELD POINTS TO THE VA PATIENT FILE (2) +"RTN","BMXADOXY",71,0) + ; BECAUSE OF THE SPECIAL RELATIONSHIP BETWEEN THE FILES, WE CAN USE THE B INDEX OF FILE 2 TO ITERATE FILE 9000001. +"RTN","BMXADOXY",72,0) + N OUT,%,SIEN +"RTN","BMXADOXY",73,0) + S SIEN=$$SCHEMA("IHS PATIENT") +"RTN","BMXADOXY",74,0) + D SS^BMXADO(.OUT,SIEN,"","B~A~B~5") +"RTN","BMXADOXY",75,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",76,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",77,0) + Q +"RTN","BMXADOXY",78,0) + ; +"RTN","BMXADOXY",79,0) +IXP ; INDEXED POINTER ITERATION +"RTN","BMXADOXY",80,0) + ; THE SCHEMA IS ATTACHED TO THE V POV FILE +"RTN","BMXADOXY",81,0) + ; THE AC CROSS REFERENCE INDEXES THE PATIENT FIELD +"RTN","BMXADOXY",82,0) + ; BY STARTING AND STOPING WITH PATIENT 235 (MAX=5) WE COLLECT THE FIRST 5 POVS FOR PATIENT 235 IN THE FILE +"RTN","BMXADOXY",83,0) + N OUT,%,SIEN +"RTN","BMXADOXY",84,0) + S SIEN=$$SCHEMA("VIEW POVS") +"RTN","BMXADOXY",85,0) + D SS^BMXADO(.OUT,SIEN,"","AC~235~235~5") +"RTN","BMXADOXY",86,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",87,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",88,0) + Q +"RTN","BMXADOXY",89,0) + ; +"RTN","BMXADOXY",90,0) +AA ; ITERATE USING AA INDEX +"RTN","BMXADOXY",91,0) + ; INDEX IS 'AA" THE START AND STOP DATES ARE SPECIFIED IN EXTERNAL FORMAT. MAX=10 +"RTN","BMXADOXY",92,0) + ; THE FOLLOWING FILTERS ARE SPECIFIED IN THE LAST PARAMETER ("235|WT|C"): +"RTN","BMXADOXY",93,0) + ; 235=PATIENT DFN #235 +"RTN","BMXADOXY",94,0) + ; WT=RETURN ONLY WEIGHTS. MEASUREMENT TYPE MUST BE SPECIFIED WITH A VALID, UNAMBIGUOUS LOOKUP VALUE. +"RTN","BMXADOXY",95,0) + ; C=RETRUN VALUES IN CHRONOLOGICAL ORDER USE 'R' INSTEAD OF 'C' FOR REVERSE CHRONOLOGICAL ORDER. DEFAULT=C +"RTN","BMXADOXY",96,0) + ; THE SEED PARAMTER IS SET AND CAN BE USED TO RETURN DATA IN CHUNKS +"RTN","BMXADOXY",97,0) + N OUT,%,SIEN +"RTN","BMXADOXY",98,0) + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOXY",99,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~5~~~~235|WT|C") +"RTN","BMXADOXY",100,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",101,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",102,0) + Q +"RTN","BMXADOXY",103,0) + ; +"RTN","BMXADOXY",104,0) +AA2 ; ITERATE USING AA INDEX +"RTN","BMXADOXY",105,0) + ; THIS SCHEMA IS ATTACHED TO THE VISIT FILE (9000010) +"RTN","BMXADOXY",106,0) + ; IN THIS CASE THERE IS NO ATTRIBUTE TYPE SO THE FILTER PARAM HAS ONLY 2 PIECES "1|R" +"RTN","BMXADOXY",107,0) + ; 235=PATIENT DFN +"RTN","BMXADOXY",108,0) + ; R=RETURN DATA IN REVERSE CHRONOLOGICAL ORDER +"RTN","BMXADOXY",109,0) + N OUT,%,SIEN +"RTN","BMXADOXY",110,0) + S SIEN=$$SCHEMA("VISITS") ;12 +"RTN","BMXADOXY",111,0) + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~5~~~~235|R") +"RTN","BMXADOXY",112,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",113,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",114,0) + Q +"RTN","BMXADOXY",115,0) + ; +"RTN","BMXADOXY",116,0) +CIT ; CUSTOM ITERATOR +"RTN","BMXADOXY",117,0) + ; IF COMPLEX OR UNUSUAL SORTING/FILTERING IS REQUITED, USE A CUSTOM ITERATOR +"RTN","BMXADOXY",118,0) + ; THE CUSTOM ITERATOR IS DEFINED BY 6TH, 7TH AND 8TH PIECES IN THE VSTG +"RTN","BMXADOXY",119,0) + ; PIECE 8=TAG, PIECE 9=ROUTINE, PIECE 8=A PARAMETER PASSED TO THE ENTRY POINT +"RTN","BMXADOXY",120,0) + ; THE 9TH PIECE CONTAINS PT DFN, TIMESTAMP, VISIT TYPE, LOC IEN, AND SERVICE CATEGORY IN A "|" DELIMTED STRING +"RTN","BMXADOXY",121,0) + ; THE ITERATOR CALL TAG^ROUTINE(PARAM) TO GENERATE IENS +"RTN","BMXADOXY",122,0) + ; IN THIS CASE THE SCHEMA IS ATTACHED TO THE VISIT FILE. +"RTN","BMXADOXY",123,0) + ; GIVEN THE INFORMATION IN THE PARAMETER, THE CUSTOM ITERATOR RETURNS POSSIBLE DUPLICATE VISITS +"RTN","BMXADOXY",124,0) + N OUT,%,SIEN +"RTN","BMXADOXY",125,0) + S SIEN=$$SCHEMA("VISITS") +"RTN","BMXADOXY",126,0) + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~9285|5/24/04@1PM|I|516|~") +"RTN","BMXADOXY",127,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",128,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",129,0) + Q +"RTN","BMXADOXY",130,0) + ; +"RTN","BMXADOXY",131,0) +ID ; IDENTIFIER FIELD +"RTN","BMXADOXY",132,0) + ; THE SCHEMA IS ATTACHED TO THE VA PATIENT FILE (2) +"RTN","BMXADOXY",133,0) + ; THE SCHEMA HAS A BUILT IN FIELD (.01ID) THAT RETURNS THE IDENTIFIERS +"RTN","BMXADOXY",134,0) + ; THE ENTRY POINT THAT GENERATES THE IDETIFIERS IS STORED IN THE BMX ADO SCHEMA FILE +"RTN","BMXADOXY",135,0) + ; PATIENT DFN=235 +"RTN","BMXADOXY",136,0) + N OUT,%,SIEN +"RTN","BMXADOXY",137,0) + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") +"RTN","BMXADOXY",138,0) + D SS^BMXADO(.OUT,SIEN,"","~235~235~") +"RTN","BMXADOXY",139,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",140,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",141,0) + Q +"RTN","BMXADOXY",142,0) + ; +"RTN","BMXADOXY",143,0) +JSTD ; STANDARD JOIN +"RTN","BMXADOXY",144,0) + ; BY SPECIFYING A JOIN IN THE VSTG, MULTIPLE SCHEMAE AND DATA SETS ARE RETURNED IN ONE PASS +"RTN","BMXADOXY",145,0) + ; THE SCHEMA IS ATTACHED TO THE V MEASUREMENT FILE +"RTN","BMXADOXY",146,0) + ; THIS IS JOINED TO A SECOND FILE, THE VA PATIENT FILE VIA A JOIN +"RTN","BMXADOXY",147,0) + ; THE JOIN IS BASTED ON THE FACT THAT THE PATIENT FIELD (.02) IN THE V MEASUREMENT FILE POINTS TO THE VA PATIENT FILE +"RTN","BMXADOXY",148,0) + ; THE JOIN PARAMETER IS THE 9TH PIECE OF THE VSTG. IT CONSISTS OF 2 PIECES DELIMITED BY A "," +"RTN","BMXADOXY",149,0) + ; PIECE 1 IS THE SCHEMA THAT YOU ARE JOINING TO +"RTN","BMXADOXY",150,0) + ; PIECE 2 IS THE FIELD IN THE PRIMARY FILE THAT ENABLES THE JOIN +"RTN","BMXADOXY",151,0) + ; THE DATA SET FROM THE SECOND (JOIN) FILE CONTAINS ONLY THOSE RECORDS NECESSARY TO COMPLETE THE JOIN +"RTN","BMXADOXY",152,0) + ; PATIENT DFN=235, INDEX=AA, MAX=5, START=3/21/65, STOP=6/4/04 +"RTN","BMXADOXY",153,0) + N OUT,%,SIEN1,SIEN2 +"RTN","BMXADOXY",154,0) + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOXY",155,0) + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOXY",156,0) + ;SIEN1=23, SIEN2=11 +"RTN","BMXADOXY",157,0) + ;D SS^BMXADO(.OUT,SIEN1,"","AA~3/21/1965~6/4/2004~5~~~~234|WT|C~"_SIEN2_",.02") +"RTN","BMXADOXY",158,0) + D SS^BMXADO(.OUT,SIEN1,"","~234~236~~~~~~"_SIEN2_",.01") +"RTN","BMXADOXY",159,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",160,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",161,0) + Q +"RTN","BMXADOXY",162,0) + ; +"RTN","BMXADOXY",163,0) +HWSTD ; +"RTN","BMXADOXY",164,0) + ; PATIENT DFN=235, INDEX=AA, MAX=5, START=3/21/65, STOP=6/4/04 +"RTN","BMXADOXY",165,0) + N OUT,%,SIEN1,SIEN2 +"RTN","BMXADOXY",166,0) + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOXY",167,0) + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOXY",168,0) + ;SIEN2=23, SIEN1=11 +"RTN","BMXADOXY",169,0) + D SS^BMXADO(.OUT,SIEN1,"","~235~250~~~~~~"_SIEN2_",.01") +"RTN","BMXADOXY",170,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",171,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",172,0) + Q +"RTN","BMXADOXY",173,0) + ; +"RTN","BMXADOXY",174,0) +JMD ;JOIN MASTER TO DETAIL +"RTN","BMXADOXY",175,0) + N OUT,%,SIEN1,SIEN2,SIEN3,VSTG +"RTN","BMXADOXY",176,0) + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") +"RTN","BMXADOXY",177,0) + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") +"RTN","BMXADOXY",178,0) + S SIEN3=$$SCHEMA("VIEW MEDS") +"RTN","BMXADOXY",179,0) + S VSTG="~1~5~~~~~~" +"RTN","BMXADOXY",180,0) + ;S VSTG=VSTG_SIEN3_",.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C" +"RTN","BMXADOXY",181,0) + S VSTG=VSTG_SIEN3_",.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C" +"RTN","BMXADOXY",182,0) + ;S VSTG="~1~5~~~~~~23,.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|WT|C" +"RTN","BMXADOXY",183,0) + ;BMX ADO SS^11^^~1~5~~~~~~23,.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|WT|C +"RTN","BMXADOXY",184,0) + ;BMX ADO SS^11^^~1~5~~~~~~25,.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C +"RTN","BMXADOXY",185,0) + D SS^BMXADO(.OUT,SIEN1,"",VSTG) +"RTN","BMXADOXY",186,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",187,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",188,0) + Q +"RTN","BMXADOXY",189,0) + ; +"RTN","BMXADOXY",190,0) +JSUB ; SUBFILE JOIN +"RTN","BMXADOXY",191,0) + ; IN THIS CASE THE RECORDS IN A PARENT FILE ARE "JOINED" TO THE RECORDS IN ONE OF ITS SUB FILES +"RTN","BMXADOXY",192,0) + ; THE SCHEMA IS ATTACHED TO THE "MEDICARE ELIGIBLE" FILE +"RTN","BMXADOXY",193,0) + ; IT IS JOINED TO ITS SUBFILE, "ELIG DATES", VIA THE UPDATE MEDICARE DATES SCHEMA +"RTN","BMXADOXY",194,0) + ; THE SYNTAX FOR THE JOIN PIECE IS "sien2,SUB" WHERE sien2=IEN OF SECOND SCHEMA +"RTN","BMXADOXY",195,0) + ; PATIENT DFN=4 +"RTN","BMXADOXY",196,0) + N OUT,%,SIEN1,SIEN2 +"RTN","BMXADOXY",197,0) + S SIEN1=$$SCHEMA("UPDATE MEDICARE INFO") ;17 +"RTN","BMXADOXY",198,0) + S SIEN2=$$SCHEMA("UPDATE MEDICARE DATES") ;18 +"RTN","BMXADOXY",199,0) + ;BMX ADO SS^17^^~4~5~~~~~~18,SUB +"RTN","BMXADOXY",200,0) + D SS^BMXADO(.OUT,SIEN1,"","~4~5~~~~~~"_SIEN2_",SUB") +"RTN","BMXADOXY",201,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",202,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",203,0) + Q +"RTN","BMXADOXY",204,0) + ; +"RTN","BMXADOXY",205,0) +JPAR ; PARENT FILE JOIN +"RTN","BMXADOXY",206,0) + ; SIMILAR TO A SUBFILE JOIN EXCEPT THE SUB-FILE IS TREATED AS THE PRIMARY FILE AND IT IS JOINED TO ITS PARENT +"RTN","BMXADOXY",207,0) + ; BECAUSE WE ARE STARTING IN A SUBFILE, THE DA STRING CONTAINS THE IEN OF THE PARENT FILE ("4," +"RTN","BMXADOXY",208,0) + ; THE SYNTAX OF THE 9TH PIECE IS "sien2,PARENT" WHERE sien2 IS THE IEN OF THE SECONDARY SCHEMA +"RTN","BMXADOXY",209,0) + ; PATIENT DFN=4 +"RTN","BMXADOXY",210,0) + N OUT,%,SIEN1,SIEN2 +"RTN","BMXADOXY",211,0) + S SIEN1=$$SCHEMA("UPDATE MEDICARE DATES") +"RTN","BMXADOXY",212,0) + S SIEN2=$$SCHEMA("UPDATE MEDICARE INFO") +"RTN","BMXADOXY",213,0) + D SS^BMXADO(.OUT,SIEN1,"4,","~~~5~~~~~"_SIEN2_",PARENT") +"RTN","BMXADOXY",214,0) + D DISP(OUT) R %:$G(DTIME,60) +"RTN","BMXADOXY",215,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",216,0) + Q +"RTN","BMXADOXY",217,0) + ; +"RTN","BMXADOXY",218,0) +ADD ; ADD A NEW ENTRY +"RTN","BMXADOXY",219,0) + ; THIS IS A 2 STEP PROCESS: +"RTN","BMXADOXY",220,0) + ; FIRST GET THE SCHEMA FOR THE FILE YOU WISH TO UPDATE +"RTN","BMXADOXY",221,0) + ; THIS SCHEMA'S NAME TYPICALLY BEGINS WITH THE WORD "UPDATE" +"RTN","BMXADOXY",222,0) + ; IT CONTAINS NO ID OR IEN FIELDS +"RTN","BMXADOXY",223,0) + ; SECOND ADD THE DATA NODE TO THE ARRAY +"RTN","BMXADOXY",224,0) + ; IT HAS THE SAME FORMAT AS A DATA STRING ASSOCIATED WITH THE SCHEMA EXCEPT THE FIRST "^" PIECE IS NULL +"RTN","BMXADOXY",225,0) + ; THIS PIECE CORRESPONDS TO THE IEN OF THE RECORD. SINCE THE RECORD HAS NOT BEEN ADDED YET, IT IS NULL. +"RTN","BMXADOXY",226,0) + ; IN THE DATA STRING, ALL POINTER VALUES ARE PRECEDED BY THE '`' CHARACTER AND EA. STRING ENDS IN $C(30) +"RTN","BMXADOXY",227,0) + ; MULTIPLE DATA STRINGS CAN BE APPENDED AS NEW NODES AT THE BOTTOM OF THE ARRAY +"RTN","BMXADOXY",228,0) + ; IN THIS CASE WE ARE ADDING A RECORD TO THE V MEASUREMENT FILE +"RTN","BMXADOXY",229,0) + ; DATA STRING="^MEASUREMENT TYPE IEN^PATIENT DFN^VISIT IEN^RESULT"_$C(30) +"RTN","BMXADOXY",230,0) + ; THERE ARE 2 INPUT PARAMS: +"RTN","BMXADOXY",231,0) + ; THE CLOSED REF WHERE THE INPUT ARRAY IS STORED +"RTN","BMXADOXY",232,0) + ; SINCE IT IS PASSED BY REFERENCE "OUT" CAN BE NULL OR UNDEFIEND. +"RTN","BMXADOXY",233,0) + ; OUT WILL BE DEFINED AT THE CONCLUSION OF THE TRANSACTION. +"RTN","BMXADOXY",234,0) + ; THE OUTPUT IS IN THE OUT ARRAY +"RTN","BMXADOXY",235,0) + ; OUT(1)="OK|ien" WHERE ien IS THE IEN OF THE RECORD THAT HAS BEE ADDED. +"RTN","BMXADOXY",236,0) + ; IF THE TRANSACTION FAILED, AN ERROR MSG WILL BE IN THE OUT ARRAY +"RTN","BMXADOXY",237,0) + ; MEASUREMENT TYPE=2, PATIENT DFN=2, VISIT IEN=7806, PATIENT'S WEIGHT=172.75 +"RTN","BMXADOXY",238,0) + N OUT,%,SIEN,NODE,DFN +"RTN","BMXADOXY",239,0) + S DFN=2 +"RTN","BMXADOXY",240,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOXY",241,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXY",242,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXY",243,0) + S ^TMP("BMX ADO",$J,NODE)="^`2^`"_DFN_"^`7806^172.75"_$C(30) +"RTN","BMXADOXY",244,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOXY",245,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOXY",246,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",247,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOXY",248,0) + Q +"RTN","BMXADOXY",249,0) + ; +"RTN","BMXADOXY",250,0) +DEL ; DELETE A RECORD +"RTN","BMXADOXY",251,0) + ; THE SIPLEST WAY TO DELETE AN ENTRY IS TO PUT THE RECORD IEN IN THE DA STRING PRECEDED BY A MINUS SIGN +"RTN","BMXADOXY",252,0) + ; YOU CAN ALSO SET THE VALUE OF THE .01 FIELD TO "@" +"RTN","BMXADOXY",253,0) + ; IF THE VALUE OF THE .01 FIELD IS NULL AND THE DA STRING IS NOT PRECEDED BY A MINUS SIGN, THE TRANSACTION WILL BE CANCELLED +"RTN","BMXADOXY",254,0) + ; IF THE DA STRING IS NULL, THE TRANSACTION WILL BE CANCELLED +"RTN","BMXADOXY",255,0) + ; IN THIS EXAMPLE, WE DELETE A V MEASUREMENT RECORD THAT WAS JUST ADDED +"RTN","BMXADOXY",256,0) + N OUT,%,SIEN,NODE,DEL +"RTN","BMXADOXY",257,0) + S DEL=1621 +"RTN","BMXADOXY",258,0) + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") +"RTN","BMXADOXY",259,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXY",260,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXY",261,0) + S ^TMP("BMX ADO",$J,NODE)="-"_DEL_$C(30) +"RTN","BMXADOXY",262,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOXY",263,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOXY",264,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",265,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOXY",266,0) + Q +"RTN","BMXADOXY",267,0) + ; +"RTN","BMXADOXY",268,0) +EDIT ; EDIT AN EXISTING ENTRY +"RTN","BMXADOXY",269,0) + ; SIMILAR TO ABOVE EXCEPT THAT THE FIRST "^" PIECE OF THE DATA NODE IS THE IEN OF THE RECORD TO BE EDITIED +"RTN","BMXADOXY",270,0) + ; NOTE THAT THERE IS NO '`' IN FRONT OF THE FIRST PIECE. IT IS A PURE INTEGER +"RTN","BMXADOXY",271,0) + ; LAB TEST=175, PATIENT DFN=2, VISIT IEN=8040, PT'S GLUCOSE=276, ANORMAL="ABNORMAL" +"RTN","BMXADOXY",272,0) + N OUT,%,SIEN,NODE +"RTN","BMXADOXY",273,0) + S SIEN=$$SCHEMA("UPDATE LABS") +"RTN","BMXADOXY",274,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXY",275,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXY",276,0) + S ^TMP("BMX ADO",$J,NODE)="279^`175^`2^`8040^280^H"_$C(30) +"RTN","BMXADOXY",277,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOXY",278,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOXY",279,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",280,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOXY",281,0) + Q +"RTN","BMXADOXY",282,0) + ; +"RTN","BMXADOXY",283,0) +DELVAL ; DELETE A VALUE IN A FIELD +"RTN","BMXADOXY",284,0) + ; SIMILAR TO EDIT EXCEPT THE VALUE IS "@" +"RTN","BMXADOXY",285,0) + ; DELETE WILL BE ABORTED IF IF FILEMAN SAYS THIS IS A REQUIRED FIELD +"RTN","BMXADOXY",286,0) + N OUT,%,SIEN,NODE +"RTN","BMXADOXY",287,0) + S SIEN=$$SCHEMA("UPDATE LABS") +"RTN","BMXADOXY",288,0) + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA +"RTN","BMXADOXY",289,0) + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 +"RTN","BMXADOXY",290,0) + S ^TMP("BMX ADO",$J,NODE)="279^`175^`2^`8040^^@"_$C(30) +"RTN","BMXADOXY",291,0) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD +"RTN","BMXADOXY",292,0) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD +"RTN","BMXADOXY",293,0) + K ^TMP("BMX ADO",$J) +"RTN","BMXADOXY",294,0) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG +"RTN","BMXADOXY",295,0) + Q +"RTN","BMXADOXY",296,0) + ; +"RTN","BMXE01") +0^114^B6931626 +"RTN","BMXE01",1,0) +BMXE01 ; IHS/OIT/FJE - ENVIRONMENT CHECK FOR BMX 2.0 ; +"RTN","BMXE01",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXE01",3,0) + ; +"RTN","BMXE01",4,0) + S $P(LINE,"*",81)="" +"RTN","BMXE01",5,0) + S XPDNOQUE="NO QUE" ;NO QUEUING ALLOWED +"RTN","BMXE01",6,0) + S XPDABORT=0 +"RTN","BMXE01",7,0) + I '$G(DUZ) W !,"DUZ UNDEFINED OR 0." S XPX="DUZ" D SORRY Q +"RTN","BMXE01",8,0) + ; +"RTN","BMXE01",9,0) + I '$L($G(DUZ(0))) W !,"DUZ(0) UNDEFINED OR NULL." S XPX="DUZ" D SORRY Q +"RTN","BMXE01",10,0) + ; +"RTN","BMXE01",11,0) + D HOME^%ZIS,DT^DICRW +"RTN","BMXE01",12,0) + S X=$P($G(^VA(200,DUZ,0)),U) +"RTN","BMXE01",13,0) + I $G(X)="" W !,"Who are you????" S XPX="DUZ" D SORRY Q +"RTN","BMXE01",14,0) + W !,"Hello, "_$P(X,",",2)_" "_$P(X,",") +"RTN","BMXE01",15,0) + W !!,"Checking Environment for Install of Version "_$P($T(+2),";",3)_" of "_$P($T(+2),";",4)_"." +"RTN","BMXE01",16,0) + ; +"RTN","BMXE01",17,0) + S X=$G(^DD("VERSION")) +"RTN","BMXE01",18,0) + W !!,"Need at least FileMan 22.....FileMan "_X_" Present" +"RTN","BMXE01",19,0) + I X<22 S XPX="FM" D SORRY Q +"RTN","BMXE01",20,0) + ; +"RTN","BMXE01",21,0) + S X=$G(^DIC(9.4,$O(^DIC(9.4,"C","XU",0)),"VERSION")) +"RTN","BMXE01",22,0) + W !!,"Need at least Kernel 8.0.....Kernel "_X_" Present" +"RTN","BMXE01",23,0) + I +X<8 S XPX="KERNEL" D SORRY Q +"RTN","BMXE01",24,0) + ; +"RTN","BMXE01",25,0) + S X=$G(^DIC(9.4,$O(^DIC(9.4,"C","XB",0)),"VERSION")) +"RTN","BMXE01",26,0) + W !!,"Need at least XB/ZIB 3.....XB/ZIB "_X_" Present" +"RTN","BMXE01",27,0) + I +X<2 S XPX="XB" D SORRY Q +"RTN","BMXE01",28,0) + q +"RTN","BMXE01",29,0) +ENVOK ; If this is just an environ check, end here. +"RTN","BMXE01",30,0) + W !!,"ENVIRONMENT OK." +"RTN","BMXE01",31,0) + ; +"RTN","BMXE01",32,0) + ; The following line prevents the "Disable Options..." and "Move +"RTN","BMXE01",33,0) + ; Routines..." questions from being asked during the install. +"RTN","BMXE01",34,0) + I $G(XPDENV)=1 S (XPDDIQ("XPZ1"),XPDDIQ("XPZ2"))=0 +"RTN","BMXE01",35,0) + I $G(XPDENV)=1 D ;Updates BMX Version file +"RTN","BMXE01",36,0) + .S X="2",DIC="^BMXAPPL(",DLAYGO=90093.2,DIC(0)="E" K DD,D0 D FILE^DICN +"RTN","BMXE01",37,0) + .S DA=+Y +"RTN","BMXE01",38,0) + .S:+DA DIE="^BMXAPPL(",DR=".02///0;.03////"_DT D ^DIE +"RTN","BMXE01",39,0) + .K DIE,DA +"RTN","BMXE01",40,0) + Q +"RTN","BMXE01",41,0) +SORRY ; +"RTN","BMXE01",42,0) + K DIFQ +"RTN","BMXE01",43,0) + S XPDABORT=1 +"RTN","BMXE01",44,0) + W *7,!!!,"Sorry....something is wrong with your environment" +"RTN","BMXE01",45,0) + W !,"Aborting BMX Version 2.0 Install!" +"RTN","BMXE01",46,0) + W !,"Correct error and reinstall otherwise" +"RTN","BMXE01",47,0) + W !,"please print/capture this screen and notify" +"RTN","BMXE01",48,0) + W !,"technical support." +"RTN","BMXE01",49,0) + W !!,LINE +"RTN","BMXE01",50,0) + D BMES^XPDUTL("Sorry....something is wrong with your environment") +"RTN","BMXE01",51,0) + D BMES^XPDUTL("Enviroment ERROR "_$G(XPX)) +"RTN","BMXE01",52,0) + D BMES^XPDUTL("Aborting BMX 2.0 install!") +"RTN","BMXE01",53,0) + D BMES^XPDUTL("Correct error and reinstall otherwise") +"RTN","BMXE01",54,0) + D BMES^XPDUTL("please print/capture this screen and notify") +"RTN","BMXE01",55,0) + D BMES^XPDUTL("technical support.") +"RTN","BMXE01",56,0) + Q +"RTN","BMXE01",57,0) + ; +"RTN","BMXFIND") +0^79^B45092715 +"RTN","BMXFIND",1,0) +BMXFIND ; IHS/OIT/HMW - BMX GENERIC FIND ; +"RTN","BMXFIND",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXFIND",3,0) + ; +"RTN","BMXFIND",4,0) + ; +"RTN","BMXFIND",5,0) +TABLE(BMXGBL,BMXFL) ;EP +"RTN","BMXFIND",6,0) + ; +"RTN","BMXFIND",7,0) + ;---> If file number not provided check for file name. +"RTN","BMXFIND",8,0) + ;S ^HW("BMXTABLE")=BMXFL +"RTN","BMXFIND",9,0) + S BMX31=$C(31)_$C(31) +"RTN","BMXFIND",10,0) + I +BMXFL'=BMXFL D +"RTN","BMXFIND",11,0) + . S BMXFL=$TR(BMXFL,"_"," ") +"RTN","BMXFIND",12,0) + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q +"RTN","BMXFIND",13,0) + . S BMXFL=$O(^DIC("B",BMXFL,0)) +"RTN","BMXFIND",14,0) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q +"RTN","BMXFIND",15,0) + D FIND(.BMXGBL,BMXFL,"*",,,10,,,,1) +"RTN","BMXFIND",16,0) + Q +"RTN","BMXFIND",17,0) + ; +"RTN","BMXFIND",18,0) +FIND(BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC,BMXNUM) ;EP +"RTN","BMXFIND",19,0) + ; +"RTN","BMXFIND",20,0) + ;TODO: +"RTN","BMXFIND",21,0) + ; -- Return column info even if no rows returned +"RTN","BMXFIND",22,0) + ; +"RTN","BMXFIND",23,0) + ;---> Places matching records from requested file into a +"RTN","BMXFIND",24,0) + ;---> result global, ^BMXTEMP($J). The exact global name +"RTN","BMXFIND",25,0) + ;---> is returned in the first parameter (BMXGBL). +"RTN","BMXFIND",26,0) + ;---> Records are returned one per node in the result global. +"RTN","BMXFIND",27,0) + ;---> Each record is terminated with a $C(30), for parsing out +"RTN","BMXFIND",28,0) + ;---> on the VB side, since the Broker concatenates all nodes +"RTN","BMXFIND",29,0) + ;---> into a single string when passing the data out of M. +"RTN","BMXFIND",30,0) + ;---> Requested fields within records are delimited by "^". +"RTN","BMXFIND",31,0) + ;---> NOTE: The first "^"-piece of every node is the IEN of +"RTN","BMXFIND",32,0) + ;---> that entry in its file; the requested fields follow. +"RTN","BMXFIND",33,0) + ;---> The final record (node) contains Error Delimiter, +"RTN","BMXFIND",34,0) + ; $C(31)_$C(31), followed by error text, if any. +"RTN","BMXFIND",35,0) + ; +"RTN","BMXFIND",36,0) + ; +"RTN","BMXFIND",37,0) + ;---> Parameters: +"RTN","BMXFIND",38,0) + ; 1 - BMXGBL (ret) Name of result global for Broker. +"RTN","BMXFIND",39,0) + ; 2 - BMXFL (req) File for lookup. +"RTN","BMXFIND",40,0) + ; 3 - BMXFLDS (opt) Fields to return w/each entry. +"RTN","BMXFIND",41,0) + ; 4 - BMXFLG (opt) Flags in DIC(0); If null, "M" is sent. +"RTN","BMXFIND",42,0) + ; 5 - BMXIN (opt) Input to match on (see Algorithm below). +"RTN","BMXFIND",43,0) + ; 6 - BMXMX (opt) Maximum number of entries to return. +"RTN","BMXFIND",44,0) + ; 7 - BMXIX (opt) Indexes to search. +"RTN","BMXFIND",45,0) + ; 8 - BMXSCR (opt) Screen/filter (M code). +"RTN","BMXFIND",46,0) + ; 9 - BMXMC (opt) Mixed Case: 1=mixed case, 0=no change. +"RTN","BMXFIND",47,0) + ; (Converts data in uppercase to mixed case.) +"RTN","BMXFIND",48,0) + ; 10 - BMXNUM (opt) Include IEN in returned recordset (1=true) +"RTN","BMXFIND",49,0) + ; +"RTN","BMXFIND",50,0) + ;---> Set variables, kill temp globals. +"RTN","BMXFIND",51,0) + ;N (BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC) +"RTN","BMXFIND",52,0) + S BMX31=$C(31)_$C(31) +"RTN","BMXFIND",53,0) + S BMXGBL="^BMXTEMP("_$J_")",BMXERR="",U="^" +"RTN","BMXFIND",54,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXFIND",55,0) + ; +"RTN","BMXFIND",56,0) + ;---> If file number not provided check for file name. +"RTN","BMXFIND",57,0) + I +BMXFL'=BMXFL D +"RTN","BMXFIND",58,0) + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q +"RTN","BMXFIND",59,0) + . S BMXFL=$O(^DIC("B",BMXFL,0)) +"RTN","BMXFIND",60,0) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q +"RTN","BMXFIND",61,0) + ; +"RTN","BMXFIND",62,0) + ;---> If no fields provided, pass .01. +"RTN","BMXFIND",63,0) + ;---> NOTE: If .01 is NOT included, but the Index to lookup on is +"RTN","BMXFIND",64,0) + ;---> NOT on the .01, then the .01 will be returned +"RTN","BMXFIND",65,0) + ;---> automatically as the second ^-piece of data in the +"RTN","BMXFIND",66,0) + ;---> Result Global. +"RTN","BMXFIND",67,0) + ;---> So it would be: IEN^.01^requested fields... +"RTN","BMXFIND",68,0) + I $G(BMXFLDS)="" S BMXFLDS=".01" +"RTN","BMXFIND",69,0) + ; +"RTN","BMXFIND",70,0) + ;---> If no index or flag provided, set flag="M". +"RTN","BMXFIND",71,0) + I $G(BMXFLG)="" D +"RTN","BMXFIND",72,0) + .I $G(BMXIX)="" S BMXFLG="M" Q +"RTN","BMXFIND",73,0) + .S BMXFLG="" +"RTN","BMXFIND",74,0) + ; +"RTN","BMXFIND",75,0) + ;---> If no Maximum Number provided, set it to 200. +"RTN","BMXFIND",76,0) + I '$G(BMXMX) S BMXMX=200 +"RTN","BMXFIND",77,0) + ; +"RTN","BMXFIND",78,0) + ;---> Define index and screen. +"RTN","BMXFIND",79,0) + S:'$D(BMXIX) BMXIX="" +"RTN","BMXFIND",80,0) + S:'$D(BMXSCR) BMXSCR="" +"RTN","BMXFIND",81,0) + ; +"RTN","BMXFIND",82,0) + ;---> Set Target Global for output and errors. +"RTN","BMXFIND",83,0) + S BMXG="^BMXTMP($J)" +"RTN","BMXFIND",84,0) + ; +"RTN","BMXFIND",85,0) + ;---> If Mixed Case not set, set to No Change. +"RTN","BMXFIND",86,0) + I '$D(BMXMC) S BMXMC=0 +"RTN","BMXFIND",87,0) + ; +"RTN","BMXFIND",88,0) + ;---> If Return IEN not set, set to No +"RTN","BMXFIND",89,0) + I '$D(BMXNUM) S BMXNUM=0 +"RTN","BMXFIND",90,0) + S BMXNUM=+BMXNUM +"RTN","BMXFIND",91,0) + ; +"RTN","BMXFIND",92,0) + ;---> Silent Fileman call. +"RTN","BMXFIND",93,0) + D +"RTN","BMXFIND",94,0) + .I $G(BMXIN)="" D Q +"RTN","BMXFIND",95,0) + ..D LIST^DIC(BMXFL,,,,BMXMX,0,,BMXIX,BMXSCR,,BMXG,BMXG) +"RTN","BMXFIND",96,0) + .D FIND^DIC(BMXFL,,,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,,BMXG,BMXG) +"RTN","BMXFIND",97,0) + ; +"RTN","BMXFIND",98,0) + D WRITE +"RTN","BMXFIND",99,0) + Q +"RTN","BMXFIND",100,0) + ; +"RTN","BMXFIND",101,0) + ; +"RTN","BMXFIND",102,0) + ;---------- +"RTN","BMXFIND",103,0) +WRITE ;EP +"RTN","BMXFIND",104,0) + ;---> Collect data for matching records and write in result global. +"RTN","BMXFIND",105,0) + ; +"RTN","BMXFIND",106,0) + ;---> First, check for errors. +"RTN","BMXFIND",107,0) + ;---> If errors exist, write them and quit. +"RTN","BMXFIND",108,0) + N I,N,X +"RTN","BMXFIND",109,0) + I $D(^BMXTMP($J,"DIERR")) I $O(^("DIERR",0)) D Q +"RTN","BMXFIND",110,0) + .S N=0,X="" +"RTN","BMXFIND",111,0) + .F S N=$O(^BMXTMP($J,"DIERR",N)) Q:'N D +"RTN","BMXFIND",112,0) + ..N M S M=0 +"RTN","BMXFIND",113,0) + ..F S M=$O(^BMXTMP($J,"DIERR",N,"TEXT",M)) Q:'M D +"RTN","BMXFIND",114,0) + ...S X=X_^BMXTMP($J,"DIERR",N,"TEXT",M)_" " +"RTN","BMXFIND",115,0) + .D ERROUT(X,1) +"RTN","BMXFIND",116,0) + ; +"RTN","BMXFIND",117,0) + ; +"RTN","BMXFIND",118,0) + ;---> Write valid results. +"RTN","BMXFIND",119,0) + ;---> Loop through the IEN node (...2,N) of the temp global. +"RTN","BMXFIND",120,0) + ; and call GETS^DIQ for each record +"RTN","BMXFIND",121,0) + N I,N,X S N=0 +"RTN","BMXFIND",122,0) + S BMXA="A" +"RTN","BMXFIND",123,0) + ;B +"RTN","BMXFIND",124,0) + S I=0 +"RTN","BMXFIND",125,0) + S BMXFLDF=0 +"RTN","BMXFIND",126,0) +RESULTS F S N=$O(^BMXTMP($J,"DILIST",2,N)) Q:'N D +"RTN","BMXFIND",127,0) + . S X=^BMXTMP($J,"DILIST",2,N) +"RTN","BMXFIND",128,0) + . S I=I+1 +"RTN","BMXFIND",129,0) + . K A +"RTN","BMXFIND",130,0) + . D GETS^DIQ(BMXFL,X_",",BMXFLDS,,BMXA,BMXA) +"RTN","BMXFIND",131,0) + . ;--->Once only, write field names +"RTN","BMXFIND",132,0) + . D:'BMXFLDF FIELDS +"RTN","BMXFIND",133,0) + . ; +"RTN","BMXFIND",134,0) + . ; +"RTN","BMXFIND",135,0) + . ;---> Loop through results global +"RTN","BMXFIND",136,0) + . S F=0,BMXCNT=0 +"RTN","BMXFIND",137,0) + . F S F=$O(A(BMXFL,X_",",F)) Q:'F S BMXCNT=BMXCNT+1 +"RTN","BMXFIND",138,0) + . S F=0 +"RTN","BMXFIND",139,0) + . S BMXREC="" +"RTN","BMXFIND",140,0) + . S:BMXNUM ^BMXTEMP($J,I)=X_"^" +"RTN","BMXFIND",141,0) + . S BMXCNTB=0 +"RTN","BMXFIND",142,0) + . S BMXORD=BMXNUM +"RTN","BMXFIND",143,0) + . F S F=$O(A(BMXFL,X_",",F)) Q:'F S BMXCNTB=BMXCNTB+1 D S:BMXCNTBBMXLEN(BMXORD) BMXLEN(BMXORD)=BMXLTMP +"RTN","BMXFIND",156,0) + . . . . Q +"RTN","BMXFIND",157,0) + . . . D ;It's a multiple. Implement in next phase +"RTN","BMXFIND",158,0) + . . . . Q ; +"RTN","BMXFIND",159,0) + . . . Q +"RTN","BMXFIND",160,0) + . . E D ;Not a multiple +"RTN","BMXFIND",161,0) + . . . S I=I+1 +"RTN","BMXFIND",162,0) + . . . S ^BMXTEMP($J,I)=A(BMXFL,X_",",F) +"RTN","BMXFIND",163,0) + . . . S:$L(A(BMXFL,X_",",F))>BMXLEN(BMXORD) BMXLEN(BMXORD)=$L(A(BMXFL,X_",",F)) +"RTN","BMXFIND",164,0) + . . . Q +"RTN","BMXFIND",165,0) + . . Q +"RTN","BMXFIND",166,0) + . ;---> Convert data to mixed case if BMXMC=1. +"RTN","BMXFIND",167,0) + . ;S:BMXMC BMXREC=$$T^BMXTRS(BMXREC) +"RTN","BMXFIND",168,0) + . ;---> Set data in result global. +"RTN","BMXFIND",169,0) + . S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_$C(30) +"RTN","BMXFIND",170,0) + ; +"RTN","BMXFIND",171,0) + ;---> If no results, report it as an error. +"RTN","BMXFIND",172,0) + D:'$O(^BMXTEMP($J,0)) +"RTN","BMXFIND",173,0) + .I BMXIN]"" S BMXERR="No entry matches """_BMXIN_"""." Q +"RTN","BMXFIND",174,0) + .S BMXERR="Either the lookup file is empty" +"RTN","BMXFIND",175,0) + .S BMXERR=BMXERR_" or all entries are screened (software error)." +"RTN","BMXFIND",176,0) + ; +"RTN","BMXFIND",177,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXFIND",178,0) + S I=I+1 +"RTN","BMXFIND",179,0) + S ^BMXTEMP($J,I)=BMX31_BMXERR +"RTN","BMXFIND",180,0) + ;---> Column types and widths +"RTN","BMXFIND",181,0) + S C=0 +"RTN","BMXFIND",182,0) + F S C=$O(BMXLEN(C)) Q:'C D +"RTN","BMXFIND",183,0) + . I BMXLEN(C)>99999 S BMXLEN(C)=99999 +"RTN","BMXFIND",184,0) + . S ^BMXTEMP($J,C)=BMXTYP(C)_$$NUMCHAR(BMXLEN(C))_^BMXTEMP($J,C) +"RTN","BMXFIND",185,0) + Q +"RTN","BMXFIND",186,0) + ; +"RTN","BMXFIND",187,0) + ; +"RTN","BMXFIND",188,0) +NUMCHAR(BMXN) ;EP +"RTN","BMXFIND",189,0) + ;---> Returns Field Length left-padded with 0 +"RTN","BMXFIND",190,0) + ; +"RTN","BMXFIND",191,0) + N BMXC +"RTN","BMXFIND",192,0) + S BMXC="00000"_BMXN +"RTN","BMXFIND",193,0) + Q $E(BMXC,$L(BMXC)-4,$L(BMXC)) +"RTN","BMXFIND",194,0) + ; +"RTN","BMXFIND",195,0) + ;---> Dead code follows +"RTN","BMXFIND",196,0) + N C,BMXC,F,N,J +"RTN","BMXFIND",197,0) + S BMXC="" +"RTN","BMXFIND",198,0) + S N=BMXN +"RTN","BMXFIND",199,0) + S:N>99999 N=99999 +"RTN","BMXFIND",200,0) + S:N<0 N=0 +"RTN","BMXFIND",201,0) + F J=1:1:$L(N) D +"RTN","BMXFIND",202,0) + . S F=10**(J-1) +"RTN","BMXFIND",203,0) + . S C=65+(N-((N\(10*F))*(10*F))\F) +"RTN","BMXFIND",204,0) + . S C=$C(C) +"RTN","BMXFIND",205,0) + . S BMXC=C_BMXC +"RTN","BMXFIND",206,0) + S BMXC="AAAAA"_BMXC +"RTN","BMXFIND",207,0) + Q $E(BMXC,$L(BMXC)-4,$L(BMXC)) +"RTN","BMXFIND",208,0) + ; +"RTN","BMXFIND",209,0) + ; +"RTN","BMXFIND",210,0) +FIELDS ;---> Write Field Names +"RTN","BMXFIND",211,0) + ;Field name is TAAAAANAME +"RTN","BMXFIND",212,0) + ;Where T is the field type (T=Text; D=Date) +"RTN","BMXFIND",213,0) + ; AAAAA is the field size (see NUMCHAR routine) +"RTN","BMXFIND",214,0) + ; NAME is the field name +"RTN","BMXFIND",215,0) + S BMXFLDF=1 +"RTN","BMXFIND",216,0) + K BMXLEN,BMXTYP +"RTN","BMXFIND",217,0) + D:$D(A) +"RTN","BMXFIND",218,0) + . I BMXNUM S ^BMXTEMP($J,I)="IEN^",BMXLEN(I)=10,BMXTYP(I)="T",I=I+1 ;TODO: Change from text to number +"RTN","BMXFIND",219,0) + . S ASDXFNUM=0 +"RTN","BMXFIND",220,0) + . S BMXIENS=$O(A(BMXFL,0)) +"RTN","BMXFIND",221,0) + . F S ASDXFNUM=$O(A(BMXFL,BMXIENS,ASDXFNUM)) Q:'ASDXFNUM D +"RTN","BMXFIND",222,0) + . . S ASDXFNAM=$P(^DD(BMXFL,ASDXFNUM,0),"^") ;Get type here +"RTN","BMXFIND",223,0) + . . S ASDXFNAM=$TR(ASDXFNAM," ","_") +"RTN","BMXFIND",224,0) + . . S BMXTYP(I)="T" +"RTN","BMXFIND",225,0) + . . S BMXLEN(I)=0 ;Start with length zero +"RTN","BMXFIND",226,0) + . . S:ASDXFNAM="" ASDXFNAM="UNKNOWN"_I +"RTN","BMXFIND",227,0) + . . S ^BMXTEMP($J,I)=ASDXFNAM_"^" +"RTN","BMXFIND",228,0) + . . S I=I+1 +"RTN","BMXFIND",229,0) + . S ^BMXTEMP($J,I-1)=$E(^BMXTEMP($J,I-1),1,$L(^BMXTEMP($J,I-1))-1)_$C(30) +"RTN","BMXFIND",230,0) + Q +"RTN","BMXFIND",231,0) + ; +"RTN","BMXFIND",232,0) + ;---------- +"RTN","BMXFIND",233,0) +ERROUT(BMXERR,I) ;EP +"RTN","BMXFIND",234,0) + ;---> Save next line for Error Code File if ever used. +"RTN","BMXFIND",235,0) + ;---> If necessary, use I>1 to avoid overwriting valid data. +"RTN","BMXFIND",236,0) + S:'$G(I) I=1 +"RTN","BMXFIND",237,0) + S ^BMXTEMP($J,I)=BMX31_BMXERR +"RTN","BMXFIND",238,0) + Q +"RTN","BMXFIND",239,0) + ; +"RTN","BMXFIND",240,0) + ; +"RTN","BMXFIND",241,0) +PASSERR(BMXGBL,BMXERR) ;EP +"RTN","BMXFIND",242,0) + ;---> If the RPC routine calling the BMX Generic Lookup above +"RTN","BMXFIND",243,0) + ;---> detects a specific error prior to the call and wants to pass +"RTN","BMXFIND",244,0) + ;---> that error in the result global rather than a generic error, +"RTN","BMXFIND",245,0) + ;---> then a call to this function (PASSERR) can be made. +"RTN","BMXFIND",246,0) + ;---> This call will store the error text passed in the result global. +"RTN","BMXFIND",247,0) + ;---> The calling routine should then quit (abort its call to the +"RTN","BMXFIND",248,0) + ;---> BMX Generic Lookup function above). +"RTN","BMXFIND",249,0) + ; +"RTN","BMXFIND",250,0) + ;---> Parameters: +"RTN","BMXFIND",251,0) + ; 1 - BMXGBL (ret) Name of result global for Broker. +"RTN","BMXFIND",252,0) + ; 2 - BMXERR (req) Text of error to be stored in result global. +"RTN","BMXFIND",253,0) + ; +"RTN","BMXFIND",254,0) + S:$G(BMXERR)="" BMXERR="Error not passed (software error)." +"RTN","BMXFIND",255,0) + ; +"RTN","BMXFIND",256,0) + N BMX31 S BMX31=$C(31)_$C(31) +"RTN","BMXFIND",257,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXFIND",258,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXFIND",259,0) + S ^BMXTEMP($J,1)=BMX31_BMXERR +"RTN","BMXFIND",260,0) + Q +"RTN","BMXG") +0^80^B2718298 +"RTN","BMXG",1,0) +BMXG ; IHS/OIT/HMW - UTIL: GET DATA ; +"RTN","BMXG",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXG",3,0) + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * +"RTN","BMXG",4,0) + ; +"RTN","BMXG",5,0) + ; +"RTN","BMXG",6,0) + ;---------- +"RTN","BMXG",7,0) +GET(FILE,Y,PC) ;EP +"RTN","BMXG",8,0) + ;---> Return text of .01 Field of an entry in a file. +"RTN","BMXG",9,0) + ;---> Parameters: +"RTN","BMXG",10,0) + ; 1 - FILE (req) Number corresponding to desired file: +"RTN","BMXG",11,0) + ; 1 = State File, #5 +"RTN","BMXG",12,0) + ; 2 = Community File, #9999999.5 +"RTN","BMXG",13,0) + ; 3 = Employer File, #9999999.75 +"RTN","BMXG",14,0) + ; 4 = Beneficiary File, #9999999.25 +"RTN","BMXG",15,0) + ; 5 = Tribe File, #9999999.03 +"RTN","BMXG",16,0) + ; 6 = Insurer File, #9999999.18 +"RTN","BMXG",17,0) + ; 7 = Suffix File, #9999999.32 +"RTN","BMXG",18,0) + ; 8 = Employer Group Insurance File, #9999999.77 +"RTN","BMXG",19,0) + ; 9 = Medicare Eligible File, #9000003 +"RTN","BMXG",20,0) + ; 10 = Medicaid Eligible File, #9000004 +"RTN","BMXG",21,0) + ; 11 = Private Insurance Eligible File, #9000006 +"RTN","BMXG",22,0) + ; 12 = Patient File, #9000001 +"RTN","BMXG",23,0) + ; 13 = VA Patient File, #2 +"RTN","BMXG",24,0) + ; 14 = Policy Holder File, #9000003.1 +"RTN","BMXG",25,0) + ; 15 = Relationship File, #9999999.36 +"RTN","BMXG",26,0) + ; +"RTN","BMXG",27,0) + ; 2 - Y (req) IEN in the File storing the desired entry. +"RTN","BMXG",28,0) + ; 3 - PC (opt) Piece of 0-Node to return (default=1). +"RTN","BMXG",29,0) + ; If PC=0 return entire 0-node. +"RTN","BMXG",30,0) + ; +"RTN","BMXG",31,0) + Q:($G(Y)'?1N.N) "" +"RTN","BMXG",32,0) + Q:'$G(FILE) "" +"RTN","BMXG",33,0) + S:$G(PC)="" PC=1 S U="^" +"RTN","BMXG",34,0) + ; +"RTN","BMXG",35,0) + D +"RTN","BMXG",36,0) + .I FILE=1 S GLB="^DIC(5,"_Y_",0)" Q +"RTN","BMXG",37,0) + .I FILE=2 S GLB="^AUTTCOM("_Y_",0)" Q +"RTN","BMXG",38,0) + .I FILE=3 S GLB="^AUTNEMPL("_Y_",0)" Q +"RTN","BMXG",39,0) + .I FILE=4 S GLB="^AUTTBEN("_Y_",0)" Q +"RTN","BMXG",40,0) + .I FILE=5 S GLB="^AUTTTRI("_Y_",0)" Q +"RTN","BMXG",41,0) + .I FILE=6 S GLB="^AUTNINS("_Y_",0)" Q +"RTN","BMXG",42,0) + .I FILE=7 S GLB="^AUTTMCS("_Y_",0)" Q +"RTN","BMXG",43,0) + .I FILE=8 S GLB="^AUTNEGRP("_Y_",0)" Q +"RTN","BMXG",44,0) + .I FILE=9 S GLB="^AUPNMCR("_Y_",0)" Q +"RTN","BMXG",45,0) + .I FILE=10 S GLB="^AUPNMCD("_Y_",0)" Q +"RTN","BMXG",46,0) + .I FILE=11 S GLB="^AUPNPRVT("_Y_",0)" Q +"RTN","BMXG",47,0) + .I FILE=12 S GLB="^AUPNPAT("_Y_",0)" Q +"RTN","BMXG",48,0) + .I FILE=13 S GLB="^DPT("_Y_",0)" Q +"RTN","BMXG",49,0) + .I FILE=14 S GLB="^AUPN3PPH("_Y_",0)" Q +"RTN","BMXG",50,0) + .I FILE=15 S GLB="^AUTTRLSH("_Y_",0)" Q +"RTN","BMXG",51,0) + ; +"RTN","BMXG",52,0) + Q:'FILE "" +"RTN","BMXG",53,0) + Q:PC=0 $G(@GLB) +"RTN","BMXG",54,0) + Q $P($G(@GLB),U,PC) +"RTN","BMXGETS") +0^81^B15016739 +"RTN","BMXGETS",1,0) +BMXGETS ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXGETS",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXGETS",3,0) + ; +"RTN","BMXGETS",4,0) + ;;Horace Whitt +"RTN","BMXGETS",5,0) + ;;Interface to GETS^DIQ +"RTN","BMXGETS",6,0) + ; +"RTN","BMXGETS",7,0) + ;---------- +"RTN","BMXGETS",8,0) +GETS(BMXGBL,BMXFL,BMXIENS,BMXFLDS,BMXFLG,BMXMC,BMXNUM) ;EP +"RTN","BMXGETS",9,0) + ;---> The final record (node) contains Error Delimiter, +"RTN","BMXGETS",10,0) + ; $C(31)_$C(31), followed by error text, if any. +"RTN","BMXGETS",11,0) + ; +"RTN","BMXGETS",12,0) + ;---> Parameters: +"RTN","BMXGETS",13,0) + ; 1 - BMXGBL (ret) Name of result global for Broker. +"RTN","BMXGETS",14,0) + ; 2 - BMXFL (req) File number for lookup. +"RTN","BMXGETS",15,0) + ; 3 - BMXFLDS (req) Fields to return w/each entry in IENS format. +"RTN","BMXGETS",16,0) + ; 4 - BMXFLG (opt) Flags - See GETS^DIQ documentation +"RTN","BMXGETS",17,0) + ; 9 - BMXMC (opt) Mixed Case: 1=mixed case, 0=no change. +"RTN","BMXGETS",18,0) + ; (Converts data in uppercase to mixed case.) +"RTN","BMXGETS",19,0) + ; 6 - BMXNUM (opt) Include IEN as first returned field (1=true) +"RTN","BMXGETS",20,0) + ; +"RTN","BMXGETS",21,0) + ;---> Set variables, kill temp globals. +"RTN","BMXGETS",22,0) + N BMX31 +"RTN","BMXGETS",23,0) + S BMX31=$C(31)_$C(31) +"RTN","BMXGETS",24,0) + S BMXGBL="^BMXTEMP("_$J_")",BMXERR="",U="^" +"RTN","BMXGETS",25,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXGETS",26,0) + ; +"RTN","BMXGETS",27,0) + ;---> If file number not provided, return error. +"RTN","BMXGETS",28,0) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q +"RTN","BMXGETS",29,0) + ; +"RTN","BMXGETS",30,0) + I $G(BMXFLDS)="" S BMXFLDS=".01" +"RTN","BMXGETS",31,0) + ; +"RTN","BMXGETS",32,0) + ;---> Set Target Global for output and errors. +"RTN","BMXGETS",33,0) + S BMXG="^BMXTMP($J)" +"RTN","BMXGETS",34,0) + ; +"RTN","BMXGETS",35,0) + ;---> If Mixed Case not set, set to No Change. +"RTN","BMXGETS",36,0) + I '$D(BMXMC) S BMXMC=0 +"RTN","BMXGETS",37,0) + ; +"RTN","BMXGETS",38,0) + ;---> If Return IEN not set, set to No +"RTN","BMXGETS",39,0) + I '$D(BMXNUM) S BMXNUM=0 +"RTN","BMXGETS",40,0) + S BMXNUM=+BMXNUM +"RTN","BMXGETS",41,0) + ; +"RTN","BMXGETS",42,0) + ;---> Fileman call +"RTN","BMXGETS",43,0) + D GETS^DIQ(BMXFL,BMXIENS,BMXFLDS,BMXFLG,BMXG,BMXG) +"RTN","BMXGETS",44,0) + ; +"RTN","BMXGETS",45,0) + D WRITE +"RTN","BMXGETS",46,0) + Q +"RTN","BMXGETS",47,0) + ; +"RTN","BMXGETS",48,0) + ; +"RTN","BMXGETS",49,0) + ;---------- +"RTN","BMXGETS",50,0) +WRITE ;EP +"RTN","BMXGETS",51,0) + ;---> Collect data for matching records and write in result global. +"RTN","BMXGETS",52,0) + ; +"RTN","BMXGETS",53,0) + ;---> First, check for errors. +"RTN","BMXGETS",54,0) + ;---> If errors exist, write them and quit. +"RTN","BMXGETS",55,0) + N I,N,X,F,ASDX,ASDC,ASDXFNUM,ASDXFNAM +"RTN","BMXGETS",56,0) + I $D(^BMXTMP($J,"DIERR")) I $O(^("DIERR",0)) D Q +"RTN","BMXGETS",57,0) + .S N=0,X="" +"RTN","BMXGETS",58,0) + .F S N=$O(^BMXTMP($J,"DIERR",N)) Q:'N D +"RTN","BMXGETS",59,0) + ..N M S M=0 +"RTN","BMXGETS",60,0) + ..F S M=$O(^BMXTMP($J,"DIERR",N,"TEXT",M)) Q:'M D +"RTN","BMXGETS",61,0) + ...S X=X_^BMXTMP($J,"DIERR",N,"TEXT",M)_" " +"RTN","BMXGETS",62,0) + .D ERROUT(X,1) +"RTN","BMXGETS",63,0) + ; +"RTN","BMXGETS",64,0) + ; +"RTN","BMXGETS",65,0) + ;---> Write Field Names +"RTN","BMXGETS",66,0) + I BMXNUM S $P(ASDX,"^",1)="IEN" +"RTN","BMXGETS",67,0) + ;F ASDC=1:1:$L(BMXFLDS,";") D +"RTN","BMXGETS",68,0) + S ASDC=1 +"RTN","BMXGETS",69,0) + S ASDXFNUM=0 +"RTN","BMXGETS",70,0) + F S ASDXFNUM=$O(^BMXTMP($J,BMXFL,BMXIENS,ASDXFNUM)) Q:'ASDXFNUM D +"RTN","BMXGETS",71,0) + . ;S ASDXFNUM=$P(BMXFLDS,";",ASDC) +"RTN","BMXGETS",72,0) + . S ASDXFNAM=$P(^DD(BMXFL,ASDXFNUM,0),"^") +"RTN","BMXGETS",73,0) + . S:ASDXFNAM="" ASDXFNAM="UNKNOWN"_ASDC +"RTN","BMXGETS",74,0) + . S $P(ASDX,"^",ASDC+BMXNUM)=ASDXFNAM +"RTN","BMXGETS",75,0) + . S ASDC=ASDC+1 +"RTN","BMXGETS",76,0) + S ^BMXTEMP($J,1)=ASDX_$C(30) +"RTN","BMXGETS",77,0) + ;---> Write valid results. +"RTN","BMXGETS",78,0) +AAA ;---> Loop through results global +"RTN","BMXGETS",79,0) + S I=2,N=0 F S N=$O(^BMXTMP($J,BMXFL,N)) Q:'N D +"RTN","BMXGETS",80,0) + . S X="",F=0 +"RTN","BMXGETS",81,0) + . I BMXNUM S X=+N +"RTN","BMXGETS",82,0) + . F S F=$O(^BMXTMP($J,BMXFL,N,F)) Q:'F D +"RTN","BMXGETS",83,0) + . . S:X'="" X=X_U +"RTN","BMXGETS",84,0) + . . I $P(^DD(BMXFL,F,0),U,2) D I 1 ;Multiple or WP +"RTN","BMXGETS",85,0) + . . . ;Get the subfile number into FL1 +"RTN","BMXGETS",86,0) + . . . S FL1=+$P(^DD(BMXFL,F,0),U,2) +"RTN","BMXGETS",87,0) + . . . S FLD1=$O(^DD(FL1,0)) +"RTN","BMXGETS",88,0) + . . . I $P(^DD(FL1,FLD1,0),U,2)["W" D ;WP +"RTN","BMXGETS",89,0) + . . . . S WPL=0 F S WPL=$O(^BMXTMP($J,BMXFL,N,F,WPL)) Q:'WPL D +"RTN","BMXGETS",90,0) + . . . . . S X=X_^BMXTMP($J,BMXFL,N,F,WPL)_" " +"RTN","BMXGETS",91,0) + . . . . . Q +"RTN","BMXGETS",92,0) + . . . . Q +"RTN","BMXGETS",93,0) + . . . D ;It's a multiple. Implement in next phase +"RTN","BMXGETS",94,0) + . . . . Q ; +"RTN","BMXGETS",95,0) + . . . Q +"RTN","BMXGETS",96,0) + . . E D ;Not a multiple +"RTN","BMXGETS",97,0) + . . . S X=X_^BMXTMP($J,BMXFL,N,F) +"RTN","BMXGETS",98,0) + . . . Q +"RTN","BMXGETS",99,0) + . . Q +"RTN","BMXGETS",100,0) + . ;---> Convert data to mixed case if BMXMC=1. +"RTN","BMXGETS",101,0) +ZZZ . S:BMXMC X=$$T^BMXTRS(X) +"RTN","BMXGETS",102,0) + . ; +"RTN","BMXGETS",103,0) + . ;---> Set data in result global. +"RTN","BMXGETS",104,0) + . S ^BMXTEMP($J,I)=X_$C(30) +"RTN","BMXGETS",105,0) + . S I=I+1 +"RTN","BMXGETS",106,0) + ; +"RTN","BMXGETS",107,0) + ;---> If no results, report it as an error. +"RTN","BMXGETS",108,0) + D:'$O(^BMXTEMP($J,0)) +"RTN","BMXGETS",109,0) + .I BMXIN]"" S BMXERR="No entry matches """_BMXIN_"""." Q +"RTN","BMXGETS",110,0) + .S BMXERR="Either the lookup file is empty" +"RTN","BMXGETS",111,0) + .S BMXERR=BMXERR_" or all entries are screened (software error)." +"RTN","BMXGETS",112,0) + ; +"RTN","BMXGETS",113,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXGETS",114,0) + S ^BMXTEMP($J,I)=BMX31_BMXERR +"RTN","BMXGETS",115,0) + Q +"RTN","BMXGETS",116,0) + ; +"RTN","BMXGETS",117,0) + ; +"RTN","BMXGETS",118,0) + ;---------- +"RTN","BMXGETS",119,0) +ERROUT(BMXERR,I) ;EP +"RTN","BMXGETS",120,0) + ;---> Save next line for Error Code File if ever used. +"RTN","BMXGETS",121,0) + ;---> If necessary, use I>1 to avoid overwriting valid data. +"RTN","BMXGETS",122,0) + S:'$G(I) I=1 +"RTN","BMXGETS",123,0) + S ^BMXTEMP($J,I)=BMX31_BMXERR +"RTN","BMXGETS",124,0) + Q +"RTN","BMXGETS",125,0) + ; +"RTN","BMXGETS",126,0) + ; +"RTN","BMXGETS",127,0) +PASSERR(BMXGBL,BMXERR) ;EP +"RTN","BMXGETS",128,0) + ;---> If the RPC routine calling the BMX Generic Lookup above +"RTN","BMXGETS",129,0) + ;---> detects a specific error prior to the call and wants to pass +"RTN","BMXGETS",130,0) + ;---> that error in the result global rather than a generic error, +"RTN","BMXGETS",131,0) + ;---> then a call to this function (PASSERR) can be made. +"RTN","BMXGETS",132,0) + ;---> This call will store the error text passed in the result global. +"RTN","BMXGETS",133,0) + ;---> The calling routine should then quit (abort its call to the +"RTN","BMXGETS",134,0) + ;---> BMX Generic Lookup function above). +"RTN","BMXGETS",135,0) + ; +"RTN","BMXGETS",136,0) + ;---> Parameters: +"RTN","BMXGETS",137,0) + ; 1 - BMXGBL (ret) Name of result global for Broker. +"RTN","BMXGETS",138,0) + ; 2 - BMXERR (req) Text of error to be stored in result global. +"RTN","BMXGETS",139,0) + ; +"RTN","BMXGETS",140,0) + S:$G(BMXERR)="" BMXERR="Error not passed (software error)." +"RTN","BMXGETS",141,0) + ; +"RTN","BMXGETS",142,0) + N BMX31 S BMX31=$C(31)_$C(31) +"RTN","BMXGETS",143,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXGETS",144,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXGETS",145,0) + S ^BMXTEMP($J,1)=BMX31_BMXERR +"RTN","BMXGETS",146,0) + Q +"RTN","BMXMBRK") +0^82^B32854296 +"RTN","BMXMBRK",1,0) +BMXMBRK ; IHS/OIT/HMW - BMXNet MONITOR ; +"RTN","BMXMBRK",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXMBRK",3,0) + ; +"RTN","BMXMBRK",4,0) + ; +"RTN","BMXMBRK",5,0) +PRSP(P) ;EP -Parse Protocol +"RTN","BMXMBRK",6,0) + ;M Extrinsic Function +"RTN","BMXMBRK",7,0) + ; +"RTN","BMXMBRK",8,0) + ;Inputs +"RTN","BMXMBRK",9,0) + ;P Protocol string with the form +"RTN","BMXMBRK",10,0) + ; Protocol := Protocol Header^Message where +"RTN","BMXMBRK",11,0) + ; Protocol Header := LLLWKID;WINH;PRCH;WISH;MESG +"RTN","BMXMBRK",12,0) + ; LLL := length of protocol header (3 numeric) +"RTN","BMXMBRK",13,0) + ; WKID := Workstation ID (ALPHA) +"RTN","BMXMBRK",14,0) + ; WINH := Window handle (ALPHA) +"RTN","BMXMBRK",15,0) + ; PRCH := Process handle (ALPHA) +"RTN","BMXMBRK",16,0) + ; WISH := Window server handle (ALPHA) +"RTN","BMXMBRK",17,0) + ; MESG := Unparsed message +"RTN","BMXMBRK",18,0) + ;Outputs +"RTN","BMXMBRK",19,0) + ;ERR 0 for success, "-1^Text" if error +"RTN","BMXMBRK",20,0) + ; +"RTN","BMXMBRK",21,0) + N ERR,C,M,R,X +"RTN","BMXMBRK",22,0) + S R=0,C=";",ERR=0,M=512 ;Maximum buffer input +"RTN","BMXMBRK",23,0) + IF $E(P,1,5)="{BMX}" S P=$E(P,6,$L(P)) ;drop out prefix +"RTN","BMXMBRK",24,0) + IF '+$G(P) S ERR="-1^Required input reference is NULL" +"RTN","BMXMBRK",25,0) + IF +ERR=0 D +"RTN","BMXMBRK",26,0) + . S BMXZ(R,"LENG")=+$E(P,1,3) +"RTN","BMXMBRK",27,0) + . S X=$E(P,4,BMXZ(R,"LENG")+3) +"RTN","BMXMBRK",28,0) + . S BMXZ(R,"MESG")=$E(P,BMXZ(R,"LENG")+4,M) +"RTN","BMXMBRK",29,0) + . S BMXZ(R,"WKID")=$P(X,C) +"RTN","BMXMBRK",30,0) + . S BMXZ(R,"WINH")=$P(X,C,2) +"RTN","BMXMBRK",31,0) + . S BMXZ(R,"PRCH")=$P(X,C,3) +"RTN","BMXMBRK",32,0) + . S BMXZ(R,"WISH")=$P(X,C,4) +"RTN","BMXMBRK",33,0) + Q ERR +"RTN","BMXMBRK",34,0) + ; +"RTN","BMXMBRK",35,0) +PRSM(P) ;EP - Parse message +"RTN","BMXMBRK",36,0) + ;M Extrinsic Function +"RTN","BMXMBRK",37,0) + ; +"RTN","BMXMBRK",38,0) + ;Inputs +"RTN","BMXMBRK",39,0) + ;P Message string with the form +"RTN","BMXMBRK",40,0) + ; Message := Header^Content +"RTN","BMXMBRK",41,0) + ; Header := LLL;FLAG +"RTN","BMXMBRK",42,0) + ; LLL := length of entire message (3 numeric) +"RTN","BMXMBRK",43,0) + ; FLAG := 1 indicates variables follow +"RTN","BMXMBRK",44,0) + ; Content := Contains API call information +"RTN","BMXMBRK",45,0) + ;Outputs +"RTN","BMXMBRK",46,0) + ;ERR 0 for success, "-1^Text" if error +"RTN","BMXMBRK",47,0) + N C,ERR,M,R,X,U +"RTN","BMXMBRK",48,0) + S U="^",R=1,C=";",ERR=0,M=512 ;Max buffer +"RTN","BMXMBRK",49,0) + IF '+$G(P) S ERR="-1^Required input reference is NULL" +"RTN","BMXMBRK",50,0) + IF +ERR=0 D +"RTN","BMXMBRK",51,0) + . S BMXZ(R,"LENG")=+$E(P,1,5) +"RTN","BMXMBRK",52,0) + . S BMXZ(R,"FLAG")=$E(P,6,6) +"RTN","BMXMBRK",53,0) + . S BMXZ(R,"TEXT")=$E(P,7,M) +"RTN","BMXMBRK",54,0) + Q ERR +"RTN","BMXMBRK",55,0) + ; +"RTN","BMXMBRK",56,0) +PRSA(P) ;EP - Parse API information, get calling info +"RTN","BMXMBRK",57,0) + ;M Extrinsic Function +"RTN","BMXMBRK",58,0) + ;Inputs +"RTN","BMXMBRK",59,0) + ;P Content := API Name^Param string +"RTN","BMXMBRK",60,0) + ; API := .01 field of API file +"RTN","BMXMBRK",61,0) + ; Param := Parameter information +"RTN","BMXMBRK",62,0) + ;Outputs +"RTN","BMXMBRK",63,0) + ;ERR 0 for success, "-1^Text" if error +"RTN","BMXMBRK",64,0) + ; +"RTN","BMXMBRK",65,0) + N C,DR,ERR,M,R,T,X,U +"RTN","BMXMBRK",66,0) + S U="^",R=2,C=";",ERR=0,M=512 ;Max buffer +"RTN","BMXMBRK",67,0) + IF '+$L(P) S ERR="-1^Required input reference is NULL" +"RTN","BMXMBRK",68,0) + IF +ERR=0 D +"RTN","BMXMBRK",69,0) + . S BMXZ(R,"CAPI")=$P(P,U) +"RTN","BMXMBRK",70,0) + . S BMXZ(R,"PARM")=$E(P,$F(P,U),M) +"RTN","BMXMBRK",71,0) + . S T=$O(^XWB(8994,"B",BMXZ(R,"CAPI"),0)) +"RTN","BMXMBRK",72,0) + . I '+T S ERR="-1^Remote Procedure '"_BMXZ(R,"CAPI")_"' doesn't exist on the server." Q ;P10 - dpc +"RTN","BMXMBRK",73,0) + . S T(0)=$G(^XWB(8994,T,0)) +"RTN","BMXMBRK",74,0) + . I $P(T(0),U,6)=1!($P(T(0),U,6)=2) S ERR="-1^Remote Procedure '"_BMXZ(R,"CAPI")_"' cannot be run at this time." Q ;P10. Check INACTIVE field. - dpc. +"RTN","BMXMBRK",75,0) + . S BMXZ(R,"NAME")=$P(T(0),"^") +"RTN","BMXMBRK",76,0) + . S BMXZ(R,"RTAG")=$P(T(0),"^",2) +"RTN","BMXMBRK",77,0) + . S BMXZ(R,"RNAM")=$P(T(0),"^",3) +"RTN","BMXMBRK",78,0) + . S BMXPTYPE=$P(T(0),"^",4) +"RTN","BMXMBRK",79,0) + . S BMXWRAP=+$P(T(0),"^",8) +"RTN","BMXMBRK",80,0) + Q ERR +"RTN","BMXMBRK",81,0) + ; +"RTN","BMXMBRK",82,0) +PRSB(P) ;EP - Parse Parameter information +"RTN","BMXMBRK",83,0) + ;M Extrinsic Function +"RTN","BMXMBRK",84,0) + ;Inputs +"RTN","BMXMBRK",85,0) + ;P Param := M parameter list +"RTN","BMXMBRK",86,0) + ; Param := LLL,Name,Value +"RTN","BMXMBRK",87,0) + ; LLL := length of variable name and value +"RTN","BMXMBRK",88,0) + ; Name := name of M variable +"RTN","BMXMBRK",89,0) + ; Value := a string +"RTN","BMXMBRK",90,0) + ;Outputs +"RTN","BMXMBRK",91,0) + ;ERR 0 for success, "-1^Text" if error +"RTN","BMXMBRK",92,0) + ; +"RTN","BMXMBRK",93,0) + N A,ERR,F,FL,I,K,L,M,P1,P2,P3,P4,P5,MAXP,R +"RTN","BMXMBRK",94,0) + S R=3,MAXP=+$E(P,1,5) +"RTN","BMXMBRK",95,0) + S P1=$E(P,6,MAXP+5) ;only param string +"RTN","BMXMBRK",96,0) + S ERR=0,F=3,M=512 +"RTN","BMXMBRK",97,0) + IF '+$D(P) S ERR="-1^Required input reference is NULL" +"RTN","BMXMBRK",98,0) + S FL=+$G(BMXZ(1,"FLAG")) +"RTN","BMXMBRK",99,0) + S I=0 +"RTN","BMXMBRK",100,0) + IF '+ERR D +"RTN","BMXMBRK",101,0) + . IF 'FL,+MAXP=0 S P1="",ERR=1 Q +"RTN","BMXMBRK",102,0) + . F D Q:P1="" +"RTN","BMXMBRK",103,0) + . . Q:P1="" +"RTN","BMXMBRK",104,0) + . . S L=+$E(P1,1,3)-1 +"RTN","BMXMBRK",105,0) + . . S P3=+$E(P1,4,4) +"RTN","BMXMBRK",106,0) + . . S P1=$E(P1,5,MAXP) +"RTN","BMXMBRK",107,0) + . . S BMXZ(R,"P",I)=$S(P3'=1:$E(P1,1,L),1:$$GETV($E(P1,1,L))) +"RTN","BMXMBRK",108,0) + . . IF FL=1,P3=2 D ;XWB*1.1*2 +"RTN","BMXMBRK",109,0) + . . . S A=$$OARY^BMXMBRK2,BMXARY=A +"RTN","BMXMBRK",110,0) + . . . S BMXZ(R,"P",I)=$$CREF^BMXMBRK2(A,BMXZ(R,"P",I)) +"RTN","BMXMBRK",111,0) + . . S P1=$E(P1,L+1,MAXP) +"RTN","BMXMBRK",112,0) + . . S K=I,I=I+1 +"RTN","BMXMBRK",113,0) + . IF 'FL Q +"RTN","BMXMBRK",114,0) + . S P3=P +"RTN","BMXMBRK",115,0) + . S L=+$E(P3,1,5) +"RTN","BMXMBRK",116,0) + . S P1=$E(P3,F+3,L+F) +"RTN","BMXMBRK",117,0) + . S P2=$E(P3,L+F+3,M) +"RTN","BMXMBRK",118,0) + . ;instantiate array +"RTN","BMXMBRK",119,0) + . F D Q:+L=0 +"RTN","BMXMBRK",120,0) + . . S L=$$BREAD(3) Q:+L=0 S P3=$$BREAD(L) +"RTN","BMXMBRK",121,0) + . . S L=$$BREAD(3) IF +L'=0 S P4=$$BREAD(L) +"RTN","BMXMBRK",122,0) + . . IF +L=0 Q +"RTN","BMXMBRK",123,0) + . . IF P3=0,P4=0 S L=0 Q +"RTN","BMXMBRK",124,0) + . . IF FL=1 D LINST(A,P3,P4) +"RTN","BMXMBRK",125,0) + . . IF FL=2 D GINST +"RTN","BMXMBRK",126,0) + IF ERR Q P1 +"RTN","BMXMBRK",127,0) + S P1="" +"RTN","BMXMBRK",128,0) + D Q P1 +"RTN","BMXMBRK",129,0) + . F I=0:1:K D +"RTN","BMXMBRK",130,0) + . . IF FL,$E(BMXZ(R,"P",I),1,5)=".BMXS" D Q ;XWB*1.1*2 +"RTN","BMXMBRK",131,0) + . . . S P1=P1_"."_$E(BMXZ(R,"P",I),2,$L(BMXZ(R,"P",I))) +"RTN","BMXMBRK",132,0) + . . . IF I'=K S P1=P1_"," +"RTN","BMXMBRK",133,0) + . . S P1=P1_"BMXZ("_R_",""P"","_I_")" +"RTN","BMXMBRK",134,0) + . . IF I'=K S P1=P1_"," +"RTN","BMXMBRK",135,0) + IF '+ERR Q P1 +"RTN","BMXMBRK",136,0) + Q ERR +"RTN","BMXMBRK",137,0) + ; +"RTN","BMXMBRK",138,0) +BREAD(L) ;read tcp buffer, L is length +"RTN","BMXMBRK",139,0) + N E,X,DONE +"RTN","BMXMBRK",140,0) + S (E,DONE)=0 +"RTN","BMXMBRK",141,0) + R X#L:BMXDTIME(1) +"RTN","BMXMBRK",142,0) + S E=X +"RTN","BMXMBRK",143,0) + IF $L(E)0) D +"RTN","BMXMBRK",159,0) + I '+ERR D CHKPRMIT^BMXMSEC(BMXZ(2,"CAPI")) ;checks if RPC allowed to run +"RTN","BMXMBRK",160,0) + S:$L($G(BMXSEC)) ERR="-1^"_BMXSEC +"RTN","BMXMBRK",161,0) + ;IF 'DEBUG S:$D(XRT0) XRTN="RPC BROKER READ/PARSE" D:$D(XRT0) T1^%ZOSV ;stop RTL +"RTN","BMXMBRK",162,0) + IF '+ERR,(+S=0)!(+S>0) D +"RTN","BMXMBRK",163,0) + . D CAPI^BMXMBRK2(.BMXP,BMXZ(2,"RTAG"),BMXZ(2,"RNAM"),S) +"RTN","BMXMBRK",164,0) + E D CLRBUF ;p10 +"RTN","BMXMBRK",165,0) + IF 'DEBUG K BMXZ +"RTN","BMXMBRK",166,0) + IF $D(BMXARY) K @BMXARY,BMXARY +"RTN","BMXMBRK",167,0) + Q +"RTN","BMXMBRK",168,0) + ; +"RTN","BMXMBRK",169,0) +LINST(A,X,BMXY) ;instantiate local array +"RTN","BMXMBRK",170,0) + IF BMXY=$C(1) S BMXY="" +"RTN","BMXMBRK",171,0) + S X=A_"("_X_")" +"RTN","BMXMBRK",172,0) + S @X=BMXY +"RTN","BMXMBRK",173,0) + Q +"RTN","BMXMBRK",174,0) +GINST ;instantiate global +"RTN","BMXMBRK",175,0) + N DONE,N,T,T1 +"RTN","BMXMBRK",176,0) + S (DONE,I)=0 +"RTN","BMXMBRK",177,0) + ;find piece with global ref - recover $C(44) +"RTN","BMXMBRK",178,0) + S REF=$TR(REF,$C(23),$C(44)) +"RTN","BMXMBRK",179,0) + F D Q:DONE +"RTN","BMXMBRK",180,0) + . S N=$NA(^TMP("BMXZ",$J,$P($H,",",2))) +"RTN","BMXMBRK",181,0) + . S BMXZ("FRM")=REF +"RTN","BMXMBRK",182,0) + . S BMXZ("TO")=N +"RTN","BMXMBRK",183,0) + . IF '$D(@N) S DONE=1 Q +"RTN","BMXMBRK",184,0) + ;loop through all and instantiate +"RTN","BMXMBRK",185,0) + S DONE=0 +"RTN","BMXMBRK",186,0) + F D Q:DONE +"RTN","BMXMBRK",187,0) + . S T=$E(@REF@(I),4,M) +"RTN","BMXMBRK",188,0) + . IF T="" S DONE=1 Q +"RTN","BMXMBRK",189,0) + . S @N@("BMXZ")="" ;set naked indicator +"RTN","BMXMBRK",190,0) + . S @T +"RTN","BMXMBRK",191,0) + . S I=I+1 +"RTN","BMXMBRK",192,0) + K @N@("BMXZ") +"RTN","BMXMBRK",193,0) + Q +"RTN","BMXMBRK",194,0) + ; +"RTN","BMXMBRK",195,0) +GETV(V) ;get value of V - reference parameter +"RTN","BMXMBRK",196,0) + N X +"RTN","BMXMBRK",197,0) + S X=V +"RTN","BMXMBRK",198,0) + IF $E(X,1,2)="$$" Q "" +"RTN","BMXMBRK",199,0) + IF $C(34,36)[$E(V) X "S V="_$$VCHK(V) +"RTN","BMXMBRK",200,0) + E S V=@V +"RTN","BMXMBRK",201,0) + Q V +"RTN","BMXMBRK",202,0) + ; +"RTN","BMXMBRK",203,0) +VCHK(S) ;Parse string for first argument +"RTN","BMXMBRK",204,0) + N C,I,P +"RTN","BMXMBRK",205,0) + F I=1:1 S C=$E(S,I) D VCHKP:C="(",VCHKQ:C=$C(34) Q:" ,"[C +"RTN","BMXMBRK",206,0) + Q $E(S,1,I-1) +"RTN","BMXMBRK",207,0) +VCHKP S P=1 ;Find closing paren +"RTN","BMXMBRK",208,0) + F I=I+1:1 S C=$E(S,I) Q:P=0!(C="") I "()"""[C D VCHKQ:C=$C(34) S P=P+$S("("[C:1,")"[C:-1,1:0) +"RTN","BMXMBRK",209,0) + Q +"RTN","BMXMBRK",210,0) +VCHKQ ;Find closing quote +"RTN","BMXMBRK",211,0) + F I=I+1:1 S C=$E(S,I) Q:C=""!(C=$C(34)) +"RTN","BMXMBRK",212,0) + Q +"RTN","BMXMBRK",213,0) +CLRBUF ;p10 Empties Input buffer +"RTN","BMXMBRK",214,0) + N % +"RTN","BMXMBRK",215,0) + F R %#1:BMXDTIME(1) Q:%="" +"RTN","BMXMBRK",216,0) + Q +"RTN","BMXMBRK2") +0^83^B17554247 +"RTN","BMXMBRK2",1,0) +BMXMBRK2 ; IHS/OIT/HMW - BMXNet MONITOR ; +"RTN","BMXMBRK2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXMBRK2",3,0) + ; +"RTN","BMXMBRK2",4,0) + ; +"RTN","BMXMBRK2",5,0) +CAPI(BMXY,TAG,NAM,PAR) ;EP - make API call +"RTN","BMXMBRK2",6,0) + N R,T,DX,DY +"RTN","BMXMBRK2",7,0) + IF BMXZ(1,"FLAG")=2 D +"RTN","BMXMBRK2",8,0) + . S PAR=$P(PAR,BMXZ("FRM"))_BMXZ("TO")_$P(PAR,BMXZ("FRM"),2) +"RTN","BMXMBRK2",9,0) + S R=$S(PAR'=+PAR&(PAR=""):TAG_"^"_NAM_"(.BMXY)",1:TAG_"^"_NAM_"(.BMXY,"_PAR_")") +"RTN","BMXMBRK2",10,0) + U IO +"RTN","BMXMBRK2",11,0) + D @R +"RTN","BMXMBRK2",12,0) + ; D DEBUG^%Serenji("@R","10.10.10.104") +"RTN","BMXMBRK2",13,0) + U $P +"RTN","BMXMBRK2",14,0) + Q +"RTN","BMXMBRK2",15,0) + ; +"RTN","BMXMBRK2",16,0) +BHDR(WKID,WINH,PRCH,WISH) ;Build a protocol header +"RTN","BMXMBRK2",17,0) + N S,L +"RTN","BMXMBRK2",18,0) + S S="" +"RTN","BMXMBRK2",19,0) + S S=WKID_";"_WINH_";"_PRCH_";"_WISH_";" +"RTN","BMXMBRK2",20,0) + S L=$L(S) +"RTN","BMXMBRK2",21,0) + S S=$E("000"_L,$L(L)+1,$L(L)+3)_S +"RTN","BMXMBRK2",22,0) + Q S +"RTN","BMXMBRK2",23,0) + ; +"RTN","BMXMBRK2",24,0) +BARY(A,R,V) ;add array elements+values to storage array +"RTN","BMXMBRK2",25,0) + IF A'["BMXS" Q "-1^ARRAY NAME MUST BE BMXS" +"RTN","BMXMBRK2",26,0) + S @A@(R)=V +"RTN","BMXMBRK2",27,0) + Q 0 +"RTN","BMXMBRK2",28,0) + ; +"RTN","BMXMBRK2",29,0) +BLDB(P) ;Build formatted string +"RTN","BMXMBRK2",30,0) + N L +"RTN","BMXMBRK2",31,0) + S L=$L(P) +"RTN","BMXMBRK2",32,0) + Q $E("000"_L,$L(L)+1,$L(L)+3)_P +"RTN","BMXMBRK2",33,0) + ; +"RTN","BMXMBRK2",34,0) +BLDA(N,P) ;Build API string +"RTN","BMXMBRK2",35,0) + ;M Extrinsic Function +"RTN","BMXMBRK2",36,0) + ;Inputs +"RTN","BMXMBRK2",37,0) + ;N API name +"RTN","BMXMBRK2",38,0) + ;P Comma delimited parameter string +"RTN","BMXMBRK2",39,0) + ;Outputs +"RTN","BMXMBRK2",40,0) + ;String API string if successful, "-1^Text" if error +"RTN","BMXMBRK2",41,0) + ; +"RTN","BMXMBRK2",42,0) + N I,F,L,T,U,T1,T2 +"RTN","BMXMBRK2",43,0) + IF '+$D(N) Q "-1^Required input reference is NULL" +"RTN","BMXMBRK2",44,0) + S U="^" +"RTN","BMXMBRK2",45,0) + S (F,T,Y)=0 +"RTN","BMXMBRK2",46,0) + IF '$D(P) S P="" +"RTN","BMXMBRK2",47,0) + IF P'="" D +"RTN","BMXMBRK2",48,0) + . S L=$L(P)-$L($TR(P,$C(44)))+1 +"RTN","BMXMBRK2",49,0) + . IF L=0 S L=1 +"RTN","BMXMBRK2",50,0) + . F I=1:1:L D Q:T +"RTN","BMXMBRK2",51,0) + . . S T1=$P(P,",",I) +"RTN","BMXMBRK2",52,0) + . . S T2=$E(T1,1,1)="." +"RTN","BMXMBRK2",53,0) + . . IF T1=+T1 Q +"RTN","BMXMBRK2",54,0) + . . IF $E(T1,1,1)="^" S F=2,T=1 Q +"RTN","BMXMBRK2",55,0) + . . IF T2&($E(T1,2,$L(T1))?.ANP) S F=1,T=1 Q +"RTN","BMXMBRK2",56,0) + S P=$$BLDB(P) +"RTN","BMXMBRK2",57,0) + S L=$L(P)+$L(P)-3 +"RTN","BMXMBRK2",58,0) + S P=F_N_U_P +"RTN","BMXMBRK2",59,0) + S L=$L(P) +"RTN","BMXMBRK2",60,0) + Q $E("000"_L,$L(L)+1,$L(L)+3)_P +"RTN","BMXMBRK2",61,0) + ; +"RTN","BMXMBRK2",62,0) +BLDS(R) ;Build a parameter string from an array +"RTN","BMXMBRK2",63,0) + N L,T,Y +"RTN","BMXMBRK2",64,0) + S Y="" +"RTN","BMXMBRK2",65,0) + F D Q:R="" +"RTN","BMXMBRK2",66,0) + . S R=$Q(@R) +"RTN","BMXMBRK2",67,0) + . IF R="" Q +"RTN","BMXMBRK2",68,0) + . S L=$L(R)+$L(@R)+1 +"RTN","BMXMBRK2",69,0) + . S T=@R +"RTN","BMXMBRK2",70,0) + . S T=$TR(T,$C(44),$C(23)) +"RTN","BMXMBRK2",71,0) + . S Y=Y_$E("000"_L,$L(L)+1,$L(L)+3)_R_"="_T +"RTN","BMXMBRK2",72,0) + Q Y_"000" +"RTN","BMXMBRK2",73,0) + ; +"RTN","BMXMBRK2",74,0) +BLDU(R) ;Build a parameter string from a scalar +"RTN","BMXMBRK2",75,0) + N DONE,L,N,N1,P1 +"RTN","BMXMBRK2",76,0) + IF R=+R Q R +"RTN","BMXMBRK2",77,0) + S N=$F(R,$C(34)) +"RTN","BMXMBRK2",78,0) + IF N=0 Q $C(34)_R_$C(34) +"RTN","BMXMBRK2",79,0) + S P1=$E(R,1,N-2) +"RTN","BMXMBRK2",80,0) + S (L,DONE)=0 +"RTN","BMXMBRK2",81,0) + F D Q:DONE +"RTN","BMXMBRK2",82,0) + . S N1=$F(R,$C(34),N) +"RTN","BMXMBRK2",83,0) + . IF N1=0 S L=$L(R)+2,N1=L +"RTN","BMXMBRK2",84,0) + . S P1=P1_$C(34,34)_$E(R,N,N1-2) +"RTN","BMXMBRK2",85,0) + . IF N1=L S DONE=1,P1=$C(34)_P1_$C(34) Q +"RTN","BMXMBRK2",86,0) + . S N=N1 +"RTN","BMXMBRK2",87,0) + Q $TR(P1,$C(44),$C(23)) +"RTN","BMXMBRK2",88,0) + ; +"RTN","BMXMBRK2",89,0) +BLDG(R) ;build a parameter string from a global reference +"RTN","BMXMBRK2",90,0) + N I,L,L1,M,T,T1,T2,Y +"RTN","BMXMBRK2",91,0) + K ^TMP("BMXZ",$J) +"RTN","BMXMBRK2",92,0) + IF '$D(R) Q "-1^Reference does not exist" +"RTN","BMXMBRK2",93,0) + S Y=$NA(^TMP("BMXZ",$J,$P($H,",",2))) +"RTN","BMXMBRK2",94,0) + S I=0 +"RTN","BMXMBRK2",95,0) + S M=512 +"RTN","BMXMBRK2",96,0) + S T1=$P(R,")") +"RTN","BMXMBRK2",97,0) + S L1=$L($P(R,"(")) +"RTN","BMXMBRK2",98,0) + F D Q:R="" +"RTN","BMXMBRK2",99,0) + . S R=$Q(@R) +"RTN","BMXMBRK2",100,0) + . S T2=$F(R,"(") +"RTN","BMXMBRK2",101,0) + . IF R=""!(R'[T1) Q +"RTN","BMXMBRK2",102,0) + . S L=$L(R)+$L(@R)-L1 +"RTN","BMXMBRK2",103,0) + . S T=@R +"RTN","BMXMBRK2",104,0) + . S T=$TR(T,$C(44),$C(23)) +"RTN","BMXMBRK2",105,0) + . S @Y@(I)=$E("000"_L,$L(L)+1,$L(L)+3)_"^("_$E(R,T2,M)_"="_$$BLDU(T) +"RTN","BMXMBRK2",106,0) + . S I=I+1 +"RTN","BMXMBRK2",107,0) + S @Y@(I)="000" +"RTN","BMXMBRK2",108,0) + S Y=$TR(Y,$C(44),$C(23)) +"RTN","BMXMBRK2",109,0) + Q Y +"RTN","BMXMBRK2",110,0) + ; +"RTN","BMXMBRK2",111,0) +OARY() ;EP - create storage array +"RTN","BMXMBRK2",112,0) + N A,DONE,I +"RTN","BMXMBRK2",113,0) + S (DONE,I)=0 +"RTN","BMXMBRK2",114,0) + F I=1:1 D Q:DONE +"RTN","BMXMBRK2",115,0) + . S A="BMXS"_I +"RTN","BMXMBRK2",116,0) + . K @A ;temp fix for single array +"RTN","BMXMBRK2",117,0) + . IF '$D(@A) S DONE=1 +"RTN","BMXMBRK2",118,0) + S @A="" ;set naked +"RTN","BMXMBRK2",119,0) + Q A +"RTN","BMXMBRK2",120,0) + ; +"RTN","BMXMBRK2",121,0) +CREF(R,P) ;EP - Convert array contained in P to reference A +"RTN","BMXMBRK2",122,0) + N I,X,DONE,F1,S +"RTN","BMXMBRK2",123,0) + S DONE=0 +"RTN","BMXMBRK2",124,0) + S S="" +"RTN","BMXMBRK2",125,0) + F I=1:1 D Q:DONE +"RTN","BMXMBRK2",126,0) + . IF $P(P,",",I)="" S DONE=1 Q +"RTN","BMXMBRK2",127,0) + . S X(I)=$P(P,",",I) +"RTN","BMXMBRK2",128,0) + . IF X(I)?1"."1A.E D +"RTN","BMXMBRK2",129,0) + . . S F1=$F(X(I),".") +"RTN","BMXMBRK2",130,0) + . . S X(I)="."_R +"RTN","BMXMBRK2",131,0) + . S S=S_X(I)_"," +"RTN","BMXMBRK2",132,0) + Q $E(S,1,$L(S)-1) +"RTN","BMXMBRK2",133,0) + ; +"RTN","BMXMBRK2",134,0) +GETP(P) ;returns various parameters out of the Protocol string +"RTN","BMXMBRK2",135,0) + N M,T,BMXZ +"RTN","BMXMBRK2",136,0) + S M=512 +"RTN","BMXMBRK2",137,0) + S T=$$PRSP^BMXMBRK(P) +"RTN","BMXMBRK2",138,0) + IF '+T D +"RTN","BMXMBRK2",139,0) + . S T=$$PRSM^BMXMBRK(BMXZ(0,"MESG")) +"RTN","BMXMBRK2",140,0) + . IF '+T S T=BMXZ(0,"WKID")_";"_BMXZ(0,"WINH")_";"_BMXZ(0,"PRCH")_";"_BMXZ(0,"WISH")_";"_$P(BMXZ(1,"TEXT"),"^") +"RTN","BMXMBRK2",141,0) + Q T +"RTN","BMXMBRK2",142,0) + ; +"RTN","BMXMBRK2",143,0) +CALLM(X,P,DEBUG) ;make call using Message string +"RTN","BMXMBRK2",144,0) + N ERR,S +"RTN","BMXMBRK2",145,0) + S X="",ERR=0 +"RTN","BMXMBRK2",146,0) + S ERR=$$PRSM^BMXMBRK(P) +"RTN","BMXMBRK2",147,0) + IF '+ERR S ERR=$$PRSA^BMXMBRK(BMXZ(1,"TEXT")) +"RTN","BMXMBRK2",148,0) + IF '+ERR S S=$$PRSB^BMXMBRK(BMXZ(2,"PARM")) +"RTN","BMXMBRK2",149,0) + IF (+S=0)!(+S>0) D +"RTN","BMXMBRK2",150,0) + . D CAPI(.X,BMXZ(2,"RTAG"),BMXZ(2,"RNAM"),S) +"RTN","BMXMBRK2",151,0) + IF 'DEBUG K BMXZ +"RTN","BMXMBRK2",152,0) + K @(X("BMXS")),X("BMXS") +"RTN","BMXMBRK2",153,0) + Q +"RTN","BMXMBRK2",154,0) + ; +"RTN","BMXMBRK2",155,0) +CALLA(X,P,DEBUG) ;make call using API string +"RTN","BMXMBRK2",156,0) + N ERR,S +"RTN","BMXMBRK2",157,0) + S X="",ERR=0 +"RTN","BMXMBRK2",158,0) + S ERR=$$PRSA^BMXMBRK(P) +"RTN","BMXMBRK2",159,0) + IF '+ERR S S=$$PRSB^BMXMBRK(BMXZ(2,"PARM")) +"RTN","BMXMBRK2",160,0) + IF (+S=0)!(+S>0) D +"RTN","BMXMBRK2",161,0) + . D CAPI(.X,BMXZ(2,"RTAG"),BMXZ(2,"RNAM"),S) +"RTN","BMXMBRK2",162,0) + IF 'DEBUG K BMXZ +"RTN","BMXMBRK2",163,0) + K @(X("BMXS")),X("BMXS") +"RTN","BMXMBRK2",164,0) + Q +"RTN","BMXMBRK2",165,0) + ; +"RTN","BMXMBRK2",166,0) +TRANSPRT() ;Determine the Transport Method +"RTN","BMXMBRK2",167,0) + ;DDP is local :=0 +"RTN","BMXMBRK2",168,0) + ;TCP/IP is remote :=1 +"RTN","BMXMBRK2",169,0) + ;Serial/RS-232 is remote :=2 +"RTN","BMXMBRK2",170,0) + Q 1 +"RTN","BMXMBRK2",171,0) + ;Q 0 ;Do DDP for Now +"RTN","BMXMEVN") +0^84^B41862703 +"RTN","BMXMEVN",1,0) +BMXMEVN ; IHS/OIT/HMW - BMXNet MONITOR ; +"RTN","BMXMEVN",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXMEVN",3,0) + ; +"RTN","BMXMEVN",4,0) + Q +"RTN","BMXMEVN",5,0) + ; +"RTN","BMXMEVN",6,0) +REGET ;EP +"RTN","BMXMEVN",7,0) + ;Error trap from REGEVNT, RAISEVNT, and UNREG +"RTN","BMXMEVN",8,0) + ; +"RTN","BMXMEVN",9,0) + I '$D(BMXI) N BMXI S BMXI=999 +"RTN","BMXMEVN",10,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",11,0) + D REGERR(BMXI,99) +"RTN","BMXMEVN",12,0) + Q +"RTN","BMXMEVN",13,0) + ; +"RTN","BMXMEVN",14,0) +REGERR(BMXI,BMXERID) ;Error processing +"RTN","BMXMEVN",15,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",16,0) + S ^TMP("BMX",$J,BMXI)=BMXERID_$C(30) +"RTN","BMXMEVN",17,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",18,0) + S ^TMP("BMX",$J,BMXI)=$C(31) +"RTN","BMXMEVN",19,0) + Q +"RTN","BMXMEVN",20,0) + ; +"RTN","BMXMEVN",21,0) +REGEVNT(BMXY,BMXEVENT) ;EP +"RTN","BMXMEVN",22,0) + ;RPC Called by BMX REGISTER EVENT to inform RPMS server +"RTN","BMXMEVN",23,0) + ;of client's interest in BMXEVENT +"RTN","BMXMEVN",24,0) + ;Returns RECORDSET with field ERRORID. +"RTN","BMXMEVN",25,0) + ;If everything ok then ERRORID = 0; +"RTN","BMXMEVN",26,0) + ; +"RTN","BMXMEVN",27,0) + N BMXI +"RTN","BMXMEVN",28,0) + S BMXI=0 +"RTN","BMXMEVN",29,0) + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") +"RTN","BMXMEVN",30,0) + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY +"RTN","BMXMEVN",31,0) + S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30) +"RTN","BMXMEVN",32,0) + S ^TMP("BMX EVENT",$J,BMXEVENT)=$G(DUZ) +"RTN","BMXMEVN",33,0) + ; +"RTN","BMXMEVN",34,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",35,0) + S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31) +"RTN","BMXMEVN",36,0) + Q +"RTN","BMXMEVN",37,0) + ; +"RTN","BMXMEVN",38,0) +RAISEVNT(BMXY,BMXEVENT,BMXPARAM,BMXBACK,BMXKEY) ;EP +"RTN","BMXMEVN",39,0) + ;RPC Called to raise event BMXEVENT with parameter BMXPARAM +"RTN","BMXMEVN",40,0) + ;If BMXBACK = 'TRUE' then event will be raised back to originator +"RTN","BMXMEVN",41,0) + ;Calls EVENT +"RTN","BMXMEVN",42,0) + ;Returns a RECORDSET wit the field ERRORID. +"RTN","BMXMEVN",43,0) + ;If everything ok then ERRORID = 0; +"RTN","BMXMEVN",44,0) + ; +"RTN","BMXMEVN",45,0) + N BMXI,BMXORIG +"RTN","BMXMEVN",46,0) + S BMXI=0 +"RTN","BMXMEVN",47,0) + S BMXORIG=$S($G(BMXBACK)="TRUE":"",1:$J) +"RTN","BMXMEVN",48,0) + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY +"RTN","BMXMEVN",49,0) + S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30) +"RTN","BMXMEVN",50,0) + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") +"RTN","BMXMEVN",51,0) + ; +"RTN","BMXMEVN",52,0) + D EVENT(BMXEVENT,BMXPARAM,BMXORIG,$G(BMXKEY)) +"RTN","BMXMEVN",53,0) + ; +"RTN","BMXMEVN",54,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",55,0) + S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31) +"RTN","BMXMEVN",56,0) + Q +"RTN","BMXMEVN",57,0) + ; +"RTN","BMXMEVN",58,0) +EVENT(BMXEVENT,BMXPARAM,BMXORIG,BMXKEY) ;PEP - Raise event to interested clients +"RTN","BMXMEVN",59,0) + ;Clients are listed in ^TMP("BMX EVENT",BMXEVENT,BMXSESS)=DUZ +"RTN","BMXMEVN",60,0) + ;BMXORIG represents the event originator's session +"RTN","BMXMEVN",61,0) + ;The event will not be raised back to the originator if BMXORIG is the session of the originator +"RTN","BMXMEVN",62,0) + ;BMXKEY is a ~-delimited list of security keys. Only holders of one of these keys +"RTN","BMXMEVN",63,0) + ;will receive event notification. If BMXKEY is "" then all registered sessions +"RTN","BMXMEVN",64,0) + ;will be notified. +"RTN","BMXMEVN",65,0) + ; +"RTN","BMXMEVN",66,0) + L +^TMP("BMX EVENT RAISED"):30 +"RTN","BMXMEVN",67,0) + N BMXSESS,BMXINC +"RTN","BMXMEVN",68,0) + S BMXSESS=0 F S BMXSESS=$O(^TMP("BMX EVENT",BMXSESS)) Q:'+BMXSESS D +"RTN","BMXMEVN",69,0) + . I BMXSESS=$G(BMXORIG) Q +"RTN","BMXMEVN",70,0) + . I '$D(^TMP("BMX EVENT",BMXSESS,BMXEVENT)) Q +"RTN","BMXMEVN",71,0) + . ;S BMXDUZ=^TMP("BMX EVENT",BMXEVENT,BMXSESS) +"RTN","BMXMEVN",72,0) + . S BMXDUZ=^TMP("BMX EVENT",BMXSESS,BMXEVENT) +"RTN","BMXMEVN",73,0) + . ;TODO: Test if DUZ holds at least one of the keys in BMXKEY +"RTN","BMXMEVN",74,0) + . S BMXINC=$O(^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,99999999),-1) +"RTN","BMXMEVN",75,0) + . S:BMXINC="" BMXINC=0 +"RTN","BMXMEVN",76,0) + . ;S ^TMP("BMXTRACK",$P($H,",",2))="Job "_$J_" Set "_$NA(^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,BMXINC+1))_"="_$G(BMXPARAM) +"RTN","BMXMEVN",77,0) + . S ^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,BMXINC+1)=$G(BMXPARAM) ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMEVN",78,0) + . Q +"RTN","BMXMEVN",79,0) + L -^TMP("BMX EVENT RAISED") +"RTN","BMXMEVN",80,0) + Q +"RTN","BMXMEVN",81,0) + ; +"RTN","BMXMEVN",82,0) +POLLD(BMXY) ;EP +"RTN","BMXMEVN",83,0) + ;Debug Entry Point +"RTN","BMXMEVN",84,0) + D DEBUG^%Serenji("POLL^BMXMEVN(.BMXY)") +"RTN","BMXMEVN",85,0) + Q +"RTN","BMXMEVN",86,0) + ; +"RTN","BMXMEVN",87,0) +POLL(BMXY) ;EP +"RTN","BMXMEVN",88,0) + ;Check event queue for events of interest to current session +"RTN","BMXMEVN",89,0) + ;Return DataSet of events and parameters +"RTN","BMXMEVN",90,0) + ;Called by BMX EVENT POLL +"RTN","BMXMEVN",91,0) + ; +"RTN","BMXMEVN",92,0) + N BMXI,BMXEVENT +"RTN","BMXMEVN",93,0) + S BMXI=0 +"RTN","BMXMEVN",94,0) + S X="POLLET^BMXMEVN",@^%ZOSF("TRAP") +"RTN","BMXMEVN",95,0) + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY +"RTN","BMXMEVN",96,0) + S ^TMP("BMX",$J,0)="T00030EVENT"_U_"T00030PARAM"_$C(30) +"RTN","BMXMEVN",97,0) + L +^TMP("BMX EVENT RAISED"):1 G:'$T POLLEND +"RTN","BMXMEVN",98,0) + ; +"RTN","BMXMEVN",99,0) + G:'$D(^TMP("BMX EVENT RAISED",$J)) POLLEND +"RTN","BMXMEVN",100,0) + S BMXEVENT=0 F S BMXEVENT=$O(^TMP("BMX EVENT RAISED",$J,BMXEVENT)) Q:BMXEVENT']"" D +"RTN","BMXMEVN",101,0) + . N BMXINC +"RTN","BMXMEVN",102,0) + . S BMXINC=0 +"RTN","BMXMEVN",103,0) + . F S BMXINC=$O(^TMP("BMX EVENT RAISED",$J,BMXEVENT,BMXINC)) Q:'+BMXINC D +"RTN","BMXMEVN",104,0) + . . ;Set output array node +"RTN","BMXMEVN",105,0) + . . S BMXPARAM=$G(^TMP("BMX EVENT RAISED",$J,BMXEVENT,BMXINC)) +"RTN","BMXMEVN",106,0) + . . S BMXI=BMXI+1 +"RTN","BMXMEVN",107,0) + . . S ^TMP("BMX",$J,BMXI)=BMXEVENT_U_BMXPARAM_$C(30) +"RTN","BMXMEVN",108,0) + . . Q +"RTN","BMXMEVN",109,0) + . Q +"RTN","BMXMEVN",110,0) + ;S ^TMP("BMXTRACK",$P($H,",",2))="Job "_$J_" Killed "_$NA(^TMP("BMX EVENT RAISED",$J)) +"RTN","BMXMEVN",111,0) + K ^TMP("BMX EVENT RAISED",$J) +"RTN","BMXMEVN",112,0) + ; +"RTN","BMXMEVN",113,0) +POLLEND S BMXI=BMXI+1 +"RTN","BMXMEVN",114,0) + S ^TMP("BMX",$J,BMXI)=$C(31) +"RTN","BMXMEVN",115,0) + L -^TMP("BMX EVENT RAISED") +"RTN","BMXMEVN",116,0) + Q +"RTN","BMXMEVN",117,0) + ; +"RTN","BMXMEVN",118,0) +TTESTD(BMXY,BMXTIME) ;Debug entry point +"RTN","BMXMEVN",119,0) + ; +"RTN","BMXMEVN",120,0) + D DEBUG^%Serenji("TTEST^BMXMEVN(.BMXY,BMXTIME)") +"RTN","BMXMEVN",121,0) + Q +"RTN","BMXMEVN",122,0) + ; +"RTN","BMXMEVN",123,0) +TTEST(BMXY,BMXTIME) ;EP Timer Test +"RTN","BMXMEVN",124,0) + ; +"RTN","BMXMEVN",125,0) + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") +"RTN","BMXMEVN",126,0) + S BMXY=$NA(^BMXTMP("BMX",$J)) K @BMXY +"RTN","BMXMEVN",127,0) + S ^BMXTMP("BMX",$J,0)="I00020HANGTIME"_$C(30) +"RTN","BMXMEVN",128,0) + I +BMXTIME H BMXTIME +"RTN","BMXMEVN",129,0) + ; +"RTN","BMXMEVN",130,0) + S BMXI=1 +"RTN","BMXMEVN",131,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",132,0) + S ^BMXTMP("BMX",$J,BMXI)=BMXTIME_$C(30)_$C(31) +"RTN","BMXMEVN",133,0) + ; +"RTN","BMXMEVN",134,0) + Q +"RTN","BMXMEVN",135,0) + ; +"RTN","BMXMEVN",136,0) +UNREGALL ;EP +"RTN","BMXMEVN",137,0) + ;Unregister all events for current session +"RTN","BMXMEVN",138,0) + ;Called on exit of each session +"RTN","BMXMEVN",139,0) + ; +"RTN","BMXMEVN",140,0) + N BMXEVENT +"RTN","BMXMEVN",141,0) + S BMXEVENT="" +"RTN","BMXMEVN",142,0) + K ^TMP("BMX EVENT",$J) +"RTN","BMXMEVN",143,0) + Q +"RTN","BMXMEVN",144,0) + ; +"RTN","BMXMEVN",145,0) +UNREG(BMXY,BMXEVENT) ;EP +"RTN","BMXMEVN",146,0) + ;RPC Called by client to Unregister client's interest in BMXEVENT +"RTN","BMXMEVN",147,0) + ;Returns RECORDSET with field ERRORID. +"RTN","BMXMEVN",148,0) + ;If everything ok then ERRORID = 0; +"RTN","BMXMEVN",149,0) + ; +"RTN","BMXMEVN",150,0) + N BMXI +"RTN","BMXMEVN",151,0) + S BMXI=0 +"RTN","BMXMEVN",152,0) + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") +"RTN","BMXMEVN",153,0) + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY +"RTN","BMXMEVN",154,0) + S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30) +"RTN","BMXMEVN",155,0) + K ^TMP("BMX EVENT",$J,BMXEVENT) +"RTN","BMXMEVN",156,0) + ; +"RTN","BMXMEVN",157,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",158,0) + S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31) +"RTN","BMXMEVN",159,0) + Q +"RTN","BMXMEVN",160,0) + ; +"RTN","BMXMEVN",161,0) +POLLET ;EP +"RTN","BMXMEVN",162,0) + ;Error trap from REGEVNT, RAISEVNT, ASYNCQUE and UNREG +"RTN","BMXMEVN",163,0) + ; +"RTN","BMXMEVN",164,0) + I '$D(BMXI) N BMXI S BMXI=999 +"RTN","BMXMEVN",165,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",166,0) + D POLLERR(BMXI,99) +"RTN","BMXMEVN",167,0) + Q +"RTN","BMXMEVN",168,0) + ; +"RTN","BMXMEVN",169,0) +POLLERR(BMXI,BMXERID) ;Error processing +"RTN","BMXMEVN",170,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",171,0) + S ^TMP("BMX",$J,BMXI)=BMXERID_U_$C(30) +"RTN","BMXMEVN",172,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",173,0) + S ^TMP("BMX",$J,BMXI)=$C(31) +"RTN","BMXMEVN",174,0) + Q +"RTN","BMXMEVN",175,0) + ; +"RTN","BMXMEVN",176,0) +ASYNCQUE(BMXY,BMXRPC,BMXEVN) ;EP +"RTN","BMXMEVN",177,0) + ;RPC Queues taskman to job wrapper ASYNCZTM +"RTN","BMXMEVN",178,0) + ; +"RTN","BMXMEVN",179,0) + ;RETURNS EVENT NAME, ZTSK in PARAM +"RTN","BMXMEVN",180,0) + S X="POLLET^BMXMEVN",@^%ZOSF("TRAP") +"RTN","BMXMEVN",181,0) + S BMXY=$NA(^TMP("BMX ASYNC QUEUE",$J)) K @BMXY +"RTN","BMXMEVN",182,0) + S ^TMP("BMX ASYNC QUEUE",$J,0)="I00030ERRORID"_U_"I00030PARAM"_$C(30) +"RTN","BMXMEVN",183,0) + ; +"RTN","BMXMEVN",184,0) + ;K ZTSK +"RTN","BMXMEVN",185,0) + N ZTSK,ZTRTN,ZTSAVE,ZTDESC,ZTIO,ZTDTH +"RTN","BMXMEVN",186,0) + ;S ZTRTN="ASYNCZTD^BMXMEVN" ;Debugging call +"RTN","BMXMEVN",187,0) + S ZTRTN="ASYNCZTM^BMXMEVN" +"RTN","BMXMEVN",188,0) + S BMXRPC=$TR(BMXRPC,"~",$C(30)) +"RTN","BMXMEVN",189,0) + S ZTSAVE("BMXRPC")="" +"RTN","BMXMEVN",190,0) + S ZTSAVE("BMXEVN")="" +"RTN","BMXMEVN",191,0) + S ZTDESC="BMX ASYNC JOB" +"RTN","BMXMEVN",192,0) + S ZTIO="",ZTDTH=DT +"RTN","BMXMEVN",193,0) + D ^%ZTLOAD +"RTN","BMXMEVN",194,0) + ;D @ZTRTN ;Debugging call +"RTN","BMXMEVN",195,0) + ; +"RTN","BMXMEVN",196,0) + S ^TMP("BMX ASYNC QUEUE",$J,1)=1_U_$G(ZTSK)_$C(30) +"RTN","BMXMEVN",197,0) + S ^TMP("BMX ASYNC QUEUE",$J,2)=$C(31) +"RTN","BMXMEVN",198,0) + Q +"RTN","BMXMEVN",199,0) + ; +"RTN","BMXMEVN",200,0) +ASYNCZTD ;EP Debug entry point +"RTN","BMXMEVN",201,0) + D DEBUG^%Serenji("ASYNCZTM^BMXMEVN") +"RTN","BMXMEVN",202,0) + Q +"RTN","BMXMEVN",203,0) + ; +"RTN","BMXMEVN",204,0) +ASYNCZTM ;EP +"RTN","BMXMEVN",205,0) + ;Called by Taskman with BMXRPC and BMXEVN defined to +"RTN","BMXMEVN",206,0) + ; 1) invoke the BMXRPC (RPC NAME^PARAM1^...^PARAMN) +"RTN","BMXMEVN",207,0) + ; 2) when done, raises event BMXEVN with ZTSK^$J in BMXPARAM +"RTN","BMXMEVN",208,0) + ; +"RTN","BMXMEVN",209,0) + N BMXRTN,BMXTAG,BMXRPCD,BMXCALL,BMXJ,BMXY,BMXNOD,BMXY +"RTN","BMXMEVN",210,0) + N BMXT S BMXT=$C(30) +"RTN","BMXMEVN",211,0) + I $E(BMXRPC,1,6)="SELECT" S BMXRPC="BMX SQL"_$C(30)_BMXRPC +"RTN","BMXMEVN",212,0) + S BMXRPCD=$O(^XWB(8994,"B",$P(BMXRPC,BMXT),0)) +"RTN","BMXMEVN",213,0) + S BMXNOD=^XWB(8994,BMXRPCD,0) +"RTN","BMXMEVN",214,0) + S BMXRTN=$P(BMXNOD,U,3) +"RTN","BMXMEVN",215,0) + S BMXTAG=$P(BMXNOD,U,2) +"RTN","BMXMEVN",216,0) + S BMXCALL="D "_BMXTAG_"^"_BMXRTN_"(.BMXY," +"RTN","BMXMEVN",217,0) + F BMXJ=2:1:$L(BMXRPC,BMXT) D +"RTN","BMXMEVN",218,0) + . S BMXCALL=BMXCALL_$C(34)_$P(BMXRPC,BMXT,BMXJ)_$C(34) +"RTN","BMXMEVN",219,0) + . S:BMXJ<$L(BMXRPC,BMXT) BMXCALL=BMXCALL_"," +"RTN","BMXMEVN",220,0) + . Q +"RTN","BMXMEVN",221,0) + S BMXCALL=BMXCALL_")" +"RTN","BMXMEVN",222,0) + X BMXCALL +"RTN","BMXMEVN",223,0) + D EVENT(BMXEVN,$G(ZTSK)_"~"_$P($G(BMXY),U,2),$J,"") +"RTN","BMXMEVN",224,0) + Q +"RTN","BMXMEVN",225,0) + ; +"RTN","BMXMEVN",226,0) + ; +"RTN","BMXMEVN",227,0) + ;Windows event handler: +"RTN","BMXMEVN",228,0) + ;Catches event with ZTSK^DataLocation parameter +"RTN","BMXMEVN",229,0) + ;Matches ZTSK to process that called event +"RTN","BMXMEVN",230,0) + ;Calls ASYNCGET rpc with DATALOCATION parameter +"RTN","BMXMEVN",231,0) + ; +"RTN","BMXMEVN",232,0) +ASYNCGET(BMXY,BMXDATA) ;EP +"RTN","BMXMEVN",233,0) + ;RPC Retrieves data queued by ASYNCZTM +"RTN","BMXMEVN",234,0) + ;by setting BMXY to BMXDATA +"RTN","BMXMEVN",235,0) + ; +"RTN","BMXMEVN",236,0) + S BMXY="^"_BMXDATA +"RTN","BMXMEVN",237,0) + Q +"RTN","BMXMEVN",238,0) + ; +"RTN","BMXMEVN",239,0) +ASYNCET ;EP +"RTN","BMXMEVN",240,0) + ;Error trap from ASYNCQUE +"RTN","BMXMEVN",241,0) + ; +"RTN","BMXMEVN",242,0) + I '$D(BMXI) N BMXI S BMXI=999 +"RTN","BMXMEVN",243,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",244,0) + D ASYNCERR(BMXI,0) +"RTN","BMXMEVN",245,0) + Q +"RTN","BMXMEVN",246,0) + ; +"RTN","BMXMEVN",247,0) +ASYNCERR(BMXI,BMXERID) ;Error processing +"RTN","BMXMEVN",248,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",249,0) + S ^TMP("BMX ASYNC QUEUE",$J,BMXI)=BMXERID_U_$C(30) +"RTN","BMXMEVN",250,0) + S BMXI=BMXI+1 +"RTN","BMXMEVN",251,0) + S ^TMP("BMX ASYNC QUEUE",$J,BMXI)=$C(31) +"RTN","BMXMEVN",252,0) + Q +"RTN","BMXMON") +0^58^B117731908 +"RTN","BMXMON",1,0) +BMXMON ; IHS/OIT/HMW - BMXNet MONITOR ; 7/20/2009 +"RTN","BMXMON",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXMON",3,0) + ; +"RTN","BMXMON",4,0) + ;IHS/OIT/HMW Patch 1 added validity check for passed-in namespace +"RTN","BMXMON",5,0) + ; 7/20/2009: Release of patch to support GT.M WV/SMH +"RTN","BMXMON",6,0) + ; Changes: +"RTN","BMXMON",7,0) + ; Addition of XINETD and GTMLNX entry points for support of GT.M +"RTN","BMXMON",8,0) + ; Changes of W *-3 (which only works on Cache) to W ! +"RTN","BMXMON",9,0) + ; +"RTN","BMXMON",10,0) +STRT(BMXPORT,NS,IS,VB) ;EP +"RTN","BMXMON",11,0) + ;Interactive monitor start +"RTN","BMXMON",12,0) + ;Optional NS = namespace. If undefined, start in current ns +"RTN","BMXMON",13,0) + ;Optional IS = Integrated Security. Default is 1 +"RTN","BMXMON",14,0) + ;Optional VB = Verbose. Default is 1 +"RTN","BMXMON",15,0) + ; +"RTN","BMXMON",16,0) + N Y,BMXNS,BMXWIN +"RTN","BMXMON",17,0) + ; +"RTN","BMXMON",18,0) + ;Verbose +"RTN","BMXMON",19,0) + S BMXVB=$G(VB,1) +"RTN","BMXMON",20,0) + ; +"RTN","BMXMON",21,0) + ;Check if port already running +"RTN","BMXMON",22,0) + I '$$SEMAPHOR(BMXPORT,"LOCK") W:BMXVB "BMXNet Monitor on port "_BMXPORT_" appears to be running already.",! Q +"RTN","BMXMON",23,0) + S %=$$SEMAPHOR(BMXPORT,"UNLOCK") +"RTN","BMXMON",24,0) + ; +"RTN","BMXMON",25,0) + D MARKER(BMXPORT,1) ;record problem marker +"RTN","BMXMON",26,0) + ; -- start the monitor +"RTN","BMXMON",27,0) + ; +"RTN","BMXMON",28,0) + ;Namespace +"RTN","BMXMON",29,0) + X ^%ZOSF("UCI") +"RTN","BMXMON",30,0) + S BMXNS=$G(NS,$P(Y,",")) +"RTN","BMXMON",31,0) + ; +"RTN","BMXMON",32,0) + ;Integrated security +"RTN","BMXMON",33,0) + S BMXWIN=$G(IS,1) +"RTN","BMXMON",34,0) + ; +"RTN","BMXMON",35,0) + ;J DEBUG^%Serenji("MON^BMXMON("_BMXPORT_","_BMXNS_","_BMXWIN_")") +"RTN","BMXMON",36,0) + J MON^BMXMON(BMXPORT,BMXNS,BMXWIN)::5 I '$T W:BMXVB "Unable to run BMXNet Monitor in background.",! Q ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMON",37,0) + F %=1:1:5 D Q:%=0 +"RTN","BMXMON",38,0) + . W:BMXVB "Checking if BMXNet Monitor has started...",! +"RTN","BMXMON",39,0) + . H 1 +"RTN","BMXMON",40,0) + . S:'$$MARKER(BMXPORT,0) %=0 +"RTN","BMXMON",41,0) + I $$MARKER(BMXPORT,0) D +"RTN","BMXMON",42,0) + . W:BMXVB !,"BMXNet Monitor could not be started!",! +"RTN","BMXMON",43,0) + . W:BMXVB "Check if port "_BMXPORT_" is busy on this CPU.",! +"RTN","BMXMON",44,0) + . D MARKER(BMXPORT,-1) ;clear marker +"RTN","BMXMON",45,0) + E W:BMXVB "BMXNet Monitor started successfully." +"RTN","BMXMON",46,0) + ; +"RTN","BMXMON",47,0) + Q +"RTN","BMXMON",48,0) + ; +"RTN","BMXMON",49,0) +RESTART ;EP +"RTN","BMXMON",50,0) + ;Stop and Start all monitors in BMX MONITOR file +"RTN","BMXMON",51,0) + ;Called by option BMX MONITOR START +"RTN","BMXMON",52,0) + ; +"RTN","BMXMON",53,0) + D STOPALL +"RTN","BMXMON",54,0) + D STRTALL +"RTN","BMXMON",55,0) + Q +"RTN","BMXMON",56,0) + ; +"RTN","BMXMON",57,0) +STRTALL ;EP +"RTN","BMXMON",58,0) + ;Start all monitors in BMX MONITOR file +"RTN","BMXMON",59,0) + ; +"RTN","BMXMON",60,0) + N BMXIEN +"RTN","BMXMON",61,0) + S BMXIEN=0 F S BMXIEN=$O(^BMXMON(BMXIEN)) Q:'+BMXIEN D +"RTN","BMXMON",62,0) + . S BMXNOD=$G(^BMXMON(BMXIEN,0)) +"RTN","BMXMON",63,0) + . Q:'+BMXNOD +"RTN","BMXMON",64,0) + . Q:'+$P(BMXNOD,U,2) +"RTN","BMXMON",65,0) + . S BMXWIN=$P(BMXNOD,U,3) +"RTN","BMXMON",66,0) + . S BMXNS=$P(BMXNOD,U,4) +"RTN","BMXMON",67,0) + . D STRT($P(BMXNOD,U),BMXNS,BMXWIN,0) +"RTN","BMXMON",68,0) + . Q +"RTN","BMXMON",69,0) + Q +"RTN","BMXMON",70,0) + ; +"RTN","BMXMON",71,0) +STOPALL ;EP +"RTN","BMXMON",72,0) + ;Stop all monitors in BMXNET MONITOR file +"RTN","BMXMON",73,0) + ; +"RTN","BMXMON",74,0) + N BMXIEN,BMXPORT +"RTN","BMXMON",75,0) + S BMXIEN=0 F S BMXIEN=$O(^BMXMON(BMXIEN)) Q:'+BMXIEN D +"RTN","BMXMON",76,0) + . S BMXNOD=$G(^BMXMON(BMXIEN,0)) +"RTN","BMXMON",77,0) + . Q:'+BMXNOD +"RTN","BMXMON",78,0) + . S BMXPORT=+BMXNOD +"RTN","BMXMON",79,0) + . D STOP(BMXPORT,0) +"RTN","BMXMON",80,0) + Q +"RTN","BMXMON",81,0) + ; +"RTN","BMXMON",82,0) +STOP(BMXPORT,VB) ;EP Stop monitor on BMXPORT +"RTN","BMXMON",83,0) + ;Open a channel to monitor on BMXPORT and send shutdown request +"RTN","BMXMON",84,0) + ;Optional VB = Verbose. Default is 1 +"RTN","BMXMON",85,0) + ; +"RTN","BMXMON",86,0) + N IP,REF,X,DEV +"RTN","BMXMON",87,0) + S U="^" D HOME^%ZIS +"RTN","BMXMON",88,0) + ; +"RTN","BMXMON",89,0) + ;Verbose +"RTN","BMXMON",90,0) + S BMXVB=$G(VB,1) +"RTN","BMXMON",91,0) + ; +"RTN","BMXMON",92,0) + D:BMXVB EN^DDIOL("Stop BMXNet Monitor...") +"RTN","BMXMON",93,0) + X ^%ZOSF("UCI") S REF=Y +"RTN","BMXMON",94,0) + S IP="0.0.0.0" ;get server IP +"RTN","BMXMON",95,0) + IF $G(BMXPORT)="" S BMXPORT=9200 +"RTN","BMXMON",96,0) + ; -- make sure the listener is running +"RTN","BMXMON",97,0) + I $$SEMAPHOR(BMXPORT,"LOCK") D Q +"RTN","BMXMON",98,0) + . S %=$$SEMAPHOR(BMXPORT,"UNLOCK") +"RTN","BMXMON",99,0) + . D:BMXVB EN^DDIOL("BMXNet Monitor does not appear to be running.") +"RTN","BMXMON",100,0) + ; -- send the shutdown message to the TCP Listener process +"RTN","BMXMON",101,0) + D CALL^%ZISTCP("127.0.0.1",BMXPORT) I POP D Q +"RTN","BMXMON",102,0) + . S %=$$SEMAPHOR(BMXPORT,"UNLOCK") +"RTN","BMXMON",103,0) + . D:BMXVB EN^DDIOL("BMXNet Monitor does not appear to be running.") +"RTN","BMXMON",104,0) + U IO +"RTN","BMXMON",105,0) + S X=$T(+2),X=$P(X,";;",2),X=$P(X,";") +"RTN","BMXMON",106,0) + IF X="" S X=0 +"RTN","BMXMON",107,0) + S X=$C($L(X))_X +"RTN","BMXMON",108,0) + W "{BMX}00011TCPshutdown",! +"RTN","BMXMON",109,0) + R X#3:5 +"RTN","BMXMON",110,0) + D CLOSE^%ZISTCP +"RTN","BMXMON",111,0) + I X="ack" D:BMXVB EN^DDIOL("BMXNet Monitor has been shutdown.") +"RTN","BMXMON",112,0) + E D:BMXVB EN^DDIOL("Shutdown Failed!") +"RTN","BMXMON",113,0) + ;change process name +"RTN","BMXMON",114,0) + D CHPRN($J) +"RTN","BMXMON",115,0) + Q +"RTN","BMXMON",116,0) + ; +"RTN","BMXMON",117,0) +MON(BMXPORT,NS,IS) ;Monitor port for connection & shutdown requests +"RTN","BMXMON",118,0) + ;NS = Namespace to Start monitor +"RTN","BMXMON",119,0) + ;IS = 1: Enable integrated security +"RTN","BMXMON",120,0) + ; +"RTN","BMXMON",121,0) + N BMXDEV,BMXQUIT,BMXDTIME,BMXLEN,BMXACT,BMXWIN,BMXNS +"RTN","BMXMON",122,0) + S BMXQUIT=0,BMXDTIME=999999 +"RTN","BMXMON",123,0) + ; +"RTN","BMXMON",124,0) + ;Set lock +"RTN","BMXMON",125,0) + Q:'$$SEMAPHOR(BMXPORT,"LOCK") +"RTN","BMXMON",126,0) + ;Clear problem marker +"RTN","BMXMON",127,0) + D MARKER(BMXPORT,-1) +"RTN","BMXMON",128,0) + ;H 1 +"RTN","BMXMON",129,0) + ; +"RTN","BMXMON",130,0) + ;Namespace +"RTN","BMXMON",131,0) + X ^%ZOSF("UCI") +"RTN","BMXMON",132,0) + S BMXNS=$G(NS,$P(Y,",")) +"RTN","BMXMON",133,0) + ; +"RTN","BMXMON",134,0) + ;Integrated security +"RTN","BMXMON",135,0) + S BMXWIN=$G(IS,1) +"RTN","BMXMON",136,0) + ; +"RTN","BMXMON",137,0) + ;Open server port; +"RTN","BMXMON",138,0) + S BMXDEV="|TCP|"_BMXPORT +"RTN","BMXMON",139,0) + C BMXDEV ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMON",140,0) + O BMXDEV:(:BMXPORT:"S"):5 I '$T Q ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMON",141,0) + ; +"RTN","BMXMON",142,0) + ;S BMXDTIME(1)=BMXDTIME ; TODO: Set timeouts +"RTN","BMXMON",143,0) + S BMXDTIME(1)=.5 ;HMW 20050120 +"RTN","BMXMON",144,0) + U BMXDEV +"RTN","BMXMON",145,0) + F D Q:BMXQUIT +"RTN","BMXMON",146,0) + . R BMXACT#5:BMXDTIME ;Read first 5 chars from TCP buffer, timeout=BMXDTIME +"RTN","BMXMON",147,0) + . I BMXACT'="{BMX}" S BMXQUIT=1 Q +"RTN","BMXMON",148,0) + . R BMXACT#5:BMXDTIME ;Read next 5 chars - message length +"RTN","BMXMON",149,0) + . S BMXLEN=+BMXACT +"RTN","BMXMON",150,0) + . R BMXACT#BMXLEN:BMXDTIME +"RTN","BMXMON",151,0) + . I $P(BMXACT,"^")="TCPconnect" D Q +"RTN","BMXMON",152,0) + . . ;IHS/OIT/HMW added validity check for namespace +"RTN","BMXMON",153,0) + . . N BMXNSJ,X,Y +"RTN","BMXMON",154,0) + . . S BMXNSJ=$P(BMXACT,"^",2) ;Namespace +"RTN","BMXMON",155,0) + . . S BMXNSJ=$P(BMXNSJ,",") +"RTN","BMXMON",156,0) + . . ;if passed in namespace is invalid, new job will start in listener namespace +"RTN","BMXMON",157,0) + . . I BMXNSJ]"" S X=BMXNSJ X ^%ZOSF("UCICHECK") S:Y=0 BMXNSJ=BMXNS +"RTN","BMXMON",158,0) + . . ;Job another MONITOR using concurrent connection +"RTN","BMXMON",159,0) + . . ;J DEBUG^%Serenji("SESSION^BMXMON("_BMXWIN_")"):(:5:BMXDEV:BMXDEV):5 +"RTN","BMXMON",160,0) + . . ;J SESSION^BMXMON(BMXWIN)[$P(BMXNS,",")]:(:5:BMXDEV:BMXDEV):5 ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMON",161,0) + . . J SESSION^BMXMON(BMXWIN)[BMXNSJ]:(:5:BMXDEV:BMXDEV):5 ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMON",162,0) + . I $P(BMXACT,"^")="TCPshutdown" S BMXQUIT=1 W "ack",! +"RTN","BMXMON",163,0) + S %=$$SEMAPHOR(BMXPORT,"UNLOCK") ; destroy 'running flag' +"RTN","BMXMON",164,0) + Q +"RTN","BMXMON",165,0) + ; +"RTN","BMXMON",166,0) +XINETD ;PEP Directly from xinetd or inetd for GT.M +"RTN","BMXMON",167,0) + N BMXDEV +"RTN","BMXMON",168,0) + S U="^",$ETRAP="D ^%ZTER H" ;Set up the error trap +"RTN","BMXMON",169,0) + S $ZT="" ;Clear old trap +"RTN","BMXMON",170,0) + ; GT.M specific error and device code +"RTN","BMXMON",171,0) + S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") +"RTN","BMXMON",172,0) + S BMXDEV=$P X "U BMXDEV:(nowrap:nodelimiter:ioerror=""TRAP"")" +"RTN","BMXMON",173,0) + S %="",@("%=$ZTRNLNM(""REMOTE_HOST"")") S:$L(%) IO("GTM-IP")=% +"RTN","BMXMON",174,0) + I %["::ffff:" S IO("GTM-IP")=$P(%,"::ffff:",2) ; IPv6 support +"RTN","BMXMON",175,0) + ; Read message type +"RTN","BMXMON",176,0) + N BMXACT,BMXDTIME +"RTN","BMXMON",177,0) + S BMXDTIME=999999 +"RTN","BMXMON",178,0) + R BMXACT#5:BMXDTIME +"RTN","BMXMON",179,0) + Q:BMXACT'="{BMX}" ; Not a BMX message - quit. +"RTN","BMXMON",180,0) + ; Fall through to below... +"RTN","BMXMON",181,0) +GTMLNX ;EP from XWBTCPM for GT.M +"RTN","BMXMON",182,0) + ; not implementing NS and integrated authentication +"RTN","BMXMON",183,0) + ; Vars: Read timeout, msg len, msg, windows auth, Namespace +"RTN","BMXMON",184,0) + N BMXDTIME,BMXLEN,BMXACT,BMXWIN,BMXNS +"RTN","BMXMON",185,0) + S BMXNSJ="",BMXWIN=0 ; No NS on GT.M, no Windows Authentication +"RTN","BMXMON",186,0) + S BMXDTIME(1)=.5,BMXDTIME=999999 +"RTN","BMXMON",187,0) + R BMXACT#5:BMXDTIME ;Read next 5 chars - message length +"RTN","BMXMON",188,0) + S BMXLEN=+BMXACT +"RTN","BMXMON",189,0) + R BMXACT#BMXLEN:BMXDTIME +"RTN","BMXMON",190,0) + I $P(BMXACT,"^")="TCPconnect" G SESSRES +"RTN","BMXMON",191,0) + I $P(BMXACT,"^")="TCPshutdown" W "ack",! Q +"RTN","BMXMON",192,0) + Q ; Should't hit this quit, but just in case +"RTN","BMXMON",193,0) + ; +"RTN","BMXMON",194,0) +SESSION(BMXWIN) ;EP +"RTN","BMXMON",195,0) + ;Start session monitor +"RTN","BMXMON",196,0) + ;BMXWIN = 1: Enable integrated security +"RTN","BMXMON",197,0) +SESSRES ;EP - reentry point from trap +"RTN","BMXMON",198,0) + ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMON",199,0) + N $ESTACK S $ETRAP="D ETRAP^BMXMON" +"RTN","BMXMON",200,0) + S DIQUIET=1,U="^" D DT^DICRW +"RTN","BMXMON",201,0) + D UNREGALL^BMXMEVN ;Unregister all events for this session +"RTN","BMXMON",202,0) + U $P D SESSMAIN +"RTN","BMXMON",203,0) + ;Turn off the error trap for the exit +"RTN","BMXMON",204,0) + S $ETRAP="" +"RTN","BMXMON",205,0) + I $G(DUZ) D LOGOUT^XUSRB +"RTN","BMXMON",206,0) + K BMXR,BMXARY +"RTN","BMXMON",207,0) + C $P ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMON",208,0) + Q +"RTN","BMXMON",209,0) + ; +"RTN","BMXMON",210,0) +SESSMAIN ; +"RTN","BMXMON",211,0) + N BMXTBUF +"RTN","BMXMON",212,0) + D SETUP^BMXMSEC(.RET) ;Setup required system vars +"RTN","BMXMON",213,0) + S U="^" +"RTN","BMXMON",214,0) + U $P +"RTN","BMXMON",215,0) + F D Q:BMXTBUF="#BYE#" +"RTN","BMXMON",216,0) + . R BMXTBUF#11:BMXDTIME IF '$T D TIMEOUT S BMXTBUF="#BYE#" Q +"RTN","BMXMON",217,0) + . I BMXTBUF["XQKEY" S HWMP=1 +"RTN","BMXMON",218,0) + . I BMXTBUF="#BYE#" Q +"RTN","BMXMON",219,0) + . S BMXHTYPE=$S($E(BMXTBUF,1,5)="{BMX}":1,1:0) ;check HDR +"RTN","BMXMON",220,0) + . I 'BMXHTYPE S BMXTBUF="#BYE#" D SNDERR W BMXTBUF,$C(4),! Q +"RTN","BMXMON",221,0) + . S BMXTLEN=$E(BMXTBUF,6,10),L=$E(BMXTBUF,11,11) +"RTN","BMXMON",222,0) + . R BMXTBUF#4:BMXDTIME(1) S BMXTBUF=L_BMXTBUF +"RTN","BMXMON",223,0) + . S BMXPLEN=BMXTBUF +"RTN","BMXMON",224,0) + . R BMXTBUF#BMXPLEN:BMXDTIME(1) +"RTN","BMXMON",225,0) + . I $P(BMXTBUF,U)="TCPconnect" D Q +"RTN","BMXMON",226,0) + . . D SNDERR W "accept",$C(4),! ;Ack +"RTN","BMXMON",227,0) + . IF BMXHTYPE D +"RTN","BMXMON",228,0) + . . K BMXR,BMXARY +"RTN","BMXMON",229,0) + . . IF BMXTBUF="#BYE#" D SNDERR W "#BYE#",$C(4),! Q +"RTN","BMXMON",230,0) + . . S BMXTLEN=BMXTLEN-15 +"RTN","BMXMON",231,0) + . . D CALLP^BMXMBRK(.BMXR,BMXTBUF) +"RTN","BMXMON",232,0) + . . S BMXPTYPE=$S('$D(BMXPTYPE):1,BMXPTYPE<1:1,BMXPTYPE>6:1,1:BMXPTYPE) +"RTN","BMXMON",233,0) + . IF BMXTBUF="#BYE#" Q +"RTN","BMXMON",234,0) + . U $P +"RTN","BMXMON",235,0) + . D SNDERR ;Clears SNDERR parameters +"RTN","BMXMON",236,0) + . D SND +"RTN","BMXMON",237,0) + . D WRITE($C(4)) W ! ;send eot and flush buffer +"RTN","BMXMON",238,0) + D UNREGALL^BMXMEVN ;Unregister all events for this session +"RTN","BMXMON",239,0) + Q ;End Of Main +"RTN","BMXMON",240,0) + ; +"RTN","BMXMON",241,0) +SNDERR ;send error information +"RTN","BMXMON",242,0) + ;BMXSEC is the security packet, BMXERROR is application packet +"RTN","BMXMON",243,0) + N X +"RTN","BMXMON",244,0) + S X=$E($G(BMXSEC),1,255) +"RTN","BMXMON",245,0) + W $C($L(X))_X W ! +"RTN","BMXMON",246,0) + S X=$E($G(BMXERROR),1,255) +"RTN","BMXMON",247,0) + W $C($L(X))_X W ! +"RTN","BMXMON",248,0) + S BMXERROR="",BMXSEC="" ;clears parameters +"RTN","BMXMON",249,0) + Q +"RTN","BMXMON",250,0) + ; +"RTN","BMXMON",251,0) +WRITE(BMXSTR) ;Write a data string +"RTN","BMXMON",252,0) + ; +"RTN","BMXMON",253,0) + I $L(BMXSTR)<511 W ! W BMXSTR Q +"RTN","BMXMON",254,0) + ;Handle a long string +"RTN","BMXMON",255,0) + W ! ;Flush the buffer +"RTN","BMXMON",256,0) + F Q:'$L(BMXSTR) W $E(BMXSTR,1,510),! S BMXSTR=$E(BMXSTR,511,99999) +"RTN","BMXMON",257,0) + Q +"RTN","BMXMON",258,0) +SND ; -- send data for all, Let WRITE sort it out +"RTN","BMXMON",259,0) + N I,T +"RTN","BMXMON",260,0) + ; +"RTN","BMXMON",261,0) + ; -- error or abort occurred, send null +"RTN","BMXMON",262,0) + IF $L(BMXSEC)>0 D WRITE("") Q +"RTN","BMXMON",263,0) + ; -- single value +"RTN","BMXMON",264,0) + IF BMXPTYPE=1 S BMXR=$G(BMXR) D WRITE(BMXR) Q +"RTN","BMXMON",265,0) + ; -- table delimited by CR+LF +"RTN","BMXMON",266,0) + IF BMXPTYPE=2 D Q +"RTN","BMXMON",267,0) + . S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE(BMXR(I)),WRITE($C(13,10)) +"RTN","BMXMON",268,0) + ; -- word processing +"RTN","BMXMON",269,0) + IF BMXPTYPE=3 D Q +"RTN","BMXMON",270,0) + . S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE(BMXR(I)) D:BMXWRAP WRITE($C(13,10)) +"RTN","BMXMON",271,0) + ; -- global array +"RTN","BMXMON",272,0) + IF BMXPTYPE=4 D Q +"RTN","BMXMON",273,0) + . S I=$G(BMXR) Q:I="" S T=$E(I,1,$L(I)-1) D:$D(@I)>10 WRITE(@I) +"RTN","BMXMON",274,0) + . F S I=$Q(@I) Q:I=""!(I'[T) W ! W @I W:BMXWRAP&(@I'=$C(13,10)) $C(13,10) +"RTN","BMXMON",275,0) + . IF $D(@BMXR) K @BMXR +"RTN","BMXMON",276,0) + ; -- global instance +"RTN","BMXMON",277,0) + IF BMXPTYPE=5 S BMXR=$G(@BMXR) D WRITE(BMXR) Q +"RTN","BMXMON",278,0) + ; -- variable length records only good upto 255 char) +"RTN","BMXMON",279,0) + IF BMXPTYPE=6 S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE($C($L(BMXR(I)))),WRITE(BMXR(I)) +"RTN","BMXMON",280,0) + Q +"RTN","BMXMON",281,0) + ; +"RTN","BMXMON",282,0) +TIMEOUT ;Do this on MAIN loop timeout +"RTN","BMXMON",283,0) + I $G(DUZ)>0 D SNDERR,WRITE("#BYE#"_$C(4)) Q +"RTN","BMXMON",284,0) + ;Sign-on timeout +"RTN","BMXMON",285,0) + S BMXR(0)=0,BMXR(1)=1,BMXR(2)="",BMXR(3)="TIME-OUT",BMXPTYPE=2 +"RTN","BMXMON",286,0) + D SNDERR,SND,WRITE($C(4)) +"RTN","BMXMON",287,0) + Q +"RTN","BMXMON",288,0) + ; +"RTN","BMXMON",289,0) +SEMAPHOR(BMXTSKT,BMXACT) ;Lock/Unlock BMXMON semaphore +"RTN","BMXMON",290,0) + N RESULT +"RTN","BMXMON",291,0) + S U="^",RESULT=1 +"RTN","BMXMON",292,0) + D GETENV^%ZOSV ;get Y=UCI^VOL^NODE^BOXLOOKUP of current system +"RTN","BMXMON",293,0) + I BMXACT="LOCK" D +"RTN","BMXMON",294,0) + . L +^BMXMON("BMXMON",$P(Y,U,2),$P(Y,U),$P(Y,U,4),BMXTSKT):1 +"RTN","BMXMON",295,0) + . S RESULT=$T +"RTN","BMXMON",296,0) + E L -^BMXMON("BMXMON",$P(Y,U,2),$P(Y,U),$P(Y,U,4),BMXTSKT) +"RTN","BMXMON",297,0) + Q RESULT +"RTN","BMXMON",298,0) + ; +"RTN","BMXMON",299,0) +CHPRN(N) ;Change process name to N. +"RTN","BMXMON",300,0) + D SETNM^%ZOSV($E(N,1,15)) +"RTN","BMXMON",301,0) + Q +"RTN","BMXMON",302,0) + ; +"RTN","BMXMON",303,0) +MARKER(BMXPORT,BMXMODE) ;Set/Test/Clear Problem Marker, BMXMODE=0 is a function +"RTN","BMXMON",304,0) + N IP,Y,%,REF X ^%ZOSF("UCI") S REF=Y,IP="0.0.0.0",%=0 +"RTN","BMXMON",305,0) + L +^BMX(IP,REF,BMXPORT,"PROBLEM MARKER"):1 +"RTN","BMXMON",306,0) + I BMXMODE=1 S ^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")=1 +"RTN","BMXMON",307,0) + I BMXMODE=0 S:$D(^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")) %=1 +"RTN","BMXMON",308,0) + I BMXMODE=-1 K ^BMX(IP,REF,BMXPORT,"PROBLEM MARKER") +"RTN","BMXMON",309,0) + L -^BMX(IP,REF,BMXPORT,"PROBLEM MARKER") +"RTN","BMXMON",310,0) + Q:BMXMODE=0 % Q +"RTN","BMXMON",311,0) + ; +"RTN","BMXMON",312,0) +ETRAP ; -- on trapped error, send error info to client +"RTN","BMXMON",313,0) + N BMXERC,BMXERR,BMXLGR +"RTN","BMXMON",314,0) + ;Change trapping during trap. +"RTN","BMXMON",315,0) + S $ETRAP="D ^%ZTER HALT" +"RTN","BMXMON",316,0) + S BMXERC=$$EC^%ZOSV +"RTN","BMXMON",317,0) + S BMXERR="M ERROR="_BMXERC_$C(13,10)_"LAST REF=" +"RTN","BMXMON",318,0) + S BMXLGR=$$LGR^%ZOSV_$C(4) +"RTN","BMXMON",319,0) + S BMXERR=BMXERR_BMXLGR +"RTN","BMXMON",320,0) + D ^%ZTER ;%ZTER clears $ZE and $ECODE +"RTN","BMXMON",321,0) + I (BMXERC["READ")!(BMXERC["WRITE")!(BMXERC["SYSTEM-F") D:$G(DUZ) LOGOUT^XUSRB HALT +"RTN","BMXMON",322,0) + U $P +"RTN","BMXMON",323,0) + D SNDERR,WRITE(BMXERR) W ! +"RTN","BMXMON",324,0) + S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" G SESSRES^BMXMON",$ECODE=",U99," +"RTN","BMXMON",325,0) + Q +"RTN","BMXMON",326,0) + ; +"RTN","BMXMON",327,0) +MENU ;EP - ENTRY ACTION FROM BMXMENU OPTION +"RTN","BMXMON",328,0) + ; +"RTN","BMXMON",329,0) + N BMX,BMXVER +"RTN","BMXMON",330,0) + ;VERSION +"RTN","BMXMON",331,0) + D +"RTN","BMXMON",332,0) + . S BMXN="BMXNET ADO.NET DATA PROVIDER" I $D(^DIC(9.4,"B",BMXN)) Q +"RTN","BMXMON",333,0) + . S BMXN="BMXNET RPMS .NET UTILITIES" I $D(^DIC(9.4,"B",BMXN)) Q +"RTN","BMXMON",334,0) + . S BMXN="" +"RTN","BMXMON",335,0) + . Q +"RTN","BMXMON",336,0) + ; +"RTN","BMXMON",337,0) + S BMXVER="" +"RTN","BMXMON",338,0) + I BMXN]"",$D(^DIC(9.4,"B",BMXN)) D +"RTN","BMXMON",339,0) + . S BMX=$O(^DIC(9.4,"B",BMXN,0)) +"RTN","BMXMON",340,0) + . I $D(^DIC(9.4,BMX,"VERSION")) S BMXVER=$P(^DIC(9.4,BMX,"VERSION"),"^") +"RTN","BMXMON",341,0) + . E S BMXVER="VERSION NOT FOUND" +"RTN","BMXMON",342,0) + S:BMXVER="" BMXVER="VERSION NOT FOUND" +"RTN","BMXMON",343,0) + ; +"RTN","BMXMON",344,0) + ;LOCATION +"RTN","BMXMON",345,0) + N BMXLOC +"RTN","BMXMON",346,0) + S BMXLOC="" +"RTN","BMXMON",347,0) + I $G(DUZ(2)),$D(^DIC(4,DUZ(2),0)) S BMXLOC=$P(^DIC(4,DUZ(2),0),"^") +"RTN","BMXMON",348,0) + S:BMXLOC="" BMXLOC="LOCATION NOT FOUND" +"RTN","BMXMON",349,0) + ; +"RTN","BMXMON",350,0) + ;WRITE +"RTN","BMXMON",351,0) + W ! +"RTN","BMXMON",352,0) + W !,"BMXNet Version: ",BMXVER +"RTN","BMXMON",353,0) + W !,"Location: ",BMXLOC +"RTN","BMXMON",354,0) + Q +"RTN","BMXMSEC") +0^85^B8709977 +"RTN","BMXMSEC",1,0) +BMXMSEC ; IHS/OIT/HMW - BMXNet MONITOR ; 7/20/2009 +"RTN","BMXMSEC",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXMSEC",3,0) + ; Edit History +"RTN","BMXMSEC",4,0) + ; Line SETUP+2 has been changed to support GT.M //SMH 7/5/09 +"RTN","BMXMSEC",5,0) + ; Per Wally Fort's GT.M code in XWBTCPM, IP for GT.M is stored +"RTN","BMXMSEC",6,0) + ; in IP("GTM-IP"). Changes in BMXMON and here follow that model. +"RTN","BMXMSEC",7,0) + ; +"RTN","BMXMSEC",8,0) +CHKPRMIT(BMXRP) ;EP - checks to see if remote procedure is permited to run +"RTN","BMXMSEC",9,0) + ;Input: BMXRP - Remote procedure to check +"RTN","BMXMSEC",10,0) + Q:$$KCHK("XUPROGMODE") +"RTN","BMXMSEC",11,0) + N ERR,BMXALLOW +"RTN","BMXMSEC",12,0) + S U="^",BMXSEC="" ;clear +"RTN","BMXMSEC",13,0) + ; +"RTN","BMXMSEC",14,0) + ;In the beginning, when no DUZ is defined and no context exist, setup +"RTN","BMXMSEC",15,0) + ;default signon context +"RTN","BMXMSEC",16,0) + S:'$G(DUZ) DUZ=0,XQY0="XUS SIGNON" ;set up default context +"RTN","BMXMSEC",17,0) + ; +"RTN","BMXMSEC",18,0) + I BMXRP'="XWB IM HERE",BMXRP'="XWB CREATE CONTEXT",BMXRP'="XWB RPC LIST",BMXRP'="BMX AV CODE" D ;check exemptions. new exemption for XWB*1.1*6 - dpc +"RTN","BMXMSEC",19,0) + . I $G(XQY0)'="" D +"RTN","BMXMSEC",20,0) + . . S BMXALLOW=$$CHK^XQCS(DUZ,$P(XQY0,U),BMXRP) ;do the check +"RTN","BMXMSEC",21,0) + . . S:'BMXALLOW BMXSEC=BMXALLOW +"RTN","BMXMSEC",22,0) + . E S BMXSEC="Application context has not been created!" +"RTN","BMXMSEC",23,0) + Q +"RTN","BMXMSEC",24,0) + ; +"RTN","BMXMSEC",25,0) +OWNSKEY(RET,LIST) ;EP Does user have Key +"RTN","BMXMSEC",26,0) + N I,K S I="" +"RTN","BMXMSEC",27,0) + I $G(DUZ)'>0 S RET(0)=0 Q +"RTN","BMXMSEC",28,0) + I $O(LIST(""))="" S RET(0)=$$KCHK(LIST) Q +"RTN","BMXMSEC",29,0) + F S I=$O(LIST(I)) Q:I="" S RET(I)=$$KCHK(LIST(I)) +"RTN","BMXMSEC",30,0) + Q +"RTN","BMXMSEC",31,0) +KCHK(%) Q $S($G(DUZ)>0:$D(^XUSEC(%,DUZ)),1:0) ;EP Key Check +"RTN","BMXMSEC",32,0) + ; +"RTN","BMXMSEC",33,0) + ; +"RTN","BMXMSEC",34,0) +SETUP(RET) ;EP - sets up environment for GUI signon +"RTN","BMXMSEC",35,0) + ; +"RTN","BMXMSEC",36,0) + K ^TMP("XQCS",$J) +"RTN","BMXMSEC",37,0) + ; S IO("IP")=$P D ZIO^%ZIS4 ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMSEC",38,0) + ; --> Begin new code +"RTN","BMXMSEC",39,0) + I $$OS^XWBTCPM="GT.M" S IO("IP")=IO("GTM-IP") +"RTN","BMXMSEC",40,0) + I $$OS^XWBTCPM="OpenM" S IO("IP")=$P +"RTN","BMXMSEC",41,0) + D ZIO^%ZIS4 +"RTN","BMXMSEC",42,0) + ; <-- End new code //SMH +"RTN","BMXMSEC",43,0) + D SET1(0),SET^BMXMSEC("XUS XOPT",XOPT),SET^BMXMSEC("XUS CNT",0) +"RTN","BMXMSEC",44,0) + S %ZIS="0H",IOP="NULL" D ^%ZIS +"RTN","BMXMSEC",45,0) + ;0=server name, 1=volume, 2=uci, 3=device, 4=# attempts, 5=skip signon-screen +"RTN","BMXMSEC",46,0) + S RET(0)=$P(XUENV,U,3),RET(1)=$P(XUVOL,U),RET(2)=XUCI +"RTN","BMXMSEC",47,0) + S RET(3)=$I,RET(4)=$P(XOPT,U,2),RET(5)=0 ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXMSEC",48,0) + I $$INHIBIT() Q +"RTN","BMXMSEC",49,0) + Q +"RTN","BMXMSEC",50,0) + ; +"RTN","BMXMSEC",51,0) +SET1(FLAG) ;Setup parameters +"RTN","BMXMSEC",52,0) + D GETENV^%ZOSV S U="^",XUENV=Y,XUCI=$P(Y,U,1),XQVOL=$P(Y,U,2),XUEON=^%ZOSF("EON"),XUEOFF=^("EOFF") +"RTN","BMXMSEC",53,0) + S X=$O(^XTV(8989.3,1,4,"B",XQVOL,0)),XUVOL=$S(X>0:^XTV(8989.3,1,4,X,0),1:XQVOL_"^y^1") S:$P(XUVOL,U,6)="y" XRTL=XUCI_","_XQVOL +"RTN","BMXMSEC",54,0) + S XOPT=$S($D(^XTV(8989.3,1,"XUS")):^("XUS"),1:"") F I=2:1:15 I $P(XOPT,U,I)="" S $P(XOPT,U,I)=$P("^5^900^1^1^^^^1^300^^^^N^90",U,I) +"RTN","BMXMSEC",55,0) + Q +"RTN","BMXMSEC",56,0) + ; +"RTN","BMXMSEC",57,0) +INHIBIT() ;Is Logon to this system Inhibited? +"RTN","BMXMSEC",58,0) + I $G(^%ZIS(14.5,"LOGON",XQVOL)) Q 1 +"RTN","BMXMSEC",59,0) + I $D(^%ZOSF("ACTJ")) X ^("ACTJ") I $P(XUVOL,U,3),($P(XUVOL,U,3)'>Y) Q 2 +"RTN","BMXMSEC",60,0) + Q 0 +"RTN","BMXMSEC",61,0) + ; +"RTN","BMXMSEC",62,0) +NOW S U="^",XUNOW=$$NOW^XLFDT(),DT=$P(XUNOW,"."),XUDEV=0 +"RTN","BMXMSEC",63,0) + Q +"RTN","BMXMSEC",64,0) + ; +"RTN","BMXMSEC",65,0) +STATE(%) ;Return a state value +"RTN","BMXMSEC",66,0) + ;XWBSTATE is required by XUSRB +"RTN","BMXMSEC",67,0) + Q:'$L($G(%)) $G(XWBSTATE) +"RTN","BMXMSEC",68,0) + Q $G(XWBSTATE(%)) +"RTN","BMXMSEC",69,0) + ; +"RTN","BMXMSEC",70,0) + ; +"RTN","BMXMSEC",71,0) +SET(%,VALUE) ;Set the state variable +"RTN","BMXMSEC",72,0) + I $G(%)="" S XWBSTATE=VALUE +"RTN","BMXMSEC",73,0) + S XWBSTATE(%)=VALUE +"RTN","BMXMSEC",74,0) + Q +"RTN","BMXMSEC",75,0) +KILL(%) ;Kill state variable +"RTN","BMXMSEC",76,0) + I $L($G(%)) K XWBSTATE(%) +"RTN","BMXMSEC",77,0) + Q +"RTN","BMXNTEG") +0^115^B7300059 +"RTN","BMXNTEG",1,0) +BMXNTEG ;INTEGRITY CHECKER;FEB 26, 2007 +"RTN","BMXNTEG",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXNTEG",3,0) + ; +"RTN","BMXNTEG",4,0) +START ; +"RTN","BMXNTEG",5,0) + NEW BYTE,COUNT,RTN +"RTN","BMXNTEG",6,0) + K ^UTILITY($J) +"RTN","BMXNTEG",7,0) + F I=1:1 S X=$T(LIST+I) Q:X="" S X=$P(X,";;",2),R=$P(X,"^",1),B=$P(X,"^",2),C=$P(X,"^",3),^UTILITY($J,R)=B_"^"_C +"RTN","BMXNTEG",8,0) + F I=1:1:6 S X=$P($T(@("LINE"_I)),";;",2,99),@("XBSUMBLD("_I_")=X") +"RTN","BMXNTEG",9,0) + X XBSUMBLD(1) +"RTN","BMXNTEG",10,0) + Q +"RTN","BMXNTEG",11,0) + ; +"RTN","BMXNTEG",12,0) +LINE1 ;;X XBSUMBLD(2),XBSUMBLD(6) +"RTN","BMXNTEG",13,0) +LINE2 ;;S RTN=0 F S RTN=$O(^UTILITY($J,RTN)) Q:RTN="" W !,RTN ZL @RTN S (BYTE,COUNT)=0 S X=$T(+1),X=$P(X," [ ",1) X XBSUMBLD(4),XBSUMBLD(3),XBSUMBLD(5) +"RTN","BMXNTEG",14,0) +LINE3 ;;F I=2:1 S X=$T(+I) Q:X="" X XBSUMBLD(4) +"RTN","BMXNTEG",15,0) +LINE4 ;;F J=1:1 S Y=$E(X,J) Q:Y="" S BYTE=BYTE+1,COUNT=COUNT+$A(Y) +"RTN","BMXNTEG",16,0) +LINE5 ;;S B=$P(^UTILITY($J,RTN),"^",1),C=$P(^(RTN),"^",2) I B'=BYTE!(C'=COUNT) W " has been modified" +"RTN","BMXNTEG",17,0) +LINE6 ;;K XBSUMBLD,B,C,I,J,R,X,Y +"RTN","BMXNTEG",18,0) + ; +"RTN","BMXNTEG",19,0) +LIST ; +"RTN","BMXNTEG",20,0) + ;;BMXADE1^3028^202865 +"RTN","BMXNTEG",21,0) + ;;BMXADE2^3250^215372 +"RTN","BMXNTEG",22,0) + ;;BMXADO^6547^418026 +"RTN","BMXNTEG",23,0) + ;;BMXADO2^3489^255546 +"RTN","BMXNTEG",24,0) + ;;BMXADOF^11562^731974 +"RTN","BMXNTEG",25,0) + ;;BMXADOF1^3281^207224 +"RTN","BMXNTEG",26,0) + ;;BMXADOF2^2138^139496 +"RTN","BMXNTEG",27,0) + ;;BMXADOFD^2831^178610 +"RTN","BMXNTEG",28,0) + ;;BMXADOFS^6515^393782 +"RTN","BMXNTEG",29,0) + ;;BMXADOI^2215^134605 +"RTN","BMXNTEG",30,0) + ;;BMXADOS^9145^575000 +"RTN","BMXNTEG",31,0) + ;;BMXADOS1^2590^161592 +"RTN","BMXNTEG",32,0) + ;;BMXADOV^5739^373823 +"RTN","BMXNTEG",33,0) + ;;BMXADOV1^9072^554887 +"RTN","BMXNTEG",34,0) + ;;BMXADOV2^4690^289898 +"RTN","BMXNTEG",35,0) + ;;BMXADOVJ^3530^225534 +"RTN","BMXNTEG",36,0) + ;;BMXADOX^13904^870277 +"RTN","BMXNTEG",37,0) + ;;BMXADOX1^11753^751110 +"RTN","BMXNTEG",38,0) + ;;BMXADOX2^3126^199406 +"RTN","BMXNTEG",39,0) + ;;BMXADOXX^12226^762799 +"RTN","BMXNTEG",40,0) + ;;BMXADOXY^11992^769511 +"RTN","BMXNTEG",41,0) + ;;BMXE01^2111^148783 +"RTN","BMXNTEG",42,0) + ;;BMXFIND^7919^562996 +"RTN","BMXNTEG",43,0) + ;;BMXG^1970^120467 +"RTN","BMXNTEG",44,0) + ;;BMXGETS^4309^308726 +"RTN","BMXNTEG",45,0) + ;;BMXMBRK^5919^389568 +"RTN","BMXNTEG",46,0) + ;;BMXMBRK2^3621^233089 +"RTN","BMXNTEG",47,0) + ;;BMXMEVN^6627^468908 +"RTN","BMXNTEG",48,0) + ;;BMXMON^9356^664477 +"RTN","BMXNTEG",49,0) + ;;BMXMSEC^2302^160584 +"RTN","BMXNTEG",50,0) + ;;BMXNTEG^2045^127438 +"RTN","BMXNTEG",51,0) + ;;BMXPO^1522^101987 +"RTN","BMXNTEG",52,0) + ;;BMXPRS^2153^134429 +"RTN","BMXNTEG",53,0) + ;;BMXRPC^5716^425699 +"RTN","BMXNTEG",54,0) + ;;BMXRPC1^7622^559198 +"RTN","BMXNTEG",55,0) + ;;BMXRPC2^3531^243875 +"RTN","BMXNTEG",56,0) + ;;BMXRPC3^6466^450166 +"RTN","BMXNTEG",57,0) + ;;BMXRPC4^4967^312485 +"RTN","BMXNTEG",58,0) + ;;BMXRPC5^3896^288926 +"RTN","BMXNTEG",59,0) + ;;BMXRPC6^3757^270667 +"RTN","BMXNTEG",60,0) + ;;BMXRPC7^5687^404431 +"RTN","BMXNTEG",61,0) + ;;BMXRPC8^2236^165523 +"RTN","BMXNTEG",62,0) + ;;BMXRPC9^6408^421855 +"RTN","BMXNTEG",63,0) + ;;BMXSQL^10869^727499 +"RTN","BMXNTEG",64,0) + ;;BMXSQL1^9921^616204 +"RTN","BMXNTEG",65,0) + ;;BMXSQL2^2748^183754 +"RTN","BMXNTEG",66,0) + ;;BMXSQL3^13516^868578 +"RTN","BMXNTEG",67,0) + ;;BMXSQL4^1313^88477 +"RTN","BMXNTEG",68,0) + ;;BMXSQL5^6648^433290 +"RTN","BMXNTEG",69,0) + ;;BMXSQL6^10606^683062 +"RTN","BMXNTEG",70,0) + ;;BMXSQL7^8102^528283 +"RTN","BMXNTEG",71,0) + ;;BMXSQL91^4328^281351 +"RTN","BMXNTEG",72,0) + ;;BMXTABLE^159^9961 +"RTN","BMXNTEG",73,0) + ;;BMXTRS^1300^81264 +"RTN","BMXNTEG",74,0) + ;;BMXUTL1^7818^520369 +"RTN","BMXNTEG",75,0) + ;;BMXUTL2^900^60457 +"RTN","BMXNTEG",76,0) + ;;BMXUTL5^5330^358866 +"RTN","BMXNTEG",77,0) + ;;BMXUTL6^942^62126 +"RTN","BMXNTEG",78,0) + ;;BMXUTL7^163^10646 +"RTN","BMXPO") +0^116^B4666839 +"RTN","BMXPO",1,0) +BMXPO ; IHS/CMI/MAW - Populate appcontext with all namespaced RPC's ; +"RTN","BMXPO",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXPO",3,0) + ; +"RTN","BMXPO",4,0) + ; +"RTN","BMXPO",5,0) +MAIN ;EP - this is the main routine driver +"RTN","BMXPO",6,0) + N BMXQFLG +"RTN","BMXPO",7,0) + D ASK +"RTN","BMXPO",8,0) + I $G(BMXQFLG) D XIT Q +"RTN","BMXPO",9,0) + ;D CLEAN(BMXAPP) +"RTN","BMXPO",10,0) + D POP(BMXAPP,BMXNS) +"RTN","BMXPO",11,0) + D XIT +"RTN","BMXPO",12,0) + Q +"RTN","BMXPO",13,0) + ; +"RTN","BMXPO",14,0) +GUIEP(RETVAL,BMXSTR) ;EP - gui entry point +"RTN","BMXPO",15,0) + N P,BMXAPP,BMXNS +"RTN","BMXPO",16,0) + S P="|" +"RTN","BMXPO",17,0) + S BMXGUI=1 +"RTN","BMXPO",18,0) + S BMXAPP=$P(BMXSTR,P) +"RTN","BMXPO",19,0) + S BMXNS=$P(BMXSTR,P,2) +"RTN","BMXPO",20,0) + K ^BMXTMP($J) +"RTN","BMXPO",21,0) + S RETVAL="^BMXTMP("_$J_")" +"RTN","BMXPO",22,0) + S ^BMXTMP($J,0)="T00250DATA"_$C(30) +"RTN","BMXPO",23,0) + ;D CLEAN(BMXAPP) +"RTN","BMXPO",24,0) + D POP(BMXAPP,BMXNS) +"RTN","BMXPO",25,0) + D XIT +"RTN","BMXPO",26,0) + Q +"RTN","BMXPO",27,0) + ; +"RTN","BMXPO",28,0) +ASK ;-- ask the name of the OPTION to populate +"RTN","BMXPO",29,0) + W ! +"RTN","BMXPO",30,0) + S DIC=19,DIC(0)="AEMQZ",DIC("A")="Populate which Application Context: " +"RTN","BMXPO",31,0) + D ^DIC +"RTN","BMXPO",32,0) + I '$G(Y) S BMXQFLG=1 Q +"RTN","BMXPO",33,0) + S BMXAPP=+Y +"RTN","BMXPO",34,0) + W ! +"RTN","BMXPO",35,0) + K DIC +"RTN","BMXPO",36,0) + S DIR(0)="F^1:3",DIR("A")="Populate RPC's from which Namespace: " +"RTN","BMXPO",37,0) + D ^DIR +"RTN","BMXPO",38,0) + I $D(DIRUT) S BMXQFLG=1 Q +"RTN","BMXPO",39,0) + S BMXNS=$G(Y) +"RTN","BMXPO",40,0) + Q +"RTN","BMXPO",41,0) + ; +"RTN","BMXPO",42,0) +CLEAN(APP) ;-- clean out the RPC multiple first +"RTN","BMXPO",43,0) + S DA(1)=APP +"RTN","BMXPO",44,0) + S DIK="^DIC(19,"_DA(1)_","_"""RPC"""_"," +"RTN","BMXPO",45,0) + N BMXDA +"RTN","BMXPO",46,0) + S BMXDA=0 F S BDMDA=$O(^DIC(19,APP,"RPC",BMXDA)) Q:'BMXDA D +"RTN","BMXPO",47,0) + . S DA=BMXDA +"RTN","BMXPO",48,0) + . D ^DIK +"RTN","BMXPO",49,0) + K ^DIC(19,APP,"RPC","B") +"RTN","BMXPO",50,0) + Q +"RTN","BMXPO",51,0) + ; +"RTN","BMXPO",52,0) +POP(APP,NS) ;populate the app context with RPC's +"RTN","BMXPO",53,0) + I '$G(BMXGUI) W !,"Populating Application Context" +"RTN","BMXPO",54,0) + N BMXDA +"RTN","BMXPO",55,0) + S BMXDA=NS +"RTN","BMXPO",56,0) + F S BMXDA=$O(^XWB(8994,"B",BMXDA)) Q:BMXDA=""!($E(BMXDA,1,3)'=NS) D +"RTN","BMXPO",57,0) + . N BMXIEN +"RTN","BMXPO",58,0) + . S BMXIEN=0 F S BMXIEN=$O(^XWB(8994,"B",BMXDA,BMXIEN)) Q:'BMXIEN D +"RTN","BMXPO",59,0) + .. Q:$O(^DIC(19,APP,"RPC","B",BMXIEN,0)) +"RTN","BMXPO",60,0) + .. N BDMIENS,BDMFDA,BDMERR +"RTN","BMXPO",61,0) + .. S BDMIENS(1)=APP +"RTN","BMXPO",62,0) + .. S BDMIENS="+2,"_APP_"," +"RTN","BMXPO",63,0) + .. S BDMFDA(19.05,BDMIENS,.01)=BMXIEN +"RTN","BMXPO",64,0) + .. D UPDATE^DIE("","BDMFDA","BDMIENS","BDMERR(1)") +"RTN","BMXPO",65,0) + .. I '$G(BMXGUI) W "." +"RTN","BMXPO",66,0) + Q +"RTN","BMXPO",67,0) + ; +"RTN","BMXPO",68,0) +XIT ;-- clean vars +"RTN","BMXPO",69,0) + D EN^XBVK("BMX") +"RTN","BMXPO",70,0) + Q +"RTN","BMXPO",71,0) + ; +"RTN","BMXPRS") +0^86^B8898368 +"RTN","BMXPRS",1,0) +BMXPRS ; IHS/OIT/HMW - BMX WINDOWS UTILS ; +"RTN","BMXPRS",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXPRS",3,0) + ; +"RTN","BMXPRS",4,0) + ; +"RTN","BMXPRS",5,0) +PARSE(X) ;EP-Parse SQL Statement into array +"RTN","BMXPRS",6,0) + ;Input SQL statement as X +"RTN","BMXPRS",7,0) + ;Returns BMXTK() array +"RTN","BMXPRS",8,0) + ;Errors returned in BMXERR +"RTN","BMXPRS",9,0) + ; +"RTN","BMXPRS",10,0) + D PRE +"RTN","BMXPRS",11,0) + Q:$D(BMXERR) +"RTN","BMXPRS",12,0) + D POST +"RTN","BMXPRS",13,0) + Q +"RTN","BMXPRS",14,0) + ; +"RTN","BMXPRS",15,0) +POST2 ;EP - Remove commas from BMXTK +"RTN","BMXPRS",16,0) + N J,K +"RTN","BMXPRS",17,0) + S J=0 F S J=$O(BMXTK(J)) Q:'+J D +"RTN","BMXPRS",18,0) + . S K=$O(BMXTK(J)) +"RTN","BMXPRS",19,0) + . I +K,","=$G(BMXTK(K)) D +"RTN","BMXPRS",20,0) + . . K BMXTK(K) +"RTN","BMXPRS",21,0) + . . D PACK(J) +"RTN","BMXPRS",22,0) + . . Q +"RTN","BMXPRS",23,0) + . Q +"RTN","BMXPRS",24,0) + Q +"RTN","BMXPRS",25,0) + ; +"RTN","BMXPRS",26,0) +POST ; +"RTN","BMXPRS",27,0) + ;Combine multi-character operators +"RTN","BMXPRS",28,0) + N J +"RTN","BMXPRS",29,0) + S J=0 F S J=$O(BMXTK(J)) Q:'+J D +"RTN","BMXPRS",30,0) + . I ">"=BMXTK(J) D Q +"RTN","BMXPRS",31,0) + . . I "="[$G(BMXTK(J+1)) D Q +"RTN","BMXPRS",32,0) + . . . S BMXTK(J)=BMXTK(J)_"=" +"RTN","BMXPRS",33,0) + . . . K BMXTK(J+1) +"RTN","BMXPRS",34,0) + . . . D PACK(J) +"RTN","BMXPRS",35,0) + . . I "<"[$G(BMXTK(J+1)) D Q +"RTN","BMXPRS",36,0) + . . . S BMXTK(J)="<"_BMXTK(J) +"RTN","BMXPRS",37,0) + . . . K BMXTK(J+1) +"RTN","BMXPRS",38,0) + . . . D PACK(J) +"RTN","BMXPRS",39,0) + . I "<"=BMXTK(J) D Q +"RTN","BMXPRS",40,0) + . . I "=>"[$G(BMXTK(J+1)) D +"RTN","BMXPRS",41,0) + . . . S BMXTK(J)=BMXTK(J)_BMXTK(J+1) +"RTN","BMXPRS",42,0) + . . . K BMXTK(J+1) +"RTN","BMXPRS",43,0) + . . . D PACK(J) +"RTN","BMXPRS",44,0) + . I "="=BMXTK(J) D Q +"RTN","BMXPRS",45,0) + . . I "<>"[$G(BMXTK(J+1)) D +"RTN","BMXPRS",46,0) + . . . S BMXTK(J)=BMXTK(J+1)_BMXTK(J) +"RTN","BMXPRS",47,0) + . . . K BMXTK(J+1) +"RTN","BMXPRS",48,0) + . . . D PACK(J) +"RTN","BMXPRS",49,0) + Q +"RTN","BMXPRS",50,0) + ; +"RTN","BMXPRS",51,0) +PACK(J) ; +"RTN","BMXPRS",52,0) + F S J=$O(BMXTK(J)) Q:'+J D +"RTN","BMXPRS",53,0) + . S BMXTK(J-1)=BMXTK(J) +"RTN","BMXPRS",54,0) + . K BMXTK(J) +"RTN","BMXPRS",55,0) + Q +"RTN","BMXPRS",56,0) + ; +"RTN","BMXPRS",57,0) +PRE N P,T,Q,Q1,A,B S (P,T,Q)=0,BMXTK="",A=0 +"RTN","BMXPRS",58,0) +START S A=A+1 +"RTN","BMXPRS",59,0) + S B=$E(X,A) +"RTN","BMXPRS",60,0) + I B="" G B5 +"RTN","BMXPRS",61,0) + I 'Q G QUOTE +"RTN","BMXPRS",62,0) + I B=$C(39) G QUOTE +"RTN","BMXPRS",63,0) + S BMXTK=BMXTK_B G START +"RTN","BMXPRS",64,0) +QUOTE I B'=$C(39) G SPACE +"RTN","BMXPRS",65,0) + I Q G QUOTE2 +"RTN","BMXPRS",66,0) + ;S Q=1,BMXTK=B G START +"RTN","BMXPRS",67,0) + S Q=1,BMXTK=BMXTK_B G START +"RTN","BMXPRS",68,0) +QUOTE2 S Q1=B,A=A+1,B=$E(X,A) +"RTN","BMXPRS",69,0) + I B']"" G QUOTE3 +"RTN","BMXPRS",70,0) + I B'=$C(39) G QUOTE3 +"RTN","BMXPRS",71,0) + S BMXTK=BMXTK_Q1_B G START +"RTN","BMXPRS",72,0) +QUOTE3 S A=A-1,B=Q1,BMXTK=BMXTK_B,Q=0 G START +"RTN","BMXPRS",73,0) +SPACE I B'=" " G OP +"RTN","BMXPRS",74,0) + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" +"RTN","BMXPRS",75,0) + G START +"RTN","BMXPRS",76,0) +OP I "=><"'[B G OPAREN +"RTN","BMXPRS",77,0) + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" +"RTN","BMXPRS",78,0) + S T=T+1,BMXTK(T)=B,BMXTK="" +"RTN","BMXPRS",79,0) + G START +"RTN","BMXPRS",80,0) +OPAREN I B'="(" G CPAREN +"RTN","BMXPRS",81,0) + S P=P+1 +"RTN","BMXPRS",82,0) + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" +"RTN","BMXPRS",83,0) + S T=T+1,BMXTK(T)=B G START +"RTN","BMXPRS",84,0) +CPAREN I B'=")" G B2 +"RTN","BMXPRS",85,0) + I P G B1 +"RTN","BMXPRS",86,0) + G B0 +"RTN","BMXPRS",87,0) + ; +"RTN","BMXPRS",88,0) +B0 S BMXERR="SQL SYNTAX ERROR" D ERROR G B5 +"RTN","BMXPRS",89,0) +B1 S P=P-1 +"RTN","BMXPRS",90,0) + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" +"RTN","BMXPRS",91,0) + S T=T+1,BMXTK(T)=B G START +"RTN","BMXPRS",92,0) +B2 I B'="," G B3 +"RTN","BMXPRS",93,0) + S T=T+1,BMXTK(T)=BMXTK,T=T+1,BMXTK(T)=",",BMXTK="" G START +"RTN","BMXPRS",94,0) +B3 S BMXTK=BMXTK_B +"RTN","BMXPRS",95,0) +B4 G START +"RTN","BMXPRS",96,0) +B5 I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK +"RTN","BMXPRS",97,0) + I $D(BMXERR) G B6 +"RTN","BMXPRS",98,0) + I P S BMXERR="SQL SYNTAX ERROR: MATCHING PARENTHESIS NOT FOUND" D ERROR +"RTN","BMXPRS",99,0) + E I Q S BMXERR="SQL SYNTAX ERROR: MATCHING QUOTE NOT FOUND" D ERROR +"RTN","BMXPRS",100,0) + I P>0 G START +"RTN","BMXPRS",101,0) +B6 Q +"RTN","BMXPRS",102,0) + ; +"RTN","BMXPRS",103,0) +ERROR ;W !,"ERROR=",BMXERR,! Q +"RTN","BMXPRS",104,0) + Q +"RTN","BMXRPC") +0^87^B17117580 +"RTN","BMXRPC",1,0) +BMXRPC ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC",3,0) + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * +"RTN","BMXRPC",4,0) + ;; GENERIC LOOKUP UTILITY FOR RETURNING MATCHING RECORDS +"RTN","BMXRPC",5,0) + ;; OR TABLES TO RPC'S. +"RTN","BMXRPC",6,0) + ; +"RTN","BMXRPC",7,0) + ; *** NOTE: I have discovered a number of cases where these calls +"RTN","BMXRPC",8,0) + ; produce errors (with error messages to IO) or simply +"RTN","BMXRPC",9,0) + ; do not work correctly. ANY CALL to this utility +"RTN","BMXRPC",10,0) + ; should be thoroughly tested in the M environment +"RTN","BMXRPC",11,0) + ; before being used as an RPC. +"RTN","BMXRPC",12,0) + ; +"RTN","BMXRPC",13,0) + ;---------- +"RTN","BMXRPC",14,0) +LOOKUP(BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC) ;EP +"RTN","BMXRPC",15,0) + ;---> Places matching records from requested file into a +"RTN","BMXRPC",16,0) + ;---> result global, ^BMXTEMP($J). The exact global name +"RTN","BMXRPC",17,0) + ;---> is returned in the first parameter (BMXGBL). +"RTN","BMXRPC",18,0) + ;---> Records are returned one per node in the result global. +"RTN","BMXRPC",19,0) + ;---> Each record is terminated with a $C(30), for parsing out +"RTN","BMXRPC",20,0) + ;---> on the VB side, since the Broker concatenates all nodes +"RTN","BMXRPC",21,0) + ;---> into a single string when passing the data out of M. +"RTN","BMXRPC",22,0) + ;---> Requested fields within records are delimited by "^". +"RTN","BMXRPC",23,0) + ;---> NOTE: The first "^"-piece of every node is the IEN of +"RTN","BMXRPC",24,0) + ;---> that entry in its file; the requested fields follow. +"RTN","BMXRPC",25,0) + ;---> The final record (node) contains Error Delimiter, +"RTN","BMXRPC",26,0) + ; $C(31)_$C(31), followed by error text, if any. +"RTN","BMXRPC",27,0) + ; +"RTN","BMXRPC",28,0) + ;---> Parameters: +"RTN","BMXRPC",29,0) + ; 1 - BMXGBL (ret) Name of result global for Broker. +"RTN","BMXRPC",30,0) + ; 2 - BMXFL (req) File for lookup. +"RTN","BMXRPC",31,0) + ; 3 - BMXFLDS (opt) Fields to return w/each entry. +"RTN","BMXRPC",32,0) + ; 4 - BMXFLG (opt) Flags in DIC(0); If null, "M" is sent. +"RTN","BMXRPC",33,0) + ; 5 - BMXIN (opt) Input to match on (see Algorithm below). +"RTN","BMXRPC",34,0) + ; 6 - BMXMX (opt) Maximum number of entries to return. +"RTN","BMXRPC",35,0) + ; 7 - BMXIX (opt) Indexes to search. +"RTN","BMXRPC",36,0) + ; 8 - BMXSCR (opt) Screen/filter (M code). +"RTN","BMXRPC",37,0) + ; 9 - BMXMC (opt) Mixed Case: 1=mixed case, 0=no change. +"RTN","BMXRPC",38,0) + ; (Converts data in uppercase to mixed case.) +"RTN","BMXRPC",39,0) + ; +"RTN","BMXRPC",40,0) + ;---> Set variables, kill temp globals. +"RTN","BMXRPC",41,0) + N (BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC) +"RTN","BMXRPC",42,0) + S BMX31=$C(31)_$C(31) +"RTN","BMXRPC",43,0) + S BMXGBL="^BMXTEMP("_$J_")",BMXERR="",U="^" +"RTN","BMXRPC",44,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXRPC",45,0) + ; +"RTN","BMXRPC",46,0) + ;---> If file number not provided, return error. +"RTN","BMXRPC",47,0) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q +"RTN","BMXRPC",48,0) + ; +"RTN","BMXRPC",49,0) + ;---> If no fields provided, pass .01. +"RTN","BMXRPC",50,0) + ;---> IEN will always be the first piece of data returned. +"RTN","BMXRPC",51,0) + ;---> NOTE: If .01 is NOT included, but the Index to lookup on is +"RTN","BMXRPC",52,0) + ;---> NOT on the .01, then the .01 will be returned +"RTN","BMXRPC",53,0) + ;---> automatically as the second ^-piece of data in the +"RTN","BMXRPC",54,0) + ;---> Result Global. +"RTN","BMXRPC",55,0) + ;---> So it would be: IEN^.01^requested fields... +"RTN","BMXRPC",56,0) + I $G(BMXFLDS)="" S BMXFLDS=".01" +"RTN","BMXRPC",57,0) + ; +"RTN","BMXRPC",58,0) + ;---> If no index or flag provided, set flag="M". +"RTN","BMXRPC",59,0) + I $G(BMXFLG)="" D +"RTN","BMXRPC",60,0) + .I $G(BMXIX)="" S BMXFLG="M" Q +"RTN","BMXRPC",61,0) + .S BMXFLG="" +"RTN","BMXRPC",62,0) + ; +"RTN","BMXRPC",63,0) + ;---> If no Maximum Number provided, set it to 200. +"RTN","BMXRPC",64,0) + I '$G(BMXMX) S BMXMX=200 +"RTN","BMXRPC",65,0) + ; +"RTN","BMXRPC",66,0) + ;---> Define index and screen. +"RTN","BMXRPC",67,0) + S:'$D(BMXIX) BMXIX="" +"RTN","BMXRPC",68,0) + S:'$D(BMXSCR) BMXSCR="" +"RTN","BMXRPC",69,0) + ; +"RTN","BMXRPC",70,0) + ;---> Set Target Global for output and errors. +"RTN","BMXRPC",71,0) + S BMXG="^BMXTMP($J)" +"RTN","BMXRPC",72,0) + ; +"RTN","BMXRPC",73,0) + ;---> If Mixed Case not set, set to No Change. +"RTN","BMXRPC",74,0) + I '$D(BMXMC) S BMXMC=0 +"RTN","BMXRPC",75,0) + ; +"RTN","BMXRPC",76,0) + ;---> Silent Fileman call. +"RTN","BMXRPC",77,0) + D +"RTN","BMXRPC",78,0) + .I $G(BMXIN)="" D Q +"RTN","BMXRPC",79,0) + ..D LIST^DIC(BMXFL,,BMXFLDS,,BMXMX,0,,BMXIX,BMXSCR,,BMXG,BMXG) +"RTN","BMXRPC",80,0) + .D FIND^DIC(BMXFL,,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,,BMXG,BMXG) +"RTN","BMXRPC",81,0) + ; +"RTN","BMXRPC",82,0) + D WRITE +"RTN","BMXRPC",83,0) + Q +"RTN","BMXRPC",84,0) + ; +"RTN","BMXRPC",85,0) + ; +"RTN","BMXRPC",86,0) + ;---------- +"RTN","BMXRPC",87,0) +WRITE ;EP +"RTN","BMXRPC",88,0) + ;---> Collect data for matching records and write in result global. +"RTN","BMXRPC",89,0) + ; +"RTN","BMXRPC",90,0) + ;---> First, check for errors. +"RTN","BMXRPC",91,0) + ;---> If errors exist, write them and quit. +"RTN","BMXRPC",92,0) + N I,N,X +"RTN","BMXRPC",93,0) + I $D(^BMXTMP($J,"DIERR")) I $O(^("DIERR",0)) D Q +"RTN","BMXRPC",94,0) + .S N=0,X="" +"RTN","BMXRPC",95,0) + .F S N=$O(^BMXTMP($J,"DIERR",N)) Q:'N D +"RTN","BMXRPC",96,0) + ..N M S M=0 +"RTN","BMXRPC",97,0) + ..F S M=$O(^BMXTMP($J,"DIERR",N,"TEXT",M)) Q:'M D +"RTN","BMXRPC",98,0) + ...S X=X_^BMXTMP($J,"DIERR",N,"TEXT",M)_" " +"RTN","BMXRPC",99,0) + .D ERROUT(X,1) +"RTN","BMXRPC",100,0) + ; +"RTN","BMXRPC",101,0) + ; +"RTN","BMXRPC",102,0) + ;---> Write Field Names +"RTN","BMXRPC",103,0) + S $P(ASDX,"^",1)="IEN" +"RTN","BMXRPC",104,0) + F ASDC=1:1:$L(BMXFLDS,";") D +"RTN","BMXRPC",105,0) + . S ASDXFNUM=$P(BMXFLDS,";",ASDC) +"RTN","BMXRPC",106,0) + . S ASDXFNAM=$P(^DD(BMXFL,ASDXFNUM,0),"^") +"RTN","BMXRPC",107,0) + . S:ASDXFNAM="" ASDXFNAM="UNKNOWN"_ASDC +"RTN","BMXRPC",108,0) + . S $P(ASDX,"^",ASDC+1)=ASDXFNAM +"RTN","BMXRPC",109,0) + S ^BMXTEMP($J,1)=ASDX_$C(30) +"RTN","BMXRPC",110,0) + ;---> Write valid results. +"RTN","BMXRPC",111,0) + ;---> Loop through the IEN node (...2,N) of the temp global. +"RTN","BMXRPC",112,0) + N I,N,X S N=0 +"RTN","BMXRPC",113,0) + F I=2:1 S N=$O(^BMXTMP($J,"DILIST",2,N)) Q:'N D +"RTN","BMXRPC",114,0) + .;---> Always set first piece of X=IEN of entry. +"RTN","BMXRPC",115,0) + .S X=^BMXTMP($J,"DILIST",2,N) +"RTN","BMXRPC",116,0) + .; +"RTN","BMXRPC",117,0) + .;---> Collect other fields and concatenate to X. +"RTN","BMXRPC",118,0) + .N M S M=0 +"RTN","BMXRPC",119,0) + .F S M=$O(^BMXTMP($J,"DILIST","ID",N,M)) Q:'M D +"RTN","BMXRPC",120,0) + ..S X=X_U_^BMXTMP($J,"DILIST","ID",N,M) +"RTN","BMXRPC",121,0) + .; +"RTN","BMXRPC",122,0) + .;---> Convert data to mixed case if BMXMC=1. +"RTN","BMXRPC",123,0) + .S:BMXMC X=$$T^BMXTRS(X) +"RTN","BMXRPC",124,0) + .; +"RTN","BMXRPC",125,0) + .;---> Set data in result global. +"RTN","BMXRPC",126,0) + .S ^BMXTEMP($J,I)=X_$C(30) +"RTN","BMXRPC",127,0) + ; +"RTN","BMXRPC",128,0) + ;---> If no results, report it as an error. +"RTN","BMXRPC",129,0) + D:'$O(^BMXTEMP($J,0)) +"RTN","BMXRPC",130,0) + .I BMXIN]"" S BMXERR="No entry matches """_BMXIN_"""." Q +"RTN","BMXRPC",131,0) + .S BMXERR="Either the lookup file is empty" +"RTN","BMXRPC",132,0) + .S BMXERR=BMXERR_" or all entries are screened (software error)." +"RTN","BMXRPC",133,0) + ; +"RTN","BMXRPC",134,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXRPC",135,0) + S ^BMXTEMP($J,I)=BMX31_BMXERR +"RTN","BMXRPC",136,0) + Q +"RTN","BMXRPC",137,0) + ; +"RTN","BMXRPC",138,0) + ; +"RTN","BMXRPC",139,0) + ;---------- +"RTN","BMXRPC",140,0) +ERROUT(BMXERR,I) ;EP +"RTN","BMXRPC",141,0) + ;---> Save next line for Error Code File if ever used. +"RTN","BMXRPC",142,0) + ;---> If necessary, use I>1 to avoid overwriting valid data. +"RTN","BMXRPC",143,0) + S:'$G(I) I=1 +"RTN","BMXRPC",144,0) + S ^BMXTEMP($J,I)=BMX31_BMXERR +"RTN","BMXRPC",145,0) + Q +"RTN","BMXRPC",146,0) + ; +"RTN","BMXRPC",147,0) + ; +"RTN","BMXRPC",148,0) +PASSERR(BMXGBL,BMXERR) ;EP +"RTN","BMXRPC",149,0) + ;---> If the RPC routine calling the BMX Generic Lookup above +"RTN","BMXRPC",150,0) + ;---> detects a specific error prior to the call and wants to pass +"RTN","BMXRPC",151,0) + ;---> that error in the result global rather than a generic error, +"RTN","BMXRPC",152,0) + ;---> then a call to this function (PASSERR) can be made. +"RTN","BMXRPC",153,0) + ;---> This call will store the error text passed in the result global. +"RTN","BMXRPC",154,0) + ;---> The calling routine should then quit (abort its call to the +"RTN","BMXRPC",155,0) + ;---> BMX Generic Lookup function above). +"RTN","BMXRPC",156,0) + ; +"RTN","BMXRPC",157,0) + ;---> Parameters: +"RTN","BMXRPC",158,0) + ; 1 - BMXGBL (ret) Name of result global for Broker. +"RTN","BMXRPC",159,0) + ; 2 - BMXERR (req) Text of error to be stored in result global. +"RTN","BMXRPC",160,0) + ; +"RTN","BMXRPC",161,0) + S:$G(BMXERR)="" BMXERR="Error not passed (software error)." +"RTN","BMXRPC",162,0) + ; +"RTN","BMXRPC",163,0) + N BMX31 S BMX31=$C(31)_$C(31) +"RTN","BMXRPC",164,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXRPC",165,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXRPC",166,0) + S ^BMXTEMP($J,1)=BMX31_BMXERR +"RTN","BMXRPC",167,0) + Q +"RTN","BMXRPC1") +0^88^B52168951 +"RTN","BMXRPC1",1,0) +BMXRPC1 ; IHS/OIT/HMW - UTIL: REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC1",3,0) + ;;* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * +"RTN","BMXRPC1",4,0) + ;; UTILITY: CODE FOR REMOTE PROCEDURE CALLS. +"RTN","BMXRPC1",5,0) + ;; RETURNS PATIENT DATA, HEALTH SUMMARY, FACE SHEET. +"RTN","BMXRPC1",6,0) + ; +"RTN","BMXRPC1",7,0) + ; +"RTN","BMXRPC1",8,0) + ;---------- +"RTN","BMXRPC1",9,0) +PDATA(BMXDATA,BMXDFN) ;EP +"RTN","BMXRPC1",10,0) + ;---> Return Patient Data in 5 ^-delimited pieces: +"RTN","BMXRPC1",11,0) + ;---> 1 - DOB in format: OCT 01,1994. +"RTN","BMXRPC1",12,0) + ;---> 2 - Age in format: 35 Months. +"RTN","BMXRPC1",13,0) + ;---> 3 - Text of Patient's sex. +"RTN","BMXRPC1",14,0) + ;---> 4 - HRCN in the format XX-XX-XX. +"RTN","BMXRPC1",15,0) + ;---> 5 - Text of ACTIVE/INACTIVE Status. +"RTN","BMXRPC1",16,0) + ;---> Parameters: +"RTN","BMXRPC1",17,0) + ; 1 - BMXDATA (ret) String of patient data||error. +"RTN","BMXRPC1",18,0) + ; 2 - BMXDFN (req) DFN of patient. +"RTN","BMXRPC1",19,0) + ; +"RTN","BMXRPC1",20,0) + ;---> Delimiter to pass error with result to GUI. +"RTN","BMXRPC1",21,0) + N BMX31,BMXERR S BMX31=$C(31)_$C(31) +"RTN","BMXRPC1",22,0) + S BMXDATA="",BMXERR="" +"RTN","BMXRPC1",23,0) + ; +"RTN","BMXRPC1",24,0) + ;---> If DFN not supplied, set Error Code and quit. +"RTN","BMXRPC1",25,0) + I '$G(BMXDFN) D Q +"RTN","BMXRPC1",26,0) + .;D ERRCD^BMXUTL2(201,.BMXERR) S BMXDATA=BMX31_BMXERR +"RTN","BMXRPC1",27,0) + ; +"RTN","BMXRPC1",28,0) + ;---> DOB. +"RTN","BMXRPC1",29,0) + S BMXDATA=$$TXDT1^BMXUTL5($$DOB^BMXUTL1(BMXDFN)) +"RTN","BMXRPC1",30,0) + ; +"RTN","BMXRPC1",31,0) + ;---> Age. +"RTN","BMXRPC1",32,0) + S BMXDATA=BMXDATA_U_$$AGEF^BMXUTL1(BMXDFN) +"RTN","BMXRPC1",33,0) + ; +"RTN","BMXRPC1",34,0) + ;---> Text of sex. +"RTN","BMXRPC1",35,0) + S BMXDATA=BMXDATA_U_$$SEXW^BMXUTL1(BMXDFN) +"RTN","BMXRPC1",36,0) + ; +"RTN","BMXRPC1",37,0) + ;---> HRCN, format XX-XX-XX. +"RTN","BMXRPC1",38,0) + S BMXDATA=BMXDATA_U_$$HRCN^BMXUTL1(BMXDFN) +"RTN","BMXRPC1",39,0) + ; +"RTN","BMXRPC1",40,0) + ;---> Active/Inactive Status. +"RTN","BMXRPC1",41,0) + ;S BMXDATA=BMXDATA_U_$$ACTIVE^BMXUTL1(BMXDFN) +"RTN","BMXRPC1",42,0) + ; +"RTN","BMXRPC1",43,0) + S BMXDATA=BMXDATA_BMX31 +"RTN","BMXRPC1",44,0) + ; +"RTN","BMXRPC1",45,0) + Q +"RTN","BMXRPC1",46,0) + ; +"RTN","BMXRPC1",47,0) + ; +"RTN","BMXRPC1",48,0) + ;---------- +"RTN","BMXRPC1",49,0) +HS(BMXGBL,BMXDFN) ;EP +"RTN","BMXRPC1",50,0) + ;---> Return patient's Health Summary in global array, ^BMXTEMP($J,"HS". +"RTN","BMXRPC1",51,0) + ;---> Lines delimited by "^". +"RTN","BMXRPC1",52,0) + ;---> Called by RPC: BMX IMMSERVE PT PROFILE +"RTN","BMXRPC1",53,0) + ;---> Parameters: +"RTN","BMXRPC1",54,0) + ; 1 - BMXGBL (ret) Name of result global containing patient's +"RTN","BMXRPC1",55,0) + ; Health Summary, passed to Broker. +"RTN","BMXRPC1",56,0) + ; 2 - BMXDFN (req) DFN of patient. +"RTN","BMXRPC1",57,0) + ; +"RTN","BMXRPC1",58,0) + ;---> Delimiter to pass error with result to GUI. +"RTN","BMXRPC1",59,0) + N BMX30,BMX31,BMXERR,X +"RTN","BMXRPC1",60,0) + S BMX30=$C(30),BMX31=$C(31)_$C(31) +"RTN","BMXRPC1",61,0) + S BMXGBL="^BMXTEMP("_$J_",""HS"")",BMXERR="" +"RTN","BMXRPC1",62,0) + K ^BMXTEMP($J,"HS") +"RTN","BMXRPC1",63,0) + ; +"RTN","BMXRPC1",64,0) + ;---> If DFN not supplied, set Error Code and quit. +"RTN","BMXRPC1",65,0) + I '$G(BMXDFN) D Q +"RTN","BMXRPC1",66,0) + .;D ERRCD^BMXUTL2(201,.BMXERR) S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC1",67,0) + ; +"RTN","BMXRPC1",68,0) + ;---> If patient does not exist, set Error Code and quit. +"RTN","BMXRPC1",69,0) + I '$D(^AUPNPAT(BMXDFN,0)) D Q +"RTN","BMXRPC1",70,0) + .;D ERRCD^BMXUTL2(203,.BMXERR) S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC1",71,0) + ; +"RTN","BMXRPC1",72,0) + N APCHSPAT,APCHSTYP +"RTN","BMXRPC1",73,0) + S APCHSPAT=BMXDFN,APCHSTYP=7 +"RTN","BMXRPC1",74,0) + ;---> Doesn't work from Device 56. +"RTN","BMXRPC1",75,0) + ;D GUIR^XBLM("EN^APCHS","^TMP(""BMXHS"",$J,") +"RTN","BMXRPC1",76,0) + ; +"RTN","BMXRPC1",77,0) + ;---> Generate a host file name. +"RTN","BMXRPC1",78,0) + N BMXFN S BMXFN="XB"_$J +"RTN","BMXRPC1",79,0) + ; +"RTN","BMXRPC1",80,0) + D +"RTN","BMXRPC1",81,0) + .;---> Important to preserve IO variables for when $I returns to 56. +"RTN","BMXRPC1",82,0) + .N IO,IOBS,IOF,IOHG,IOM,ION,IOPAR,IOS,IOSL,IOST,IOT,IOUPAR,IOXY +"RTN","BMXRPC1",83,0) + .; +"RTN","BMXRPC1",84,0) + .;---> Open host file to receive legacy code display. +"RTN","BMXRPC1",85,0) + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"W") +"RTN","BMXRPC1",86,0) + .; +"RTN","BMXRPC1",87,0) + .;---> Call to legacy code for Health Summary display. +"RTN","BMXRPC1",88,0) + .D EN^APCHS +"RTN","BMXRPC1",89,0) + .;---> Write End of File (EOF) marker. +"RTN","BMXRPC1",90,0) + .W $C(9) +"RTN","BMXRPC1",91,0) + .; +"RTN","BMXRPC1",92,0) + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? +"RTN","BMXRPC1",93,0) + .;D ^%ZISC +"RTN","BMXRPC1",94,0) + .;---> Buffer won't write out to file until the device is closed +"RTN","BMXRPC1",95,0) + .;---> or the buffer is flushed by some other command. +"RTN","BMXRPC1",96,0) + .;---> At this point, host file exists but has 0 bytes. +"RTN","BMXRPC1",97,0) + .;C 51 +"RTN","BMXRPC1",98,0) + .;---> Now host file contains legacy code display data. +"RTN","BMXRPC1",99,0) + .; +"RTN","BMXRPC1",100,0) + .;---> For some reason %ZISH cannot open the host file a second time. +"RTN","BMXRPC1",101,0) + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"R") +"RTN","BMXRPC1",102,0) + .;O 51:($$HFSPATH^BMXUTL1_BMXFN:"R") +"RTN","BMXRPC1",103,0) + .;U 51 +"RTN","BMXRPC1",104,0) + .; +"RTN","BMXRPC1",105,0) + .;---> Read in the host file. +"RTN","BMXRPC1",106,0) + .D +"RTN","BMXRPC1",107,0) + ..;---> Stop reading Host File if line contains EOF $C(9). +"RTN","BMXRPC1",108,0) + ..;N I,Y F I=1:1 R Y Q:Y[$C(9) S ^TMP("BMXHS",$J,I)=Y +"RTN","BMXRPC1",109,0) + .; +"RTN","BMXRPC1",110,0) + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? +"RTN","BMXRPC1",111,0) + .;D ^%ZISC +"RTN","BMXRPC1",112,0) + .;C 51 +"RTN","BMXRPC1",113,0) + ; +"RTN","BMXRPC1",114,0) + ;---> At this point $I=1. The job has "forgotten" its $I, even +"RTN","BMXRPC1",115,0) + ;---> though %SS shows 56 as the current device. $I=1 causes a +"RTN","BMXRPC1",116,0) + ;---> at CAPI+10^XWBBRK2. A simple USE 56 command +"RTN","BMXRPC1",117,0) + ;---> appears to "remind" the job its $I is 56, and it works. +"RTN","BMXRPC1",118,0) + ;---> Possibly this is something %ZISC ordinarily does. +"RTN","BMXRPC1",119,0) + ;U 56 +"RTN","BMXRPC1",120,0) + ; +"RTN","BMXRPC1",121,0) + ;---> Copy Health Summary to global array for passing back to GUI. +"RTN","BMXRPC1",122,0) + N I,N,U,X S U="^" +"RTN","BMXRPC1",123,0) + S N=0 +"RTN","BMXRPC1",124,0) + F I=1:1 S N=$O(^TMP("BMXHS",$J,N)) Q:'N D +"RTN","BMXRPC1",125,0) + .;---> Set null lines (line breaks) equal to one space, so that +"RTN","BMXRPC1",126,0) + .;---> Windows reader will quit only at the final "null" line. +"RTN","BMXRPC1",127,0) + .S X=^TMP("BMXHS",$J,N) S:X="" X=" " +"RTN","BMXRPC1",128,0) + .S ^BMXTEMP($J,"HS",I)=X_BMX30 +"RTN","BMXRPC1",129,0) + ; +"RTN","BMXRPC1",130,0) + ;---> If no Health Summary produced, report it as an error. +"RTN","BMXRPC1",131,0) + D:'$O(^BMXTEMP($J,"HS",0)) +"RTN","BMXRPC1",132,0) + .;D ERRCD^BMXUTL2(407,.BMXERR) S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC1",133,0) + ; +"RTN","BMXRPC1",134,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXRPC1",135,0) + S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC1",136,0) + ; +"RTN","BMXRPC1",137,0) + ;---> This works; host file gets deleted. +"RTN","BMXRPC1",138,0) + ;S Y=$$DEL^%ZISH($$HFSPATH^BMXUTL1,BMXFN) +"RTN","BMXRPC1",139,0) + K ^TMP("BMXHS",$J) +"RTN","BMXRPC1",140,0) + Q +"RTN","BMXRPC1",141,0) + ; +"RTN","BMXRPC1",142,0) + ; +"RTN","BMXRPC1",143,0) + ;---------- +"RTN","BMXRPC1",144,0) +FACE(BMXGBL,BMXDFN) ;EP +"RTN","BMXRPC1",145,0) + ;---> Return patient's Face Sheet in global array, ^BMXTEMP($J,"FACE". +"RTN","BMXRPC1",146,0) + ;---> Lines delimited by "^". +"RTN","BMXRPC1",147,0) + ;---> Called by RPC: BMX IMMSERVE PT PROFILE +"RTN","BMXRPC1",148,0) + ;---> Parameters: +"RTN","BMXRPC1",149,0) + ; 1 - BMXGBL (ret) Name of result global containing patient's +"RTN","BMXRPC1",150,0) + ; Face Sheet, passed to Broker. +"RTN","BMXRPC1",151,0) + ; 2 - BMXDFN (req) DFN of patient. +"RTN","BMXRPC1",152,0) + ; +"RTN","BMXRPC1",153,0) + ;---> Delimiter to pass error with result to GUI. +"RTN","BMXRPC1",154,0) + N BMX30,BMX31,BMXERR,X +"RTN","BMXRPC1",155,0) + S BMX30=$C(30),BMX31=$C(31)_$C(31) +"RTN","BMXRPC1",156,0) + S BMXGBL="^BMXTEMP("_$J_",""FACE"")",BMXERR="" +"RTN","BMXRPC1",157,0) + K ^BMXTEMP($J,"FACE") +"RTN","BMXRPC1",158,0) + ; +"RTN","BMXRPC1",159,0) + ;---> If DFN not supplied, set Error Code and quit. +"RTN","BMXRPC1",160,0) + I '$G(BMXDFN) D Q +"RTN","BMXRPC1",161,0) + .;D ERRCD^BMXUTL2(201,.BMXERR) S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR +"RTN","BMXRPC1",162,0) + ; +"RTN","BMXRPC1",163,0) + ;---> If patient does not exist, set Error Code and quit. +"RTN","BMXRPC1",164,0) + I '$D(^AUPNPAT(BMXDFN,0)) D Q +"RTN","BMXRPC1",165,0) + .;D ERRCD^BMXUTL2(203,.BMXERR) S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR +"RTN","BMXRPC1",166,0) + ; +"RTN","BMXRPC1",167,0) + N DFN S DFN=BMXDFN +"RTN","BMXRPC1",168,0) + ;---> Doesn't work from Device 56. +"RTN","BMXRPC1",169,0) + ;---> Generate a host file name. +"RTN","BMXRPC1",170,0) + N BMXFN S BMXFN="XB"_$J +"RTN","BMXRPC1",171,0) + ; +"RTN","BMXRPC1",172,0) + D +"RTN","BMXRPC1",173,0) + .;---> Important to preserve IO variables for when $I returns to 56. +"RTN","BMXRPC1",174,0) + .N IO,IOBS,IOF,IOHG,IOM,ION,IOPAR,IOS,IOSL,IOST,IOT,IOUPAR,IOXY +"RTN","BMXRPC1",175,0) + .; +"RTN","BMXRPC1",176,0) + .;---> Open host file to receive legacy code display. +"RTN","BMXRPC1",177,0) + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"W") +"RTN","BMXRPC1",178,0) + .; +"RTN","BMXRPC1",179,0) + .;---> Call to legacy code for Face Sheet display. +"RTN","BMXRPC1",180,0) + .U 51 +"RTN","BMXRPC1",181,0) + .;D ^BMXFACE +"RTN","BMXRPC1",182,0) + .;---> Write End of File (EOF) marker. +"RTN","BMXRPC1",183,0) + .W $C(9) +"RTN","BMXRPC1",184,0) + .; +"RTN","BMXRPC1",185,0) + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? +"RTN","BMXRPC1",186,0) + .;D ^%ZISC +"RTN","BMXRPC1",187,0) + .;---> Buffer won't write out to file until the device is closed +"RTN","BMXRPC1",188,0) + .;---> or the buffer is flushed by some other command. +"RTN","BMXRPC1",189,0) + .;---> At this point, host file exists but has 0 bytes. +"RTN","BMXRPC1",190,0) + .;C 51 +"RTN","BMXRPC1",191,0) + .;---> Now host file contains legacy code display data. +"RTN","BMXRPC1",192,0) + .; +"RTN","BMXRPC1",193,0) + .;---> For some reason %ZISH cannot open the host file a second time. +"RTN","BMXRPC1",194,0) + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"R") +"RTN","BMXRPC1",195,0) + .;O 51:($$HFSPATH^BMXUTL1_BMXFN:"R") +"RTN","BMXRPC1",196,0) + .U 51 +"RTN","BMXRPC1",197,0) + .; +"RTN","BMXRPC1",198,0) + .;---> Read in the host file. +"RTN","BMXRPC1",199,0) + .D +"RTN","BMXRPC1",200,0) + ..;---> Need some way to mark the end of legacy code output. +"RTN","BMXRPC1",201,0) + ..;---> Stop reading Host File if line contains EOF $C(9). +"RTN","BMXRPC1",202,0) + ..;---> (I added $C(9) above, after ^BMXFACE completed.) +"RTN","BMXRPC1",203,0) + ..;N I,Y F I=1:1 R Y Q:Y[$C(9) S ^TMP("BMXFACE",$J,I)=Y +"RTN","BMXRPC1",204,0) + .; +"RTN","BMXRPC1",205,0) + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? +"RTN","BMXRPC1",206,0) + .;D ^%ZISC +"RTN","BMXRPC1",207,0) + .;C 51 +"RTN","BMXRPC1",208,0) + ; +"RTN","BMXRPC1",209,0) + ;---> At this point $I=1. The job has "forgotten" its $I, even +"RTN","BMXRPC1",210,0) + ;---> though %SS shows 56 as the current device. $I=1 causes a +"RTN","BMXRPC1",211,0) + ;---> at CAPI+10^XWBBRK2. A simple USE 56 command +"RTN","BMXRPC1",212,0) + ;---> appears to "remind" the job its $I is 56, and it works. +"RTN","BMXRPC1",213,0) + ;---> Possibly this is something %ZISC ordinarily does. +"RTN","BMXRPC1",214,0) + U 56 +"RTN","BMXRPC1",215,0) + ; +"RTN","BMXRPC1",216,0) + ;---> Copy Face Sheet to global array for passing back to GUI. +"RTN","BMXRPC1",217,0) + N I,N,U,X S U="^" +"RTN","BMXRPC1",218,0) + S N=0 +"RTN","BMXRPC1",219,0) + F I=1:1 S N=$O(^TMP("BMXFACE",$J,N)) Q:'N D +"RTN","BMXRPC1",220,0) + .;---> Set null lines (line breaks) equal to one space, so that +"RTN","BMXRPC1",221,0) + .;---> Windows reader will quit only at the final "null" line. +"RTN","BMXRPC1",222,0) + .S X=^TMP("BMXFACE",$J,N) S:X="" X=" " +"RTN","BMXRPC1",223,0) + .;---> Remove Carriage Return (13)_Formfeed (12) characters. +"RTN","BMXRPC1",224,0) + .I X[$C(13)_$C(12) S X=$P(X,$C(13)_$C(12),2) +"RTN","BMXRPC1",225,0) + .; +"RTN","BMXRPC1",226,0) + .S ^BMXTEMP($J,"FACE",I)=X_BMX30 +"RTN","BMXRPC1",227,0) + ; +"RTN","BMXRPC1",228,0) + ;---> If no Health Summary produced, report it as an error. +"RTN","BMXRPC1",229,0) + D:'$O(^BMXTEMP($J,"FACE",0)) +"RTN","BMXRPC1",230,0) + .;D ERRCD^BMXUTL2(408,.BMXERR) S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR +"RTN","BMXRPC1",231,0) + ; +"RTN","BMXRPC1",232,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXRPC1",233,0) + S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR +"RTN","BMXRPC1",234,0) + ; +"RTN","BMXRPC1",235,0) + ;---> This works; host file gets deleted. +"RTN","BMXRPC1",236,0) + ;S Y=$$DEL^%ZISH($$HFSPATH^BMXUTL1,BMXFN) +"RTN","BMXRPC1",237,0) + K ^TMP("BMXFACE",$J) +"RTN","BMXRPC1",238,0) + Q +"RTN","BMXRPC2") +0^89^B11504982 +"RTN","BMXRPC2",1,0) +BMXRPC2 ; IHS/OIT/HMW - FIELD LIST ; +"RTN","BMXRPC2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC2",3,0) + ; +"RTN","BMXRPC2",4,0) +FLDLIST(BMXGBL,BMXFL,BMXATTR,BMXSCR) ;EP +"RTN","BMXRPC2",5,0) + ;TODO: Change all this to be a hard-coded $O thru ^DD +"RTN","BMXRPC2",6,0) + ;Returns info in BMXATTR for all fields in file number BMXFL +"RTN","BMXRPC2",7,0) + ;BMXSCR is executable code to set $T +"RTN","BMXRPC2",8,0) + ; When BMXSCR is executed, the field number is in BMXFLD +"RTN","BMXRPC2",9,0) + ;See FileMan documentation for FIELD^DD for description +"RTN","BMXRPC2",10,0) + ;of Attributes +"RTN","BMXRPC2",11,0) + ; +"RTN","BMXRPC2",12,0) + ;---> Set variables, kill temp globals. +"RTN","BMXRPC2",13,0) + ;S ^HW("F",BMXFL)="" +"RTN","BMXRPC2",14,0) + ;S ^HW("F",BMXATTR)="" +"RTN","BMXRPC2",15,0) + N BMX31,BMXERR,BMXG,BMXFLD,BMX,BMXC,BMXT +"RTN","BMXRPC2",16,0) + S BMX31=$C(31)_$C(31) +"RTN","BMXRPC2",17,0) + S BMXGBL="BMXTMP("_$J_")",BMXERR="",U="^" +"RTN","BMXRPC2",18,0) + K BMXTMP($J) +"RTN","BMXRPC2",19,0) + ; +"RTN","BMXRPC2",20,0) + ;---> If file number not provided, return error. +"RTN","BMXRPC2",21,0) + ;I '+BMXFL D ERROUT^BMXRPC("File number not provided.",1) Q +"RTN","BMXRPC2",22,0) + ;---> If file number not provided check for file name. +"RTN","BMXRPC2",23,0) + I +BMXFL'=BMXFL D +"RTN","BMXRPC2",24,0) + . S BMXFL=$TR(BMXFL,"_"," ") +"RTN","BMXRPC2",25,0) + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q +"RTN","BMXRPC2",26,0) + . S BMXFL=$O(^DIC("B",BMXFL,0)) +"RTN","BMXRPC2",27,0) + I '$G(BMXFL) D ERROUT^BMXRPC("File number not provided.",1) Q +"RTN","BMXRPC2",28,0) + ; +"RTN","BMXRPC2",29,0) + ;---> If no such file, return error. +"RTN","BMXRPC2",30,0) + I '$D(^DD(BMXFL,0)) D ERROUT^BMXRPC("File does not exist.",1) Q +"RTN","BMXRPC2",31,0) + ; +"RTN","BMXRPC2",32,0) + ;---> Validate screen code +"RTN","BMXRPC2",33,0) + I $G(BMXSCR)="" S BMXSCR="I 1" +"RTN","BMXRPC2",34,0) + S X=$G(BMXSCR) +"RTN","BMXRPC2",35,0) + I X]"" D ^DIM +"RTN","BMXRPC2",36,0) + I '$D(X) S BMXSCR="I 1" ;Default to no screen +"RTN","BMXRPC2",37,0) + ; +"RTN","BMXRPC2",38,0) + ;---> Set Target Global for output and errors. +"RTN","BMXRPC2",39,0) + S BMXG="BMXTMP($J,""DID"")" +"RTN","BMXRPC2",40,0) + ; +"RTN","BMXRPC2",41,0) + ;---> Loop through ^DD(FileNumber,FieldNumber,0) to get field names +"RTN","BMXRPC2",42,0) + K BMXTMP($J) +"RTN","BMXRPC2",43,0) + I $G(BMXATTR)="" S BMXATTR="LABEL" ;Changed from NAME to LABEL +"RTN","BMXRPC2",44,0) + ;---> Attribute Names +"RTN","BMXRPC2",45,0) + F I=1:1:$L(BMXATTR,";") S BMXT($P(BMXATTR,";",I))="" +"RTN","BMXRPC2",46,0) + S (BMX,BMXC)=0 F S BMX=$O(BMXT(BMX)) Q:BMX="" D +"RTN","BMXRPC2",47,0) + . S BMXC=BMXC+1 +"RTN","BMXRPC2",48,0) + . S $P(BMXT,U,BMXC)="T00030"_BMX +"RTN","BMXRPC2",49,0) + S BMXTMP($J,1)="T00030NUMBER"_U_BMXT_$C(30) +"RTN","BMXRPC2",50,0) + ; +"RTN","BMXRPC2",51,0) + ;S BMXFLD=0 F I=2:1 S BMXFLD=$O(^DD(BMXFL,BMXFLD)) Q:'+BMXFLD D +"RTN","BMXRPC2",52,0) + S BMXTMP($J,2)=".001^BMXIEN"_$C(30) +"RTN","BMXRPC2",53,0) + S BMXFLDN=0 F I=3:1 S BMXFLDN=$O(^DD(BMXFL,"B",BMXFLDN)) Q:BMXFLDN="" D +"RTN","BMXRPC2",54,0) + . S BMXFLD=$O(^DD(BMXFL,"B",BMXFLDN,0)) Q:'+BMXFLD +"RTN","BMXRPC2",55,0) + . X BMXSCR Q:'$T +"RTN","BMXRPC2",56,0) + . D FIELD^DID(BMXFL,BMXFLD,,BMXATTR,BMXG,BMXG) +"RTN","BMXRPC2",57,0) + . K BMXT S (BMXC,BMX)=0 +"RTN","BMXRPC2",58,0) + . F S BMX=$O(BMXTMP($J,"DID",BMX)) Q:BMX="" D +"RTN","BMXRPC2",59,0) + . . S BMXC=BMXC+1 +"RTN","BMXRPC2",60,0) + . . S $P(BMXT,U,BMXC)=BMXTMP($J,"DID",BMX) +"RTN","BMXRPC2",61,0) + . S BMXTMP($J,I)=BMXFLD_U_$TR(BMXT," ","_")_$C(30) +"RTN","BMXRPC2",62,0) + ;S I=I+1,BMXTMP($J,I)=".001^BMXIEN"_$C(30) +"RTN","BMXRPC2",63,0) + S I=I+1 +"RTN","BMXRPC2",64,0) + K BMXTMP($J,"DID") +"RTN","BMXRPC2",65,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXRPC2",66,0) + S BMXTMP($J,I)=BMX31_BMXERR +"RTN","BMXRPC2",67,0) + Q +"RTN","BMXRPC2",68,0) + ; +"RTN","BMXRPC2",69,0) +MLTLIST(BMXGBL,BMXFL,BMXONEOK) ;EP +"RTN","BMXRPC2",70,0) + ;Returns list of multiple fields in file BMXFL, returns only one field +"RTN","BMXRPC2",71,0) + ;if BMXONEOK is TRUE +"RTN","BMXRPC2",72,0) + ;S ^HW($H,"MLTLIST","FL")=BMXFL +"RTN","BMXRPC2",73,0) + ;S ^HW($H,"MLTLIST","ONE")=BMXONEOK +"RTN","BMXRPC2",74,0) + N BMX31,BMXERR,BMXG,BMXFLD,BMX,BMXC,BMXT,I +"RTN","BMXRPC2",75,0) + S BMX31=$C(31)_$C(31) +"RTN","BMXRPC2",76,0) + S BMXGBL="BMXTMP("_$J_")",BMXERR="",U="^" +"RTN","BMXRPC2",77,0) + K BMXTMP($J) +"RTN","BMXRPC2",78,0) + ; +"RTN","BMXRPC2",79,0) + ;---> If file number not provided check for file name. +"RTN","BMXRPC2",80,0) + I +BMXFL'=BMXFL D +"RTN","BMXRPC2",81,0) + . S BMXFL=$TR(BMXFL,"_"," ") +"RTN","BMXRPC2",82,0) + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q +"RTN","BMXRPC2",83,0) + . S BMXFL=$O(^DIC("B",BMXFL,0)) +"RTN","BMXRPC2",84,0) + I '$G(BMXFL) D ERROUT^BMXRPC("File number not provided.",1) Q +"RTN","BMXRPC2",85,0) + ; +"RTN","BMXRPC2",86,0) + ;---> If no such file, return error. +"RTN","BMXRPC2",87,0) + I '$D(^DD(BMXFL,0)) D ERROUT^BMXRPC("File does not exist.",1) Q +"RTN","BMXRPC2",88,0) + ; +"RTN","BMXRPC2",89,0) + ;---> Column Headers +"RTN","BMXRPC2",90,0) + S BMXTMP($J,1)="T00030NUMBER"_U_"T00030NAME"_$C(30) +"RTN","BMXRPC2",91,0) + ; +"RTN","BMXRPC2",92,0) + ;---> $O thru ^DD(BMXFL,"SB" to get subfile numbers and names +"RTN","BMXRPC2",93,0) + S I=2 +"RTN","BMXRPC2",94,0) + N BMXSB,BMXSBN,BMXSBF,BMXFOUND +"RTN","BMXRPC2",95,0) + S BMXFOUND=0 +"RTN","BMXRPC2",96,0) + I $D(^DD(BMXFL,"SB")) D +"RTN","BMXRPC2",97,0) + . S BMXSB=0 +"RTN","BMXRPC2",98,0) + . F S BMXSB=$O(^DD(BMXFL,"SB",BMXSB)) Q:'+BMXSB D I BMXFOUND Q:BMXONEOK=1 +"RTN","BMXRPC2",99,0) + . . S BMXSBF=$O(^DD(BMXFL,"SB",BMXSB,0)) +"RTN","BMXRPC2",100,0) + . . Q:'+BMXSBF +"RTN","BMXRPC2",101,0) + . . S BMXSBN=$G(^DD(BMXFL,BMXSBF,0)) +"RTN","BMXRPC2",102,0) + . . Q:BMXSBN="" +"RTN","BMXRPC2",103,0) + . . S BMXZ=$G(^DD(BMXSB,.01,0)) +"RTN","BMXRPC2",104,0) + . . Q:$P(BMXZ,U,2)["W" +"RTN","BMXRPC2",105,0) + . . S BMXFOUND=1 +"RTN","BMXRPC2",106,0) + . . S BMXSBN=$P(BMXSBN,U) +"RTN","BMXRPC2",107,0) + . . S BMXTMP($J,I)=BMXSB_U_BMXSBN_$C(30) +"RTN","BMXRPC2",108,0) + . . S I=I+1 +"RTN","BMXRPC2",109,0) + ; +"RTN","BMXRPC2",110,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXRPC2",111,0) + S BMXTMP($J,I)=BMX31_BMXERR +"RTN","BMXRPC2",112,0) + Q +"RTN","BMXRPC3") +0^90^B40379638 +"RTN","BMXRPC3",1,0) +BMXRPC3 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC3",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC3",3,0) + ;Mods by WV/SMH +"RTN","BMXRPC3",4,0) + ;7/26/09 Removed references to ^AUTTSITE, an IHS file in GETFAC* +"RTN","BMXRPC3",5,0) + ; +"RTN","BMXRPC3",6,0) + ; +"RTN","BMXRPC3",7,0) +VARVAL(RESULT,VARIABLE) ;returns value of passed in variable +"RTN","BMXRPC3",8,0) + S VARIABLE=$TR(VARIABLE,"~","^") +"RTN","BMXRPC3",9,0) + S RESULT=VARIABLE ;can do this with the REFERENCE type parameter +"RTN","BMXRPC3",10,0) + Q +"RTN","BMXRPC3",11,0) + ;See GETV^XWBBRK for how we get the REFERENCE type parameter +"RTN","BMXRPC3",12,0) + ; +"RTN","BMXRPC3",13,0) +USER(RESULT,D) ; +"RTN","BMXRPC3",14,0) + ; +"RTN","BMXRPC3",15,0) + I '+D S RESULT="" Q +"RTN","BMXRPC3",16,0) + S RESULT=$P($G(^VA(200,D,0)),"^") +"RTN","BMXRPC3",17,0) + Q +"RTN","BMXRPC3",18,0) + ; +"RTN","BMXRPC3",19,0) +NTUSER(BMXY,BMXNTUSER) ;EP +"RTN","BMXRPC3",20,0) + ;Old code. Retain for reference +"RTN","BMXRPC3",21,0) + ;Returns NTDomain^NTUserName^RPMSName for user having DUZ=D +"RTN","BMXRPC3",22,0) + ;TODO: Move ANMC NT USERS file +"RTN","BMXRPC3",23,0) + ;from AZZWNT to BMX namespace and numberspace +"RTN","BMXRPC3",24,0) + ; +"RTN","BMXRPC3",25,0) + ;N BMX,BMXNOD,BMXDOM,BMXNAM,BMXCOL,BMXRNAM +"RTN","BMXRPC3",26,0) + ;S (BMXDOM,BMXNAM,BMXRNAM)="" +"RTN","BMXRPC3",27,0) + ;S U="^" +"RTN","BMXRPC3",28,0) + ;I '+D S RESULT="" Q +"RTN","BMXRPC3",29,0) + ;S BMXRNAM=$G(^VA(200,D,0)),BMXRNAM=$P(BMXRNAM,U) +"RTN","BMXRPC3",30,0) + ;I '$D(^AZZWNT("DUZ",D)) D NTU1 Q +"RTN","BMXRPC3",31,0) + ;S BMX=$O(^AZZWNT("DUZ",D,0)) +"RTN","BMXRPC3",32,0) + ;I '+BMX D NTU1 Q +"RTN","BMXRPC3",33,0) + ;I '$D(^AZZWNT(BMX,0)) D NTU1 Q +"RTN","BMXRPC3",34,0) + ;S BMXNOD=^AZZWNT(BMX,0) +"RTN","BMXRPC3",35,0) + ;S BMXDOM=$P(BMXNOD,U,2) +"RTN","BMXRPC3",36,0) + ;S BMXNAM=$P(BMXNOD,U) ;,4) +"RTN","BMXRPC3",37,0) + ;D NTU1 +"RTN","BMXRPC3",38,0) + Q +"RTN","BMXRPC3",39,0) + ; +"RTN","BMXRPC3",40,0) + ; +"RTN","BMXRPC3",41,0) +NTUGETD(BMXY,BMXNTNAME) ;EP +"RTN","BMXRPC3",42,0) + ;Entry point for debugging +"RTN","BMXRPC3",43,0) + ; +"RTN","BMXRPC3",44,0) + D DEBUG^%Serenji("NTUGET^BMXRPC3(.BMXY,BMXNTNAME)") +"RTN","BMXRPC3",45,0) + Q +"RTN","BMXRPC3",46,0) + ; +"RTN","BMXRPC3",47,0) +NTUGET(BMXY,BMXNTNAME) ;EP +"RTN","BMXRPC3",48,0) + ; +"RTN","BMXRPC3",49,0) + ;Returns A ENCRYPTED and V ENCRYPTED for NT User BMXNTNAME +"RTN","BMXRPC3",50,0) + ;Called by RPC BMXNetGetCodes +"RTN","BMXRPC3",51,0) + N BMXI,BMXNTID,BMXNTID,BMXNOD,BMXA,BMXV +"RTN","BMXRPC3",52,0) + S BMXI=0 +"RTN","BMXRPC3",53,0) + S BMXY="^BMXTMP("_$J_")" +"RTN","BMXRPC3",54,0) + S X="NTUET^BMXRPC3",@^%ZOSF("TRAP") +"RTN","BMXRPC3",55,0) + S BMXI=BMXI+1 +"RTN","BMXRPC3",56,0) + I BMXNTNAME="" S ^BMXTMP($J,BMXI)="^" Q +"RTN","BMXRPC3",57,0) + S BMXNTID=$O(^BMXUSER("B",BMXNTNAME,0)) +"RTN","BMXRPC3",58,0) + I '+BMXNTID S ^BMXTMP($J,BMXI)="^" Q +"RTN","BMXRPC3",59,0) + S BMXNOD=$G(^BMXUSER(BMXNTID,0)) +"RTN","BMXRPC3",60,0) + S BMXA=$P(BMXNOD,U,2) +"RTN","BMXRPC3",61,0) + S BMXV=$P(BMXNOD,U,3) +"RTN","BMXRPC3",62,0) + S ^BMXTMP($J,BMXI)=BMXA_"^"_BMXV_"^" +"RTN","BMXRPC3",63,0) + Q +"RTN","BMXRPC3",64,0) + ; +"RTN","BMXRPC3",65,0) +WINUGET(BMXWINID) ;EP +"RTN","BMXRPC3",66,0) + ;Returns DUZ for user having Windows Identity BMXWINID +"RTN","BMXRPC3",67,0) + ;Returns 0 if no Windows user found +"RTN","BMXRPC3",68,0) + ; +"RTN","BMXRPC3",69,0) + N BMXIEN,BMXNOD,BMXDUZ +"RTN","BMXRPC3",70,0) + I BMXWINID="" Q 0 +"RTN","BMXRPC3",71,0) + S BMXIEN=$O(^BMXUSER("B",BMXWINID,0)) +"RTN","BMXRPC3",72,0) + I '+BMXIEN Q 0 +"RTN","BMXRPC3",73,0) + S BMXNOD=$G(^BMXUSER(BMXIEN,0)) +"RTN","BMXRPC3",74,0) + S BMXDUZ=$P(BMXNOD,U,2) +"RTN","BMXRPC3",75,0) + Q BMXDUZ +"RTN","BMXRPC3",76,0) + ; +"RTN","BMXRPC3",77,0) +NTUSETD(BMXY,BMXNTNAME) ;EP +"RTN","BMXRPC3",78,0) + ;Entry point for debugging +"RTN","BMXRPC3",79,0) + ; +"RTN","BMXRPC3",80,0) + D DEBUG^%Serenji("NTUSET^BMXRPC3(.BMXY,BMXNTNAME)") +"RTN","BMXRPC3",81,0) + Q +"RTN","BMXRPC3",82,0) + ; +"RTN","BMXRPC3",83,0) +NTUSET(BMXY,BMXNTNAME) ;EP +"RTN","BMXRPC3",84,0) + ;Sets NEW PERSON map entry for Windows Identity BMXNTNAME +"RTN","BMXRPC3",85,0) + ;Returns ERRORID 0 if all ok +"RTN","BMXRPC3",86,0) + ;Called by RPC BMXNetSetUser +"RTN","BMXRPC3",87,0) + ; +"RTN","BMXRPC3",88,0) + ; +"RTN","BMXRPC3",89,0) + N BMXI,BMXNTID,BMXFDA,BMXF,BMXIEN,BMXMSG,BMXAPPTID +"RTN","BMXRPC3",90,0) + S BMXI=0 +"RTN","BMXRPC3",91,0) + S BMXY="^BMXTMP("_$J_")" +"RTN","BMXRPC3",92,0) + S X="NTUET^BMXRPC3",@^%ZOSF("TRAP") +"RTN","BMXRPC3",93,0) + S BMXI=BMXI+1 +"RTN","BMXRPC3",94,0) + ; Quit with error if no DUZ exists +"RTN","BMXRPC3",95,0) + I '+$G(DUZ) D NTUERR(BMXI,500) Q +"RTN","BMXRPC3",96,0) + ; Create entry or file in existing entry in BMX USER +"RTN","BMXRPC3",97,0) + I $D(^BMXUSER("B",BMXNTNAME)) S BMXF="?1," +"RTN","BMXRPC3",98,0) + E S BMXF="+1," +"RTN","BMXRPC3",99,0) + S BMXFDA(90093.1,BMXF,.01)=BMXNTNAME +"RTN","BMXRPC3",100,0) + S BMXFDA(90093.1,BMXF,.02)=$G(DUZ) +"RTN","BMXRPC3",101,0) + K BMXIEN,BMXMSG +"RTN","BMXRPC3",102,0) + D UPDATE^DIE("","BMXFDA","BMXIEN","BMXMSG") +"RTN","BMXRPC3",103,0) + S BMXAPPTID=+$G(BMXIEN(1)) +"RTN","BMXRPC3",104,0) + S BMXI=BMXI+1 +"RTN","BMXRPC3",105,0) + S ^BMXTMP($J,BMXI)=BMXAPPTID_"^0" +"RTN","BMXRPC3",106,0) + Q +"RTN","BMXRPC3",107,0) + ; +"RTN","BMXRPC3",108,0) +NTUET ;EP +"RTN","BMXRPC3",109,0) + ;Error trap from REGEVNT +"RTN","BMXRPC3",110,0) + ; +"RTN","BMXRPC3",111,0) + I '$D(BMXI) N BMXI S BMXI=999 +"RTN","BMXRPC3",112,0) + S BMXI=BMXI+1 +"RTN","BMXRPC3",113,0) + D NTUERR(BMXI,99) +"RTN","BMXRPC3",114,0) + Q +"RTN","BMXRPC3",115,0) + ; +"RTN","BMXRPC3",116,0) +NTUERR(BMXI,BMXERID) ;Error processing +"RTN","BMXRPC3",117,0) + S BMXI=BMXI+1 +"RTN","BMXRPC3",118,0) + S ^BMXTMP($J,BMXI)="^"_BMXERID +"RTN","BMXRPC3",119,0) + Q +"RTN","BMXRPC3",120,0) + ; +"RTN","BMXRPC3",121,0) + ; +"RTN","BMXRPC3",122,0) +NTU1 ;S BMXCOL="T00030NT_DOMAIN^T00030NT_USERNAME^T00030RPMS_USERNAME"_$C(30) +"RTN","BMXRPC3",123,0) + ;S RESULT=BMXCOL_BMXDOM_U_BMXNAM_U_BMXRNAM_$C(30)_$C(31) +"RTN","BMXRPC3",124,0) + Q +"RTN","BMXRPC3",125,0) + ; +"RTN","BMXRPC3",126,0) +GETFC(BMXFACS,DUZ) ;Gets all facilities for a user +"RTN","BMXRPC3",127,0) + ; Input DUZ - user IEN from the NEW PERSON FILE +"RTN","BMXRPC3",128,0) + ; Output - Number of facilities;facility1 name&facility1 IEN;...facilityN&facilityN IEN +"RTN","BMXRPC3",129,0) + N BMXFN,BMXN +"RTN","BMXRPC3",130,0) + S BMXFN=0,BMXFACS="" +"RTN","BMXRPC3",131,0) + F BMXN=1:1 S BMXFN=$O(^VA(200,DUZ,2,BMXFN)) Q:BMXFN="" D +"RTN","BMXRPC3",132,0) + . S:BMXN>1 BMXFACS=BMXFACS_";" S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"&"_BMXFN +"RTN","BMXRPC3",133,0) + ;//smh I BMXN=1 S BMXFN=$P(^AUTTSITE(1,0),U,1) D +"RTN","BMXRPC3",134,0) + ;//smh . S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"&"_BMXFN +"RTN","BMXRPC3",135,0) + S BMXFACS=BMXN-(BMXN>1)_";"_BMXFACS +"RTN","BMXRPC3",136,0) + Q +"RTN","BMXRPC3",137,0) + ; +"RTN","BMXRPC3",138,0) +GETFCRS(BMXFACS,BMXDUZ) ;Gets all facilities for a user - returns RECORDSET +"RTN","BMXRPC3",139,0) + ; +"RTN","BMXRPC3",140,0) + ;TODO: return as global array, add error checking +"RTN","BMXRPC3",141,0) + N BMXFN,BMXN,BMXSUB,BMXRCNT +"RTN","BMXRPC3",142,0) + S BMXDUZ=$TR(BMXDUZ,$C(13),"") +"RTN","BMXRPC3",143,0) + S BMXDUZ=$TR(BMXDUZ,$C(10),"") +"RTN","BMXRPC3",144,0) + S BMXDUZ=$TR(BMXDUZ,$C(9),"") +"RTN","BMXRPC3",145,0) + S BMXFN=0 +"RTN","BMXRPC3",146,0) + S BMXSUB="^VA(200,"_BMXDUZ_",2," +"RTN","BMXRPC3",147,0) + S BMXFACS="T00030FACILITY_NAME^T00030FACILITY_IEN^T00002MOST_RECENT_LOOKUP"_$C(30) +"RTN","BMXRPC3",148,0) + ;F BMXN=1:1 S BMXFN=$O(^VA(200,BMXDUZ,2,BMXFN)) Q:BMXFN="" D +"RTN","BMXRPC3",149,0) + S BMXRCNT=0 ;cmi/maw mod 10/17/2006 +"RTN","BMXRPC3",150,0) + F BMXN=1:1 S BMXFN=$O(^VA(200,BMXDUZ,2,BMXFN)) Q:'BMXFN D ;IHS/ANMC/LJF 8/9/01 +"RTN","BMXRPC3",151,0) + . ;S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"^"_BMXFN_$C(30) +"RTN","BMXRPC3",152,0) + . S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"^"_BMXFN +"RTN","BMXRPC3",153,0) + . ;S BMXRCNT=0 ;cmi/maw orig +"RTN","BMXRPC3",154,0) + . ;I $D(^DISV(BMXDUZ,BMXSUB)),^DISV(BMXDUZ,BMXSUB)=BMXFN S BMXRCNT=1 +"RTN","BMXRPC3",155,0) + . ;I $G(DUZ(2))=BMXFN S BMXRCNT=1 ;cmi/maw orig +"RTN","BMXRPC3",156,0) + . S BMXRCNT=BMXRCNT+1 ;cmi/maw mod +"RTN","BMXRPC3",157,0) + . S BMXFACS=BMXFACS_"^"_BMXRCNT_$C(30) +"RTN","BMXRPC3",158,0) + ;//smh I BMXN=1 S BMXFN=$P(^AUTTSITE(1,0),U,1) D +"RTN","BMXRPC3",159,0) + ;//smh . S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"^"_BMXFN_"^"_1_$C(30) +"RTN","BMXRPC3",160,0) + S BMXFACS=BMXFACS_$C(31) +"RTN","BMXRPC3",161,0) + Q +"RTN","BMXRPC3",162,0) + ; +"RTN","BMXRPC3",163,0) +SETFCRS(BMXY,BMXFAC) ; +"RTN","BMXRPC3",164,0) + ; +"RTN","BMXRPC3",165,0) + ;Sets DUZ(2) to value in BMXFAC +"RTN","BMXRPC3",166,0) + ;Fails if BMXFAC is not one of the current user's divisions +"RTN","BMXRPC3",167,0) + ;Returns Recordset +"RTN","BMXRPC3",168,0) + ; +"RTN","BMXRPC3",169,0) + S X="ERFC^BMXRPC3",@^%ZOSF("TRAP") +"RTN","BMXRPC3",170,0) + S BMXY="T00030DUZ^T00030FACILITY_IEN^T00030FACILITY_NAME"_$C(30) +"RTN","BMXRPC3",171,0) + N BMXSUB,BMXFACN +"RTN","BMXRPC3",172,0) + I '+DUZ S BMXY=BMXY_0_"^"_0_"^"_0_$C(30)_$C(31) Q +"RTN","BMXRPC3",173,0) + I '+BMXFAC S BMXY=BMXY_DUZ_"^"_0_"^"_0_$C(30)_$C(31) Q +"RTN","BMXRPC3",174,0) + I '$D(^VA(200,DUZ,2,+BMXFAC)) S BMXY=BMXY_DUZ_"^"_0_"^"_0_$C(30)_$C(31) Q +"RTN","BMXRPC3",175,0) + S DUZ(2)=BMXFAC ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXRPC3",176,0) + S BMXFACN=$G(^DIC(4,+DUZ(2),0)) +"RTN","BMXRPC3",177,0) + S BMXFACN=$P(BMXFACN,"^") +"RTN","BMXRPC3",178,0) + S BMXSUB="^VA(200,"_DUZ_",2," +"RTN","BMXRPC3",179,0) + S ^DISV(DUZ,BMXSUB)=BMXFAC +"RTN","BMXRPC3",180,0) + S BMXY=BMXY_DUZ_"^"_BMXFAC_"^"_BMXFACN_$C(30)_$C(31) +"RTN","BMXRPC3",181,0) + Q +"RTN","BMXRPC3",182,0) + ; +"RTN","BMXRPC3",183,0) +ERFC ; +"RTN","BMXRPC3",184,0) + D ^%ZTER +"RTN","BMXRPC3",185,0) + S BMXY=$G(BMXY)_0_"^"_0_$C(30)_$C(31) Q +"RTN","BMXRPC3",186,0) + Q +"RTN","BMXRPC3",187,0) + ; +"RTN","BMXRPC3",188,0) +SETFC(BMXY,BMXFAC) ; +"RTN","BMXRPC3",189,0) + ;Sets DUZ(2) to value in BMXFAC +"RTN","BMXRPC3",190,0) + ;Fails if BMXFAC is not one of the current user's divisions +"RTN","BMXRPC3",191,0) + ;Returns 1 if successful, 0 if failed +"RTN","BMXRPC3",192,0) + ; +"RTN","BMXRPC3",193,0) + S BMXY=0 +"RTN","BMXRPC3",194,0) + N BMXSUB +"RTN","BMXRPC3",195,0) + I '+DUZ S BMXY=0 Q +"RTN","BMXRPC3",196,0) + I '+BMXFAC S BMXY=0 Q +"RTN","BMXRPC3",197,0) + I '$D(^VA(200,DUZ,2,+BMXFAC)) S BMXY=0 Q +"RTN","BMXRPC3",198,0) + S DUZ(2)=BMXFAC ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXRPC3",199,0) + S BMXSUB="^VA(200,"_DUZ_",2," +"RTN","BMXRPC3",200,0) + S ^DISV(DUZ,BMXSUB)=BMXFAC +"RTN","BMXRPC3",201,0) + S BMXY=1 +"RTN","BMXRPC3",202,0) + Q +"RTN","BMXRPC3",203,0) + ; +"RTN","BMXRPC3",204,0) +APSEC(BMXY,BMXKEY) ;EP +"RTN","BMXRPC3",205,0) + ;Return IHSCD_SUCCEEDED (-1) if user has key BMXKEY +"RTN","BMXRPC3",206,0) + ;OR if user has key XUPROGMODE +"RTN","BMXRPC3",207,0) + ;Otherwise, returns IHSCD_FAILED (0) +"RTN","BMXRPC3",208,0) + N BMXIEN,BMXPROG,BMXPKEY +"RTN","BMXRPC3",209,0) + I '$G(DUZ) S BMXY=0 Q +"RTN","BMXRPC3",210,0) + I BMXKEY="" S BMXY=0 Q +"RTN","BMXRPC3",211,0) + ; +"RTN","BMXRPC3",212,0) + ;Test for programmer mode key +"RTN","BMXRPC3",213,0) + S BMXPROG=0 +"RTN","BMXRPC3",214,0) + I $D(^DIC(19.1,"B","XUPROGMODE")) D +"RTN","BMXRPC3",215,0) + . S BMXPKEY=$O(^DIC(19.1,"B","XUPROGMODE",0)) +"RTN","BMXRPC3",216,0) + . I '+BMXPKEY Q +"RTN","BMXRPC3",217,0) + . I '$D(^VA(200,DUZ,51,BMXPKEY,0)) Q +"RTN","BMXRPC3",218,0) + . S BMXPROG=1 +"RTN","BMXRPC3",219,0) + I BMXPROG S BMXY=-1 Q +"RTN","BMXRPC3",220,0) + ; +"RTN","BMXRPC3",221,0) + I '$D(^DIC(19.1,"B",BMXKEY)) S BMXY=0 Q +"RTN","BMXRPC3",222,0) + S BMXIEN=$O(^DIC(19.1,"B",BMXKEY,0)) +"RTN","BMXRPC3",223,0) + I '+BMXIEN S BMXY=0 Q +"RTN","BMXRPC3",224,0) + I '$D(^VA(200,DUZ,51,BMXIEN,0)) S BMXY=0 Q +"RTN","BMXRPC3",225,0) + S BMXY=-1 +"RTN","BMXRPC3",226,0) + Q +"RTN","BMXRPC3",227,0) + ; +"RTN","BMXRPC3",228,0) +SIGCHK(BMXY,BMXSIG) ;EP +"RTN","BMXRPC3",229,0) + ;Checks BMXSIG against hashed value in NEW PERSON +"RTN","BMXRPC3",230,0) + ;Return IHSCD_SUCCEEDED (-1) if BMXSIG matches +"RTN","BMXRPC3",231,0) + ;Otherwise, returns IHSCD_FAILED (0) +"RTN","BMXRPC3",232,0) + N X +"RTN","BMXRPC3",233,0) + S BMXY=0 +"RTN","BMXRPC3",234,0) + I '$G(DUZ) Q +"RTN","BMXRPC3",235,0) + I '$D(^VA(200,DUZ,20)) Q ;TODO What if no signature? +"RTN","BMXRPC3",236,0) + S BMXHSH=$P(^VA(200,DUZ,20),U,4) +"RTN","BMXRPC3",237,0) + S X=$G(BMXSIG) +"RTN","BMXRPC3",238,0) + D HASH^XUSHSHP +"RTN","BMXRPC3",239,0) + I X=BMXHSH S BMXY=-1 +"RTN","BMXRPC3",240,0) + Q +"RTN","BMXRPC4") +0^91^B28124037 +"RTN","BMXRPC4",1,0) +BMXRPC4 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC4",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC4",3,0) + ; +"RTN","BMXRPC4",4,0) +PTINFORS(BMXY,BMXIEN) ;EP Patient Info Recordset +"RTN","BMXRPC4",5,0) + ; +"RTN","BMXRPC4",6,0) + N BMXDPT,BMXZ,BMXDLIM,BMXXX,BMXRET,BMXAGE,BMXNEXT,BMXSEX,BMXERR,BMXHRN +"RTN","BMXRPC4",7,0) + S BMXDLIM="^",BMXERR="" +"RTN","BMXRPC4",8,0) + S BMXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN^T00020AGE^T00080NEXT_APPT^T00010SEX"_$C(30) +"RTN","BMXRPC4",9,0) + I '$D(DUZ(2)) S BMXY=BMXRET_$C(31)_"No DUZ2" Q +"RTN","BMXRPC4",10,0) + I +$G(DUZ) D +"RTN","BMXRPC4",11,0) + . S ^DISV(DUZ,"^AUPNPAT(")=BMXIEN +"RTN","BMXRPC4",12,0) + . S ^DISV(DUZ,"^DPT(")=BMXIEN +"RTN","BMXRPC4",13,0) + I '$D(^DPT(BMXIEN)) S BMXY=BMXRET_$C(31)_"No such patient" Q +"RTN","BMXRPC4",14,0) + S BMXDPT=$G(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",15,0) + S BMXZ=$P(BMXDPT,U) ;NAME +"RTN","BMXRPC4",16,0) + ;S $P(BMXZ,BMXDLIM,2)=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART +"RTN","BMXRPC4",17,0) + S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART +"RTN","BMXRPC4",18,0) + ;I BMXHRN="" Q ;NO CHART AT THIS DUZ2 +"RTN","BMXRPC4",19,0) + I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" +"RTN","BMXRPC4",20,0) + S $P(BMXZ,BMXDLIM,2)=BMXHRN +"RTN","BMXRPC4",21,0) + ; +"RTN","BMXRPC4",22,0) + S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN +"RTN","BMXRPC4",23,0) + S Y=$P(BMXDPT,U,3) X ^DD("DD") +"RTN","BMXRPC4",24,0) + S $P(BMXZ,BMXDLIM,4)=Y ;DOB +"RTN","BMXRPC4",25,0) + S $P(BMXZ,BMXDLIM,5)=BMXIEN +"RTN","BMXRPC4",26,0) + S BMXAGE=$$AGEF^BMXUTL1(BMXIEN) +"RTN","BMXRPC4",27,0) + S $P(BMXZ,BMXDLIM,6)=BMXAGE +"RTN","BMXRPC4",28,0) + S BMXNEXT=$$NEXTAPPT^BMXUTL2(BMXIEN) +"RTN","BMXRPC4",29,0) + S $P(BMXZ,BMXDLIM,7)=BMXNEXT +"RTN","BMXRPC4",30,0) + S BMXSEX=$$SEXW^BMXUTL1(BMXIEN) +"RTN","BMXRPC4",31,0) + S $P(BMXZ,BMXDLIM,8)=BMXSEX +"RTN","BMXRPC4",32,0) + S BMXRET=BMXRET_BMXZ +"RTN","BMXRPC4",33,0) + S BMXY=BMXRET_$C(30)_$C(31)_BMXERR +"RTN","BMXRPC4",34,0) + Q +"RTN","BMXRPC4",35,0) + ; +"RTN","BMXRPC4",36,0) +PTLOOKRS(BMXY,BMXP,BMXC) ;EP Patient Lookup +"RTN","BMXRPC4",37,0) + ; +"RTN","BMXRPC4",38,0) + ;Find up to BMXC patients matching BMXP* +"RTN","BMXRPC4",39,0) + ;Supports DOB Lookup, SSN Lookup +"RTN","BMXRPC4",40,0) + ; +"RTN","BMXRPC4",41,0) + ;S ^HW("PTLOOK","INPUT")=BMXP +"RTN","BMXRPC4",42,0) + ;S ^HW("PTLOOK","DUZ2")=$G(DUZ(2)) +"RTN","BMXRPC4",43,0) + S BMXP=$TR(BMXP,$C(13),"") +"RTN","BMXRPC4",44,0) + S BMXP=$TR(BMXP,$C(10),"") +"RTN","BMXRPC4",45,0) + S BMXP=$TR(BMXP,$C(9),"") +"RTN","BMXRPC4",46,0) + S:BMXC="" BMXC=10 +"RTN","BMXRPC4",47,0) + N BMXHRN,BMXZ,BMXDLIM,BMXRET +"RTN","BMXRPC4",48,0) + S BMXDLIM="^" +"RTN","BMXRPC4",49,0) + S BMXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN"_$C(30) +"RTN","BMXRPC4",50,0) + I '+$G(DUZ) S BMXY=BMXRET_$C(31) Q +"RTN","BMXRPC4",51,0) + I '$D(DUZ(2)) S BMXY=BMXRET_$C(31) Q +"RTN","BMXRPC4",52,0) +DOB ;DOB Lookup +"RTN","BMXRPC4",53,0) + I +DUZ(2),((BMXP?1.2N1"/"1.2N1"/"1.4N)!(BMXP?1.2N1" "1.2N1" "1.4N)!(BMXP?1.2N1"-"1.2N1"-"1.4N)) D S BMXY=BMXRET_$C(31) Q +"RTN","BMXRPC4",54,0) + . S X=BMXP S %DT="P" D ^%DT S BMXP=Y Q:'+Y +"RTN","BMXRPC4",55,0) + . Q:'$D(^DPT("ADOB",BMXP)) +"RTN","BMXRPC4",56,0) + . S BMXIEN=0,BMXXX=1 F S BMXIEN=$O(^DPT("ADOB",BMXP,BMXIEN)) Q:'+BMXIEN D +"RTN","BMXRPC4",57,0) + . . Q:'$D(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",58,0) + . . S BMXDPT=$G(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",59,0) + . . S BMXZ=$P(BMXDPT,U) ;NAME +"RTN","BMXRPC4",60,0) + . . ;S $P(BMXZ,BMXDLIM,2)=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART +"RTN","BMXRPC4",61,0) + . . S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART +"RTN","BMXRPC4",62,0) + . . I BMXHRN="" Q ;NO CHART AT THIS DUZ2 +"RTN","BMXRPC4",63,0) + . . I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" +"RTN","BMXRPC4",64,0) + . . S $P(BMXZ,BMXDLIM,2)=BMXHRN +"RTN","BMXRPC4",65,0) + . . ; +"RTN","BMXRPC4",66,0) + . . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN +"RTN","BMXRPC4",67,0) + . . S Y=$P(BMXDPT,U,3) X ^DD("DD") +"RTN","BMXRPC4",68,0) + . . S $P(BMXZ,BMXDLIM,4)=Y ;DOB +"RTN","BMXRPC4",69,0) + . . S $P(BMXZ,BMXDLIM,5)=BMXIEN +"RTN","BMXRPC4",70,0) + . . S BMXXX=BMXXX+1 +"RTN","BMXRPC4",71,0) + . . ;S $P(BMXRET,$C(30),BMXXX)=BMXZ +"RTN","BMXRPC4",72,0) + . . S BMXRET=BMXRET_BMXZ_$C(30) +"RTN","BMXRPC4",73,0) + . . Q +"RTN","BMXRPC4",74,0) + . Q +"RTN","BMXRPC4",75,0) + ; +"RTN","BMXRPC4",76,0) + ;Chart# Lookup +"RTN","BMXRPC4",77,0) + I +DUZ(2),BMXP]"",$D(^AUPNPAT("D",BMXP)) D S BMXY=BMXRET_$C(30)_$C(31) Q +"RTN","BMXRPC4",78,0) + . S BMXIEN=0 F S BMXIEN=$O(^AUPNPAT("D",BMXP,BMXIEN)) Q:'+BMXIEN I $D(^AUPNPAT("D",BMXP,BMXIEN,DUZ(2))) D Q +"RTN","BMXRPC4",79,0) + . . Q:'$D(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",80,0) + . . S BMXDPT=$G(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",81,0) + . . S BMXZ=$P(BMXDPT,U) ;NAME +"RTN","BMXRPC4",82,0) + . . ;S $P(BMXZ,BMXDLIM,2)=BMXP ;CHART +"RTN","BMXRPC4",83,0) + . . S BMXHRN=BMXP ;CHART +"RTN","BMXRPC4",84,0) + . . I $D(^AUPNPAT(BMXIEN,41,DUZ(2),0)),$P(^(0),U,3) S BMXHRN=BMXHRN_"(*)" +"RTN","BMXRPC4",85,0) + . . S $P(BMXZ,BMXDLIM,2)=BMXHRN +"RTN","BMXRPC4",86,0) + . . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN +"RTN","BMXRPC4",87,0) + . . S Y=$P(BMXDPT,U,3) X ^DD("DD") +"RTN","BMXRPC4",88,0) + . . S $P(BMXZ,BMXDLIM,4)=Y ;DOB +"RTN","BMXRPC4",89,0) + . . S $P(BMXZ,BMXDLIM,5)=BMXIEN +"RTN","BMXRPC4",90,0) + . . S $P(BMXRET,$C(30),2)=BMXZ +"RTN","BMXRPC4",91,0) + . . Q +"RTN","BMXRPC4",92,0) + . Q +"RTN","BMXRPC4",93,0) + ; +"RTN","BMXRPC4",94,0) + ;SSN Lookup +"RTN","BMXRPC4",95,0) + I (BMXP?9N)!(BMXP?3N1"-"2N1"-"4N),$D(^DPT("SSN",BMXP)) D S BMXY=BMXRET_$C(30)_$C(31) Q +"RTN","BMXRPC4",96,0) + . S BMXIEN=0 F S BMXIEN=$O(^DPT("SSN",BMXP,BMXIEN)) Q:'+BMXIEN D Q +"RTN","BMXRPC4",97,0) + . . Q:'$D(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",98,0) + . . S BMXDPT=$G(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",99,0) + . . S BMXZ=$P(BMXDPT,U) ;NAME +"RTN","BMXRPC4",100,0) + . . S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART +"RTN","BMXRPC4",101,0) + . . I BMXHRN="" Q ;NO CHART AT THIS DUZ2 +"RTN","BMXRPC4",102,0) + . . I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" +"RTN","BMXRPC4",103,0) + . . S $P(BMXZ,BMXDLIM,2)=BMXHRN +"RTN","BMXRPC4",104,0) + . . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN +"RTN","BMXRPC4",105,0) + . . S Y=$P(BMXDPT,U,3) X ^DD("DD") +"RTN","BMXRPC4",106,0) + . . S $P(BMXZ,BMXDLIM,4)=Y ;DOB +"RTN","BMXRPC4",107,0) + . . S $P(BMXZ,BMXDLIM,5)=BMXIEN +"RTN","BMXRPC4",108,0) + . . S $P(BMXRET,$C(30),2)=BMXZ +"RTN","BMXRPC4",109,0) + . . Q +"RTN","BMXRPC4",110,0) + . Q +"RTN","BMXRPC4",111,0) + ; +"RTN","BMXRPC4",112,0) + S BMXFILE=9000001 +"RTN","BMXRPC4",113,0) + S BMXIENS="" +"RTN","BMXRPC4",114,0) + S BMXFIELDS=".01" +"RTN","BMXRPC4",115,0) + S BMXFLAGS="M" +"RTN","BMXRPC4",116,0) + S BMXVALUE=BMXP +"RTN","BMXRPC4",117,0) + S BMXNUMBER=BMXC +"RTN","BMXRPC4",118,0) + S BMXINDEXES="" +"RTN","BMXRPC4",119,0) + S BMXSCREEN=$S(+DUZ(2):"I $D(^AUPNPAT(Y,41,DUZ(2),0))",1:"") +"RTN","BMXRPC4",120,0) + ;I BMXSCREEN]"" S DIC("S")=BMXSCREEN +"RTN","BMXRPC4",121,0) + ;S BMXSCREEN="I 0" +"RTN","BMXRPC4",122,0) + S BMXIDEN="" +"RTN","BMXRPC4",123,0) + S BMXTARG="BMXRSLT" +"RTN","BMXRPC4",124,0) + S BMXMSG="" +"RTN","BMXRPC4",125,0) + D FIND^DIC(BMXFILE,BMXIENS,BMXFIELDS,BMXFLAGS,BMXVALUE,BMXNUMBER,BMXINDEXES,BMXSCREEN,BMXIDEN,BMXTARG,BMXMSG) +"RTN","BMXRPC4",126,0) + ;S BMXRET="" +"RTN","BMXRPC4",127,0) + ;B +"RTN","BMXRPC4",128,0) + I '+$G(BMXRSLT("DILIST",0)) S BMXY=BMXRET_$C(31) Q +"RTN","BMXRPC4",129,0) + F BMXX=1:1:$P(BMXRSLT("DILIST",0),U) D +"RTN","BMXRPC4",130,0) + . ;B +"RTN","BMXRPC4",131,0) + . S BMXIEN=BMXRSLT("DILIST",2,BMXX) +"RTN","BMXRPC4",132,0) + . S BMXZ=BMXRSLT("DILIST","ID",BMXX,.01) ;NAME +"RTN","BMXRPC4",133,0) + . ;S $P(BMXZ,BMXDLIM,2)=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART +"RTN","BMXRPC4",134,0) + . S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART +"RTN","BMXRPC4",135,0) + . I BMXHRN="" Q ;NO CHART AT THIS DUZ2 +"RTN","BMXRPC4",136,0) + . I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" +"RTN","BMXRPC4",137,0) + . S $P(BMXZ,BMXDLIM,2)=BMXHRN +"RTN","BMXRPC4",138,0) + . S BMXDPT=$G(^DPT(BMXIEN,0)) +"RTN","BMXRPC4",139,0) + . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN +"RTN","BMXRPC4",140,0) + . S Y=$P(BMXDPT,U,3) X ^DD("DD") +"RTN","BMXRPC4",141,0) + . S $P(BMXZ,BMXDLIM,4)=Y ;DOB +"RTN","BMXRPC4",142,0) + . S $P(BMXZ,BMXDLIM,5)=BMXIEN +"RTN","BMXRPC4",143,0) + . S $P(BMXRET,$C(30),BMXX+1)=BMXZ +"RTN","BMXRPC4",144,0) + . Q +"RTN","BMXRPC4",145,0) + ;K BMXRSLT +"RTN","BMXRPC4",146,0) + S BMXY=BMXRET_$C(30)_$C(31) +"RTN","BMXRPC4",147,0) + Q +"RTN","BMXRPC4",148,0) +ZZZ ; +"RTN","BMXRPC5") +0^92^B15030574 +"RTN","BMXRPC5",1,0) +BMXRPC5 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC5",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC5",3,0) + ; +"RTN","BMXRPC5",4,0) + ;Stolen from Mike Remillard. If it doesn't work, it's his fault. +"RTN","BMXRPC5",5,0) +HS(BMXGBL,BMXDFN,BMXTYPE,BMXRDL,BMXFDL) ;EP +"RTN","BMXRPC5",6,0) + ;---> Return patient's Health Summary in global array, ^BMXTEMP($J,"HS" +"RTN","BMXRPC5",7,0) + ;---> Lines delimited by BMXRDL +"RTN","BMXRPC5",8,0) + ;---> File delimited by BMXFDL +"RTN","BMXRPC5",9,0) + ;---> Called by RPC: BMX HEALTH SUMMARY +"RTN","BMXRPC5",10,0) + ;---> Parameters: +"RTN","BMXRPC5",11,0) + ; 1 - BMXGBL (ret) Name of result global containing patient's +"RTN","BMXRPC5",12,0) + ; Health Summary, passed to Broker. +"RTN","BMXRPC5",13,0) + ; 2 - BMXDFN (req) DFN of patient. +"RTN","BMXRPC5",14,0) + ; +"RTN","BMXRPC5",15,0) + ;---> Delimiter to pass error with result to GUI. +"RTN","BMXRPC5",16,0) + N BMX30,BMX31,BMXERR,X +"RTN","BMXRPC5",17,0) + ;S BMX30=$C(30),BMX31=$C(31)_$C(31) +"RTN","BMXRPC5",18,0) + S BMX30=$G(BMXRDL) +"RTN","BMXRPC5",19,0) + I BMX30="" S BMX30=$C(13)_$C(10) +"RTN","BMXRPC5",20,0) + S BMX31=$G(BMXFDL) +"RTN","BMXRPC5",21,0) + S BMXGBL="^BMXTEMP("_$J_",""HS"")",BMXERR="" +"RTN","BMXRPC5",22,0) + K ^BMXTEMP($J,"HS") +"RTN","BMXRPC5",23,0) + ; +"RTN","BMXRPC5",24,0) + N BMXPATH +"RTN","BMXRPC5",25,0) + ;---> Should get path from a Site Parameter. For now, use MSM default. +"RTN","BMXRPC5",26,0) + S BMXPATH="/usr/spool/uucppublic/" +"RTN","BMXRPC5",27,0) + ;S BMXPATH="C:\MSM\" ;TODO: Change to site parameter +"RTN","BMXRPC5",28,0) + ;--->Flag to test whether running as broker job: +"RTN","BMXRPC5",29,0) + N BMXSOCK +"RTN","BMXRPC5",30,0) + S BMXSOCK=0 +"RTN","BMXRPC5",31,0) + ;I $I=56 S BMXSOCK=1 +"RTN","BMXRPC5",32,0) + ; +"RTN","BMXRPC5",33,0) + ;---> If DFN not supplied, set Error Code and quit. +"RTN","BMXRPC5",34,0) + I '$G(BMXDFN) D Q +"RTN","BMXRPC5",35,0) + . S BMXERR="No Patient DFN" S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC5",36,0) + ; +"RTN","BMXRPC5",37,0) + ;---> If patient does not exist, set Error Code and quit. +"RTN","BMXRPC5",38,0) + I '$D(^AUPNPAT(BMXDFN,0)) D Q +"RTN","BMXRPC5",39,0) + . S BMXERR="Patient DFN does not exist" S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC5",40,0) + ; +"RTN","BMXRPC5",41,0) + N APCHSPAT,APCHSTYP +"RTN","BMXRPC5",42,0) + S APCHSPAT=BMXDFN +"RTN","BMXRPC5",43,0) + S APCHSTYP=$G(BMXTYPE) +"RTN","BMXRPC5",44,0) + S:'+APCHSTYP APCHSTYP=7 +"RTN","BMXRPC5",45,0) + ;S APCHSTYP=9 +"RTN","BMXRPC5",46,0) + ;---> Doesn't work from Device 56. +"RTN","BMXRPC5",47,0) + ;D GUIR^XBLM("EN^APCHS","^TMP(""BMXHS"",$J,") +"RTN","BMXRPC5",48,0) + ; +"RTN","BMXRPC5",49,0) + ;---> Generate a host file name. +"RTN","BMXRPC5",50,0) + N BMXFN S BMXFN="XB"_$J +"RTN","BMXRPC5",51,0) + ; +"RTN","BMXRPC5",52,0) + D +"RTN","BMXRPC5",53,0) + .;---> Important to preserve IO variables for when $I returns to 56. +"RTN","BMXRPC5",54,0) + .N IO,IOBS,IOF,IOHG,IOM,ION,IOPAR,IOS,IOSL,IOST,IOT,IOUPAR,IOXY +"RTN","BMXRPC5",55,0) + .; +"RTN","BMXRPC5",56,0) + .;---> Open host file to receive legacy code display. +"RTN","BMXRPC5",57,0) + .S Y=$$OPEN^%ZISH(BMXPATH,BMXFN,"W") +"RTN","BMXRPC5",58,0) + .;O 51:(BMXPATH_BMXFN:"W") +"RTN","BMXRPC5",59,0) + .;S IO=51,IOST="P-OTHER80" +"RTN","BMXRPC5",60,0) + .;K ^HW("HS") +"RTN","BMXRPC5",61,0) + .;S ^HW("HS","IOST")=$G(IOST) +"RTN","BMXRPC5",62,0) + .;S ^HW("HS","IO")=$G(IO) +"RTN","BMXRPC5",63,0) + .; +"RTN","BMXRPC5",64,0) + .;---> Call to legacy code for Health Summary display. +"RTN","BMXRPC5",65,0) + .S IOSL=999,IOM=80 +"RTN","BMXRPC5",66,0) + .D EN^APCHS +"RTN","BMXRPC5",67,0) + .;---> Write End of File (EOF) marker. +"RTN","BMXRPC5",68,0) + .W $C(9) +"RTN","BMXRPC5",69,0) + .; +"RTN","BMXRPC5",70,0) + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? +"RTN","BMXRPC5",71,0) + .;D ^%ZISC +"RTN","BMXRPC5",72,0) + .;---> Buffer won't write out to file until the device is closed +"RTN","BMXRPC5",73,0) + .;---> or the buffer is flushed by some other command. +"RTN","BMXRPC5",74,0) + .;---> At this point, host file exists but has 0 bytes. +"RTN","BMXRPC5",75,0) + .;C 51 +"RTN","BMXRPC5",76,0) + .;---> Now host file contains legacy code display data. +"RTN","BMXRPC5",77,0) + .; +"RTN","BMXRPC5",78,0) + .;---> For some reason %ZISH cannot open the host file a second time. +"RTN","BMXRPC5",79,0) + .;S Y=$$OPEN^%ZISH(BMXPATH,BMXFN,"R") +"RTN","BMXRPC5",80,0) + .;O 51:(BMXPATH_BMXFN:"R") +"RTN","BMXRPC5",81,0) + .U 51 +"RTN","BMXRPC5",82,0) + .; +"RTN","BMXRPC5",83,0) + .;---> Read in the host file. +"RTN","BMXRPC5",84,0) + .D +"RTN","BMXRPC5",85,0) + ..;---> Stop reading Host File if line contains EOF $C(9). +"RTN","BMXRPC5",86,0) + ..;N I,Y F I=1:1 R Y Q:Y[$C(9) S ^TMP("BMXHS",$J,I)=Y +"RTN","BMXRPC5",87,0) + .; +"RTN","BMXRPC5",88,0) + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? +"RTN","BMXRPC5",89,0) + .;D ^%ZISC +"RTN","BMXRPC5",90,0) + .;C 51 +"RTN","BMXRPC5",91,0) + ; +"RTN","BMXRPC5",92,0) + ;---> At this point $I=1. The job has "forgotten" its $I, even +"RTN","BMXRPC5",93,0) + ;---> though %SS shows 56 as the current device. $I=1 causes a +"RTN","BMXRPC5",94,0) + ;---> at CAPI+10^XWBBRK2. A simple USE 56 command +"RTN","BMXRPC5",95,0) + ;---> appears to "remind" the job its $I is 56, and it works. +"RTN","BMXRPC5",96,0) + ;---> Possibly this is something %ZISC ordinarily does. +"RTN","BMXRPC5",97,0) + I BMXSOCK U 56 +"RTN","BMXRPC5",98,0) + ;U 56 +"RTN","BMXRPC5",99,0) + ; +"RTN","BMXRPC5",100,0) + ;---> Copy Health Summary to global array for passing back to GUI. +"RTN","BMXRPC5",101,0) + N I,N,U,X S U="^" +"RTN","BMXRPC5",102,0) + S N=0 +"RTN","BMXRPC5",103,0) + F I=1:1 S N=$O(^TMP("BMXHS",$J,N)) Q:'N D +"RTN","BMXRPC5",104,0) + .;---> Set null lines (line breaks) equal to one space, so that +"RTN","BMXRPC5",105,0) + .;---> Windows reader will quit only at the final "null" line. +"RTN","BMXRPC5",106,0) + .S X=^TMP("BMXHS",$J,N) S:X="" X=" " +"RTN","BMXRPC5",107,0) + .S ^BMXTEMP($J,"HS",I)=X_BMX30 +"RTN","BMXRPC5",108,0) + ; +"RTN","BMXRPC5",109,0) + ;---> If no Health Summary produced, report it as an error. +"RTN","BMXRPC5",110,0) + D:'$O(^BMXTEMP($J,"HS",0)) +"RTN","BMXRPC5",111,0) + . S BMXERR="No Health Summary produced" S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC5",112,0) + ; +"RTN","BMXRPC5",113,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXRPC5",114,0) + S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR +"RTN","BMXRPC5",115,0) + ; +"RTN","BMXRPC5",116,0) + ;---> Delete host file. +"RTN","BMXRPC5",117,0) + ;---> This doesn't work. +"RTN","BMXRPC5",118,0) + S Y=$$DEL^%ZISH(BMXPATH,BMXFN) +"RTN","BMXRPC5",119,0) + ;---> Call system command. +"RTN","BMXRPC5",120,0) + ;S ^MIKE(1)=BMXPATH +"RTN","BMXRPC5",121,0) + ;S ^MIKE(2)=BMXFN +"RTN","BMXRPC5",122,0) + ;S Y=$ZOS(2,BMXPATH_BMXFN) +"RTN","BMXRPC5",123,0) + K ^TMP("BMXHS",$J) +"RTN","BMXRPC5",124,0) + Q +"RTN","BMXRPC6") +0^93^B14693179 +"RTN","BMXRPC6",1,0) +BMXRPC6 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC6",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC6",3,0) + ; +"RTN","BMXRPC6",4,0) + ; +"RTN","BMXRPC6",5,0) +USRKEYRS(BMXY,BMXDUZ) ;EP - Returns recordset of user's keys +"RTN","BMXRPC6",6,0) + ; +"RTN","BMXRPC6",7,0) + N BMXDPT,BMXZ,BMXDLIM,BMXXX,BMXRET,BMXAGE,BMXNEXT,BMXSEX,BMXERR +"RTN","BMXRPC6",8,0) + S BMXDLIM="^",BMXERR="" +"RTN","BMXRPC6",9,0) + S BMXRET="T00050KEY"_$C(30) +"RTN","BMXRPC6",10,0) + I '$D(DUZ(2)) S BMXY=BMXRET_$C(31)_"No DUZ2" Q +"RTN","BMXRPC6",11,0) + ;Strip CRLFs from parameter +"RTN","BMXRPC6",12,0) + S BMXCRLF=$C(13)_$C(10) +"RTN","BMXRPC6",13,0) + S BMXDUZ=$TR(BMXDUZ,BMXCRLF,"") +"RTN","BMXRPC6",14,0) + I '$D(^VA(200,BMXDUZ)) S BMXY=BMXRET_$C(31)_"No such user" Q +"RTN","BMXRPC6",15,0) + S BMXK=0 F S BMXK=$O(^VA(200,BMXDUZ,51,BMXK)) Q:'+BMXK D +"RTN","BMXRPC6",16,0) + . S BMXKEY=$G(^VA(200,BMXDUZ,51,BMXK,0)) +"RTN","BMXRPC6",17,0) + . Q:BMXKEY="" +"RTN","BMXRPC6",18,0) + . S BMXKEY=$P(BMXKEY,BMXDLIM) +"RTN","BMXRPC6",19,0) + . Q:'+BMXKEY +"RTN","BMXRPC6",20,0) + . Q:'$D(^DIC(19.1,BMXKEY,0)) +"RTN","BMXRPC6",21,0) + . S BMXKEY=$P(^DIC(19.1,BMXKEY,0),BMXDLIM) +"RTN","BMXRPC6",22,0) + . Q:BMXKEY']"" +"RTN","BMXRPC6",23,0) + . S BMXRET=BMXRET_BMXKEY_$C(30) +"RTN","BMXRPC6",24,0) + S BMXY=BMXRET_$C(30)_$C(31)_BMXERR +"RTN","BMXRPC6",25,0) + Q +"RTN","BMXRPC6",26,0) + ; +"RTN","BMXRPC6",27,0) +PDATA(BMXY,BMXP) ;-EP Returns patient demographics for pt with +"RTN","BMXRPC6",28,0) + ;health record number BMXP at the current DUZ(2) +"RTN","BMXRPC6",29,0) + N BMXIEN,BMXDUZ2,BMXSQL +"RTN","BMXRPC6",30,0) + ;Strip CR, LF, TAB, SPACE +"RTN","BMXRPC6",31,0) + S BMXP=$TR(BMXP,$C(13),"") +"RTN","BMXRPC6",32,0) + S BMXP=$TR(BMXP,$C(10),"") +"RTN","BMXRPC6",33,0) + S BMXP=$TR(BMXP,$C(9),"") +"RTN","BMXRPC6",34,0) + S BMXP=$TR(BMXP,$C(32),"") +"RTN","BMXRPC6",35,0) + S BMXDUZ2=$G(DUZ(2)),BMXDUZ2=+BMXDUZ2 +"RTN","BMXRPC6",36,0) + S BMXIEN=0 +"RTN","BMXRPC6",37,0) + I +BMXDUZ2 F S BMXIEN=$O(^AUPNPAT("D",BMXP,BMXIEN)) Q:'+BMXIEN I $D(^AUPNPAT("D",BMXP,BMXIEN,BMXDUZ2)) Q +"RTN","BMXRPC6",38,0) + S BMXSQL="SELECT NAME 'Name', DOB 'DateOfBirth', TRIBE_OF_MEMBERSHIP 'Tribe', MAILING_ADDRESS-STREET 'Street'," +"RTN","BMXRPC6",39,0) + S BMXSQL=BMXSQL_" MAILING_ADDRESS-CITY 'City', MAILING_ADDRESS-STATE 'State', MAILING_ADDRESS-ZIP 'Zip', HOME_PHONE 'HomePhone', OFFICE_PHONE 'WorkPhone' FROM PATIENT WHERE BMXIEN='"_+BMXIEN_"'" +"RTN","BMXRPC6",40,0) + D SQL^BMXSQL(.BMXY,BMXSQL) +"RTN","BMXRPC6",41,0) + S @BMXY@(.5)="T00015Chart^" +"RTN","BMXRPC6",42,0) + I $D(@BMXY@(10)) S @BMXY@(10)=BMXP_"^"_@BMXY@(10) +"RTN","BMXRPC6",43,0) + ; +"RTN","BMXRPC6",44,0) + Q +"RTN","BMXRPC6",45,0) + ; +"RTN","BMXRPC6",46,0) +PDEMOD(BMXY,BMXPAT,BMXCOUNT) ;EP +"RTN","BMXRPC6",47,0) + ;Entry point for Serenji debugging +"RTN","BMXRPC6",48,0) + ; +"RTN","BMXRPC6",49,0) + D DEBUG^%Serenji("PDEMO^BMXRPC6(.BMXY,BMXPAT,BMXCOUNT)") +"RTN","BMXRPC6",50,0) + Q +"RTN","BMXRPC6",51,0) + ; +"RTN","BMXRPC6",52,0) +PDEMO(BMXY,BMXPAT,BMXCOUNT) ;EP +"RTN","BMXRPC6",53,0) + ;This simple RPC demonstrates how to format data +"RTN","BMXRPC6",54,0) + ;for the BMXNet ADO.NET data provider +"RTN","BMXRPC6",55,0) + ; +"RTN","BMXRPC6",56,0) + ;Returns a maximum of BMXCOUNT records from the +"RTN","BMXRPC6",57,0) + ;VA PATIENT file whose names begin with BMXPAT +"RTN","BMXRPC6",58,0) + ; +"RTN","BMXRPC6",59,0) + N BMXI,BMXD,BMXC,BMXNODE,BMXDOB +"RTN","BMXRPC6",60,0) + ; +"RTN","BMXRPC6",61,0) + ;When the VA BROKER calls this routine, BMXY is passed by reference +"RTN","BMXRPC6",62,0) + ;We set BMXY to the value of the variable in which we will return +"RTN","BMXRPC6",63,0) + ;our data: +"RTN","BMXRPC6",64,0) + ;S BMXY="^TMP(""BMX"","_$J_")" +"RTN","BMXRPC6",65,0) + N BMXUID +"RTN","BMXRPC6",66,0) + S BMXUID=$S($G(ZTSK):"Z"_ZTSK,1:$J) +"RTN","BMXRPC6",67,0) + S BMXY=$NA(^BMXTMP("BMXTEST",BMXUID)) +"RTN","BMXRPC6",68,0) + K ^BMXTMP("BMXTEST",BMXUID) +"RTN","BMXRPC6",69,0) + ; +"RTN","BMXRPC6",70,0) + ;The first subnode of the data global contains the column header information +"RTN","BMXRPC6",71,0) + ;in the form "TxxxxxCOLUMN1NAME^txxxxxCOLUMN2NAME"_$C(30) +"RTN","BMXRPC6",72,0) + ;where T is the column data type and can be either T for text, I for numeric or D for date/time. +"RTN","BMXRPC6",73,0) + ;xxxxx is the length of the column in characters: +"RTN","BMXRPC6",74,0) + ; +"RTN","BMXRPC6",75,0) + S BMXI=0,BMXC=0 +"RTN","BMXRPC6",76,0) + S ^BMXTMP("BMXTEST",BMXUID,BMXI)="T00030NAME^T00010SEX^D00020DOB"_$C(30) +"RTN","BMXRPC6",77,0) + ; +"RTN","BMXRPC6",78,0) + ;You MUST set an error trap: +"RTN","BMXRPC6",79,0) + S X="PDERR^BMXRPC6",@^%ZOSF("TRAP") +"RTN","BMXRPC6",80,0) + ; +"RTN","BMXRPC6",81,0) + ;Strip CR, LF, TAB, SPACE from BMXCOUNT parameter +"RTN","BMXRPC6",82,0) + S BMXCOUNT=$TR(BMXCOUNT,$C(13),"") +"RTN","BMXRPC6",83,0) + S BMXCOUNT=$TR(BMXCOUNT,$C(10),"") +"RTN","BMXRPC6",84,0) + S BMXCOUNT=$TR(BMXCOUNT,$C(9),"") +"RTN","BMXRPC6",85,0) + S BMXCOUNT=$TR(BMXCOUNT,$C(32),"") +"RTN","BMXRPC6",86,0) + ; +"RTN","BMXRPC6",87,0) + ;Iterate through the global and set the data nodes: +"RTN","BMXRPC6",88,0) + S:BMXPAT="" BMXPAT="A" +"RTN","BMXRPC6",89,0) + S BMXPAT=$O(^DPT("B",BMXPAT),-1) +"RTN","BMXRPC6",90,0) + S BMXD=0 +"RTN","BMXRPC6",91,0) + F S BMXPAT=$O(^DPT("B",BMXPAT)) Q:BMXPAT="" S BMXD=$O(^DPT("B",BMXPAT,0)) I +BMXD S BMXC=BMXC+1 Q:(BMXCOUNT)&(BMXC>BMXCOUNT) D +"RTN","BMXRPC6",92,0) + . Q:'$D(^DPT(BMXD,0)) +"RTN","BMXRPC6",93,0) + . S BMXI=BMXI+1 +"RTN","BMXRPC6",94,0) + . S BMXNODE=^DPT(BMXD,0) +"RTN","BMXRPC6",95,0) + . ;Convert the DOB from FM date +"RTN","BMXRPC6",96,0) + . S Y=$P(BMXNODE,U,3) +"RTN","BMXRPC6",97,0) + . I +Y X ^DD("DD") +"RTN","BMXRPC6",98,0) + . S BMXDOB=Y +"RTN","BMXRPC6",99,0) + . ;The data node fields are in the same order as the column header, i.e. NAME^SEX^DOB +"RTN","BMXRPC6",100,0) + . ;and terminated with a $C(30) +"RTN","BMXRPC6",101,0) + . S ^BMXTMP("BMXTEST",BMXUID,BMXI)=$P(BMXNODE,U)_U_$P(BMXNODE,U,2)_U_BMXDOB_$C(30) +"RTN","BMXRPC6",102,0) + ; +"RTN","BMXRPC6",103,0) + ;After all the data nodes have been set, set the final node to $C(31) to indicate +"RTN","BMXRPC6",104,0) + ;the end of the recordset +"RTN","BMXRPC6",105,0) + S BMXI=BMXI+1 +"RTN","BMXRPC6",106,0) + S ^BMXTMP("BMXTEST",BMXUID,BMXI)=$C(31) +"RTN","BMXRPC6",107,0) + Q +"RTN","BMXRPC6",108,0) + ; +"RTN","BMXRPC6",109,0) +PDERR ;Error trap for PDEMO +"RTN","BMXRPC6",110,0) + ; +"RTN","BMXRPC6",111,0) + S ^BMXTMP("BMXTEST",BMXUID,BMXI+1)=$C(31) +"RTN","BMXRPC6",112,0) + Q +"RTN","BMXRPC7") +0^94^B40496291 +"RTN","BMXRPC7",1,0) +BMXRPC7 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC7",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC7",3,0) + ; +"RTN","BMXRPC7",4,0) + ; +"RTN","BMXRPC7",5,0) +WINVAL(BMXRET,BMXWINID) ;EP +"RTN","BMXRPC7",6,0) + ;Validates user based on Windows Identity +"RTN","BMXRPC7",7,0) + ; +"RTN","BMXRPC7",8,0) + ;Return R(0)=DUZ, R(1)=(0=OK, 1,2...=Can't sign-on for some reason) +"RTN","BMXRPC7",9,0) + ; R(2)=verify needs changing, R(3)=Message, R(4)=0, R(5)=msg cnt, R(5+n) +"RTN","BMXRPC7",10,0) + ; R(R(5)+6)=# div user must select from, R(R(5)+6+n)=div +"RTN","BMXRPC7",11,0) + I $$NEWERR^%ZTER N $ETRAP S $ETRAP="" +"RTN","BMXRPC7",12,0) + N X,BMXUSER,BMXUNOW,BMXUM,BMXUMSG,BMXVCOK K DUZ +"RTN","BMXRPC7",13,0) + S BMXRET(0)=0,BMXRET(5)=0,BMXUM=0,BMXUMSG=0 +"RTN","BMXRPC7",14,0) + S DUZ=0,DUZ(0)="",BMXVCOK=0 D NOW ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXRPC7",15,0) + S BMXUMSG=$$INHIBIT() I BMXUMSG S BMXUM=1 G VAX ;Logon inhibited +"RTN","BMXRPC7",16,0) + ; +"RTN","BMXRPC7",17,0) + S DUZ=$$WINUGET^BMXRPC3(BMXWINID) ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXRPC7",18,0) + I DUZ>0 D USER(DUZ) +"RTN","BMXRPC7",19,0) + S BMXUMSG=$$UVALID() G:BMXUMSG VAX +"RTN","BMXRPC7",20,0) + I DUZ>0 S BMXUMSG=$$POST(1) +"RTN","BMXRPC7",21,0) +VAX S:BMXUMSG>0 DUZ=0 D:DUZ>0 POST2 +"RTN","BMXRPC7",22,0) + S BMXRET(0)=DUZ,BMXRET(1)=BMXUM,BMXRET(2)=BMXVCOK,BMXRET(3)=$S(BMXUMSG:$$TXT(BMXUMSG),1:""),BMXRET(4)=0 +"RTN","BMXRPC7",23,0) + Q +"RTN","BMXRPC7",24,0) + ; +"RTN","BMXRPC7",25,0) +NOW S U="^",BMXUNOW=$$NOW^XLFDT(),DT=$P(BMXUNOW,".") +"RTN","BMXRPC7",26,0) + Q +"RTN","BMXRPC7",27,0) + ; +"RTN","BMXRPC7",28,0) +USER(IX) ;Build USER +"RTN","BMXRPC7",29,0) + S BMXUSER(0)=$G(^VA(200,+IX,0)),BMXUSER(1)=$G(^(.1)) +"RTN","BMXRPC7",30,0) + Q +"RTN","BMXRPC7",31,0) + ; +"RTN","BMXRPC7",32,0) +POST(CVC) ;Finish setup partition, I CVC don't log get +"RTN","BMXRPC7",33,0) + N X,BMXUM +"RTN","BMXRPC7",34,0) + K ^UTILITY($J),^TMP($J) +"RTN","BMXRPC7",35,0) + I '$D(USER(0)),DUZ D USER(DUZ) +"RTN","BMXRPC7",36,0) + S BMXUM=$$USER1A Q:BMXUM>0 BMXUM ;User can't sign on for some reason. +"RTN","BMXRPC7",37,0) + S BMXRET(5)=0 ;The next line sends the post sign-on msg +"RTN","BMXRPC7",38,0) + F BMXPT=1:1 Q:'$D(BMXUTEXT(BMXPT)) S BMXRET(5+BMXPT)=$E(BMXUTEXT(BMXPT),2,256),BMXRET(5)=BMXPT +"RTN","BMXRPC7",39,0) + S BMXRET(5)=0 ;This line stops the display of the msg. Remove this line to allow. +"RTN","BMXRPC7",40,0) + D:'$G(CVC) POST2 +"RTN","BMXRPC7",41,0) + Q 0 +"RTN","BMXRPC7",42,0) +POST2 D:'$D(BMXUNOW) NOW +"RTN","BMXRPC7",43,0) + D DUZ ;^XUS1A ;,SAVE^XUS1,LOG^XUS1,ABT^XQ12 +"RTN","BMXRPC7",44,0) + K BMXUTEXT,BMXOPT,BMXUER ;XUEON,XUEOFF,XUTT +"RTN","BMXRPC7",45,0) + Q +"RTN","BMXRPC7",46,0) + ; +"RTN","BMXRPC7",47,0) +DUZ ;Setup DUZ. SAC exemption applied for. +"RTN","BMXRPC7",48,0) + S:'$D(BMXUSER(0)) BMXUSER(0)=^VA(200,DUZ,0) D:$D(BMXOPT)[0 BMXOPT +"RTN","BMXRPC7",49,0) + S DUZ(0)=$P(BMXUSER(0),U,4),DUZ(1)="",DUZ("AUTO")=$P(BMXOPT,"^",6) ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXRPC7",50,0) + S DUZ(2)=$S($G(DUZ(2))>0:DUZ(2),1:+$P(BMXOPT,U,17)) ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXRPC7",51,0) + S X=$P($G(^DIC(4,DUZ(2),99)),U,5),DUZ("AG")=$S(X]"":X,1:$P(^XTV(8989.3,1,0),U,8)) +"RTN","BMXRPC7",52,0) + S DUZ("BUF")=($P(BMXOPT,U,9)="Y"),DUZ("LANG")=$P(BMXOPT,U,7) ;IHS/OIT/HMW SAC Exemption Applied For +"RTN","BMXRPC7",53,0) + Q +"RTN","BMXRPC7",54,0) + ; +"RTN","BMXRPC7",55,0) +USER1A() ; +"RTN","BMXRPC7",56,0) + N BMXPTB,BMXPTE,BMXPTT +"RTN","BMXRPC7",57,0) + S BMXUTEXT=0,DUZ(2)=0 +"RTN","BMXRPC7",58,0) + F I=0:0 S I=$O(^XTV(8989.3,1,"POST",I)) Q:I'>0 D SET("!"_$G(^(I,0))) +"RTN","BMXRPC7",59,0) + D SET("!"),BMXOPT +"RTN","BMXRPC7",60,0) + S BMXPTH=$P($H,",",2) +"RTN","BMXRPC7",61,0) + D SET("!Good "_$S(BMXPTH<43200:"morning ",BMXPTH<61200:"afternoon ",1:"evening ")_$S($P(BMXUSER(1),U,4)]"":$P(BMXUSER(1),U,4),1:$P(BMXUSER(0),U,1))) +"RTN","BMXRPC7",62,0) + S BMXI1=$G(^VA(200,DUZ,1.1)),X=(+BMXI1_"0000") +"RTN","BMXRPC7",63,0) + I X D SET("! You last signed on "_$S(X\1=DT:"today",X\1+1=DT:"yesterday",1:$$DD(X))_" at "_$E(X,9,10)_":"_$E(X,11,12)) +"RTN","BMXRPC7",64,0) + I $P(BMXI1,"^",2) S I=$P(BMXI1,"^",2) D SET("!There "_$S(I>1:"were ",1:"was ")_I_" unsuccessful attempt"_$S(I>1:"s",1:"")_" since you last signed on.") +"RTN","BMXRPC7",65,0) + I $P(BMXUSER(0),U,12),$$PROHIBIT(BMXPTH,$P(BMXUSER(0),U,12)) Q 17 ;Time frame +"RTN","BMXRPC7",66,0) + I +$P(BMXOPT,U,15) S BMXPT=$P(BMXOPT,U,15)-($H-BMXUSER(1)) I BMXPT<6,BMXPT>0 D SET("! Your Verify code will expire in "_BMXPT_" days") +"RTN","BMXRPC7",67,0) + S:$P(BMXOPT,"^",5) XUTT=1 S:'$D(DTIME) DTIME=$P(BMXOPT,U,10) +"RTN","BMXRPC7",68,0) + I ('X)!$P(BMXOPT,U,4) Q 0 +"RTN","BMXRPC7",69,0) + Q 9 +"RTN","BMXRPC7",70,0) + ; +"RTN","BMXRPC7",71,0) +BMXOPT ;Build the BMXOPT string +"RTN","BMXRPC7",72,0) + N X,I +"RTN","BMXRPC7",73,0) + S:'$D(BMXOPT) BMXOPT=$G(^XTV(8989.3,1,"XUS")) +"RTN","BMXRPC7",74,0) + S X=$G(^VA(200,DUZ,200)) +"RTN","BMXRPC7",75,0) + F I=4:1:7,9,10 I $P(X,U,I)]"" S $P(BMXOPT,"^",I)=$P(X,U,I) +"RTN","BMXRPC7",76,0) + Q +"RTN","BMXRPC7",77,0) + ; +"RTN","BMXRPC7",78,0) +SET(V) ;Set into BMXUTEXT(BMXUTEXT) +"RTN","BMXRPC7",79,0) + S BMXUTEXT=$G(BMXUTEXT)+1,BMXUTEXT(BMXUTEXT)=V +"RTN","BMXRPC7",80,0) + Q +"RTN","BMXRPC7",81,0) + ; +"RTN","BMXRPC7",82,0) +PROHIBIT(BMXPTT,BMXPTR) ;See if a prohibited time, (Current time, restrict range) +"RTN","BMXRPC7",83,0) + N XMSG,BMXPTB,BMXPTE +"RTN","BMXRPC7",84,0) + S BMXPTT=BMXPTT\60#60+(BMXPTT\3600*100),BMXPTB=$P(BMXPTR,"-",1),BMXPTE=$P(BMXPTR,"-",2) +"RTN","BMXRPC7",85,0) + S XMSG=$P($$FMTE^XLFDT(DT_"."_BMXPTB,"2P")," ",2,3)_" thru "_$P($$FMTE^XLFDT(DT_"."_BMXPTE,"2P")," ",2,3) +"RTN","BMXRPC7",86,0) + I $S(BMXPTE'BMXPTE&(BMXPTT'BMXPTB!(BMXPTT0:^XTV(8989.3,1,4,X,0),1:BMXQVOL_"^y^1") S:$P(BMXVOL,U,6)="y" XRTL=BMXCI_","_BMXQVOL +"RTN","BMXRPC7",95,0) + ;I '$D(BMXQVOL) Q 0 +"RTN","BMXRPC7",96,0) + ;I '$D(BMXVOL) Q 0 +"RTN","BMXRPC7",97,0) + I $G(^%ZIS(14.5,"LOGON",BMXQVOL)) Q 1 +"RTN","BMXRPC7",98,0) + I $D(^%ZOSF("ACTJ")) X ^("ACTJ") I $P(BMXVOL,U,3),($P(BMXVOL,U,3)'>Y) Q 2 +"RTN","BMXRPC7",99,0) + Q 0 +"RTN","BMXRPC7",100,0) + ; +"RTN","BMXRPC7",101,0) + ; +"RTN","BMXRPC7",102,0) +UVALID() ;EF. Is it valid for this user to sign on? +"RTN","BMXRPC7",103,0) + I '+$G(BMXWIN) Q 18 +"RTN","BMXRPC7",104,0) + I DUZ'>0 Q 4 +"RTN","BMXRPC7",105,0) + I $P(BMXUSER(0),U,11),$P(BMXUSER(0),U,11)'>DT Q 11 ;Access Terminated +"RTN","BMXRPC7",106,0) + I $P(BMXUSER(0),U,7) Q 5 ;Disuser flag set +"RTN","BMXRPC7",107,0) + Q 0 +"RTN","BMXRPC7",108,0) + ; +"RTN","BMXRPC7",109,0) +DD(Y) Q $S($E(Y,4,5):$P("Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec","^",+$E(Y,4,5))_" ",1:"")_$S($E(Y,6,7):+$E(Y,6,7)_",",1:"")_($E(Y,1,3)+1700) +"RTN","BMXRPC7",110,0) + Q +"RTN","BMXRPC7",111,0) + ; +"RTN","BMXRPC7",112,0) +TXT(BMXPT) ; +"RTN","BMXRPC7",113,0) + S BMXPT=$T(ZZ+BMXPT) +"RTN","BMXRPC7",114,0) + S BMXPT=$P(BMXPT,";",4,9) I BMXPT["|" S BMXPT=$P(BMXPT,"|",1)_$G(BMXUM(0))_$P(BMXPT,"|",2) +"RTN","BMXRPC7",115,0) + Q BMXPT +"RTN","BMXRPC7",116,0) +ZZ ;;Halt;Error Messages +"RTN","BMXRPC7",117,0) +1 ;;1;Signons not currently allowed on this processor. +"RTN","BMXRPC7",118,0) +2 ;;1;Maximum number of users already signed on to this processor. +"RTN","BMXRPC7",119,0) +3 ;;1;This device has not been defined to the system -- contact system manager. +"RTN","BMXRPC7",120,0) +4 ;;0;Not a valid Windows Identity map value. +"RTN","BMXRPC7",121,0) +5 ;;0;No Access Allowed for this User. +"RTN","BMXRPC7",122,0) +6 ;;0;Invalid device password. +"RTN","BMXRPC7",123,0) +7 ;;0;Device locked due to too many invalid sign-on attempts. +"RTN","BMXRPC7",124,0) +8 ;;1;This device is out of service. +"RTN","BMXRPC7",125,0) +9 ;;0;*** MULTIPLE SIGN-ONS NOT ALLOWED *** +"RTN","BMXRPC7",126,0) +10 ;;1;You don't have access to this device! +"RTN","BMXRPC7",127,0) +11 ;;0;Your access code has been terminated. Please see your site manager! +"RTN","BMXRPC7",128,0) +12 ;;0;VERIFY CODE MUST be changed before continued use. +"RTN","BMXRPC7",129,0) +13 ;;1;This device may only be used outside of this time frame | +"RTN","BMXRPC7",130,0) +14 ;;0;'|' is not a valid UCI! +"RTN","BMXRPC7",131,0) +15 ;;0;'|' is not a valid program name! +"RTN","BMXRPC7",132,0) +16 ;;0;No PRIMARY MENU assigned to user or User is missing KEY to menu! +"RTN","BMXRPC7",133,0) +17 ;;0;Your access to the system is prohibited from |. +"RTN","BMXRPC7",134,0) +18 ;;0;Windows Integrated Security Not Allowed on this port. +"RTN","BMXRPC8") +0^95^B5993639 +"RTN","BMXRPC8",1,0) +BMXRPC8 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXRPC8",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC8",3,0) + ; +"RTN","BMXRPC8",4,0) + ; +"RTN","BMXRPC8",5,0) +BMXLOCKD(BMXY,BMXVAR,BMXINC,BMXTIME) ;EP +"RTN","BMXRPC8",6,0) + ;Entry point for debugging +"RTN","BMXRPC8",7,0) + ; +"RTN","BMXRPC8",8,0) + D DEBUG^%Serenji("BMXLOCK^BMXRPC8(.BMXY,BMXVAR,BMXINC,BMXTIME)") +"RTN","BMXRPC8",9,0) + Q +"RTN","BMXRPC8",10,0) + ; +"RTN","BMXRPC8",11,0) +BMXLOCK(BMXY,BMXVAR,BMXINC,BMXTIME) ;EP +"RTN","BMXRPC8",12,0) + ;Called by BMX LOCK rpc to lock variable BMXVAR +"RTN","BMXRPC8",13,0) + ;If BMXVAR = "", argumentless lock is performed to release all locks +"RTN","BMXRPC8",14,0) + ;BMXINC = increment lock if "+", decrement if "-" +"RTN","BMXRPC8",15,0) + ;BMXTIME = lock timeout +"RTN","BMXRPC8",16,0) + ;Returns 1 if lock successful, otherwise 0; +"RTN","BMXRPC8",17,0) + ; +"RTN","BMXRPC8",18,0) + S X="ERR^BMXRPC8",@^%ZOSF("TRAP") +"RTN","BMXRPC8",19,0) + ; +"RTN","BMXRPC8",20,0) + N BMXC +"RTN","BMXRPC8",21,0) + S:$E(BMXVAR,1,1)="~" BMXVAR="^"_$E(BMXVAR,2,$L(BMXVAR)) +"RTN","BMXRPC8",22,0) + S:BMXTIME="" BMXTIME=0 +"RTN","BMXRPC8",23,0) + I BMXVAR="" X "L" S BMXY=1 Q +"RTN","BMXRPC8",24,0) + S BMXC="L " +"RTN","BMXRPC8",25,0) + S BMXC=BMXC_$S(BMXINC="+":"+",BMXINC="-":"-",1:"") +"RTN","BMXRPC8",26,0) + S BMXC=BMXC_BMXVAR_":"_+BMXTIME +"RTN","BMXRPC8",27,0) + X BMXC +"RTN","BMXRPC8",28,0) + S BMXY=$T +"RTN","BMXRPC8",29,0) + Q +"RTN","BMXRPC8",30,0) + ; +"RTN","BMXRPC8",31,0) +ERR ;Error processing +"RTN","BMXRPC8",32,0) + S BMXY=0 +"RTN","BMXRPC8",33,0) + Q +"RTN","BMXRPC8",34,0) + ; +"RTN","BMXRPC8",35,0) +BMXVERD(BMXY,BMXNS,BMXLOC) ;EP +"RTN","BMXRPC8",36,0) + ;Entry point for debugging +"RTN","BMXRPC8",37,0) + ; +"RTN","BMXRPC8",38,0) + D DEBUG^%Serenji("BMXVER^BMXRPC8(.BMXY,BMXNS,BMXLOC)") +"RTN","BMXRPC8",39,0) + Q +"RTN","BMXRPC8",40,0) + ; +"RTN","BMXRPC8",41,0) +BMXVER(BMXY,BMXNS,BMXLOC) ;EP +"RTN","BMXRPC8",42,0) + ; +"RTN","BMXRPC8",43,0) + ;Called by BMX VERSION INFO rpc +"RTN","BMXRPC8",44,0) + ;Returns recordset of version info for server components in namespace BMXNS. +"RTN","BMXRPC8",45,0) + ;If BMXLOC is "", then the version info is assumed to be stored in piece 1-3 of +"RTN","BMXRPC8",46,0) + ;^APPL(1,0) +"RTN","BMXRPC8",47,0) + ; +"RTN","BMXRPC8",48,0) + ;TODO: +"RTN","BMXRPC8",49,0) + ;BMXLOC, if not null, is either a global reference such that $P(@BMXLOC,U,1,3) returns +"RTN","BMXRPC8",50,0) + ;MAJOR^MINOR^BUILD +"RTN","BMXRPC8",51,0) + ;Or BMXLOC can be an extrinsic function call that returns MAJOR^MINOR^BUILD. +"RTN","BMXRPC8",52,0) + ; +"RTN","BMXRPC8",53,0) + ;The returned error field is either "" or contains a text error message. +"RTN","BMXRPC8",54,0) + ; +"RTN","BMXRPC8",55,0) + N X,BMXI,BMXNOD,BMXDAT +"RTN","BMXRPC8",56,0) + ; +"RTN","BMXRPC8",57,0) + S X="VETRAP^BMXRPC8",@^%ZOSF("TRAP") +"RTN","BMXRPC8",58,0) + S BMXI=0 +"RTN","BMXRPC8",59,0) + K ^BMXTMP($J) +"RTN","BMXRPC8",60,0) + S BMXY="^BMXTMP("_$J_")" +"RTN","BMXRPC8",61,0) + S ^BMXTMP($J,BMXI)="T00030ERROR^T00030MAJOR_VERSION^T00030MINOR_VERSION^T00030BUILD"_$C(30) +"RTN","BMXRPC8",62,0) + S BMXI=BMXI+1 +"RTN","BMXRPC8",63,0) + I BMXNS="" D VERR(BMXI,"BMXRPC8: Invalid Null Application Namespace") Q +"RTN","BMXRPC8",64,0) + S BMXNOD="^"_BMXNS_"APPL(1,0)" +"RTN","BMXRPC8",65,0) + S BMXDAT=$G(@BMXNOD) +"RTN","BMXRPC8",66,0) + I BMXNS="" D VERR(BMXI,"BMXRPC8: No version info for Application Namespace") Q +"RTN","BMXRPC8",67,0) + S ^BMXTMP($J,BMXI)="^"_$P(BMXDAT,U,1,3)_$C(30) +"RTN","BMXRPC8",68,0) + Q +"RTN","BMXRPC8",69,0) + ; +"RTN","BMXRPC8",70,0) + ; +"RTN","BMXRPC8",71,0) +VERR(BMXI,BMXERR) ;Error processing +"RTN","BMXRPC8",72,0) + S BMXI=BMXI+1 +"RTN","BMXRPC8",73,0) + S ^BMXTMP($J,BMXI)=BMXERR_"^^^"_$C(30) +"RTN","BMXRPC8",74,0) + S BMXI=BMXI+1 +"RTN","BMXRPC8",75,0) + S ^BMXTMP($J,BMXI)=$C(31) +"RTN","BMXRPC8",76,0) + Q +"RTN","BMXRPC8",77,0) + ; +"RTN","BMXRPC8",78,0) +VETRAP ;EP Error trap entry +"RTN","BMXRPC8",79,0) + D ^%ZTER +"RTN","BMXRPC8",80,0) + I '$D(BMXI) N BMXI S BMXI=999999 +"RTN","BMXRPC8",81,0) + S BMXI=BMXI+1 +"RTN","BMXRPC8",82,0) + D VERR(BMXI,"BMXRPC8 Error: "_$G(%ZTERROR)) +"RTN","BMXRPC8",83,0) + Q +"RTN","BMXRPC8",84,0) + ; +"RTN","BMXRPC8",85,0) +IMHERE(BMXRES) ;EP +"RTN","BMXRPC8",86,0) + ;Entry point for BMX IM HERE remote procedure +"RTN","BMXRPC8",87,0) + S BMXRES=1 +"RTN","BMXRPC8",88,0) + Q +"RTN","BMXRPC8",89,0) + ; +"RTN","BMXRPC9") +0^96^B45877662 +"RTN","BMXRPC9",1,0) +BMXRPC9 ; IHS/OIT/HMW - RPC CALL FOR EXTENDED BROKER FUNCTIONALITY ; +"RTN","BMXRPC9",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXRPC9",3,0) + ; UPDATE FILEMAN WITH AN ADO RECORD SET FROM A WINDOWS APPLICATION +"RTN","BMXRPC9",4,0) + ; +"RTN","BMXRPC9",5,0) + ; +"RTN","BMXRPC9",6,0) + ; +"RTN","BMXRPC9",7,0) +SONLY(BMXY,BMXVAL) ;EP Schema Only +"RTN","BMXRPC9",8,0) + ; +"RTN","BMXRPC9",9,0) + I BMXVAL="TRUE" S BMX("SCHEMA ONLY")=1 +"RTN","BMXRPC9",10,0) + E S BMX("SCHEMA ONLY")=0 +"RTN","BMXRPC9",11,0) + S BMXY=BMX("SCHEMA ONLY") +"RTN","BMXRPC9",12,0) + ; +"RTN","BMXRPC9",13,0) + Q +"RTN","BMXRPC9",14,0) + ; +"RTN","BMXRPC9",15,0) +TESTRPC(BMXGBL,BMXSQL) ; +"RTN","BMXRPC9",16,0) + ;Test retrieval/update statement +"RTN","BMXRPC9",17,0) + ; +"RTN","BMXRPC9",18,0) + N BMXI,BMXERR,BMXN,BMXNOD,BMXNAM,BMXSEX,BMXDOB,BMXFAC,BMXTMP,BMXJ +"RTN","BMXRPC9",19,0) + S X="ETRAP^BMXRPC9",@^%ZOSF("TRAP") +"RTN","BMXRPC9",20,0) + S BMXGBL="^BMXTMP("_$J_")",BMXERR="",U="^" +"RTN","BMXRPC9",21,0) + K ^BMXTMP($J) +"RTN","BMXRPC9",22,0) + S BMXI=0 +"RTN","BMXRPC9",23,0) + ; +"RTN","BMXRPC9",24,0) + ;Old column info format: +"RTN","BMXRPC9",25,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="I00010BMXIEN"_U_"D00010DOB"_U_"T00030LOCAL_FACLILITY"_U_"T00030NAME"_U_"T00010SEX"_$C(30) +"RTN","BMXRPC9",26,0) + ; +"RTN","BMXRPC9",27,0) + ;New column info format is @@@meta@@@KEYFIELD|FILE# +"RTN","BMXRPC9",28,0) + ; For each field: ^FILE#|FIELD#|DATATYPE|LENGTH|FIELDNAME|READONLY|KEYFIELD|NULL ALLOWED +"RTN","BMXRPC9",29,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="@@@meta@@@" +"RTN","BMXRPC9",30,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="BMXIEN|2160010^" +"RTN","BMXRPC9",31,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.001|I|10|BMXIEN|TRUE|TRUE^" +"RTN","BMXRPC9",32,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.03|D|10|DOB|FALSE|FALSE^" +"RTN","BMXRPC9",33,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.04|T|60|LOCAL_FACILITY|FALSE|FALSE^" +"RTN","BMXRPC9",34,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.01|T|30|NAME|FALSE|FALSE^" +"RTN","BMXRPC9",35,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.02|T|10|SEX|FALSE|FALSE" +"RTN","BMXRPC9",36,0) + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)=$C(30) +"RTN","BMXRPC9",37,0) + ; +"RTN","BMXRPC9",38,0) + D SS^BMXADO(.BMXTMP,"","TEST1") +"RTN","BMXRPC9",39,0) + I $G(BMXTMP)=$C(30) D ERR(99,"SCHEMA GENERATION FAILED") Q +"RTN","BMXRPC9",40,0) + S BMXJ=0 F S BMXJ=$O(BMXTMP(BMXJ)) Q:'+BMXJ D +"RTN","BMXRPC9",41,0) + . S BMXI=BMXI+1 +"RTN","BMXRPC9",42,0) + . S ^BMXTMP($J,BMXI)=BMXTMP(BMXJ) +"RTN","BMXRPC9",43,0) + I +$G(BMX("SCHEMA ONLY")) D Q +"RTN","BMXRPC9",44,0) + . S BMXI=BMXI+1 +"RTN","BMXRPC9",45,0) + . S ^BMXTMP($J,BMXI)=$C(31) +"RTN","BMXRPC9",46,0) + . Q +"RTN","BMXRPC9",47,0) + S BMXN=0 +"RTN","BMXRPC9",48,0) + F S BMXN=$O(^DIZ(2160010,BMXN)) Q:'+BMXN D +"RTN","BMXRPC9",49,0) + . Q:'$D(^DIZ(2160010,BMXN,0)) +"RTN","BMXRPC9",50,0) + . S BMXNOD=^DIZ(2160010,BMXN,0) +"RTN","BMXRPC9",51,0) + . S BMXNAM=$P(BMXNOD,U) +"RTN","BMXRPC9",52,0) + . S BMXSEX=$P(BMXNOD,U,2) +"RTN","BMXRPC9",53,0) + . S BMXDOB=$P(BMXNOD,U,3) +"RTN","BMXRPC9",54,0) + . S Y=BMXDOB X ^DD("DD") S BMXDOB=Y +"RTN","BMXRPC9",55,0) + . S BMXFAC=$P(BMXNOD,U,4) +"RTN","BMXRPC9",56,0) + . S:+BMXFAC BMXFAC=$P($G(^DIC(4,BMXFAC,0)),U) +"RTN","BMXRPC9",57,0) + . S BMXI=BMXI+1 +"RTN","BMXRPC9",58,0) + . S ^BMXTMP($J,BMXI)=BMXN_U_BMXDOB_U_BMXFAC_U_BMXNAM_U_BMXSEX_$C(30) +"RTN","BMXRPC9",59,0) + . Q +"RTN","BMXRPC9",60,0) + S BMXI=BMXI+1 +"RTN","BMXRPC9",61,0) + S ^BMXTMP($J,BMXI)=$C(31) +"RTN","BMXRPC9",62,0) + Q +"RTN","BMXRPC9",63,0) + ; +"RTN","BMXRPC9",64,0) +ERR(BMXID,BMXERR) ;Error processing +"RTN","BMXRPC9",65,0) + K ^BMXTMP($J) +"RTN","BMXRPC9",66,0) + S ^BMXTMP($J,0)="I00030ERRORID^T00030ERRORMSG"_$C(30) +"RTN","BMXRPC9",67,0) + S ^BMXTMP($J,1)=BMXID_"^"_BMXERR_$C(30) +"RTN","BMXRPC9",68,0) + S ^BMXTMP($J,2)=$C(31) +"RTN","BMXRPC9",69,0) + Q +"RTN","BMXRPC9",70,0) + ; +"RTN","BMXRPC9",71,0) +ETRAP ;EP Error trap entry +"RTN","BMXRPC9",72,0) + D ^%ZTER +"RTN","BMXRPC9",73,0) + D ERR(99,"BMXRPC9 Error: "_$G(%ZTERROR)) +"RTN","BMXRPC9",74,0) + Q +"RTN","BMXRPC9",75,0) + ; +"RTN","BMXRPC9",76,0) +TEST N OUT S OUT="" D ADO(.OUT,2160010,"1",(".01|A,A"_$C(30)_".02|M"_$C(30)_".03|1/5/1946"_$C(30)_".04|SAN XAVIER"_$C(31))) W !,OUT +"RTN","BMXRPC9",77,0) + Q +"RTN","BMXRPC9",78,0) + ; +"RTN","BMXRPC9",79,0) +ADOX(OUT,FILE,IEN,DATA) ; +"RTN","BMXRPC9",80,0) + ; +"RTN","BMXRPC9",81,0) + D DEBUG^%Serenji("ADOX^BMXRPC9(.OUT,FILE,IEN,DATA)") +"RTN","BMXRPC9",82,0) + ; +"RTN","BMXRPC9",83,0) + Q +"RTN","BMXRPC9",84,0) + ; +"RTN","BMXRPC9",85,0) +ADO(OUT,FILE,IEN,DATA) ; RPC CALL: OUT = OUTBOUND MESSAGE, FILE = FILEMAN FILE NUMBER, IEN = FILE INTERNAL ENTRY NUMBER, DATA = DATA STRING +"RTN","BMXRPC9",86,0) + N OREF,CREF,DIC,DIE,DA,DR,X,Y,%,FLD,CNT,FNO,VAL,TFLG,DFLG,TOT,UFLG,XTFLG,GTFLG,GDFLG +"RTN","BMXRPC9",87,0) + S OUT="",FLD="",GTFLG=0,GDFLG=0 +"RTN","BMXRPC9",88,0) + S IEN=$G(IEN) +"RTN","BMXRPC9",89,0) + I $E(IEN)="-" S IEN=$E(IEN,2,99),GDFLG=1 ; GLOBAL DELETE FLAG +"RTN","BMXRPC9",90,0) + I $E(IEN)="+" S IEN=$E(IEN,2,99),GTFLG=1 ; GLOBAL TRANSACTION FLAG, ROLLBACK IF ANY FIELD FAILS TO UPDATE +"RTN","BMXRPC9",91,0) + I IEN="Add"!(IEN="ADD") S IEN="" +"RTN","BMXRPC9",92,0) + I '$D(^DIC(+$G(FILE),0,"GL")) S OUT="Update cancelled. Invalid FILE number" Q +"RTN","BMXRPC9",93,0) + S OREF=^DIC(FILE,0,"GL") I '$L(OREF) S OUT="Update cancelled. Invalid file definition" Q +"RTN","BMXRPC9",94,0) + S CREF=$E(OREF,1,$L(OREF)-1) I $E(OREF,$L(OREF))="," S CREF=CREF_")" ; CONVERT OREF TO CREF +"RTN","BMXRPC9",95,0) + I IEN,'$D(@CREF@(IEN)) S OUT="Update cancelled. Invalid IEN" Q +"RTN","BMXRPC9",96,0) + I 'GDFLG,IEN,(DATA["-.01|"!(DATA[".01|@")) S GDFLG=1 +"RTN","BMXRPC9",97,0) + I GDFLG,'IEN S OUT="Deletion cancelled. Missing IEN" Q +"RTN","BMXRPC9",98,0) + I GDFLG D DIK(OREF,IEN) S OUT="Record deleted|"_IEN Q +"RTN","BMXRPC9",99,0) + S UFLG=$S($G(IEN):"E",1:"A") ; UPDATE FLAG: ADD OR EDIT +"RTN","BMXRPC9",100,0) + I '$L($G(DATA)) S OUT="Update cancelled. Missing/invalid data string" Q +"RTN","BMXRPC9",101,0) + S TOT=$L(DATA,$C(30)) I 'TOT S OUT="Update cancelled. Missing data string" Q +"RTN","BMXRPC9",102,0) + F CNT=1:1:TOT S DATA(CNT)=$P(DATA,$C(30),CNT) ; BUILD PRIMARY FIELD ARRAY +"RTN","BMXRPC9",103,0) + S %=DATA(1) I %=""!(%=$C(31)) S OUT="Update cancelled. Missing data string" Q +"RTN","BMXRPC9",104,0) + S %=DATA(CNT) I %[$C(31) S %=$P(%,$C(31),1),DATA(CNT)=% ; STRIP OFF END OF FILE MARKER +"RTN","BMXRPC9",105,0) + F CNT=1:1:TOT S X=DATA(CNT) I $L(X) D ; BUILD SECONDARY FIELD ARRAY +"RTN","BMXRPC9",106,0) + . S TFLG=0,DFLG=0 +"RTN","BMXRPC9",107,0) + . I $E(X)="+" S TFLG=1,X=$E(X,2,999),$P(FLD,U)=1 +"RTN","BMXRPC9",108,0) + . I $E(X)="-" S DFLG=1,X=$E(X,2,999) +"RTN","BMXRPC9",109,0) + . S FNO=$P(X,"|"),VAL=$P(X,"|",2) +"RTN","BMXRPC9",110,0) + . I '$D(^DD(FILE,+$G(FNO),0)) S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid field number" Q +"RTN","BMXRPC9",111,0) + . I DFLG,VAL'="" S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid deletion syntax" Q ; CANT DELETE IF A VALUE IS SENT +"RTN","BMXRPC9",112,0) + . I DFLG!(VAL="") S VAL="@" ; SYNC DFLG AND VAL +"RTN","BMXRPC9",113,0) + . I VAL="@" S DFLG=1 ; SYNC DFLG AND VAL +"RTN","BMXRPC9",114,0) + . S FLD(FNO)=VAL_U_TFLG_U_DFLG +"RTN","BMXRPC9",115,0) + . I FNO=.01,TFLG S $P(FLD,U,2)=1 ; +"RTN","BMXRPC9",116,0) + . Q +"RTN","BMXRPC9",117,0) + I $P($G(FLD(.01)),U,3),UFLG="A" S OUT="Record deletion cancelled. Missing IEN" Q ; CAN'T DELETE A RECORD WITHOUT A VALID IEN +"RTN","BMXRPC9",118,0) +DELREC I $P($G(FLD(.01)),U,3) D DIK(OREF,IEN) S OUT="OK" Q ; DELETE THE RECORD +"RTN","BMXRPC9",119,0) + I UFLG="A",'$L($P($G(FLD(.01)),U)) S OUT="Record addition cancelled. Missing .01 field" Q ; CAN'T ADD A RECORD WITHOUT A VALID .01 FIELD +"RTN","BMXRPC9",120,0) +ADDREC I UFLG="A" D ADD(OREF) Q ; ADD A NEW ENTRY TO A FILE +"RTN","BMXRPC9",121,0) +EDITREC I UFLG="E" D EDIT(OREF,IEN) Q ; EDIT AN EXISTING RECORD +"RTN","BMXRPC9",122,0) + Q +"RTN","BMXRPC9",123,0) + ; +"RTN","BMXRPC9",124,0) +DIK(DIK,DA) ; DELETE A RECORD +"RTN","BMXRPC9",125,0) + D ^DIK +"RTN","BMXRPC9",126,0) + D ^XBFMK +"RTN","BMXRPC9",127,0) + Q +"RTN","BMXRPC9",128,0) + ; +"RTN","BMXRPC9",129,0) +ADD(DIC) ; ADD A NEW ENTRY TO A FILE +"RTN","BMXRPC9",130,0) + N X,Y +"RTN","BMXRPC9",131,0) + S X=""""_$P($G(FLD(.01)),U)_"""" +"RTN","BMXRPC9",132,0) + S DIC(0)="L" +"RTN","BMXRPC9",133,0) + D ^DIC +"RTN","BMXRPC9",134,0) + I Y=-1 S OUT="Unable to add a new record" G AX +"RTN","BMXRPC9",135,0) + I $O(FLD(.01)) D EDIT(DIC,+Y) Q +"RTN","BMXRPC9",136,0) + S OUT="OK"_"|"_+Y +"RTN","BMXRPC9",137,0) +AX D ^XBFMK +"RTN","BMXRPC9",138,0) + Q +"RTN","BMXRPC9",139,0) + ; +"RTN","BMXRPC9",140,0) +EDIT(DIE,DA) ; EDIT AN EXISTING RECORD +"RTN","BMXRPC9",141,0) + N DR,RFLG,ERR,FNO,VAL,TFLG,RESULT,MSG,DIERR,DISYS +"RTN","BMXRPC9",142,0) + S FNO=$O(FLD(.01),-1),DR="" ;HMW Changed to include .01 in DR string +"RTN","BMXRPC9",143,0) + I UFLG="A" S OUT="New record added|"_DA +"RTN","BMXRPC9",144,0) + F S FNO=$O(FLD(FNO)) Q:'FNO S X=FLD(FNO) I $L(X) D I $G(RFLG) Q ; CHECK EA FIELD AND BUILD THE DR STRING AND ERROR STRING +"RTN","BMXRPC9",145,0) + . S VAL(FNO)=$P(X,U),TFLG=$P(X,U,2) I '$L(VAL(FNO)) Q +"RTN","BMXRPC9",146,0) + . K ERR,RESULT +"RTN","BMXRPC9",147,0) + . I VAL(FNO)="@"!(VAL(FNO)="") S RESULT="@" +"RTN","BMXRPC9",148,0) + . E D CHK^DIE(FILE,FNO,"",VAL(FNO),.RESULT,"ERR") +"RTN","BMXRPC9",149,0) + . I RESULT=U D Q +"RTN","BMXRPC9",150,0) + .. S MSG=$G(ERR("DIERR",1,"TEXT",1),"Failed FileMan data validation") +"RTN","BMXRPC9",151,0) + .. I $L(OUT) S OUT=OUT_"~" +"RTN","BMXRPC9",152,0) + .. I TFLG!GTFLG S RFLG=1,OUT=FNO_"|"_MSG Q +"RTN","BMXRPC9",153,0) + .. S OUT=OUT_FNO_"|"_MSG +"RTN","BMXRPC9",154,0) + .. Q +"RTN","BMXRPC9",155,0) + . S VAL(FNO)=RESULT +"RTN","BMXRPC9",156,0) + . I $L(DR) S DR=DR_";" +"RTN","BMXRPC9",157,0) + . S DR=DR_FNO_"////^S X=VAL("_FNO_")" ; BUILD DR STRING +"RTN","BMXRPC9",158,0) + . Q +"RTN","BMXRPC9",159,0) + I $G(RFLG) D:UFLG="A" DIK(DIE,DA) S OUT="Record update cancelled"_"|"_OUT G EX ; TRANSACTION ROLLBACK FLAG IS SET, ENTRY DELETED (ADD MODE) OR UPDATE CANCELLED (EDIT MODE) +"RTN","BMXRPC9",160,0) + L +@CREF@(DA):2 I $T D ^DIE L -@CREF@(DA) G:OUT["valid" EX S OUT="OK" S:UFLG="A" OUT=OUT_"|"_DA G EX ; SUCCESS!!!! +"RTN","BMXRPC9",161,0) + S OUT="Update cancelled. File locked" ; FILE LOCKED. UNABLE TO UPDATE +"RTN","BMXRPC9",162,0) + I $L(FLD),UFLG="A" D DIK(DIE,DA) ; ROLLBACK THE NEW RECORD +"RTN","BMXRPC9",163,0) +EX D ^XBFMK ; CLEANUP +"RTN","BMXRPC9",164,0) + Q +"RTN","BMXRPC9",165,0) + ; +"RTN","BMXSQL") +0^97^B109951806 +"RTN","BMXSQL",1,0) +BMXSQL ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL",3,0) + ; +"RTN","BMXSQL",4,0) + ; +"RTN","BMXSQL",5,0) + Q +"RTN","BMXSQL",6,0) + ; +"RTN","BMXSQL",7,0) +FLDNDX(BMXGBL,BMXFL,BMXFLD) ; +"RTN","BMXSQL",8,0) + ;Returns index name and set code for all indexes on field +"RTN","BMXSQL",9,0) + ;on field BMXFLD in file BMXFL +"RTN","BMXSQL",10,0) + S BMX31=$C(31)_$C(31) +"RTN","BMXSQL",11,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXSQL",12,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXSQL",13,0) + I +BMXFL'=BMXFL D +"RTN","BMXSQL",14,0) + . S BMXFL=$TR(BMXFL,"_"," ") +"RTN","BMXSQL",15,0) + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q +"RTN","BMXSQL",16,0) + . S BMXFL=$O(^DIC("B",BMXFL,0)) +"RTN","BMXSQL",17,0) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q +"RTN","BMXSQL",18,0) + ; +"RTN","BMXSQL",19,0) + ;Check for field name +"RTN","BMXSQL",20,0) + I +BMXFLD'=BMXFLD D +"RTN","BMXSQL",21,0) + . S BMXFLD=$TR(BMXFLD,"_"," ") +"RTN","BMXSQL",22,0) + . I '$D(^DD(BMXFL,"B",BMXFLD)) S BMXFLD="" Q +"RTN","BMXSQL",23,0) + . S BMXFLD=$O(^DD(BMXFL,"B",BMXFLD,0)) +"RTN","BMXSQL",24,0) + I '$G(BMXFLD) D ERROUT("Field not provided",1) Q +"RTN","BMXSQL",25,0) + ; +"RTN","BMXSQL",26,0) + ;Set up Column names +"RTN","BMXSQL",27,0) + S ^BMXTEMP($J,0)="T"_$$NUMCHAR(30)_"INDEX^T"_$$NUMCHAR(200)_"CODE"_$C(30) +"RTN","BMXSQL",28,0) + ; +"RTN","BMXSQL",29,0) + ;Write field data to BMXTEMP +"RTN","BMXSQL",30,0) + S BMXI=0,I=0 +"RTN","BMXSQL",31,0) + N BMXNAM,BMXCOD,BMXNOD,BMXTYP +"RTN","BMXSQL",32,0) + F S BMXI=$O(^DD(BMXFL,BMXFLD,1,BMXI)) Q:'+BMXI Q:$D(BMXERR) D +"RTN","BMXSQL",33,0) + . S I=I+1 +"RTN","BMXSQL",34,0) + . S BMXNOD=$G(^DD(BMXFL,BMXFLD,1,BMXI,0)) +"RTN","BMXSQL",35,0) + . S BMXNAM=$P(BMXNOD,U,2) +"RTN","BMXSQL",36,0) + . S BMXTYP=$P(BMXNOD,U,3) +"RTN","BMXSQL",37,0) + . S:BMXTYP="" BMXTYP="REGULAR" +"RTN","BMXSQL",38,0) + . S BMXCOD=$G(^DD(BMXFL,BMXFLD,1,BMXI,1)) +"RTN","BMXSQL",39,0) + . S BMXCOD=$TR(BMXCOD,"^","~") +"RTN","BMXSQL",40,0) + . S ^BMXTEMP($J,I)=BMXNAM_U_BMXTYP_U_BMXCOD_$C(30) +"RTN","BMXSQL",41,0) + Q +"RTN","BMXSQL",42,0) + ; +"RTN","BMXSQL",43,0) +TLIST(BMXGBL,BMXFROM,BMXTO) ; +"RTN","BMXSQL",44,0) + ;Returns list of Fileman files to which user has READ access +"RTN","BMXSQL",45,0) + ;TODO: Pass in type of access (RD,DL,WR) in BMXPAR +"RTN","BMXSQL",46,0) + ; +"RTN","BMXSQL",47,0) + N A,F,BMXF,BMXFLD,D0,BMXU,I,BMXCNT,BMXMFL,BMXRD,BMXMAX +"RTN","BMXSQL",48,0) + S U="^" +"RTN","BMXSQL",49,0) + S:$G(BMXFROM)="RD" BMXFROM="" +"RTN","BMXSQL",50,0) + K ^BMXTMP($J),^BMXTEMP($J) +"RTN","BMXSQL",51,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXSQL",52,0) + S BMXF=1 +"RTN","BMXSQL",53,0) + S BMXF("FILE")=1 +"RTN","BMXSQL",54,0) + S BMXFLD("FILE")="1^.01" +"RTN","BMXSQL",55,0) + S BMXFLD("NUMBER")="1^.001" ;ADDED +"RTN","BMXSQL",56,0) + S BMXFLDN=$P(BMXFLD("FILE"),"^",2) +"RTN","BMXSQL",57,0) + S BMXFLDN(1,BMXFLDN)="FILE" +"RTN","BMXSQL",58,0) + S BMXFLDN=$P(BMXFLD("NUMBER"),"^",2) ;ADDED +"RTN","BMXSQL",59,0) + S BMXFLDN(1,BMXFLDN)="NUMBER" ;ADDED +"RTN","BMXSQL",60,0) + S BMXFLDO=2 ;CHANGED FROM 1 TO 2 +"RTN","BMXSQL",61,0) + S BMXFLDO(0)="1^.01" +"RTN","BMXSQL",62,0) + S BMXFLDOX(1,.01,"E")=0 +"RTN","BMXSQL",63,0) + S BMXFLDO(1)="1^.001" ;ADDED +"RTN","BMXSQL",64,0) + S BMXFLDOX(1,.001,"E")=1 ;ADDED +"RTN","BMXSQL",65,0) + S BMXFNX(1)="FILE" +"RTN","BMXSQL",66,0) + S BMXFO(1)="1" +"RTN","BMXSQL",67,0) + S BMXU=$G(DUZ(0)) +"RTN","BMXSQL",68,0) + S BMXRD=$C(30) +"RTN","BMXSQL",69,0) + S ^BMXTEMP($J,0)="T00030FILE^N00010NUMBER"_BMXRD +"RTN","BMXSQL",70,0) + S BMXSET="S I=I+1,^BMXTEMP($J,I)=$P($G(^DIC(D0,0)),U)_U_D0_BMXRD,BMXCNT=BMXCNT+1" +"RTN","BMXSQL",71,0) + S D0=0,I=0,BMXCNT=0,BMXMAX=2000 +"RTN","BMXSQL",72,0) + S BMXFROM=$G(BMXFROM),BMXTO=$G(BMXTO) +"RTN","BMXSQL",73,0) + I +BMXFROM=BMXFROM D ;BMXFROM is a filenumber +"RTN","BMXSQL",74,0) + . S F=(+BMXFROM-1),T=+BMXTO +"RTN","BMXSQL",75,0) + . S:BMXTOT Q:BMXCNT>BMXMAX I $D(^DD(D0)) D TLIST1 +"RTN","BMXSQL",77,0) + I +BMXFROM'=BMXFROM D ;F is a filename or is null +"RTN","BMXSQL",78,0) + . S F="",T="zzzzzzz" +"RTN","BMXSQL",79,0) + . S:$G(BMXFROM)]"" F=$O(^DIC("B",BMXFROM),-1) +"RTN","BMXSQL",80,0) + . S:$G(BMXTO)]"" T=BMXTO +"RTN","BMXSQL",81,0) + . F S F=$O(^DIC("B",F)) Q:F="" Q:F]T Q:BMXCNT>BMXMAX D +"RTN","BMXSQL",82,0) + . . S D0=0 F S D0=$O(^DIC("B",F,D0)) Q:'+D0 D TLIST1 +"RTN","BMXSQL",83,0) + ; +"RTN","BMXSQL",84,0) + S I=I+1,^BMXTEMP($J,I)=$C(31) +"RTN","BMXSQL",85,0) + Q +"RTN","BMXSQL",86,0) + ; +"RTN","BMXSQL",87,0) +TLIST1 ; +"RTN","BMXSQL",88,0) + I BMXU="@" X BMXSET Q +"RTN","BMXSQL",89,0) + Q:$D(^DIC(D0,0))'=11 +"RTN","BMXSQL",90,0) + S A=$G(^DIC(D0,0,"RD")) +"RTN","BMXSQL",91,0) + I $D(^VA(200,DUZ,"FOF",D0,0)) D Q +"RTN","BMXSQL",92,0) + . ;I $P(^(0),U,5)="1" X BMXSET Q +"RTN","BMXSQL",93,0) + . I $P(^VA(200,DUZ,"FOF",D0,0),U,5)="1" X BMXSET Q +"RTN","BMXSQL",94,0) + F J=1:1:$L(A) I DUZ(0)[$E(A,J) X BMXSET +"RTN","BMXSQL",95,0) + Q +"RTN","BMXSQL",96,0) + ; +"RTN","BMXSQL",97,0) +SQLCOL(BMXGBL,BMXSQL) ;EP +"RTN","BMXSQL",98,0) + D INTSQL(.BMXGBL,.BMXSQL,1) +"RTN","BMXSQL",99,0) + Q +"RTN","BMXSQL",100,0) + ; +"RTN","BMXSQL",101,0) +SQLD(BMXGBL,BMXSQL) ;EP Serenji Debug Entrypoint +"RTN","BMXSQL",102,0) + D DEBUG^%Serenji("SQL^BMXSQL(.BMXGBL,.BMXSQL)","10.10.10.104") +"RTN","BMXSQL",103,0) + Q +"RTN","BMXSQL",104,0) + ; +"RTN","BMXSQL",105,0) +SQL(BMXGBL,BMXSQL) ;EP +"RTN","BMXSQL",106,0) + D INTSQL(.BMXGBL,.BMXSQL,0) +"RTN","BMXSQL",107,0) + Q +"RTN","BMXSQL",108,0) + ; +"RTN","BMXSQL",109,0) +INTSQL(BMXGBL,BMXSQL,BMXCOL) ;EP +"RTN","BMXSQL",110,0) + ; +"RTN","BMXSQL",111,0) + ;SQL Top Wait for debug break +"RTN","BMXSQL",112,0) + ;D +"RTN","BMXSQL",113,0) + ;. F J=1:1:10 S K=$H H 1 +"RTN","BMXSQL",114,0) + ;. Q +"RTN","BMXSQL",115,0) + ; +"RTN","BMXSQL",116,0) + S X="ERRTRAP^BMXSQL",@^%ZOSF("TRAP") +"RTN","BMXSQL",117,0) + I $G(BMXSQL)="" S BMXSQL="" D +"RTN","BMXSQL",118,0) + . N C S C=0 F S C=$O(BMXSQL(C)) Q:'+C D +"RTN","BMXSQL",119,0) + . . S BMXSQL=BMXSQL_BMXSQL(C) +"RTN","BMXSQL",120,0) + ; +"RTN","BMXSQL",121,0) + I BMXSQL["call SHAPE" S BMXSQL="SELECT JUNKNAME, MULTCOLOR FROM JUNKMULT" +"RTN","BMXSQL",122,0) + ; Global-scope variables +"RTN","BMXSQL",123,0) + K BMXTK +"RTN","BMXSQL",124,0) + N BMXF,BMXTK,T,BMXFLD,BMXTMP,BMXM,BMXXMAX,BMXFLDN,BMXV +"RTN","BMXSQL",125,0) + N BMXX,BMXFG,BMXFF,BMXSCR,BMXPFP +"RTN","BMXSQL",126,0) + N BMXERR,BMXFLDO,BMXFLDOX,BMXFJ,BMXFO,BMXFNX +"RTN","BMXSQL",127,0) + N BMXMFL,BMXFLDA +"RTN","BMXSQL",128,0) + D ^XBKVAR +"RTN","BMXSQL",129,0) + S U="^" +"RTN","BMXSQL",130,0) + I $D(^%ZOSF("MAXSIZ")) S X=640 X ^%ZOSF("MAXSIZ") +"RTN","BMXSQL",131,0) + K ^BMXTMP($J),^BMXTEMP($J),^BMXTMPD($J) +"RTN","BMXSQL",132,0) + S BMXGBL="^BMXTEMP("_$J_")" +"RTN","BMXSQL",133,0) + ;Remove CR and LF from BMXSQL +"RTN","BMXSQL",134,0) + S BMXSQL=$TR(BMXSQL,$C(13)," ") +"RTN","BMXSQL",135,0) + S BMXSQL=$TR(BMXSQL,$C(10)," ") +"RTN","BMXSQL",136,0) + S BMXSQL=$TR(BMXSQL,$C(9)," ") +"RTN","BMXSQL",137,0) + S BMXSQL=$TR(BMXSQL,$C(34),"") +"RTN","BMXSQL",138,0) + D PARSE^BMXPRS(BMXSQL) +"RTN","BMXSQL",139,0) + S BMXXMAX=1000000 ;Default Maximum records to return. +"RTN","BMXSQL",140,0) + D KW^BMXSQL1(.BMXTK) +"RTN","BMXSQL",141,0) + Q:$D(BMXERR) +"RTN","BMXSQL",142,0) + ; +"RTN","BMXSQL",143,0) + ;Get file names into BMXF("NAME")="NUMBER" +"RTN","BMXSQL",144,0) + ;Get file numbers into BMXFNX(NUMBER)="NAME" +"RTN","BMXSQL",145,0) + ; Files are ordered in BMXFO(order)="NUMBER" +"RTN","BMXSQL",146,0) + ; +"RTN","BMXSQL",147,0) +FROM S T=$G(BMXTK("FROM")) +"RTN","BMXSQL",148,0) + I '+T S BMXERR="'FROM' CLAUSE NOT FOUND" D ERROR Q +"RTN","BMXSQL",149,0) + S BMXF=0 +"RTN","BMXSQL",150,0) + F S T=$O(BMXTK(T)) Q:'+T Q:T=$G(BMXTK("WHERE")) Q:T=$G(BMXTK("ORDER BY")) Q:T=$G(BMXTK("GROUP BY")) D Q:$D(BMXERR) +"RTN","BMXSQL",151,0) + . Q:BMXTK(T)="," +"RTN","BMXSQL",152,0) + . N BMXFNT +"RTN","BMXSQL",153,0) + . I BMXTK(T)["'" S BMXTK(T)=$P(BMXTK(T),"'",2) +"RTN","BMXSQL",154,0) + . S BMXTK(T)=$TR(BMXTK(T),"_"," ") +"RTN","BMXSQL",155,0) + . I '(BMXTK(T)?.N),'$D(^DIC("B",BMXTK(T))) S BMXERR="FILE NOT FOUND" D ERROR Q +"RTN","BMXSQL",156,0) + . S BMXF=BMXF+1 +"RTN","BMXSQL",157,0) + . I BMXTK(T)?.N S BMXFNT=BMXTK(T) +"RTN","BMXSQL",158,0) + . E S BMXFNT=$O(^DIC("B",BMXTK(T),0)) +"RTN","BMXSQL",159,0) + . S BMXMFL(BMXFNT,"GLOC")=^DIC(BMXFNT,0,"GL") +"RTN","BMXSQL",160,0) + . D F1(BMXF,BMXTK(T),BMXFNT) +"RTN","BMXSQL",161,0) + . I '+BMXF(BMXTK(T)) S BMXERR="FILE NUMBER NOT FOUND" D ERROR Q +"RTN","BMXSQL",162,0) + . D ;Test alias +"RTN","BMXSQL",163,0) + . . Q:'+$O(BMXTK(T)) +"RTN","BMXSQL",164,0) + . . N V +"RTN","BMXSQL",165,0) + . . S V=T+1 +"RTN","BMXSQL",166,0) + . . Q:$G(BMXTK(V))="," +"RTN","BMXSQL",167,0) + . . Q:V=$G(BMXTK("WHERE")) +"RTN","BMXSQL",168,0) + . . Q:V=$G(BMXTK("ORDER BY")) +"RTN","BMXSQL",169,0) + . . Q:V=$G(BMXTK("GROUP BY")) +"RTN","BMXSQL",170,0) + . . S BMXTK(T,"ALIAS")=BMXTK(V) +"RTN","BMXSQL",171,0) + . . K BMXTK(V) +"RTN","BMXSQL",172,0) + . . Q +"RTN","BMXSQL",173,0) + . Q +"RTN","BMXSQL",174,0) + ; +"RTN","BMXSQL",175,0) + D SELECT^BMXSQL5 +"RTN","BMXSQL",176,0) + I $D(BMXERR) G END +"RTN","BMXSQL",177,0) + D POST2^BMXPRS ;Remove commas from BMXTK +"RTN","BMXSQL",178,0) + D KW^BMXSQL1(.BMXTK) +"RTN","BMXSQL",179,0) + ; +"RTN","BMXSQL",180,0) + D WHERE^BMXSQL7 +"RTN","BMXSQL",181,0) + ; +"RTN","BMXSQL",182,0) + ;Find the first WHERE field that has an index +"RTN","BMXSQL",183,0) + I $D(BMXERR) G END +"RTN","BMXSQL",184,0) + ; +"RTN","BMXSQL",185,0) + D INDEX(.BMXFF,.BMXX,.BMXTMP) +"RTN","BMXSQL",186,0) + ; +"RTN","BMXSQL",187,0) + S:BMXTMP BMXX=BMXTMP +"RTN","BMXSQL",188,0) + ; +"RTN","BMXSQL",189,0) + ;Set up screen logic for where fields +"RTN","BMXSQL",190,0) + D SCREEN^BMXSQL1 +"RTN","BMXSQL",191,0) + D SETX^BMXSQL2(.BMXX,.BMXFG,.BMXSCR) +"RTN","BMXSQL",192,0) + ; +"RTN","BMXSQL",193,0) + ; +"RTN","BMXSQL",194,0) +EXEC ;Execute enumerator and screen code to call Output routine +"RTN","BMXSQL",195,0) + ; +"RTN","BMXSQL",196,0) + N BMXOUT,J,BMXC +"RTN","BMXSQL",197,0) + S BMXOUT=0 +"RTN","BMXSQL",198,0) + ;Debug lines (retain): +"RTN","BMXSQL",199,0) + ;K ^HW("BMXX") S J=0 F S J=$O(BMXX(J)) Q:'+J S ^HW("BMXX",J)=BMXX(J) +"RTN","BMXSQL",200,0) + ;K ^HW("BMXSCR") S ^HW("BMXSCR")=$G(BMXSCR) S J=0 F S J=$O(BMXSCR(J)) Q:'+J S ^HW("BMXSCR",J)=BMXSCR(J) +"RTN","BMXSQL",201,0) + ;Test for SHOWPLAN +"RTN","BMXSQL",202,0) + I $G(BMXTK("SHOWPLAN"))="TRUE" D WPLAN Q +"RTN","BMXSQL",203,0) + S BMXM=0 +"RTN","BMXSQL",204,0) + I 'BMXCOL S J=0 F S J=$O(BMXX(J)) Q:'+J D Q:BMXM>BMXXMAX +"RTN","BMXSQL",205,0) + . X BMXX(J) +"RTN","BMXSQL",206,0) + ; +"RTN","BMXSQL",207,0) + D WRITE^BMXSQL6 +"RTN","BMXSQL",208,0) + ; +"RTN","BMXSQL",209,0) +END Q +"RTN","BMXSQL",210,0) + ; +"RTN","BMXSQL",211,0) + ; +"RTN","BMXSQL",212,0) +F1(BMXC,BMXNAM,BMXNUM) ;EP +"RTN","BMXSQL",213,0) + S BMXF(BMXNAM)=BMXNUM +"RTN","BMXSQL",214,0) + S BMXFNX(BMXNUM)=BMXNAM +"RTN","BMXSQL",215,0) + S BMXFO(BMXC)=BMXF(BMXNAM) +"RTN","BMXSQL",216,0) + Q +"RTN","BMXSQL",217,0) + ; +"RTN","BMXSQL",218,0) +OUT ;Set result in ^BMXTMP +"RTN","BMXSQL",219,0) + S BMXOUT=BMXOUT+1 +"RTN","BMXSQL",220,0) + S ^BMXTMP($J,"O",D0)="" +"RTN","BMXSQL",221,0) + S ^BMXTMP($J,BMXOUT)=D0 +"RTN","BMXSQL",222,0) + S BMXM=BMXM+1 +"RTN","BMXSQL",223,0) + Q +"RTN","BMXSQL",224,0) + ; +"RTN","BMXSQL",225,0) +WPLAN ;Write execution plan +"RTN","BMXSQL",226,0) + ;Set up Column Names +"RTN","BMXSQL",227,0) + N BMXLEN,BMXTYP,BMXT,J,BMXSCRT,BMXXT +"RTN","BMXSQL",228,0) + S I=1 +"RTN","BMXSQL",229,0) + F BMXT="VARIABLE^","VALUE"_$C(30) D +"RTN","BMXSQL",230,0) + . S ^BMXTEMP($J,I)=BMXT,BMXLEN(I)=15,BMXTYP(I)="T" +"RTN","BMXSQL",231,0) + . S I=I+1 +"RTN","BMXSQL",232,0) + S J=0 +"RTN","BMXSQL",233,0) + I $D(BMXX) F S J=$O(BMXX(J)) Q:'+J D +"RTN","BMXSQL",234,0) + . S ^BMXTEMP($J,I)="INDEX("_J_")^" +"RTN","BMXSQL",235,0) + . S I=I+1 +"RTN","BMXSQL",236,0) + . S BMXXT(J)=BMXX(J) +"RTN","BMXSQL",237,0) + . S BMXXT(J)=$P(BMXXT(J)," X BMXSCR") +"RTN","BMXSQL",238,0) + . S ^BMXTEMP($J,I)=$TR(BMXXT(J),"^","~")_$C(30) +"RTN","BMXSQL",239,0) + . S:$L(^BMXTEMP($J,I))>BMXLEN(2) BMXLEN(2)=$L(^BMXTEMP($J,I)) +"RTN","BMXSQL",240,0) + . S I=I+1 +"RTN","BMXSQL",241,0) + S ^BMXTEMP($J,I)="SCREEN^" +"RTN","BMXSQL",242,0) + S I=I+1 +"RTN","BMXSQL",243,0) + S BMXSCRT=$G(BMXSCR) +"RTN","BMXSQL",244,0) + S BMXSCRT=$P(BMXSCRT,"D:'$D(^BMXTMP") +"RTN","BMXSQL",245,0) + S ^BMXTEMP($J,I)=$TR(BMXSCRT,"^","~")_$C(30) +"RTN","BMXSQL",246,0) + S:$L(^BMXTEMP($J,I))>BMXLEN(2) BMXLEN(2)=$L(^BMXTEMP($J,I)) +"RTN","BMXSQL",247,0) + S I=I+1 +"RTN","BMXSQL",248,0) + S J=0 +"RTN","BMXSQL",249,0) + I $D(BMXSCR("C")) F S J=$O(BMXSCR("C",J)) Q:'+J D +"RTN","BMXSQL",250,0) + . S ^BMXTEMP($J,I)="SCREEN("_J_")^" +"RTN","BMXSQL",251,0) + . S I=I+1 +"RTN","BMXSQL",252,0) + . S ^BMXTEMP($J,I)=$TR(BMXSCR("C",J),"^","~")_$C(30) +"RTN","BMXSQL",253,0) + . S:$L(^BMXTEMP($J,I))>BMXLEN(2) BMXLEN(2)=$L(^BMXTEMP($J,I)) +"RTN","BMXSQL",254,0) + . S I=I+1 +"RTN","BMXSQL",255,0) + D COLTYPE +"RTN","BMXSQL",256,0) + S I=I+1 +"RTN","BMXSQL",257,0) + D ERRTACK(I) +"RTN","BMXSQL",258,0) + Q +"RTN","BMXSQL",259,0) + ; +"RTN","BMXSQL",260,0) + ; +"RTN","BMXSQL",261,0) +COLTYPE ;EP - Append column types and widths to output global +"RTN","BMXSQL",262,0) + ;REQUIRES - BMXLEN(),BMXTYP(),^BMXTEMP +"RTN","BMXSQL",263,0) + ;IHS/SET/HMW 4-22-2004 Modified to use new schema string +"RTN","BMXSQL",264,0) + ; +"RTN","BMXSQL",265,0) + ;"@@@meta@@@BMXIEN|FILE #|DA STRING" +"RTN","BMXSQL",266,0) + ; +"RTN","BMXSQL",267,0) + N C +"RTN","BMXSQL",268,0) + S C=0 +"RTN","BMXSQL",269,0) + F S C=$O(BMXLEN(C)) Q:'C D +"RTN","BMXSQL",270,0) + . I BMXLEN(C)>99999 S BMXLEN(C)=99999 +"RTN","BMXSQL",271,0) + . I BMXLEN(C)=0 S BMXLEN(C)=50 ;Default column length +"RTN","BMXSQL",272,0) + . S ^BMXTEMP($J,C)=BMXTYP(C)_$$NUMCHAR(BMXLEN(C))_^BMXTEMP($J,C) +"RTN","BMXSQL",273,0) + Q +"RTN","BMXSQL",274,0) + ; +"RTN","BMXSQL",275,0) + ;S ^BXTEMP($J,0)="@@@meta@@@BMXIEN|"_BMXF_"|" ;Last |-piece will be DA string +"RTN","BMXSQL",276,0) + ;N C +"RTN","BMXSQL",277,0) + ;S C=0 +"RTN","BMXSQL",278,0) + ;F S C=$O(BMXLEN(C)) Q:'C D +"RTN","BMXSQL",279,0) + ;. I BMXLEN(C)>99999 S BMXLEN(C)=99999 +"RTN","BMXSQL",280,0) + ;. I BMXLEN(C)=0 S BMXLEN(C)=50 ;Default column length +"RTN","BMXSQL",281,0) + ;. S ^BMXTEMP($J,C)=BMXTYP(C)_$$NUMCHAR(BMXLEN(C))_^BMXTEMP($J,C) +"RTN","BMXSQL",282,0) + ;Q +"RTN","BMXSQL",283,0) + ; +"RTN","BMXSQL",284,0) +ERRTACK(I) ;EP +"RTN","BMXSQL",285,0) + ; +"RTN","BMXSQL",286,0) + S ^BMXTEMP($J,I)=$C(31) +"RTN","BMXSQL",287,0) + S:$D(BMXERR) ^BMXTEMP($J,I)=^BMXTEMP($J,I)_BMXERR +"RTN","BMXSQL",288,0) + Q +"RTN","BMXSQL",289,0) + ; +"RTN","BMXSQL",290,0) +NUMCHAR(BMXN) ;EP +"RTN","BMXSQL",291,0) + ;---> Returns Field Length left-padded with 0 +"RTN","BMXSQL",292,0) + ; +"RTN","BMXSQL",293,0) + N BMXC +"RTN","BMXSQL",294,0) + S BMXC="00000"_BMXN +"RTN","BMXSQL",295,0) + Q $E(BMXC,$L(BMXC)-4,$L(BMXC)) +"RTN","BMXSQL",296,0) + ; +"RTN","BMXSQL",297,0) + ; +"RTN","BMXSQL",298,0) +INDEX(BMXFF,BMXRET,BMXXCNT) ; +"RTN","BMXSQL",299,0) + ;Returns executable enumerator on first where field with an index +"RTN","BMXSQL",300,0) + ;or "" if no indexed where field +"RTN","BMXSQL",301,0) + ;IN: BMXFF() +"RTN","BMXSQL",302,0) + ;OUT: BMXRET() +"RTN","BMXSQL",303,0) + ; BMXXCNT - size of BMXRET array +"RTN","BMXSQL",304,0) + ; +"RTN","BMXSQL",305,0) + N F,BMXNOD,BMXFNUM,BMXFLDNUM,BMXHIT,BMXREF,BMXRNAM,BMXOP,Q,BMXGL +"RTN","BMXSQL",306,0) + N BMXTMP,BMXTMPV,BMXTMPI,BMXTMPL,BMXTMPN,BMXV,BMXRNOD,BMXTMPP +"RTN","BMXSQL",307,0) + S BMXXCNT=0 +"RTN","BMXSQL",308,0) + S Q=$C(34) +"RTN","BMXSQL",309,0) + I 'BMXFF Q +"RTN","BMXSQL",310,0) + S F=0,BMXHIT=0 +"RTN","BMXSQL",311,0) + ; +"RTN","BMXSQL",312,0) + ;--->Search BMXFF for special case WHERE clause 1 = "0" +"RTN","BMXSQL",313,0) + ; reset BMXX(1) to return no records +"RTN","BMXSQL",314,0) + F F=1:1:BMXFF S BMXNOD=BMXFF(F) D Q:$D(BMXERR) Q:BMXHIT +"RTN","BMXSQL",315,0) + . I ($P(BMXFF(F),"^",2,4)="1^=^0")!($P(BMXFF(F),"^",2,4)="0^=^1") S BMXRET(1)="Q ",BMXHIT=1,BMXXCNT=1 +"RTN","BMXSQL",316,0) + . Q +"RTN","BMXSQL",317,0) + Q:BMXHIT +"RTN","BMXSQL",318,0) + ; +"RTN","BMXSQL",319,0) + ;Organize the first level into AND- and OR-parts +"RTN","BMXSQL",320,0) + N BMXR1,BMXR2,BMXE,BMXR3,BMXRNAM +"RTN","BMXSQL",321,0) + N BMXSTOP,BMXOR +"RTN","BMXSQL",322,0) + D PLEVEL^BMXSQL3(.BMXFF,.BMXR1,.BMXR2) +"RTN","BMXSQL",323,0) + ; +"RTN","BMXSQL",324,0) + N BMXPFF S BMXPFF=0 +"RTN","BMXSQL",325,0) + S BMXR3=0 +"RTN","BMXSQL",326,0) + ;Look for an AND-part with only one element. +"RTN","BMXSQL",327,0) + ; If found, build an iterator on it and quit +"RTN","BMXSQL",328,0) + F J=1:1:$L(BMXR2,"&") D Q:BMXHIT +"RTN","BMXSQL",329,0) + . S BMXE=$P(BMXR2,"&",J) +"RTN","BMXSQL",330,0) + . I +BMXE=BMXE,BMXR1(BMXE,"ELEMENTS")=1 D +"RTN","BMXSQL",331,0) + . . ;Test index for element +"RTN","BMXSQL",332,0) + . . F K=BMXR1(BMXE,"BEGIN"):1:BMXR1(BMXE,"END") I "(^)"'[BMXFF(K) D Q ;I'm not sure why this quit was here +"RTN","BMXSQL",333,0) + . . . Q:$D(BMXFF(K,"JOIN")) +"RTN","BMXSQL",334,0) + . . . S BMXPFP=K,BMXPFF=0 +"RTN","BMXSQL",335,0) + . . . D XRTST^BMXSQL3(.BMXFF,K,.BMXR3,.BMXRNAM,.BMXPFP) +"RTN","BMXSQL",336,0) + . . . I BMXR3 S BMXHIT=1,BMXFF(K,"INDEXED")=1 +"RTN","BMXSQL",337,0) + . Q:'BMXHIT +"RTN","BMXSQL",338,0) + . ;Build iterator and quit +"RTN","BMXSQL",339,0) + . D BLDIT^BMXSQL3(.BMXFF,K,.BMXRNAM,.BMXOR,.BMXPFP) +"RTN","BMXSQL",340,0) + . S BMXXCNT=1 +"RTN","BMXSQL",341,0) + . S BMXRET(BMXXCNT)=BMXOR +"RTN","BMXSQL",342,0) + . Q +"RTN","BMXSQL",343,0) + Q:BMXHIT +"RTN","BMXSQL",344,0) + ; +"RTN","BMXSQL",345,0) + ;None of the single-element AND parts has a good index or +"RTN","BMXSQL",346,0) + ; there are no single-element AND parts +"RTN","BMXSQL",347,0) + ;If there are no OR-parts, then there are no good indexes so quit +"RTN","BMXSQL",348,0) + I $L(BMXR2,"!")=1 Q +"RTN","BMXSQL",349,0) + ; +"RTN","BMXSQL",350,0) + ;Test each OR-part for a good index. +"RTN","BMXSQL",351,0) + ;If an OR-part is multi-element or +"RTN","BMXSQL",352,0) + ;if one OR-part doesn't have an index +"RTN","BMXSQL",353,0) + ;then set up to do a table scan and quit +"RTN","BMXSQL",354,0) + S BMXSTOP=0 +"RTN","BMXSQL",355,0) + F J=1:1:$L(BMXR2,"!") D Q:BMXSTOP +"RTN","BMXSQL",356,0) + . S BMXE=$P(BMXR2,"!",J) +"RTN","BMXSQL",357,0) + . I +BMXE=BMXE D +"RTN","BMXSQL",358,0) + . . I BMXR1(BMXE,"ELEMENTS")'=1 S BMXSTOP=1 Q ;Multiple elements +"RTN","BMXSQL",359,0) + . . ;Test index elements +"RTN","BMXSQL",360,0) + . . F K=BMXR1(BMXE,"BEGIN"):1:BMXR1(BMXE,"END") I "(^)"'[BMXFF(K) D Q +"RTN","BMXSQL",361,0) + . . . S BMXPFP=K,BMXPFF=0 +"RTN","BMXSQL",362,0) + . . . D XRTST^BMXSQL3(.BMXFF,K,.BMXR3,.BMXRNAM,.BMXPFP) +"RTN","BMXSQL",363,0) + . . . I 'BMXR3 S BMXSTOP=1 Q +"RTN","BMXSQL",364,0) + . . . S BMXFF(K,"INDEXED")=1 +"RTN","BMXSQL",365,0) + . . . S BMXR1(BMXE,"XREF")=BMXRNAM +"RTN","BMXSQL",366,0) + ; +"RTN","BMXSQL",367,0) + ;Build iterator and quit +"RTN","BMXSQL",368,0) + I BMXSTOP D Q ;One of the elements had no index +"RTN","BMXSQL",369,0) + . S J=0 F S J=$O(BMXFF(J)) Q:'+J K BMXFF(J,"INDEXED") +"RTN","BMXSQL",370,0) + S BMXXCNT=0 +"RTN","BMXSQL",371,0) + F J=1:1:$L(BMXR2,"!") D +"RTN","BMXSQL",372,0) + . S BMXE=$P(BMXR2,"!",J) +"RTN","BMXSQL",373,0) + . I +BMXE=BMXE,BMXR1(BMXE,"ELEMENTS")=1 D +"RTN","BMXSQL",374,0) + . . F K=BMXR1(BMXE,"BEGIN"):1:BMXR1(BMXE,"END") I "(^)"'[BMXFF(K) D Q +"RTN","BMXSQL",375,0) + . . . D BLDIT^BMXSQL3(.BMXFF,K,BMXR1(BMXE,"XREF"),.BMXOR,.BMXPFP) +"RTN","BMXSQL",376,0) + . . . S BMXXCNT=BMXXCNT+1 +"RTN","BMXSQL",377,0) + . . . S BMXRET(BMXXCNT)=BMXOR +"RTN","BMXSQL",378,0) + . Q +"RTN","BMXSQL",379,0) + Q +"RTN","BMXSQL",380,0) + ; +"RTN","BMXSQL",381,0) + ; +"RTN","BMXSQL",382,0) + ; +"RTN","BMXSQL",383,0) +ERROR ;EP - Error processing +"RTN","BMXSQL",384,0) + ;W !,BMXERR +"RTN","BMXSQL",385,0) + ;N A +"RTN","BMXSQL",386,0) + ;S A=0 +"RTN","BMXSQL",387,0) + ;I $D(I) S A=I +"RTN","BMXSQL",388,0) + ;D ERROUT(BMXERR,A) +"RTN","BMXSQL",389,0) + ;B ;ERROR in BMXSQL +"RTN","BMXSQL",390,0) + Q +"RTN","BMXSQL",391,0) + ; +"RTN","BMXSQL",392,0) +ERROUT(BMXERR,I) ;EP +"RTN","BMXSQL",393,0) + ;---> Save next line for Error Code File if ever used. +"RTN","BMXSQL",394,0) + ;---> If necessary, use I>1 to avoid overwriting valid data. +"RTN","BMXSQL",395,0) + D ERRTACK(I) +"RTN","BMXSQL",396,0) + Q +"RTN","BMXSQL",397,0) + ; +"RTN","BMXSQL",398,0) +ERRTRAP ; +"RTN","BMXSQL",399,0) + ; +"RTN","BMXSQL",400,0) + K ^BMXTEMP($J) +"RTN","BMXSQL",401,0) + S ^BMXTEMP($J,0)="T00030M_ERROR"_$C(30) +"RTN","BMXSQL",402,0) + S BMXZE=$$EC^%ZOSV +"RTN","BMXSQL",403,0) + S BMXZE=$TR(BMXZE,"^","~") +"RTN","BMXSQL",404,0) + S ^BMXTEMP($J,1)=BMXZE_$C(30) +"RTN","BMXSQL",405,0) + S ^BMXTEMP($J,2)=$C(31) +"RTN","BMXSQL",406,0) + Q +"RTN","BMXSQL1") +0^98^B112955506 +"RTN","BMXSQL1",1,0) +BMXSQL1 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL1",3,0) + ; +"RTN","BMXSQL1",4,0) + ; +"RTN","BMXSQL1",5,0) +KW(BMXTK) ;EP +"RTN","BMXSQL1",6,0) + ;Identify and mark keywords in BMXTK +"RTN","BMXSQL1",7,0) + ;MODIFIES BMXTK +"RTN","BMXSQL1",8,0) + ; +"RTN","BMXSQL1",9,0) + N J,BMXSTOP,BMXTMP +"RTN","BMXSQL1",10,0) + ;Combine ORDER BY and GROUP BY into a single token +"RTN","BMXSQL1",11,0) + ; +"RTN","BMXSQL1",12,0) + S J=0 +"RTN","BMXSQL1",13,0) + F S J=$O(BMXTK(J)) Q:'+J D +"RTN","BMXSQL1",14,0) + . S BMXTMP=$$UCASE(BMXTK(J)) +"RTN","BMXSQL1",15,0) + . I BMXTMP="ORDER"!(BMXTMP="GROUP") D +"RTN","BMXSQL1",16,0) + . . I $D(BMXTK(J+1)),$$UCASE(BMXTK(J+1))="BY" D +"RTN","BMXSQL1",17,0) + . . . S BMXTK(J)=BMXTK(J)_" "_BMXTK(J+1) +"RTN","BMXSQL1",18,0) + . . . S BMXTK(J)=$$UCASE(BMXTK(J)) +"RTN","BMXSQL1",19,0) + . . . S BMXTK(BMXTK(J))=J +"RTN","BMXSQL1",20,0) + . . . K BMXTK(J+1) +"RTN","BMXSQL1",21,0) + . . . Q +"RTN","BMXSQL1",22,0) + . . Q +"RTN","BMXSQL1",23,0) + . Q +"RTN","BMXSQL1",24,0) + ; +"RTN","BMXSQL1",25,0) + ;Find SELECT +"RTN","BMXSQL1",26,0) + S J=0,BMXSTOP=0 +"RTN","BMXSQL1",27,0) + F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP +"RTN","BMXSQL1",28,0) + . I $$UCASE(BMXTK(J))="SELECT" D +"RTN","BMXSQL1",29,0) + . . S BMXTK(J)=$$UCASE(BMXTK(J)) +"RTN","BMXSQL1",30,0) + . . S BMXTK("SELECT")=J +"RTN","BMXSQL1",31,0) + . . S BMXSTOP=1 +"RTN","BMXSQL1",32,0) + . . Q +"RTN","BMXSQL1",33,0) + . Q +"RTN","BMXSQL1",34,0) + I '+J S BMXERR="SELECT KEYWORD NOT FOUND" Q +"RTN","BMXSQL1",35,0) + ; +"RTN","BMXSQL1",36,0) + ;DISTINCT +"RTN","BMXSQL1",37,0) + S BMXSTOP=0 +"RTN","BMXSQL1",38,0) + F S J=$O(BMXTK(J)) Q:'+J Q:$$UCASE(BMXTK(J))="FROM" D Q:BMXSTOP +"RTN","BMXSQL1",39,0) + . I $$UCASE(BMXTK(J))="DISTINCT" D +"RTN","BMXSQL1",40,0) + . . S BMXTK("DISTINCT")="TRUE" +"RTN","BMXSQL1",41,0) + . . K BMXTK(J) +"RTN","BMXSQL1",42,0) + . . S J=J-1 +"RTN","BMXSQL1",43,0) + . . S BMXSTOP=1 +"RTN","BMXSQL1",44,0) + . Q +"RTN","BMXSQL1",45,0) + ; +"RTN","BMXSQL1",46,0) + ;FROM +"RTN","BMXSQL1",47,0) + S BMXSTOP=0 +"RTN","BMXSQL1",48,0) + S J=J-1 +"RTN","BMXSQL1",49,0) + F S J=$O(BMXTK(J)) Q:'+J Q:$$UCASE(BMXTK(J))="WHERE" D Q:BMXSTOP +"RTN","BMXSQL1",50,0) + . I $$UCASE(BMXTK(J))="FROM" D +"RTN","BMXSQL1",51,0) + . . S BMXTK(J)=$$UCASE(BMXTK(J)) +"RTN","BMXSQL1",52,0) + . . S BMXTK("FROM")=J +"RTN","BMXSQL1",53,0) + . . S BMXSTOP=1 +"RTN","BMXSQL1",54,0) + . . Q +"RTN","BMXSQL1",55,0) + . Q +"RTN","BMXSQL1",56,0) + ; +"RTN","BMXSQL1",57,0) + I '$D(BMXTK("FROM")) S BMXERR="'FROM' KEYWORD NOT FOUND" Q +"RTN","BMXSQL1",58,0) + ; +"RTN","BMXSQL1",59,0) + ;WHERE +"RTN","BMXSQL1",60,0) + S BMXSTOP=0 +"RTN","BMXSQL1",61,0) + F S J=$O(BMXTK(J)) Q:'+J Q:BMXTK(J)="ORDER BY" Q:BMXTK(J)="GROUP BY" D Q:BMXSTOP +"RTN","BMXSQL1",62,0) + . I $$UCASE(BMXTK(J))="WHERE" D +"RTN","BMXSQL1",63,0) + . . S BMXTK(J)=$$UCASE(BMXTK(J)) +"RTN","BMXSQL1",64,0) + . . S BMXTK("WHERE")=J +"RTN","BMXSQL1",65,0) + . . S BMXSTOP=1 +"RTN","BMXSQL1",66,0) + . Q +"RTN","BMXSQL1",67,0) + ; +"RTN","BMXSQL1",68,0) + ;SHOWPLAN +"RTN","BMXSQL1",69,0) + S J=BMXTK("FROM") +"RTN","BMXSQL1",70,0) + S BMXSTOP=0 +"RTN","BMXSQL1",71,0) + F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP +"RTN","BMXSQL1",72,0) + . I $$UCASE(BMXTK(J))="SHOWPLAN" D +"RTN","BMXSQL1",73,0) + . . S BMXTK("SHOWPLAN")="TRUE" +"RTN","BMXSQL1",74,0) + . . K BMXTK(J) +"RTN","BMXSQL1",75,0) + . . S J=J-1 +"RTN","BMXSQL1",76,0) + . . S BMXSTOP=1 +"RTN","BMXSQL1",77,0) + . Q +"RTN","BMXSQL1",78,0) + ; +"RTN","BMXSQL1",79,0) + ;MAXRECORDS +"RTN","BMXSQL1",80,0) + S J=BMXTK("FROM") +"RTN","BMXSQL1",81,0) + S BMXSTOP=0 +"RTN","BMXSQL1",82,0) + F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP +"RTN","BMXSQL1",83,0) + . I $$UCASE(BMXTK(J))["MAXRECORDS" D +"RTN","BMXSQL1",84,0) + . . S BMXXMAX=+$P(BMXTK(J),":",2)-1 +"RTN","BMXSQL1",85,0) + . . S:+BMXXMAX<0 BMXXMAX=0 +"RTN","BMXSQL1",86,0) + . . K BMXTK(J) +"RTN","BMXSQL1",87,0) + . . S J=J-1 +"RTN","BMXSQL1",88,0) + . . S BMXSTOP=1 +"RTN","BMXSQL1",89,0) + . Q +"RTN","BMXSQL1",90,0) + Q +"RTN","BMXSQL1",91,0) + ; +"RTN","BMXSQL1",92,0) +SCREEN ;EP +"RTN","BMXSQL1",93,0) + ;Set up BMXFG() array of executable screen code +"RTN","BMXSQL1",94,0) + N F,BMXNOD,BMXFNUM,BMXFLDNUM,BMXHIT,BMXREF +"RTN","BMXSQL1",95,0) + N BMXRNAM,BMXRET,BMXOP,Q,BMXPC,BMXV,BMXFLDLO,BMXFLDNO +"RTN","BMXSQL1",96,0) + N BMXGL +"RTN","BMXSQL1",97,0) + S BMXRET="" +"RTN","BMXSQL1",98,0) + S Q=$C(34) +"RTN","BMXSQL1",99,0) + S BMXFG=BMXFF +"RTN","BMXSQL1",100,0) + S BMXFG("C")=0 +"RTN","BMXSQL1",101,0) + I 'BMXFF Q +"RTN","BMXSQL1",102,0) + S F=0,BMXHIT=0 +"RTN","BMXSQL1",103,0) + F F=1:1:BMXFF S BMXNOD=BMXFF(F) D Q:$D(BMXERR) Q:BMXHIT +"RTN","BMXSQL1",104,0) + . I $G(BMXFF(F,"INDEXED"))=1 D Q +"RTN","BMXSQL1",105,0) + . . S BMXFG(F)="1" +"RTN","BMXSQL1",106,0) + . . Q +"RTN","BMXSQL1",107,0) + . I $D(BMXFF(F,"JOIN")) D Q +"RTN","BMXSQL1",108,0) + . . S BMXFG(F)="1" +"RTN","BMXSQL1",109,0) + . . Q +"RTN","BMXSQL1",110,0) + . I "(^)"[BMXFF(F) D Q +"RTN","BMXSQL1",111,0) + . . S BMXFG(F)=BMXFF(F) +"RTN","BMXSQL1",112,0) + . . Q +"RTN","BMXSQL1",113,0) + . I "AND^OR"[BMXFF(F) D Q +"RTN","BMXSQL1",114,0) + . . I BMXFF(F)="AND" S BMXFG(F)="&" Q +"RTN","BMXSQL1",115,0) + . . S BMXFG(F)="!" +"RTN","BMXSQL1",116,0) + . . Q +"RTN","BMXSQL1",117,0) + . S BMXFNUM=$S(+$P(BMXNOD,U):$P(BMXNOD,U),1:$O(^DIC("B",$P(BMXNOD,U),0))) +"RTN","BMXSQL1",118,0) + . I '+BMXFNUM D ;Not a fileman field +"RTN","BMXSQL1",119,0) + . . S BMXFLDNUM=0,BMXFLDNO="" +"RTN","BMXSQL1",120,0) + . . S BMXFLDLO=$P(BMXFF(F),U,2) +"RTN","BMXSQL1",121,0) + . . ; +"RTN","BMXSQL1",122,0) + . E D ;Get fileman field data +"RTN","BMXSQL1",123,0) + . . S BMXGL=^DIC(BMXFNUM,0,"GL") +"RTN","BMXSQL1",124,0) + . . I $D(BMXFF(F,"IEN")) D +"RTN","BMXSQL1",125,0) + . . . S BMXFLDNUM=".001" +"RTN","BMXSQL1",126,0) + . . . S BMXFLDNO="IEN" +"RTN","BMXSQL1",127,0) + . . E D +"RTN","BMXSQL1",128,0) + . . . S BMXFLDNUM=$O(^DD(BMXFNUM,"B",$P(BMXNOD,U,2),0)) +"RTN","BMXSQL1",129,0) + . . . S BMXFLDNO=^DD(BMXFNUM,BMXFLDNUM,0) +"RTN","BMXSQL1",130,0) + . I BMXFLDNO="IEN" D ;BMXIEN field +"RTN","BMXSQL1",131,0) + . . N BMXEXT,C S BMXEXT=0 +"RTN","BMXSQL1",132,0) + . . ;S BMXPC=$P(BMXFLDNO,U,4) +"RTN","BMXSQL1",133,0) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer +"RTN","BMXSQL1",134,0) + . . S BMXFLDLO="D0" +"RTN","BMXSQL1",135,0) + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" +"RTN","BMXSQL1",136,0) + . I $P(BMXFLDNO,U,2)["D" D ;Date field +"RTN","BMXSQL1",137,0) + . . N BMXEXT,C S BMXEXT=0 +"RTN","BMXSQL1",138,0) + . . S BMXPC=$P(BMXFLDNO,U,4) +"RTN","BMXSQL1",139,0) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer +"RTN","BMXSQL1",140,0) + . . S BMXFLDLO="$P($G("_BMXGL_"D0,"_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")" +"RTN","BMXSQL1",141,0) + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" +"RTN","BMXSQL1",142,0) + . I $P(BMXFLDNO,U,2)["S" D ;Set field +"RTN","BMXSQL1",143,0) + . . N BMXEXT,C S BMXEXT=0 +"RTN","BMXSQL1",144,0) + . . S BMXPC=$P(BMXFLDNO,U,4) +"RTN","BMXSQL1",145,0) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer +"RTN","BMXSQL1",146,0) + . . S BMXFLDLO="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")" +"RTN","BMXSQL1",147,0) + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" +"RTN","BMXSQL1",148,0) + . ; +"RTN","BMXSQL1",149,0) + . I $P(BMXFLDNO,U,2)["P" D ;Pointer field +"RTN","BMXSQL1",150,0) + . . N C,BMXEXT +"RTN","BMXSQL1",151,0) + . . S BMXEXT=0 +"RTN","BMXSQL1",152,0) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) D +"RTN","BMXSQL1",153,0) + . . . N R,G,BMXJN,BMXMSCR +"RTN","BMXSQL1",154,0) + . . . S BMXMXCR=1 ;Remove after testing. Find out if the field is from a subfile. +"RTN","BMXSQL1",155,0) + . . . I BMXMXCR D Q +"RTN","BMXSQL1",156,0) + . . . . ;Set up a screen in BMXSCR and in BMXMFL( +"RTN","BMXSQL1",157,0) + . . . . Q +"RTN","BMXSQL1",158,0) + . . . ; +"RTN","BMXSQL1",159,0) + . . . ;Find the node of BMXFF that has the join info +"RTN","BMXSQL1",160,0) + . . . S BMXEXT=1 +"RTN","BMXSQL1",161,0) + . . . S BMXFG("C")=BMXFG("C")+1 +"RTN","BMXSQL1",162,0) + . . . S C=BMXFG("C") +"RTN","BMXSQL1",163,0) + . . . 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 +"RTN","BMXSQL1",164,0) + . . . S BMXJN=BMXFF(G,"JOIN") +"RTN","BMXSQL1",165,0) + . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) +"RTN","BMXSQL1",166,0) + . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 S X=" +"RTN","BMXSQL1",167,0) + . . . S BMXFG("C",C)=BMXJN +"RTN","BMXSQL1",168,0) + . . S BMXFLDLO=$$SCRNP(F,BMXGL,BMXFLDNUM,BMXFLDNO) +"RTN","BMXSQL1",169,0) + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" +"RTN","BMXSQL1",170,0) + . I $P(BMXFLDNO,U,2)["C" D ;Computed field +"RTN","BMXSQL1",171,0) + . . N C +"RTN","BMXSQL1",172,0) + . . S BMXPC=$P(BMXFLDNO,U,5,99) +"RTN","BMXSQL1",173,0) + . . S BMXFG("C")=BMXFG("C")+1 +"RTN","BMXSQL1",174,0) + . . S C=BMXFG("C") +"RTN","BMXSQL1",175,0) + . . ;If computed field not in primary file, connect navigation code +"RTN","BMXSQL1",176,0) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) D +"RTN","BMXSQL1",177,0) + . . . ;Find the node of BMXFF that has the join info +"RTN","BMXSQL1",178,0) + . . . N R,G,BMXJN +"RTN","BMXSQL1",179,0) + . . . 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 +"RTN","BMXSQL1",180,0) + . . . S BMXJN=BMXFF(G,"JOIN") +"RTN","BMXSQL1",181,0) + . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) +"RTN","BMXSQL1",182,0) + . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 " +"RTN","BMXSQL1",183,0) + . . . S BMXJN=BMXJN_BMXPC +"RTN","BMXSQL1",184,0) + . . . S BMXFF(F,0)=$P(BMXFF(F,0),U,1,4) +"RTN","BMXSQL1",185,0) + . . . S $P(BMXFF(F,0),U,5)=BMXJN +"RTN","BMXSQL1",186,0) + . . . S BMXPC=BMXJN +"RTN","BMXSQL1",187,0) + . . S BMXFG("C",C)=BMXPC +"RTN","BMXSQL1",188,0) + . . S BMXFLDLO="BMXSCR(""X"","_C_")" +"RTN","BMXSQL1",189,0) + . I $P(BMXFLDNO,U,2)["N" D ;Numeric field +"RTN","BMXSQL1",190,0) + . . N BMXEXT,C S BMXEXT=0 +"RTN","BMXSQL1",191,0) + . . S BMXPC=$P(BMXFLDNO,U,4) +"RTN","BMXSQL1",192,0) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer +"RTN","BMXSQL1",193,0) + . . S BMXFLDLO="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")" +"RTN","BMXSQL1",194,0) + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" +"RTN","BMXSQL1",195,0) + . ; +"RTN","BMXSQL1",196,0) + . I $P(BMXFLDNO,U,2)["F" D ;Free Text field +"RTN","BMXSQL1",197,0) + . . N BMXEXT,C S BMXEXT=0,C=0 +"RTN","BMXSQL1",198,0) + . . S BMXPC=$P(BMXFLDNO,U,4) +"RTN","BMXSQL1",199,0) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D +"RTN","BMXSQL1",200,0) + . . . N R,G,BMXJN +"RTN","BMXSQL1",201,0) + . . . S BMXFG("C")=BMXFG("C")+1 +"RTN","BMXSQL1",202,0) + . . . S C=BMXFG("C") +"RTN","BMXSQL1",203,0) + . . . 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 +"RTN","BMXSQL1",204,0) + . . . S BMXJN=BMXFF(G,"JOIN") +"RTN","BMXSQL1",205,0) + . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) +"RTN","BMXSQL1",206,0) + . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN +"RTN","BMXSQL1",207,0) + . . . S BMXJN=BMXJN_"I +D0 S X=" +"RTN","BMXSQL1",208,0) + . . . S BMXFG("C",C)=BMXJN +"RTN","BMXSQL1",209,0) + . . . S BMXFLDLO="BMXSCR(""X"","_C_")" +"RTN","BMXSQL1",210,0) + . . I $P(BMXFLDNO,U,4)["E" D +"RTN","BMXSQL1",211,0) + . . . N BMXPC2,BMXTMP +"RTN","BMXSQL1",212,0) + . . . S BMXPC2=$P(BMXPC,"E",2) +"RTN","BMXSQL1",213,0) + . . . S BMXTMP="$E("_BMXGL_"D0,"_$P(BMXPC,";")_"),"_$P(BMXPC2,",")_","_$P(BMXPC2,",",2)_")" +"RTN","BMXSQL1",214,0) + . . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXTMP +"RTN","BMXSQL1",215,0) + . . . E S BMXFLDLO=BMXTMP +"RTN","BMXSQL1",216,0) + . . E D +"RTN","BMXSQL1",217,0) + . . . N BMXTMP +"RTN","BMXSQL1",218,0) + . . . S BMXTMP="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")" +"RTN","BMXSQL1",219,0) + . . . S BMXTMP="$S($D("_BMXGL_"D0,"_$P(BMXPC,";")_")):"_BMXTMP_",1:"""")" +"RTN","BMXSQL1",220,0) + . . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXTMP +"RTN","BMXSQL1",221,0) + . . . E S BMXFLDLO=BMXTMP +"RTN","BMXSQL1",222,0) + . ; +"RTN","BMXSQL1",223,0) + . S BMXOP=$P(BMXNOD,U,3) +"RTN","BMXSQL1",224,0) + . S BMXV=$P(BMXFF(F),U,4) +"RTN","BMXSQL1",225,0) + . I "<^>^=^["[BMXOP D +"RTN","BMXSQL1",226,0) + . . I BMXOP=">",BMXV?.A S BMXOP="]" +"RTN","BMXSQL1",227,0) + . . I BMXOP="<",BMXV?.A S BMXOP="']" +"RTN","BMXSQL1",228,0) + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" +"RTN","BMXSQL1",229,0) + . . Q +"RTN","BMXSQL1",230,0) + . I "<>"=BMXOP D +"RTN","BMXSQL1",231,0) + . . S BMXOP="'=" +"RTN","BMXSQL1",232,0) + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" +"RTN","BMXSQL1",233,0) + . I ">="=BMXOP D +"RTN","BMXSQL1",234,0) + . . I BMXV="" S BMXRET="(I 1)" Q +"RTN","BMXSQL1",235,0) + . . I +BMXV=BMXV D Q +"RTN","BMXSQL1",236,0) + . . . S BMXOP="'<" +"RTN","BMXSQL1",237,0) + . . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" +"RTN","BMXSQL1",238,0) + . . S BMXV=$$DECSTR^BMXSQL2(BMXV) +"RTN","BMXSQL1",239,0) + . . S BMXOP="]" +"RTN","BMXSQL1",240,0) + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" +"RTN","BMXSQL1",241,0) + . I "<="=BMXOP D +"RTN","BMXSQL1",242,0) + . . I BMXV="" S BMXRET="(I 0)" Q +"RTN","BMXSQL1",243,0) + . . I +BMXV=BMXV D Q +"RTN","BMXSQL1",244,0) + . . . S BMXOP="'>" +"RTN","BMXSQL1",245,0) + . . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" +"RTN","BMXSQL1",246,0) + . . S BMXV=$$INCSTR^BMXSQL2(BMXV) +"RTN","BMXSQL1",247,0) + . . S BMXOP="']" +"RTN","BMXSQL1",248,0) + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" +"RTN","BMXSQL1",249,0) + . I BMXOP="BETWEEN" D +"RTN","BMXSQL1",250,0) + . . I +$P(BMXV,"~")'=$P(BMXV,"~") D ;BMXV a string +"RTN","BMXSQL1",251,0) + . . . N W,X,Y,Z +"RTN","BMXSQL1",252,0) + . . . S X=$P(BMXV,"~") +"RTN","BMXSQL1",253,0) + . . . S Y=$E(X,1,$L(X)-1) +"RTN","BMXSQL1",254,0) + . . . S Z=$E(X,$L(X)) +"RTN","BMXSQL1",255,0) + . . . S Z=$A(Z) +"RTN","BMXSQL1",256,0) + . . . S Z=Z-1 +"RTN","BMXSQL1",257,0) + . . . S Z=$C(Z) +"RTN","BMXSQL1",258,0) + . . . S W=Y_Z +"RTN","BMXSQL1",259,0) + . . . S $P(BMXV,"~")=W +"RTN","BMXSQL1",260,0) + . . . S BMXRET="(("_BMXFLDLO_"]"_Q_$P(BMXV,"~")_Q_")&("_BMXFLDLO_"']"_Q_$P(BMXV,"~",2)_Q_"))" +"RTN","BMXSQL1",261,0) + . . E D ;BMXV a number +"RTN","BMXSQL1",262,0) + . . . S BMXRET="(("_BMXFLDLO_"'<"_$P(BMXV,"~")_")&("_BMXFLDLO_"'>"_$P(BMXV,"~",2)_"))" +"RTN","BMXSQL1",263,0) + . . Q +"RTN","BMXSQL1",264,0) + . I BMXOP="LIKE" D +"RTN","BMXSQL1",265,0) + . . S BMXRET="("_BMXFLDLO_"?1"_Q_BMXV_Q_".E)" +"RTN","BMXSQL1",266,0) + . I BMXRET]"" D +"RTN","BMXSQL1",267,0) + . . S BMXFG(F)=BMXRET +"RTN","BMXSQL1",268,0) + . . Q +"RTN","BMXSQL1",269,0) + . ;TODO: Pointer fields +"RTN","BMXSQL1",270,0) + . ;TODO: Computed fields +"RTN","BMXSQL1",271,0) + . ;TODO: Sets of codes +"RTN","BMXSQL1",272,0) + . ;TODO: Dates +"RTN","BMXSQL1",273,0) + . Q +"RTN","BMXSQL1",274,0) + Q +"RTN","BMXSQL1",275,0) + ; +"RTN","BMXSQL1",276,0) +SCRNP(F,BMXGL,BMXFLDNU,BMXFLDNO) ; +"RTN","BMXSQL1",277,0) + ;Requires BMXFF() +"RTN","BMXSQL1",278,0) + ;Sets up expression for pointer field +"RTN","BMXSQL1",279,0) + N BMX,BMXCOR,BMXRET,BMXPC +"RTN","BMXSQL1",280,0) + S BMXPC=$P(BMXFLDNO,U,4) +"RTN","BMXSQL1",281,0) + S BMXCOR="$P($G("_BMXGL_"D0,"_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")" +"RTN","BMXSQL1",282,0) + S BMXRET=BMXCOR +"RTN","BMXSQL1",283,0) + Q:$D(BMXFF(F,"INTERNAL")) BMXRET +"RTN","BMXSQL1",284,0) + S BMXFNUM=$P(BMXFLDNO,U,2) +"RTN","BMXSQL1",285,0) + S BMXFNUM=+$P(BMXFNUM,"P",2) +"RTN","BMXSQL1",286,0) + S BMXGL=^DIC(BMXFNUM,0,"GL") +"RTN","BMXSQL1",287,0) + S BMXFLDNUM=".01" +"RTN","BMXSQL1",288,0) + S BMXFLDNO=^DD(BMXFNUM,BMXFLDNUM,0) +"RTN","BMXSQL1",289,0) + F D:$P(BMXFLDNO,U,2)["P" Q:$P(BMXFLDNO,U,2)'["P" +"RTN","BMXSQL1",290,0) + . S BMXPC=$P(BMXFLDNO,U,4) +"RTN","BMXSQL1",291,0) + . S BMXRET="$P($G("_BMXGL_BMXRET_","_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")" +"RTN","BMXSQL1",292,0) + . S BMXFNUM=$P(BMXFLDNO,U,2) +"RTN","BMXSQL1",293,0) + . S BMXFNUM=+$P(BMXFNUM,"P",2) +"RTN","BMXSQL1",294,0) + . S BMXGL=^DIC(BMXFNUM,0,"GL") +"RTN","BMXSQL1",295,0) + . S BMXFLDNUM=".01" +"RTN","BMXSQL1",296,0) + . S BMXFLDNO=^DD(BMXFNUM,BMXFLDNUM,0) +"RTN","BMXSQL1",297,0) + ;B ;SCRN2 After chain +"RTN","BMXSQL1",298,0) + ;I 0 D ;$P(BMXFLDNO,U,2)["D" D ;Pointer to a date +"RTN","BMXSQL1",299,0) + ;. Q:+$G(BMXFF(F,"INDEXED")) ;Dates converted when iterator built +"RTN","BMXSQL1",300,0) + ;. N BMXD,J +"RTN","BMXSQL1",301,0) + ;. S BMXD=$P(BMXFF(F),U,4) +"RTN","BMXSQL1",302,0) + ;. S %DT="T" +"RTN","BMXSQL1",303,0) + ;. F J=1:1:$L(BMXD,"~") D +"RTN","BMXSQL1",304,0) + ;. . S X=$P(BMXD,"~",J) +"RTN","BMXSQL1",305,0) + ;. . D ^%DT +"RTN","BMXSQL1",306,0) + ;. . S $P(BMXD,"~",J)=Y +"RTN","BMXSQL1",307,0) + ;. S $P(BMXFF(F),U,4)=BMXD +"RTN","BMXSQL1",308,0) + S BMXRET="$P($G("_BMXGL_BMXRET_",0)),U,1)" +"RTN","BMXSQL1",309,0) + S BMXRET="$S(+"_BMXCOR_":"_BMXRET_",1:"""")" +"RTN","BMXSQL1",310,0) + Q BMXRET +"RTN","BMXSQL1",311,0) + ; +"RTN","BMXSQL1",312,0) +CASE(BMXTK) ;EP +"RTN","BMXSQL1",313,0) + ;Convert keywords to uppercase +"RTN","BMXSQL1",314,0) + N J +"RTN","BMXSQL1",315,0) + S J=0 +"RTN","BMXSQL1",316,0) + F S J=$O(BMXTK(J)) Q:'+J D +"RTN","BMXSQL1",317,0) + . F K="DISTINCT","SELECT","WHERE","FROM","SHOWPLAN" D +"RTN","BMXSQL1",318,0) + . . I $$UCASE(BMXTK(J))=K S BMXTK(J)=$$UCASE(BMXTK(J)) +"RTN","BMXSQL1",319,0) + . Q +"RTN","BMXSQL1",320,0) + Q +"RTN","BMXSQL1",321,0) + ; +"RTN","BMXSQL1",322,0) +UCASE(X) ;EP Convert X to uppercase +"RTN","BMXSQL1",323,0) + F %=1:1:$L(X) S:$E(X,%)?1L X=$E(X,0,%-1)_$C($A(X,%)-32)_$E(X,%+1,999) +"RTN","BMXSQL1",324,0) + Q X +"RTN","BMXSQL1",325,0) + ; +"RTN","BMXSQL1",326,0) +EXP ;Extended pointer +"RTN","BMXSQL1",327,0) + N R,G,BMXJN +"RTN","BMXSQL1",328,0) + S BMXEXT=1 +"RTN","BMXSQL1",329,0) + S BMXFG("C")=BMXFG("C")+1 +"RTN","BMXSQL1",330,0) + S C=BMXFG("C") +"RTN","BMXSQL1",331,0) + 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 +"RTN","BMXSQL1",332,0) + S BMXJN=BMXFF(G,"JOIN") +"RTN","BMXSQL1",333,0) + S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) +"RTN","BMXSQL1",334,0) + S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 S X=" +"RTN","BMXSQL1",335,0) + S BMXFG("C",C)=BMXJN +"RTN","BMXSQL1",336,0) + Q +"RTN","BMXSQL2") +0^99^B9590811 +"RTN","BMXSQL2",1,0) +BMXSQL2 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL2",3,0) + ; +"RTN","BMXSQL2",4,0) + ; +"RTN","BMXSQL2",5,0) +FLDFILE(BMXIN) ;EP - Returns name of file containing field BMXIN +"RTN","BMXSQL2",6,0) + ;in the form FILE^FIELD^FILENUMBER^FIELDNUMBER +"RTN","BMXSQL2",7,0) + ;Based on data contained in the BMXF() array +"RTN","BMXSQL2",8,0) + ;BMXIN can be either an unambiguous field name or FILE.FIELDNAME +"RTN","BMXSQL2",9,0) + ; +"RTN","BMXSQL2",10,0) + N C,BMXA,BMXB,BMXRET,BMXFILN,BMXFLDN,BMXFILNA +"RTN","BMXSQL2",11,0) + S BMXRET="" +"RTN","BMXSQL2",12,0) + I BMXTMPLT D Q BMXRET +"RTN","BMXSQL2",13,0) + . S BMXFILNA=BMXIN +"RTN","BMXSQL2",14,0) + . I '$D(BMXF(BMXFILNA)) S BMXERR="FILE NOT FOUND" S BMXRET="" D ERROR^BMXSQL Q +"RTN","BMXSQL2",15,0) + . I BMXF(BMXFILNA)'=BMXFO(1) S BMXERR="TEMPLATES ONLY SUPPORTED ON PRIMARY FILE" D ERROR^BMXSQL Q +"RTN","BMXSQL2",16,0) + . S BMXRET=BMXFILNA_U_"BMXIEN"_U_BMXF(BMXFILNA)_U_".001" +"RTN","BMXSQL2",17,0) + ; +"RTN","BMXSQL2",18,0) + I BMXIN["." D Q BMXRET +"RTN","BMXSQL2",19,0) + . S BMXFILNA=$P(BMXIN,".") ;File Name +"RTN","BMXSQL2",20,0) + . I '$D(BMXF(BMXFILNA)) S BMXERR="FILE NOT FOUND" S BMXRET="" D ERROR^BMXSQL Q +"RTN","BMXSQL2",21,0) + . S BMXRET=BMXFILNA_U_$P(BMXIN,".",2) +"RTN","BMXSQL2",22,0) + . S $P(BMXRET,U,3)=BMXF(BMXFILNA) +"RTN","BMXSQL2",23,0) + . S BMXFLDN=0 +"RTN","BMXSQL2",24,0) + . I $P(BMXIN,".",2)'="",$D(^DD(BMXF(BMXFILNA),"B",$P(BMXIN,".",2))) D +"RTN","BMXSQL2",25,0) + . . S BMXFLDN=$O(^DD(BMXF(BMXFILNA),"B",$P(BMXIN,".",2),0)) +"RTN","BMXSQL2",26,0) + . I BMXIN["BMXIEN" S BMXFLDN=".001" +"RTN","BMXSQL2",27,0) + . I '+BMXFLDN S BMXERR="FIELD NOT FOUND",BMXRET="" D ERROR^BMXSQL Q +"RTN","BMXSQL2",28,0) + . S $P(BMXRET,U,4)=BMXFLDN +"RTN","BMXSQL2",29,0) + . Q +"RTN","BMXSQL2",30,0) + ;Loop through files in BMXF to locate field name +"RTN","BMXSQL2",31,0) + S C=0,BMXA="" +"RTN","BMXSQL2",32,0) + I 'BMXIEN F S BMXA=$O(BMXF(BMXA)) Q:BMXA="" D Q:$D(BMXERR) +"RTN","BMXSQL2",33,0) + . I $D(^DD(BMXF(BMXA),"B",BMXIN)) S BMXRET=BMXA_U_BMXIN D Q:$D(BMXERR) +"RTN","BMXSQL2",34,0) + . . S C=C+1 +"RTN","BMXSQL2",35,0) + . . I C>1 S BMXERR="AMBIGUOUS FIELD NAME" D ERROR^BMXSQL Q +"RTN","BMXSQL2",36,0) + . . Q +"RTN","BMXSQL2",37,0) + . Q +"RTN","BMXSQL2",38,0) + I BMXIEN D +"RTN","BMXSQL2",39,0) + . S BMXA=BMXFO(1) +"RTN","BMXSQL2",40,0) + . S BMXA=BMXFNX(BMXA) +"RTN","BMXSQL2",41,0) + . S BMXRET=BMXA_U_BMXIN +"RTN","BMXSQL2",42,0) + . S C=1 +"RTN","BMXSQL2",43,0) + I C=0 D Q BMXRET +"RTN","BMXSQL2",44,0) + . S BMXRET="0^"_BMXIN ;String or numeric literal +"RTN","BMXSQL2",45,0) + S BMXFILNA=$P(BMXRET,U) +"RTN","BMXSQL2",46,0) + S BMXFILN=BMXF(BMXFILNA) +"RTN","BMXSQL2",47,0) + S $P(BMXRET,U,3)=BMXFILN +"RTN","BMXSQL2",48,0) + I $D(^DD(BMXFILN,"B",BMXIN)) D +"RTN","BMXSQL2",49,0) + . S BMXFLDN=$O(^DD(BMXFILN,"B",BMXIN,0)) +"RTN","BMXSQL2",50,0) + I BMXIEN S BMXFLDN=".001" +"RTN","BMXSQL2",51,0) + I '+BMXFLDN S BMXERR="FIELD NOT FOUND",BMXRET="" D ERROR^BMXSQL Q +"RTN","BMXSQL2",52,0) + S $P(BMXRET,U,4)=BMXFLDN +"RTN","BMXSQL2",53,0) + Q BMXRET +"RTN","BMXSQL2",54,0) + ; +"RTN","BMXSQL2",55,0) +DECSTR(BMXSTR) ;EP +"RTN","BMXSQL2",56,0) + ;Decrements string collation value by 1 +"RTN","BMXSQL2",57,0) + ; +"RTN","BMXSQL2",58,0) + N A,E,S,L,BMXRET +"RTN","BMXSQL2",59,0) + I BMXSTR="" Q BMXSTR +"RTN","BMXSQL2",60,0) + S L=$L(BMXSTR) +"RTN","BMXSQL2",61,0) + S E=$E(BMXSTR,L) +"RTN","BMXSQL2",62,0) + S B=$E(BMXSTR,1,L-1) +"RTN","BMXSQL2",63,0) + S A=$A(E) +"RTN","BMXSQL2",64,0) + S A=A-1 +"RTN","BMXSQL2",65,0) + S E=$C(A) +"RTN","BMXSQL2",66,0) + S BMXRET=B_E +"RTN","BMXSQL2",67,0) + Q BMXRET +"RTN","BMXSQL2",68,0) + ; +"RTN","BMXSQL2",69,0) +INCSTR(BMXSTR) ;EP +"RTN","BMXSQL2",70,0) + ;Increments string collation value by 1 +"RTN","BMXSQL2",71,0) + Q BMXSTR_$C(1) +"RTN","BMXSQL2",72,0) + ; +"RTN","BMXSQL2",73,0) +SETX(BMXX,BMXFG,BMXSCR) ;EP +"RTN","BMXSQL2",74,0) + ;Set up executable screen code +"RTN","BMXSQL2",75,0) + ;by assembling pieces in BMXFG +"RTN","BMXSQL2",76,0) + ;and attach to executable iterator(s) +"RTN","BMXSQL2",77,0) + ; +"RTN","BMXSQL2",78,0) + ;IN: BMXFG() +"RTN","BMXSQL2",79,0) + ; BMXX() -- modified +"RTN","BMXSQL2",80,0) + ;OUT: BMXSCR +"RTN","BMXSQL2",81,0) + ; +"RTN","BMXSQL2",82,0) + N J +"RTN","BMXSQL2",83,0) + Q:'$D(BMXFG) +"RTN","BMXSQL2",84,0) + S BMXSCR="" +"RTN","BMXSQL2",85,0) + S J=0 F S J=$O(BMXX(J)) Q:'+J D +"RTN","BMXSQL2",86,0) + . S BMXX(J)=BMXX(J)_"X BMXSCR" +"RTN","BMXSQL2",87,0) + F J=1:1:BMXFG S BMXSCR=BMXSCR_BMXFG(J) +"RTN","BMXSQL2",88,0) + S BMXSCR=$S(BMXSCR]"":"I "_BMXSCR_" ",1:"") +"RTN","BMXSQL2",89,0) + S BMXSCR=BMXSCR_"D:'$D(^BMXTMP($J,""O"",D0)) OUT^BMXSQL" +"RTN","BMXSQL2",90,0) + I BMXFG("C") D +"RTN","BMXSQL2",91,0) + . N C +"RTN","BMXSQL2",92,0) + . S C=BMXFG("C") +"RTN","BMXSQL2",93,0) + . S BMXSCR("C")="F BMXC=1:1:"_C_" X BMXSCR(""C"",BMXC) S BMXSCR(""X"",BMXC)=X" +"RTN","BMXSQL2",94,0) + . F C=1:1:BMXFG("C") S BMXSCR("C",C)=BMXFG("C",C) +"RTN","BMXSQL2",95,0) + . S BMXSCR="X BMXSCR(""C"") "_BMXSCR +"RTN","BMXSQL2",96,0) + ; +"RTN","BMXSQL2",97,0) + Q +"RTN","BMXSQL3") +0^100^B190410807 +"RTN","BMXSQL3",1,0) +BMXSQL3 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL3",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL3",3,0) + ; +"RTN","BMXSQL3",4,0) + ; +"RTN","BMXSQL3",5,0) +PLEVEL(BMXFF,BMXLVL,BMXRET) ;EP +"RTN","BMXSQL3",6,0) + ;Analyze WHERE statement according to paren level +"RTN","BMXSQL3",7,0) + ;Return a string to guide building of iterator(s) +"RTN","BMXSQL3",8,0) + ; +"RTN","BMXSQL3",9,0) + ;Basically, count the number of OR clauses on the +"RTN","BMXSQL3",10,0) + ;same paren level +"RTN","BMXSQL3",11,0) + ;IN: BMXFF() +"RTN","BMXSQL3",12,0) + ;OUT: BMXLVL(), BMXRET +"RTN","BMXSQL3",13,0) + ; +"RTN","BMXSQL3",14,0) + ;BMXRET = 1&/!2&/!...&/!n clauses +"RTN","BMXSQL3",15,0) + ;BMXLVL(E,"BEGIN")=Index where element E begins +"RTN","BMXSQL3",16,0) + ;BMXLVL(E,"END") =Index where element E ends +"RTN","BMXSQL3",17,0) + ;BMXLVL(E,"ELEMENTS")=Number of subelements in element E +"RTN","BMXSQL3",18,0) + ; +"RTN","BMXSQL3",19,0) + N BMXNOR,BMXNAND,J,C,BMXTMP +"RTN","BMXSQL3",20,0) + N E,L,BMXCNT +"RTN","BMXSQL3",21,0) + ;Test for no ORs or no ANDs +"RTN","BMXSQL3",22,0) + S BMXNOR=1,BMXNAND=1 +"RTN","BMXSQL3",23,0) + S J=0 F S J=$O(BMXFF(J)) Q:'+J D ;Q:'BMXNOR Q:'BMXNAND +"RTN","BMXSQL3",24,0) + . I BMXFF(J)="OR" S BMXNOR=0 +"RTN","BMXSQL3",25,0) + . I BMXFF(J)="AND" S BMXNAND=0 +"RTN","BMXSQL3",26,0) + . Q +"RTN","BMXSQL3",27,0) + ;If no ORs or no ANDs then take all parens out of BMXFF +"RTN","BMXSQL3",28,0) + I ((BMXNOR)!(BMXNAND)) D +"RTN","BMXSQL3",29,0) + . S:$D(BMXFF("INDEX")) BMXTMP("INDEX")=BMXFF("INDEX") +"RTN","BMXSQL3",30,0) + . S J=0,C=0 F S J=$O(BMXFF(J)) Q:'+J D:"(^)"'[BMXFF(J) +"RTN","BMXSQL3",31,0) + . . S C=C+1 +"RTN","BMXSQL3",32,0) + . . S BMXTMP(C)=BMXFF(J) +"RTN","BMXSQL3",33,0) + . . S:$D(BMXFF(J,0)) BMXTMP(C,0)=BMXFF(J,0) +"RTN","BMXSQL3",34,0) + . . S:$D(BMXFF(J,"INTERNAL")) BMXTMP(J,"INTERNAL")=BMXFF(J,"INTERNAL") +"RTN","BMXSQL3",35,0) + . . S:$D(BMXFF(J,"TYPE")) BMXTMP(C,"TYPE")=BMXFF(J,"TYPE") +"RTN","BMXSQL3",36,0) + . . S:$D(BMXFF(J,"IEN")) BMXTMP(C,"IEN")=BMXFF(J,"IEN") +"RTN","BMXSQL3",37,0) + . . S:$D(BMXFF(J,"JOIN")) BMXTMP(C,"JOIN")=BMXFF(J,"JOIN") +"RTN","BMXSQL3",38,0) + . . S:$D(BMXFF(J,"JOIN","IEN")) BMXTMP(C,"JOIN","IEN")=BMXFF(J,"JOIN","IEN") +"RTN","BMXSQL3",39,0) + . . ;I $D(BMXFF(J,"JOIN")) D +"RTN","BMXSQL3",40,0) + . . ;. N K S K=0 F S K=$O(BMXFF(J,"JOIN",K)) Q:'+K D +"RTN","BMXSQL3",41,0) + . . ;. . N L S L=0 F S L=$O(BMXFF(J,"JOIN",K,L)) Q:'+L D +"RTN","BMXSQL3",42,0) + . . ;. . . S BMXTMP(C,"JOIN",K,L)=BMXFF(J,"JOIN",K,L) +"RTN","BMXSQL3",43,0) + . . I $D(BMXFF(J,"SET")) D +"RTN","BMXSQL3",44,0) + . . . N BMXSS +"RTN","BMXSQL3",45,0) + . . . S BMXSS="" F S BMXSS=$O(BMXFF(J,"SET",BMXSS)) Q:BMXSS="" D +"RTN","BMXSQL3",46,0) + . . . . S BMXTMP(C,"SET",BMXSS)=BMXFF(J,"SET",BMXSS) +"RTN","BMXSQL3",47,0) + . K BMXFF +"RTN","BMXSQL3",48,0) + . I $D(BMXTMP("INDEX")) S BMXFF("INDEX")=BMXTMP("INDEX") +"RTN","BMXSQL3",49,0) + . S J=0 F S J=$O(BMXTMP(J)) Q:'+J D +"RTN","BMXSQL3",50,0) + . . S BMXFF(J)=BMXTMP(J) +"RTN","BMXSQL3",51,0) + . . S:$D(BMXTMP(J,0)) BMXFF(J,0)=BMXTMP(J,0) +"RTN","BMXSQL3",52,0) + . . S:$D(BMXTMP(J,"TYPE")) BMXFF(J,"TYPE")=BMXTMP(J,"TYPE") +"RTN","BMXSQL3",53,0) + . . I $D(BMXTMP(J,"JOIN")) S BMXFF(J,"JOIN")=BMXTMP(J,"JOIN") S:$D(BMXTMP(J,"JOIN","IEN")) BMXFF(J,"JOIN","IEN")=BMXTMP(J,"JOIN","IEN") S BMXFJ("JOIN",+$P($P(BMXFF(J,0),U,2),"P",2))=J +"RTN","BMXSQL3",54,0) + . . ;I $D(BMXTMP(J,"JOIN")) D +"RTN","BMXSQL3",55,0) + . . ;. N K S K=0 F S K=$O(BMXTMP(J,"JOIN",K)) Q:'+K D +"RTN","BMXSQL3",56,0) + . . ;. . N L S L=0 F S L=$O(BMXTMP(J,"JOIN",K,L)) Q:'+L D +"RTN","BMXSQL3",57,0) + . . ;. . . S BMXFF(J,"JOIN",K,L)=BMXTMP(J,"JOIN",K,L) +"RTN","BMXSQL3",58,0) + . . I $D(BMXTMP(J,"SET")) D +"RTN","BMXSQL3",59,0) + . . . N BMXSS +"RTN","BMXSQL3",60,0) + . . . S BMXSS="" F S BMXSS=$O(BMXTMP(J,"SET",BMXSS)) Q:BMXSS="" D +"RTN","BMXSQL3",61,0) + . . . . S BMXFF(J,"SET",BMXSS)=BMXTMP(J,"SET",BMXSS) +"RTN","BMXSQL3",62,0) + . . I $D(BMXTMP(J,"INTERNAL")) S BMXFF(J,"INTERNAL")=BMXTMP(J,"INTERNAL") +"RTN","BMXSQL3",63,0) + . . I $D(BMXTMP(J,"IEN")) S BMXFF(J,"IEN")=BMXTMP(J,"IEN") +"RTN","BMXSQL3",64,0) + . S BMXFF=C +"RTN","BMXSQL3",65,0) + . Q +"RTN","BMXSQL3",66,0) + ; +"RTN","BMXSQL3",67,0) + ;Remove excess leading and trailing parens +"RTN","BMXSQL3",68,0) + ;Find close paren corresponding to BMXFF(1) +"RTN","BMXSQL3",69,0) + ;If its the last paren, then remove the first and last parens +"RTN","BMXSQL3",70,0) + ;Else, quit +"RTN","BMXSQL3",71,0) + N BMXEND +"RTN","BMXSQL3",72,0) + S BMXEND=0 +"RTN","BMXSQL3",73,0) + F Q:'((BMXFF(1)="(")&(BMXFF(BMXFF)=")")) Q:BMXEND D +"RTN","BMXSQL3",74,0) + . S L=1,J=1 +"RTN","BMXSQL3",75,0) + . F S J=$O(BMXFF(J)) Q:'+J D:"(^)"[BMXFF(J) Q:BMXEND +"RTN","BMXSQL3",76,0) + . . I BMXFF(J)="(" S L=L+1 Q +"RTN","BMXSQL3",77,0) + . . I BMXFF(J)=")" S L=L-1 +"RTN","BMXSQL3",78,0) + . . I L=0,J0 D Q +"RTN","BMXSQL3",194,0) + . . . S BMXPFF(BMXPFF,1)=BMXREF +"RTN","BMXSQL3",195,0) + . . . S $P(BMXPFF(BMXPFF,1),U,2)=BMXRNAM +"RTN","BMXSQL3",196,0) + . . . S BMXPFP(BMXPFP,BMXPFF,1)=BMXREF +"RTN","BMXSQL3",197,0) + . . . S $P(BMXPFP(BMXPFP,BMXPFF,1),U,2)=BMXRNAM +"RTN","BMXSQL3",198,0) + . . Q +"RTN","BMXSQL3",199,0) + . Q +"RTN","BMXSQL3",200,0) + Q +"RTN","BMXSQL3",201,0) + ; +"RTN","BMXSQL3",202,0) + ; +"RTN","BMXSQL3",203,0) +BLDIT(BMXFF,F,BMXRNAM,BMXRET,BMXPFP) ;EP - Build iterator +"RTN","BMXSQL3",204,0) + ; +"RTN","BMXSQL3",205,0) + K BMXRET +"RTN","BMXSQL3",206,0) + N BMXNOD,BMXOP,BMXV,BMXGL,Q +"RTN","BMXSQL3",207,0) + S BMXNOD=BMXFF(F) +"RTN","BMXSQL3",208,0) + S BMXOP=$P(BMXNOD,U,3) +"RTN","BMXSQL3",209,0) + S BMXV=$P(BMXNOD,U,4) +"RTN","BMXSQL3",210,0) + S BMXGL=$P(BMXNOD,U,7,8) +"RTN","BMXSQL3",211,0) + S Q=$C(34) +"RTN","BMXSQL3",212,0) + I $D(BMXPFP(F)) D BLDIT2 Q ;Pointer +"RTN","BMXSQL3",213,0) + ;TODO Set BMXV to the pointer or set or FM date that corresponds +"RTN","BMXSQL3",214,0) + ; to the user-entered value +"RTN","BMXSQL3",215,0) + I $D(BMXFF(F,"IEN")),BMXFF(F,"IEN")="TEMPLATE" D Q +"RTN","BMXSQL3",216,0) + . N BMXTNUM +"RTN","BMXSQL3",217,0) + . S BMXTNUM=$O(^DIBT("B",$P(BMXFF(F),U,4),0)) +"RTN","BMXSQL3",218,0) + . S BMXRET="S D0=0 F S D0=$O(^DIBT("_BMXTNUM_",1,D0)) Q:'+D0 Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",219,0) + . Q +"RTN","BMXSQL3",220,0) + I BMXOP="=" D Q +"RTN","BMXSQL3",221,0) + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" Q:'+D0 Q:BMXM>BMXXMAX " Q +"RTN","BMXSQL3",222,0) + . S BMXRET="S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",223,0) + . Q +"RTN","BMXSQL3",224,0) + ; +"RTN","BMXSQL3",225,0) + I BMXOP=">=" D Q +"RTN","BMXSQL3",226,0) + . I $D(BMXFF(F,"IEN")) S BMXV=BMXV-1,BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q +"RTN","BMXSQL3",227,0) + . N BMXTMP +"RTN","BMXSQL3",228,0) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" +"RTN","BMXSQL3",229,0) + . S @BMXTMP +"RTN","BMXSQL3",230,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",231,0) + ; +"RTN","BMXSQL3",232,0) + I BMXOP=">" D Q +"RTN","BMXSQL3",233,0) + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q +"RTN","BMXSQL3",234,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",235,0) + ; +"RTN","BMXSQL3",236,0) + I BMXOP="<>" D Q +"RTN","BMXSQL3",237,0) + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 I D0'="_BMXV_" Q:BMXM>BMXXMAX " Q +"RTN","BMXSQL3",238,0) + . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",239,0) + ; +"RTN","BMXSQL3",240,0) + I BMXOP="<=" D Q +"RTN","BMXSQL3",241,0) + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_BMXV_" Q:BMXM>BMXXMAX " Q +"RTN","BMXSQL3",242,0) + . N BMXTMP +"RTN","BMXSQL3",243,0) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))" +"RTN","BMXSQL3",244,0) + . S @BMXTMP +"RTN","BMXSQL3",245,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",246,0) + ; +"RTN","BMXSQL3",247,0) + I BMXOP="<" D Q +"RTN","BMXSQL3",248,0) + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0'<"_BMXV_" Q:BMXM>BMXXMAX " Q +"RTN","BMXSQL3",249,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",250,0) + ; +"RTN","BMXSQL3",251,0) + I BMXOP="BETWEEN" D Q ;changed '< to > (inclusive BETWEEN) +"RTN","BMXSQL3",252,0) + . I $D(BMXFF(F,"IEN")) D Q +"RTN","BMXSQL3",253,0) + . . S BMXRET="S D0="_(+$P(BMXV,"~")-1)_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",254,0) + . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number +"RTN","BMXSQL3",255,0) + . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q +"RTN","BMXSQL3",256,0) + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",257,0) + . E D ;BMXV is a string +"RTN","BMXSQL3",258,0) + . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q +"RTN","BMXSQL3",259,0) + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",260,0) + ; +"RTN","BMXSQL3",261,0) + I BMXOP="LIKE" D Q +"RTN","BMXSQL3",262,0) + . N BMXTMP,BMXV1 +"RTN","BMXSQL3",263,0) + . S BMXV1=BMXV +"RTN","BMXSQL3",264,0) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" +"RTN","BMXSQL3",265,0) + . S @BMXTMP +"RTN","BMXSQL3",266,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",267,0) + Q +"RTN","BMXSQL3",268,0) + ; +"RTN","BMXSQL3",269,0) +BLDIT2 ;Pointer +"RTN","BMXSQL3",270,0) + N BMXPS,J +"RTN","BMXSQL3",271,0) + S BMXPS=$O(BMXPFP(F,999),-1) +"RTN","BMXSQL3",272,0) + S BMXNOD=BMXPFP(F,BMXPS) +"RTN","BMXSQL3",273,0) + S BMXGL=$P(BMXNOD,U,7,8) +"RTN","BMXSQL3",274,0) + I BMXOP="=" D +"RTN","BMXSQL3",275,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",276,0) + . S BMXRET="S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",277,0) + ; +"RTN","BMXSQL3",278,0) + I BMXOP=">" D +"RTN","BMXSQL3",279,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",280,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",281,0) + ; +"RTN","BMXSQL3",282,0) + I BMXOP=">=" D +"RTN","BMXSQL3",283,0) + . N BMXTMP +"RTN","BMXSQL3",284,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",285,0) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" +"RTN","BMXSQL3",286,0) + . S @BMXTMP +"RTN","BMXSQL3",287,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",288,0) + ; +"RTN","BMXSQL3",289,0) + I BMXOP="<=" D +"RTN","BMXSQL3",290,0) + . N BMXTMP +"RTN","BMXSQL3",291,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",292,0) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))" +"RTN","BMXSQL3",293,0) + . S @BMXTMP +"RTN","BMXSQL3",294,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",295,0) + ; +"RTN","BMXSQL3",296,0) + I BMXOP="<>" D +"RTN","BMXSQL3",297,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",298,0) + . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",299,0) + ; +"RTN","BMXSQL3",300,0) + I BMXOP="<" D +"RTN","BMXSQL3",301,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",302,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",303,0) + ; +"RTN","BMXSQL3",304,0) + I BMXOP="BETWEEN" D +"RTN","BMXSQL3",305,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",306,0) + . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number +"RTN","BMXSQL3",307,0) + . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q +"RTN","BMXSQL3",308,0) + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",309,0) + . E D ;BMXV is a string +"RTN","BMXSQL3",310,0) + . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q +"RTN","BMXSQL3",311,0) + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",312,0) + ; +"RTN","BMXSQL3",313,0) + I BMXOP="LIKE" D +"RTN","BMXSQL3",314,0) + . N BMXTMP,BMXV1 +"RTN","BMXSQL3",315,0) + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) +"RTN","BMXSQL3",316,0) + . S BMXV1=BMXV +"RTN","BMXSQL3",317,0) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" +"RTN","BMXSQL3",318,0) + . S @BMXTMP +"RTN","BMXSQL3",319,0) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",320,0) + ; +"RTN","BMXSQL3",321,0) + F J=BMXPS-1:-1:0 D +"RTN","BMXSQL3",322,0) + . S BMXNOD=BMXPFP(F,J) +"RTN","BMXSQL3",323,0) + . S BMXGL=$P(BMXNOD,U,7,8) +"RTN","BMXSQL3",324,0) + . S BMXRNAM=$P(BMXPFP(F,J,1),U,2) +"RTN","BMXSQL3",325,0) + . S BMXRET=BMXRET_"S D"_J_"=0 F S D"_J_"=$O("_BMXGL_Q_BMXRNAM_Q_",D"_(J+1)_",D"_J_")) Q:'+D"_J_" Q:BMXM>BMXXMAX " +"RTN","BMXSQL3",326,0) + Q +"RTN","BMXSQL3",327,0) + ;TODO: Computed fields +"RTN","BMXSQL3",328,0) + ;TODO: Sets of codes +"RTN","BMXSQL3",329,0) + ;TODO: User-specified index +"RTN","BMXSQL3",330,0) + Q +"RTN","BMXSQL4") +0^101^B3594616 +"RTN","BMXSQL4",1,0) +BMXSQL4 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL4",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL4",3,0) + ; +"RTN","BMXSQL4",4,0) + ; +"RTN","BMXSQL4",5,0) +JOIN ;EP - Join processing +"RTN","BMXSQL4",6,0) + ;Create a pointer chain back to the primary file +"RTN","BMXSQL4",7,0) + ;or to a reverse pointer file, E.G.: +"RTN","BMXSQL4",8,0) + ;Either executable code or an expression that returns the +"RTN","BMXSQL4",9,0) + ;IEN of the terminal pointed-to file +"RTN","BMXSQL4",10,0) + ; +"RTN","BMXSQL4",11,0) + ; S IEN1=$P(^DIZ(1000,IEN2,0),U,4) +"RTN","BMXSQL4",12,0) + ; I +IEN1 S IEN=$P(^AUTTLOC(IEN1,0),U,23) +"RTN","BMXSQL4",13,0) + ; +"RTN","BMXSQL4",14,0) + Q:'$D(BMXFJ("JOIN")) +"RTN","BMXSQL4",15,0) + N C,D,E,BMXSTOP,BMXPTF,BMXPTG,BMXPTL,BMXPTN,BMXPTP,BMXPTC +"RTN","BMXSQL4",16,0) + S C=0 F S C=$O(BMXFF(C)) Q:'+C D +"RTN","BMXSQL4",17,0) + . Q:'$D(BMXFF(C,"JOIN")) +"RTN","BMXSQL4",18,0) + . S BMXPTL=1,BMXPTC="",D=C ;Pointer level +"RTN","BMXSQL4",19,0) + . F S BMXPTF=$P(BMXFF(D),U,5) D Q:BMXPTF=BMXFO(1) +"RTN","BMXSQL4",20,0) + . . S BMXPTG=$P(BMXFF(D),U,7,99) ;Pf Global +"RTN","BMXSQL4",21,0) + . . S BMXPTN=$P(BMXFF(D,0),U,4) ;Pf Node +"RTN","BMXSQL4",22,0) + . . S BMXPTP=$P(BMXPTN,";",2) ;Pf Piece +"RTN","BMXSQL4",23,0) + . . S BMXPTN=$P(BMXPTN,";") +"RTN","BMXSQL4",24,0) + . . S BMXPTC="I +IEN"_BMXPTL_" S IEN"_(BMXPTL-1)_"=$P($G("_BMXPTG_"IEN"_BMXPTL_","_BMXPTN_")),U,"_BMXPTP_") "_BMXPTC +"RTN","BMXSQL4",25,0) + . . S BMXPTL=BMXPTL+1 +"RTN","BMXSQL4",26,0) + . . ;S D To the index of the pointed to file's entry in BMXFF +"RTN","BMXSQL4",27,0) + . . Q:BMXPTF=BMXFO(1) +"RTN","BMXSQL4",28,0) + . . S E=0,BMXSTOP=0 F S E=$O(BMXFF(E)) Q:'+E Q:BMXSTOP D +"RTN","BMXSQL4",29,0) + . . . I $D(BMXFF(E,0)),+$P($P(BMXFF(E,0),U,2),"P",2)=BMXPTF S D=E,BMXSTOP=1 Q +"RTN","BMXSQL4",30,0) + . . . I $D(BMXFF(E,0)),BMXPTF=9000001,+$P($P(BMXFF(E,0),U,2),"P",2)=2 S D=E,BMXSTOP=1 Q ;IHS auto join PATIENT to VA PATIENT +"RTN","BMXSQL4",31,0) + . S BMXFF(C,"JOIN")=BMXPTC +"RTN","BMXSQL4",32,0) + . S BMXFF(C,"JOIN","IEN")="IEN"_(BMXPTL-1) +"RTN","BMXSQL4",33,0) + Q +"RTN","BMXSQL5") +0^102^B51902207 +"RTN","BMXSQL5",1,0) +BMXSQL5 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL5",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL5",3,0) + ; +"RTN","BMXSQL5",4,0) + ; +"RTN","BMXSQL5",5,0) +SELECT ;EP - Get field names into BMXFLD("NAME")="FILE#^FIELD#" +"RTN","BMXSQL5",6,0) + N BMXA,BMXB,BMXS,BMXSINGL +"RTN","BMXSQL5",7,0) + N BMXINTNL +"RTN","BMXSQL5",8,0) + S T=$G(BMXTK("SELECT")) +"RTN","BMXSQL5",9,0) + I '+T S BMXERR="'SELECT' CLAUSE NOT FOUND" D ERRTACK^BMXSQL(1) Q +"RTN","BMXSQL5",10,0) + S BMXFLD=0 +"RTN","BMXSQL5",11,0) + N BMXOFF,BMXGS1,BMXLVL +"RTN","BMXSQL5",12,0) + F S T=$O(BMXTK(T)) Q:'+T Q:T=$G(BMXTK("FROM")) I BMXTK(T)'="," S BMXOFF=1,BMXLVL=0 D S1 Q:$D(BMXERR) +"RTN","BMXSQL5",13,0) + Q +"RTN","BMXSQL5",14,0) + ; +"RTN","BMXSQL5",15,0) +SALIAS ; +"RTN","BMXSQL5",16,0) + Q:'+$O(BMXTK(T)) +"RTN","BMXSQL5",17,0) + N V +"RTN","BMXSQL5",18,0) + S V=T+1 +"RTN","BMXSQL5",19,0) + Q:$G(BMXTK(V))="," +"RTN","BMXSQL5",20,0) + Q:V=$G(BMXTK("FROM")) +"RTN","BMXSQL5",21,0) + S:BMXTK(V)["'" BMXTK(V)=$P(BMXTK(V),"'",2) +"RTN","BMXSQL5",22,0) + S BMXFLDA(BMXFILE,BMXFLDN)=BMXTK(V) +"RTN","BMXSQL5",23,0) + S $P(BMXFLDO(BMXFLDO-1),U,6)=BMXTK(V) +"RTN","BMXSQL5",24,0) + S T=T+1 +"RTN","BMXSQL5",25,0) + Q +"RTN","BMXSQL5",26,0) + ; +"RTN","BMXSQL5",27,0) +S1 ; +"RTN","BMXSQL5",28,0) + S BMXTK(T)=$TR(BMXTK(T),"_"," ") +"RTN","BMXSQL5",29,0) + ;Check for INTERNAL[ modifier +"RTN","BMXSQL5",30,0) + S BMXGS1=0 +"RTN","BMXSQL5",31,0) + S BMXINTNL="E" +"RTN","BMXSQL5",32,0) + I BMXTK(T)["[" S BMXINTNL="I",BMXTK(T)=$P(BMXTK(T),"[",2),BMXTK(T)=$P(BMXTK(T),"]",1) +"RTN","BMXSQL5",33,0) + ;If explicit file name +"RTN","BMXSQL5",34,0) + S BMXSINGL=0 +"RTN","BMXSQL5",35,0) + I BMXTK(T)["." D G:BMXGS1 S1 G:BMXSINGL NOTEXP Q +"RTN","BMXSQL5",36,0) + . ;Before FILE.FIELD Parsing +"RTN","BMXSQL5",37,0) + . S BMXA=$P(BMXTK(T),".",1,BMXOFF) ;File Name +"RTN","BMXSQL5",38,0) + . I '$D(BMXF(BMXA)) D Q:$D(BMXERR) Q:BMXSINGL +"RTN","BMXSQL5",39,0) + . . I $D(^DD(BMXFO(1),"B",BMXTK(T))),BMXOFF=1 S BMXSINGL=1 Q +"RTN","BMXSQL5",40,0) + . . S BMXERR="FILE NOT FOUND" D ERRTACK^BMXSQL(1) Q +"RTN","BMXSQL5",41,0) + . S BMXB=$P(BMXTK(T),".",1+BMXOFF,99) ;Field Name TODO: Test here for multiple in extended pointer -- FILE.MULTIPLE.FIELD +"RTN","BMXSQL5",42,0) + . N BMXLAST S BMXLAST=0 +"RTN","BMXSQL5",43,0) + . I $L(BMXB,".")>1 D Q:'BMXLAST ;Multiple +"RTN","BMXSQL5",44,0) + . . N BMXFNUM,BMXFNAM,BMXFNOD,BMXSUBFN,BMXUPFN,BMXGL,W,BMXFOUND +"RTN","BMXSQL5",45,0) + . . ;Multiple or Field-name with period? +"RTN","BMXSQL5",46,0) + . . S BMXFOUND=0 +"RTN","BMXSQL5",47,0) + . . F W=1:1:$L(BMXTK(T),".") D Q:BMXFOUND +"RTN","BMXSQL5",48,0) + . . . S BMXOFF=BMXOFF+1 +"RTN","BMXSQL5",49,0) + . . . I $D(^DD(BMXF(BMXA),"B",$P(BMXB,".",1,W))) D +"RTN","BMXSQL5",50,0) + . . . . S BMXFNAM=$P(BMXB,".",1,W) +"RTN","BMXSQL5",51,0) + . . . . S BMXFOUND=1 +"RTN","BMXSQL5",52,0) + . . . . S:W=$L(BMXB,".") BMXLAST=1 +"RTN","BMXSQL5",53,0) + . . . . S BMXLVL=BMXLVL+1 +"RTN","BMXSQL5",54,0) + . . ; +"RTN","BMXSQL5",55,0) + . . Q:BMXLAST +"RTN","BMXSQL5",56,0) + . . S BMXF=BMXF+1 +"RTN","BMXSQL5",57,0) + . . S BMXFNUM=$O(^DD(BMXF(BMXA),"B",BMXFNAM,0)) ;FieldNumber +"RTN","BMXSQL5",58,0) + . . S BMXFNOD=^DD(BMXF(BMXA),BMXFNUM,0) +"RTN","BMXSQL5",59,0) + . . S BMXGL=$P(BMXFNOD,U,4),BMXGL=$P(BMXGL,";") +"RTN","BMXSQL5",60,0) + . . S BMXSUBFN=+$P(BMXFNOD,U,2) ;Subfile Number +"RTN","BMXSQL5",61,0) + . . S BMXUPFN=^DD(BMXSUBFN,0,"UP") ;Parent File Number +"RTN","BMXSQL5",62,0) + . . D SETMFL(BMXUPFN,BMXSUBFN,BMXGL,BMXLVL,0) +"RTN","BMXSQL5",63,0) + . . S BMXGS1=1 +"RTN","BMXSQL5",64,0) + . S:BMXB["'" BMXB=$P(BMXB,"'",2) +"RTN","BMXSQL5",65,0) + . I BMXB="BMXIEN" D Q +"RTN","BMXSQL5",66,0) + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) +"RTN","BMXSQL5",67,0) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" +"RTN","BMXSQL5",68,0) + . . D SELECT1 +"RTN","BMXSQL5",69,0) + . I BMXB="*" D Q ;All fields in file BMXA +"RTN","BMXSQL5",70,0) + . . ;BMXIEN Has to be first because ADO doesn't handle it well if a DATE type column is returned first +"RTN","BMXSQL5",71,0) + . . S BMXB="BMXIEN" +"RTN","BMXSQL5",72,0) + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) +"RTN","BMXSQL5",73,0) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" +"RTN","BMXSQL5",74,0) + . . D SELECT1 +"RTN","BMXSQL5",75,0) + . . S BMXB=0 F S BMXB=$O(^DD(BMXF(BMXA),"B",BMXB)) Q:BMXB="" D +"RTN","BMXSQL5",76,0) + . . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) +"RTN","BMXSQL5",77,0) + . . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) +"RTN","BMXSQL5",78,0) + . . . D SELECT1 +"RTN","BMXSQL5",79,0) + . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) +"RTN","BMXSQL5",80,0) + . I '$D(^DD(BMXF(BMXA),"B",BMXB)) S BMXERR="FIELD NOT FOUND" D ERRTACK^BMXSQL(1) Q +"RTN","BMXSQL5",81,0) + . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) +"RTN","BMXSQL5",82,0) + . D SELECT1 +"RTN","BMXSQL5",83,0) + . Q +"RTN","BMXSQL5",84,0) + ; +"RTN","BMXSQL5",85,0) +NOTEXP ;File not explicit so Loop through files in BMXF to locate field name +"RTN","BMXSQL5",86,0) + ; +"RTN","BMXSQL5",87,0) + I BMXTK(T)["'" S BMXTK(T)=$P(BMXTK(T),"'",2) +"RTN","BMXSQL5",88,0) + S C=0,BMXA="" +"RTN","BMXSQL5",89,0) + I BMXTK(T)="BMXIEN" D Q +"RTN","BMXSQL5",90,0) + . S BMXB=BMXTK(T) +"RTN","BMXSQL5",91,0) + . S BMXA=BMXFO(1) ;File defaults to first named file in FROM +"RTN","BMXSQL5",92,0) + . S BMXA=BMXFNX(BMXA) +"RTN","BMXSQL5",93,0) + . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) +"RTN","BMXSQL5",94,0) + . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" +"RTN","BMXSQL5",95,0) + . D SELECT1 +"RTN","BMXSQL5",96,0) + F S BMXA=$O(BMXF(BMXA)) Q:BMXA="" D Q:$D(BMXERR) +"RTN","BMXSQL5",97,0) + . S BMXB=BMXTK(T) +"RTN","BMXSQL5",98,0) + . I BMXB="*" D Q ;All fields in file BMXA +"RTN","BMXSQL5",99,0) + . . S BMXB="BMXIEN" +"RTN","BMXSQL5",100,0) + . . S BMXA=BMXFO(1) ;File defaults to first named file in FROM +"RTN","BMXSQL5",101,0) + . . S BMXA=BMXFNX(BMXA) +"RTN","BMXSQL5",102,0) + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) +"RTN","BMXSQL5",103,0) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" +"RTN","BMXSQL5",104,0) + . . D SELECT1 +"RTN","BMXSQL5",105,0) + . . S BMXB=0 F S BMXB=$O(^DD(BMXF(BMXA),"B",BMXB)) Q:BMXB="" D +"RTN","BMXSQL5",106,0) + . . . S BMXS=BMXA_"."_BMXB +"RTN","BMXSQL5",107,0) + . . . S BMXFLD(BMXS)=BMXF(BMXA) +"RTN","BMXSQL5",108,0) + . . . S $P(BMXFLD(BMXS),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) +"RTN","BMXSQL5",109,0) + . . . D SELECT1 +"RTN","BMXSQL5",110,0) + . . . S C=1 +"RTN","BMXSQL5",111,0) + . I $D(^DD(BMXF(BMXA),"B",BMXTK(T))) D Q:$D(BMXERR) +"RTN","BMXSQL5",112,0) + . . S C=C+1 +"RTN","BMXSQL5",113,0) + . . I C>1 S BMXERR="AMBIGUOUS FIELD NAME" D ERRTACK^BMXSQL(1) Q +"RTN","BMXSQL5",114,0) + . . S BMXB=BMXTK(T) ;Field Name +"RTN","BMXSQL5",115,0) + . . I BMXB["'" S BMXB=$P(BMXB,"'",2) +"RTN","BMXSQL5",116,0) + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) +"RTN","BMXSQL5",117,0) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) +"RTN","BMXSQL5",118,0) + . . D SELECT1 +"RTN","BMXSQL5",119,0) + . . Q +"RTN","BMXSQL5",120,0) + . Q +"RTN","BMXSQL5",121,0) + I C=0 S BMXERR="FIELD NOT FOUND" D ERRTACK^BMXSQL(1) Q +"RTN","BMXSQL5",122,0) + Q +"RTN","BMXSQL5",123,0) + ; +"RTN","BMXSQL5",124,0) +SELECT1 ; +"RTN","BMXSQL5",125,0) + N BMXGNOD,BMXFILE,BMXGNOD1 +"RTN","BMXSQL5",126,0) + S BMXFLDN=$P(BMXFLD(BMXA_"."_BMXB),"^",2) +"RTN","BMXSQL5",127,0) + S BMXFILE=$P(BMXFLD(BMXA_"."_BMXB),U) +"RTN","BMXSQL5",128,0) + S BMXFLDN(BMXFILE,BMXFLDN)=BMXB +"RTN","BMXSQL5",129,0) + I BMXFLDN=".001" S BMXGNOD="IEN",BMXGNOD1="",$P(BMXGNOD1,U,2)="N" +"RTN","BMXSQL5",130,0) + E S BMXGNOD1=^DD(BMXFILE,BMXFLDN,0) +"RTN","BMXSQL5",131,0) + S BMXGNOD=$P(BMXGNOD1,"^",4) +"RTN","BMXSQL5",132,0) + S $P(BMXFLD(BMXA_"."_BMXB),"^",3)=$P(BMXGNOD,";") +"RTN","BMXSQL5",133,0) + S $P(BMXFLD(BMXA_"."_BMXB),"^",4)=$P(BMXGNOD,";",2) +"RTN","BMXSQL5",134,0) + S $P(BMXFLD(BMXA_"."_BMXB),"^",5)=BMXINTNL +"RTN","BMXSQL5",135,0) + S BMXFLDO(BMXFLD)=BMXFILE_"^"_BMXFLDN_"^"_BMXINTNL +"RTN","BMXSQL5",136,0) + I +$P(BMXGNOD1,U,2) D ;Check for WP +"RTN","BMXSQL5",137,0) + . S BMXGNOD1=+$P(BMXGNOD1,U,2) +"RTN","BMXSQL5",138,0) + . Q:'$D(^DD(BMXGNOD1,.01,0)) +"RTN","BMXSQL5",139,0) + . I $P(^DD(BMXGNOD1,.01,0),U,2)["W" S $P(BMXFLDO(BMXFLD),U,4)="W" +"RTN","BMXSQL5",140,0) + ;HMW20030630 Modified next line to make data type of Internal[] for pointer an Integer. +"RTN","BMXSQL5",141,0) + I $P(BMXGNOD1,U,2)["P" S BMXGNOD1=$$PTYPE(BMXGNOD1) Q:BMXGNOD1="" S:$G(BMXINTNL)="I" $P(BMXGNOD1,U,2)="N" ;I BMXGNOD1="" then Pointed-to file doesn't exist +"RTN","BMXSQL5",142,0) + I $P(BMXGNOD1,U,2)["D" S $P(BMXFLDO(BMXFLD),U,5)="D" +"RTN","BMXSQL5",143,0) + I $P(BMXGNOD1,U,2)["N" D +"RTN","BMXSQL5",144,0) + . N Z +"RTN","BMXSQL5",145,0) + . S Z=$P(BMXGNOD1,U,2) +"RTN","BMXSQL5",146,0) + . I +$P(Z,",",2)=0 S $P(BMXFLDO(BMXFLD),U,5)="I" ;Integer +"RTN","BMXSQL5",147,0) + S BMXFLDOX(BMXFILE,BMXFLDN,BMXINTNL)=BMXFLD +"RTN","BMXSQL5",148,0) + S BMXFLD=BMXFLD+1 +"RTN","BMXSQL5",149,0) + S BMXFLDO=BMXFLD +"RTN","BMXSQL5",150,0) + D SALIAS +"RTN","BMXSQL5",151,0) + Q +"RTN","BMXSQL5",152,0) + ; +"RTN","BMXSQL5",153,0) +SETMFL(BMXUPFN,BMXSUBFN,BMXGL,BMXOFF,BMXOTM) ;EP +"RTN","BMXSQL5",154,0) + ; +"RTN","BMXSQL5",155,0) + ;BMXOTM = One-To-Many +"RTN","BMXSQL5",156,0) + N BMXUPG +"RTN","BMXSQL5",157,0) + S BMXMFL("PARENT",BMXSUBFN)=BMXUPFN +"RTN","BMXSQL5",158,0) + S BMXMFL(BMXUPFN,"SUBFILE",BMXSUBFN)="" +"RTN","BMXSQL5",159,0) + S BMXMFL("SUBFILE",BMXUPFN,BMXSUBFN)="" +"RTN","BMXSQL5",160,0) + S BMXUPG=BMXMFL(BMXUPFN,"GLOC") ;Parent File Global Set in FROM clause +"RTN","BMXSQL5",161,0) + S BMXFNAM=BMXA_"."_BMXFNAM ;TODO: Regression test this line with OTM +"RTN","BMXSQL5",162,0) + I 'BMXOTM S BMXMFL(BMXSUBFN,"GLOC")=BMXUPG_"IEN"_(BMXOFF-1)_","_$C(34)_BMXGL_$C(34)_"," +"RTN","BMXSQL5",163,0) + E S BMXMFL(BMXSUBFN,"GLOC")=BMXGL,BMXMFL(BMXSUBFN,"OTM")="" +"RTN","BMXSQL5",164,0) + S BMXMFL(BMXSUBFN,"MULT")="S IEN"_BMXOFF_"=0 F S IEN"_BMXOFF_"=$O("_BMXMFL(BMXSUBFN,"GLOC")_"IEN"_BMXOFF_")) Q:'+IEN"_BMXOFF_" " +"RTN","BMXSQL5",165,0) + I $D(BMXMFL(BMXUPFN,"MULT")) S BMXMFL(BMXSUBFN,"MULT")=BMXMFL(BMXUPFN,"MULT")_" "_BMXMFL(BMXSUBFN,"MULT") +"RTN","BMXSQL5",166,0) + I 'BMXOTM S BMXMFL(BMXSUBFN,"IENS")="N J S BMXIENS="""" F J=0:1:"_BMXOFF_" S BMXIENS=@(""IEN""_J)_"",""_BMXIENS" +"RTN","BMXSQL5",167,0) + E S BMXMFL(BMXSUBFN,"IENS")="N J S BMXIENS="""" S J=1 S BMXIENS=@(""IEN""_J)_"",""_BMXIENS" +"RTN","BMXSQL5",168,0) + S BMXMFL(BMXSUBFN,"EXEC")=BMXMFL(BMXSUBFN,"MULT")_"X BMXMFL(BMXFN,""IENS"")"_" D GETS^DIQ(BMXFN,BMXIENS,BMXGF(BMXFN),""E"",BMXA) D SETIEN(IEN"_BMXOFF_",BMXFN)" +"RTN","BMXSQL5",169,0) + D F1^BMXSQL(BMXF,BMXFNAM,BMXSUBFN) +"RTN","BMXSQL5",170,0) + ; +"RTN","BMXSQL5",171,0) + Q +"RTN","BMXSQL5",172,0) + ; +"RTN","BMXSQL5",173,0) +PTYPE(BMXGNOD1) ; +"RTN","BMXSQL5",174,0) + ;Traverse pointer chain to retrieve data type of pointed-to field +"RTN","BMXSQL5",175,0) + N BMXFILE +"RTN","BMXSQL5",176,0) + I $P(BMXGNOD1,U,2)'["P" Q BMXGNOD1 +"RTN","BMXSQL5",177,0) + S BMXFILE=$P(BMXGNOD1,U,2) +"RTN","BMXSQL5",178,0) + S BMXFILE=+$P(BMXFILE,"P",2) +"RTN","BMXSQL5",179,0) + S BMXGNOD1=$G(^DD(BMXFILE,".01",0)) +"RTN","BMXSQL5",180,0) + S BMXGNOD1=$$PTYPE(BMXGNOD1) +"RTN","BMXSQL5",181,0) + Q BMXGNOD1 +"RTN","BMXSQL6") +0^103^B130304448 +"RTN","BMXSQL6",1,0) +BMXSQL6 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; 7/20/2009 +"RTN","BMXSQL6",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL6",3,0) + ; Line EOR+3 used a 2 argument form of $Q which is not +"RTN","BMXSQL6",4,0) + ; in the M 95 standard. Replaced this with a call to $$LAST, +"RTN","BMXSQL6",5,0) + ; a new Extrinsic in this routine. +"RTN","BMXSQL6",6,0) + ; +"RTN","BMXSQL6",7,0) + ; +"RTN","BMXSQL6",8,0) +WRITE ;EP +"RTN","BMXSQL6",9,0) + N BMXFN,C,BMXN,BMXGF,BMXA,BMXFLDF,N,A,IEN0,I +"RTN","BMXSQL6",10,0) + N BMXCNT,BMXCNTB,BMXLEN,BMXLTMP,BMXNUM,BMXORD,BMXTYP +"RTN","BMXSQL6",11,0) + N BMXCFN,BMXCFNX,F,BMXROOT,BMXCID,BMXZ ;From MAKEC +"RTN","BMXSQL6",12,0) + N BMXREC,BMXCHAIN ;TODO: COMMENT AFTER TESTING +"RTN","BMXSQL6",13,0) + N BMXIENS +"RTN","BMXSQL6",14,0) + ;Set up FIELD value for GETS^DIQ call +"RTN","BMXSQL6",15,0) + ; BMXFLD("NAME")="FILE#^FIELD#" +"RTN","BMXSQL6",16,0) + ; Need: BMXFLDN(FieldNumber) +"RTN","BMXSQL6",17,0) + ; and : BMXFLDO(SelectOrder) +"RTN","BMXSQL6",18,0) + ; Get file number -- for now just use first file in array +"RTN","BMXSQL6",19,0) + ; TODO: Set up same main file and related files here and in enumerator +"RTN","BMXSQL6",20,0) + S C=0,BMXN="" +"RTN","BMXSQL6",21,0) + N F +"RTN","BMXSQL6",22,0) + S BMXGF=0 +"RTN","BMXSQL6",23,0) + S F=0 F S F=$O(BMXF(F)) Q:F="" S BMXFN=BMXF(F) D +"RTN","BMXSQL6",24,0) + . S C=0,BMXN=-1 F S BMXN=$O(BMXFLDO(BMXN)) Q:BMXN="" D +"RTN","BMXSQL6",25,0) + . . Q:$P(BMXFLDO(BMXN),U)'=BMXFN +"RTN","BMXSQL6",26,0) + . . I $P(BMXFLDO(BMXN),U,2)=".001" S BMXGF=BMXGF+1 Q +"RTN","BMXSQL6",27,0) + . . S C=C+1 +"RTN","BMXSQL6",28,0) + . . S $P(BMXGF(BMXFN),";",C)=$P(BMXFLDO(BMXN),U,2) +"RTN","BMXSQL6",29,0) + . . S:'$D(BMXGF(BMXFN,"INTERNAL")) BMXGF(BMXFN,"INTERNAL")="E" +"RTN","BMXSQL6",30,0) + . . I $P(BMXFLDO(BMXN),U,3)="I" S BMXGF(BMXFN,"INTERNAL")="IE" +"RTN","BMXSQL6",31,0) + . . S BMXGF=BMXGF+1 +"RTN","BMXSQL6",32,0) + . . Q +"RTN","BMXSQL6",33,0) + . Q +"RTN","BMXSQL6",34,0) + ; +"RTN","BMXSQL6",35,0) + I BMXGF>1 K BMXTK("DISTINCT") ;Distinct supported for only one field +"RTN","BMXSQL6",36,0) + S N=0,BMXFLDF=0,I=1,BMXNUM=0 +"RTN","BMXSQL6",37,0) + D FIELDS +"RTN","BMXSQL6",38,0) + D MAKEC +"RTN","BMXSQL6",39,0) + ; +"RTN","BMXSQL6",40,0) + ; +"RTN","BMXSQL6",41,0) + I BMXCOL D COLTYPE^BMXSQL,ERRTACK^BMXSQL(I) Q ;Column info only +"RTN","BMXSQL6",42,0) + ; +"RTN","BMXSQL6",43,0) + S BMXA="A" +"RTN","BMXSQL6",44,0) + N G,R +"RTN","BMXSQL6",45,0) + ;---> Loop through results global +"RTN","BMXSQL6",46,0) + F S N=$O(^BMXTMP($J,N)) Q:'+N D +"RTN","BMXSQL6",47,0) + . K A +"RTN","BMXSQL6",48,0) + . S R=0 F S R=$O(BMXFO(R)) Q:'+R D ;For each file in ORDER array +"RTN","BMXSQL6",49,0) + . . S IEN0=0 +"RTN","BMXSQL6",50,0) + . . S BMXFN=BMXFO(R) +"RTN","BMXSQL6",51,0) + . . Q:$D(BMXMFL(BMXFN,"MULT")) +"RTN","BMXSQL6",52,0) + . . I R=1 S IEN0=^BMXTMP($J,N) ;Primary file +"RTN","BMXSQL6",53,0) + . . I R>1,$D(BMXFJ("JOIN",BMXFN)) D ;Joined file +"RTN","BMXSQL6",54,0) + . . . S IEN0=0 +"RTN","BMXSQL6",55,0) + . . . S G=BMXFJ("JOIN",BMXFN) +"RTN","BMXSQL6",56,0) + . . . S V=BMXFF(G,"JOIN","IEN") +"RTN","BMXSQL6",57,0) + . . . S @V=^BMXTMP($J,N) +"RTN","BMXSQL6",58,0) + . . . X BMXFF(G,"JOIN") +"RTN","BMXSQL6",59,0) + . . I +IEN0 D ;Removed $D(BMXGF(BMXFN)) for mult fld on extdnd ptr +"RTN","BMXSQL6",60,0) + . . . D SUBFILE(BMXFN) +"RTN","BMXSQL6",61,0) + . . I +IEN0,$D(BMXFLDN(BMXFN,.001)) D SETIEN(IEN0,BMXFN) +"RTN","BMXSQL6",62,0) + . . ; +"RTN","BMXSQL6",63,0) + . . I 0,R>1,$D(BMXMFL(BMXFN,"MULT")) D ;Multiple field +"RTN","BMXSQL6",64,0) + . . . Q:'+IEN0 +"RTN","BMXSQL6",65,0) + . . . Q:'$D(BMXGF(BMXFN)) ;Intervening multiple +"RTN","BMXSQL6",66,0) + . . . ;Call GETS for each subentry in multiple +"RTN","BMXSQL6",67,0) + . . . X BMXMFL(BMXFN,"EXEC") +"RTN","BMXSQL6",68,0) + . S F=0,BMXCNT=0 +"RTN","BMXSQL6",69,0) + . ; +"RTN","BMXSQL6",70,0) + . D RECORD +"RTN","BMXSQL6",71,0) + . D OUT +"RTN","BMXSQL6",72,0) + ; +"RTN","BMXSQL6",73,0) + ; +"RTN","BMXSQL6",74,0) + ;---> Tack on Error Delimiter and any error. +"RTN","BMXSQL6",75,0) + S I=I+1 +"RTN","BMXSQL6",76,0) + D ERRTACK^BMXSQL(I) +"RTN","BMXSQL6",77,0) + D COLTYPE^BMXSQL +"RTN","BMXSQL6",78,0) + Q +"RTN","BMXSQL6",79,0) + ; +"RTN","BMXSQL6",80,0) +SETIEN(BMXIEN,BMXFN) ; +"RTN","BMXSQL6",81,0) + ;B ;SETIEN +"RTN","BMXSQL6",82,0) + Q:'$D(BMXFLDN(BMXFN,.001)) +"RTN","BMXSQL6",83,0) + Q:'+BMXIEN +"RTN","BMXSQL6",84,0) + S A(BMXFN,BMXIEN_",",.001,"E")=BMXIEN +"RTN","BMXSQL6",85,0) + Q +"RTN","BMXSQL6",86,0) + ; +"RTN","BMXSQL6",87,0) +SUBFILE(BMXFN) ; +"RTN","BMXSQL6",88,0) + ;Execute GETS for Any fields in BMXGF(SUBFILE) +"RTN","BMXSQL6",89,0) + ; +"RTN","BMXSQL6",90,0) + ;If the subfile itself has subfiles, call SUBFILE(BMXSUBFN) +"RTN","BMXSQL6",91,0) + ; (Loop through BMXMFL(BMXFN,"SUBFILE",BMXSUBFN)) +"RTN","BMXSQL6",92,0) + I $D(BMXMFL(BMXFN,"SUBFILE")) D +"RTN","BMXSQL6",93,0) + . N BMXSUBFN +"RTN","BMXSQL6",94,0) + . S BMXSUBFN=0 +"RTN","BMXSQL6",95,0) + . F S BMXSUBFN=$O(BMXMFL(BMXFN,"SUBFILE",BMXSUBFN)) Q:'+BMXSUBFN D SUBFILE(BMXSUBFN) +"RTN","BMXSQL6",96,0) + . Q +"RTN","BMXSQL6",97,0) + ; +"RTN","BMXSQL6",98,0) + I $D(BMXGF(BMXFN)) D +"RTN","BMXSQL6",99,0) + . I '$D(BMXMFL(BMXFN,"MULT")) S BMXMSCR=1 D GETS^DIQ(BMXFN,IEN0_",",BMXGF(BMXFN),BMXGF(BMXFN,"INTERNAL"),BMXA) Q +"RTN","BMXSQL6",100,0) + . E X BMXMFL(BMXFN,"EXEC") Q +"RTN","BMXSQL6",101,0) + ; +"RTN","BMXSQL6",102,0) + ; +"RTN","BMXSQL6",103,0) + Q +"RTN","BMXSQL6",104,0) + ; +"RTN","BMXSQL6",105,0) +FIELDS ;---> Write Field Names +"RTN","BMXSQL6",106,0) + ;Field name is TAAAAANAME +"RTN","BMXSQL6",107,0) + ;Where T is the field type (T=Text; D=Date) +"RTN","BMXSQL6",108,0) + ; AAAAA is the field size (see NUMCHAR routine) +"RTN","BMXSQL6",109,0) + ; NAME is the field name +"RTN","BMXSQL6",110,0) + N BMXNUM,BMXFNUM,BMXFNAM,R +"RTN","BMXSQL6",111,0) + K BMXLEN,BMXTYP +"RTN","BMXSQL6",112,0) + S BMXFLDF=1 +"RTN","BMXSQL6",113,0) + S BMXNUM=0 +"RTN","BMXSQL6",114,0) + ;B ;In FIELDS sub +"RTN","BMXSQL6",115,0) + D ;:$D(A) +"RTN","BMXSQL6",116,0) + . I BMXNUM S ^BMXTEMP($J,I)="IEN^",BMXLEN(I)=10,BMXTYP(I)="T",I=I+1 ;TODO: Change from text to number +"RTN","BMXSQL6",117,0) + . S BMXFNUM=0 +"RTN","BMXSQL6",118,0) + . S BMXFNAM=0 +"RTN","BMXSQL6",119,0) + . F R=0:1:(BMXFLDO-1) S BMXFN=$P(BMXFLDO(R),U),BMXFNUM=$P(BMXFLDO(R),U,2) D +"RTN","BMXSQL6",120,0) + . . ;S BMXFNAM=$P(^DD(BMXFN,BMXFNUM,0),"^") ;Get type here +"RTN","BMXSQL6",121,0) + . . S BMXFNAM=BMXFLDN(BMXFN,BMXFNUM) +"RTN","BMXSQL6",122,0) + . . I $P(BMXFLDO(R),U,3)="I" S BMXFNAM="INTERNAL["_BMXFNAM_"]" +"RTN","BMXSQL6",123,0) + . . S BMXFNAM=$TR(BMXFNAM," ","_") +"RTN","BMXSQL6",124,0) + . . I BMXF>1 S BMXFNAM=$TR($P(BMXFNX(BMXFN),".")," ","_")_"."_BMXFNAM +"RTN","BMXSQL6",125,0) + . . S BMXTYP(I)="T" +"RTN","BMXSQL6",126,0) + . . S:$P(BMXFLDO(R),U,5)="D" BMXTYP(I)="D" +"RTN","BMXSQL6",127,0) + . . S:$P(BMXFLDO(R),U,5)="I" BMXTYP(I)="I" +"RTN","BMXSQL6",128,0) + . . S BMXLEN(I)=0 ;Start with length zero +"RTN","BMXSQL6",129,0) + . . ;I $D(BMXFLDA(BMXFN,BMXFNUM)) S BMXFNAM=BMXFLDA(BMXFN,BMXFNUM) +"RTN","BMXSQL6",130,0) + . . I $P(BMXFLDO(R),U,6)]"" S BMXFNAM=$P(BMXFLDO(R),U,6) +"RTN","BMXSQL6",131,0) + . . S ^BMXTEMP($J,I)=BMXFNAM_"^" +"RTN","BMXSQL6",132,0) + . . S I=I+1 +"RTN","BMXSQL6",133,0) + . S ^BMXTEMP($J,I-1)=$E(^BMXTEMP($J,I-1),1,$L(^BMXTEMP($J,I-1))-1)_$C(30) +"RTN","BMXSQL6",134,0) + Q +"RTN","BMXSQL6",135,0) + ; +"RTN","BMXSQL6",136,0) +OUT ; +"RTN","BMXSQL6",137,0) + ;Output to BMXTEMP($J +"RTN","BMXSQL6",138,0) + Q:'$D(BMXREC) +"RTN","BMXSQL6",139,0) + N J,K,L,BMXLENT +"RTN","BMXSQL6",140,0) + S J=0 F S J=$O(BMXREC(J)) Q:'+J D +"RTN","BMXSQL6",141,0) + . S K=0 F S K=$O(BMXREC(J,K)) Q:'+K D +"RTN","BMXSQL6",142,0) + . . I +$O(BMXREC(J,K,0)) D Q ;WP +"RTN","BMXSQL6",143,0) + . . . S L=0,BMXLENT=0 F S L=$O(BMXREC(J,K,L)) Q:'+L D +"RTN","BMXSQL6",144,0) + . . . . S:'$D(^BMXTEMP($J,I)) ^BMXTEMP($J,I)="" +"RTN","BMXSQL6",145,0) + . . . . S:$L(^BMXTEMP($J,I))>250 I=I+1,^BMXTEMP($J,I)="" +"RTN","BMXSQL6",146,0) + . . . . S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_BMXREC(J,K,L) +"RTN","BMXSQL6",147,0) + . . . . S BMXLENT=BMXLENT+$L(BMXREC(J,K,L)) +"RTN","BMXSQL6",148,0) + . . . I BMXLEN(K)250 I=I+1,^BMXTEMP($J,I)="" +"RTN","BMXSQL6",151,0) + . . I $G(BMXTK("DISTINCT"))="TRUE",BMXREC(J,K)]"" Q:$D(^BMXTEMP($J,"DISTINCT",BMXREC(J,K))) +"RTN","BMXSQL6",152,0) + . . S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_BMXREC(J,K) +"RTN","BMXSQL6",153,0) + . . S:$L(BMXREC(J,K))>BMXLEN(K) BMXLEN(K)=$L(BMXREC(J,K)) +"RTN","BMXSQL6",154,0) + . . I $G(BMXTK("DISTINCT"))="TRUE" S ^BMXTEMP($J,"DISTINCT",BMXREC(J,K))="" +"RTN","BMXSQL6",155,0) + Q +"RTN","BMXSQL6",156,0) + ; +"RTN","BMXSQL6",157,0) +RECORD ; +"RTN","BMXSQL6",158,0) + ;For each chain +"RTN","BMXSQL6",159,0) + N C,BMXCQ,BMXLCQ,BMXCQN,BMXLCQN,BMXTRACK,BMXNODE,BMXCNAME,BMXWP +"RTN","BMXSQL6",160,0) + K BMXREC,BMXCHAIN ;TODO: REMOVE AFTER TESTING +"RTN","BMXSQL6",161,0) + D BLDCHN +"RTN","BMXSQL6",162,0) + S BMXREC=0 +"RTN","BMXSQL6",163,0) + D RECINI +"RTN","BMXSQL6",164,0) + S C=0 F S C=$O(BMXCHAIN(C)) Q:'+C D +"RTN","BMXSQL6",165,0) + . ;New chain +"RTN","BMXSQL6",166,0) + . ;Go to the end of the chain, writing record pieces as you go +"RTN","BMXSQL6",167,0) + . ;At the end of the chain, write end-of-record marker,increment record counter, copy previous record +"RTN","BMXSQL6",168,0) + . K BMXTRACK +"RTN","BMXSQL6",169,0) + . S BMXCNAME="BMXCHAIN("_C_")" +"RTN","BMXSQL6",170,0) + . S BMXCQN="" +"RTN","BMXSQL6",171,0) + . S BMXCQ=BMXCNAME F S BMXCQ=$Q(@BMXCQ) Q:BMXCQ="" Q:$P(BMXCQ,",")'=("BMXCHAIN("_C) D +"RTN","BMXSQL6",172,0) + . . S BMXNODE=@BMXCQ +"RTN","BMXSQL6",173,0) + . . I $P(BMXNODE,U,2)="" Q +"RTN","BMXSQL6",174,0) + . . S BMXWP=$P(BMXNODE,U,3) +"RTN","BMXSQL6",175,0) + . . S BMXLCQ=$L(BMXCQ,",") +"RTN","BMXSQL6",176,0) + . . S BMXCQN=$Q(@BMXCQ) +"RTN","BMXSQL6",177,0) + . . S BMXLCQN=$L(BMXCQN,",") +"RTN","BMXSQL6",178,0) + . . I BMXWP="W" D +"RTN","BMXSQL6",179,0) + . . . S BMXREC(BMXREC,$P(BMXNODE,U,2),$P(BMXNODE,U,4))=$P(BMXNODE,U) +"RTN","BMXSQL6",180,0) + . . . S BMXTRACK(BMXLCQ-1,$P(BMXNODE,U,2))=BMXNODE +"RTN","BMXSQL6",181,0) + . . E D +"RTN","BMXSQL6",182,0) + . . . S BMXREC(BMXREC,$P(BMXNODE,U,2))=$P(BMXNODE,U)_U +"RTN","BMXSQL6",183,0) + . . . S BMXTRACK(BMXLCQ,$P(BMXNODE,U,2))=BMXNODE +"RTN","BMXSQL6",184,0) + . . I BMXCQN="" D EOR Q +"RTN","BMXSQL6",185,0) + . . I $P(BMXCQN,",")'=("BMXCHAIN("_C) D EOR Q +"RTN","BMXSQL6",186,0) + . . I BMXLCQN>BMXLCQ Q +"RTN","BMXSQL6",187,0) + . . I (BMXLCQN>$S(BMXWP="W":7,1:6)) D Q +"RTN","BMXSQL6",188,0) + . . . I ($P(BMXCQ,",",1,BMXLCQ-2)=$P(BMXCQN,",",1,BMXLCQN-2)) Q +"RTN","BMXSQL6",189,0) + . . . D EOR ;End of chain +"RTN","BMXSQL6",190,0) + Q +"RTN","BMXSQL6",191,0) + ; +"RTN","BMXSQL6",192,0) +RECINI ; +"RTN","BMXSQL6",193,0) + N J +"RTN","BMXSQL6",194,0) + S BMXREC=BMXREC+1 +"RTN","BMXSQL6",195,0) + F J=1:1:BMXFLDO D +"RTN","BMXSQL6",196,0) + . I $P(BMXFLDO(J-1),U,4)="W" S BMXREC(BMXREC,J,999999)="^" Q +"RTN","BMXSQL6",197,0) + . S BMXREC(BMXREC,J)="^" +"RTN","BMXSQL6",198,0) + Q +"RTN","BMXSQL6",199,0) + ; +"RTN","BMXSQL6",200,0) +EOR ; +"RTN","BMXSQL6",201,0) + ;B ;EOR +"RTN","BMXSQL6",202,0) + N J,K,L,M,I,N +"RTN","BMXSQL6",203,0) + ; S M=$Q(BMXREC(9999999),-1) //SMH - Another Cacheism +"RTN","BMXSQL6",204,0) + S M=$$LAST("BMXREC") +"RTN","BMXSQL6",205,0) + S @M=$TR(@M,"^",$C(30)) +"RTN","BMXSQL6",206,0) + Q:BMXCQN="" +"RTN","BMXSQL6",207,0) + I BMXCQN'="" D RECINI +"RTN","BMXSQL6",208,0) + ;K BMXTRACK(BMXLCQ) ;Also kill all track levels between current and next level +"RTN","BMXSQL6",209,0) + F K BMXTRACK($O(BMXTRACK(999999),-1)) Q:$O(BMXTRACK(9999999),-1)'>BMXLCQN +"RTN","BMXSQL6",210,0) + S J=0 F S J=$O(BMXTRACK(J)) Q:'+J D ;Level +"RTN","BMXSQL6",211,0) + . S K=0 F S K=$O(BMXTRACK(J,K)) Q:'+K D ;Order +"RTN","BMXSQL6",212,0) + . . I $D(BMXTRACK(J,K)) S BMXNODE=BMXTRACK(J,K) S BMXREC(BMXREC,$P(BMXNODE,U,2))=$P(BMXNODE,U)_U +"RTN","BMXSQL6",213,0) + . . S L=0 F S L=$O(BMXTRACK(J,K,L)) Q:'+L D ;wp node +"RTN","BMXSQL6",214,0) + . . . I $D(BMXTRACK(J,K,L)) S BMXNODE=BMXTRACK(J,K,L) S BMXREC(BMXREC,$P(BMXNODE,U,2),L)=$P(BMXNODE,U) +"RTN","BMXSQL6",215,0) + Q +"RTN","BMXSQL6",216,0) + ; +"RTN","BMXSQL6",217,0) +BLDCHN ; +"RTN","BMXSQL6",218,0) + N B +"RTN","BMXSQL6",219,0) + D MAKEB +"RTN","BMXSQL6",220,0) + ;D MAKEC +"RTN","BMXSQL6",221,0) + D BUILD +"RTN","BMXSQL6",222,0) + Q +"RTN","BMXSQL6",223,0) + ; +"RTN","BMXSQL6",224,0) +MAKEC ; +"RTN","BMXSQL6",225,0) + ;MAKE Chain +"RTN","BMXSQL6",226,0) + ;How many chains are there? +"RTN","BMXSQL6",227,0) + S BMXZ=0 S BMXCID=1 K BMXCFN +"RTN","BMXSQL6",228,0) + ; +"RTN","BMXSQL6",229,0) + ; +"RTN","BMXSQL6",230,0) + ;Create BMXCHNP(BMXCID) +"RTN","BMXSQL6",231,0) + S F=0 F S F=$O(BMXMFL(F)) Q:'+F I '$D(BMXMFL("SUBFILE",F)),$D(BMXMFL("PARENT",F)) S BMXMFL("BOTTOM",F)="" +"RTN","BMXSQL6",232,0) + N BMXCB,BMXCHNP,BMXP +"RTN","BMXSQL6",233,0) + S BMXCID=0,BMXCB=0,BMXCHNP=0 +"RTN","BMXSQL6",234,0) + I $D(BMXMFL("BOTTOM")) F S BMXCB=$O(BMXMFL("BOTTOM",BMXCB)) Q:'BMXCB D +"RTN","BMXSQL6",235,0) + . S BMXCID=BMXCID+1,BMXCHNP=BMXCID +"RTN","BMXSQL6",236,0) + . S BMXCHNP(BMXCID)=BMXCB +"RTN","BMXSQL6",237,0) + . S BMXP=BMXCB +"RTN","BMXSQL6",238,0) + . F Q:'$D(BMXMFL("PARENT",BMXP)) S BMXP=BMXMFL("PARENT",BMXP) S BMXCHNP(BMXCID)=BMXP_U_BMXCHNP(BMXCID) +"RTN","BMXSQL6",239,0) + ; +"RTN","BMXSQL6",240,0) + N J,K,L,M +"RTN","BMXSQL6",241,0) + ;Create BMXMFL("BASE")="FILE1^FILE2^...^FILEN" +"RTN","BMXSQL6",242,0) + S F=0,M=0,BMXMFL("BASE")="" F S F=$O(BMXMFL(F)) Q:'+F I (('$D(BMXMFL("PARENT",F)))&('$D(BMXMFL(F,"SUBFILE"))))!(BMXFO(1)=F) S M=M+1,$P(BMXMFL("BASE"),U,M)=F ;Changed to make BMXFO(1) always a member of the base +"RTN","BMXSQL6",243,0) + ; +"RTN","BMXSQL6",244,0) + ;Create BMXCFN(BMXCID,BMXZ,FILE) +"RTN","BMXSQL6",245,0) + I BMXCID=0 S BMXCID=1 +"RTN","BMXSQL6",246,0) + S J=0,BMXZ=0 F J=1:1:BMXCID D +"RTN","BMXSQL6",247,0) + . I BMXMFL("BASE")]"" F L=1:1:$L(BMXMFL("BASE"),"^") S F=$P(BMXMFL("BASE"),"^",L) D +"RTN","BMXSQL6",248,0) + . . S BMXZ=BMXZ+100 +"RTN","BMXSQL6",249,0) + . . S BMXCFN(J,BMXZ,F)="" +"RTN","BMXSQL6",250,0) + . I +BMXCHNP F K=1:1:$L(BMXCHNP(J),"^") S F=$P(BMXCHNP(J),"^",K) D +"RTN","BMXSQL6",251,0) + . . Q:F=BMXFO(1) ;BMXFO(1) Is always a member of the base +"RTN","BMXSQL6",252,0) + . . S BMXZ=BMXZ+100 +"RTN","BMXSQL6",253,0) + . . S BMXCFN(J,BMXZ,F)="" +"RTN","BMXSQL6",254,0) + ; +"RTN","BMXSQL6",255,0) + ; +"RTN","BMXSQL6",256,0) + ;B ;FIXCFN +"RTN","BMXSQL6",257,0) + D FIXCFN +"RTN","BMXSQL6",258,0) + Q +"RTN","BMXSQL6",259,0) + ; +"RTN","BMXSQL6",260,0) +BUILD ;Building BMXCHAIN( +"RTN","BMXSQL6",261,0) + N BMXIEN,BMXCID,BMXFLD,BMXCS,BMXINT,BMXCFNC,BMXCFIEN +"RTN","BMXSQL6",262,0) + S BMXCID=0,BMXIEN=0 +"RTN","BMXSQL6",263,0) + F S BMXCID=$O(BMXCFN(BMXCID)) Q:'+BMXCID D +"RTN","BMXSQL6",264,0) + . S BMXCFNC=0 F S BMXCFNC=$O(BMXCFN(BMXCID,BMXCFNC)) Q:'+BMXCFNC S BMXCFN=+BMXCFN(BMXCID,BMXCFNC) D +"RTN","BMXSQL6",265,0) + . . S BMXIEN=0 F S BMXIEN=$O(B(BMXCFN,BMXIEN)) Q:BMXIEN="" D +"RTN","BMXSQL6",266,0) + . . . S $P(BMXCFN(BMXCID,BMXCFNC),U,2)=BMXIEN +"RTN","BMXSQL6",267,0) + . . . S BMXFLD=0 F S BMXFLD=$O(B(BMXCFN,BMXIEN,BMXFLD)) Q:'+BMXFLD D +"RTN","BMXSQL6",268,0) + . . . . S BMXINT="D" F S BMXINT=$O(B(BMXCFN,BMXIEN,BMXFLD,BMXINT)) Q:BMXINT="" D +"RTN","BMXSQL6",269,0) + . . . . . Q:'$D(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)) +"RTN","BMXSQL6",270,0) + . . . . . I $P(BMXFLDO(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)),U,4)="W" D MCWP Q +"RTN","BMXSQL6",271,0) + . . . . . D FIXIEN +"RTN","BMXSQL6",272,0) + . . . . . S BMXCS="BMXCHAIN("_BMXCID_","_$S($L(BMXIEN,",")=2:1,1:2)_","_BMXCFIEN_","_BMXFLD_","_$C(34)_BMXINT_$C(34)_")" +"RTN","BMXSQL6",273,0) + . . . . . S @BMXCS=B(BMXCFN,BMXIEN,BMXFLD,BMXINT)_U_(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)+1) +"RTN","BMXSQL6",274,0) + Q +"RTN","BMXSQL6",275,0) + ; +"RTN","BMXSQL6",276,0) +FIXIEN ; +"RTN","BMXSQL6",277,0) + N BMXC,BMXCFN1,BMXOFF +"RTN","BMXSQL6",278,0) + S BMXC=BMXCFNC +"RTN","BMXSQL6",279,0) + S BMXCFIEN=BMXCFN_","_$P(BMXIEN,",",$L(BMXIEN,",")) +"RTN","BMXSQL6",280,0) + S BMXOFF=1 +"RTN","BMXSQL6",281,0) + F S BMXC=$O(BMXCFN(BMXCID,BMXC),-1) Q:'+BMXC D +"RTN","BMXSQL6",282,0) + . S BMXCFN1=+BMXCFN(BMXCID,BMXC) +"RTN","BMXSQL6",283,0) + . I '$D(BMXMFL(BMXCFN,"OTM")) D +"RTN","BMXSQL6",284,0) + . . I '$D(BMXMFL(BMXCFN1,"SUBFILE",BMXCFN)) Q +"RTN","BMXSQL6",285,0) + . . S BMXCFIEN=BMXCFN1_","_$P(BMXIEN,",",$L(BMXIEN,",")-BMXOFF)_","_BMXCFIEN +"RTN","BMXSQL6",286,0) + . I $D(BMXMFL(BMXCFN,"OTM")) D +"RTN","BMXSQL6",287,0) + . . I '$D(BMXMFL(BMXCFN1,"SUBFILE",BMXCFN)) Q +"RTN","BMXSQL6",288,0) + . . S BMXCFIEN=BMXCFN1_$P(BMXCFN(BMXCID,BMXC),U,2)_","_BMXCFIEN +"RTN","BMXSQL6",289,0) + . S BMXOFF=BMXOFF+1 +"RTN","BMXSQL6",290,0) + ; +"RTN","BMXSQL6",291,0) + ; +"RTN","BMXSQL6",292,0) + Q +"RTN","BMXSQL6",293,0) + ; +"RTN","BMXSQL6",294,0) +FIXCFN ; +"RTN","BMXSQL6",295,0) + N J,K,L +"RTN","BMXSQL6",296,0) + S J=0 F S J=$O(BMXCFN(J)) Q:'+J D +"RTN","BMXSQL6",297,0) + . S K=0 F S K=$O(BMXCFN(J,K)) Q:'+K D +"RTN","BMXSQL6",298,0) + . . S L=0 F S L=$O(BMXCFN(J,K,L)) Q:'+L D +"RTN","BMXSQL6",299,0) + . . . K BMXCFN(J,K,L) +"RTN","BMXSQL6",300,0) + . . . S BMXCFN(J,K)=L +"RTN","BMXSQL6",301,0) + ; +"RTN","BMXSQL6",302,0) + Q +"RTN","BMXSQL6",303,0) + ; +"RTN","BMXSQL6",304,0) +MCWP ; +"RTN","BMXSQL6",305,0) + ;MAKEC Process WP Field +"RTN","BMXSQL6",306,0) + N BMXIENL,BMXWP +"RTN","BMXSQL6",307,0) + S BMXIENL=1 +"RTN","BMXSQL6",308,0) + S:$L(BMXIEN,",")>2 BMXIENL=2 +"RTN","BMXSQL6",309,0) + S BMXWP=0 +"RTN","BMXSQL6",310,0) + ; +"RTN","BMXSQL6",311,0) + F S BMXWP=$O(B(BMXCFN,BMXIEN,BMXFLD,BMXWP)) Q:'+BMXWP D +"RTN","BMXSQL6",312,0) + . S BMXCS="BMXCHAIN("_BMXCID_","_BMXIENL_","_BMXCFN_BMXIEN_","_BMXFLD_","_$C(34)_BMXINT_$C(34)_","_BMXWP_")" +"RTN","BMXSQL6",313,0) + . S @BMXCS=B(BMXCFN,BMXIEN,BMXFLD,BMXWP)_U_(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)+1)_U_"W"_U_BMXWP +"RTN","BMXSQL6",314,0) + Q +"RTN","BMXSQL6",315,0) + ; +"RTN","BMXSQL6",316,0) + ; +"RTN","BMXSQL6",317,0) +MAKEB ; +"RTN","BMXSQL6",318,0) + N BMXFILE,BMXIEN,BMXFLD,BMXINT +"RTN","BMXSQL6",319,0) + N BMXSUB,BMXIENR +"RTN","BMXSQL6",320,0) + S BMXFILE=0 F S BMXFILE=$O(A(BMXFILE)) Q:'+BMXFILE D +"RTN","BMXSQL6",321,0) + . S BMXIEN=0 F S BMXIEN=$O(A(BMXFILE,BMXIEN)) Q:'+BMXIEN D +"RTN","BMXSQL6",322,0) + . . S BMXFLD=0 F S BMXFLD=$O(A(BMXFILE,BMXIEN,BMXFLD)) Q:'+BMXFLD D +"RTN","BMXSQL6",323,0) + . . . S BMXINT=0 F S BMXINT=$O(A(BMXFILE,BMXIEN,BMXFLD,BMXINT)) Q:BMXINT="" D +"RTN","BMXSQL6",324,0) + . . . . S BMXIENR=$$REVERSE(BMXIEN) +"RTN","BMXSQL6",325,0) + . . . . S BMXSUB="B("_BMXFILE_","_$C(34)_BMXIENR_$C(34)_","_BMXFLD_","_$C(34)_BMXINT_$C(34)_")" +"RTN","BMXSQL6",326,0) + . . . . I $D(BMXFLDOX(BMXFILE,BMXFLD,BMXINT)),$P(BMXFLDO(BMXFLDOX(BMXFILE,BMXFLD,BMXINT)),U,5)="D" D Q +"RTN","BMXSQL6",327,0) + . . . . . S @BMXSUB=$TR(A(BMXFILE,BMXIEN,BMXFLD,BMXINT),"@"," ") +"RTN","BMXSQL6",328,0) + . . . . S @BMXSUB=A(BMXFILE,BMXIEN,BMXFLD,BMXINT) +"RTN","BMXSQL6",329,0) + Q +"RTN","BMXSQL6",330,0) + ; +"RTN","BMXSQL6",331,0) +REVERSE(BMXIEN) ; +"RTN","BMXSQL6",332,0) + N J,T,C +"RTN","BMXSQL6",333,0) + S C=1 +"RTN","BMXSQL6",334,0) + F J=$L(BMXIEN,","):-1:1 D +"RTN","BMXSQL6",335,0) + . S $P(T,",",C)=$P(BMXIEN,",",J) +"RTN","BMXSQL6",336,0) + . S C=C+1 +"RTN","BMXSQL6",337,0) + Q T +"RTN","BMXSQL6",338,0) +LAST(VAR) ; Get last entry in an array //SMH new code +"RTN","BMXSQL6",339,0) + N SUB1 S SUB1=$O(@VAR@(""),-1) +"RTN","BMXSQL6",340,0) + N SUB2 S SUB2=$O(@VAR@(SUB1,""),-1) +"RTN","BMXSQL6",341,0) + N SUB3 S SUB3=$O(@VAR@(SUB1,SUB2,""),-1) +"RTN","BMXSQL6",342,0) + I SUB3="" Q $NA(@VAR@(SUB1,SUB2)) +"RTN","BMXSQL6",343,0) + E Q $NA(@VAR@(SUB1,SUB2,SUB3)) +"RTN","BMXSQL7") +0^104^B65321243 +"RTN","BMXSQL7",1,0) +BMXSQL7 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL7",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL7",3,0) + ; +"RTN","BMXSQL7",4,0) + ; +"RTN","BMXSQL7",5,0) +CHKCR(BMXFNUM,BMXFLDNU,BMXRET) ;Returns cross reference to iterate on for related file +"RTN","BMXSQL7",6,0) + N BMXREF,BMXHIT,BMXRNOD,BMXTMP,BMXTMPV,BMXTMPI,BMXTMPP,BMXPFFN,BMXPFF,Q +"RTN","BMXSQL7",7,0) + N BMXHIT,BMXREF,BMXGL,BMXNOD,BMXRNAM,BMXTMPL,BMXTMPN,BMXTST +"RTN","BMXSQL7",8,0) + ; +"RTN","BMXSQL7",9,0) + S BMXNOD=^DD(BMXFNUM,BMXFLDNU,0) +"RTN","BMXSQL7",10,0) + S BMXGL=^DIC(BMXFNUM,0,"GL") ;Subfile global +"RTN","BMXSQL7",11,0) + S BMXREF=0,BMXHIT=0,Q=$C(34),BMXRET="" +"RTN","BMXSQL7",12,0) + F S BMXREF=$O(^DD(BMXFNUM,BMXFLDNU,1,BMXREF)) Q:'+BMXREF D Q:BMXHIT +"RTN","BMXSQL7",13,0) + . Q:'$D(^DD(BMXFNUM,BMXFLDNU,1,BMXREF,0)) +"RTN","BMXSQL7",14,0) + . S BMXRNOD=^DD(BMXFNUM,BMXFLDNU,1,BMXREF,0) +"RTN","BMXSQL7",15,0) + . Q:$P(BMXRNOD,U,3)]"" +"RTN","BMXSQL7",16,0) + . S BMXRNAM=$P(BMXRNOD,U,2) +"RTN","BMXSQL7",17,0) + . S BMXTMP=BMXGL_Q_BMXRNAM_Q_")" +"RTN","BMXSQL7",18,0) + . S BMXTST=$P(BMXTMP,")")_",IEN0," +"RTN","BMXSQL7",19,0) + . Q:'$D(@BMXTMP) +"RTN","BMXSQL7",20,0) + . S BMXTMPV=0,BMXTMPV=$O(@BMXTMP@(BMXTMPV)) +"RTN","BMXSQL7",21,0) + . Q:BMXTMPV="" +"RTN","BMXSQL7",22,0) + . S BMXTMP=BMXGL_Q_BMXRNAM_Q_","_Q_BMXTMPV_Q_")" +"RTN","BMXSQL7",23,0) + . S BMXTMPI=0,BMXTMPI=$O(@BMXTMP@(BMXTMPI)) +"RTN","BMXSQL7",24,0) + . S BMXTMP=$S(BMXGL[",":$P(BMXGL,",")_")",1:$P(BMXGL,"(")) +"RTN","BMXSQL7",25,0) + . Q:'$D(@BMXTMP@(BMXTMPI)) +"RTN","BMXSQL7",26,0) + . S BMXTMPL=$P(BMXNOD,U,4) +"RTN","BMXSQL7",27,0) + . S BMXTMPP=$P(BMXTMPL,";",2) +"RTN","BMXSQL7",28,0) + . S BMXTMPL=$P(BMXTMPL,";") +"RTN","BMXSQL7",29,0) + . Q:BMXTMPL="" +"RTN","BMXSQL7",30,0) + . S BMXTMP=BMXGL_BMXTMPI_")" +"RTN","BMXSQL7",31,0) + . Q:'$D(@BMXTMP@(BMXTMPL)) +"RTN","BMXSQL7",32,0) + . S BMXTMPN=@BMXTMP@(BMXTMPL) +"RTN","BMXSQL7",33,0) + . S BMXTMPP=$P(BMXTMPN,"^",BMXTMPP) +"RTN","BMXSQL7",34,0) + . I BMXTMPP=BMXTMPV S BMXRET=BMXTST,BMXHIT=1 +"RTN","BMXSQL7",35,0) + Q BMXHIT +"RTN","BMXSQL7",36,0) + ; +"RTN","BMXSQL7",37,0) + ; +"RTN","BMXSQL7",38,0) +WHERE ;EP - WHERE-clause processing +"RTN","BMXSQL7",39,0) + ; +"RTN","BMXSQL7",40,0) + ;Set up the defualt iterator in BMXX(1) to scan the entire file. +"RTN","BMXSQL7",41,0) + ;For now, just use first file in the FROM group +"RTN","BMXSQL7",42,0) + ;Later, pick the smallest file if more than one file +"RTN","BMXSQL7",43,0) + ; +"RTN","BMXSQL7",44,0) + ;Set up BMXFF array for each expression element +"RTN","BMXSQL7",45,0) + ; BMXFF(n)=FILENAME^FIELDNAME^OPERATOR^VALUE^FILENUMBER^FIELDNUMBER +"RTN","BMXSQL7",46,0) + ; ^FILE GLOBAL^FIELD DATA LOCATION +"RTN","BMXSQL7",47,0) + ; BMXFF(n,0)=Field descriptor ^DD(FILE,FIELD,0) +"RTN","BMXSQL7",48,0) + ; +"RTN","BMXSQL7",49,0) + N BMXGL,BMXOP,BMXTYP,BMXV,BMXV1,BMXV2,BMXFILE,BMXTMP +"RTN","BMXSQL7",50,0) + N BMXINTNL,BMXTMPLT +"RTN","BMXSQL7",51,0) + N BMXIEN +"RTN","BMXSQL7",52,0) + S BMXGL=^DIC(BMXFO(1),0,"GL") +"RTN","BMXSQL7",53,0) + S BMXX=1 +"RTN","BMXSQL7",54,0) + S BMXX(1)="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " +"RTN","BMXSQL7",55,0) + S BMXTMP=BMXGL +"RTN","BMXSQL7",56,0) + I BMXTMP["," S BMXTMP=$TR(BMXTMP,",",")") +"RTN","BMXSQL7",57,0) + E S BMXTMP=$P(BMXTMP,"(",1) +"RTN","BMXSQL7",58,0) + I $D(@BMXTMP@("B")) D +"RTN","BMXSQL7",59,0) + . S BMXX(1)="S BMXTMP=0 F S BMXTMP=$O("_BMXGL_$C(34)_"B"_$C(34)_",BMXTMP)) Q:BMXTMP="""" S D0=0 F S D0=$O("_BMXGL_$C(34)_"B"_$C(34)_",BMXTMP,D0)) Q:'+D0 Q:BMXM>BMXXMAX " +"RTN","BMXSQL7",60,0) + ; +"RTN","BMXSQL7",61,0) + ;--->BMXFF array: +"RTN","BMXSQL7",62,0) + ; +"RTN","BMXSQL7",63,0) + S T=$G(BMXTK("WHERE")) +"RTN","BMXSQL7",64,0) + S BMXFF=0,C=0 +"RTN","BMXSQL7",65,0) + Q:'+T +"RTN","BMXSQL7",66,0) + F S T=$O(BMXTK(T)) Q:'+T Q:T=$G(BMXTK("ORDER BY")) Q:T=$G(BMXTK("GROUP BY")) D Q:$D(BMXERR) +"RTN","BMXSQL7",67,0) + . ;Get the file of the field +"RTN","BMXSQL7",68,0) + . I "AND^OR^(^)"[BMXTK(T) D Q +"RTN","BMXSQL7",69,0) + . . S C=C+1 +"RTN","BMXSQL7",70,0) + . . S BMXFF(C)=BMXTK(T) +"RTN","BMXSQL7",71,0) + . . S BMXFF=C +"RTN","BMXSQL7",72,0) + . S BMXTK(T)=$TR(BMXTK(T),"_"," ") +"RTN","BMXSQL7",73,0) + . S BMXTK(T)=$TR(BMXTK(T),"'","") +"RTN","BMXSQL7",74,0) + . S BMXINTNL=0 +"RTN","BMXSQL7",75,0) + . S BMXTMPLT=0 +"RTN","BMXSQL7",76,0) + . S BMXIEN=0 +"RTN","BMXSQL7",77,0) + . I BMXTK(T)["INTERNAL[" S BMXINTNL=1,BMXTK(T)=$P(BMXTK(T),"[",2),BMXTK(T)=$P(BMXTK(T),"]",1) +"RTN","BMXSQL7",78,0) + . I BMXTK(T)["TEMPLATE[" S BMXTMPLT=1,BMXTK(T)=$P(BMXTK(T),"[",2),BMXTK(T)=$P(BMXTK(T),"]",1),BMXIEN=1 +"RTN","BMXSQL7",79,0) + . I BMXTK(T)["BMXIEN" S BMXIEN=1 +"RTN","BMXSQL7",80,0) + . S BMXFILE=$$FLDFILE^BMXSQL2(BMXTK(T)) +"RTN","BMXSQL7",81,0) + . Q:$D(BMXERR) +"RTN","BMXSQL7",82,0) + . S C=C+1 +"RTN","BMXSQL7",83,0) + . S BMXFF=C ;This is a count of the where fields +"RTN","BMXSQL7",84,0) + . I BMXFILE]"" D +"RTN","BMXSQL7",85,0) + . . S $P(BMXFF(C),U,1)=$P(BMXFILE,U,1) ;FILENAME +"RTN","BMXSQL7",86,0) + . . S $P(BMXFF(C),U,2)=$P(BMXFILE,U,2) ;FIELDNAME +"RTN","BMXSQL7",87,0) + . . S $P(BMXFF(C),U,5)=$P(BMXFILE,U,3) ;FILENUMBER +"RTN","BMXSQL7",88,0) + . . S $P(BMXFF(C),U,6)=$P(BMXFILE,U,4) ;FIELDNUMBER +"RTN","BMXSQL7",89,0) + . . I $P(BMXFILE,U,3),$D(^DIC($P(BMXFILE,U,3),0,"GL")) S $P(BMXFF(C),U,7)=^DIC($P(BMXFILE,U,3),0,"GL") +"RTN","BMXSQL7",90,0) + . . I BMXIEN S BMXFF(C,0)="IEN",BMXFF(C,"IEN")=1,BMXFF(C,"TYPE")="IEN" +"RTN","BMXSQL7",91,0) + . . E S BMXFF(C,0)=$S(+$P(BMXFILE,U,3):^DD($P(BMXFILE,U,3),$P(BMXFILE,U,4),0),1:"") +"RTN","BMXSQL7",92,0) + . . I BMXINTNL S BMXFF(C,"INTERNAL")=1 +"RTN","BMXSQL7",93,0) + . ; +"RTN","BMXSQL7",94,0) + . ;If BMXFF(C) is a pointer, traverse pointer chain to retrieve type +"RTN","BMXSQL7",95,0) + . I $P(BMXFF(C,0),U,2)["P" D +"RTN","BMXSQL7",96,0) + . . ;B ;WHERE Pointer Type +"RTN","BMXSQL7",97,0) + . . N BMXFILN,BMXFLDN,BMXDD +"RTN","BMXSQL7",98,0) + . . S BMXDD=BMXFF(C,0) +"RTN","BMXSQL7",99,0) + . . F Q:$P(BMXDD,U,2)'["P" D:$P(BMXDD,U,2)["P" +"RTN","BMXSQL7",100,0) + . . . S BMXFILN=$P(BMXDD,U,2) +"RTN","BMXSQL7",101,0) + . . . S BMXFILN=+$P(BMXFILN,"P",2) +"RTN","BMXSQL7",102,0) + . . . S BMXDD=^DD(BMXFILN,".01",0) +"RTN","BMXSQL7",103,0) + . . S BMXFF(C,"TYPE")=$S($P(BMXDD,U,2)["D":"DATE",$P(BMXDD,U,2)["S":"SET",1:"OTHER") +"RTN","BMXSQL7",104,0) + . . I BMXFF(C,"TYPE")="SET" S $P(BMXFF(C,"TYPE"),U,2)=$P(BMXDD,U,3) +"RTN","BMXSQL7",105,0) + . ;B ;WHERE Set Type +"RTN","BMXSQL7",106,0) + . I ($P(BMXFF(C,0),U,2)["S")!($P($G(BMXFF(C,"TYPE")),U)="SET") D ;Set +"RTN","BMXSQL7",107,0) + . . N BMXSET,BMXSETP +"RTN","BMXSQL7",108,0) + . . I $P(BMXFF(C,0),U,2)["S" D +"RTN","BMXSQL7",109,0) + . . . S BMXFF(C,"TYPE")="SET" +"RTN","BMXSQL7",110,0) + . . . S $P(BMXFF(C,"TYPE"),U,2)=$P(BMXFF(C,0),U,3) +"RTN","BMXSQL7",111,0) + . . S BMXSET=$P(BMXFF(C,"TYPE"),U,2) +"RTN","BMXSQL7",112,0) + . . F J=1:1:$L(BMXSET,";") D +"RTN","BMXSQL7",113,0) + . . . S BMXSETP=$P(BMXSET,";",J) +"RTN","BMXSQL7",114,0) + . . . Q:BMXSETP="" +"RTN","BMXSQL7",115,0) + . . . S BMXFF(C,"SET",$P(BMXSETP,":",2))=$P(BMXSETP,":") +"RTN","BMXSQL7",116,0) + . ; +"RTN","BMXSQL7",117,0) + . ;Set up comparisons based on operators +"RTN","BMXSQL7",118,0) + . S T=T+1 +"RTN","BMXSQL7",119,0) + . S BMXOP=BMXTK(T) +"RTN","BMXSQL7",120,0) + . I BMXTMPLT S BMXOP="=" +"RTN","BMXSQL7",121,0) + . I "^<^>^=^[^<>^>=^<=^LIKE"[BMXOP D Q +"RTN","BMXSQL7",122,0) + . . S $P(BMXFF(C),U,3)=BMXTK(T) +"RTN","BMXSQL7",123,0) + . . ;Get the comparison value +"RTN","BMXSQL7",124,0) + . . S T=T+1 +"RTN","BMXSQL7",125,0) + . . S BMXTMP=BMXTK(T) +"RTN","BMXSQL7",126,0) + . . S BMXTMP=$TR(BMXTMP,"'","") +"RTN","BMXSQL7",127,0) + . . I BMXOP="LIKE" S BMXTMP=$P(BMXTMP,"%"),$P(BMXFF(C),U,4)=BMXTMP Q +"RTN","BMXSQL7",128,0) + . . I BMXTMPLT D TMPLATE Q +"RTN","BMXSQL7",129,0) + . . I BMXTMP="*" S T=T+1,BMXTMP=BMXTK(T) D OTM Q +"RTN","BMXSQL7",130,0) + . . I BMXTMP[".",BMXTK(T)'["'" D ;This is a join ;TODO: Extended pointers +"RTN","BMXSQL7",131,0) + . . . ;Setting BMXFJ("JOIN" +"RTN","BMXSQL7",132,0) + . . . S BMXTMP=BMXTK(T) +"RTN","BMXSQL7",133,0) + . . . I $D(BMXF($P(BMXTMP,"."))),BMXF($P(BMXTMP,"."))=BMXFO(1) D Q +"RTN","BMXSQL7",134,0) + . . . . S BMXTMP=BMXTK(T-2) +"RTN","BMXSQL7",135,0) + . . . . D OTM +"RTN","BMXSQL7",136,0) + . . . N BMXJN +"RTN","BMXSQL7",137,0) + . . . S BMXFF(C,"JOIN")="Pointer chain" +"RTN","BMXSQL7",138,0) + . . . S BMXJN=+$P($P(BMXFF(C,0),U,2),"P",2) +"RTN","BMXSQL7",139,0) + . . . S BMXFJ("JOIN",+$P($P(BMXFF(C,0),U,2),"P",2))=C +"RTN","BMXSQL7",140,0) + . . . S:+$P($P(BMXFF(C,0),U,2),"P",2)=2 BMXFJ("JOIN",9000001)=C ;IHS Only -- auto join PATIENT to VA PATIENT +"RTN","BMXSQL7",141,0) + . . I ($P(BMXFF(C,0),U,2)["D")!($G(BMXFF(C,"TYPE"))="DATE") D ;Date +"RTN","BMXSQL7",142,0) + . . . Q:$D(BMXFF(C,"INTERNAL")) +"RTN","BMXSQL7",143,0) + . . . I BMXTMP]"" S X=BMXTMP,%DT="T" D ^%DT S BMXTMP=Y +"RTN","BMXSQL7",144,0) + . . I $P($G(BMXFF(C,"TYPE")),U)="SET" D +"RTN","BMXSQL7",145,0) + . . . Q:$D(BMXFF(C,"INTERNAL")) +"RTN","BMXSQL7",146,0) + . . . Q:BMXTMP="" +"RTN","BMXSQL7",147,0) + . . . I $G(BMXFF(C,"SET",BMXTMP))="" S BMXTMP="ZZZZZZ" Q +"RTN","BMXSQL7",148,0) + . . . S BMXTMP=$G(BMXFF(C,"SET",BMXTMP)) +"RTN","BMXSQL7",149,0) + . . S $P(BMXFF(C),U,4)=BMXTMP +"RTN","BMXSQL7",150,0) + . . Q +"RTN","BMXSQL7",151,0) + . I BMXOP="BETWEEN" D +"RTN","BMXSQL7",152,0) + . . S $P(BMXFF(C),U,3)="BETWEEN" +"RTN","BMXSQL7",153,0) + . . ;Get the comparison value +"RTN","BMXSQL7",154,0) + . . S T=T+1 +"RTN","BMXSQL7",155,0) + . . S BMXV1=BMXTK(T) +"RTN","BMXSQL7",156,0) + . . S:BMXV1["'" BMXV1=$P(BMXV1,"'",2) +"RTN","BMXSQL7",157,0) + . . S T=T+1 +"RTN","BMXSQL7",158,0) + . . I BMXTK(T)'="AND" S BMXERR="'BETWEEN' VALUES NOT SPECIFIED" D ERROR Q +"RTN","BMXSQL7",159,0) + . . S T=T+1 +"RTN","BMXSQL7",160,0) + . . S BMXV2=BMXTK(T) +"RTN","BMXSQL7",161,0) + . . S:BMXV2["'" BMXV2=$P(BMXV2,"'",2) +"RTN","BMXSQL7",162,0) + . . I ($P(BMXFF(C,0),U,2)["D")!($G(BMXFF(C,"TYPE"))="DATE") D ;Date +"RTN","BMXSQL7",163,0) + . . . Q:$D(BMXFF(C,"INTERNAL")) +"RTN","BMXSQL7",164,0) + . . . S X=BMXV1,%DT="T" D ^%DT S BMXV1=Y +"RTN","BMXSQL7",165,0) + . . . S X=BMXV2,%DT="T" D ^%DT S BMXV2=Y +"RTN","BMXSQL7",166,0) + . . I BMXV1>BMXV2 S BMXTMP=BMXV1,BMXV1=BMXV2,BMXV2=BMXTMP +"RTN","BMXSQL7",167,0) + . . S $P(BMXFF(C),U,4)=BMXV1_"~"_BMXV2 +"RTN","BMXSQL7",168,0) + . . Q +"RTN","BMXSQL7",169,0) + . I $P(BMXFF(C),U,3)="" S BMXERR="INVALID OPERATOR" D ERROR Q +"RTN","BMXSQL7",170,0) + . I $D(BMXTK(T+1)),BMXTK(T+1)["[INDEX:" D +"RTN","BMXSQL7",171,0) + . . S T=T+1 +"RTN","BMXSQL7",172,0) + . . N BMXIND +"RTN","BMXSQL7",173,0) + . . S BMXIND=$P(BMXTK(T),"INDEX:",2) +"RTN","BMXSQL7",174,0) + . . S:BMXIND["]" BMXIND=$P(BMXIND,"]") +"RTN","BMXSQL7",175,0) + . . S:BMXIND["'" BMXIND=$P(BMXIND,"'",2) +"RTN","BMXSQL7",176,0) + . . S BMXFF("INDEX")=BMXIND +"RTN","BMXSQL7",177,0) + . Q +"RTN","BMXSQL7",178,0) + ; +"RTN","BMXSQL7",179,0) + Q:$D(BMXERR) +"RTN","BMXSQL7",180,0) + D JOIN^BMXSQL4 +"RTN","BMXSQL7",181,0) + Q +"RTN","BMXSQL7",182,0) + ; +"RTN","BMXSQL7",183,0) +TMPLATE ; +"RTN","BMXSQL7",184,0) + N BMXTNUM,BMXTNOD +"RTN","BMXSQL7",185,0) + I BMXTMP["[" S BMXTMP=$P(BMXTMP,"[",2),BMXTMP=$P(BMXTMP,"]") +"RTN","BMXSQL7",186,0) + S BMXTMP=$TR(BMXTMP,"_"," ") +"RTN","BMXSQL7",187,0) + ;Test template validity +"RTN","BMXSQL7",188,0) + I '$D(^DIBT("B",BMXTMP)) S BMXERR="TEMPLATE NOT FOUND" D ERROR Q +"RTN","BMXSQL7",189,0) + S BMXTNUM=$O(^DIBT("B",BMXTMP,0)) +"RTN","BMXSQL7",190,0) + I '$D(^DIBT(BMXTNUM,0)) S BMXERR="TEMPLATE NOT FOUND" D ERROR Q +"RTN","BMXSQL7",191,0) + S BMXTNOD=^DIBT(BMXTNUM,0) +"RTN","BMXSQL7",192,0) + I $P(BMXTNOD,U,4)'=$P(BMXFF(C),U,5) S BMXERR="TEMPLATE DOES NOT MATCH FILE" D ERROR Q +"RTN","BMXSQL7",193,0) + I '$D(^DIBT(BMXTNUM,1)) S BMXERR="TEMPLATE HAS NO ENTRIES" D ERROR Q +"RTN","BMXSQL7",194,0) + S BMXFF(C,0)="IEN",BMXFF(C,"IEN")="TEMPLATE",BMXFF(C,"TYPE")="IEN" +"RTN","BMXSQL7",195,0) + S $P(BMXFF(C),U,4)=BMXTMP +"RTN","BMXSQL7",196,0) + ; +"RTN","BMXSQL7",197,0) + Q +"RTN","BMXSQL7",198,0) + ; +"RTN","BMXSQL7",199,0) +OTM ;One-To-Many +"RTN","BMXSQL7",200,0) + N BMXUPFN,BMXSUBFN,BMXA,BMXB,BMXSUBFLD,BMXFNAM +"RTN","BMXSQL7",201,0) + I BMXTMP["INTERNAL[" S BMXTMP=$P(BMXTMP,"INTERNAL[",2),BMXTMP=$P(BMXTMP,"]") +"RTN","BMXSQL7",202,0) + S BMXUPFN=BMXFO(1) +"RTN","BMXSQL7",203,0) + S BMXA=$TR($P(BMXTMP,"."),"_"," ") +"RTN","BMXSQL7",204,0) + S BMXB=$TR($P(BMXTMP,".",2),"_"," ") +"RTN","BMXSQL7",205,0) + S BMXFNAM=BMXB ;Required by SETMFL. Won't work if filename BMXB [ "." +"RTN","BMXSQL7",206,0) + ;Get the subfile +"RTN","BMXSQL7",207,0) + I '$D(BMXF(BMXA)) S BMXERR="Related File Not Found" Q +"RTN","BMXSQL7",208,0) + S BMXSUBFN=BMXF(BMXA) +"RTN","BMXSQL7",209,0) + I '$D(^DD(BMXSUBFN,0)) S BMXERR="Related file not found" Q +"RTN","BMXSQL7",210,0) + ;Get the field that points to the main file +"RTN","BMXSQL7",211,0) + I '$D(^DD(BMXSUBFN,"B",BMXB)) S BMXERR="Related field not found" Q +"RTN","BMXSQL7",212,0) + S BMXSUBFLD=$O(^DD(BMXSUBFN,"B",BMXB,0)) +"RTN","BMXSQL7",213,0) + I '+BMXSUBFLD S BMXERR="Related field not found" Q +"RTN","BMXSQL7",214,0) + ; +"RTN","BMXSQL7",215,0) + ;Find a normal index on that field +"RTN","BMXSQL7",216,0) + ;Set up for call to CHKCR^BMXSQL7 +"RTN","BMXSQL7",217,0) + N BMXEXEC +"RTN","BMXSQL7",218,0) + I '$$CHKCR^BMXSQL7(BMXSUBFN,BMXSUBFLD,.BMXEXEC) S BMXERR="Related File not indexed" Q +"RTN","BMXSQL7",219,0) + ; +"RTN","BMXSQL7",220,0) + ; +"RTN","BMXSQL7",221,0) + S BMXFF(C,"JOIN")="One-to-many Join" +"RTN","BMXSQL7",222,0) + ; +"RTN","BMXSQL7",223,0) + ;Call SETMFL^BMXSQL5 to set up the iteration code +"RTN","BMXSQL7",224,0) + D SETMFL^BMXSQL5(BMXUPFN,BMXSUBFN,BMXEXEC,1,1) +"RTN","BMXSQL7",225,0) + ; +"RTN","BMXSQL7",226,0) + ; +"RTN","BMXSQL7",227,0) + ;Upfile is the mainfile, Subfile is the related file +"RTN","BMXSQL7",228,0) + ;BMXOFF is 1 but What is BMXGL? +"RTN","BMXSQL7",229,0) + ; +"RTN","BMXSQL7",230,0) + Q +"RTN","BMXSQL7",231,0) + ; +"RTN","BMXSQL7",232,0) +ERROR Q +"RTN","BMXSQL91") +0^105^B25109398 +"RTN","BMXSQL91",1,0) +BMXSQL91 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; +"RTN","BMXSQL91",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXSQL91",3,0) + ; +"RTN","BMXSQL91",4,0) + ;Below is dead code, but keep for later +"RTN","BMXSQL91",5,0) +SETX2 ;Don't need this unless porting to machine with +"RTN","BMXSQL91",6,0) + ;local variable size limitations +"RTN","BMXSQL91",7,0) + N F,LVL,ROOT,START +"RTN","BMXSQL91",8,0) + S LVL=1,START=1 +"RTN","BMXSQL91",9,0) + S ROOT="BMXY" +"RTN","BMXSQL91",10,0) + F F=1:1:BMXFF D Q:$D(BMXERR) +"RTN","BMXSQL91",11,0) + . S BMX=BMXFF(F) +"RTN","BMXSQL91",12,0) + . I BMX="(" D Q ;Increment level +"RTN","BMXSQL91",13,0) + . . S LVL=LVL+1 +"RTN","BMXSQL91",14,0) + . . ;S ROOT=$S(ROOT["(":$P(ROOT,")")_","_0_")",1:ROOT_"("_0_")") +"RTN","BMXSQL91",15,0) + . . ;Get operator following close paren corresponding to this open +"RTN","BMXSQL91",16,0) + . . ;If op = OR then set up FOR loop in zeroeth node +"RTN","BMXSQL91",17,0) + . . ;if op = AND then set up +"RTN","BMXSQL91",18,0) + . I BMX=")" D Q ;Decrement level +"RTN","BMXSQL91",19,0) + . . S LVL=LVL-1 +"RTN","BMXSQL91",20,0) + . . I LVL=1,$D(BMXFF(F+1)),BMXFF(F+1)="&" D Q +"RTN","BMXSQL91",21,0) + . . . S BMXX=BMXX+1 +"RTN","BMXSQL91",22,0) + . . . S BMXX(BMXX)="" +"RTN","BMXSQL91",23,0) + . . . F J=START:1:F S BMXX(BMXX)=BMXX(BMXX)_BMXFF(J) +"RTN","BMXSQL91",24,0) + . . . S START=F+2 +"RTN","BMXSQL91",25,0) + . . . ;S BMXX(BMXX)="I "_BMXX(BMXX)_" X BMXX("_BMXX+1_")" +"RTN","BMXSQL91",26,0) + . I BMX="AND" D Q ;Chain to previous expression at current level +"RTN","BMXSQL91",27,0) + . I BMX="OR" D Q ;Create FOR-loop to execute screens +"RTN","BMXSQL91",28,0) + ; +"RTN","BMXSQL91",29,0) + Q +"RTN","BMXSQL91",30,0) + ; +"RTN","BMXSQL91",31,0) + ; +"RTN","BMXSQL91",32,0) + ;S F=0 F S F=$O(BMXMFL(F)) Q:'+F S:'$D(BMXMFL(F,"SUBFILE")) BMXMFL("NOSUBFILE",F)="" +"RTN","BMXSQL91",33,0) + ;I $D(BMXMFL("NOSUBFILE")) S F=0 F S F=$O(BMXMFL("NOSUBFILE",F)) Q:'+F D MAKEC1 +"RTN","BMXSQL91",34,0) + ;I $D(BMXMFL("SUBFILE")) S F=0 F S F=$O(BMXMFL("SUBFILE",F)) Q:'+F D MAKEC1 ;S BMXROOTZ=BMXZ+100 +"RTN","BMXSQL91",35,0) + ; +"RTN","BMXSQL91",36,0) + Q +"RTN","BMXSQL91",37,0) +MAKEC1 ; +"RTN","BMXSQL91",38,0) + I '$D(BMXMFL(F,"SUBFILE")),'$D(BMXMFL(F,"MULT")) S BMXZ=BMXZ+100,BMXCFN(BMXCID,BMXZ,F)="" Q +"RTN","BMXSQL91",39,0) + Q:'$D(BMXMFL(F,"SUBFILE")) +"RTN","BMXSQL91",40,0) + Q:$D(BMXMFL(F,"MULT")) +"RTN","BMXSQL91",41,0) + S BMXROOT=F +"RTN","BMXSQL91",42,0) + S BMXROOTZ=BMXZ+100 +"RTN","BMXSQL91",43,0) + S BMXROOTC=BMXCID +"RTN","BMXSQL91",44,0) + D MCNT(F) +"RTN","BMXSQL91",45,0) + Q +"RTN","BMXSQL91",46,0) + ; +"RTN","BMXSQL91",47,0) +MCNT(F) ; +"RTN","BMXSQL91",48,0) + N S +"RTN","BMXSQL91",49,0) + ;B ;MCNT +"RTN","BMXSQL91",50,0) + I '$D(BMXMFL(F,"SUBFILE")) D MCNT2 Q +"RTN","BMXSQL91",51,0) + S S=0 F S S=$O(BMXMFL(F,"SUBFILE",S)) Q:'+S S:'$D(BMXCFN(BMXCID,BMXZ,F)) BMXZ=BMXZ+100,BMXCFN(BMXCID,BMXZ,F)="" S BMXZ=BMXZ+100,BMXCFN(BMXCID,BMXZ,S)="",BMXCFNX(S,F)="" D MCNT(S) +"RTN","BMXSQL91",52,0) + Q +"RTN","BMXSQL91",53,0) + ; +"RTN","BMXSQL91",54,0) +MCNT2 ; +"RTN","BMXSQL91",55,0) + ;B ;Back-chain +"RTN","BMXSQL91",56,0) + ;TODO: RESTART HERE -- $O(BMXCFN(BMXCID,0)) NEEDS TO BE CHANGED TO SOMETHING BESIDES 0 +"RTN","BMXSQL91",57,0) + N BMXFTOP,BMXFBACK +"RTN","BMXSQL91",58,0) + F S BMXFTOP=$O(BMXCFN(BMXROOTC,BMXROOTZ,0)) Q:BMXFTOP=BMXROOT S BMXFBACK=$O(BMXCFNX(BMXFTOP,0)) S BMXROOTZ=BMXROOTZ-1,BMXCFN(BMXCID,BMXROOTZ,BMXFBACK)="" +"RTN","BMXSQL91",59,0) + S BMXCID=BMXCID+1,BMXROOTC=BMXCID +"RTN","BMXSQL91",60,0) + ;Get the root files +"RTN","BMXSQL91",61,0) + I $D(BMXMFL("NOSUBFILE")) D +"RTN","BMXSQL91",62,0) + . N F +"RTN","BMXSQL91",63,0) + . S F=0 F S F=$O(BMXMFL("NOSUBFILE",F)) Q:'+F D +"RTN","BMXSQL91",64,0) + . . Q:$D(BMXMFL(F,"MULT")) +"RTN","BMXSQL91",65,0) + . . Q:F=BMXROOT +"RTN","BMXSQL91",66,0) + . . S BMXZ=BMXZ+100 +"RTN","BMXSQL91",67,0) + . . S BMXCFN(BMXCID,BMXZ,F)="" +"RTN","BMXSQL91",68,0) + S BMXROOTZ=BMXZ+100 +"RTN","BMXSQL91",69,0) + Q +"RTN","BMXSQL91",70,0) + ; +"RTN","BMXSQL91",71,0) + ; +"RTN","BMXSQL91",72,0) +ITER ;Iterate through result array A +"RTN","BMXSQL91",73,0) + S BMXCNT=BMXFLDO ;Field count +"RTN","BMXSQL91",74,0) + S F=0 +"RTN","BMXSQL91",75,0) + S:BMXNUM ^BMXTEMP($J,I)=IEN0_"^" +"RTN","BMXSQL91",76,0) + S BMXCNTB=0 +"RTN","BMXSQL91",77,0) + S BMXORD=BMXNUM +"RTN","BMXSQL91",78,0) + N BMXONOD +"RTN","BMXSQL91",79,0) + N BMXINT +"RTN","BMXSQL91",80,0) + ;B ;WRITE Before REORG +"RTN","BMXSQL91",81,0) + N M,N S N=0 +"RTN","BMXSQL91",82,0) + D REORG +"RTN","BMXSQL91",83,0) + ;B ;WRITE After REORG +"RTN","BMXSQL91",84,0) + F S N=$O(M(N)) Q:'+N D +"RTN","BMXSQL91",85,0) + . S O=0 +"RTN","BMXSQL91",86,0) + . F O=1:1:$L(M(N),U) S BMXFLDO(O-1,"IEN0")=$P(M(N),U,O) +"RTN","BMXSQL91",87,0) + . S BMXORD=BMXNUM +"RTN","BMXSQL91",88,0) + . D OA +"RTN","BMXSQL91",89,0) + Q +"RTN","BMXSQL91",90,0) + ; +"RTN","BMXSQL91",91,0) +REORG N R,IEN,J,CONT,TEST +"RTN","BMXSQL91",92,0) + F R=0:1:BMXFLDO-1 S IEN(R)=0 +"RTN","BMXSQL91",93,0) + F J=1:1 D Q:'CONT +"RTN","BMXSQL91",94,0) + . S CONT=0 +"RTN","BMXSQL91",95,0) + . F R=1:1:BMXFLDO D +"RTN","BMXSQL91",96,0) + . . S TEST=$O(A(+BMXFLDO(R-1),IEN(R-1))) +"RTN","BMXSQL91",97,0) + . . I +TEST S IEN(R-1)=TEST,CONT=1 +"RTN","BMXSQL91",98,0) + . . S $P(M(J),U,R)=IEN(R-1) +"RTN","BMXSQL91",99,0) + . Q +"RTN","BMXSQL91",100,0) + I M(J)=M(J-1) K M(J) +"RTN","BMXSQL91",101,0) + Q +"RTN","BMXSQL91",102,0) + ; +"RTN","BMXSQL91",103,0) + ; +"RTN","BMXSQL91",104,0) +OA ; +"RTN","BMXSQL91",105,0) + I $D(A) F R=0:1:(BMXFLDO-1) S F=$P(BMXFLDO(R),U,2),BMXFN=$P(BMXFLDO(R),U),BMXINT=$P(BMXFLDO(R),U,3) D S:(R+1)BMXLEN(BMXORD) BMXLEN(BMXORD)=BMXLTMP +"RTN","BMXSQL91",121,0) + . . . Q +"RTN","BMXSQL91",122,0) + . . D ;It's a multiple. Implement in next phase +"RTN","BMXSQL91",123,0) + . . . ;S BMXMCT=BMXMCT+1 +"RTN","BMXSQL91",124,0) + . . . ;S BMXMCT(BMXMCT)=BMXFN_U_F +"RTN","BMXSQL91",125,0) + . . . Q ;Process A( for multiple field +"RTN","BMXSQL91",126,0) + . . Q +"RTN","BMXSQL91",127,0) + . E D ;Not a multiple +"RTN","BMXSQL91",128,0) + . . S I=I+1 +"RTN","BMXSQL91",129,0) + . . I $G(BMXTK("DISTINCT"))="TRUE" D Q +"RTN","BMXSQL91",130,0) + . . . Q:A(BMXFN,IEN0,F,BMXINT)="" +"RTN","BMXSQL91",131,0) + . . . I $D(^BMXTMPD($J,A(BMXFN,IEN0,F,BMXINT))) Q +"RTN","BMXSQL91",132,0) + . . . S ^BMXTMPD($J,A(BMXFN,IEN0,F,BMXINT))="" +"RTN","BMXSQL91",133,0) + . . . S ^BMXTEMP($J,I)=A(BMXFN,IEN0,F,BMXINT) +"RTN","BMXSQL91",134,0) + . . . S:$L(A(BMXFN,IEN0,F,BMXINT))>BMXLEN(BMXORD) BMXLEN(BMXORD)=$L(A(BMXFN,IEN0,F,BMXINT)) +"RTN","BMXSQL91",135,0) + . . . Q +"RTN","BMXSQL91",136,0) + . . S ^BMXTEMP($J,I)=A(BMXFN,IEN0,F,BMXINT) +"RTN","BMXSQL91",137,0) + . . S:$L(A(BMXFN,IEN0,F,BMXINT))>BMXLEN(BMXORD) BMXLEN(BMXORD)=$L(A(BMXFN,IEN0,F,BMXINT)) +"RTN","BMXSQL91",138,0) + . Q +"RTN","BMXSQL91",139,0) + ;---> Set data in result global. +"RTN","BMXSQL91",140,0) + I $D(^BMXTEMP($J,I)) S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_$C(30) +"RTN","BMXSQL91",141,0) +ZZZ Q +"RTN","BMXTABLE") +0^106^B130270 +"RTN","BMXTABLE",1,0) +BMXTABLE ; IHS/OIT/HMW - BMX RETURN ENTIRE TABLE ; +"RTN","BMXTABLE",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXTABLE",3,0) + ; +"RTN","BMXTABLE",4,0) +TABLE(BMXGBL,BMXFL,BMXMX) ;EP +"RTN","BMXTABLE",5,0) + ; +"RTN","BMXTABLE",6,0) + D FIND^BMXFIND(.BMXGBL,BMXFL,"*",,,BMXMX,,,,1) +"RTN","BMXTABLE",7,0) + Q +"RTN","BMXTRS") +0^107^B1202427 +"RTN","BMXTRS",1,0) +BMXTRS ; IHS/OIT/HMW - UPPERCASE-LOWERCASE ; +"RTN","BMXTRS",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXTRS",3,0) + ; +"RTN","BMXTRS",4,0) +T(X) ;EP +"RTN","BMXTRS",5,0) + ;---> Translate word to mixed case. +"RTN","BMXTRS",6,0) + ; +"RTN","BMXTRS",7,0) + N BMXWORD,I +"RTN","BMXTRS",8,0) + I '$D(X) Q "" +"RTN","BMXTRS",9,0) + I X="^" Q X +"RTN","BMXTRS",10,0) + I X=" " Q X +"RTN","BMXTRS",11,0) + ;-----> REMOVE LEADING INAPPROPRIATE CHARACTERS IF PRESENT. +"RTN","BMXTRS",12,0) + F Q:$E(X)'?1P S X=$E(X,2,99) +"RTN","BMXTRS",13,0) + ;-----> CHANGE FIRST LETTER TO UPPERCASE: +"RTN","BMXTRS",14,0) + S BMXWORD=$E(X) +"RTN","BMXTRS",15,0) + I $E(BMXWORD)?1L S BMXWORD=$C($A($E(BMXWORD))-32) +"RTN","BMXTRS",16,0) + ;-----> DO NEXT CHARACTER +"RTN","BMXTRS",17,0) + F I=2:1:$L(X) D CHAR +"RTN","BMXTRS",18,0) + ;-----> REMOVE TRAILING SPACE OR QUOTE. +"RTN","BMXTRS",19,0) + F Q:""" "'[$E(BMXWORD,$L(BMXWORD)) D +"RTN","BMXTRS",20,0) + .S BMXWORD=$E(BMXWORD,1,($L(BMXWORD)-1)) +"RTN","BMXTRS",21,0) + ;-----> RESET X EQUAL TO RESULT +"RTN","BMXTRS",22,0) +EOJ ; +"RTN","BMXTRS",23,0) + Q BMXWORD +"RTN","BMXTRS",24,0) + ; +"RTN","BMXTRS",25,0) +CHAR ; +"RTN","BMXTRS",26,0) + ;-----> IF THE CHARACTER IS UPPERCASE AND PREVIOUS CHARACTER IS NOT +"RTN","BMXTRS",27,0) + ;-----> PUNCTUATION (EXCEPT FOR AN APOSTROPHY) OR A SPACE, +"RTN","BMXTRS",28,0) + ;-----> THEN CHANGE CHARACTER TO LOWERCASE: +"RTN","BMXTRS",29,0) + I ($E(X,I)?1U)&(($E(X,I-1)'?1P)!($E(X,I-1)="'")) D Q +"RTN","BMXTRS",30,0) + .S BMXWORD=BMXWORD_$C($A($E(X,I))+32) +"RTN","BMXTRS",31,0) + ; +"RTN","BMXTRS",32,0) + ;-----> IF THE CHARACTER IS LOWERCASE AND PREVIOUS CHARACTER IS +"RTN","BMXTRS",33,0) + ;-----> PUNCTUATION (BUT NOT AN APOSTROPHY) OR A SPACE, THEN CHANGE +"RTN","BMXTRS",34,0) + ;-----> CHARACTER TO UPPERCASE: +"RTN","BMXTRS",35,0) + I $E(X,I)?1L,$E(X,I-1)?1P,$E(X,I-1)'="'" D Q +"RTN","BMXTRS",36,0) + .S BMXWORD=BMXWORD_$C($A($E(X,I))-32) +"RTN","BMXTRS",37,0) + ; +"RTN","BMXTRS",38,0) + ;-----> ADD CHARACTER TO BMXWORD STRING WITHOUT MODIFICATION. +"RTN","BMXTRS",39,0) + ;-----> "\" PLACED BEFORE A LETTER FORCES IT TO BE UPPERCASE; +"RTN","BMXTRS",40,0) + ;-----> HERE REMOVE ANY "\"'s. +"RTN","BMXTRS",41,0) + I $E(X,I)'="\" S BMXWORD=BMXWORD_$E(X,I) +"RTN","BMXTRS",42,0) + Q +"RTN","BMXUTL1") +0^108^B39816098 +"RTN","BMXUTL1",1,0) +BMXUTL1 ; IHS/OIT/HMW - UTIL: PATIENT DEMOGRAPHICS ; +"RTN","BMXUTL1",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXUTL1",3,0) + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * +"RTN","BMXUTL1",4,0) + ;; UTILITY: PATIENT DEMOGRAPHICS. +"RTN","BMXUTL1",5,0) + ; +"RTN","BMXUTL1",6,0) + ; +"RTN","BMXUTL1",7,0) + ;---------- +"RTN","BMXUTL1",8,0) +NAME(DFN,ORDER) ;EP +"RTN","BMXUTL1",9,0) + ;---> Return text of Patient Name. +"RTN","BMXUTL1",10,0) + ;---> Parameters: +"RTN","BMXUTL1",11,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",12,0) + ; 2 - ORDER (opt) ""/0=Last,First 2=First Only +"RTN","BMXUTL1",13,0) + ; 1=First Last 3=Last Only +"RTN","BMXUTL1",14,0) + ; +"RTN","BMXUTL1",15,0) + Q:'$G(DFN) "NO PATIENT" +"RTN","BMXUTL1",16,0) + Q:'$D(^DPT(DFN,0)) "Unknown" +"RTN","BMXUTL1",17,0) + N X S X=$P(^DPT(DFN,0),U) +"RTN","BMXUTL1",18,0) + Q:'$G(ORDER) X +"RTN","BMXUTL1",19,0) + S X=$$FL(X) +"RTN","BMXUTL1",20,0) + Q:ORDER=1 X +"RTN","BMXUTL1",21,0) + Q:ORDER=2 $P(X," ") +"RTN","BMXUTL1",22,0) + Q:ORDER=3 $P(X," ",2) +"RTN","BMXUTL1",23,0) + Q "UNKNOWN ORDER" +"RTN","BMXUTL1",24,0) + ; +"RTN","BMXUTL1",25,0) + ; +"RTN","BMXUTL1",26,0) + ;---------- +"RTN","BMXUTL1",27,0) +FL(X) ;EP +"RTN","BMXUTL1",28,0) + ;---> Switch First and Last Names. +"RTN","BMXUTL1",29,0) + Q $P($P(X,",",2)," ")_" "_$P(X,",") +"RTN","BMXUTL1",30,0) + ; +"RTN","BMXUTL1",31,0) + ; +"RTN","BMXUTL1",32,0) + ;---------- +"RTN","BMXUTL1",33,0) +DOB(DFN) ;EP +"RTN","BMXUTL1",34,0) + ;---> Return Patient's Date of Birth in Fileman format. +"RTN","BMXUTL1",35,0) + ;---> Parameters: +"RTN","BMXUTL1",36,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",37,0) + ; +"RTN","BMXUTL1",38,0) + Q:'$G(DFN) "NO PATIENT" +"RTN","BMXUTL1",39,0) + Q:'$P($G(^DPT(DFN,0)),U,3) "NOT ENTERED" +"RTN","BMXUTL1",40,0) + Q $P(^DPT(DFN,0),U,3) +"RTN","BMXUTL1",41,0) + ; +"RTN","BMXUTL1",42,0) + ; +"RTN","BMXUTL1",43,0) + ;---------- +"RTN","BMXUTL1",44,0) +DOBF(DFN,BMXDT,BMXNOA) ;EP +"RTN","BMXUTL1",45,0) + ;---> Date of Birth formatted "09-Sep-1994 (35 Months)" +"RTN","BMXUTL1",46,0) + ;---> Parameters: +"RTN","BMXUTL1",47,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",48,0) + ; 2 - BMXDT (opt) Date on which Age should be calculated. +"RTN","BMXUTL1",49,0) + ; 3 - BMXNOA (opt) 1=No age (don't append age). +"RTN","BMXUTL1",50,0) + ; +"RTN","BMXUTL1",51,0) + N X,Y +"RTN","BMXUTL1",52,0) + S X=$$DOB($G(DFN)) +"RTN","BMXUTL1",53,0) + Q:'X X +"RTN","BMXUTL1",54,0) + S X=$$TXDT1^BMXUTL5(X) +"RTN","BMXUTL1",55,0) + Q:$G(BMXNOA) X +"RTN","BMXUTL1",56,0) + S Y=$$AGEF(DFN,$G(BMXDT)) +"RTN","BMXUTL1",57,0) + S:Y["DECEASED" Y="DECEASED" +"RTN","BMXUTL1",58,0) + S X=X_" ("_Y_")" +"RTN","BMXUTL1",59,0) + Q X +"RTN","BMXUTL1",60,0) + ; +"RTN","BMXUTL1",61,0) + ; +"RTN","BMXUTL1",62,0) + ;---------- +"RTN","BMXUTL1",63,0) +AGE(DFN,BMXZ,BMXDT) ;EP +"RTN","BMXUTL1",64,0) + ;---> Return Patient's Age. +"RTN","BMXUTL1",65,0) + ;---> Parameters: +"RTN","BMXUTL1",66,0) + ; 1 - DFN (req) IEN in PATIENT File. +"RTN","BMXUTL1",67,0) + ; 2 - BMXZ (opt) BMXZ=1,2,3 1=years, 2=months, 3=days. +"RTN","BMXUTL1",68,0) + ; 2 will be assumed if not passed. +"RTN","BMXUTL1",69,0) + ; 3 - BMXDT (opt) Date on which Age should be calculated. +"RTN","BMXUTL1",70,0) + ; +"RTN","BMXUTL1",71,0) + N BMXDOB,X,X1,X2 S:$G(BMXZ)="" BMXZ=2 +"RTN","BMXUTL1",72,0) + Q:'$G(DFN) "NO PATIENT" +"RTN","BMXUTL1",73,0) + S BMXDOB=$$DOB(DFN) +"RTN","BMXUTL1",74,0) + Q:'BMXDOB "Unknown" +"RTN","BMXUTL1",75,0) + I '$G(BMXDT)&($$DECEASED(DFN)) D Q X +"RTN","BMXUTL1",76,0) + .S X="DECEASED: "_$$TXDT1^BMXUTL5(+^DPT(DFN,.35)) +"RTN","BMXUTL1",77,0) + S:'$G(DT) DT=$$DT^XLFDT +"RTN","BMXUTL1",78,0) + S:'$G(BMXDT) BMXDT=DT +"RTN","BMXUTL1",79,0) + Q:BMXDT Age in Years. +"RTN","BMXUTL1",82,0) + N BMXAGEY,BMXAGEM,BMXD1,BMXD2,BMXM1,BMXM2,BMXY1,BMXY2 +"RTN","BMXUTL1",83,0) + S BMXM1=$E(BMXDOB,4,7),BMXM2=$E(BMXDT,4,7) +"RTN","BMXUTL1",84,0) + S BMXY1=$E(BMXDOB,1,3),BMXY2=$E(BMXDT,1,3) +"RTN","BMXUTL1",85,0) + S BMXAGEY=BMXY2-BMXY1 S:BMXM2 Age in Months. +"RTN","BMXUTL1",90,0) + S BMXD1=$E(BMXM1,3,4),BMXM1=$E(BMXM1,1,2) +"RTN","BMXUTL1",91,0) + S BMXD2=$E(BMXM2,3,4),BMXM2=$E(BMXM2,1,2) +"RTN","BMXUTL1",92,0) + S BMXAGEM=12*BMXAGEY +"RTN","BMXUTL1",93,0) + I BMXM2=BMXM1&(BMXD2BMXM1 S BMXAGEM=BMXAGEM+BMXM2-BMXM1 +"RTN","BMXUTL1",95,0) + I BMXM2 Age in Days. +"RTN","BMXUTL1",100,0) + S X1=BMXDT,X2=BMXDOB +"RTN","BMXUTL1",101,0) + D ^%DTC +"RTN","BMXUTL1",102,0) + Q X +"RTN","BMXUTL1",103,0) + ; +"RTN","BMXUTL1",104,0) + ; +"RTN","BMXUTL1",105,0) + ;---------- +"RTN","BMXUTL1",106,0) +AGEF(DFN,BMXDT) ;EP +"RTN","BMXUTL1",107,0) + ;---> Age formatted "35 Months" or "23 Years" +"RTN","BMXUTL1",108,0) + ;---> Parameters: +"RTN","BMXUTL1",109,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",110,0) + ; 2 - BMXDT (opt) Date on which Age should be calculated. +"RTN","BMXUTL1",111,0) + ; +"RTN","BMXUTL1",112,0) + N Y +"RTN","BMXUTL1",113,0) + S Y=$$AGE(DFN,2,$G(BMXDT)) +"RTN","BMXUTL1",114,0) + Q:Y["DECEASED" Y +"RTN","BMXUTL1",115,0) + Q:Y["NOT BORN" Y +"RTN","BMXUTL1",116,0) + ; +"RTN","BMXUTL1",117,0) + ;---> If over 60 months, return years. +"RTN","BMXUTL1",118,0) + Q:Y>60 $$AGE(DFN,1,$G(BMXDT))_" years" +"RTN","BMXUTL1",119,0) + ; +"RTN","BMXUTL1",120,0) + ;---> If under 1 month return days. +"RTN","BMXUTL1",121,0) + I Y<1 S Y=$$AGE(DFN,3,$G(BMXDT)) Q Y_$S(Y=1:" day",1:" days") +"RTN","BMXUTL1",122,0) + ; +"RTN","BMXUTL1",123,0) + ;---> Return months +"RTN","BMXUTL1",124,0) + Q Y_$S(Y=1:" month",1:" months") +"RTN","BMXUTL1",125,0) + ; +"RTN","BMXUTL1",126,0) + ; +"RTN","BMXUTL1",127,0) + ;---------- +"RTN","BMXUTL1",128,0) +DECEASED(DFN,BMXDT) ;EP +"RTN","BMXUTL1",129,0) + ;---> Return 1 if patient is deceased, 0 if not deceased. +"RTN","BMXUTL1",130,0) + ;---> Parameters: +"RTN","BMXUTL1",131,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",132,0) + ; 2 - BMXDT (opt) If BMXDT=1 return Date of Death (Fileman format). +"RTN","BMXUTL1",133,0) + ; +"RTN","BMXUTL1",134,0) + Q:'$G(DFN) 0 +"RTN","BMXUTL1",135,0) + N X S X=+$G(^DPT(DFN,.35)) +"RTN","BMXUTL1",136,0) + Q:'X 0 +"RTN","BMXUTL1",137,0) + Q:'$G(BMXDT) 1 +"RTN","BMXUTL1",138,0) + Q X +"RTN","BMXUTL1",139,0) + ; +"RTN","BMXUTL1",140,0) + ; +"RTN","BMXUTL1",141,0) + ;---------- +"RTN","BMXUTL1",142,0) +SEX(DFN,PRON) ;EP +"RTN","BMXUTL1",143,0) + ;---> Return "F" is patient is female, "M" if male. +"RTN","BMXUTL1",144,0) + ;---> Parameters: +"RTN","BMXUTL1",145,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",146,0) + ; 2 - PRON (opt) Pronoun: 1=he/she, 2=him/her,3=his,her +"RTN","BMXUTL1",147,0) + ; +"RTN","BMXUTL1",148,0) + Q:'$G(DFN) "" +"RTN","BMXUTL1",149,0) + Q:'$D(^DPT(DFN,0)) "" +"RTN","BMXUTL1",150,0) + N X S X=$P(^DPT(DFN,0),U,2) +"RTN","BMXUTL1",151,0) + Q:'$G(PRON) X +"RTN","BMXUTL1",152,0) + I PRON=1 Q $S(X="F":"she",1:"he") +"RTN","BMXUTL1",153,0) + I PRON=2 Q $S(X="F":"her",1:"him") +"RTN","BMXUTL1",154,0) + I PRON=3 Q $S(X="F":"her",1:"his") +"RTN","BMXUTL1",155,0) + Q X +"RTN","BMXUTL1",156,0) + ; +"RTN","BMXUTL1",157,0) + ; +"RTN","BMXUTL1",158,0) + ;---------- +"RTN","BMXUTL1",159,0) +SEXW(DFN) ;EP +"RTN","BMXUTL1",160,0) + ;---> Return Patient sex: "Female"/"Male". +"RTN","BMXUTL1",161,0) + ;---> Parameters: +"RTN","BMXUTL1",162,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",163,0) + ; +"RTN","BMXUTL1",164,0) + Q:$$SEX(DFN)="M" "Male" +"RTN","BMXUTL1",165,0) + Q:$$SEX(DFN)="F" "Female" +"RTN","BMXUTL1",166,0) + Q "Unknown" +"RTN","BMXUTL1",167,0) + ; +"RTN","BMXUTL1",168,0) + ; +"RTN","BMXUTL1",169,0) + ;---------- +"RTN","BMXUTL1",170,0) +NAMAGE(DFN) ;EP +"RTN","BMXUTL1",171,0) + ;---> Return Patient Name concatenated with age. +"RTN","BMXUTL1",172,0) + ;---> Parameters: +"RTN","BMXUTL1",173,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",174,0) + ; +"RTN","BMXUTL1",175,0) + Q:'$G(DFN) "NO PATIENT" +"RTN","BMXUTL1",176,0) + Q $$NAME(DFN)_" ("_$$AGE(DFN)_"y/o)" +"RTN","BMXUTL1",177,0) + ; +"RTN","BMXUTL1",178,0) + ; +"RTN","BMXUTL1",179,0) + ;---------- +"RTN","BMXUTL1",180,0) +SSN(DFN) ;EP +"RTN","BMXUTL1",181,0) + ;---> Return Social Security Number (SSN). +"RTN","BMXUTL1",182,0) + ;---> Parameters: +"RTN","BMXUTL1",183,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",184,0) + N X +"RTN","BMXUTL1",185,0) + Q:'$G(DFN) "NO PATIENT" +"RTN","BMXUTL1",186,0) + Q:'$D(^DPT(DFN,0)) "Unknown" +"RTN","BMXUTL1",187,0) + S X=$P(^DPT(DFN,0),U,9) +"RTN","BMXUTL1",188,0) + Q:X']"" "Unknown" +"RTN","BMXUTL1",189,0) + Q X +"RTN","BMXUTL1",190,0) + ; +"RTN","BMXUTL1",191,0) + ; +"RTN","BMXUTL1",192,0) + ;---------- +"RTN","BMXUTL1",193,0) +HRCN(DFN,DUZ2,AGD) ;EP +"RTN","BMXUTL1",194,0) + ;---> Return IHS Health Record Number. +"RTN","BMXUTL1",195,0) + ;---> Parameters: +"RTN","BMXUTL1",196,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",197,0) + ; 2 - DUZ2 (opt) User's Site/Location IEN. If no DUZ2 +"RTN","BMXUTL1",198,0) + ; provided, function will look for DUZ(2). +"RTN","BMXUTL1",199,0) + ; 3 - AGD (opt) If AGD=1 return HRCN with no dashes. +"RTN","BMXUTL1",200,0) + ; +"RTN","BMXUTL1",201,0) + ; +"RTN","BMXUTL1",202,0) + S:'$G(DUZ2) DUZ2=$G(DUZ(2)) +"RTN","BMXUTL1",203,0) + Q:'$G(DFN)!('$G(DUZ2)) "Unknown1" +"RTN","BMXUTL1",204,0) + Q:'$D(^AUPNPAT(DFN,41,DUZ2,0)) "Unknown2" +"RTN","BMXUTL1",205,0) + Q:'+$P(^AUPNPAT(DFN,41,DUZ2,0),"^",2) "Unknown3" +"RTN","BMXUTL1",206,0) + N Y S Y=$P(^AUPNPAT(DFN,41,DUZ2,0),"^",2) +"RTN","BMXUTL1",207,0) + Q:$G(AGD) Y +"RTN","BMXUTL1",208,0) + Q:'+Y Y +"RTN","BMXUTL1",209,0) + I $L(Y)=7 D Q Y +"RTN","BMXUTL1",210,0) + .S Y=$TR("123-45-67",1234567,Y) +"RTN","BMXUTL1",211,0) + S Y=$E("00000",0,6-$L(Y))_Y +"RTN","BMXUTL1",212,0) + S Y=$TR("12-34-56",123456,Y) +"RTN","BMXUTL1",213,0) + Q Y +"RTN","BMXUTL1",214,0) + ; +"RTN","BMXUTL1",215,0) + ; +"RTN","BMXUTL1",216,0) + ;---------- +"RTN","BMXUTL1",217,0) +PHONE(AGDFN,AGOFF) ;EP +"RTN","BMXUTL1",218,0) + ;---> Return patient's home phone number. +"RTN","BMXUTL1",219,0) + ;---> Parameters: +"RTN","BMXUTL1",220,0) + ; 1 - AGDFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",221,0) + ; 2 - AGOFF (opt) =1 will return Patient's Office Phone. +"RTN","BMXUTL1",222,0) + ; +"RTN","BMXUTL1",223,0) + Q:'$G(AGDFN) "Error: No DFN" +"RTN","BMXUTL1",224,0) + Q $P($G(^DPT(AGDFN,.13)),U,$S($G(AGOFF):2,1:1)) +"RTN","BMXUTL1",225,0) + ; +"RTN","BMXUTL1",226,0) + ; +"RTN","BMXUTL1",227,0) + ;---------- +"RTN","BMXUTL1",228,0) +STREET(DFN) ;EP +"RTN","BMXUTL1",229,0) + ;---> Return patient's street address. +"RTN","BMXUTL1",230,0) + ;---> Parameters: +"RTN","BMXUTL1",231,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",232,0) + ; +"RTN","BMXUTL1",233,0) + Q:'$G(DFN) "No Patient" +"RTN","BMXUTL1",234,0) + Q:'$D(^DPT(DFN,.11)) "" +"RTN","BMXUTL1",235,0) + Q:$P(^DPT(DFN,.11),U)="" "" +"RTN","BMXUTL1",236,0) + Q $P(^DPT(DFN,.11),U) +"RTN","BMXUTL1",237,0) + ; +"RTN","BMXUTL1",238,0) + ; +"RTN","BMXUTL1",239,0) + ;---------- +"RTN","BMXUTL1",240,0) +CITY(DFN) ;EP +"RTN","BMXUTL1",241,0) + ;---> Return patient's city. +"RTN","BMXUTL1",242,0) + ;---> Parameters: +"RTN","BMXUTL1",243,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",244,0) + ; +"RTN","BMXUTL1",245,0) + Q:'$G(DFN) "No Patient" +"RTN","BMXUTL1",246,0) + Q:'$D(^DPT(DFN,.11)) "" +"RTN","BMXUTL1",247,0) + Q:$P(^DPT(DFN,.11),U,4)="" "" +"RTN","BMXUTL1",248,0) + Q $P(^DPT(DFN,.11),U,4) +"RTN","BMXUTL1",249,0) + ; +"RTN","BMXUTL1",250,0) + ; +"RTN","BMXUTL1",251,0) + ;---------- +"RTN","BMXUTL1",252,0) +STATE(DFN,NOTEXT) ;EP +"RTN","BMXUTL1",253,0) + ;---> Return patient's state. +"RTN","BMXUTL1",254,0) + ;---> Parameters: +"RTN","BMXUTL1",255,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",256,0) + ; 2 - NOTEXT (opt) If NOTEXT=1 return only the State IEN. +"RTN","BMXUTL1",257,0) + ; If NOTEXT=2 return IEN|Text. +"RTN","BMXUTL1",258,0) + ; +"RTN","BMXUTL1",259,0) + Q:'$G(DFN) "" +"RTN","BMXUTL1",260,0) + N Y S Y=$P($G(^DPT(DFN,.11)),U,5) +"RTN","BMXUTL1",261,0) + Q:$G(NOTEXT)=1 Y +"RTN","BMXUTL1",262,0) + Q:$G(NOTEXT)=2 Y_"|"_$$GET^BMXG(1,Y) +"RTN","BMXUTL1",263,0) + Q $$GET^BMXG(1,Y) +"RTN","BMXUTL1",264,0) + ; +"RTN","BMXUTL1",265,0) + ; +"RTN","BMXUTL1",266,0) + ;---------- +"RTN","BMXUTL1",267,0) +ZIP(DFN) ;EP +"RTN","BMXUTL1",268,0) + ;---> Return patient's zipcode. +"RTN","BMXUTL1",269,0) + ;---> Parameters: +"RTN","BMXUTL1",270,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",271,0) + ; +"RTN","BMXUTL1",272,0) + Q:'$G(DFN) "No Patient" +"RTN","BMXUTL1",273,0) + Q:'$D(^DPT(DFN,.11)) "" +"RTN","BMXUTL1",274,0) + Q:$P(^DPT(DFN,.11),U,6)="" "" +"RTN","BMXUTL1",275,0) + Q $P(^DPT(DFN,.11),U,6) +"RTN","BMXUTL1",276,0) + ; +"RTN","BMXUTL1",277,0) + ; +"RTN","BMXUTL1",278,0) + ;---------- +"RTN","BMXUTL1",279,0) +CTYSTZ(DFN) ;EP +"RTN","BMXUTL1",280,0) + ;---> Return patient's city, state zip. +"RTN","BMXUTL1",281,0) + ;---> Parameters: +"RTN","BMXUTL1",282,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",283,0) + ; +"RTN","BMXUTL1",284,0) + Q:'$G(DFN) "No Patient" +"RTN","BMXUTL1",285,0) + Q $$CITY(DFN)_", "_$$STATE(DFN)_" "_$$ZIP(DFN) +"RTN","BMXUTL1",286,0) + ; +"RTN","BMXUTL1",287,0) + ; +"RTN","BMXUTL1",288,0) +CURCOM(DFN,NOTEXT) ;EP +"RTN","BMXUTL1",289,0) + ;---> Return patient's Current Community IEN or Text. +"RTN","BMXUTL1",290,0) + ;---> (Item 6 on page 1 of Registration). +"RTN","BMXUTL1",291,0) + ;---> Parameters: +"RTN","BMXUTL1",292,0) + ; 1 - DFN (req) Patient's IEN (DFN). +"RTN","BMXUTL1",293,0) + ; 2 - NOTEXT (opt) If NOTEXT=1 return only the Current Comm IEN. +"RTN","BMXUTL1",294,0) + ; If NOTEXT=2 return IEN|Text. +"RTN","BMXUTL1",295,0) + ; +"RTN","BMXUTL1",296,0) + Q:'$G(DFN) "No Patient" +"RTN","BMXUTL1",297,0) + Q:'$D(^AUPNPAT(DFN,11)) "" ;"Unknown1" +"RTN","BMXUTL1",298,0) + ; +"RTN","BMXUTL1",299,0) + N X,Y,Z +"RTN","BMXUTL1",300,0) + S X=^AUPNPAT(DFN,11) +"RTN","BMXUTL1",301,0) + ;---> Set Y=Pointer (IEN in ^AUTTCOM, piece 17), Z=Text (piece 18). +"RTN","BMXUTL1",302,0) + S Y=$P(X,U,17),Z=$P(X,U,18) +"RTN","BMXUTL1",303,0) + ;---> If both Pointer and Text are null, return "Unknown2". +"RTN","BMXUTL1",304,0) + Q:('Y&(Z="")) "" ;"Unknown2" +"RTN","BMXUTL1",305,0) + ; +"RTN","BMXUTL1",306,0) + ;---> If Y is null or a bad pointer, set Y="". +"RTN","BMXUTL1",307,0) + I Y<1!('$D(^AUTTCOM(+Y,0))) S Y="" +"RTN","BMXUTL1",308,0) + ; +"RTN","BMXUTL1",309,0) + ;---> If no valid pointer and if Text (pc 18) exists in the +"RTN","BMXUTL1",310,0) + ;---> Community file, then set Y=IEN in ^AUTTCOM(. +"RTN","BMXUTL1",311,0) + I Y<1,$D(^AUTTCOM("B",Z)) S Y=$O(^AUTTCOM("B",Z,0)) +"RTN","BMXUTL1",312,0) + ; +"RTN","BMXUTL1",313,0) + Q:'$D(^AUTTCOM(+Y,0)) "" ;"Unknown3" +"RTN","BMXUTL1",314,0) + Q:$G(NOTEXT)=1 Y +"RTN","BMXUTL1",315,0) + Q:$G(NOTEXT)=2 Y_"|"_$$GET^BMXG(2,Y) +"RTN","BMXUTL1",316,0) + Q $$GET^BMXG(2,Y) +"RTN","BMXUTL1",317,0) + ; +"RTN","BMXUTL1",318,0) + ; +"RTN","BMXUTL1",319,0) + ;---------- +"RTN","BMXUTL1",320,0) +PERSON(X,ORDER) ;EP +"RTN","BMXUTL1",321,0) + ;---> Return person's name from File #200. +"RTN","BMXUTL1",322,0) + ;---> Parameters: +"RTN","BMXUTL1",323,0) + ; 1 - X (req) Person's IEN in New Person File #200. +"RTN","BMXUTL1",324,0) + ; 2 - ORDER (opt) ""/0=Last,First 1=First Last +"RTN","BMXUTL1",325,0) + ; +"RTN","BMXUTL1",326,0) + Q:'X "Unknown" +"RTN","BMXUTL1",327,0) + Q:'$D(^VA(200,X,0)) "Unknown" +"RTN","BMXUTL1",328,0) + N Y S Y=$P(^VA(200,X,0),U) +"RTN","BMXUTL1",329,0) + Q:'$G(ORDER) Y +"RTN","BMXUTL1",330,0) + Q $$FL(Y) +"RTN","BMXUTL2") +0^109^B1806952 +"RTN","BMXUTL2",1,0) +BMXUTL2 ; IHS/OIT/HMW - UTIL: PATIENT INFO ; +"RTN","BMXUTL2",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXUTL2",3,0) + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * +"RTN","BMXUTL2",4,0) + ;; UTILITY: PATIENT FUNCTIONS: CONTRAS, INPATIENT, HIDOSE. +"RTN","BMXUTL2",5,0) + ; +"RTN","BMXUTL2",6,0) +NEXTAPPT(BMXDFN) ;EP +"RTN","BMXUTL2",7,0) + ;---> Return patient's next appointment from Scheduling Package. +"RTN","BMXUTL2",8,0) + ;---> Parameters: +"RTN","BMXUTL2",9,0) + ; 1 - BMXDFN (req) Patient's IEN (BMXDFN). +"RTN","BMXUTL2",10,0) + ; +"RTN","BMXUTL2",11,0) + Q:'$G(BMXDFN) "" +"RTN","BMXUTL2",12,0) + Q:'$D(^DPT(BMXDFN)) "" +"RTN","BMXUTL2",13,0) + ; +"RTN","BMXUTL2",14,0) + N BMXAPPT,BMXDT,BMXYES +"RTN","BMXUTL2",15,0) + S BMXDT=DT+.2400,BMXYES=0 +"RTN","BMXUTL2",16,0) + F S BMXDT=$O(^DPT(BMXDFN,"S",BMXDT)) Q:'BMXDT!(BMXYES) D +"RTN","BMXUTL2",17,0) + .N BMXDATA,BMXOI,X +"RTN","BMXUTL2",18,0) + .S BMXDATA=$G(^DPT(BMXDFN,"S",BMXDT,0)) +"RTN","BMXUTL2",19,0) + .Q:BMXDATA="" +"RTN","BMXUTL2",20,0) + .; +"RTN","BMXUTL2",21,0) + .;---> Quit if appointment is cancelled. +"RTN","BMXUTL2",22,0) + .Q:$P(BMXDATA,U,2)["C" +"RTN","BMXUTL2",23,0) + .; +"RTN","BMXUTL2",24,0) + .S X=0 F S X=$O(^SC(+BMXDATA,"S",BMXDT,1,X)) Q:'X D +"RTN","BMXUTL2",25,0) + ..Q:+$G(^SC(+BMXDATA,"S",BMXDT,1,X,0))'=BMXDFN +"RTN","BMXUTL2",26,0) + ..S BMXYES=BMXDT_U_+BMXDATA +"RTN","BMXUTL2",27,0) + ; +"RTN","BMXUTL2",28,0) + Q:'BMXYES "" +"RTN","BMXUTL2",29,0) + ; +"RTN","BMXUTL2",30,0) + S BMXAPPT=$$FMTE^XLFDT(+BMXYES,"1P")_" with " +"RTN","BMXUTL2",31,0) + S BMXAPPT=BMXAPPT_$P($G(^SC($P(BMXYES,U,2),0)),U) +"RTN","BMXUTL2",32,0) + Q BMXAPPT +"RTN","BMXUTL5") +0^110^B16165811 +"RTN","BMXUTL5",1,0) +BMXUTL5 ; IHS/OIT/HMW - DATE FORMAT ; +"RTN","BMXUTL5",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXUTL5",3,0) + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * +"RTN","BMXUTL5",4,0) + ;; UTILITY: SETVARS, CENTERT, COPYLET, +"RTN","BMXUTL5",5,0) + ;; UPPERCASE XREFS, DATE FORMATS, PADS/SPACES. +"RTN","BMXUTL5",6,0) + ; +"RTN","BMXUTL5",7,0) + ; +"RTN","BMXUTL5",8,0) + ;---------- +"RTN","BMXUTL5",9,0) +SETVARS ;EP +"RTN","BMXUTL5",10,0) + ;---> Set standard variables. +"RTN","BMXUTL5",11,0) + D ^XBKVAR +"RTN","BMXUTL5",12,0) + S:'$D(IOF) IOF="#" +"RTN","BMXUTL5",13,0) + Q +"RTN","BMXUTL5",14,0) + ; +"RTN","BMXUTL5",15,0) + ; +"RTN","BMXUTL5",16,0) + ;---------- +"RTN","BMXUTL5",17,0) +PHONFIX(X) ;EP +"RTN","BMXUTL5",18,0) + ;---> Remove parentheses from Phone#. +"RTN","BMXUTL5",19,0) + ;---> Parameters: +"RTN","BMXUTL5",20,0) + ; 1 - X (req) Input Phone Number; returned without parentheses. +"RTN","BMXUTL5",21,0) + ; +"RTN","BMXUTL5",22,0) + Q:$G(X)="" +"RTN","BMXUTL5",23,0) + S X=$TR(X,"(","") +"RTN","BMXUTL5",24,0) + S X=$TR(X,")","-") +"RTN","BMXUTL5",25,0) + S X=$TR(X,"/","-") +"RTN","BMXUTL5",26,0) + S:X["- " X=$P(X,"- ")_"-"_$P(X,"- ",2) +"RTN","BMXUTL5",27,0) + S:$E(X,4)=" " $E(X,4)="-" +"RTN","BMXUTL5",28,0) + S:X["--" X=$P(X,"--")_"-"_$P(X,"--",2) +"RTN","BMXUTL5",29,0) + S:X?7N X=$E(X,1,3)_"-"_$E(X,4,7) +"RTN","BMXUTL5",30,0) + Q +"RTN","BMXUTL5",31,0) + ; +"RTN","BMXUTL5",32,0) + ; +"RTN","BMXUTL5",33,0) + ;---------- +"RTN","BMXUTL5",34,0) +CENTERT(TEXT,X) ;EP +"RTN","BMXUTL5",35,0) + ;---> Pad TEXT with leading spaces to center in 80 columns. +"RTN","BMXUTL5",36,0) + ;---> Parameters: +"RTN","BMXUTL5",37,0) + ; 1 - TEXT (req) Text to be centered. +"RTN","BMXUTL5",38,0) + ; 2 - X (opt) Columns to adjust to the right. +"RTN","BMXUTL5",39,0) + ; +"RTN","BMXUTL5",40,0) + S:$G(TEXT)="" TEXT="* NO TEXT SUPPLIED *" +"RTN","BMXUTL5",41,0) + S:'$G(X) X=39 +"RTN","BMXUTL5",42,0) + N I +"RTN","BMXUTL5",43,0) + F I=1:1:(X-($L(TEXT)/2)) S TEXT=" "_TEXT +"RTN","BMXUTL5",44,0) + Q +"RTN","BMXUTL5",45,0) + ; +"RTN","BMXUTL5",46,0) + ; +"RTN","BMXUTL5",47,0) + ;---------- +"RTN","BMXUTL5",48,0) +UPPER(X) ;EP +"RTN","BMXUTL5",49,0) + ;---> Translate X to all uppercase. +"RTN","BMXUTL5",50,0) + ;---> Parameters: +"RTN","BMXUTL5",51,0) + ; 1 - X (req) Value to be translated into all uppercase. +"RTN","BMXUTL5",52,0) + ; +"RTN","BMXUTL5",53,0) + S X=$TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") +"RTN","BMXUTL5",54,0) + Q X +"RTN","BMXUTL5",55,0) + ; +"RTN","BMXUTL5",56,0) + ; +"RTN","BMXUTL5",57,0) + ;---------- +"RTN","BMXUTL5",58,0) +UPXREF(X,AGGBL) ;EP +"RTN","BMXUTL5",59,0) + ;---> Set uppercase xref for X. Called from M xrefs on mixed case +"RTN","BMXUTL5",60,0) + ;---> fields where an all uppercase lookup is needed. +"RTN","BMXUTL5",61,0) + ;---> Parameters: +"RTN","BMXUTL5",62,0) + ; 1 - X (req) The value that should be xrefed in uppercase. +"RTN","BMXUTL5",63,0) + ; 2 - AGGBL (req) The global root of the file. +"RTN","BMXUTL5",64,0) + ; +"RTN","BMXUTL5",65,0) + ;---> Variables: +"RTN","BMXUTL5",66,0) + ; 1 - DA (req) IEN of the entry being xrefed. +"RTN","BMXUTL5",67,0) + ; +"RTN","BMXUTL5",68,0) + Q:'$D(AGGBL) Q:$G(X)="" Q:'$G(DA) +"RTN","BMXUTL5",69,0) + S @(AGGBL_"""U"",$E($$UPPER(X),1,30),DA)")="" +"RTN","BMXUTL5",70,0) + Q +"RTN","BMXUTL5",71,0) + ; +"RTN","BMXUTL5",72,0) + ; +"RTN","BMXUTL5",73,0) + ;---------- +"RTN","BMXUTL5",74,0) +KUPXREF(X,AGGBL) ;EP +"RTN","BMXUTL5",75,0) + ;---> Kill uppercase xref for X. Called from M xrefs on mixed case +"RTN","BMXUTL5",76,0) + ;---> fields where an all uppercase lookup is needed. +"RTN","BMXUTL5",77,0) + ;---> Parameters: +"RTN","BMXUTL5",78,0) + ; 1 - X (req) The value that should be xrefed in uppercase. +"RTN","BMXUTL5",79,0) + ; 2 - AGGBL (req) The global root of the file. +"RTN","BMXUTL5",80,0) + ; +"RTN","BMXUTL5",81,0) + ;---> Variables: +"RTN","BMXUTL5",82,0) + ; 1 - DA (req) IEN of the entry being xrefed. +"RTN","BMXUTL5",83,0) + ; +"RTN","BMXUTL5",84,0) + Q:'$D(AGGBL) Q:$G(X)="" Q:'$G(DA) +"RTN","BMXUTL5",85,0) + K @(AGGBL_"""U"",$E($$UPPER(X),1,30),DA)") +"RTN","BMXUTL5",86,0) + Q +"RTN","BMXUTL5",87,0) + ; +"RTN","BMXUTL5",88,0) + ; +"RTN","BMXUTL5",89,0) + ;---------- +"RTN","BMXUTL5",90,0) +SLDT2(DATE) ;EP +"RTN","BMXUTL5",91,0) + ;---> CONVERT FILEMAN INTERNAL DATE TO "SLASH" FORMAT: MM/DD/YYYY. +"RTN","BMXUTL5",92,0) + ;---> DATE=DATE IN FILEMAN FORMAT. +"RTN","BMXUTL5",93,0) + Q:'$G(DATE) "NO DATE" +"RTN","BMXUTL5",94,0) + S DATE=$P(DATE,".") +"RTN","BMXUTL5",95,0) + Q:$L(DATE)'=7 DATE +"RTN","BMXUTL5",96,0) + Q:'$E(DATE,4,5) $E(DATE,1,3)+1700 +"RTN","BMXUTL5",97,0) + Q:'$E(DATE,6,7) $E(DATE,4,5)_"/"_$E(DATE,2,3) +"RTN","BMXUTL5",98,0) + Q $E(DATE,4,5)_"/"_$E(DATE,6,7)_"/"_($E(DATE,1,3)+1700) +"RTN","BMXUTL5",99,0) + ; +"RTN","BMXUTL5",100,0) + ; +"RTN","BMXUTL5",101,0) + ;---------- +"RTN","BMXUTL5",102,0) +SLDT1(DATE) ;EP +"RTN","BMXUTL5",103,0) + ;---> CONVERT FILEMAN INTERNAL DATE TO "SLASH" FORMAT: +"RTN","BMXUTL5",104,0) + ;---> MM/DD/YYYY @TIME +"RTN","BMXUTL5",105,0) + N Y +"RTN","BMXUTL5",106,0) + Q:'$D(DATE) "NO DATE" +"RTN","BMXUTL5",107,0) + S Y=DATE,DATE=$P(DATE,".") +"RTN","BMXUTL5",108,0) + Q:'DATE "NO DATE" +"RTN","BMXUTL5",109,0) + Q:$L(DATE)'=7 DATE +"RTN","BMXUTL5",110,0) + Q:'$E(DATE,4,5) $E(DATE,1,3)+1700 +"RTN","BMXUTL5",111,0) + Q:'$E(DATE,6,7) $E(DATE,4,5)_"/"_$E(DATE,2,3) +"RTN","BMXUTL5",112,0) + D DD^%DT S:Y["@" Y=" @ "_$P($P(Y,"@",2),":",1,2) +"RTN","BMXUTL5",113,0) + Q $E(DATE,4,5)_"/"_$E(DATE,6,7)_"/"_($E(DATE,1,3)+1700)_Y +"RTN","BMXUTL5",114,0) + ; +"RTN","BMXUTL5",115,0) + ; +"RTN","BMXUTL5",116,0) + ;---------- +"RTN","BMXUTL5",117,0) +NOSLDT(DATE) ;EP +"RTN","BMXUTL5",118,0) + ;---> CONVERT FILEMAN INTERNAL DATE TO "NO SLASH" FORMAT: MMDDYYYY. +"RTN","BMXUTL5",119,0) + ;---> DATE=DATE IN FILEMAN FORMAT. +"RTN","BMXUTL5",120,0) + Q:'$G(DATE) "NO DATE" +"RTN","BMXUTL5",121,0) + S DATE=$P(DATE,".") +"RTN","BMXUTL5",122,0) + Q:$L(DATE)'=7 DATE +"RTN","BMXUTL5",123,0) + Q $E(DATE,4,5)_$E(DATE,6,7)_($E(DATE,1,3)+1700) +"RTN","BMXUTL5",124,0) + ; +"RTN","BMXUTL5",125,0) + ; +"RTN","BMXUTL5",126,0) + ;---------- +"RTN","BMXUTL5",127,0) +IMMSDT(DATE) ;EP +"RTN","BMXUTL5",128,0) + ;---> Convert Immserve Date (format MMDDYYYY) TO FILEMAN +"RTN","BMXUTL5",129,0) + ;---> Internal format. +"RTN","BMXUTL5",130,0) + ;---> NOTE: This code is copied into routine ^AGPATUP1 for speed. +"RTN","BMXUTL5",131,0) + ;---> Any changes here should also be made to the call in ^AGPATUP1. +"RTN","BMXUTL5",132,0) + Q:'$G(DATE) "NO DATE" +"RTN","BMXUTL5",133,0) + Q ($E(DATE,5,9)-1700)_$E(DATE,1,2)_$E(DATE,3,4) +"RTN","BMXUTL5",134,0) + ; +"RTN","BMXUTL5",135,0) + ; +"RTN","BMXUTL5",136,0) + ;---------- +"RTN","BMXUTL5",137,0) +TXDT1(DATE,TIME) ;EP +"RTN","BMXUTL5",138,0) + ;---> Return external date in format: DD-Mmm-YYYY@HH:MM, from Fileman +"RTN","BMXUTL5",139,0) + ;---> internal YYYMMDD.HHMM +"RTN","BMXUTL5",140,0) + ;---> Parameters: +"RTN","BMXUTL5",141,0) + ; 1 - DATE (req) Internal Fileman date. +"RTN","BMXUTL5",142,0) + ; 2 - TIME (opt) +"RTN","BMXUTL5",143,0) + ; +"RTN","BMXUTL5",144,0) + Q:'$G(DATE) "NO DATE" +"RTN","BMXUTL5",145,0) + N X,Y,Z +"RTN","BMXUTL5",146,0) + S X="Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec" +"RTN","BMXUTL5",147,0) + S Y=$E(DATE,6,7)_"-"_$P(X,U,$E(DATE,4,5))_"-"_($E(DATE,1,3)+1700) +"RTN","BMXUTL5",148,0) + S:'$E(DATE,6,7) Y=$E(Y,4,99) +"RTN","BMXUTL5",149,0) + S:'$E(DATE,4,5) Y=$E(DATE,1,3)+1700 +"RTN","BMXUTL5",150,0) + Q:'$G(TIME) Y +"RTN","BMXUTL5",151,0) + S Z=$P(DATE,".",2) +"RTN","BMXUTL5",152,0) + Q:'Z Y +"RTN","BMXUTL5",153,0) + Q Y_" @"_$E(Z,1,2)_":"_$$PAD($E(Z,3,4),2,"0") +"RTN","BMXUTL5",154,0) + ; +"RTN","BMXUTL5",155,0) + ; +"RTN","BMXUTL5",156,0) + ;---------- +"RTN","BMXUTL5",157,0) +TXDT(DATE) ;EP +"RTN","BMXUTL5",158,0) + ;---> CONVERT FILEMAN INTERNAL DATE TO "TEXT" FORMAT: MMM DD,YYYY. +"RTN","BMXUTL5",159,0) + N Y +"RTN","BMXUTL5",160,0) + Q:'$D(DATE) "NO DATE" +"RTN","BMXUTL5",161,0) + S Y=DATE D DD^%DT +"RTN","BMXUTL5",162,0) + I Y[", " S Y=$P(Y,", ")_","_$P(Y,", ",2) +"RTN","BMXUTL5",163,0) + I Y["@" S Y=$P(Y,"@")_" "_$P($P(Y,"@",2),":",1,2) +"RTN","BMXUTL5",164,0) + Q Y +"RTN","BMXUTL5",165,0) + ; +"RTN","BMXUTL5",166,0) + ; +"RTN","BMXUTL5",167,0) + ;---------- +"RTN","BMXUTL5",168,0) +NOW() ;EP +"RTN","BMXUTL5",169,0) + ;---> Return Current Date and Time in external format. +"RTN","BMXUTL5",170,0) + N %H,X,Y,Z +"RTN","BMXUTL5",171,0) + S %H=$H +"RTN","BMXUTL5",172,0) + D YX^%DTC +"RTN","BMXUTL5",173,0) + I Y["@" S Y=$P($P(Y,"@",2),":",1,2) +"RTN","BMXUTL5",174,0) + S Z=$$TXDT1(X) +"RTN","BMXUTL5",175,0) + S:Y]"" Z=Z_" @"_Y +"RTN","BMXUTL5",176,0) + Q Z +"RTN","BMXUTL5",177,0) + ; +"RTN","BMXUTL5",178,0) + ; +"RTN","BMXUTL5",179,0) + ;---------- +"RTN","BMXUTL5",180,0) +PAD(D,L,C) ;EP +"RTN","BMXUTL5",181,0) + ;---> Pad the length of data to a total of L characters +"RTN","BMXUTL5",182,0) + ;---> by adding spaces to the end of the data. +"RTN","BMXUTL5",183,0) + ; Example: S X=$$PAD("MIKE",7) X="MIKE " (Added 3 spaces.) +"RTN","BMXUTL5",184,0) + ;---> Parameters: +"RTN","BMXUTL5",185,0) + ; 1 - D (req) Data to be padded. +"RTN","BMXUTL5",186,0) + ; 2 - L (req) Total length of resulting data. +"RTN","BMXUTL5",187,0) + ; 3 - C (opt) Character to pad with (default=space). +"RTN","BMXUTL5",188,0) + ; +"RTN","BMXUTL5",189,0) + Q:'$D(D) "" +"RTN","BMXUTL5",190,0) + S:'$G(L) L=$L(D) +"RTN","BMXUTL5",191,0) + S:$G(C)="" C=" " +"RTN","BMXUTL5",192,0) + Q $E(D_$$REPEAT^XLFSTR(C,L),1,L) +"RTN","BMXUTL5",193,0) + ; +"RTN","BMXUTL5",194,0) + ; +"RTN","BMXUTL5",195,0) + ;---------- +"RTN","BMXUTL5",196,0) +SP(N,C) ;EP +"RTN","BMXUTL5",197,0) + ;---> Return N spaces or other character. +"RTN","BMXUTL5",198,0) + ; Example: S X=$$SP(5)_X Pads the front of X with 5 spaces. +"RTN","BMXUTL5",199,0) + ;---> Parameters: +"RTN","BMXUTL5",200,0) + ; 1 - N (req) Number of spaces to be returned as extrinsic var. +"RTN","BMXUTL5",201,0) + ; 2 - C (opt) Character to pad with (default=space). +"RTN","BMXUTL5",202,0) + ; +"RTN","BMXUTL5",203,0) + Q:$G(N)<1 "" +"RTN","BMXUTL5",204,0) + S:$G(C)="" C=" " +"RTN","BMXUTL5",205,0) + Q $$PAD(C,N,C) +"RTN","BMXUTL5",206,0) + ; +"RTN","BMXUTL5",207,0) + ; +"RTN","BMXUTL5",208,0) + ;---------- +"RTN","BMXUTL5",209,0) +STRIP(X) ;EP +"RTN","BMXUTL5",210,0) + ;---> Strip any punctuation characters from the beginning of X, +"RTN","BMXUTL5",211,0) + ;---> including spaces. +"RTN","BMXUTL5",212,0) + ;---> Parameters: +"RTN","BMXUTL5",213,0) + ; 1 - X (req) String of characters. +"RTN","BMXUTL5",214,0) + ; +"RTN","BMXUTL5",215,0) + Q:$G(X)="" "" +"RTN","BMXUTL5",216,0) + F Q:$E(X)'?1P S X=$E(X,2,99) +"RTN","BMXUTL5",217,0) + Q X +"RTN","BMXUTL6") +0^111^B582471 +"RTN","BMXUTL6",1,0) +BMXUTL6 ; IHS/OIT/HMW - BMXNET INSTALLATION CALLS ; +"RTN","BMXUTL6",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXUTL6",3,0) + ; +"RTN","BMXUTL6",4,0) + ; +"RTN","BMXUTL6",5,0) +POST ;EP - Called from BMX Installation postinit +"RTN","BMXUTL6",6,0) + ; +"RTN","BMXUTL6",7,0) + ;Add BMX AV CODE to XUS SIGNON broker option +"RTN","BMXUTL6",8,0) + N BMXFDA,BMXIEN,BMXMSG,BMXIENS,BMXMENN,BMXAVI +"RTN","BMXUTL6",9,0) + S BMXAVI=$O(^XWB(8994,"B","BMX AV CODE",0)) +"RTN","BMXUTL6",10,0) + Q:'+BMXAVI +"RTN","BMXUTL6",11,0) + S BMXIENS=$O(^DIC(19,"B","XUS SIGNON",0)) +"RTN","BMXUTL6",12,0) + Q:'+BMXIENS +"RTN","BMXUTL6",13,0) + ; +"RTN","BMXUTL6",14,0) + S BMXIENS="?+2,"_BMXIENS_"," +"RTN","BMXUTL6",15,0) + S BMXFDA(19.05,BMXIENS,.01)=BMXAVI +"RTN","BMXUTL6",16,0) + K BMXIEN,BMXMSG +"RTN","BMXUTL6",17,0) + S DIC(0)="" +"RTN","BMXUTL6",18,0) + D UPDATE^DIE("","BMXFDA","BMXIEN","BMXMSG") +"RTN","BMXUTL6",19,0) + Q +"RTN","BMXUTL6",20,0) + ; +"RTN","BMXUTL6",21,0) + ; +"RTN","BMXUTL6",22,0) + ; +"RTN","BMXUTL6",23,0) + ;Create BMXNET,APPLICATION user and set attributes +"RTN","BMXUTL6",24,0) + ; +"RTN","BMXUTL6",25,0) + ;N BMXFDA,BMXIEN,BMXMSG,BMXIENS,BMXMENN +"RTN","BMXUTL6",26,0) + ;S BMXIENS = "?+1," +"RTN","BMXUTL6",27,0) + ;S BMXFDA(200,BMXIENS,.01)="BMXNET,APPLICATION" +"RTN","BMXUTL6",28,0) + ;S BMXFDA(200,BMXIENS,2)="1_(a>yr}:3x3ja9\8vbH" +"RTN","BMXUTL6",29,0) + ;S BMXFDA(200,BMXIENS,11)="$;HOSs|:3w25lLD}Be=" +"RTN","BMXUTL6",30,0) + ;S BMXFDA(200,BMXIENS,11.2)="88888,88888" +"RTN","BMXUTL6",31,0) + ;S BMXMENN=$O(^DIC(19,"B","BMXRPC",0)) +"RTN","BMXUTL6",32,0) + ;I +BMXMENN S BMXFDA(200.03,"?+2,?+1,",.01)=BMXMENN +"RTN","BMXUTL6",33,0) + ;K BMXIEN,BMXMSG +"RTN","BMXUTL6",34,0) + ;S DIC(0)="" +"RTN","BMXUTL6",35,0) + ;D UPDATE^DIE("","BMXFDA","BMXIEN","BMXMSG") +"RTN","BMXUTL6",36,0) + Q +"RTN","BMXUTL7") +0^112^B65930 +"RTN","BMXUTL7",1,0) +BMXUTL7 ; IHS/OIT/HMW - BMXNET INSTALLATION CALLS ; +"RTN","BMXUTL7",2,0) + ;;2.1;BMX;;Jul 26, 2009;Build 4 +"RTN","BMXUTL7",3,0) + ; +"RTN","BMXUTL7",4,0) + ; +"RTN","BMXUTL7",5,0) +ENV ;EP Environment Check +"RTN","BMXUTL7",6,0) + I $G(XPDENV)=1 D +"RTN","BMXUTL7",7,0) + . S XPDDIQ("XPZ1")=0 +"RTN","BMXUTL7",8,0) + . S XPDDIQ("XPZ2")=0 +"SEC","^DIC",90093.1,90093.1,0,"AUDIT") +@ +"SEC","^DIC",90093.1,90093.1,0,"DD") +@ +"SEC","^DIC",90093.1,90093.1,0,"DEL") +@ +"SEC","^DIC",90093.1,90093.1,0,"LAYGO") +@ +"SEC","^DIC",90093.1,90093.1,0,"RD") +@ +"SEC","^DIC",90093.1,90093.1,0,"WR") +@ +"SEC","^DIC",90093.2,90093.2,0,"AUDIT") +@ +"SEC","^DIC",90093.2,90093.2,0,"DD") +@ +"SEC","^DIC",90093.2,90093.2,0,"DEL") +@ +"SEC","^DIC",90093.2,90093.2,0,"LAYGO") +@ +"SEC","^DIC",90093.2,90093.2,0,"RD") +@ +"SEC","^DIC",90093.2,90093.2,0,"WR") +@ +"SEC","^DIC",90093.5,90093.5,0,"AUDIT") +@ +"SEC","^DIC",90093.5,90093.5,0,"DD") +@ +"SEC","^DIC",90093.5,90093.5,0,"DEL") +# +"SEC","^DIC",90093.5,90093.5,0,"LAYGO") +# +"SEC","^DIC",90093.5,90093.5,0,"RD") +# +"SEC","^DIC",90093.5,90093.5,0,"WR") +# +"SEC","^DIC",90093.9,90093.9,0,"AUDIT") +@ +"SEC","^DIC",90093.9,90093.9,0,"DD") +@ +"SEC","^DIC",90093.9,90093.9,0,"DEL") +# +"SEC","^DIC",90093.9,90093.9,0,"LAYGO") +# +"SEC","^DIC",90093.9,90093.9,0,"RD") +# +"SEC","^DIC",90093.9,90093.9,0,"WR") +# +"SEC","^DIC",90093.98,90093.98,0,"AUDIT") +@ +"SEC","^DIC",90093.98,90093.98,0,"DD") +@ +"SEC","^DIC",90093.98,90093.98,0,"DEL") +@ +"SEC","^DIC",90093.98,90093.98,0,"LAYGO") +@ +"SEC","^DIC",90093.98,90093.98,0,"RD") +@ +"SEC","^DIC",90093.98,90093.98,0,"WR") +@ +"SEC","^DIC",90093.99,90093.99,0,"AUDIT") +@ +"SEC","^DIC",90093.99,90093.99,0,"DD") +@ +"SEC","^DIC",90093.99,90093.99,0,"DEL") +@ +"SEC","^DIC",90093.99,90093.99,0,"LAYGO") +@ +"SEC","^DIC",90093.99,90093.99,0,"RD") +@ +"SEC","^DIC",90093.99,90093.99,0,"WR") +@ +"VER") +8.0^22.0 +"^DD",90093.1,90093.1,0) +FIELD^^.03^3 +"^DD",90093.1,90093.1,0,"DT") +3031229 +"^DD",90093.1,90093.1,0,"IX","B",90093.1,.01) + +"^DD",90093.1,90093.1,0,"NM","BMX USER") + +"^DD",90093.1,90093.1,0,"VRPK") +BMX +"^DD",90093.1,90093.1,.01,0) +WINIDENT^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X +"^DD",90093.1,90093.1,.01,1,0) +^.1 +"^DD",90093.1,90093.1,.01,1,1,0) +90093.1^B +"^DD",90093.1,90093.1,.01,1,1,1) +S ^BMXUSER("B",$E(X,1,30),DA)="" +"^DD",90093.1,90093.1,.01,1,1,2) +K ^BMXUSER("B",$E(X,1,30),DA) +"^DD",90093.1,90093.1,.01,3) +Answer must be 3-30 characters in length. +"^DD",90093.1,90093.1,.01,"DT") +3031229 +"^DD",90093.1,90093.1,.02,0) +USER^P200'^VA(200,^0;2^Q +"^DD",90093.1,90093.1,.02,3) +Enter the User +"^DD",90093.1,90093.1,.02,"DT") +3031229 +"^DD",90093.1,90093.1,.03,0) +V ENCRYPTED^F^^0;3^K:$L(X)>30!($L(X)<1) X +"^DD",90093.1,90093.1,.03,3) +Answer must be 1-30 characters in length. +"^DD",90093.1,90093.1,.03,"DT") +3030909 +"^DD",90093.2,90093.2,0) +FIELD^^.03^3 +"^DD",90093.2,90093.2,0,"DT") +3040226 +"^DD",90093.2,90093.2,0,"IX","B",90093.2,.01) + +"^DD",90093.2,90093.2,0,"NM","BMX APPLICATION") + +"^DD",90093.2,90093.2,0,"VRPK") +BMX +"^DD",90093.2,90093.2,.01,0) +MAJOR VERSION^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X +"^DD",90093.2,90093.2,.01,1,0) +^.1 +"^DD",90093.2,90093.2,.01,1,1,0) +90093.2^B +"^DD",90093.2,90093.2,.01,1,1,1) +S ^BMXAPPL("B",$E(X,1,30),DA)="" +"^DD",90093.2,90093.2,.01,1,1,2) +K ^BMXAPPL("B",$E(X,1,30),DA) +"^DD",90093.2,90093.2,.01,3) +Answer must be 1-30 characters in length. +"^DD",90093.2,90093.2,.01,"DT") +3040226 +"^DD",90093.2,90093.2,.02,0) +MINOR VERSION^RF^^0;2^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X +"^DD",90093.2,90093.2,.02,3) +Answer must be 1-30 characters in length. +"^DD",90093.2,90093.2,.02,"DT") +3040226 +"^DD",90093.2,90093.2,.03,0) +BUILD^D^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X +"^DD",90093.2,90093.2,.03,"DT") +3040226 +"^DD",90093.5,90093.5,0) +FIELD^^.04^4 +"^DD",90093.5,90093.5,0,"DT") +3040919 +"^DD",90093.5,90093.5,0,"IX","B",90093.5,.01) + +"^DD",90093.5,90093.5,0,"NM","BMXNET MONITOR") + +"^DD",90093.5,90093.5,0,"VRPK") +BMX +"^DD",90093.5,90093.5,.01,0) +PORT^RNJ5,0^^0;1^K:+X'=X!(X>99999)!(X<1000)!(X?.E1"."1N.N) X +"^DD",90093.5,90093.5,.01,1,0) +^.1 +"^DD",90093.5,90093.5,.01,1,1,0) +90093.5^B +"^DD",90093.5,90093.5,.01,1,1,1) +S ^BMXMON("B",$E(X,1,30),DA)="" +"^DD",90093.5,90093.5,.01,1,1,2) +K ^BMXMON("B",$E(X,1,30),DA) +"^DD",90093.5,90093.5,.01,3) +Type a Number between 1000 and 99999, 0 Decimal Digits +"^DD",90093.5,90093.5,.01,"DT") +3040919 +"^DD",90093.5,90093.5,.02,0) +ENABLED^S^1:YES;0:NO;^0;2^Q +"^DD",90093.5,90093.5,.02,3) +ANSWER YES IF PORT IS ENABLED +"^DD",90093.5,90093.5,.02,21,0) +^^1^1^3040919^ +"^DD",90093.5,90093.5,.02,21,1,0) +ANSWER YES IF PORT IS ENABLED +"^DD",90093.5,90093.5,.02,"DT") +3040919 +"^DD",90093.5,90093.5,.03,0) +INTEGRATED SECURITY^S^1:YES;0:NO;^0;3^Q +"^DD",90093.5,90093.5,.03,3) +ANSWER YES IF INTEGRATED SECURITY ENABLED +"^DD",90093.5,90093.5,.03,21,0) +^^1^1^3040919^ +"^DD",90093.5,90093.5,.03,21,1,0) +ANSWER YES IF INTEGRATED SECURITY ENABLED +"^DD",90093.5,90093.5,.03,"DT") +3040919 +"^DD",90093.5,90093.5,.04,0) +SESSION NAMESPACE^F^^0;4^K:$L(X)>30!($L(X)<3) X +"^DD",90093.5,90093.5,.04,3) +Sessions will be spawned in this namespace. +"^DD",90093.5,90093.5,.04,21,0) +^^1^1^3040919^ +"^DD",90093.5,90093.5,.04,21,1,0) +Sessions will be spawned in this namespace. +"^DD",90093.5,90093.5,.04,"DT") +3040919 +"^DD",90093.9,90093.9,0) +FIELD^^1100^9 +"^DD",90093.9,90093.9,0,"DT") +3051207 +"^DD",90093.9,90093.9,0,"IX","AUSRP",90093.9,.08) + +"^DD",90093.9,90093.9,0,"IX","B",90093.9,.01) + +"^DD",90093.9,90093.9,0,"NM","BMX GUI REPORT") + +"^DD",90093.9,90093.9,0,"VRPK") +BMX +"^DD",90093.9,90093.9,.01,0) +NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X +"^DD",90093.9,90093.9,.01,1,0) +^.1 +"^DD",90093.9,90093.9,.01,1,1,0) +90093.9^B +"^DD",90093.9,90093.9,.01,1,1,1) +S ^BMXGUIR("B",$E(X,1,30),DA)="" +"^DD",90093.9,90093.9,.01,1,1,2) +K ^BMXGUIR("B",$E(X,1,30),DA) +"^DD",90093.9,90093.9,.01,3) +Answer must be 3-30 characters in length. +"^DD",90093.9,90093.9,.01,"DT") +3041004 +"^DD",90093.9,90093.9,.02,0) +USER WHO REQUESTED REPORT^P200'^VA(200,^0;2^Q +"^DD",90093.9,90093.9,.02,"DT") +3041004 +"^DD",90093.9,90093.9,.03,0) +START TIME^D^^0;3^S %DT="ET" D ^%DT S X=Y K:Y<1 X +"^DD",90093.9,90093.9,.03,1,0) +^.1^^0 +"^DD",90093.9,90093.9,.03,"DT") +3050920 +"^DD",90093.9,90093.9,.04,0) +END TIME^D^^0;4^S %DT="ET" D ^%DT S X=Y K:Y<1 X +"^DD",90093.9,90093.9,.04,"DT") +3041008 +"^DD",90093.9,90093.9,.05,0) +OUTPUT TYPE^S^1:Individual Reports;2:EPI File;3:Cumulative Reports;4:Individual and Cumulative Reports;^0;5^Q +"^DD",90093.9,90093.9,.05,"DT") +3041011 +"^DD",90093.9,90093.9,.06,0) +OPTION NAME^F^^0;6^K:$L(X)>60!($L(X)<1) X +"^DD",90093.9,90093.9,.06,3) +Answer must be 1-60 characters in length. +"^DD",90093.9,90093.9,.06,"DT") +3051021 +"^DD",90093.9,90093.9,.07,0) +REPORT STATUS^S^R:RUNNING;Q:QUEUED;C:COMPLETED;^0;7^Q +"^DD",90093.9,90093.9,.07,"DT") +3050915 +"^DD",90093.9,90093.9,.08,0) +PACKAGE^P9.4'^DIC(9.4,^0;8^Q +"^DD",90093.9,90093.9,.08,1,0) +^.1 +"^DD",90093.9,90093.9,.08,1,1,0) +90093.9^AUSRP^MUMPS +"^DD",90093.9,90093.9,.08,1,1,1) +S ^BMXGUIR("AUSRP",$P(^BMXGUIR(DA,0),"^",2),X,(9999999.9999-$P(^BMXGUIR(DA,0),"^",3)),DA)="" +"^DD",90093.9,90093.9,.08,1,1,2) +K ^BMXGUIR("AUSRP",$P(^BMXGUIR(DA,0),"^",2),X,(9999999.9999-$P(^BMXGUIR(DA,0),"^",3)),DA) +"^DD",90093.9,90093.9,.08,1,1,"DT") +3051207 +"^DD",90093.9,90093.9,.08,"DT") +3051207 +"^DD",90093.9,90093.9,1100,0) +OUTPUT^90093.911^^11;0 +"^DD",90093.9,90093.911,0) +OUTPUT SUB-FIELD^^.01^1 +"^DD",90093.9,90093.911,0,"NM","OUTPUT") + +"^DD",90093.9,90093.911,0,"UP") +90093.9 +"^DD",90093.9,90093.911,.01,0) +OUTPUT^W^^0;1^Q +"^DD",90093.9,90093.911,.01,"DT") +3041004 +"^DD",90093.98,90093.98,0) +FIELD^^1^4 +"^DD",90093.98,90093.98,0,"DT") +3050622 +"^DD",90093.98,90093.98,0,"IX","B",90093.98,.01) + +"^DD",90093.98,90093.98,0,"NM","BMX ADO LOG") + +"^DD",90093.98,90093.98,0,"VRPK") +BMX +"^DD",90093.98,90093.98,.01,0) +TRANSACTION TIMESTAMP^RD^^0;1^S %DT="ESTXR" D ^%DT S X=Y K:Y<1 X +"^DD",90093.98,90093.98,.01,1,0) +^.1 +"^DD",90093.98,90093.98,.01,1,1,0) +90093.98^B +"^DD",90093.98,90093.98,.01,1,1,1) +S ^BMXADOL("B",$E(X,1,30),DA)="" +"^DD",90093.98,90093.98,.01,1,1,2) +K ^BMXADOL("B",$E(X,1,30),DA) +"^DD",90093.98,90093.98,.01,3) + +"^DD",90093.98,90093.98,.01,"DT") +3050622 +"^DD",90093.98,90093.98,.02,0) +FILE NUMBER^F^^0;2^K:$L(X)>20!($L(X)<1) X +"^DD",90093.98,90093.98,.02,3) +Answer must be 1-20 characters in length. +"^DD",90093.98,90093.98,.02,"DT") +3050622 +"^DD",90093.98,90093.98,.03,0) +DAS^F^^0;3^K:$L(X)>30!($L(X)<1) X +"^DD",90093.98,90093.98,.03,3) +Answer must be 1-30 characters in length. +"^DD",90093.98,90093.98,.03,"DT") +3050622 +"^DD",90093.98,90093.98,1,0) +DATA^90093.981^^1;0 +"^DD",90093.98,90093.981,0) +DATA SUB-FIELD^^.01^1 +"^DD",90093.98,90093.981,0,"DT") +3050622 +"^DD",90093.98,90093.981,0,"NM","DATA") + +"^DD",90093.98,90093.981,0,"UP") +90093.98 +"^DD",90093.98,90093.981,.01,0) +DATA^W^^0;1^Q +"^DD",90093.98,90093.981,.01,"DT") +3050622 +"^DD",90093.99,90093.99,0) +FIELD^^2^5 +"^DD",90093.99,90093.99,0,"DT") +3040908 +"^DD",90093.99,90093.99,0,"IX","B",90093.99,.01) + +"^DD",90093.99,90093.99,0,"NM","BMX ADO SCHEMA") + +"^DD",90093.99,90093.99,0,"PT",19707.44,.03) + +"^DD",90093.99,90093.99,0,"PT",19707.46,.02) + +"^DD",90093.99,90093.99,0,"PT",19707.48,.01) + +"^DD",90093.99,90093.99,0,"PT",91707.49,.01) + +"^DD",90093.99,90093.99,0,"VRPK") +BMX +"^DD",90093.99,90093.99,.01,0) +SCHEMA NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X +"^DD",90093.99,90093.99,.01,1,0) +^.1 +"^DD",90093.99,90093.99,.01,1,1,0) +90093.99^B +"^DD",90093.99,90093.99,.01,1,1,1) +S ^BMXADO("B",$E(X,1,30),DA)="" +"^DD",90093.99,90093.99,.01,1,1,2) +K ^BMXADO("B",$E(X,1,30),DA) +"^DD",90093.99,90093.99,.01,3) +NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION +"^DD",90093.99,90093.99,.02,0) +FILE OR SUBFILE NUMBER^NJ22,9^^0;2^K:+X'=X!(X>999999999999)!(X<0)!(X?.E1"."10N.N) X +"^DD",90093.99,90093.99,.02,3) +Type a Number between 0 and 999999999999, 9 Decimal Digits +"^DD",90093.99,90093.99,.02,"DT") +3040414 +"^DD",90093.99,90093.99,.03,0) +DATASET IS READ ONLY^S^1:YES;0:NO;^0;3^Q +"^DD",90093.99,90093.99,.03,"DT") +3040420 +"^DD",90093.99,90093.99,1,0) +FIELD NUMBER^90093.991^^1;0 +"^DD",90093.99,90093.99,2,0) +VIEW^90093.992^^2;0 +"^DD",90093.99,90093.991,0) +FIELD NUMBER SUB-FIELD^^3^12 +"^DD",90093.99,90093.991,0,"DT") +3040707 +"^DD",90093.99,90093.991,0,"IX","B",90093.991,.01) + +"^DD",90093.99,90093.991,0,"NM","FIELD NUMBER") + +"^DD",90093.99,90093.991,0,"UP") +90093.99 +"^DD",90093.99,90093.991,.01,0) +FIELD NUMBER^MF^^0;1^K:$L(X)>30!($L(X)<1) X +"^DD",90093.99,90093.991,.01,1,0) +^.1 +"^DD",90093.99,90093.991,.01,1,1,0) +90093.991^B +"^DD",90093.99,90093.991,.01,1,1,1) +S ^BMXADO(DA(1),1,"B",$E(X,1,30),DA)="" +"^DD",90093.99,90093.991,.01,1,1,2) +K ^BMXADO(DA(1),1,"B",$E(X,1,30),DA) +"^DD",90093.99,90093.991,.01,3) +Answer must be 1-30 characters in length. +"^DD",90093.99,90093.991,.01,"DT") +3040528 +"^DD",90093.99,90093.991,.02,0) +DATA TYPE^S^T:TEXT;D:DATE;I:INTEGER;N:NUMBER;^0;2^Q +"^DD",90093.99,90093.991,.02,"DT") +3040413 +"^DD",90093.99,90093.991,.03,0) +FIELD LENGTH^F^^0;3^K:$L(X)>5!($L(X)<1) X +"^DD",90093.99,90093.991,.03,3) +Answer must be 1-5 characters in length. +"^DD",90093.99,90093.991,.03,"DT") +3040413 +"^DD",90093.99,90093.991,.04,0) +COLUMN HEADER^F^^0;4^K:$L(X)>30!($L(X)<1) X +"^DD",90093.99,90093.991,.04,3) +Answer must be 1-30 characters in length. +"^DD",90093.99,90093.991,.04,"DT") +3040413 +"^DD",90093.99,90093.991,.05,0) +READ ONLY^S^1:YES;0:NO;^0;5^Q +"^DD",90093.99,90093.991,.05,"DT") +3040413 +"^DD",90093.99,90093.991,.06,0) +KEY FIELD^S^1:YES;0:NO;^0;6^Q +"^DD",90093.99,90093.991,.06,"DT") +3040413 +"^DD",90093.99,90093.991,.07,0) +NULL ALLOWED^S^1:YES;0:NO;^0;7^Q +"^DD",90093.99,90093.991,.07,"DT") +3040413 +"^DD",90093.99,90093.991,.08,0) +IEN AUTOMATICALLY INCLUDED^S^1:YES;0:NO;^0;8^Q +"^DD",90093.99,90093.991,.08,21,0) +^^6^6^3040528^ +"^DD",90093.99,90093.991,.08,21,1,0) +IF THIS IS 'YES', AN 'UPDATE' FIELD WILL AUTOMATTICALLY BE ADDED TO +"^DD",90093.99,90093.991,.08,21,2,0) +THE SCHEMA. THE FIELD'S VALUE IS 'WRITE ONLY', IE IF THE USER SEES AND +"^DD",90093.99,90093.991,.08,21,3,0) +SELECTS A RESOLVED POINTER VALUE, THIS FIELD'S VALUE WILL BE USED TO +"^DD",90093.99,90093.991,.08,21,4,0) +UPDATE RPMS. THE UPDATE FIELD'S VALUE WILL ALWAYS BE `IEN. THE EBCU +"^DD",90093.99,90093.991,.08,21,5,0) +WILL AUTOMATICALLY USE THIS VALUE RATHER THAN THE RESOLVED POINTER +"^DD",90093.99,90093.991,.08,21,6,0) +VALUE TO UPDATE FILEMAN. +"^DD",90093.99,90093.991,.08,"DT") +3040528 +"^DD",90093.99,90093.991,.09,0) +ALWAYS GET INTERNAL VALUE^S^1:YES;0:NO;^0;9^Q +"^DD",90093.99,90093.991,.09,"DT") +3040528 +"^DD",90093.99,90093.991,1,0) +AUTO IDENTIFIER EXTR FUNCT^F^^1;E1,240^K:$L(X)>19!($L(X)<3) X +"^DD",90093.99,90093.991,1,3) +Answer must be 3-19 characters in length. +"^DD",90093.99,90093.991,1,21,0) +^^3^3^3040528^ +"^DD",90093.99,90093.991,1,21,1,0) +IF THIS EXTRINSIC FUNCTION IS DEFINED (EG TAG^ROUTINE), THEN A DISPLAY ONLY +"^DD",90093.99,90093.991,1,21,2,0) +FIELD WILL BE INCLUDED IN THE SCHEMA THAT CONTAINS IDENTIFIERS (OR OTHER +"^DD",90093.99,90093.991,1,21,3,0) +INFO) GENERATED BY THE EXTRINSIC FUNCTION - ID=$$TAG^ROUTINE(DA) +"^DD",90093.99,90093.991,1,"DT") +3040528 +"^DD",90093.99,90093.991,2,0) +SPECIAL UPDATE EP^F^^2;E1,245^K:$L(X)>19!($L(X)<3) X +"^DD",90093.99,90093.991,2,3) +Answer must be 3-19 characters in length. +"^DD",90093.99,90093.991,2,21,0) +^^2^2^3040528^ +"^DD",90093.99,90093.991,2,21,1,0) +IF THE EP EXISTS(EG TAG^ROUTINE), THIS SPECIAL CODE WILL BE USED TO +"^DD",90093.99,90093.991,2,21,2,0) +UPDATE FILEMAN AND THE EBCU'S STD UPDATE MECHANISM WILL BE BYPASSED. +"^DD",90093.99,90093.991,2,"DT") +3040528 +"^DD",90093.99,90093.991,3,0) +EXTR FUNCT FOR TRIGGERED VALUE^F^^3;E1,245^K:$L(X)>240!($L(X)<1) X +"^DD",90093.99,90093.991,3,3) +Answer must be 1-240 characters in length. +"^DD",90093.99,90093.991,3,"DT") +3040707 +"^DD",90093.99,90093.992,0) +VIEW SUB-FIELD^^3^4 +"^DD",90093.99,90093.992,0,"DT") +3040414 +"^DD",90093.99,90093.992,0,"IX","B",90093.992,.01) + +"^DD",90093.99,90093.992,0,"NM","VIEW") + +"^DD",90093.99,90093.992,0,"UP") +90093.99 +"^DD",90093.99,90093.992,.01,0) +VIEW^MF^^0;1^K:$L(X)>30!($L(X)<1) X +"^DD",90093.99,90093.992,.01,1,0) +^.1 +"^DD",90093.99,90093.992,.01,1,1,0) +90093.992^B +"^DD",90093.99,90093.992,.01,1,1,1) +S ^BMXADO(DA(1),2,"B",$E(X,1,30),DA)="" +"^DD",90093.99,90093.992,.01,1,1,2) +K ^BMXADO(DA(1),2,"B",$E(X,1,30),DA) +"^DD",90093.99,90093.992,.01,3) +Answer must be 1-30 characters in length. +"^DD",90093.99,90093.992,.01,21,0) +^^1^1^3040413^ +"^DD",90093.99,90093.992,.01,21,1,0) +Entry points for clooecting data as well as headers +"^DD",90093.99,90093.992,.01,"DT") +3040413 +"^DD",90093.99,90093.992,1,0) +ENTRY POINT^F^^1;E1,240^K:$L(X)>20!($L(X)<1) X +"^DD",90093.99,90093.992,1,3) +Answer must be 1-20 characters in length. +"^DD",90093.99,90093.992,1,"DT") +3040413 +"^DD",90093.99,90093.992,2,0) +PARAMETER^90093.9922^^2;0 +"^DD",90093.99,90093.992,3,0) +DESCRIPTION^90093.9923^^3;0 +"^DD",90093.99,90093.9922,0) +PARAMETER SUB-FIELD^^.02^2 +"^DD",90093.99,90093.9922,0,"DT") +3040413 +"^DD",90093.99,90093.9922,0,"IX","B",90093.9922,.01) + +"^DD",90093.99,90093.9922,0,"NM","PARAMETER") + +"^DD",90093.99,90093.9922,0,"UP") +90093.992 +"^DD",90093.99,90093.9922,.01,0) +PARAMETER^MF^^0;1^K:$L(X)>30!($L(X)<1) X +"^DD",90093.99,90093.9922,.01,1,0) +^.1 +"^DD",90093.99,90093.9922,.01,1,1,0) +90093.9922^B +"^DD",90093.99,90093.9922,.01,1,1,1) +S ^BMXADO(DA(2),2,DA(1),2,"B",$E(X,1,30),DA)="" +"^DD",90093.99,90093.9922,.01,1,1,2) +K ^BMXADO(DA(2),2,DA(1),2,"B",$E(X,1,30),DA) +"^DD",90093.99,90093.9922,.01,3) +Answer must be 1-30 characters in length. +"^DD",90093.99,90093.9922,.01,"DT") +3040413 +"^DD",90093.99,90093.9922,.02,0) +BRIEF DESCRIPTION^F^^0;2^K:$L(X)>200!($L(X)<1) X +"^DD",90093.99,90093.9922,.02,3) +Answer must be 1-200 characters in length. +"^DD",90093.99,90093.9922,.02,"DT") +3040413 +"^DD",90093.99,90093.9923,0) +DESCRIPTION SUB-FIELD^^.01^1 +"^DD",90093.99,90093.9923,0,"DT") +3040414 +"^DD",90093.99,90093.9923,0,"NM","DESCRIPTION") + +"^DD",90093.99,90093.9923,0,"UP") +90093.992 +"^DD",90093.99,90093.9923,.01,0) +DESCRIPTION^W^^0;1^Q +"^DD",90093.99,90093.9923,.01,"DT") +3040414 +"^DIC",90093.1,90093.1,0) +BMX USER^90093.1 +"^DIC",90093.1,90093.1,0,"GL") +^BMXUSER( +"^DIC",90093.1,"B","BMX USER",90093.1) + +"^DIC",90093.2,90093.2,0) +BMX APPLICATION^90093.2 +"^DIC",90093.2,90093.2,0,"GL") +^BMXAPPL( +"^DIC",90093.2,"B","BMX APPLICATION",90093.2) + +"^DIC",90093.5,90093.5,0) +BMXNET MONITOR^90093.5 +"^DIC",90093.5,90093.5,0,"GL") +^BMXMON( +"^DIC",90093.5,"B","BMXNET MONITOR",90093.5) + +"^DIC",90093.9,90093.9,0) +BMX GUI REPORT^90093.9 +"^DIC",90093.9,90093.9,0,"GL") +^BMXGUIR( +"^DIC",90093.9,"B","BMX GUI REPORT",90093.9) + +"^DIC",90093.98,90093.98,0) +BMX ADO LOG^90093.98D +"^DIC",90093.98,90093.98,0,"GL") +^BMXADOL( +"^DIC",90093.98,"B","BMX ADO LOG",90093.98) + +"^DIC",90093.99,90093.99,0) +BMX ADO SCHEMA^90093.99 +"^DIC",90093.99,90093.99,0,"GL") +^BMXADO( +"^DIC",90093.99,"B","BMX ADO SCHEMA",90093.99) + +**END** +**END** diff --git a/k/xwb_0110_113102.k b/k/xwb_0110_113102.k new file mode 100644 index 0000000..16535c1 --- /dev/null +++ b/k/xwb_0110_113102.k @@ -0,0 +1,706 @@ +KIDS Distribution saved on Dec 07, 2009@11:11:21 +Modified XWB Routine to correct $$OS bug and support BMX.net +**KIDS**:XWB*1.1*113102^ + +**INSTALL NAME** +XWB*1.1*113102 +"BLD",7415,0) +XWB*1.1*113102^RPC BROKER^0^3091207^n +"BLD",7415,1,0) +^9.61A^9^9^3091207^^ +"BLD",7415,1,1,0) +This patch adds support to XWB of routing BMX Broker messages to the +"BLD",7415,1,2,0) +BMXMON routine. As such, it provides a uniform entry point for all broker +"BLD",7415,1,3,0) +messaging. +"BLD",7415,1,4,0) + +"BLD",7415,1,5,0) +Produced on July 22 2009 by Sam Habiel for WorldVista. +"BLD",7415,1,6,0) + +"BLD",7415,1,7,0) +Licensed under WorldVista global license, currently GPL 2. +"BLD",7415,1,8,0) + +"BLD",7415,1,9,0) +**updated on Aug 29th to handle IPv6 addresses for GT.M** +"BLD",7415,4,0) +^9.64PA^^ +"BLD",7415,6.3) +6 +"BLD",7415,"KRN",0) +^9.67PA^8989.52^19 +"BLD",7415,"KRN",.4,0) +.4 +"BLD",7415,"KRN",.401,0) +.401 +"BLD",7415,"KRN",.402,0) +.402 +"BLD",7415,"KRN",.403,0) +.403 +"BLD",7415,"KRN",.5,0) +.5 +"BLD",7415,"KRN",.84,0) +.84 +"BLD",7415,"KRN",3.6,0) +3.6 +"BLD",7415,"KRN",3.8,0) +3.8 +"BLD",7415,"KRN",9.2,0) +9.2 +"BLD",7415,"KRN",9.8,0) +9.8 +"BLD",7415,"KRN",9.8,"NM",0) +^9.68A^1^1 +"BLD",7415,"KRN",9.8,"NM",1,0) +XWBTCPM^^0^B56820596 +"BLD",7415,"KRN",9.8,"NM","B","XWBTCPM",1) + +"BLD",7415,"KRN",19,0) +19 +"BLD",7415,"KRN",19.1,0) +19.1 +"BLD",7415,"KRN",101,0) +101 +"BLD",7415,"KRN",409.61,0) +409.61 +"BLD",7415,"KRN",771,0) +771 +"BLD",7415,"KRN",870,0) +870 +"BLD",7415,"KRN",8989.51,0) +8989.51 +"BLD",7415,"KRN",8989.52,0) +8989.52 +"BLD",7415,"KRN",8994,0) +8994 +"BLD",7415,"KRN","B",.4,.4) + +"BLD",7415,"KRN","B",.401,.401) + +"BLD",7415,"KRN","B",.402,.402) + +"BLD",7415,"KRN","B",.403,.403) + +"BLD",7415,"KRN","B",.5,.5) + +"BLD",7415,"KRN","B",.84,.84) + +"BLD",7415,"KRN","B",3.6,3.6) + +"BLD",7415,"KRN","B",3.8,3.8) + +"BLD",7415,"KRN","B",9.2,9.2) + +"BLD",7415,"KRN","B",9.8,9.8) + +"BLD",7415,"KRN","B",19,19) + +"BLD",7415,"KRN","B",19.1,19.1) + +"BLD",7415,"KRN","B",101,101) + +"BLD",7415,"KRN","B",409.61,409.61) + +"BLD",7415,"KRN","B",771,771) + +"BLD",7415,"KRN","B",870,870) + +"BLD",7415,"KRN","B",8989.51,8989.51) + +"BLD",7415,"KRN","B",8989.52,8989.52) + +"BLD",7415,"KRN","B",8994,8994) + +"BLD",7415,"QDEF") +^^^^NO^^^^NO^^NO +"BLD",7415,"QUES",0) +^9.62^^ +"MBREQ") +0 +"PKG",70,-1) +1^1 +"PKG",70,0) +RPC BROKER^XWB^Remote Procedure Call Broker +"PKG",70,20,0) +^9.402P^^ +"PKG",70,22,0) +^9.49I^1^1 +"PKG",70,22,1,0) +1.1^3020529^2971118^1 +"PKG",70,22,1,"PAH",1,0) +113102^3091207 +"PKG",70,22,1,"PAH",1,1,0) +^^9^9^3091207 +"PKG",70,22,1,"PAH",1,1,1,0) +This patch adds support to XWB of routing BMX Broker messages to the +"PKG",70,22,1,"PAH",1,1,2,0) +BMXMON routine. As such, it provides a uniform entry point for all broker +"PKG",70,22,1,"PAH",1,1,3,0) +messaging. +"PKG",70,22,1,"PAH",1,1,4,0) + +"PKG",70,22,1,"PAH",1,1,5,0) +Produced on July 22 2009 by Sam Habiel for WorldVista. +"PKG",70,22,1,"PAH",1,1,6,0) + +"PKG",70,22,1,"PAH",1,1,7,0) +Licensed under WorldVista global license, currently GPL 2. +"PKG",70,22,1,"PAH",1,1,8,0) + +"PKG",70,22,1,"PAH",1,1,9,0) +**updated on Aug 29th to handle IPv6 addresses for GT.M** +"QUES","XPF1",0) +Y +"QUES","XPF1","??") +^D REP^XPDH +"QUES","XPF1","A") +Shall I write over your |FLAG| File +"QUES","XPF1","B") +YES +"QUES","XPF1","M") +D XPF1^XPDIQ +"QUES","XPF2",0) +Y +"QUES","XPF2","??") +^D DTA^XPDH +"QUES","XPF2","A") +Want my data |FLAG| yours +"QUES","XPF2","B") +YES +"QUES","XPF2","M") +D XPF2^XPDIQ +"QUES","XPI1",0) +YO +"QUES","XPI1","??") +^D INHIBIT^XPDH +"QUES","XPI1","A") +Want KIDS to INHIBIT LOGONs during the install +"QUES","XPI1","B") +NO +"QUES","XPI1","M") +D XPI1^XPDIQ +"QUES","XPM1",0) +PO^VA(200,:EM +"QUES","XPM1","??") +^D MG^XPDH +"QUES","XPM1","A") +Enter the Coordinator for Mail Group '|FLAG|' +"QUES","XPM1","B") + +"QUES","XPM1","M") +D XPM1^XPDIQ +"QUES","XPO1",0) +Y +"QUES","XPO1","??") +^D MENU^XPDH +"QUES","XPO1","A") +Want KIDS to Rebuild Menu Trees Upon Completion of Install +"QUES","XPO1","B") +NO +"QUES","XPO1","M") +D XPO1^XPDIQ +"QUES","XPZ1",0) +Y +"QUES","XPZ1","??") +^D OPT^XPDH +"QUES","XPZ1","A") +Want to DISABLE Scheduled Options, Menu Options, and Protocols +"QUES","XPZ1","B") +NO +"QUES","XPZ1","M") +D XPZ1^XPDIQ +"QUES","XPZ2",0) +Y +"QUES","XPZ2","??") +^D RTN^XPDH +"QUES","XPZ2","A") +Want to MOVE routines to other CPUs +"QUES","XPZ2","B") +NO +"QUES","XPZ2","M") +D XPZ2^XPDIQ +"RTN") +1 +"RTN","XWBTCPM") +0^1^B56820596 +"RTN","XWBTCPM",1,0) +XWBTCPM ;ISF/RWF - BROKER TCP/IP PROCESS HANDLER ; 12/7/09 10:30am +"RTN","XWBTCPM",2,0) + ;;1.1;RPC BROKER;**35,43,49**;Mar 28, 1997;Build 6 +"RTN","XWBTCPM",3,0) + ;Local patch 113102 by WV/SMH for BMX.net support +"RTN","XWBTCPM",4,0) + ;Based on: XWBTCPC & XWBTCPL, Modified by ISF/RWF +"RTN","XWBTCPM",5,0) + ;Changed to be started by UCX or %ZISTCPS +"RTN","XWBTCPM",6,0) + ; +"RTN","XWBTCPM",7,0) +DSM ;DSM called from ucx, % passed in with device. +"RTN","XWBTCPM",8,0) + D ESET +"RTN","XWBTCPM",9,0) + ;Open the device +"RTN","XWBTCPM",10,0) + S XWBTDEV=% X "O XWBTDEV:(TCPDEV):60" ;Special UCX/DSM open +"RTN","XWBTCPM",11,0) + ;Go find the connection type +"RTN","XWBTCPM",12,0) + U XWBTDEV +"RTN","XWBTCPM",13,0) + G CONNTYPE +"RTN","XWBTCPM",14,0) + ; +"RTN","XWBTCPM",15,0) +CACHEVMS ;Cache'/VMS tcpip entry point, called from XWBTCP_START.COM file +"RTN","XWBTCPM",16,0) + D ESET +"RTN","XWBTCPM",17,0) + S XWBTDEV="SYS$NET" +"RTN","XWBTCPM",18,0) + ; **Cache'/VMS specific code** +"RTN","XWBTCPM",19,0) + O XWBTDEV::5 +"RTN","XWBTCPM",20,0) + X "U XWBTDEV:(::""-M"")" ;Packet mode like DSM +"RTN","XWBTCPM",21,0) + G CONNTYPE +"RTN","XWBTCPM",22,0) + ; +"RTN","XWBTCPM",23,0) +NT ;entry from ZISTCPS +"RTN","XWBTCPM",24,0) + ;JOB LISTEN^%ZISTCPS("port","NT^XWBTCPM","stop code") +"RTN","XWBTCPM",25,0) + D ESET +"RTN","XWBTCPM",26,0) + S XWBTDEV=IO +"RTN","XWBTCPM",27,0) + G CONNTYPE +"RTN","XWBTCPM",28,0) + ; +"RTN","XWBTCPM",29,0) +GTMUCX(%) ;From ucx ZFOO +"RTN","XWBTCPM",30,0) + ;If called from LISTEN^%ZISTCP(PORT,"GTM^XWBTCPM") S XWBTDEV=IO +"RTN","XWBTCPM",31,0) + D ESET +"RTN","XWBTCPM",32,0) + ;GTM specific code +"RTN","XWBTCPM",33,0) + S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") +"RTN","XWBTCPM",34,0) + S XWBTDEV=% X "O %:(RECORDSIZE=512)" +"RTN","XWBTCPM",35,0) + G CONNTYPE +"RTN","XWBTCPM",36,0) + ; +"RTN","XWBTCPM",37,0) +GTMLNX ;From Linux xinetd script +"RTN","XWBTCPM",38,0) + D ESET +"RTN","XWBTCPM",39,0) + ;GTM specific code +"RTN","XWBTCPM",40,0) + S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") +"RTN","XWBTCPM",41,0) + S XWBTDEV=$P X "U XWBTDEV:(nowrap:nodelimiter:ioerror=""TRAP"")" +"RTN","XWBTCPM",42,0) + S %="",@("%=$ZTRNLNM(""REMOTE_HOST"")") S:$L(%) IO("GTM-IP")=% +"RTN","XWBTCPM",43,0) + I %["::ffff:" S IO("GTM-IP")=$P(%,"::ffff:",2) ; fake ipv6 support +"RTN","XWBTCPM",44,0) + G CONNTYPE +"RTN","XWBTCPM",45,0) + ; +"RTN","XWBTCPM",46,0) +ESET ;Set inital error trap +"RTN","XWBTCPM",47,0) + S U="^",$ETRAP="D ^%ZTER H" ;Set up the error trap +"RTN","XWBTCPM",48,0) + S X="",@^%ZOSF("TRAP") ;Clear old trap +"RTN","XWBTCPM",49,0) + Q +"RTN","XWBTCPM",50,0) + ;Find the type of connection and jump to the processing routine. +"RTN","XWBTCPM",51,0) +CONNTYPE ; +"RTN","XWBTCPM",52,0) + N XWBDEBUG,XWBAPVER,XWBCLMAN,XWBENVL,XWBLOG,XWBOS,XWBPTYPE +"RTN","XWBTCPM",53,0) + N XWBTBUF,XWBTIP,XWBTSKT,XWBVER,XWBWRAP,XWBSHARE,XWBT +"RTN","XWBTCPM",54,0) + N SOCK,TYPE +"RTN","XWBTCPM",55,0) + D INIT +"RTN","XWBTCPM",56,0) + S XWB=$$BREAD^XWBRW(5,XWBTIME) +"RTN","XWBTCPM",57,0) + D LOG("MSG format is "_XWB_" type "_$S(XWB="[XWB]":"NEW",XWB="{XWB}":"OLD",XWB="0:^XTV(8989.3,1,4,X,0),1:"ROU^y^1") +"RTN","XWBTCPM",70,0) + I $G(^%ZIS(14.5,"LOGON",XWBVOL)) Q 0 ;Check INHIBIT LOGONS? +"RTN","XWBTCPM",71,0) + I $D(^%ZOSF("ACTJ")) X ^("ACTJ") I $P(J,U,3),($P(J,U,3)'>Y) Q 0 +"RTN","XWBTCPM",72,0) + Q 1 +"RTN","XWBTCPM",73,0) + ; +"RTN","XWBTCPM",74,0) +M2M ;M2M Broker +"RTN","XWBTCPM",75,0) + S XWBRBUF=XWB_XWBRBUF,(IO,IO(0))=XWBTDEV G SPAWN^XWBVLL +"RTN","XWBTCPM",76,0) + Q +"RTN","XWBTCPM",77,0) + ; +"RTN","XWBTCPM",78,0) +NEW ;New broker +"RTN","XWBTCPM",79,0) + S U="^",DUZ=0,DUZ(0)="",XWBVER=1.108 +"RTN","XWBTCPM",80,0) + D SETTIME(1) ;Setup for sign-on timeout +"RTN","XWBTCPM",81,0) + U XWBTDEV D +"RTN","XWBTCPM",82,0) + . N XWB,ERR,NATIP,I +"RTN","XWBTCPM",83,0) + . S ERR=$$PRSP^XWBPRS +"RTN","XWBTCPM",84,0) + . S ERR=$$PRSM^XWBPRS +"RTN","XWBTCPM",85,0) + . S MSG=$G(XWB(4,"CMD")) ;Build connect msg. +"RTN","XWBTCPM",86,0) + . S I="" F S I=$O(XWB(5,"P",I)) Q:I="" S MSG=MSG_U_XWB(5,"P",I) +"RTN","XWBTCPM",87,0) + . ;Get the peer and save that IP. +"RTN","XWBTCPM",88,0) + . S NATIP=$$GETPEER^%ZOSV S:'$L(NATIP) NATIP=$P(MSG,"^",2) +"RTN","XWBTCPM",89,0) + . I NATIP'=$P(MSG,"^",2) S $P(MSG,"^",2)=NATIP +"RTN","XWBTCPM",90,0) + . Q +"RTN","XWBTCPM",91,0) + S X=$$NEWJOB() D:'X LOG("No New Connects") +"RTN","XWBTCPM",92,0) + I ($P(MSG,U)'="TCPConnect")!('X) D QSND^XWBRW("reject"),LOG("reject: "_MSG) Q +"RTN","XWBTCPM",93,0) + D QSND^XWBRW("accept"),LOG("accept") ;Ack +"RTN","XWBTCPM",94,0) + S IO("IP")=$P(MSG,U,2),XWBTSKT=$P(MSG,U,3),XWBCLMAN=$P(MSG,U,4) +"RTN","XWBTCPM",95,0) + S XWBTIP=$G(IO("IP")) +"RTN","XWBTCPM",96,0) + ;start RUM for Broker Handler XWB*1.1*5 +"RTN","XWBTCPM",97,0) + D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,1) +"RTN","XWBTCPM",98,0) + ;GTM +"RTN","XWBTCPM",99,0) + I $G(XWBT("PCNT")) D +"RTN","XWBTCPM",100,0) + . S X=$NA(^XUTL("XUSYS",$J,1)) L +@X:0 +"RTN","XWBTCPM",101,0) + . D COUNT^XUSCNT(1),SETLOCK^XUSCNT(X) +"RTN","XWBTCPM",102,0) + ;We don't use a callback +"RTN","XWBTCPM",103,0) + K XWB,CON,LEN,MSG ;Clean up +"RTN","XWBTCPM",104,0) + ;Attempt to share license, Must have TCP port open first. +"RTN","XWBTCPM",105,0) + U XWBTDEV ;D SHARELIC^%ZOSV(1) +"RTN","XWBTCPM",106,0) + ;setup null device "NULL" +"RTN","XWBTCPM",107,0) + S %ZIS="0H",IOP="NULL" D ^%ZIS S XWBNULL=IO I POP S XWBERROR="No NULL device" D ^%ZTER,EXIT Q +"RTN","XWBTCPM",108,0) + D SAVDEV^%ZISUTL("XWBNULL") +"RTN","XWBTCPM",109,0) + ;change process name +"RTN","XWBTCPM",110,0) + D CHPRN("ip"_$P(XWBTIP,".",3,4)_":"_XWBTDEV) +"RTN","XWBTCPM",111,0) + ; +"RTN","XWBTCPM",112,0) +RESTART ;The error trap returns to here +"RTN","XWBTCPM",113,0) + N $ESTACK S $ETRAP="D ETRAP^XWBTCPM" +"RTN","XWBTCPM",114,0) + S DT=$$DT^XLFDT,DTIME=30 +"RTN","XWBTCPM",115,0) + U XWBTDEV D MAIN +"RTN","XWBTCPM",116,0) + D LOG("Exit: "_XWBTBUF) +"RTN","XWBTCPM",117,0) + ;Turn off the error trap for the exit +"RTN","XWBTCPM",118,0) + S $ETRAP="" +"RTN","XWBTCPM",119,0) + D EXIT ;Logout +"RTN","XWBTCPM",120,0) + K XWBR,XWBARY +"RTN","XWBTCPM",121,0) + ;stop RUM for handler XWB*1.1*5 +"RTN","XWBTCPM",122,0) + D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,2) +"RTN","XWBTCPM",123,0) + D USE^%ZISUTL("XWBNULL"),CLOSE^%ZISUTL("XWBNULL") +"RTN","XWBTCPM",124,0) + ;Close in the calling script +"RTN","XWBTCPM",125,0) + K SOCK,TYPE,XWBSND,XWBTYPE,XWBRBUF +"RTN","XWBTCPM",126,0) + Q +"RTN","XWBTCPM",127,0) + ; +"RTN","XWBTCPM",128,0) +MAIN ; -- main message processing loop. debug at MAIN+1 +"RTN","XWBTCPM",129,0) + F D Q:XWBTBUF="#BYE#" +"RTN","XWBTCPM",130,0) + . ;Setup +"RTN","XWBTCPM",131,0) + . S XWBAPVER=0,XWBTBUF="",XWBTCMD="",XWBRBUF="" +"RTN","XWBTCPM",132,0) + . K XWBR,XWBARY,XWBPRT +"RTN","XWBTCPM",133,0) + . ; -- read client request +"RTN","XWBTCPM",134,0) + . S XR=$$BREAD^XWBRW(1,XWBTIME,1) +"RTN","XWBTCPM",135,0) + . I '$L(XR) D LOG("Timeout: "_XWBTIME) S XWBTBUF="#BYE#" Q +"RTN","XWBTCPM",136,0) + . S XR=XR_$$BREAD^XWBRW(4) +"RTN","XWBTCPM",137,0) + . I XR="#BYE#" D Q ;Check for exit +"RTN","XWBTCPM",138,0) + . . D QSND^XWBRW("#BYE#"),LOG("BYE CMD") S XWBTBUF="#BYE#" +"RTN","XWBTCPM",139,0) + . . Q +"RTN","XWBTCPM",140,0) + . S TYPE=(XR="[XWB]") ;check HDR +"RTN","XWBTCPM",141,0) + . I 'TYPE D LOG("Bad Header: "_XR) Q +"RTN","XWBTCPM",142,0) + . D CALLP^XWBPRS(.XWBR,$G(XWBDEBUG)) ;Read the NEW Msg parameters and call RPC +"RTN","XWBTCPM",143,0) + . IF XWBTCMD="#BYE#" D Q +"RTN","XWBTCPM",144,0) + . . D QSND^XWBRW("#BYE#"),LOG("BYE CMD") S XWBTBUF=XWBTCMD +"RTN","XWBTCPM",145,0) + . . Q +"RTN","XWBTCPM",146,0) + . U XWBTDEV +"RTN","XWBTCPM",147,0) + . S XWBPTYPE=$S('$D(XWBPTYPE):1,XWBPTYPE<1:1,XWBPTYPE>6:1,1:XWBPTYPE) +"RTN","XWBTCPM",148,0) + . ;I $G(XWBPRT) D RETURN^XWBPRS2 Q ;New msg return +"RTN","XWBTCPM",149,0) + . I '$G(XWBPRT) D SND^XWBRW ;Return data,flush buffer +"RTN","XWBTCPM",150,0) + Q ;End Of Main +"RTN","XWBTCPM",151,0) + ; +"RTN","XWBTCPM",152,0) + ; +"RTN","XWBTCPM",153,0) +ETRAP ; -- on trapped error, send error info to client +"RTN","XWBTCPM",154,0) + N XWBERC,XWBERR +"RTN","XWBTCPM",155,0) + ;Change trapping during trap. +"RTN","XWBTCPM",156,0) + S $ETRAP="D ^%ZTER,EXIT^XWBTCPM HALT" +"RTN","XWBTCPM",157,0) + S XWBERC=$E($$EC^%ZOSV,1,200),XWBERR="M ERROR="_XWBERC_$C(13,10)_"LAST REF="_$$LGR^%ZOSV +"RTN","XWBTCPM",158,0) + I $EC["U411" S XWBERROR="U411",XWBSEC="",XWBERR="Data Transfer Error to Server" +"RTN","XWBTCPM",159,0) + D ^%ZTER ;%ZTER clears $ZE and $ZCODE +"RTN","XWBTCPM",160,0) + D LOG("In ETRAP: "_XWBERC) ;Log +"RTN","XWBTCPM",161,0) + I (XWBERC["READ")!(XWBERC["WRITE")!(XWBERC["SYSTEM-F")!(XWBERC["IOEOF") D EXIT HALT +"RTN","XWBTCPM",162,0) + U XWBTDEV +"RTN","XWBTCPM",163,0) + I $G(XWBT("PCNT")) L ^XUTL("XUSYS",$J,0) +"RTN","XWBTCPM",164,0) + E L ;Clear Locks +"RTN","XWBTCPM",165,0) + ;I XWBOS'="DSM" D +"RTN","XWBTCPM",166,0) + S XWBPTYPE=1 ;So SNDERR won't check XWBR +"RTN","XWBTCPM",167,0) + ;D SNDERR^XWBRW,WRITE^XWBRW($C(24)_XWBERR_$C(4)) +"RTN","XWBTCPM",168,0) + D ESND^XWBRW($C(24)_XWBERR_$C(4)) +"RTN","XWBTCPM",169,0) + S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" D CLEANP^XWBTCPM G RESTART^XWBTCPM",$ECODE=",U99," +"RTN","XWBTCPM",170,0) + Q +"RTN","XWBTCPM",171,0) + ; +"RTN","XWBTCPM",172,0) +CLEANP ;Clean up the partion +"RTN","XWBTCPM",173,0) + N XWBTDEV,XWBNULL D KILL^XUSCLEAN +"RTN","XWBTCPM",174,0) + Q +"RTN","XWBTCPM",175,0) + ; +"RTN","XWBTCPM",176,0) +STYPE(X,WRAP) ;For backward compatability only +"RTN","XWBTCPM",177,0) + I $D(WRAP) Q $$RTRNFMT^XWBLIB($G(X),WRAP) +"RTN","XWBTCPM",178,0) + Q $$RTRNFMT^XWBLIB(X) +"RTN","XWBTCPM",179,0) + ; +"RTN","XWBTCPM",180,0) +BREAD(L,T) ;read tcp buffer, L is length +"RTN","XWBTCPM",181,0) + Q $$BREAD^XWBRW(L,$G(T)) +"RTN","XWBTCPM",182,0) + ; +"RTN","XWBTCPM",183,0) +CHPRN(N) ;change process name +"RTN","XWBTCPM",184,0) + ;Change process name to N +"RTN","XWBTCPM",185,0) + D SETNM^%ZOSV($E(N,1,15)) +"RTN","XWBTCPM",186,0) + Q +"RTN","XWBTCPM",187,0) + ; +"RTN","XWBTCPM",188,0) +SETTIME(%) ;Set the Read timeout 0=RPC, 1=sign-on +"RTN","XWBTCPM",189,0) + S XWBTIME=$S($G(%):90,$G(XWBVER)>1.105:$$BAT^XUPARAM,1:36000),XWBTIME(1)=2 +"RTN","XWBTCPM",190,0) + I $G(%) S XWBTIME=$S($G(XWBVER)>1.1:90,1:36000) +"RTN","XWBTCPM",191,0) + Q +"RTN","XWBTCPM",192,0) +TIMEOUT ;Do this on MAIN loop timeout +"RTN","XWBTCPM",193,0) + I $G(DUZ)>0 D QSND^XWBRW("#BYE#") Q +"RTN","XWBTCPM",194,0) + ;Sign-on timeout +"RTN","XWBTCPM",195,0) + S XWBR(0)=0,XWBR(1)=1,XWBR(2)="",XWBR(3)="TIME-OUT",XWBPTYPE=2 +"RTN","XWBTCPM",196,0) + D SND^XWBRW +"RTN","XWBTCPM",197,0) + Q +"RTN","XWBTCPM",198,0) + ; +"RTN","XWBTCPM",199,0) +OS() ;Return the OS +"RTN","XWBTCPM",200,0) + ; Q $S(^%ZOSF("OS")["DSM":"DSM",^("OS")["UNIX":"UNIX",^("OS")["OpenM":"OpenM",1:"MSM") //SMH +"RTN","XWBTCPM",201,0) + Q $S(^%ZOSF("OS")["DSM":"DSM",^("OS")["GT.M":"GT.M",^("OS")["OpenM":"OpenM",1:"MSM") +"RTN","XWBTCPM",202,0) + ; +"RTN","XWBTCPM",203,0) +INIT ;Setup +"RTN","XWBTCPM",204,0) + S U="^",XWBTIME=10,XWBOS=$$OS,XWBDEBUG=0,XWBRBUF="" +"RTN","XWBTCPM",205,0) + S XWBDEBUG=$$GET^XPAR("SYS","XWBDEBUG") +"RTN","XWBTCPM",206,0) + S XWBT("BF")=$S(XWBOS="GT.M":"#",1:"!") +"RTN","XWBTCPM",207,0) + S XWBT("PCNT")=0 I XWBOS="GT.M",$L($T(^XUSCNT)) S XWBT("PCNT")=1 +"RTN","XWBTCPM",208,0) + D LOGSTART^XWBDLOG("XWBTCPM") +"RTN","XWBTCPM",209,0) + Q +"RTN","XWBTCPM",210,0) + ; +"RTN","XWBTCPM",211,0) +DEBUG ;Entry point for debug, Build a server to get the connect +"RTN","XWBTCPM",212,0) + ;DSM sample;ZDEBUG ON S $ZB(1)="SERV+1^XWBTCPM:1",$ZB="ETRAP+1^XWBTCPM:1" +"RTN","XWBTCPM",213,0) + W !,"Before running this entry point set your debugger to stop at" +"RTN","XWBTCPM",214,0) + W !,"the place you want to debug. Some spots to use:" +"RTN","XWBTCPM",215,0) + W !,"'SERV+1^XWBTCPM', 'MAIN+1^XWBTCPM' or 'CAPI+1^XWBPRS.'",! +"RTN","XWBTCPM",216,0) + W !,"or location of your choice.",! +"RTN","XWBTCPM",217,0) + W !,"IP Socket to Listen on: " R SOCK:300 Q:'$T!(SOCK["^") +"RTN","XWBTCPM",218,0) + ;Use %ZISTCP to do a single server +"RTN","XWBTCPM",219,0) + D LISTEN^%ZISTCP(SOCK,"SERV^XWBTCPM") +"RTN","XWBTCPM",220,0) + U $P W !,"Done" +"RTN","XWBTCPM",221,0) + Q +"RTN","XWBTCPM",222,0) +SERV ;Callback from the server +"RTN","XWBTCPM",223,0) + S XWBTDEV=IO,XWBTIME(1)=3600 D INIT +"RTN","XWBTCPM",224,0) + S XWBDEBUG=1,MSG=$$BREAD^XWBRW(5,60) ;R MSG#5 +"RTN","XWBTCPM",225,0) + D NEW +"RTN","XWBTCPM",226,0) + S IO("C")=1 ;Cause the Listenr to stop +"RTN","XWBTCPM",227,0) + Q +"RTN","XWBTCPM",228,0) + ; +"RTN","XWBTCPM",229,0) +EXIT ;Close out +"RTN","XWBTCPM",230,0) + I $G(DUZ) D LOGOUT^XUSRB +"RTN","XWBTCPM",231,0) + I $G(XWBT("PCNT")) D COUNT^XUSCNT(-1) +"RTN","XWBTCPM",232,0) + Q +"RTN","XWBTCPM",233,0) + ; +"RTN","XWBTCPM",234,0) +LOG(MSG) ;Record Debug Info +"RTN","XWBTCPM",235,0) + D:$G(XWBDEBUG) LOG^XWBDLOG(MSG) +"RTN","XWBTCPM",236,0) + Q +"RTN","XWBTCPM",237,0) + ; +"VER") +8.0^22.0 +**END** +**END** diff --git a/m/BMXADE1.m b/m/BMXADE1.m new file mode 100644 index 0000000..9095db9 --- /dev/null +++ b/m/BMXADE1.m @@ -0,0 +1,83 @@ +BMXADE1 ; IHS/OIT/HMW - BMXNet ADO.NET PROVIDER ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; + ;Dental Excel report demo + ; +BMXADE(BMXGBL,BMXBEG,BMXEND) ;EP + ;Returns recordset containing services and minutes by reporting facility, patient's community and service unit + ; + N BMXBEGDT,BMXENDDT,BMXTMP,BMXDT,BMXRD,BMXIEN,BMXNOD,BMXPAT,BMXCOM,BMXFAC,BMXSU,BMXCOMP,BMXSUP,BMXFACP,BMXSVC,BMXMIN,BMXFEE + S U="^",BMXRD=$C(30) + K ^BMXTEMP($J),^BMXTMP($J) + S BMXGBL="^BMXTEMP("_$J_")" + S ^BMXTEMP($J,0)="T00030FACILITY^T00030PT_COMMUNITY^T00030PT_SERVICE_UNIT^I00030SERVICES^I00030MINUTES^I00030FEE"_BMXRD + S X=BMXBEG,%DT="P" D ^%DT S BMXBEGDT=Y + S X=BMXEND,%DT="P" D ^%DT S BMXENDDT=Y + I BMXENDDTBMXENDDT D + . S BMXIEN=0 F S BMXIEN=$O(^ADEPCD("AC",BMXDT,BMXIEN)) Q:'+BMXIEN D + . . Q:'$D(^ADEPCD(BMXIEN,0)) + . . S BMXNOD=^ADEPCD(BMXIEN,0) + . . S BMXPAT=$P(BMXNOD,U) + . . S BMXFACP=+$P(BMXNOD,U,3) + . . S BMXCOMP=$$GETCOMP(BMXPAT) + . . D CALCMIN(BMXIEN,.BMXSVC,.BMXMIN,.BMXFEE) + . . Q:BMXSVC=0 + . . S:'$D(^BMXTMP($J,BMXFACP,BMXCOMP)) ^BMXTMP($J,BMXFACP,BMXCOMP)="0^0^0" + . . S $P(^BMXTMP($J,BMXFACP,BMXCOMP),U)=$P(^(BMXCOMP),U)+BMXSVC + . . S $P(^BMXTMP($J,BMXFACP,BMXCOMP),U,2)=$P(^(BMXCOMP),U,2)+BMXMIN + . . S $P(^BMXTMP($J,BMXFACP,BMXCOMP),U,3)=$P(^(BMXCOMP),U,3)+BMXFEE + . . Q + . Q + ; + ;Traverse ^BMXTMP and fill in ^BMXTEMP + S BMXI=0 + S BMXFACP=-1 F S BMXFACP=$O(^BMXTMP($J,BMXFACP)) Q:BMXFACP="" D + . I BMXFACP=0 S BMXFAC="UNKNOWN" + . E S BMXFAC=$P($G(^DIC(4,BMXFACP,0)),U) S:BMXFAC="" BMXFAC="UNKNOWN" + . S BMXCOMP=-1 F S BMXCOMP=$O(^BMXTMP($J,BMXFACP,BMXCOMP)) Q:BMXCOMP="" D + . . I BMXCOMP=0 S BMXCOM="UNKNOWN" + . . E S BMXCOM=$P($G(^AUTTCOM(BMXCOMP,0)),U) S:BMXCOM="" BMXCOM="UNKNOWN" + . . S BMXSU=+$P($G(^AUTTCOM(BMXCOMP,0)),U,5) + . . I BMXSU=0 S BMXSU="UNKNOWN" + . . E S BMXSU=$P($G(^AUTTSU(BMXSU,0)),U) + . . S BMXI=BMXI+1 + . . S BMXSVC=$P(^BMXTMP($J,BMXFACP,BMXCOMP),U) + . . S BMXMIN=$P(^BMXTMP($J,BMXFACP,BMXCOMP),U,2) + . . S BMXFEE=$P(^BMXTMP($J,BMXFACP,BMXCOMP),U,3) + . . S ^BMXTEMP($J,BMXI)=BMXFAC_U_BMXCOM_U_BMXSU_U_BMXSVC_U_BMXMIN_U_BMXFEE_BMXRD + . . Q + . Q + S BMXI=BMXI+1 + S ^BMXTEMP($J,BMXI)=$C(31) + Q + ; +GETCOMP(BMXPAT) ; + ;Returns Patient Community Pointer + I '$D(^AUPNPAT(BMXPAT,11)) Q 0 + Q +$P(^AUPNPAT(BMXPAT,11),U,17) + ; +CALCMIN(BMXIEN,BMXSVC,BMXMIN,BMXFEE) ; + ;Returns count of lvl 1 - 6 services and minutes for entry BMXIEN + ;Uses ANMC rogue FEE field in AUTTADA to calculate FEE data + N BMXA,BMXCOD,BMXALVL + S BMXSVC=0,BMXMIN=0,BMXFEE=0 + Q:'$D(^ADEPCD(BMXIEN,"ADA")) + S BMXA=0 F S BMXA=$O(^ADEPCD(BMXIEN,"ADA",BMXA)) Q:'+BMXA D + . S BMXCOD=+^ADEPCD(BMXIEN,"ADA",BMXA,0) + . Q:'$D(^AUTTADA(BMXCOD,0)) + . S BMXANOD=^AUTTADA(BMXCOD,0) + . S BMXALVL=$P(BMXANOD,U,5) + . Q:BMXALVL=0 + . Q:BMXALVL>6 + . S BMXSVC=BMXSVC+1 + . S BMXMIN=BMXMIN+$P(BMXANOD,U,4) + . S BMXFEE=BMXFEE+$P(BMXANOD,U,12) + Q diff --git a/m/BMXADE2.m b/m/BMXADE2.m new file mode 100644 index 0000000..a8a4a68 --- /dev/null +++ b/m/BMXADE2.m @@ -0,0 +1,90 @@ +BMXADE2 ; IHS/OIT/HMW - BMXNet ADO.NET PROVIDER ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; + ;Dental Excel report demo + ; +BMXADE(BMXGBL,BMXBEG,BMXEND) ;EP + ;Returns recordset containing services and minutes by reporting facility, Provider, and ADA Code + ; + N BMXBEGDT,BMXENDDT,BMXTMP,BMXDT,BMXRD,BMXIEN,BMXNOD,BMXCOM,BMXFAC,BMXSU,BMXCOMP,BMXSUP,BMXFACP,BMXSVC,BMXMIN,BMXLVL,BMXFEE + S U="^",BMXRD=$C(30) + K ^BMXTEMP($J),^BMXTMP($J) + S BMXGBL="^BMXTEMP("_$J_")" + S ^BMXTEMP($J,0)="T00030FACILITY^T00030PROVIDER^T00030ADA_CODE^T00030LEVEL^I00030SERVICES^I00030MINUTES^I00030FEE"_BMXRD + S X=BMXBEG,%DT="P" D ^%DT S BMXBEGDT=Y + S X=BMXEND,%DT="P" D ^%DT S BMXENDDT=Y + I BMXENDDTBMXENDDT D + . S BMXIEN=0 F S BMXIEN=$O(^ADEPCD("AC",BMXDT,BMXIEN)) Q:'+BMXIEN D + . . Q:'$D(^ADEPCD(BMXIEN,0)) + . . S BMXNOD=^ADEPCD(BMXIEN,0) + . . S BMXFACP=+$P(BMXNOD,U,3) + . . S BMXPRVP=+$P(BMXNOD,U,4) + . . S BMXCODP=0 F S BMXCODP=$O(^ADEPCD(BMXIEN,"ADA","B",BMXCODP)) Q:'+BMXCODP D + . . . D CALCMIN(BMXCODP,.BMXMIN) + . . . D CALCFEE(BMXCODP,.BMXFEE) + . . . S BMXCODPS=0,BMXSVC=0 F S BMXCODPS=$O(^ADEPCD(BMXIEN,"ADA","B",BMXCODP,BMXCODPS)) Q:'+BMXCODPS D + . . . . S BMXSVC=BMXSVC+1 + . . . S:'$D(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP)) ^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP)="0^0" + . . . S $P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U)=$P(^(BMXCODP),U)+BMXSVC + . . . S $P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,2)=$P(^(BMXCODP),U,2)+(BMXSVC*BMXMIN) + . . . S $P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,3)=$P(^(BMXCODP),U,3)+(BMXSVC*BMXFEE) + . . . Q + . . Q + . Q + ; + ;Traverse ^BMXTMP and fill in ^BMXTEMP + S BMXI=0 + S BMXFACP=-1 F S BMXFACP=$O(^BMXTMP($J,BMXFACP)) Q:BMXFACP="" D + . I BMXFACP=0 S BMXFAC="UNKNOWN" + . E S BMXFAC=$P($G(^DIC(4,BMXFACP,0)),U) S:BMXFAC="" BMXFAC="UNKNOWN" + . S BMXPRVP=-1 F S BMXPRVP=$O(^BMXTMP($J,BMXFACP,BMXPRVP)) Q:BMXPRVP="" D + . . S BMXPRV=$P($G(^DIC(16,BMXPRVP,0)),U) S:BMXPRV="" BMXPRV="UNKNOWN" + . . S BMXCODP=-1 F S BMXCODP=$O(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP)) Q:'+BMXCODP D + . . . D CODLVL(BMXCODP,.BMXCOD,.BMXLVL) + . . . S BMXI=BMXI+1 + . . . S BMXSVC=$P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U) + . . . S BMXMIN=$P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,2) + . . . S BMXFEE=$P(^BMXTMP($J,BMXFACP,BMXPRVP,BMXCODP),U,3) + . . . S ^BMXTEMP($J,BMXI)=BMXFAC_U_BMXPRV_U_BMXCOD_U_BMXLVL_U_BMXSVC_U_BMXMIN_U_BMXFEE_BMXRD + . . . Q + . . Q + . Q + S BMXI=BMXI+1 + S ^BMXTEMP($J,BMXI)=$C(31) + Q + ; +CALCMIN(BMXCODP,BMXMIN) ; + ;Returns Minutes for code BMXCOD + N BMXANOD + S BMXMIN=0 + Q:'$D(^AUTTADA(BMXCODP,0)) + S BMXANOD=^AUTTADA(BMXCODP,0) + ;S BMXLVL=$P(BMXANOD,U,5) + S BMXMIN=$P(BMXANOD,U,4) + Q + ; +CALCFEE(BMXCODP,BMXFEE) ; + ;Returns FEE for code BMXCOD. Only works for ANMC local fee field + N BMXANOD + S BMXFEE=0 + Q:'$D(^AUTTADA(BMXCODP,0)) + S BMXANOD=^AUTTADA(BMXCODP,0) + S BMXFEE=+$P(BMXANOD,U,12) + Q + ; +CODLVL(BMXCODP,BMXCOD,BMXLVL) ; + ;Returns Name and Level of code at ADACODP + N BMXANOD + S BMXCOD="",BMXLVL="" + Q:'$D(^AUTTADA(BMXCODP,0)) + S BMXANOD=^AUTTADA(BMXCODP,0) + S BMXCOD=$P(BMXANOD,U) + S BMXLVL=$P(BMXANOD,U,5) diff --git a/m/BMXADO.m b/m/BMXADO.m new file mode 100644 index 0000000..03ae618 --- /dev/null +++ b/m/BMXADO.m @@ -0,0 +1,157 @@ +BMXADO ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; + ;;2.1;BMX;;Jul 26, 2009 + ; SS^BMXADO: RPC EP FROM WINDOWS/WEB APP TO GENERATE A SCHEMEA STRING (& OPTIONALLY, A DATA SET AS WELL) + ; THE SCHEMA DEFINITION AND MAP IS STORED IN THE 'BMX ADO SCHEMA' FILE + ; THIS ROUTINE GENERATES THE SCHEMA STRING. BMXADOV GENERATES THE DATA SET THAT GOES WITH THE SCHEMA STRING. + ; IF THERE IS AN ERROR, XXX(1) WILL CONTAIN "ERROR|msg"_$C(30) WHERE 'msg' IS THE ERROR MESSAGE + ; E.G."ERROR|Invalid schema IEN" + ; + ; +SSD(OUT,SIEN,DAS,VSTG,JSTG) ;Debug entry point + D DEBUG^%Serenji("SS^BMXADO(.OUT,SIEN,DAS,VSTG,JSTG)") ; DEBUGGER ENTRY POINT + Q + ; + ; +SS(OUT,SIEN,DAS,VSTG,JSTG) ; EP - RETURN THE SCHEMA STRING IN AN ARRAY + ; OUT=OUTPUT VARIABLE (PASSED BY REFERENCE) + ; THE OUTPUT ARRAY IS GENERATED FROM DATA IN THE 'BMX ADO SCHEMA' FILE AND THE FILEMAN DATABASE + ; RECORDS ARE SEPARATED WITH $C(30). FIELDS ARE SEPARATED BY "^". FIELD PROPERTIES ARE SEPARATED BY "|". + ; ONE RECORD PER OUTPUT NODE. + ; 1ST RECORD IS THE "INTRODUCTION RECORD": "@@@meta@@@BMXIEN|FILE #|DA STRING" + ; THE SECOND RECORD IS THE HEADER RECORD. THE REST ARE THE DATA RECORDS + ; RECORD FORMAT: FILE#|FIELD#|DATA TYPE|LENGTH|FIELDNAME|READONLY|KEYFIELD|NULLOK_$C(30) + ; SIEN=SCHEMA NAME OR IEN FROM BMX ADO SCHEMA FILE + ; DAS= "DA" STRING: STRING FOR DEFINING PARENT FILES + ; EXAMPLE: "4,8," CORRESPONDS TO DA(2), DA(1). + ; PRIMARILY USED AS A "SEED" FOR RE-ENTRY - IF INDEX IS PRESENT. + ; IF NOT A SEED, DO NOT INCLUDE THE BOTTOM LEVEL IEN: DA; E.G., "4,8," + ; DO NOT CONFUSE WITH "IENS STRING" OF FILEMAN SILENT CALLS + ; VSTG=VIEW STRING INSTRUCTIONS (SEE BMXADOV FOR DETAILS) + ; JSTG=JOIN STRING INSTRUCTIONS (SEE BMXADOVJ FOR DETAILS) + ; + N X,Y,DIC,ERR + S OUT=$NA(^TMP("BMX ADO",$J)) K @OUT ; DEFINE THE OUTPUT ARRAY CLOSED REFERENCE + X ("S "_$C(68)_"UZ(0)=$C(64)") ; INSURE PRIVELEGES + S X="MERR^BMXADO",@^%ZOSF("TRAP") ; SET MUMPS ERROR TRAP + I '$L(SIEN) S ERR="Missing schema ID" D ERR(ERR) Q + I 'SIEN S DIC="^BMXADO(",DIC(0)="M",X=SIEN D ^DIC S SIEN=+Y I Y=-1 S ERR="Invalid schema ID" D ERR(ERR) Q + I '$D(^BMXADO(SIEN,0)) S ERR="Invalid/missing schema" D ERR(ERR) Q ; SCHEMA MUST EXIST + N FIEN,FLDIEN,TOT,STG,B,C,X,%,LEVEL,Y,SF + S FIEN=$P(^BMXADO(SIEN,0),U,2) + I '$D(^DD(FIEN,0)) S ERR="Invalid/missing file number in schema file" D ERR(ERR) Q ; INVALID FILE NUMBER + S SF=$$CKSUB(FIEN,DAS) I SF=-1 S ERR="Invalid DA string" D ERR(ERR) Q ; INVALID DA STRING + S C=",",B="|",TOT=0 ; THESE LOCALS, ALONG WITH KERNEL VARIABLES, ARE ALWAYS AVAILABLE TO ALL ROUTINES AND SUBROUTINES +JEP ; EP-RECURSION RE-ENTRY POINT FOR JOINS + I $G(SUB),$G(SF) S ERR="Invalid request" D ERR(ERR) Q ; CAN'T DO JOIN WITH A SUBFILE AS THE PRIMARY FILE + S TOT=TOT+1,@OUT@(TOT)="@@@meta@@@BMXIEN"_B_FIEN_B_DAS_U + I $G(SUB) S TOT=TOT+1,@OUT@(TOT)=FIEN_"|.0001|N|15|DA(1)|TRUE|FALSE|FALSE^" + I $G(SF) D SFH(SF) ; SUBFILE HEADERS + S TOT=TOT+1,@OUT@(TOT)=FIEN_"|.001|N|15|BMXIEN|TRUE|TRUE|FALSE^" ; KEY FIELD PART OF HEADER RECORD + S FLDIEN=0 + F S FLDIEN=$O(^BMXADO(SIEN,1,FLDIEN)) Q:'FLDIEN S STG=$G(^BMXADO(SIEN,1,FLDIEN,0)) I $L(STG) D ; REST OF HEADER RECORD + . S X=FIEN_B_$P(STG,U)_B_$P(STG,U,2)_B_$P(STG,U,3)_B_$P(STG,U,4)_B + . S %=$S($P(STG,U,5):"TRUE",$P($G(^BMXADO(+$G(IEN),0)),U,3):"TRUE",1:"FALSE") S X=X_%_B ; READ ONLY + . S %=$S($P(STG,U,6):"TRUE",1:"FALSE") S X=X_%_B ; THIS IS A KEY FIELD + . S %=$S($P(STG,U,7):"TRUE",1:"FALSE") S X=X_%_U ; NULL VALUE IS OK (NOT MANDATORY FOR TRANSACTION) + . S TOT=TOT+1 + . S @OUT@(TOT)=X + . Q + I TOT'>2 Q ; NOTHING TO PROCESS + S %=@OUT@(TOT) I $E(%,$L(%))=U S $E(%,$L(%))=$C(30),@OUT@(TOT)=% ; END OF RECORD MARKER + I $G(VSTG)="",$G(DFLD)=.001 S VSTG="~~~" ; SIMPLE LOOKUP INTO DETAILS FILE BY IEN + I '$L($G(VSTG)) Q ; REQUEST IS FOR SCHEMA ONLY - NO DATA +DATASET S VSTG=SIEN_"~"_DAS_"~"_VSTG + I $O(^TMP("BMX JOIN",$J,1,+$G(SDETAIL),0)) D JVIEW Q ; JOIN ITERATION ; NO SUPPORT FOR EXTENDED JOINS + D VIEW^BMXADOV(.OUT,VSTG,.TOT) ; APPEND A DATA SET TO A SCHEMA STRING + I '$L($G(JSTG)) S JSTG=$P(VSTG,"~",11,999) ; INCLUDED FOR BKWD COMPATIBILITY ;JOIN INSTRUCTIONS SPAN MULTIPLE ~ PIECES (11,999) BECAUSE OF POSSIBLE NESTED VSTG + I $L(JSTG) D JOIN^BMXADOVJ(SIEN,JSTG) ; ADD DATA SET(S) TO FULFIL THE JOIN REQUEST + Q + ; +JVIEW ; JOIN VIEW - SET XCNT AND RESET THE VSTG + N XCNT,DA,NODE,% + S NODE=999999999999 + F S NODE=$O(@OUT@(NODE),-1) Q:'NODE I @OUT@(NODE)["|.001|" Q + I 'NODE Q ; INVALID SCHEMA - JOIN CANCELLED + I '$L($P(VSTG,"~",3)),'$G(SUB),$G(DFLD)'=.001 Q ; THERE MUST BE AN INDEX OR SUBFILE FOR A JOIN TO TAKE PLACE + D JFLD^BMXADOVJ ; STUFF VALUES FOR JOIN FLDS INTO INTRO SEGMENT OF THE SCHEMA + S XCNT=NODE + S DA=0 + F S DA=$O(^TMP("BMX JOIN",$J,1,SDETAIL,DA)) Q:'DA D D VIEW^BMXADOV(.OUT,VSTG,.TOT) ; APPEND JOINED DATA SETS TO A SCHEMA STRING + . I $P(VSTG,"~",3)="AA",$L($P(VSTG,"~",10)) D Q + .. S %=$P(VSTG,"~",10) + .. S $P(%,"|",1)=DA + .. S $P(VSTG,"~",10)=% + .. Q + . I $G(SUB) S DAS=DA_",",VSTG=SDETAIL_"~"_DA_",~~" Q ; SUBFILE ITERATOR + . I $P(VSTG,"~",3)="AA",$G(FIEN)=9000011 S $P(VSTG,"~",4,5)=DA_"~"_DA Q ; PROBLEM LIST ITERATOR + . S $P(VSTG,"~",4,5)=DA_"~"_DA ; SINGLE IEN ITERATOR + . Q + Q + ; +SFH(DAS) ; SUBFILE HEADERS + N L,LEV,PCE,X,%,Z,FLD + S Z="000000000",L=$L(DAS,",") + F PCE=1:1:L-1 D + . S LEV=(L+1)-PCE + . S FLD="."_$E(Z,1,LEV+1)_1 + . S TOT=TOT+1 + . S @OUT@(TOT)=FIEN_B_FLD_"|I|10|BMXIEN"_(LEV-1)_"|TRUE|TRUE|FALSE"_U ; FIX + . Q + Q + ; +CKSUB(FILE,DAS) ; CHECK THE DA STRING FOR VALIDITY AND MAKE THE DA ARRAY + N LEVEL,FIEN + S FIEN=FILE + F LEVEL=1:1 S FIEN=$G(^DD(FIEN,0,"UP")) Q:'FIEN ; COUNT THE LEVELS + I LEVEL'=$L($G(DAS),",") Q -1 ; LEVEL MATCHES DA STRING + I LEVEL=1 Q "" ; INVALID DA STRING + Q DAS + ; +LINE(FILE) ; GET FIELD VALUES + N LINE,NODE,STG,DIR,FLD,PF,SET,X,DS,DP + S LINE="" + S NODE=2,Y="" F S NODE=$O(ARR(NODE)) Q:'NODE S STG=ARR(NODE) I $L(STG) D I Y=U Q + . S FLD=$P(STG,B,2) I 'FLD S Y=U Q + . I $P(STG,B,6)="TRUE" Q ; READ ONLY + . S DIR("A")=$P(STG,B,5) I '$L(DIR("A")) S Y=U Q + . S X=$P($G(^DD(+$G(FILE),FLD,0)),U,2) + . I X["P" D Q + .. S PF=+$P(X,"P",2) I 'PF S Y=U Q + .. S DIR(0)="P^"_PF_":EQMZ" + .. D DIR + .. Q + . I X["S" D Q + .. S DIR(0)="S^"_$P(^DD(FILE,FLD,0),U,3) + .. D DIR + .. Q + . I X["D" D Q + .. S DS=$P(^DD(FILE,FLD,0),U,5) + .. I DS'["%DT=""" S DIR(0)="D^::EX" D DIR Q + .. S DP=$P(DS,"%DT="_$C(34),2) S DP=$P(DP,$C(34,32),1) + .. S DIR(0)="D^::"_DP + .. D DIR + .. Q + . S DIR="F" + . D DIR + . Q + Q LINE + ; +DIR D ^DIR + I Y?1."^" S Y=U Q + I Y?1.N1"^".E S Y="`"_+Y + S LINE=LINE_U_Y + Q + ; +MERR ; MUMPS ERROR TRAP + N X + X ("S X=$"_"ZE") + S X="MUMPS error: """_X_"""" + D ERR(X) + Q + ; +ERR(ERR) ;EP - BMX ADO SCHEMA ERROR PROCESSOR + N X + S X="ERROR|"_ERR_$C(30) + S @OUT@(1)=X + Q + ; diff --git a/m/BMXADO2.m b/m/BMXADO2.m new file mode 100644 index 0000000..3087d9f --- /dev/null +++ b/m/BMXADO2.m @@ -0,0 +1,80 @@ +BMXADO2 ; IHS/CIHA/GIS - BMX ADO RECORDSET UTILS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +GEN(BMXY,BMXF) ;EP - Generate an ADO Schema string from a list of fields + ;BMXY Is an out-parameter called by reference. + ;On return, BMXY will be a zero-based one-dimensional array each node of which will + ;contain the schema corresponding to the fields info in BMXF + ; + ;BMXF is an in-parameter called by reference. + ;On input, BMXF will contain the field info on which to build the schema string. + ; + ;Field info in BMXF is arranged in a zero-based one-dimensional array. + ;Node 0 of BMXF contains the KEYFIELDNAME^FILENUMBER^READONLY + ;where KEYFIELDNAME is the name of the unique key field in the database and + ;FILENUMBER is the FileMan file number and + ;READONLY denotes whether the entire recordset is updateable. + ; + ;Each subsequent node of the BMXF arrray contains field info in the form + ;1FILE#^2FIELD#^3LENGTH^4DATATYPE^5ALIAS^6READONLY^7KEYFIELD^8NULLOK + ;If FILE# AND FIELD# are defined, the LENGTH and DATATYPE will be taken from the FileMan data dictionary + ;If ALIAS is defined, the schema string will use ALIAS as the column name + ;READONLY, KEYFIELD and NULLOK are binary fields. Note that there should be only one field + ;in the recordset having KEYFIELD=TRUE + ; + ;New column info format is @@@meta@@@KEYFIELD|FILE# + ; For each field: ^1FILE#|2FIELD#|3DATATYPE|4LENGTH|5FIELDNAME|6READONLY|7KEYFIELD|8NULL ALLOWED + ;example: + ;BMXY(0)="@@@meta@@@BMXIEN|2160010^" + ;BMXY(1)="2160010|.001|I|10|BMXIEN|TRUE|TRUE|FALSE^" + ; + S BMXY(0)="@@@meta@@@"_$G(BMXF(0)) + N BMXI,BMXS,BMXFM,BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL + S BMXI=0 + F S BMXI=$O(BMXF(BMXI)) Q:'+BMXI D + . N BMXFM,BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL + . S (BMXDD,BMXTYP,BMXLEN,BMXLEN2,BMXNAM,BMXKEY,BMXREAD,BMXNULL)="" + . S BMXFM=0 ;Flag indicating whether BMXF(BMXI) is a FileMan field + . S BMXY(BMXI)="" + . I BMXF(BMXI) S BMXY(BMXI)=$P(BMXF(BMXI),U,1,2) S BMXFM=1 + . I BMXFM D ;Look in ^DD for attributes + . . S BMXDD=$G(^DD($P(BMXF(BMXI),U),$P(BMXF(BMXI),U,2),0)) + . . ;column name + . . S BMXNAM=$P(BMXDD,U) + . . S BMXNAM=$TR(BMXNAM," ","_") + . . ;Data type + . . I $P(BMXDD,U,2)["P" S BMXDD=$$PTYPE(BMXDD) + . . S BMXTYP=$P(BMXDD,U,2) + . . S BMXTYP=$S(BMXTYP["F":"T",BMXTYP["S":"T",BMXTYP["D":"D") + . . I BMXTYP["N" S BMXTYP=$S($P(BMXTYP,",",2)>0:"N",1:"I") + . . ;default columnn lengths based on type + . . I BMXTYP="N"!(BMXTYP="I") S BMXLEN=$P(BMXDD,U,2),BMXLEN=$P(BMXLEN,","),BMXLEN=$E(BMXLEN,3,$L(BMXLEN)) + . . I BMXTYP="I" S BMXLEN2=$P(BMXDD,U,2),BMXLEN2=$P(BMXLEN,",",2),BMXLEN=BMXLEN+BMXLEN2+1 + . . I BMXTYP="T" S BMXLEN=0 + . . I BMXTYP="D" S BMXLEN=30 + . . S BMXNULL="TRUE" S:$P(BMXDD,U,2)["R" BMXNULL="FALSE" + . ;Look in BMXF for user-specified attributes + . S:$P(BMXF(BMXI),U,5)]"" BMXNAM=$P(BMXF(BMXI),U,5) ;Alias + . ;Set KEY, NULL and READONLY + . S BMXNULL="TRUE",BMXREAD="TRUE",BMXKEY="FALSE" + . I $P(BMXF(BMXI),U,7)="TRUE" S BMXKEY="TRUE",BMXNULL="FALSE",BMXREAD="TRUE" + . 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) + . ;Set BMXY node + . S $P(BMXY(BMXI),"|",3)=BMXTYP + . S $P(BMXY(BMXI),"|",4)=BMXLEN + . S $P(BMXY(BMXI),"|",5)=BMXNAM + . S $P(BMXY(BMXI),"|",6)=BMXREAD + . S $P(BMXY(BMXI),"|",7)=BMXKEY + . S $P(BMXY(BMXI),"|",8)=BMXNULL + ; + Q +PTYPE(BMXDD) ; + ;Traverse pointer chain to retrieve data type of pointed-to field + N BMXFILE + I $P(BMXDD,U,2)'["P" Q BMXDD + S BMXFILE=$P(BMXDD,U,2) + S BMXFILE=+$P(BMXFILE,"P",2) + S BMXDD=$G(^DD(BMXFILE,".01",0)) + S BMXDD=$$PTYPE(BMXDD) + Q BMXDD diff --git a/m/BMXADOF.m b/m/BMXADOF.m new file mode 100644 index 0000000..b200173 --- /dev/null +++ b/m/BMXADOF.m @@ -0,0 +1,228 @@ +BMXADOF ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; + ;;2.1;BMX;;Jul 26, 2009 + ; THIS IS THE ADO RECORDSET FILER: ADO -> FILEMAN + ; VISIT FILE UPDATES REPRESENT A SPECIAL CASE HTAT IS MANAGED IN BMXADOF1 + ; INCLUDES TRANSACTION CONTROLS + ; + ; + ; + N DAS,FILE,DATA,OUT S DAS=7,FILE=19707.82,DATA="2.02|120/83" D FILE(.OUT,FILE,DAS,DATA) W !,OUT Q + ; +FILED(OUT,FILE,DAS,DATA) ; RPC CALL: UNIVERSAL FILEMAN RECORD UPDATER UTILITY + D DEBUG^%Serenji("FILE^BMXADOF(.OUT,FILE,DAS,DATA)") ; DEBUGGER ENTRY POINT + ; K ^GREG S ^GREG("OUT")=$G(OUT),^("FILE")=$G(FILE),^("DAS")=$G(DAS),^("DATA")=$G(DATA) D FILE(.OUT,FILE,DAS,DATA) + Q + ; +FILEX(OUT,FILE,DAS,DATA) ; EP - RPC CALL: INSURES THAT BMXIEN IS VALID - MOJO ONLY + I '$L($G(DATA)) D + . S DATA="",%="" + . F S %=$O(DATA(%)) Q:'% S DATA=DATA_DATA(%) ; CONVERT DATA ARRAY INTO A DATA STRING + . Q + I '$L(DATA) Q + I DATA["999|" S DAS=+$P(DATA,"999|",2) I 'DAS S DAS="" ; FORCE NEW ENTRY + D FILE(.OUT,FILE,$G(DAS),DATA) + Q + ; +FILE(OUT,FILE,DAS,DATA) ;EP - RPC CALL: UNIVERSAL FILEMAN RECORD UPDATER UTILITY + ; + ; OUT = OUTBOUND MESSAGE RETURNED TO CALLINING APP. 'OK'=SUCCESSFUL TRANSACTION, 'OK|5' NEW RECORD DAS=5 ADDED + ; IF TRANSACTION FAILS, AN ERROR MESSAGE IS PASSED + ; FILE = VALID FILEMAN FILE OR SUB-FILE NUMBER - WHERE UPDATE IS TO OCCUR + ; DAS = THE DA STRING - TYPICALLY THE FILE INTERNAL ENTRY NUMBER OF THE RECORD TO BE UPDATED + ; IF THIS IS A SUB-FILE, DAS MUST BE PRECEDED BY PARENT DAS(S) IN COMMA SEPARATED STRING - TOP TO BOTTOM ORDER + ; DAS MAY BE PRECEDED BY '+' = ALL FIELDS ARE MANDATORY (REQD FOR TRANSACTION) OR '-' = DELETE THIS ENTRY + ; IF DAS STRING = NULL OR = '+', THIS MEANS ADD A NEW RECORD WITH DATA SUPPLIED IN DATA PARAMETER + ; EXAMPLES OF DAS STRINGS: '1' (EDIT RECORD #1), '5,2,-7' (DELETE RECORD #7 IN 3RD LEVEL SUBFILE) + ; DATA = DATA STRING OR ARRAY REFERENCE. DATA CAN BE PASSED USING THE .PARAM SYNTAX + ; DATA STRING FORMAT: FIELD#|VALUE_$C(30)_FIELD#|VALUE_$C(30)_...FIELD#|VALUE_$C(30) + ; $C(30) [AKA EOR] IS THE DATA ELEMENT SEPARATOR + ; $C(30) IS USED AS THE DATA DELIMITER BECAUSE OTHER CHARACTERS LIKE '^' COULD APPEAR IN THE VALUE PIECE! + ; EA FIELD# MAY BE PRECEED BY '+' = MANDATORY (REQD FOR TRANSACTION) OR '-' = DELETE THE VALUE OF THIS FIELD + ; EXAMPLE: ".03|1/5/46"_EOR_"-.02|"_EOR_"+.09|139394444"_EOR NOTE -.02| IS SAME AS .02|@ OR .02| + ; '+' IN FRONT OF THE DAS IS THE SAME AS PUTTING A '+' IN FRONT OF EVERY FIELD# IN THE DATA STRING + ; + ; + ; + N VENDUZ,VUZ + M VENDUZ=DUZ S VUZ=$C(68,85,90) + N OREF,CREF,DIC,DIE,DA,DR,X,Y,%,I,FLD,CNT,FNO,VAL,@VUZ,TFLG,DFLG,TOT,UFLG,XTFLG,GTFLG,GDFLG,LVLS,IENS + I $G(FILE)=9000010 N AUPNPAT,AUPNDOB,AUPNDOD,AUPNVSIT,AUPNTALK,APCDOVRR S (APCDOVRR,AUPNTALK)=1 ; THE VISIT FILE IS UPDATED IN THIS TRANSACTION + X ("M "_$C(68,85,90)_"=VENDUZ S "_$C(68,85,90)_"(0)="_$C(34,64,34)) K VENDUZ ; ELININATES PERMISSION PROBLEMS + S OUT="",FLD="",GTFLG=0,GDFLG=0 + S X="MERR^BMXADOF",@^%ZOSF("TRAP") ; SET MUMPS ERROR TRAP + I '$D(^DD(+$G(FILE))) S OUT="Invalid file number" Q ; FILE # MUST BE VALID + S DAS=$G(DAS) I $E(DAS)="," S DAS=$E(DAS,2,99) ; ACCURATE IF NON SUB-FILE DAS STRING DOSN'T CONTAIN A "," + S LVLS=$L(DAS,",") + S %=FILE F CNT=1:1 S %=$G(^DD(%,0,"UP")) I '% Q ; COUNT FILE/SUB-FILE LEVELS IN THE DATA DICTIONARY + I LVLS'=CNT S OUT="Invalid DAS string" Q ; LEVELS IN DAS STRING MUST MATCH LEVELS IN THE DATA DICTIONARY + I $E(DAS)="-" S DAS=$E(DAS,2,99),GDFLG=1 ; GLOBAL DELETE FLAG + I $E(DAS)="+" S DAS=$E(DAS,2,99),GTFLG=1 ; GLOBAL TRANSACTION FLAG, ROLLBACK IF ANY FIELD FAILS TO UPDATE + I LVLS>1 F I=1:1:LVLS D I DAS="ERR" S OUT="Invalid DAS string" Q ; MAKE DAS ARRAY. MIRRORS THE DA() ARRAY + . I I=LVLS S DAS=$P(DAS,",",I) Q ; SET DAS OF SUBFILE + . S %=$P(DAS,",",I) I '% S DAS="ERR" Q + . S DAS(LVLS-I)=% ; SET DAS(S) OF PARENT FILE(S). LIKE DA(), THE LARGER THE DAS SUBSCRIPT, THE HIGHER THE LEVEL + . Q + I DAS="ERR" S OUT="Update cancelled. Invalid DAS string" Q + I DAS="Add"!(DAS="ADD") S DAS="" + S %=$E(DAS) I %="-" S GDFLG=1,DAS=$E(DAS,2,99) ; YET ANOTHER WAY TO SET GLOBAL DELETE FLAG + S %=$$REF(FILE,.DAS) ; GET OPEN REF, CLOSED REF, AND IENS STRING + S OREF=$P(%,"|"),CREF=$P(%,"|",2),IENS=$P(%,"|",3) I $L(OREF),$L(CREF) + E S OUT="Update cancelled. Invalid file definition/global reference" Q ; ERROR REPORT + I DAS,'$D(@CREF@(DAS)) S OUT="Update cancelled. Invalid DAS" Q ; IF THERE IS AN DAS, IT MUST BE VALID + I '$G(DAS),FILE=9000010,'$$VVAR^BMXADOF2(DATA) Q ; VISIT FILE ADD REQUIRES THAT SPECIAL VARIABLES BE PRESENT AND VALID + I 'GDFLG,DAS,DATA[".01|@" S GDFLG=1 ; ALTERNATE WAY TO SET GLOBAL DELETE FLAG: REMOVE .01 FIELD + I GDFLG,'DAS S OUT="Deletion cancelled. Missing DAS" Q ; CAN'T DO DELETE WITHOUT AN DAS + I GDFLG D DIK(OREF,DAS) S OUT="Record deleted|"_DAS Q ; DELETE AND QUIT + S UFLG=$S($G(DAS):"E",1:"A") ; SET UPDATE FLAG: ADD OR EDIT + I '$L($G(DATA)) D I '$L($G(DATA)) S OUT="Update cancelled. Missing/invalid data string" Q ; COMPRESS DATA ARRAY INTO A SINGLE STRING + . S DATA="",%="" + . F S %=$O(DATA(%)) Q:'% S DATA=DATA_DATA(%) ; CONVERT DATA ARRAY INTO A DATA STRING + . Q + S %=$L(DATA) S %=$E(DATA,%-1,%) D ; CHECK FOR PROPER TERMINATION OF DATA STRING + . I %=$C(30,31) Q ; PROPER TERMINATION + . I $E(%,2)=$C(30) S DATA=DATA_$C(31) Q + . I $E(%,2)=$C(31) S DATA=$E(DATA,1,$L(DATA-1))_$C(30,31) + . S DATA=DATA_$C(30,31) + . Q + S TOT=$L(DATA,$C(30)) I 'TOT S OUT="Update cancelled. Missing data string" Q +SPEC S DATA=$$SPEC^BMXADOFS(FILE,DATA,UFLG) ; BASED ON FILE IEN, SPECIAL MODS MAY BE MADE TO THE DATA STRING + S TOT=$L(DATA,$C(30)) I 'TOT S OUT="Update cancelled. SPEC analysis failed." Q + F CNT=1:1:TOT S %=$P(DATA,$C(30),CNT) I $L(%) S DATA(CNT)=% ; BUILD PRIMARY FIELD ARRAY + S %=$G(DATA(1)) I %=""!(%=$C(31)) S OUT="Update cancelled. Missing data string" Q + S %=DATA(CNT) I %[$C(31) S %=$P(%,$C(31),1),DATA(CNT)=% ; STRIP OFF END OF FILE MARKER + F CNT=1:1:TOT S X=$G(DATA(CNT)) I $L(X) D ; BUILD SECONDARY FIELD ARRAY + . S TFLG=0,DFLG=0 + . I $E(X)="+" S TFLG=1,X=$E(X,2,999),$P(FLD,U)=1 + . I $E(X)="-" S DFLG=1,X=$E(X,2,999) + . S FNO=$P(X,"|"),VAL=$P(X,"|",2) + . I '$D(^DD(FILE,+$G(FNO),0)) S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid field number" Q + . I DFLG,VAL'="" S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid deletion syntax" Q ; CANT DELETE IF A VALUE IS SENT + . I VAL="@" S DFLG=1 ; SYNC DFLG AND VAL + . S FLD(FNO)=VAL_U_TFLG_U_DFLG + . I FNO=.01,TFLG S $P(FLD,U,2)=1 + . Q + I $P($G(FLD(.01)),U,3),UFLG="A" S OUT="Record deletion cancelled. Missing DAS" Q ; CAN'T DELETE A RECORD WITHOUT A VALID DAS + I $P($G(FLD(.01)),U,3)!($G(GDFLG)) S UFLG="D" ; DELETION +DELREC I UFLG="D" D DIK(OREF,DAS) S OUT="OK" Q ; DELETE THE RECORD + I UFLG="A",'$L($P($G(FLD(.01)),U)) S OUT="Record addition cancelled. Missing .01 field" Q ; CAN'T ADD A RECORD WITHOUT A VALID .01 FIELD +DINUM I UFLG="A",$G(^DD(FILE,.01,0))["DINUM=X" D ; IF DINUM'D RECORD EXISTS, SWITCH TO MOD MODE + . S %=FLD(.01) + . I $E(%)="`" S %=+$E(%,2,99) + . I '$D(@CREF@(%,0)) Q ; OK TO ADD BRAND NEW RECORD BUT EXISTING RECORDS MUST BE EDITED + . K FLD(.01) + . S DAS=%,UFLG="E" + . Q +ADDREC I UFLG="A" D ADD(OREF) Q ; ADD A NEW ENTRY TO A FILE +EDITREC I UFLG="E" D EDIT(OREF,DAS) Q ; EDIT AN EXISTING RECORD + Q + ; +DIK(DIK,DA) ; DELETE A RECORD + ; PATCHED BY GIS 9/28/04 TO FIX PROBLEMS WITH SUBFILE DELETION + I '$G(DAS(1)) G DIK1 ; CHECK FOR SUBFILE DELETION + N DA,IENS,I,DIK + I '$G(FILE) Q + S I=0,IENS=DAS_"," + M DA=DAS + F S I=$O(DAS(I)) Q:'I S IENS=IENS_DAS(I)_"," + S DIK=$$ROOT^DILFD(FILE,IENS) I '$L(DIK) Q +DIK1 D ^DIK + D ^XBFMK + Q + ; +ADD(DIC) ; ADD A NEW ENTRY TO A FILE + N X,Y,%,DA,DN,UP,SB,DNODE,ERR + S X=$P($G(FLD(.01)),U) I '$L(X) S OUT="Unable to add a new record" Q + S X=$$POINT(FILE,.01,X) ; ADD ACCENT GRAV IF NECESSARY + S X=""""_X_"""" ; FORCE A NEW ENTRY + S DIC(0)="L" + I $O(DAS(0)) D I $G(ERR) S Y=-1 G AFAIL ; GET DIC("P") IF NECESSARY + . S %=0 F S %=$O(DAS(%)) Q:'% S DA(%)=DAS(%) ; CREATE THE DA ARRAY + . S UP=$G(^DD(FILE,0,"UP")) I 'UP S ERR=1 Q + . S SB=$O(^DD(UP,"SB",FILE,0)) I 'SB S ERR=1 Q + . S DIC("P")=$P($G(^DD(UP,SB,0)),U,2) I '$L(DIC("P")) S ERR=1 Q + . S DN=DIC_"1,0)" I $D(DN) Q + . S @DN=(U_DIC("P")_U_U) ; CREATE THE DICTIONARY NODE + . Q +ADIC D ^DIC +AFAIL I Y=-1 S OUT="Unable to add a new record" G AX + I $O(FLD(0)) D EDIT(DIC,+Y) Q + S OUT="OK"_"|"_+Y +AX D ^XBFMK + Q + ; +EDIT(DIE,DA) ; EDIT AN EXISTING RECORD + N DR,RFLG,ERR,FNO,VAL,TFLG,RESULT,MSG,DIERR,DISYS,SF,APCDALVR + S FNO=0,DR="",APCDALVR="" + I UFLG="A" S OUT="OK New record added|"_DA + F S FNO=$O(FLD(FNO)) Q:'FNO S X=FLD(FNO) I $L(X) D I $G(RFLG) Q ; CHECK EA FIELD AND BUILD THE DR STRING AND ERROR STRING + . S VAL(FNO)=$P(X,U),TFLG=$P(X,U,2) I '$L(VAL(FNO)) Q + . S SF=$$WP(FILE,FNO) + . I SF D WORD(FILE,DA,FNO,CREF,VAL(FNO)) Q ; WORD PROCESSING FIELDS MANAGED SEPARATELY + . S VAL(FNO)=$$POINT(FILE,FNO,VAL(FNO)) ; ADD ACCENT GRAV IF NECESSARY + . K ERR,RESULT + . I VAL(FNO)="@"!(VAL(FNO)="") S RESULT="@" + . I FNO=.01,UFLG="A" S:$E(VAL(.01))="`" VAL(.01)=$E(VAL(.01),2,999) Q ; NO NEED TO EDIT THE .01 FIELD OF A RECORD THAT HAS JUST BEEN CREATED + . I FILE\1=9000010,$L($P(FILE,".",2))=2,UFLG="E",(FNO=.02!(FNO=.03)) Q ; CAN'T EDIT EXISTING PT AND VISIT FIELDS OF V FILES + . I FILE\1=9000010,$L($P(FILE,".",2))=2,UFLG="A",FNO=.03,VAL(.03)?1"`"1.N S %=+$E(VAL(.03),2,99) I $D(^AUPNVSIT(%,0)) S RESULT=% G E1 + . I FILE=9000011,FNO=.07,VAL(.07)?1.N S RESULT=VAL(.07) G E1 ; THE VALIDITY CHECK FAILS - SO BYPASS THIS +CHK . I VAL(FNO)'="@" D CHK^DIE(FILE,FNO,"",VAL(FNO),.RESULT,.ERR) +E1 . I RESULT=U D Q + .. S MSG=$G(ERR("DIERR",1,"TEXT",1),"Failed FileMan data validation") + .. I $L(OUT) S OUT=OUT_"~" + .. I TFLG!GTFLG S RFLG=1,OUT=FNO_"|"_MSG Q + .. S OUT=OUT_FNO_"|"_MSG + .. Q + . S VAL(FNO)=RESULT + . I $L(DR) S DR=DR_";" + . I RESULT="@" S DR=DR_FNO_"////@" Q ; DELETE THIS VALUE + . S DR=DR_FNO_"////^S X=VAL("_FNO_")" ; BUILD DR STRING + . Q + I $G(RFLG) D:UFLG="A" DIK(DIE,DA) S OUT="Record update cancelled"_"|"_OUT G EX ; TRANSACTION ROLLBACK FLAG IS SET, ENTRY DELETED (ADD MODE) OR UPDATE CANCELLED (EDIT MODE) + S %=0 F S %=$O(DAS(%)) Q:'% S DA(%)=DAS(%) ; JUST IN CASE THIS IS A MILTIPLE, CREATE THE DA ARRAY +DIE L +@CREF@(DA):2 I $T D ^DIE L -@CREF@(DA) G:OUT["valid" EX S OUT="OK" S:UFLG="A" OUT=OUT_"|"_DA G EX ; SUCCESS!!!! + S OUT="Update cancelled. File locked" ; FILE LOCKED. UNABLE TO UPDATE + I $L(FLD),UFLG="A" D DIK(DIE,DA) ; ROLLBACK THE NEW RECORD +EX D ^XBFMK ; CLEANUP + Q + ; +REF(FILE,DAS) ; GIVEN A FILE/SUBFILE NUMBER & DAS ARRAY, RETURN THE FM GLOBAL REFERENCE INFO: OREF|CREF|IENS + N OREF,CREF,IENS,I,X + S IENS=$$IENS^DILF(.DAS) I '$L(IENS) Q "" + S OREF=$$ROOT^DILFD(FILE,IENS) I '$L(OREF) Q "" + S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" + Q (OREF_"|"_CREF_"|"_IENS) + ; +POINT(FILE,FNO,VAL) ; ADD ACCENT GRAV IF NECESSARY + I $E(VAL)="`" Q VAL + I $P($G(^DD(FILE,FNO,0)),U,2)["P",VAL=+VAL,VAL\1=VAL S VAL="`"_VAL + Q VAL + ; +WP(FILE,FLD) ; RETURN THE SUBFILE NUMBER IF IT IS A WORD PROCESSING FIELD + N SF,DTYPE + S SF=$P($G(^DD(+$G(FILE),+$G(FLD),0)),U,2) I 'SF Q 0 + S DTYPE=$P($G(^DD(SF,.01,0)),U,2) + I DTYPE["W" Q SF + Q 0 + ; +WORD(FILE,DA,FLD,CREF,VAL) ; SUFF TEXT ENTRY INTO THE WP MULTIPLE FIELD + N SS,TOT,A,B,I + S SS=+$P($G(^DD(FILE,FLD,0)),U,4) I SS="" Q + I VAL="@"!(VAL="") K @CREF@(DA,SS) Q ; DELETE THE WP RECORD: REMOVE DICTIONARY NODE AND DATA + S TOT=0 + F Q:'$L(VAL) D + . S A=$E(VAL,1,80),VAL=$E(VAL,81,999999) ; PEEL OFF AN 80 CHARACTER DATA BLOCK FROM THE FRONT OF THE TEXT STRING + . I $L(A) S TOT=TOT+1,B(TOT)=A ; BUILD THE TEMP ARRAY + . Q + I '$D(B(1)) Q ; NOTHING TO STORE SO QUIT + S @CREF@(DA,SS,0)="^^"_TOT_U_TOT_U_DT ; SET DICTIONARY NODE + F I=1:1:TOT S @CREF@(DA,SS,I,0)=B(I) ; SET DATA NODES + Q + ; +MERR ; MUMPS ERROR TRAP + N ERR,X + X ("S X=$"_"ZE") + S ERR="M ERROR: "_X + S ^GREG("ERR")=ERR + S OUT=ERR + Q + ; diff --git a/m/BMXADOF1.m b/m/BMXADOF1.m new file mode 100644 index 0000000..1426188 --- /dev/null +++ b/m/BMXADOF1.m @@ -0,0 +1,75 @@ +BMXADOF1 ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; + ;;2.1;BMX;;Jul 26, 2009 + ; UPDATE FILEMAN WITH AN ADO RECORD SET FROM A WINDOWS/WEB APPLICATION + ; + ; + D BAFM(.OUT,$NA(^TMP("BMX ADO",6))) ; W !!! ZW OUT K OUT Q + ; +BAFM(OUT,CREF) ; EP- RPC: PASS DATA FROM A STD BROKER ADO ARRAY TO FILEMAN AND RETURN THE ACK MSG IN 'OUT' ARRAY + I '$L($G(CREF)) Q ; REFERENCE MUST EXIST + I '$D(@CREF) Q ; DATASET MUST EXIST + N NODE,STG,DATA,SCHEMA,X,ECNT,CNT + S OUT="DONE",ECNT=0,CNT=0 +PEEL S NODE=0,STG="" ; PEEL DATA OFF THE ARRAY AND FILE IT + F S NODE=$O(@CREF@(NODE)) Q:'NODE D ; LOOP THRU THE NODES TO BUILD A STRING. + . S X=@CREF@(NODE) I X="" Q + . S STG=STG_X + . I STG[$C(30) D S STG="" Q ; WHEN YOU HIT $C(30), PROCESS THE CURRENT STRING, AND THEN START A NEW STRING. + .. S STG=$TR(STG,$C(30),"") ; REMOVE THE EOR CHARACTER $C(30) FROM THE END OF THE STRING + .. I STG["@@@meta@@@" S SCHEMA=STG Q ; GET SCHEMA STRING. THEN KEEP LOOPING TO GET THE DATA STRINGS + .. D PREP(.OUT,SCHEMA,STG) ; PREP DATA STRING FOR FILING, AND THEN FILE THE DATA + .. Q + . Q + K @CREF ; CLEAN UP + I ECNT=0 S OUT(0)="OK" Q ; SUMMARY NODE OF THE OUTPUT ARRAY + S OUT(0)=ECNT_" error(s) detected in this transaction" + Q + ; +PREP(OUT,SCHEMA,DATA) ; PREPARE DATA FOR THE ADO FILER + N TOP,LEV,C,B,%,DA,DAS,PCE,MAX,S,D,FILE,DSTG,MAND,FLD,VAL,MSG + S C=",",B="|",DAS="" + S %=$P(SCHEMA,U,2) S TOP=$P(%,B,2) + S LEV=$L(TOP)-3 I LEV=2 S DAS=+DATA_C + S SCHEMA=$P(SCHEMA,U,2,999) + S MAX=$L(SCHEMA,U) + S FILE=+SCHEMA I '$D(^DD(FILE,0)) S ERR="Update failed. Missing/invalid file number" D ERR(ERR) Q +SPEC ; CHECK FOR SPECIAL CASES + I FILE=9000011,SCHEMA'["|.05|" G DSTG + I FILE=9000010.07,SCHEMA'["|.04|" G DSTG + I FILE=9000010.18,SCHEMA'["|.04|" G DSTG + I FILE=9000013,SCHEMA'["|.04|" G DSTG + I FILE=9000014,SCHEMA'["|.04|" G DSTG + I FILE'=9000010.07,FILE'=9000011,FILE'=9000013,FILE'=9000014,FILE'=9000010.18 + E I '$$NARR^BMXADOF2 Q ; GET IEN OF PROVIDER NARRATIVE AND SUBSTITUE THIS VALUE IN THE DATA STG +DSTG ; BUILD THE ADD/UPDATE STRING FOR THE EBCU FILER + S DA=+DATA,DAS=DAS_DA,DSTG="" + F PCE=2:1:MAX D + . S S=$P(SCHEMA,U,PCE),VAL=$P(DATA,U,PCE) + . I $P(S,B,6)="TRUE" Q ; READ ONLY + . S FLD=$P(S,B,2) I 'FLD Q ; INVALID SCHEMA PIECE + . I $E(FLD,1,3)=".00" Q ; IEN NOT DATA + . I FLD["ID" Q ; DON'T FILE THE IDENTIFIERS + . I SCHEMA[(B_FLD_"IEN"),FLD'["IEN",$L(VAL) Q ; WAIT FOR THE LOOKUP VALUE, BYPASS CURRENT FIELD + . S FLD=+FLD + . I $P(S,B,8)'="TRUE" S FLD="+"_FLD ; MANDATORY FIELD + . E I VAL="" S FLD="-"_FLD ; DELETE THE VALUE + . I FLD?.1E1".01" D Q ; MAKE SURE THAT THE .01 FIELD IS FIRST! + .. I $L(DSTG) S DSTG=FLD_B_VAL_$C(30)_DSTG Q ; APPEND .01 FIELD TO THE FRONT OF AN EXISTING UPDATE STRING + .. S DSTG=FLD_B_VAL ; START A NEW UPDATE STRING WITH THE .01 FIELD + .. Q + . I $L(DSTG) S DSTG=DSTG_$C(30) ; $C(30) IS THE "COLUMN" DELIMITER FOR DATA TO BE ENETERED IN THE TABLE + . S DSTG=DSTG_FLD_B_VAL ; "|" IS THE DATA ELEMENT DELIMITER, SEPARATING FIELD NAME AND FIELD VALUE + . Q +FILE D FILE^BMXADOF(.MSG,FILE,DAS,DSTG) ; THE DATA STRING IS PREPARED. NOW SEND IT TO THE EBCU FILER. + I $E(MSG,1,2)'="OK" S ECNT=ECNT+1 + S CNT=CNT+1 S OUT(CNT)=MSG + ; S DSTG=$TR(DSTG,$C(30),"}") W !,DSTG ; TEMP OUTPUT - REMOVE THIS LINE AFTER TESTING COMPLETED! + Q + ; +ERR(ERR) ; + I '$L($G(ERR)) Q + S ECNT=$G(ECNT)+1 + S CNT=CNT+1 + S OUT(CNT)=ERR + Q + ; diff --git a/m/BMXADOF2.m b/m/BMXADOF2.m new file mode 100644 index 0000000..cfecb8d --- /dev/null +++ b/m/BMXADOF2.m @@ -0,0 +1,57 @@ +BMXADOF2 ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; + ;;2.1;BMX;;Jul 26, 2009 + ; THIS ROUTINE CONTAINS SPECIAL ENTRY POINTS FOR UPDATING RPMS + ; + ; + ; +VVAR(DATA) ; EP-CHECK SPECIAL VARIABLES REQUIRED FOR UPDATING THE VISIT FILE + I '$L(DATA) S OUT="Update cancelled. Missing data string" Q 0 + N X,I,Y,VDATE,%DT + K AUPNPAT,AUPNDOB,AUPNDOD,AUPNVSIT ; THE VARS ARE NOT NEW'D SINCE THEY WILL BE USED BY THE CALLING ROUTINE + S AUPNTALK=1,AUPNOVRR=1 + S X=DATA S X=$TR(X,($C(30)_"+"),$C(30)) S X=$TR(X,($C(30)_"-"),$C(30)) S X=$TR(X,($C(30)_"`"),$C(30)) S DATA=X ; STRIP OFF TRANSACTION FLAGS FROM FIELD NUMBERS + S X=$P(DATA,"|",2),X=$P(X,$C(30)),VDATE=-1 + I $E(X,1,7)?7N S VDATE=X + E S %DT="T" D ^%DT S VDATE=Y + I VDATE=-1 S OUT="Update cancelled. Visit timestamp misssing/invalid" Q 0 + S Y=+$P(DATA,($C(30)_".05|"),2) I 'Y S OUT="Update cancelled. Patient data missing" Q 0 ; FAILED TO FIND THE PATIENT IEN + S AUPNPAT=Y + S AUPNDOB=$P($G(^DPT(AUPNPAT,0)),U,3) I 'AUPNDOB S OUT="Update cancelled. Missing DOB" Q 0 + I AUPNDOB>VDATE S OUT="Update cancelled. Patient born afer visit date???" Q 0 + S AUPNDOD=$P($G(^DPT(AUPNPAT,.35)),U) + I AUPNDOD,AUPNDOD FILEMAN + ; CONTAINS SPECIAL ENTRY POINT FOR RPMS DATA ENTRY + ; + ; + ; + ; D SS^BMXADO(.XXX,53,"","~~~~~VMEAS~BMXADOFD~1.244A||PU\60|WT\175|HT\70") Q + ; D SS^BMXADO(.XXX,58,"X","AC~53~53~~~NOTES~BMXADOFD~53") Q + N FILE,DAS,DATA S FILE=9000010.07,DAS="+" + S DATA=".01|`8718"_$C(30)_".02|`1"_$C(30)_".03|`71168"_$C(30)_".04|DM--2"_$C(30,31) + D FILE^BMXADOF(.XXX,FILE,DAS,DATA) Q + ; +VMEAS(DATA,IENS,MAX,OUT,TOT) ; VIEW MEASUREMENTS: CUSTOM ITERATOR + ; DATA=VCN|ALL|MTYPE1\VAL1|MTYPE2\VAL2|...|MTYPEn\VALn + N VAL,CNT,P,S,PTIEN,VIEN,%,X,Y,TYPE,N,ALL,STG,MEAS,MIEN,IX + S P="|",S="\",N=0 + I '$G(TOT) Q "" + I '$L(OUT) Q "" + S VIEN=$P(DATA,P) I '$L(VCN) Q "" + S PTIEN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'PTIEN Q "" + F CNT=2:1 S X=$P(DATA,P,CNT) Q:'$L(X) D ; CREATE PRELIMINARY DATA ARRAYS + . S VAL=$P(X,S,2) ; VALUE MUST EXIST + . I '$L(VAL) Q + . S TYPE=$P(X,S) ; TYPE MUST EXIST + . I '$L(TYPE) Q + . S MIEN=$O(^AUTTMSR("B",TYPE,0)) I 'MIEN Q + . S MEAS=$P($G(^AUTTMSR(MIEN,0)),U,2) I '$L(MEAS) Q + . S N=N+1 + . S VAL(N)=VAL + . S TYPE(N)=MIEN_U_TYPE_U_MEAS + . S IX(MIEN)=N + . Q +MG S N=0 F S N=$O(VAL(N)) Q:'N D + . S TOT=TOT+1 + . S @OUT@(TOT)=+TYPE(N)_U_$P(TYPE(N),U,2)_U_"`"_PTIEN_U_"`"_VIEN_U_VAL(N)_U_$P(TYPE(N),U,3)_$C(30) + . Q + Q "" + ; +ICDVAL(CODE) ; EP-RPC-VERIFY ICD CODE BY RETURNING ITS IEN + I '$L($G(CODE)) Q "" + N IEN + S IEN=$O(^ICD9("BA",CODE_" ",0)) + I 'IEN Q "" + Q IEN + ; +FACNIEN(PIEN,FIEN) ;EP - GIVEN A PROBLEM IEN AND FACILITY IEN, RETURN THE FACILITY-NOTE IEN + I '$D(^AUPNPROB(+$G(PIEN),0)) Q "" + I '$D(^DIC(4,+$G(FIEN),0)) Q "" + N NFIEN + S FNIEN=$O(^AUPNPROB(PIEN,11,"B",FIEN,0)) I FNIEN Q FNIEN ; IF AN FNIEN EXISTS RETURN IT + ; OTHERWISE-CREATE THE FM STUB NODES FOR THE FACILITY SUBFILE + S FNIEN=$O(^AUPNPROB(PIEN,11,999999),-1)+1 + S ^AUPNPROB(PIEN,11,FNIEN,0)=FIEN + S ^AUPNPROB(PIEN,11,FNIEN,11,0)="^9000011.1111IA^^" + S ^AUPNPROB(PIEN,11,"B",FIEN,FNIEN)="" + Q FNIEN + ; +NEXTPBN(DFN,FIEN) ; RETURN THE NEXT AVAILABLE PROBLEM NUMBER FOR A PATIENT AT THE FACILITY + N MAX,PIEN,X,Y + S MAX=0,PIEN=0 + F S PIEN=$O(^AUPNPROB("AC",DFN,PIEN)) Q:'PIEN D ; FIND ALL PROBLEMS FOR THIS PATIENT + . S X=$G(^AUPNPROB(PIEN,0)) I '$L(X) Q "" + . I $P(X,U,6)'=FIEN Q ; ONLY CHECK NUMBERS AT THIS FACILITY + . S Y=$P(X,U,7) + . I Y>MAX S MAX=Y ; GET THE HIGHEST NUMBER THUS FAR + . Q + S MAX=(MAX\1)+1 ; GET NEXT AVAILABLE INTEGER + Q MAX + ; +NN W $$NEXTNOTE(221,4585) Q +NEXTNOTE(PIEN,FIEN) ; RETRUN THE NEXT NOTE NUMBER FOR A PROBLEM AND FACILITY + I '$D(^AUPNPROB(+$G(PIEN),0)) Q "" + I '$D(^DIC(4,+$G(FIEN),0)) Q "" + N MAX,NIEN,FNIEN,X,Y + S MAX=0,NIEN=0 + S FNIEN=$$FACNIEN^BMXADOFD(PIEN,FIEN) I 'FNIEN Q "" + F S NIEN=$O(^AUPNPROB(PIEN,11,FNIEN,11,NIEN)) Q:'NIEN D + . S X=$G(^AUPNPROB(PIEN,11,FNIEN,11,NIEN,0)) I '$L(X) Q + . S Y=+X + . I Y>MAX S MAX=Y + . Q + S MAX=MAX+1 + Q MAX diff --git a/m/BMXADOFS.m b/m/BMXADOFS.m new file mode 100644 index 0000000..b61687b --- /dev/null +++ b/m/BMXADOFS.m @@ -0,0 +1,204 @@ +BMXADOFS ; IHS/CIHA/GIS - RPC CALL FOR EXTENDED FUNCTIONALITY OF BMXNet UTILITIES ; + ;;2.1;BMX;;Jul 26, 2009 + ; THIS IS THE ADO RECORDSET FILER: ADO -> FILEMAN + ; CONTAINS SPECIAL CODE RELATED TO FILING PROPLEMS, POVS, FAMILY HX, PERSONAL HX AND NOTES. + ; + ; + ; +PAT ; TEST PROBLEM ADD + S DATA=".01|`8257"_$C(30)_".02|`53"_$C(30)_".03|"_DT_$C(30)_".05|C-POX"_$C(30)_".06|`4585"_$C(30)_".12|I"_$C(30,31) + D FILE^BMXADOF(.XXX,9000011,"",DATA) W !,XXX K XXX,DATA Q + ; +PET ; TEST PROB EDIT + S DATA=".01|250.00"_$C(30)_".03|"_DT_$C(30)_".05|HI MOM"_$C(30)_".12|I"_$C(30,31) + D FILE^BMXADOF(.XXX,9000011,"1757",DATA) W !,XXX K XXX,DATA Q + ; +TDP ; TEST PROBLEM DELETE + S DATA=$C(31) + D FILE^BMXADOF(.XXX,9000011,"-1757",DATA) W !,XXX K XXX,DATA Q + ; +TPOV ; ADD POV TEST + S DATA=".01|`8718"_$C(30)_".02|`53"_$C(30)_".03|`3909"_$C(30)_".04|DM---I"_$C(30)_".12|P"_$C(30,31) + D FILE^BMXADOF(.XXX,9000010.07,"",DATA) W !,XXX K XXX,DATA Q + ; +TH ; HX TEST + S DATA=".01|250.00"_$C(30)_".02|`53"_$C(30)_".03|JUL 15,2004"_$C(30)_".04|FAMILY HX OF LUNG CA"_$C(30,31) + D FILE^BMXADOF(.XXX,9000014,"",DATA) W !,XXX K XXX,DATA Q + ; +TNOTE ; TEST ADDING A NOTE TO A PROBLEM + N DATA,XXX,PROBIEN,FACNIEN,FACIEN,DAS + S PROBIEN=3,FACIEN=4587 + S FACNIEN=$$FACNIEN(PROBIEN,FACIEN) ; YOU MUST SPECIFY THE PROBLEM IEN AND THE FACILITY IEN + S DAS=PROBIEN_","_FACNIEN_"," + S DATA=".03|NEW NOTE #2"_$C(30,31) ; THE DATA STRING JUST CONTAINS THE NOTE FIELD. + ; THE OTHER FIELDS (INCLUDING .01) ARE ADDED BY BMXADOF + D FILE^BMXADOF(.XXX,9000011.1111,DAS,DATA) W !,XXX + Q + ; + ; ----------------------------------------------------------------------------------------------------- + ; +SPEC(FILE,DATA,UFLG) ;EP - SPECIAL DATA MODS FOR SPECIFIC FILES + I FILE=9000010.07 S DATA=$$POV(DATA) Q DATA + I FILE=9000011 S DATA=$$PROB(DATA,$G(UFLG)) Q DATA + I FILE=9000013!(FILE=9000014) S DATA=$$HX(DATA) Q DATA + I FILE=9000011.1111 S DATA=$$NOTE(DATA,$G(DAS(2)),$G(DAS(1))) Q DATA + ; I FILE=9000010.18,DATA'["|.04|" G DSTG + Q DATA + ; +HX(DATA) ; INPUT STRING TRANSFORM FOR PHX AND FHX + N NARR,NIEN,%,A,B,X,Y,%DT + I DATA[".01|`" G HNARR + S DATA=$$ICD(DATA,.01) I DATA="" Q "" +HNARR I DATA'[".04|'" G HDT + S DATA=$$NARR(DATA,.04) +HDT I DATA'[".03|" Q DATA + S X=+$P(DATA,".03|",2) I X?7N Q DATA + S %DT="" D ^%DT + I Y'?7N Q DATA + S A=$P(DATA,".03|") + S B=$P(DATA,".03|",2) S B=$P(B,$C(30),2) + S DATA=A_".03|"_Y + I $L(B) S DATA=DATA_$C(30)_B + Q DATA + ; +POV(DATA) ; POV INPUT STRING TRANSFORM + N NARR,NIEN,% + I DATA[".01|`" G PVNARR + S DATA=$$ICD(DATA,.01) I DATA="" Q "" +PVNARR I DATA'[".04|'" Q DATA + S DATA=$$NARR(DATA,.04) + Q DATA + ; +PROB(DATA,UFLG) ; PROBLEM LIST INPUT STRING TRANSFORM + N NARR,NIEN,%,PNUM,FACIEN,DFN,X,A,B +PNARR I DATA'[".05|" G PICD + S %=$P(DATA,".05|",2) + S NARR=$P(%,$C(30)) + I NARR'?1"`"1.N S DATA=$$NARR(DATA,.05) ; STUFF THE NARR LOOKUP VALUE IN THE DATA STRING + I '$L(DATA) Q "" +PICD S %=$P(DATA,"|") I %'=.01,DATA'[($C(30)_".01|") G PNUM + S DATA=$$ICD(DATA,.01) I DATA="" Q "" +PNUM I $G(UFLG)="E" Q DATA ; STOP HERE IF IN EDIT MODE + I $P(DATA,($C(30)_".07|"),2) G TODAY ; GET NEXT PROB NUM + S DFN=+$P(DATA,".02|`",2) + I 'DFN S DATA="" Q "" + S FACIEN=+$P(DATA,".06|`",2) + I 'FACIEN Q "" + S PNUM=$$NEXTPBN(DFN,FACIEN) + I 'PNUM Q "" + S X=$L(DATA,$C(30)) + S A=$P(DATA,$C(30),1,X-1),B=$P(DATA,$C(30),X) + S DATA=A_$C(30)_".07|"_PNUM_$C(30)_B +TODAY I $P(DATA,($C(30)_".08|"),2) Q DATA ; GET TODAY'S DATE + S X=$L(DATA,$C(30)) + S A=$P(DATA,$C(30),1,X-1),B=$P(DATA,$C(30),X) + S DATA=A_$C(30)_".08|"_$G(DT)_$C(30)_B + Q DATA + ; +NOTE(DATA,PIEN,FNIEN) ; GIVEN A DATA STRING CONTAINING THE NOTE, THE PROBLEM IEN, AND THE FAC-NOTE IEN: + ; ADD NOTE # AND STATUS TO THE DATA STRING + I $G(DATA)'[".03|" Q "" + I '$D(^AUPNPROB(+$G(PIEN),11,+$G(FNIEN),0)) Q "" + N NUM + I DATA'[".04|" S DATA=".04|A"_$C(30)_DATA + I DATA'[".01|" D + . S NUM=$$NEXTNOTE(PIEN,FNIEN) + . I 'NUM Q + . S DATA=".01|"_NUM_$C(30)_DATA + Q DATA + ; +TI N XXX S XXX=$$ICD(".01|250.00"_$C(30)_".02|123"_$C(30)_".03|ABC",.01) W !,$TR(XXX,$C(30),"{") Q +ICD(DATA,FLD) ; VERIFY ICD CODE AND GET LOOKUP VALUE + I '$G(FLD) Q "" + I '$L($G(DATA)) Q "" + N %,A,B + S %=$P(DATA,"|") + I %=FLD D Q DATA + . S %=$P(DATA,"|",2) + . S %=$P(%,$C(30)) + . I %?1"`"1.N Q + . S %=$O(^ICD9("BA",%_" ",0)) + . I '% S DATA="" Q + . S A=$P(DATA,"|") + . S B=$P(DATA,"|",2,999) + . S B=$P(B,$C(30),2,999) + . S DATA=A_"|`"_% + . I $L(B) S DATA=DATA_$C(30)_B + . Q + S %=$P(DATA,($C(30)_FLD_"|"),2) D + . S %=$P(%,$C(30)) + . I %?1"`"1.N Q DATA + . S %=$O(^ICD9("BA",%_" ",0)) + . I '% S DATA="" Q + . S A=$P(DATA,($C(30)_FLD_"|")) + . S B=$P(DATA,($C(30)_FLD_"|"),2,999) + . S B=$P(B,$C(30),2,999) + . S DATA=A_$C(30)_FLD_"|`"_% + . I $L(B) S DATA=DATA_$C(30)_B + . Q + Q DATA + ; +NARR(DATA,FLD) ; SUBSTITUTE A LOOKUP VALUE FOR NARRATIVE DATA IN THE DATA STRING + N A,B,C,X,Y,DIC,Z + I '$G(FLD) Q "" + I '$L($G(DATA)) Q "" + S Z=FLD_"|" + S A=$P(DATA,Z) + S B=$P(DATA,Z,2) + S NARR=$P(B,$C(30)) + S NARR=$$UP^XLFSTR(NARR) ; CONVERT ALL NARRATIVE TO UPPERCASE + S C=$P(B,$C(30),2,999) + S DIC="^AUTNPOV(",DIC(0)="L",X=NARR + D ^DIC I Y=-1 Q "" + S DATA=A_FLD_"|`"_+Y + I $L(C) S DATA=DATA_$C(30)_C + D ^XBFMK + Q DATA + ; +FACNIEN(PIEN,FIEN) ; GIVEN A PROBLEM IEN AND FACILITY IEN, RETURN THE FACILITY-NOTE IEN + I '$D(^AUPNPROB(+$G(PIEN),0)) Q "" + I '$D(^DIC(4,+$G(FIEN),0)) Q "" + N FNIEN + S FNIEN=$O(^AUPNPROB(PIEN,11,"B",FIEN,0)) I FNIEN Q FNIEN ; IF AN FNIEN EXISTS RETURN IT + ; OTHERWISE-CREATE THE FM STUB NODES FOR THE FACILITY SUBFILE + S FNIEN=$O(^AUPNPROB(PIEN,11,999999),-1)+1 + S ^AUPNPROB(PIEN,11,FNIEN,0)=FIEN + S ^AUPNPROB(PIEN,11,FNIEN,11,0)="^9000011.1111IA^^" + S ^AUPNPROB(PIEN,11,"B",FIEN,FNIEN)="" + Q FNIEN + ; +NEXTPBN(DFN,FIEN) ; RETURN THE NEXT AVAILABLE PROBLEM NUMBER FOR A PATIENT AT THE FACILITY + N MAX,PIEN,X,Y + S MAX=0,PIEN=0 + F S PIEN=$O(^AUPNPROB("AC",DFN,PIEN)) Q:'PIEN D ; FIND ALL PROBLEMS FOR THIS PATIENT + . S X=$G(^AUPNPROB(PIEN,0)) I '$L(X) Q "" + . I $P(X,U,6)'=FIEN Q ; ONLY CHECK NUMBERS AT THIS FACILITY + . S Y=$P(X,U,7) + . I Y>MAX S MAX=Y ; GET THE HIGHEST NUMBER THUS FAR + . Q + S MAX=(MAX\1)+1 ; GET NEXT AVAILABLE INTEGER + Q MAX + ; +NN W $$NEXTNOTE(3,1) Q +NEXTNOTE(PIEN,FNIEN) ; RETRUN THE NEXT NOTE NUMBER FOR A PROBLEM AND FACILITY-NOTE IEN + I '$D(^AUPNPROB(+$G(PIEN),11,+$G(FNIEN),0)) Q "" + N MAX,NIEN,X,Y + S MAX=0,NIEN=0 + F S NIEN=$O(^AUPNPROB(PIEN,11,FNIEN,11,NIEN)) Q:'NIEN D + . S X=$G(^AUPNPROB(PIEN,11,FNIEN,11,NIEN,0)) I '$L(X) Q + . S Y=+X + . I Y>MAX S MAX=Y + . Q + S MAX=MAX+1 + Q MAX + ; +PIENN(PIEN) ; GIVEN A PROBLEM IEN, RETURN PROBLEM NARRATIVE (ICD) + N X,IIEN,NIEN,NARR,ICD + S X=$G(^AUPNPROB(PIEN,0)) I '$L(X) Q "" + S IIEN=$P(X,U) I 'IIEN Q "" + S NIEN=$P(X,U,5) I 'NIEN Q "" + S ICD=$P($G(^ICD9(IIEN,0)),U) I '$L(ICD) Q "" + S NARR=$P($G(^AUTNPOV(NIEN,0)),U) I '$L(NARR) Q "" + S X=NARR_" ("_ICD_")" + Q X + ; diff --git a/m/BMXADOI.m b/m/BMXADOI.m new file mode 100644 index 0000000..081de1d --- /dev/null +++ b/m/BMXADOI.m @@ -0,0 +1,82 @@ +BMXADOI ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ; + ;;2.1;BMX;;Jul 26, 2009 + ; CUSTOM IDENTIFIERS + ; + ; + ; +DEMOID(DA) ; EP-RETURN RPMS DEMOGRAPHIC INFO FOR IDENTIFIER FIELD + N SEX,DOB,CHART,AGE,TRIBE,CC,X,Y,%,STG,FMDOB,NAME,S,SSN,CSTG,LOC,ABB + I '$D(^DPT(+$G(DA),0)) Q "" + S S=" " + S X=$G(^DPT(DA,0)),SEX=$P(X,U,2),Y=$P(X,U,3),NAME=$P(X,U),SSN=$P(X,U,9) + I '$L(NAME) Q "" + I Y,$G(DT) S AGE=(DT-Y)\10000 + I Y X ^DD("DD") S DOB=Y + S LOC=0,CSTG="" + F S LOC=$O(^AUPNPAT(DA,41,"B",LOC)) Q:'LOC D ; GET ALL THE CHART NUMBERS + . S CHART=$O(^AUPNPAT(DA,41,"B",LOC,0)) I '$L(CHART) Q + . S ABB=$P($G(^AUTTLOC(LOC,0)),U,7) I '$L(ABB) Q + . I $L(CSTG) S CSTG=CSTG_", " + . S CSTG=CSTG_ABB_" #"_CHART + . Q + I $G(DUZ(2)) S CHART=$P($G(^AUPNPAT(DA,41,DUZ(2),0)),U,2) + S %=$P($G(^AUPNPAT(DA,11)),U,8) I % S TRIBE=$P($G(^AUTTTRI(%,0)),U) + S CC=$P($G(^AUPNPAT(DA,11)),U,18) + S STG=NAME + I $L(CSTG) S STG=STG_CSTG_" --" + I $G(AGE),$L(SEX) S STG=STG_S_AGE_" y/o "_SEX + I '$G(AGE),$L(SEX) S STG=STG_S_SEX + I $L($G(DOB)) S STG=STG_S_DOB + I $L($G(SSN)) S STG=STG_S_$E(SSN,1,3)_"-"_$E(SSN,4,5)_"-"_$E(SSN,6,9) + I $L($G(TRIBE)) S STG=STG_S_TRIBE + I $L($G(CC)) S STG=STG_S_CC + Q STG + ; +DATE(DATE) ; TEST TRIGGER + Q DATE + ; +NAME(VIEN) ; RETURN THE PATIENT'S NAME + I '$G(VIEN) Q "" + N DFN + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" + Q $$GET1^DIQ(2,DFN_",",.01) + ; +SEX(VIEN) ; RETURN THE PATIENT'S SEX + I '$G(VIEN) Q "" + N DFN + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" + Q $$GET1^DIQ(2,DFN_",",.02) + ; +HRN(VIEN) ; RETURN THE CHART NUMBER FOR VISIT TRIGGER + I '$G(VIEN) Q "" + N DFN,LOC + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" + S LOC=$P($G(^AUPNVSIT(VIEN,0)),U,6) I 'LOC Q "" + Q $$HRN^AUPNPAT(DFN,LOC,2) + ; +DOB(VIEN) ; RETURN THE PATIENT'S DOB + I '$G(VIEN) Q "" + N DFN,LOC + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" + Q $$DOB^AUPNPAT(DFN,"E") + ; +SSN(VIEN) ; RETURN THE PATIENTS DOB + I '$G(VIEN) Q "" + N DFN,LOC + S DFN=$P($G(^AUPNVSIT(VIEN,0)),U,5) I 'DFN Q "" + Q $$SSN^AUPNPAT(DFN) + ; +VISDATE(VIEN) ; RETURN THE DATE OF THE VISIT + I '$G(VIEN) Q "" + N FMDT + S FMDT=+$G(^AUPNVSIT(VIEN,0))\1 I 'FMDT Q "" + S %=$$FMTE^XLFDT(FMDT,1) + G TD1 + ; +TODAY(VIEN) ; RETURN TODAY'S DATE + I '$G(DT) Q "" + S %=$$FMTE^XLFDT(DT,1) +TD1 S %=$$UP^XLFSTR(%) + S %=$P(%," ",1,2)_$P(%," ",3) + Q % + ; diff --git a/m/BMXADOS.m b/m/BMXADOS.m new file mode 100644 index 0000000..cba6569 --- /dev/null +++ b/m/BMXADOS.m @@ -0,0 +1,264 @@ +BMXADOS ; IHS/CIHA/GIS - UPDATE THE BMX ADO SCHEMA FILE ; + ;;2.1;BMX;;Jul 26, 2009 + ; ENABLES NAVIGATION TO SUBFILES PRIOR TO UPDATING THE SCHEMA FILE ENTRY + ; + ; + ; +UPDATE ; UPDATE THE SCHEMA FILE + N DIC,X,Y,%,STOP,FIEN,FNAME,SNAME,SIEN +UDIC S DIC("A")="Enter schema name: " ; EP FROM VENPCCTU + S DIC(0)="AEQLM",DIC="^BMXADO(" + D ^DIC I Y=-1 G FIN +SCHEMA S SNAME=$P(Y,U,2),SIEN=+Y + S FIEN=$$FILE(SIEN) I 'FIEN G FIN + I FIEN'=$P($G(^BMXADO(SIEN,0)),U,2) S DIE=DIC,DA=SIEN,DR=".02////^S X=FIEN" D ^DIE + F D FLD(FIEN,SIEN) I $G(STOP) Q ; GET FIELD INFO +FIN D ^XBFMK + Q + ; +FLD(FIEN,SIEN) ; GET THE FIELD + N DIC,X,Y,DIE,DA,DR,FLDIEN,FLDNAME,FLDTYPE,FDEF,TRANS + N %,%Y,HDR,DTYPE,LEN,FARR,I,TOT,PAUSE,PFLAG,IFLAG,IMSG,STG,READ + D FLIST(.FARR,FIEN,0) + S TOT=$O(FARR(9999),-1) I 'TOT S STOP=1 Q + W !,"Select a field from this "_$S($D(^DD(FIEN,0,"UP")):"sub-",1:"")_"file: " + S I=0 F S I=$O(FARR(I)) Q:'I S PAUSE=$$PAUSE(I) Q:PAUSE'="" W I,?3,FARR(I) + I $G(PAUSE)=U S STOP=1 Q + I $G(PAUSE) S Y=PAUSE G FLD1 + S DIR(0)="NO^1:"_TOT_":",DIR("A")="Select a field from the list" K DA D ^DIR K DIR + I 'Y S STOP=1 Q +FLD1 S %=FARR(+Y) + S FLDIEN=+$P(%," [",2),FLDNAME=$P(%," [") + I $$FDEL(SIEN,FLDIEN) Q ; FIELD DELETED + S X=$$FDEF(FIEN,FLDIEN) I '$L(X) W " ??" Q + S DTYPE=$E(X),LEN=+$E(X,2,6) + S DIR(0)="F^1:30",DIR("A")="Column header",DIR("B")=FLDNAME D ^DIR K DIR + S HDR=Y,TRANS=0 + S %=$P($G(^DD(FIEN,FLDIEN,0)),U,2) ; CHECK FM DD TO SEE IF FIELD IS REQUIRED + I %["R" W !,"FileMan requires a non-null value for this field" S %=2 + E W !,"Is null allowed" S %=$S(FLDIEN=.01:2,1:1) D YN^DICN I %Y?1."^" Q + I %=2 S TRANS=1 ; NON NULL VALUE REQUIRED TO COMPLETE THE TRANSACTION OR THERE WILL BE ROLLBACK + I $G(PFLAG) D ; IF POINTER, ASK IF USER WANTS TO AUTOMATICALLY INSERT THE LOOKUP VALUE FIELD IN THE SCHEMA + . W !,"This field is a pointer value (IEN)." + . W !,"Want to automatically insert the lookup value in the schema" + . S %=2 D YN^DICN W ! I %=1 S PFLAG=2 + . Q +IFLG I $G(IFLAG) D ; NON-POINTER .01 FIELD. ASK IF USER WANTS TO REFERENCE IDENTIFIER EP + . W !,"Want to display identifiers with this field" + . S %=2 D YN^DICN W ! I %'=1 Q + . S IMSG="Respond with a valid entry point in the format 'TAG^ROUTINE'." + . W !,"Entry Point to generate Identifiers: " R Y:$G(DTIME,60) E Q + . I Y?1."^" Q + . I Y?1."?" W !,IMSG S IFLAG(0)="!" Q + . I Y'?1U.7UN1"^"1U.7UN S IFLAG(0)="!" W " ??" + . I $L(Y)>2 S IFLAG(0)=Y,IFLAG=2 + . Q + I $G(IFLAG(0))="!" W !,IMSG K IPFLAG(0),IMSG W !!! G IFLG + S DA(1)=SIEN,DIC="^BMXADO("_DA(1)_",1," + S DIC("P")=90093.991,DIC(0)="L",X=FLDIEN + I '$D(^BMXADO(SIEN,1,0)) S ^BMXADO(SIEN,1,0)="^90093.991^^" + D ^DIC I Y=-1 Q + S READ=($P($G(^DD(FIEN,FLDIEN,0)),U,2)["C") ; COMPUTED FIELDS ARE READ ONLY! + S DIE=DIC,DA=+Y + S DR=".02///^S X=DTYPE;.03///^S X=LEN;.04///^S X=HDR;.05///^S X=READ;.06///0;.07///^S X=('TRANS)" + D ^DIE + I $G(IFLAG)=2 D ID + I $G(PFLAG)'=2 Q +LKUP ; AUTOMATICALLY ADD A LOOKUP FIELD TO THE SCHEMA + S X=FLDIEN_"IEN" + D ^DIC I Y=-1 Q + W !,"The LOOKUP field '"_X_"' has been added to the schema",! + S HDR=HDR_"_IEN",DTYPE="I",LEN="00009" + S DIE=DIC,DA=+Y + S DR=".02///^S X=DTYPE;.03///^S X=LEN;.04///^S X=HDR;.05///^S X=READ;.06///0;.07///^S X=('TRANS)" + D ^DIE + Q + ; +ID ; AUTOMATICALLY ADD AN IDENTIFIER REFERENCE + N X,Y,DIE,DR,DA,REF + S X=".01ID",DA(1)=SIEN + S REF=IFLAG(0) I '$L(REF) Q + D ^DIC I Y=-1 Q + W !,"The identifier field '"_X_"' has been added to the schema",! + S HDR=HDR_"_ID",DTYPE="T",LEN="00017" + S DIE=DIC,DA=+Y + S DR=".02///^S X=DTYPE;.03///^S X=LEN;.04///^S X=HDR;.05///^S X=READ;.06///0;.07///^S X=('TRANS);1///^S X=REF" + D ^DIE + Q + ; +FDEL(SIEN,FIELD) ; DELETE AN EXISTING ENTRY FROM THE 'FIELD' MULTIPLE. RETURN '1' IF THE RECORD WAS DELETED + N FIEN,DA,DIK + S FIEN=$O(^BMXADO(SIEN,1,"B",FIELD,0)) I 'FIEN Q 0 ; THIS IS A NEW ENTRY + W !,"This field already is attached to the schema. Want to delete it" + S %=2 D YN^DICN + I %'=1 Q 0 + S DA(1)=SIEN,DIK="^BMXADO("_DA(1)_",1,",DA=FIEN + D ^DIK + S FIEN=$O(^BMXADO(SIEN,1,"B",(FIELD_"IEN"),0)) + I FIEN S DA=FIEN D ^DIK ; DELETE LOOKUP VALUE FIELD AS WELL + W " Done!",! + Q 1 + ; +FDEF(FILE,FIELD) ;EP - GIVEN A FILEMAN FILE AND FIELD, RETURN THE DATA DEFINITION IN ADO FORMAT + N %,X,Y,Z,STG,I,DTYPE,FNAME,LEN,DNAME + I '$D(^DD(+$G(FILE),+$G(FIELD),0)) Q "" + S STG=$G(^DD(FILE,FIELD,0)) I '$L(STG) Q "" ; GET DATA DEF STRING +DTYPE S %="DNSFWCPVM",X=$P(STG,U,2),DTYPE="" ; GET DATA TYPE + F I=1:1:$L(%) S Y=$E(%,I) I X[Y S DTYPE=Y Q + I DTYPE="" Q "" +FNAME S DNAME=$P(STG,U) I '$L(DNAME) Q "" ; FIELD NAME +DDA ; ADO FORMAT + I DTYPE="D" D Q "D"_LEN_DNAME + . S LEN="00021" + . I STG["S %DT=" S %=$P(STG,"S %DT=",2),%=$P(%,$C(34)) + . I $G(FLDIEN)=.01 S IFLAG=1 + . I %["S" S LEN="00019" Q + . I %["T" S LEN="00018" Q + . Q + I DTYPE="N",STG["1N.N" D Q:'LEN "" Q "I"_LEN_DNAME ; INTEGER + . S %=+$P(STG,"K:+X'=X!(X>",2) + . S Y=$L(%) + . S LEN=$E("00000",1,5-$L(Y))_Y + . Q + I DTYPE="N" D Q:'LEN "" Q "N"_LEN_DNAME ; NUMBER (COULD HAVE A DECIMAL VALUE) + . S %=+$P(STG,"!(X?.E1"".""",2) + . S X=+$P(STG,"K:+X'=X!(X>",2) + . S Y=%+($L(+X)) + . S LEN=$E("00000",1,5-$L(Y))_Y + . Q + I DTYPE="F" D Q:'LEN "" Q "T"_LEN_DNAME + . S Y=+$P(STG,"K:$L(X)>",2) + . S LEN=$E("00000",1,5-$L(Y))_Y + . I 'LEN S LEN="00030" + . I $G(FLDIEN)=.01 S IFLAG=1 + . Q + I DTYPE="S" D Q:'LEN "" Q "T"_LEN_DNAME + . S X=$P(STG,U,3),Y=0 + . F I=1:1:$L(X,":") S Z=$P(X,":",2),Z=$P(Z,";"),%=$L(Z) I %>Y S Y=% + . S LEN=$E("00000",1,5-$L(Y))_Y + . Q + I DTYPE="P" S PFLAG=1 Q "T00030"_DNAME + I DTYPE="W" Q "T05000"_DNAME + I DTYPE="V" Q "" + Q "T00250"_DNAME + ; +FILE(SIEN) ; GET THE FILE OR SUBFILE NUMBER + N FNO,FIEN,DIC,X,Y,%,FILE,NSTG,GBL,FNAME,SUB,FARR,TOT,I + S (FILE,FNO)=$P(^BMXADO(SIEN,0),U,2) +OLD I FNO D I $G(FIEN) Q FIEN + . S NSTG=$O(^DD(FNO,0,"NM","")) + . F S FNO=$G(^DD(FNO,0,"UP")) Q:'FNO S NSTG=$O(^DD(FNO,0,"NM",""))_"/"_NSTG +OLD1 . W !,$S(NSTG["/":"Sub-",1:""),"File #",FILE," (",NSTG,") is linked to this schema." + . W !,"Want to keep it" S %=1 + . D YN^DICN I %'=2 W:%=1 " OK" S FIEN=FILE Q + . W !!,"If you change or delete this file number,",!,"all the information in this schema will be deleted." + . W !,"Are you sure you want to do this" S %=2 D YN^DICN + . I %'=1 W !! G OLD1 + . S GBL="^BMXADO("_SIEN_")" + . K @GBL@(1),@GBL@(2) + . S $P(@GBL@(0),U,2)="" + . W !,"This schema definition has been deleted. You may redefine it now" + . Q +NEW S DIC=1,DIC(0)="AEQM" D ^DIC I Y=-1 Q "" + S FNO=+Y,FNAME=$P(Y,U,2) +NEW1 D SC(.FARR,FNO,1) + S TOT=$O(FARR(999999),-1) I 'TOT Q FNO ; NO SUBFILES FOUND + W !!,"The ",FNAME," file contains the following sub-file" I TOT>1 W "s" + W ! + S I=0 F S I=$O(FARR(I)) Q:'I S PAUSE=$$PAUSE(I) Q:PAUSE'="" W I,?3,FARR(I) + I $G(PAUSE)=U Q "" + I $G(PAUSE) S Y=PAUSE G NEW2 + W !!,"Is the schema linked to a sub-file in this list" + S %=2 D YN^DICN I %=2 Q FNO + S DIR(0)="NO^1:"_TOT_":",DIR("A")="Select a sub-file from the list" K DA D ^DIR K DIR + I 'Y Q "" +NEW2 Q +$P(FARR(+Y)," (",2) + ; +PAUSE(I) ; SCROLL CHECK + N % + W ! + I (I#20) Q "" + W "Select a number from the list (1-",(I-1),") or press to continue: " + R %:$G(DTIME,60) E Q "" + I %?1."^" Q U + I $L(%),$D(FARR(I)) Q % + I $L(%) W " ??" H 2 + W $C(13),?79,$C(13) + Q "" + ; +SC(OUT,FILE,MODE) ;EP - SUB CRAWLER. GIVEN A FILE NUMBER RETURN ALL OF ITS DESCENDANT FILES IN AN ARRAY + I '$D(^DD(FILE,"SB")) Q ; NO DESCENDANTS + N TOT,FNO,FNAME,FIEN,LEVEL,NODE,SARR,STG,X,%,UP,ARR + S FIEN=FILE,TOT=0 + D PASS1 + I '$O(ARR(0)) Q +SC2 ; SECOND PASS. BUILD THE INTERMEDIATE ARRAY + S FNO=0 F S FNO=$O(ARR(FNO)) Q:'FNO D + . I $P($G(^DD(FNO,.01,0)),U,2)["W" K ARR(FNO) Q ; WORD PROCESSING FIELDS DO NOT COUNT + . S STG=FNO,UP=FNO + . F S UP=$G(^DD(UP,0,"UP")) Q:'UP S STG=UP_","_STG ; BUILD DESCENDANT STRING + . I $G(MODE) S STG=$$ASTG(STG) + . S STG=$P(STG,",",2,99) ; DONT NEED TOP LEVEL FILE + . I '$L(STG) Q ; SOMETHING IS SCREWED UP + . S LEVEL=$L(STG,",") + . S FNAME=$O(^DD(FNO,0,"NM","")) + . S X="SARR("_STG_")" + . S @X=FNAME_U_LEVEL_U_FNO + . K ARR(FNO) + . Q +SC3 ; 3RD PASS. BUILD OUTPUT ARAY + S NODE="SARR" + F S NODE=$Q(@NODE) Q:NODE="" D + . S X=@NODE + . S TOT=TOT+1 + . S FNAME=$P(X,U) + . S LEVEL=$P(X,U,2) + . S FNO=$P(X,U,3) + . S OUT(TOT)=$E(" ",1,LEVEL)_FNAME_" ("_FNO_")" + . Q + Q + ; +PASS1 ; PASS 1. BUILD THE ARRAY OF ALL SUBFILES + N FNO S FNO=0 + F S FNO=$O(^DD(FIEN,"SB",FNO)) Q:'FNO D + . S ARR(FNO)="" + . I '$D(^DD(FNO,"SB")) Q + . N FIEN S FIEN=FNO + . D PASS1 ; RECURSION!! + . Q + Q + ; +ASTG(STG) ; CONVERT STRING FROM FILE NUMBERS TO FILE NAMES + N PCE,LEV,FNO,NAME + S LEV=$L(STG,",") + F PCE=1:1:LEV S FNO=+$P(STG,",",PCE) D I '$L(STG) Q "" + . S NAME=$O(^DD(FNO,0,"NM","")) + . I $E(NAME)="*" S NAME=$E(NAME,2,99) + . I '$L(NAME) S STG="" Q + . S $P(STG,",",PCE)=""""_NAME_"""" + . Q + Q STG + ; +FLIST(OUT,FILE,MODE) ;EP - GIVEN A FILE RETURN THE FILEDS IN AN ARRAY MODE=0: NUMERIC ORDER, MODE=1: ALPHA ORDER + ; ONLY NON MULTIPLES AND WORD PROCESSING FIELDS ARE LISTED + N FLD,TOT,NAME,ARR,SS,%,WP + S FLD=0,TOT=0 +F1 F S FLD=$O(^DD(FILE,FLD)) Q:'FLD D ; PASS 1 + . S STG=$G(^DD(FILE,FLD,0)) I '$L(STG) Q + . S %=$P(STG,U,2) + . I %,$P($G(^DD(%,.01,0)),U,2)'["W" Q ; EXCLUDE ALL MULTIPLE FIELDS EXCEPT WORD PROCESSING FIELDS + . S WP=0 I % S WP=1 + . S NAME=$P(STG,U) + . S SS=FLD + . I $G(MODE)=1 S %=NAME S:$E(%)="*" %=$E(%,2,99) S SS=% + . S ARR(SS)=FLD_U_NAME_U_WP + . Q +F2 S SS="" + F S SS=$O(ARR(SS)) Q:SS="" D + . S TOT=TOT+1 + . S %=ARR(SS) + . S OUT(TOT)=$P(%,U,2)_" ["_+%_"]"_$S($P(%,U,3):" (word processing)",1:"") + . K ARR(SS) + . Q + Q + ; diff --git a/m/BMXADOS1.m b/m/BMXADOS1.m new file mode 100644 index 0000000..d2715d8 --- /dev/null +++ b/m/BMXADOS1.m @@ -0,0 +1,106 @@ +BMXADOS1 ; IHS/CIHA/GIS - UPDATE THE BMX ADO SCHEMA FILE GUI VERSION ; + ;;2.1;BMX;;Jul 26, 2009 + ; RPC CALLS + ; + ; + ; +DISP(OUT) ; TEMP DISPLAY + N I,X + S I=0 W ! + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X + Q + ; +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN + N IEN + S IEN=$O(^BMXADO("B",NAME,0)) + Q IEN + ; +FILE ; RETURN A LIST OF FILES + N OUT,%,SIEN + S SIEN=$$SCHEMA("FILEMAN FILES") + D SS^BMXADO(.OUT,SIEN,"","B~B~C~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +SF ; RETURN A LIST OF SUBFILES + N OUT,%,SIEN + S SIEN=$$SCHEMA("SUBFILES") + D SS^BMXADO(.OUT,SIEN,"","~~~~~SFIT~BMXADOS1~2~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +FLD ; RETURN LIST OF FIELDS FOR A FILE OR SUBFILE + N OUT,%,SIEN + S SIEN=$$SCHEMA("FIELDS") + D SS^BMXADO(.OUT,SIEN,"","~~~~~FLDIT~BMXADOS1~2~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +SCH ; RETURN A LIST OF SCHEMAS + N OUT,%,SIEN + S SIEN=$$SCHEMA("SCHEMAS") + D SS^BMXADO(.OUT,SIEN,"","B~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +SD ; RETURN THE SCHEMA DEFINITION + N OUT,%,SIEN + S SIEN=$$SCHEMA("SCHEMA DEFINITION") + D SS^BMXADO(.OUT,SIEN,"52,","~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +FLDIT(PARAM,IENS,MAX,OUT,TOT) ; CUSTOM ITERATOR TO DISPLAY FIELDS + N SFARR,CNT,DEL,NUM,NAME,DDT,DLEN,DHDR,DRO,DKEY,DNA,X,Y + D FLIST^BMXADOS(.SFARR,PARAM) + S CNT=0,DEL=" [" + F S CNT=$O(SFARR(CNT)) Q:'CNT D + . S X=SFARR(CNT) I '$L(X) Q + . S NAME=$P(X,DEL) + . ; F Q:$E(NAME)'=" " S NAME=$E(NAME,2,999) + . I '$L(NAME) Q + . S NUM=+$P(X,DEL,2) I 'NUM Q + . S TOT=TOT+1 + . S Y=$$FDEF^BMXADOS(PARAM,NUM) I '$L(Y) Q ; "" + . S DDT=$E(Y),DLEN=+$E(Y,2,6),DHDR=$E(Y,7,99) + . S DRO="NO" S DKEY="NO" S DNA="YES" + . S ^TMP("BMX ADO",$J,TOT)=NUM_U_NAME_U_DDT_U_DLEN_U_DHDR_U_DRO_U_DKEY_U_DNA_$C(30) + Q "" + ; +FNIT(PARAM,IENS,MAX,OUT,TOT) ; CUSTOM ITERATOR TO DISPLAY FILE OR SUBFILE NAME GIVEN FILE NUMBER + N NUM,NAME + S NUM=+PARAM + S NAME="" + Q:'$D(^DD(NUM,0,"NM")) "" + S NAME=$O(^DD(NUM,0,"NM",0)) + S TOT=TOT+1 + S ^TMP("BMX ADO",$J,TOT)=NUM_U_NAME_$C(30) + Q "" + ; +SFIT(PARAM,IENS,MAX,OUT,TOT) ; CUSTOM ITERATOR TO DISPLAY SUBFILES + N SFARR,CNT,DEL,NUM,NAME + D SC^BMXADOS(.SFARR,PARAM) + S CNT=0,DEL=" (" + F S CNT=$O(SFARR(CNT)) Q:'CNT D + . S X=SFARR(CNT) I '$L(X) Q + . S NAME=$P(X,DEL) + . ; F Q:$E(NAME)'=" " S NAME=$E(NAME,2,999) + . I '$L(NAME) Q + . S NUM=+$P(X,DEL,2) I 'NUM Q + . S TOT=TOT+1 + . S ^TMP("BMX ADO",$J,TOT)=NUM_U_NAME_$C(30) + Q "" + ; +SFT(FNAME) ; TRIGGER "YES" TO INDICATE THAT A SUBFILE IS PRESENT WITHIN A FILE + I '$L($G(FNAME)) Q "" + N FIEN + S FIEN=$O(^DIC("B",FNAME,0)) + I 'FIEN Q "" + I '$O(^DD(FIEN,"SB",0)) Q "" + Q "+" + ; diff --git a/m/BMXADOV.m b/m/BMXADOV.m new file mode 100644 index 0000000..f508350 --- /dev/null +++ b/m/BMXADOV.m @@ -0,0 +1,122 @@ +BMXADOV ; CIHA/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET + ;;2.1;BMX;;Jul 26, 2009 + ; + ; + ; + ; VSTG = VIEW STRING: SCHEMA NAME OR IEN~DAS~INDEX~START~STOP~MAX~FORMAT~TAG~ROUTINE~PARAM~JOIN + ; SCHEMA NAME/IEN: FROM THE BMX ADO SCHEMA FILE + ; DAS: THE DA STRING. HIGHEST LEVEL IS FIRST, FOLLOWED BY SUBFILE IENS. CAN BE CONVERTED TO AN 'IENS' STRING. + ; IF THE LAST ',' PIECE OF DAS IS DEFINED, THAT IS USED AS THE CURRENT STARTING SEED POINT FOR THE ITERATOR + ; THE NEXT INDEX VALUE AFTER THE SEED POINT WILL BE THE FIRST ENTRY SELECTED FOR THE CURRENT TRANSACTION + ; INDEX: THE INDEX THAT RUNS THE ITERATOR. IF NULL, THE ITERATOR WULL CYCLE BY IEN + ; START: STARTING LOOKUP VALUE IN THE OVERALL ITERATION (THE FIRST VALUE THAT CAN BE USED IN SPECIFIED INDEX) + ; STOP: THE LAST LOOKUP VALUE IN THE OVERALL ITERATION (THE LAST VALUE USED IN SPECIFIED INDEX) + ; START AND STOP MUST BE IN THE FORMAT (INTERNAL OR EXTERNAL) USED BY THE INDEX + ; IF THE INDEX IS ON A POINTER FIELD, AND POINTED TO FILED IS DINUMNED, THEN THE EXTERNAL VALUE CAN BE USED + ; MAX: MAXIMUM NUMBER OF ENTRIES REURNED IN THE TRANSACTION + ; FORMAT: RETURN INTERNAL OR EXTERNAL VALUES IN THE DATASET + ; TAG AND ROUTINE: ENTRY POINT FOR CUSTOM/COMPLEX ITERATION + ; PARAM: PARAMETER STRING PASSED TO THE ITERATOR ENTRY POINT. + ; ALSO USED WITH THE AA INDEX TO DEFINE PATIENT DFN, V FILE ATTRIBUTE TYPE AND SORT ORDER (C OR R) + ; E.G., 1|WT|R COULD BE PATIENT #1, MEASUREMENT TYPE="WEIGHT" AND REVERSE CHRONOLICAL PRESENTATION OF DATA + ; JOIN: JOIN INSTRUCTIONS; E.G., ...~2,4,.04|2,5,.07|4,9,SUB" + ; + ; +VIEW(OUT,VSTG,TOT) ; EP-VIEW A DATA SET ; GATEWAY TO ALL ITERATORS + ; + ; DON'T CALL THIS EP UNLESS YOU WANT DATA RETURNED WITH THE SCHEMA! + ; INPUT: VSTG AND THE TOTAL NUMBER OF NODES IN THE SCHEMA ARRAY + ; OUTPUT: THE DATA NODES AND THE SEED (SEED IS STUFFED INTO 3RD PIECE OF INTRODUCTORY NODE OF SCHEMA ARRAY) + ; RETURNS THE ADO DATASET IN THE ARRAY SPECIFIED BY 'OUT' + ; THE SEED IS ALWAYS RETURNED IN 'LDA' REGARDLESS OF WHAT ITERATOR IS USED + ; IF ITERATION IS COMPLETED THE SEED WILL HAVE A NULL VALUE + ; + ; + ; + N DAS,DA,IX,START,STOP,MAX,FMT,EP,IENS,OREF,CREF,FIEN,TAG,ROUTINE,X,Y,%,PARAM,NUM,FINFO,LIEN,LDA,LFILE,%DT,T + S SIEN=+$G(VSTG) I SIEN,'$D(^BMXADO(SIEN,0)) S ERR="Invalid schema IEN" D ERR^BMXADO(ERR) Q + I $G(TOT)<2 S ERR="Missing schema string" D ERR^BMXADO(ERR) Q ; MUST HAVE A VALID SCHEMA STRING FOR EACH TRANSACTION +INIT ; INITIALIZE VARIABLES + S T="~" + S FIEN=$P(^BMXADO(SIEN,0),U,2) I '$D(^DD(FIEN,0)) S ERR="Invalid file number in schema file" D ERR^BMXADO(ERR) Q + S DAS=$P(VSTG,T,2),IX=$P(VSTG,T,3) + S START=$P(VSTG,T,4),STOP=$P(VSTG,T,5),MAX=$P(VSTG,T,6) + I $L(START),$L(STOP),START,START=+START,STOP,STOP=+STOP + S %=$T ; NUMERIC START AND STOP + I %,START>STOP S ERR="Invalid start stop pair" D ERR^BMXADO(ERR) Q + I '%,$L(START),$L(STOP),START]STOP S ERR="Invalid start stop pair" D ERR^BMXADO(ERR) Q + I $L(MAX),(MAX'>0!(MAX'=MAX\1)) S ERR="Invalid MAX parameter" D ERR^BMXADO(ERR) Q + S FMT=$P(VSTG,T,7),TAG=$P(VSTG,T,8),ROUTINE=$P(VSTG,T,9),PARAM=$P(VSTG,T,10),NUM=0 + I $L(TAG),'$L(ROUTINE) S ERR="Invalid EP info" D ERR^BMXADO(ERR) Q + S EP=TAG_U_ROUTINE I EP=U S EP="" + I $L(EP) X ("S %=$L($T("_EP_"))") I '% S ERR="Invalid EP info" D ERR^BMXADO(ERR) Q + I FMT='"I" S FMT="" + I MAX="" S MAX=100 + I $G(JOIN) S MAX=999999999 ; MAX IS UNLIMITED FOR SECONDARY DATA SETS DURING JOINS + S IENS=$$IENS(DAS) ; CONVERT DA STRING TO IEN STRING ; DAS AND IENS MUST BE AVAILABLE TO ALL ITERATORS + S OREF=$$ROOT^DILFD(FIEN,IENS) I '$L(OREF) S ERR="Unable to generate a vaild open reference" D ERR^BMXADO(ERR) Q + S CREF=$$CREF^DILF(OREF) I '$L(CREF) S ERR="Unable to generate a vaild closed reference" D ERR^BMXADO(ERR) Q +DATA ; GET DATA +SPEC I $L(EP) D Q ; SPECIAL CASE: USE CUSTOM ITERATOR + . I '$G(LDA) S LDA="" + . X ("S LDA=$$"_EP_"(PARAM,IENS,MAX,.OUT,.TOT)") + . D SEED(LDA) + . Q + I IX="" S LDA=$$NUMIT^BMXADOV1(+$G(DA)) D SEED(LDA) Q ; NO INDEX USED: ITERATE IN IEN ORDER + I IX="AA",FIEN=9000013!(FIEN=9000019) S IX="AC" ; 'AA' ITERATION UNNECESSARY FOR SOME FILES. BETTER TO USE 'AC' + I '$L($O(@CREF@(IX,""))) Q ; NO INDEXED DATA AVAILABLE, SO QUIT NOW + I IX="AA" D Q ; SPECIAL CASE: AA INDEX + . I FIEN=9000011 S LDA=$$AAP^BMXADOV1 Q ; THE AA INDEX FOR 'PROBLEMS'; LDA ALWAYS NULL + . S LDA=$$AA^BMXADOV1 D SEED(LDA) ; THE VISIT/V-FILE AA INDEX + . Q + S FINFO=$$IXFLD(FIEN,IX) I FINFO="" Q ; FILE INFO: IX FIELD NUMBER, TYPE, AND DINUM SUBTYPE + I $P(FINFO,U,2)="D" D ; PREP FOR DATE INDEX LOOKUP + . I $L(START) S X=START D ^%DT S START=+Y + . I $L(STOP) S X=STOP D ^%DT S STOP=+Y + . Q + I $P(FINFO,U,2)="P",$E(START)="`" D Q ; SPECIAL CASE: SHORTCUT TO POINTER LOOKUP FOR A SINGLE, SPECIFIC IEN. + . S LIEN=+$E(START,2,99) + . S LDA=$$LOOK^BMXADOV1(LIEN) + . D SEED(LDA) + . Q + I $P(FINFO,U,4) S LFILE=$P(FINFO,U,3) I LFILE D Q ; SPECIAL CASE: DINUM -> TEXT LOOKUP. + . S LDA=$$LOOK2^BMXADOV1(LFILE) + . D SEED(LDA) + . Q + S LDA=$$LOOK1^BMXADOV1 ; STD INDEX LOOKUP: START FROM SCRATCH + D SEED(LDA) ; CAPTURE RE-ENTRY SEED + Q + ; +SEED(LDA) ; UPDATE THE SCHEMA STRING WITH THE SEED PARAMETER + N X,Y + S X=@OUT@(1) + S Y=$P(X,U) + S $P(Y,"|",3)=LDA + S $P(X,U,1)=Y + S @OUT@(1)=X + Q + ; +IENS(DAS) ;EP - CONVERT DAS STRING TO IENS STRING + N I,L,IENS + S DAS=$G(DAS) + S DAS=$TR(DAS,"+","") + S DAS=$TR(DAS,"-","") + I '$L(DAS) Q "," + I DAS="," S DAS="" + S L=$L(DAS,C) + S IENS="" + F I=L:-1:1 S IENS=IENS_$P(DAS,C,I)_C + Q IENS + ; +IXFLD(FIEN,IX) ;EP - GIVEN AN FILE NUMMER AND INDEX NAME, RETURIN THE FIELD NUMBER, TYPE, AND DINUM SUBTYPE + N FLD,TYPES,T,X,I + I '$G(FIEN) Q "" + I '$L($G(IX)) Q "" + S FLD=$O(^DD(FIEN,0,"IX",IX,FIEN,0)) + I 'FLD Q FLD + S TYPES="DNSFWCPVM",T=$P($G(^DD(FIEN,FLD,0)),U,2) + F I=1:1 S X=$E(TYPES,I) Q:'$L(X) I T[X Q + I X="P" S X=X_U_+$P(T,"P",2) I $P(^DD(FIEN,FLD,0),U,5)["DINUM" S X=X_U_1 + S FLD=FLD_U_X + Q FLD + ; diff --git a/m/BMXADOV1.m b/m/BMXADOV1.m new file mode 100644 index 0000000..7b9cb87 --- /dev/null +++ b/m/BMXADOV1.m @@ -0,0 +1,229 @@ +BMXADOV1 ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ; + ;;2.1;BMX;;Jul 26, 2009 + ; CONTINUATION FILE FOR BMXADOV + ; MANAGES ITERATION FOR INDIVIDUAL INDEX TYPES + ; ASSUMES CERTAIN LOCAL VARS: CREF,FIEN,IENS,DAS (<-THESE CAN'T BE NULL),START,STOP,MAX,TOT,NUM,IX + ; + ; + ; +DATA(IENS,DA,XCNT) ;EP - ADD DATA NODES TO ARRAY + ; ASSUMES THAT VSTG VARIABLES AND THE OUT ARRAY ARE PRESENT + I '$G(DA) Q + I '$L(IENS) Q + S $P(IENS,C)=DA + N STG,X,Y,%,FLD,STOP,VAL,CNT,FIEN,LINE,IFLAG,IDEP,TFLD,TNO,TEF + S STG=DA + I $G(DAS),$E(DAS,$L(DAS))="," S STG=$TR(DAS,",",U)_STG ; FIX FOR SUBFILE + S CNT=$L(IENS,",") ; START AFTER THE .001 FIELD + I $G(SUB) S STG=$P(IENS,C,2)_U_DA ; MAKE DAS FOR A SUBFILE. THIS WILL BE THE IST PIECE OF THE DATA STRING + I $G(XCNT) S CNT=XCNT ; USED WITH JOINS + F S CNT=$O(@OUT@(CNT)) Q:'CNT Q:$G(STOP) D I @OUT@(CNT)[$C(30) Q ; LOOP TO CREATE THE DATA STRING + . K IFLAG,IDEP + . S FIEN=+@OUT@(CNT) I '$D(^DD(FIEN,0)) S STOP=1 Q + . S FLD=$P(@OUT@(CNT),B,2) + . I FLD=".01ID" D Q ; PROCESS THE IDENTIFIER FIELD + .. I '$G(SIEN) Q + .. S %=$O(^BMXADO(SIEN,1,"B",".01ID",0)) I '% Q + .. S IDEP=$G(^BMXADO(SIEN,1,%,1)) I '$L(IDEP) Q + .. X ("S VAL=$$"_IDEP_"("_+STG_")") ; PASS THE DA TO THE IDENTIFIER EXTRINSIC FUNCTION, RETURN IDENTIFIERS + .. S VAL=$TR(VAL,"^",""),VAL=$TR(VAL,B,"") + .. S STG=STG_U_VAL + .. Q + . I $G(SIEN),FLD S %=$O(^BMXADO(SIEN,1,"B",FLD,0)) I %,$P($G(^BMXADO(SIEN,1,%,0)),U,9) S IFLAG=1 ; SCHEMA FILE SAYS FORCE INTERNAL VALUE FOR THIS FIELD + . K TFLD + . I FLD["TRIGGER" S TFLD=FLD,FLD=+FLD,IFLAG=1 + . I FLD["IEN" S FLD=+FLD,IFLAG=1 ; LOOKUP VALUE FIELD (IEN) + . I '$D(^DD(FIEN,FLD,0)),FLD'=.001 S STOP=1 Q + . I $D(TFLD),FLD=.001 S VAL=+IENS + . E S VAL=$$GET1^DIQ(FIEN,IENS,FLD,$S($G(IFLAG):"I",$G(TFLAG):"I",1:$G(FMT))) + . I $G(TFLD) D S STG=STG_U_VAL Q ; GENERATE A TRIGGERED VALUE FOR THIS FIELD + .. S TNO=$O(^BMXADO(SIEN,1,"B",TFLD,0)) I 'TNO S VAL="" Q + .. S TEF=$G(^BMXADO(SIEN,1,TNO,3)) I '$L(TEF) S VAL="" Q ; GET EXTR FUNCT THAT GENERATES A SECONDARY VALUE + .. X ("S VAL=$$"_TEF_"(VAL)") + .. Q + . I FLD=.01,VAL="" S STOP=1 Q ; INVALID FILEMAN ENTRY! SKIP IT + . S VAL=$TR(VAL,"^",""),VAL=$TR(VAL,B,"") + . S STG=STG_U_VAL + . Q + I $G(STOP) Q ; DON'T ADD NODE IF DD INFO IS INVALID + F S LINE=$E(STG,1,250),STG=$E(STG,251,999999) D I '$L(STG) Q ; PREVENTS DATA LENGTH FROM EXCEEDING 250 BYTES + . S TOT=TOT+1 + . I '$L(STG) S LINE=LINE_$C(30),NUM=NUM+1 ; END OF RECORD, RECORD TOTAL IS UPDATED + . S @OUT@(TOT)=LINE ; NODE IS ADDED + . Q + Q + ; +NUMIT(DA) ; EP-ITERATE BY NUMBER + N XIT,LDA + I IENS S DA=+IENS ; RE-ENTRY FROM SEED + I '$G(DA),$G(START) S DA=START-1 + I '$G(DA) S DA=0 + S LDA="" + F S DA=$O(@CREF@(DA)) D I $G(XIT) Q + . I 'DA S XIT=1,LDA="" Q ; NO MORE IENS - THE END OF THE LINE + . D DATA(IENS,DA,+$G(XCNT)) + . I $G(STOP),$O(@CREF@(DA))>STOP S LDA="",XIT=1 Q ; AS FAR AS YOU ARE ALLOWED TO GO FOR NUMBER ITERATION + . I NUM=MAX S LDA=DA,XIT=1 Q ; REACHED THE MAX TRANSACTION LIMIT - GET MORE NEXT TIME + . Q + I LDA,'$O(@CREF@(LDA)) S LDA="" ; END OF THE LINE SO SET LDA TO NULL + Q LDA + ; +LOOK(LIEN) ; EP-ITERATE BY A SINGLE STANDARD INDEX THAT IS A POINTER VALUE + N XIT,LDA + S DA=+IENS + F S DA=$O(@CREF@(IX,LIEN,DA)) D I $G(XIT) Q + . I 'DA S XIT=1,LDA="" Q ; NO MORE IENS - THE END OF THE LINE + . D DATA(IENS,DA,$G(XCNT)) + . I NUM=MAX S LDA=DA,XIT=1 Q ; REACHED THE MAX TRANSACTION LIMIT - GET MORE NEXT TIME + . Q + I '$O(@CREF@(IX,LIEN,DA)) Q "" + Q LDA + ; +LOOK1() ; EP-ITERATE USING A STANDARD INDEX + N XIT,LDA,VAL,DA,% + S DA=+IENS I 'DA G SCRATCH ; CHECK FOR RE-RENTRY +REENTER ; RE-ENTER STD ITERATION USING DA AS THE SEED + S %=$$IXVAL(FIEN,IX,DAS) I '$L(%) Q "" ; GET STARTUP INFO +LR S VAL=$P(%,B,3) + I VAL="" Q "" ; NO VAL FOUND FOR INITIAL ITERATION, SO QUIT + F S DA=$O(@CREF@(IX,VAL,DA)) Q:'DA D DATA(IENS,DA,+$G(XCNT)) I NUM=MAX S LDA=DA,XIT=1 Q ; SWEEP UP ALL THE REMAINING DAS UNDER THE CURRENT VALUE + I $G(XIT) Q:'$O(@CREF@(IX,VAL,LDA)) "" Q LDA ; IF NO MORE AFTER MAX, SET LDA = NULL + G LOOK1R ; SEED IS DEFINED +SCRATCH S VAL="" ; STD LOOKUP STARTING FROM SCRATCH + I $L(START) S VAL=$O(@CREF@(IX,START),-1) ; GET SEED FOR ITERATION +LOOK1R F S VAL=$O(@CREF@(IX,VAL)) D I $G(XIT) Q ; EP - RE-ENTRY POINT IF SEED IS DEFINED + . I VAL="" S LDA="",XIT=1 Q ; END OF THE LINE + . I STOP=+STOP,VAL=+VAL,VAL>STOP S LDA="",XIT=1 Q + . I $L(STOP),VAL]STOP S LDA="",XIT=1 Q ; LOOKUP LIMITS + . S DA=0 + . F S DA=$O(@CREF@(IX,VAL,DA)) Q:'DA D I $G(XIT) Q + .. D DATA(IENS,DA,+$G(XCNT)) + .. I NUM=MAX S LDA=DA,XIT=1 D ; TRANSACTION LIMIT ; CHECK FOR MORE + ... I $O(@CREF@(IX,VAL,DA)) Q + ... S %=$O(@CREF@(IX,VAL)) I %="" S LDA="" Q + ... I $L(STOP),%]STOP S LDA="" Q + ... I '$O(@CREF@(IX,%,0)) S LDA="" Q + ... Q + .. Q + . Q + Q LDA + ; +LOOK2(LFILE) ; EP-TEXT POINTER LOOKUP + ; CHANGE THE GLOBAL REFERENCE FOR THE LOOKUP TO THE POINTED-TO FILE BEFORE PROCEEDING + N XIT,LDA,OREF,CREF,VAL,DA + S OREF=$$ROOT^DILFD(LFILE,IENS) I '$L(OREF) Q "" + S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" + S DA=+IENS + I '$G(DA) G SCRATCH ; START FROM SCRATCH + S %=$$IXVAL(LFILE,IX,DAS) I '$L(%) Q "" + G LR ; RE-ENTER + ; +IXVAL(FIEN,IX,DAS) ; GIVEN A FILE IEN, INDEX NAME, AND DAS STRING, RETURN THE VALUE USED IN THE INDEX + N DA,FLD,IENS,OREF,CREF,XREF,VAL,UP,LEV,L + I '$D(^DD(+$G(FIEN),0)) Q "" ; MISSING OR INVALID FILE NUMBER + I '$L($G(IX)) Q "" ; NO INDEX SPECIFIED + S UP=FIEN F LEV=1:1 S UP=$G(^DD(UP,0,"UP")) Q:'UP + I LEV'=$L(DAS,C) Q "" ; DAS LEVELS MUST MATCH FILE OR SUBFILE LEVEL + S IENS=$$IENS^BMXADOV($G(DAS)) I IENS=U Q "" + S OREF=$$ROOT^DILFD(FIEN,IENS) I '$L(OREF) Q "" + S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" + I '$D(@CREF@(IX)) Q CREF_"||" ; NO INDEX VALUES TO CHECK + S XREF=OREF_IX_")" + S DA=+IENS I 'DA Q CREF_"||" + I '$D(@CREF@(DA)) Q CREF_"||" ; NO ENTRY EXISTS + I IX="AA" G AA + S FLD=+$$IXFLD^BMXADOV(FIEN,IX) I 'FLD Q "" ; INVALID DD + S VAL=$$GET1^DIQ(FIEN,IENS,FLD,"I") I VAL="" Q "" ; VALUE IS NULL - NOTHING TO INDEX + I '$D(@CREF@(IX,VAL,DA)) Q "" ; INVALID INDEX + Q XREF_B_DA_B_VAL + ; +AA() ;EP - VISIT/V-FILE ITERATION USING THE 'AA' INDEX + N LDA,XIT,AAINFO,DA,%,X,Y,DFN,TYPE,ORD,ISTART,ISTOP,IDT,AAREF,%DT,DIC + S X=OREF_"""AA"")",%=$Q(@X) I %="" Q "" + S TYPE="" I $L(%,C)=5 S TYPE=$P(PARAM,B,2) I TYPE="" Q "" ; FOR CERTAIN V FILES, TYPE MUST BE DEFINED + I $E(TYPE)="`" S TYPE=$E(TYPE,2,99) I 'TYPE Q "" ; REMOVE ` FROM TYPE IEN + I $L(TYPE),'TYPE D I TYPE'>0 Q "" ; QUIT IF INVALID TYPE + . S %=$P($G(^DD(FIEN,.01,0)),U,2) + . S DIC=+$P(%,"P",2) I '$D(^DD(DIC,.01,0)) Q + . S X=TYPE,DIC(0)="M" D ^DIC I Y=-1 Q + . S TYPE=+Y + . Q + S DFN=+PARAM + I '$D(^DPT(DFN,0)) Q "" ; PATIENT DFN MUST BE DEFINED + I 'TYPE S AAREF=OREF_"""AA"","_DFN_")" + E S AAREF=OREF_"""AA"","_DFN_","_TYPE_")" + I '$D(@AAREF) Q "" ; IF NOTHING UNDER AA INDEX, DON'T BOTHER LOOKING + S ISTART=9999999 I START S X=START,%DT="P" D ^%DT S ISTART=9999999-Y + S ISTOP=0 I STOP S X=STOP,%DT="P" D ^%DT S ISTOP=9999999-Y + S ORD=-1 I $P(PARAM,B,$L(PARAM,B))="R" S ORD=1 ; SORT IN CHRONOLOGICAL OR REVERSE CHRONOLOGICAL ORDER + I ORD=-1 S X=$G(ISTART),Y=$G(ISTOP),ISTOP=X,ISTART=Y ; CHANGES REQUIRED TO PRESENT DATA IN CHRONOLIGICAL ORDER + S IDT=0,LDA="" + I ISTOP S IDT=ISTOP-.0000001 + S DA=+IENS + I DA S IDT=$$AAR I 'IDT Q LDA ; SWEEP UP REMAINING IENS FOR CURRENT IDT AND RESET IDT FOR RE-ENTRY + F S IDT=$O(@AAREF@(IDT),ORD) Q:'IDT D I $G(XIT) Q + . I ORD=1,IDT>ISTART S LDA="",XIT=1 Q + . I ORD=-1,IDTDATE S DATE=+X,MAX=DA + . Q + I 'MAX Q "" + S DA=MAX + D DATA^BMXADOV1(IENS,DA) + Q "" + ; +MCDIEN(DFN) ; EP-GIVEN A PATIENT IEN, RETRUN THE IEN OF THAT PT'S MOST RECENT RECORD IN MEDICAID ELIGIBILITY FILE + N MIEN,DA,DATE,MAX,X + S DFN=+$G(DFN),MAX="",DATE=0 + S MIEN=0 F S MIEN=$O(^AUPNMCD("B",DFN,MIEN)) Q:'MIEN D + . S DA=0 F S DA=$O(^AUPNMCD(MIEN,11,DA)) Q:'DA D + .. S X=+$P($G(^AUPNMCD(MIEN,11,DA,0)),U,2) + .. I X>DATE S DATE=X,MAX=MIEN + .. Q + . Q + Q MAX + ; +MEDICAID(PARAM,IENS,MAX,OUT,TOT) ; + ; NO PARAM REQUIRED BUT SINCE THIS IS A SUBFILE, THE PATIENT IEN MUST BE IH IENS + ; FETCHES THE MOST RECENT MEDICARE RECORD FOR THE PATIENT + N MIEN,DA,X,Y,%,LIM,DATE,MAX + S LIM=DT-10000,DA=0,DATE=0,MAX=0 + S MIEN=$P(IENS,C,2) I 'MIEN Q "" + F S DA=$O(^AUPNMCD(MIEN,11,DA)) Q:'DA D + . S X=$G(^AUPNMCD(MIEN,11,DA,0)) + . I +X>DATE S DATE=+X,MAX=DA + . Q + I 'MAX Q "" + S DA=MAX + D DATA^BMXADOV1(IENS,DA) + Q "" + ; +PT(VAL,IENS,MAX,OUT,TOT) ; EP - PATIENT LOOKUP ; GIVEN A LOOKUP VALUE, GENERATE A LIST OF PATIENTS + N DFN,BMXNOID,DA,X,Y,%,LIM,FILE,NUM,IXS,GBL,CNT,SS + I $G(VAL)="" Q "" + S BMXNOID=1 + I '$G(MAX) S MAX=999 + I $G(^DD("2","0","ID","IHS0"))="D ^AUPNLKID" S ^("IHS0")="D:'$G(BMXNOID) ^AUPNLKID" ; MUST BE A SILENT CALL + S SS="BMX DFN2",GBL=$NA(^TMP(SS,$J)) K @GBL + S CNT=0,DFN=0 + F S DFN=$O(^AUPNPAT("D",VAL,DFN)) Q:'DFN S CNT=CNT+1 S @GBL@("DILIST",2,CNT)=DFN ; FIRST, TRY TO MATCH CHART NUMBER + I CNT G PTIT + I VAL?3N1"-"2N1"-"4N S VAL=$TR(VAL,"-","") ; TRANSFORM SSN + I VAL?9N G PT1 + S %=$L(VAL),X=$E(VAL,%-1,%) + I X?2N S X=VAL,%DT="P" D ^%DT S VAL=Y ; TRANSFORM DATE TO INTERNAL VALUE +PT1 K @GBL S SS="BMX DFN1",GBL=$NA(^TMP(SS,$J)) K @GBL + D FIND^DIC(2,"","","",VAL,999,"B^ADOB^SSN","","",GBL,"") + I '$D(^TMP(SS,$J,"DILIST",2)) Q "" ; UNSUCCESSFUL LOOKUP +PTIT ; ITERATE + S CNT=0,NUM=0 + F S CNT=$O(^TMP(SS,$J,"DILIST",2,CNT)) Q:'CNT S DA=^(CNT) I DA D DATA^BMXADOV1(IENS,DA) + I $G(^DD("2","0","ID","IHS0"))="D:'$G(BMXNOID) ^AUPNLKID" S ^("IHS0")="D ^AUPNLKID" ; RESTORE DD NODE + ; K @GBL ; CLEANUP + Q "" + ; +HRN(DFN) ; EP - GIVEN A PATIENT DFN, RETURN THE LOCAL CHART NUMBER + Q $P($G(^AUPNPAT(+$G(DFN),41,+$G(DUZ(2)),0)),U,2) + ; +PVTINS ; + ; NO PARAM REQUIRED BUT SINCE THIS IS A SUBFILE, THE PATIENT IEN MUST BE IH IENS + N DFN,DA,X,Y,%,LIM + S LIM=DT-10000,DA=0 + S DFN=$P(IENS,C,2) I 'DFN Q "" + F S DA=$O(^AUPNPRVT(DFN,11,DA)) Q:'DA D + . S X=$G(^AUPNPRVT(DFN,11,DA,0)) + . I '$L(X) Q + . S %=$P(X,U,7) + . I '%!(%>LIM) D DATA^BMXADOV1(IENS,DA) + . Q + Q "" + ; +DUPV(PARAM,IENS,MAX,OUT,TOT) ; EP - DUPLICATE VISIT ITERATION + ; PARAM: 'DFN|VISIT TIMESTAMP|TYPE|LOCATION|CATEGORY + ; PATIENT DFN AND VISIT TIMESTAMP (EXTERNAL DATE FORMAT) MUST EXIST. + ; THE OTHER 3 DUP PARAMETERS WILL BE CHECKED ONLY IF THEY ARE DEFINED. + ; ALL DUPS ARE RETURNED. MAX,START,STOP ARE IGNORED + N DFN,TIME,TYPE,LOC,CAT,IDT,VIEN,DAY,X,PATIENT,Y,%DT,FMTIME,DA,IENS + S DFN=+PARAM,TIME=$P(PARAM,B,2),TYPE=$P(PARAM,B,3),LOC=$P(PARAM,B,4),CAT=$P(PARAM,B,5) + I $D(^DPT(+$G(DFN),0)),$L($G(TIME)) + E Q "" + S X=TIME,%DT="T" D ^%DT I Y=-1 Q + S FMTIME=Y + S (IDT,DAY)=9999999-(FMTIME\1),IDT=IDT-.0000001 + F S IDT=$O(^AUPNVSIT("AA",DFN,IDT)) Q:$E(IDT,1,7)'=DAY S VIEN=999999999999 F S VIEN=$O(^AUPNVSIT("AA",DFN,IDT,VIEN),-1) Q:'VIEN D + . S X=$G(^AUPNVSIT(VIEN,0)) I '$L(X) Q ; VISIT DATA MUST EXIT + . I $P(X,U,11) Q ; MUST BE AN 'ACTIVE' VISIT - NOT 'DELETED' + . I $L(TYPE),TYPE'=$P(X,U,3) Q + . I $L(LOC),LOC'=$P(X,U,6) Q + . I $L(CAT),CAT'=$P(X,U,7) Q + . S DA=VIEN,IENS=DA_C + . D DATA^BMXADOV1(IENS,DA) + . Q + Q "" + ; +DAIT(DSTG,IENS,MAX,OUT,TOT) ; EP - SET OF IENS ITERATION. + ; THE DSTG CONTAINS A "|" SET OF DAS STRINGS + ; ALL VALUES ARE RETURNED. MAX IS NOT CHECKED. START AND STOP ARE IRRELEVANT + N PCE,DA,XIT,IENS,L,DAS + S L=$L(DSTG,B) + F PCE=1:1:L S DAS=$P(DSTG,B,PCE) D I $G(XIT) Q + . I 'DAS S XIT=1 Q ; NO MORE IENS - THE END OF THE LINE + . I DAS'[C S IENS=DAS_C + . E S IENS=$$IENS^BMXADOV(DAS) + . S DA=+IENS + . D DATA^BMXADOV1(IENS,DA) + . Q + Q "" + ; +APRV(PARAM,IENS,MAX,OUT,TOT) ; EP - RETURN A LIST OF ALL ACTIVE PROVIDERS + ; ALL VALUES ARE RETURNED. MAX IS NOT CHECKED. START AND STOP ARE IRRELEVANT + N NAME,DA,STG + S NAME="" + F S NAME=$O(^VA(200,"B",NAME)) Q:NAME="" D + . S DA=0 + . F S DA=$O(^VA(200,"B",NAME,DA)) Q:'DA D + .. I $P($G(^VA(200,DA,"PS")),U,4) Q ; CHECK INACTIVE DATE FIELD + .. D DATA^BMXADOV1(IENS,DA) + .. Q + . Q + Q "" + ; diff --git a/m/BMXADOVJ.m b/m/BMXADOVJ.m new file mode 100644 index 0000000..d91c4c1 --- /dev/null +++ b/m/BMXADOVJ.m @@ -0,0 +1,78 @@ +BMXADOVJ ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ; + ;;2.1;BMX;;Jul 26, 2009 + ; THIS ROUTINE MANAGES THE JOINS + ; + ; + ; + ; THE FIFTH PARAMETER OF SS^BMXADO CONTAINS THE JOIN INSTRUCTIONS + ; SYNTAX: DESCENDANT SCHEMA IEN (DETAILS FILE), JOIN FIELD FROM MASTER FILE + ; THE FIRST "," PIECE STATES THAT THE MASTER FILE IS JOINED BY ITS .02 FIELD TO THE DETAILS FILE + ; THE SECOND "," PIECE STARTES THAT THE DETAILS FILE IS DEFINED BY SCHEMA #6 + ; AN OPTIONAL 3RD "," PIECE MAY CONTAIN A SECONDARY VSTG TO MORE PRECISELY DEFINE JOIN ITERATION + ; E.G., "...~6.,.02,AA~1/1/2004~2/1/2004~~~~~|WT|R" + ; IN THIS CASE, THE SECONDARY VSTG SPECIFIES THAT THE AA INDEX BE USED TO CONTROL THE ITERATOR + ; THE START AND STOP DATES ARE IN EFFECT BUT MAX IS IGNORED/IRRELEVANT + ; THE 1ST "|" PIECE OF THE PARAM SECTION WILL BE AUTOMATICALLY STUFFED WITH PATEINT DFN(S) DURING ITERATION + ; IF MULTIPLE JOINS ARE REQUESTED, THEY ARE SPARATED BY THE '@JOIN@' DELIMTER + ; "E.G., 6,.02@JOIN@1,.03@JOIN@2,.02@JOIN@9,SUB" + ; IN THIS EXAPLE THE MASTER FILE IS JOIND TO THE DETAILS FILES ASSOCIATED WITH SCHEMAS 6, 1, AND 9 + ; NOTE THAT THE 3RD JOIN DEINED IN THE STRING SPECIFIES A SUBFILE REALTION RATHER THAN A "POINTER" RELATION + ; IF A SECOND RECORD SET IS CREATED TO FULFILL A JOIN REQUEST, IT WILL ONLY CONTAIN THE ROWS NECESSARY TO COMPLETE THE JOIN + ; +JOIN(SMASTER,JSTG) ;EP - APPEND ADDITIONAL ANRS TO FULFILL JOIN REQUESTS + N TMP,JOIN,JINST,FMASTER + I '$L($G(JSTG)) Q ; JOIN STRING MUST NOT BE NULL + S FMASTER=$P($G(^BMXADO(+$G(SMASTER),0)),U,2) I 'FMASTER Q ; MASTER SCHEMA & FILE MUST EXIST + S TMP=$NA(^TMP("BMX JOIN",$J)) K @TMP ; JOIN INFO TEMP STORAGE ARRAY + S @TMP@(0,SMASTER)=$$RANGE ; GET DATA NODE RANGE FOR THE MASTER ANR + I '$D(@TMP@(0)) Q ; DATA MUST EXIST IN THE MASTER FILE OR QUIT + F JOIN=1:1 S JINST=$P(JSTG,"@JOIN@",JOIN) Q:JINST="" D J(SMASTER,JINST) ; MAIN LOOP FOR DOING JOINS + K @TMP + Q + ; +RANGE() ; GET DATA NODE RANGE FOR LAST SCHEMA ENTERED + N X,FIRST,LAST,Y + S (X,LAST)=$O(@OUT@(999999999),-1) + F S X=$O(@OUT@(X),-1) Q:'X S Y=@OUT@(X) Q:Y'[$C(30) S FIRST=X + I '$G(FIRST) Q "" + S FIRST=FIRST+1 + Q (FIRST_U_LAST) + ; +J(SMASTER,JSTG) ; JOIN DETAILS FILE TO MASTER FILE + ; SMASTER=MASTER SCHMA IEN, SDETAIL=DETAILS SCHEMA IEN + N JARR,SEC,ERR,JIEN,SUB,IX,PARENT,JFLD,DFLD,NODE,X,STOP,VSTG2,SDETAIL,JFLD + S SDETAIL=$P(JSTG,C),JFLD=$P(JSTG,C,2),DFLD=$P(JSTG,C,3),VSTG2=$P(JSTG,C,4,999) + I JFLD="SUB" S JFLD=.001,DFLD=.0001 + I JFLD=.001,DFLD=.0001 S SUB=1,VSTG2="~~~~~SIT~BMXADOVJ~" ; MAKE SUBFILE ITERATOR VSTG + D IEN(SMASTER,SDETAIL,JFLD) ; GET A LIST OF JOIN IENS FROM THE MASTER FILE + I '$D(@TMP@(1)) Q ; NO MASTER FILE IENS FOR JOINS, SO QUIT + N FIEN,DAS,SIEN,VSTG,JSTG + S DAS="",SIEN=SDETAIL,VSTG=VSTG2 + S FIEN=$P($G(^BMXADO(SIEN,0)),U,2) I 'FIEN Q + D JEP^BMXADO ; BUILD THE JOIN ANR + Q + ; +IEN(SMASTER,SDETAIL,JFLD) ; GET THE MASTER FILE IENS FOR BUILDING THE JOIN DATA SET + N FIEN,%,FIRST,LAST,NODE,DA,IEN + I JFLD["IEN" S JFLD=+JFLD + S FIEN=$P($G(^BMXADO(SMASTER,0)),U,2) I 'FIEN Q + S %=$G(@TMP@(0,SMASTER)) I '$L(%) Q + S FIRST=+%,LAST=$P(%,U,2),NODE=FIRST-.1 + F S NODE=$O(@OUT@(NODE)) Q:'NODE Q:NODE>LAST D + . S DA=+@OUT@(NODE) + . I 'DA Q + . I JFLD=.001 S @TMP@(1,SDETAIL,DA)="" Q + . S IEN=$$GET1^DIQ(FIEN,(DA_C),JFLD,"I") I 'IEN Q + . S @TMP@(1,SDETAIL,IEN)="" + . Q + Q + ; +JFLD ; EP-STUFF JOIN FIELD IDS INTO THE INTRO SEGMENT OF THE SCHEMA + N NODE,% + S NODE=999999999999 + F S NODE=$O(@OUT@(NODE),-1) Q:'NODE I ^(NODE)["@@@meta@@@" Q + I 'NODE Q + S %=$P(@OUT@(NODE),U),$P(%,"|",4)=$G(JFLD),$P(%,"|",5)=$G(DFLD) + S @OUT@(NODE)=%_U + Q + ; diff --git a/m/BMXADOX.m b/m/BMXADOX.m new file mode 100644 index 0000000..f436c12 --- /dev/null +++ b/m/BMXADOX.m @@ -0,0 +1,501 @@ +BMXADOX ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; + ;;2.1;BMX;;Jul 26, 2009 + ; EXMAPLES OF RPMS SCHEMAE GENERATION + ; + ; +DISP(OUT) ;EP - TEMP DISPLAY + N I,X + S I=0 W ! + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X + Q + ; +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN + N IEN + S IEN=$O(^BMXADO("B",NAME,0)) + Q IEN + ; +NEXTNUM(DFN,LOC) ; RETURN THE NEXT PROBLEM NUMBER FOR A PATIENT + N X,LAST,MAX,NUM + S NUM=0,MAX="" + F S NUM=$O(^AUPNPROB("AA",DFN,LOC,NUM)) Q:NUM="" S X=$E(NUM,2,99) I +X>MAX S MAX=+X + I 'MAX Q 1 + S X=X+1 S X=X\1 + Q X + ; +DEMOG ; VIEW DEMOGRAPHICS + N OUT,%,DFN,MAX,SIEN + S DFN=1,MAX=1000 + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") + D SS^BMXADO(.OUT,SIEN,"",("~"_DFN_"~"_DFN_"~"_MAX)) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +MEDICARE ; UPDATE MEDICARE DATES/INFO + N OUT,%,DAS,PIEN,JIEN,DFN,MAX + S DFN=1,MAX=1000 + S DAS=DFN_"," + S PIEN=$$SCHEMA("UPDATE MEDICARE DATES") + S JIEN=$$SCHEMA("UPDATE MEDICARE INFO") + D SS^BMXADO(.OUT,PIEN,DAS,("~"_DFN_"~"_DFN_"~"_MAX_"~~"_"MEDICARE~BMXADOV2~~"_JIEN_",PARENT")) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +MEDICAID ; VIEW MEDICAID DATES/INFO + N OUT,%,DAS,PIEN,JIEN,DFN,DA + S DFN=3 + S DA(1)=$$MCDIEN^BMXADOV2(DFN) I 'DA(1) Q + S DAS=DA(1)_"," + S PIEN=$$SCHEMA("UPDATE MEDICAID DATES") + S JIEN=$$SCHEMA("UPDATE MEDICAID INFO") + D SS^BMXADO(.OUT,PIEN,DAS,("~~~~~MEDICAID~BMXADOV2~~"_JIEN_",PARENT")) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +PVTINS ; VIEW PRIVATE INSURANCE DATES/INFO + N OUT,%,DAS,SIEN,DFN + S DFN=1 + S DAS=DFN_"," + S SIEN=$$SCHEMA("UPDATE PVT INSURANCE INFO") + D SS^BMXADO(.OUT,SIEN,DAS,"~~~~~PVTINS~BMXADOV2~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +VISIT ; VIEW VISITS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~100~~~~1|R") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +DUPVIS ; DISPLAY POSSIBLE DUPLICATE VISITS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~1|4/19/04@1PM|I|4585|A~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDVIS ; ADD A NEW VISIT + N OUT,%,SIEN,DFN,NODE + S DFN=3 + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^JUN 03, 2004@09:32^I^`3^`4585^A^`1"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +POV ; DISPLAY POVS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VIEW POVS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~100~~~~1|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +FLDS ; GET FILEMAN FIELDS + N OUT,%,SIEN,DFN + S SIEN=$$SCHEMA("FIELDS") + D SS^BMXADO(.OUT,SIEN,"","~~~~~FLDIT~BMXADOS1~3.7~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +FINFO ; GET FILEMAN FILEINFO + N OUT,%,SIEN,DFN + S SIEN=$$SCHEMA("FILEMAN FILEINFO") + D SS^BMXADO(.OUT,SIEN,"","~~~~~FNIT~BMXADOS1~3.7~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPOV ; ADD A POV TO AN EXISITING VISIT + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE POVS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`8718^`1^`71164^DM II ON NEW MEDS^2^P"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +EDITPOV ; ADD A POV TO AN EXISITING VISIT + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE POVS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="100123^`8718^`1^`71164^DM II ON SPECIAL MEDS^2^P"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +PROB ; DISPLAY PROBLEMS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VIEW PROBLEMS") + D SS^BMXADO(.OUT,SIEN,"","AA~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPROB ; ADD A PROBLEM TO THE PROBLEM LIST + N OUT,%,SIEN,DFN,NODE,NUM,LOC,ICD,TEXT,AIR,IEN + S ICD=2477 + S TEXT="HYPERTENSION ON SPECIAL MEDS" + S DFN=1,LOC=DUZ(2),AIR="A" + S SIEN=$$SCHEMA("UPDATE PROBLEMS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)=U_"`"_ICD_U_"`"_DFN_U_DT_U_U_TEXT_U_"`"_LOC_U_DT_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + S IEN=+$P(OUT(1),"|",2) I '$D(^AUPNPROB(IEN,0)) Q + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + K OUT + S NUM=$$NEXTNUM(DFN,LOC) I 'NUM Q ; PROBLEM NUMBER & STATUS MUST BE ADDED SEPARATELY + S SIEN=$$SCHEMA("UPDATE PROBLEM NUMBER") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)=IEN_U_NUM_U_"A"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +MEAS ; DISPLAY MEASUREMENTS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~10~~~~"_DFN_"|WT|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDMEAS ; UPDATE V MEASUREMENT FILE + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`2^`"_DFN_"^`71164^177.5^`6"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +MEDS ; DISPLAY MEDS + N OUT,%,SIEN,DFN + S DFN=3 + S SIEN=$$SCHEMA("VIEW MEDS") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1989~12/31/1990~10~~~~"_DFN_"|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDMEDS ; UPDATE V MED FILE + N OUT,%,SIEN,DFN,NODE + S DFN=3 + S SIEN=$$SCHEMA("UPDATE MEDS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`305^`"_DFN_"^`71164^T1T QID^40"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +LAB ; DISPLAY LAB TEST RESULTS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VIEW LABS") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1985~12/31/1987~10~~~~"_DFN_"|175|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDLAB ; UPDATE V LAB + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE LABS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`175^`"_DFN_"^`71164^216"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +EXAMS ; DISPLAY EXAMS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VIEW EXAMS") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1986~12/31/1990~10~~~~"_DFN_"|6|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDEXAMS ; UPDATE V EXAM + S DFN=1 + S SIEN=$$SCHEMA("UPDATE EXAMS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`6^`"_DFN_"^`71164^NORMAL"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +IMM ; DISPLAY IMMUNIZATIONS + N OUT,%,SIEN,DFN + S DFN=2 + S SIEN=$$SCHEMA("VIEW IMM") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1986~12/31/1988~10~~~~"_DFN_"|12|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDIMM ; UPDATE V IMMUNIZATION FILE + S DFN=2 + S SIEN=$$SCHEMA("UPDATE IMM") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`12^`"_DFN_"^`71164^2"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +PROV ; DISPLAY PROVIDERS FOR A VISIT + N OUT,%,SIEN,VIEN + S VIEN=11 + S SIEN=$$SCHEMA("VIEW PROV") + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPROV ; UPDATE V PROVIDER FILE + N OUT,%,SIEN,NODE,PIEN,DFN + S PIEN=5,DFN=1 + I $P(^DD(9000010.06,.01,0),U,3)["DIC(6" S PIEN=$P(^VA(200,PIEN,0),U,16) ; CONVERT FILE 200 TO FILE 16 IF NECESS. + S SIEN=$$SCHEMA("UPDATE PROV") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`"_PIEN_"^`"_DFN_"^`71164^P"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +PROC ; DISPLAY PROCEDURES + N OUT,%,SIEN,DFN + S DFN=4 + S SIEN=$$SCHEMA("VIEW PROCEDURES") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1985~12/31/1985~10~~~~"_DFN_"|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPROC ; UPDATE V PROCEDURES FILE + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE PROCEDURES") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`2198^`"_DFN_"^`71164^`8718"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +CPT ; DISPLAY CPT CODES + N OUT,%,SIEN,DFN + S VIEN=71164 + S SIEN=$$SCHEMA("VIEW CPT") + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDCPT ; UPDATE V CPT FILE + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE CPT") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`10000^`"_DFN_"^`71164^WOUND CARE"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +PH ; DISPLAY PERSONAL HISTORY + N OUT,%,SIEN,DFN + S DFN=632 + S SIEN=$$SCHEMA("VIEW PERSONAL HISTORY") + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPH ; UPDATE PERSONAL HX + N OUT,%,SIEN,DFN,NODE,ICD,TEXT + S ICD=2477 + S TEXT="PERSONAL HISTORY OF SERIOUS PROBLEMS" + S DFN=632 + S SIEN=$$SCHEMA("UPDATE PERSONAL HISTORY") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`11353^`"_DFN_"^2851219^"_TEXT_"^2810303"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +FH ; DISPLAY FAMILY HX + N OUT,%,SIEN,DFN + S DFN=631 + S SIEN=$$SCHEMA("VIEW FAMILY HISTORY") + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDFH ; UPDATE FAMILY HISTORY + N OUT,%,SIEN,DFN,NODE,ICD,TEXT + S ICD=2477 + S TEXT="FAMILY HISTORY OF SERIOUS PROBLEMS" + S DFN=631 + S SIEN=$$SCHEMA("UPDATE FAMILY HISTORY") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`7571^`"_DFN_"^2851219^"_TEXT_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +HF ; DISPLAY HEALTH FACTORS + N OUT,%,SIEN,DFN + S DFN=1 + S SIEN=$$SCHEMA("VIEW HEALTH FACTORS") + D SS^BMXADO(.OUT,SIEN,"","AC"_"~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDHF ; UPDATE HEALTH FACTORS FILE + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE HEALTH FACTORS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`3^`"_DFN_U_DT_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +REPRO ; DISPLAY REPRODUCTIVE FACTORS + N OUT,%,SIEN,DFN + S DFN=5 + S SIEN=$$SCHEMA("VIEW REPRODUCTIVE FACTORS") + D SS^BMXADO(.OUT,SIEN,"","B"_"~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDREPRO ; UPDATE REPRODUCTIVE FACTORS + ; THE .O1 FIELD IS DINUMED + ; THEREFORE, THE FILER WILL AUTOMATICALLY SWITCH TO MOD MODE IF A RECORD ALREADY EXISTS FOR THIS PATIENT + N OUT,%,SIEN,DFN,NODE + S DFN=5 + ; I $D(^AUPNREP(DFN)) G ERF + S SIEN=$$SCHEMA("ADD REPRODUCTIVE FACTORS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`"_DFN_"^G5P4LC3SA1TA0^"_DT_"^2^3040101^"_DT_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; + ; ---------------------------------- GRIDS --------------------------------------------- + ; +GRID ; POPULATE THE INTRO GRID + N OUT,%,SIEN,NODE,NEXT + S NEXT="70470;0" + S SIEN=$$SCHEMA("VEN MOJO DE INTRO") + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +MGRID ; POPULATE THE MEASUREMENT GRID + N OUT,%,SIEN,NODE,NEXT,START,STOP + S NEXT="70470;2" + S SIEN=$$SCHEMA("VEN MOJO DE MEASUREMENT") + ; D SS^BMXADO(.OUT,SIEN,"","~~~~~GRIDIT~VENPCCTG~"_NEXT) ; GET SCHEMA + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA + D DISP(OUT) R %:$G(DTIME,60) + ; K ^TMP("BMX ADO",$J) + Q + ; +PRVGRID ; POPULATE THE PROVIDER GRID + N OUT,%,SIEN,NODE,NEXT + S NEXT="70470;4" + S SIEN=$$SCHEMA("VEN MOJO DE PROVIDER") + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +CLGRID ; POPULATE THE CLINIC GRID + N OUT,%,SIEN,NODE,NEXT + S NEXT="70470;8" + S SIEN=$$SCHEMA("VEN MOJO DE CLINIC") + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +DXGRID ; POPULATE THE DX GRID + N OUT,%,SIEN,NODE,NEXT + S NEXT="70470;1" + S SIEN=$$SCHEMA("VEN MOJO DE DX DXHX") + D SS^BMXADO(.OUT,SIEN,"","ASEG~"_NEXT_"~"_NEXT) ; GET SCHEMA + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; diff --git a/m/BMXADOX1.m b/m/BMXADOX1.m new file mode 100644 index 0000000..c33c1bd --- /dev/null +++ b/m/BMXADOX1.m @@ -0,0 +1,325 @@ +BMXADOX1 ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; + ;;2.1;BMX;;Jul 26, 2009 + ; EXMAPLES OF FILEMAN SCHEMA GENERATION + ; + ; + ; N OUT,DAX,% S DAX=0 D SS^BMXADO(.OUT,1,DAX,"^^^5^I^^^^3,XSUB,2160010.03") D DISP(OUT) Q ; TEST EXTENDED SUBJOIN + ; +DISP(OUT) ; + D DISP^BMXADOX(OUT) + Q + ; +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN + N IEN + S IEN=$O(^BMXADO("B",NAME,0)) + Q IEN + ; +NUM ; ITERATE BY IEN + ; IX="",START WITH IEN=1, STOP AFTER IEN=20, MAX # RECORDS RETURNED = 5 + ; TO VIEW INTERNAL VALUES SET VSTG="~1~20~5~I" + N OUT,%,SIEN + S SIEN=$$SCHEMA("IHS PATIENT") + D SS^BMXADO(.OUT,SIEN,"","~1~20~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +IX ; ITERATE BY INDEX + ; ITERATE USING THE "B" INDEX + ; START WITH PT NAME "C", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 + N OUT,%,SIEN + S SIEN=$$SCHEMA("IHS PATIENT") + D SS^BMXADO(.OUT,SIEN,"","B~C~D~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +VCN ; SHOW VALUES FOR A SINGLE VISIT THAT AS A DEFINED VCN + N OUT,%,SIEN + S SIEN=$$SCHEMA("BMXADO DATA ENTRY IDENTIFIERS") + D SS^BMXADO(.OUT,SIEN,"","VCN~1.242A~1.242A~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +MT ; MEASUREMNT TYPES + N OUT,%,SIEN + S SIEN=$$SCHEMA("BMXADO MEASUREMENT TYPES") + D SS^BMXADO(.OUT,SIEN,"","B~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +PROB ; PATIENT PROBLEMS + N OUT,%,SIEN + S SIEN=$$SCHEMA("BMXADO PROBLEMS") + D SS^BMXADO(.OUT,SIEN,"","AA~53~53") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +PB1 ; ALT PROB RETRIEVAL TEST + N OUT,%,SIEN + S SIEN=$$SCHEMA("BMXADO PROBLEMS") + D SS^BMXADO(.OUT,SIEN,"","~221~221~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +POV ; RETURN THE POV SCHEMA + N OUT,%,SIEN + S SIEN=$$SCHEMA("BMXADO ADD POV") + D SS^BMXADO(.OUT,SIEN,"","") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +NOTES ; RETURN NOTES FOR A SPECIFIC PATIENT PROBLEMS + N OUT,%,SIEN + S SIEN=$$SCHEMA("BMXADO NOTES") + D SS^BMXADO(.OUT,SIEN,"","~~~~~NOTES~BMXADOFD~53") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +RENT ; ITERATE IN CHUNKS + ; RE-ITERATE USING THE "B" INDEX + ; START WITH PT IEN 5 AS THE "SEED", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 + N OUT,%,SIEN,SEED,LSEED,X,Y + S SEED=0,LSEED="" + S SIEN=$$SCHEMA("IHS PATIENT") +RIT F D I '$G(SEED) Q + . ; D SS^BMXADO(.OUT,SIEN,SEED,"B~CA~CB~5") + . D SS^BMXADO(.OUT,SIEN,SEED,"~~~5") + . D DISP(OUT) R %:$G(DTIME,60) E S SEED="" Q + . I %?1"^" S SEED="" Q + . S X=$P(@OUT@(1),U,1) + . S SEED=$P(X,"|",3) + . I SEED=LSEED S SEED="" Q + . S LSEED=SEED + . K ^TMP("BMX ADO",$J) + . Q + Q + ; +SUB ; SUBFILE ITERATION + ; THE SCHEMA IS ATTACHED TO THE MEDICARE ELIGIBILITY FILE/ELIG DATE SUBFILE + ; THE DA STRING HAS A VALUE OF '1,',: THE IEN IN THE PARENT FILE. + ; NOTE THE COMMA IN THE DA STRING. THIS INDICATES THAT THE FILE IEN IS 1 BUT THE SUBFILE IEN IS UNSPECIFIED + N OUT,%,SIEN + S SIEN=$$SCHEMA("UPDATE MEDICARE DATES") + D SS^BMXADO(.OUT,SIEN,"1,","~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +DINUM ; DINUMED POINTER ITERATION + ; THE SCHEMA IS ATTACHED TO THE IHS PATIENT FILE (9000001) + ; THE IHS PATIENT FILE IS DINUM'D AND ITS .01 FIELD POINTS TO THE VA PATIENT FILE (2) + ; BECAUSE OF THE SPECIAL RELATIONSHIP BETWEEN THE FILES, WE CAN USE THE B INDEX OF FILE 2 TO ITERATE FILE 9000001. + N OUT,%,SIEN + S SIEN=$$SCHEMA("IHS PATIENT") + D SS^BMXADO(.OUT,SIEN,"","B~A~B~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +IXP ; INDEXED POINTER ITERATION + ; THE SCHEMA IS ATTACHED TO THE V POV FILE + ; THE AC CROSS REFERENCE INDEXES THE PATIENT FIELD + ; BY STARTING AND STOPING WITH PATIENT 1 (MAX=5) WE COLLECT THE FIRST 5 POVS FOR PATIENT 1 IN THE FILE + N OUT,%,SIEN + S SIEN=$$SCHEMA("VIEW POVS") + D SS^BMXADO(.OUT,SIEN,"","AC~1~1~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +AA ; ITERATE USING AA INDEX + ; INDEX IS 'AA" THE START AND STOP DATES ARE SPECIFIED IN EXTERNAL FORMAT. MAX=10 + ; THE FOLLOWING FILTERS ARE SPECIFIED IN THE LAST PARAMETER ("1|WT|C"): + ; 1=PATIENT DFN #1 + ; WT=RETURN ONLY WEIGHTS. MEASUREMENT TYPE MUST BE SPECIFIED WITH A VALID, UNAMBIGUOUS LOOKUP VALUE. + ; C=RETRUN VALUES IN CHRONOLOGICAL ORDER USE 'R' INSTEAD OF 'C' FOR REVERSE CHRONOLOGICAL ORDER. DEFAULT=C + ; THE SEED PARAMTER IS SET AND CAN BE USED TO RETURN DATA IN CHUNKS + N OUT,%,SIEN + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~5~~~~1|WT|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +AA2 ; ITERATE USING AA INDEX + ; THIS SCHEMA IS ATTACHED TO THE VISIT FILE (9000010) + ; IN THIS CASE THERE IS NO ATTRIBUTE TYPE SO THE FILTER PARAM HAS ONLY 2 PIECES "1|R" + ; 1=PATIENT DFN + ; R=RETURN DATA IN REVERSE CHRONOLOGICAL ORDER + N OUT,%,SIEN + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1985~6/4/1986~5~~~~1|R") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +CIT ; CUSTOM ITERATOR + ; IF COMPLEX OR UNUSUAL SORTING/FILTERING IS REQUITED, USE A CUSTOM ITERATOR + ; THE CUSTOM ITERATOR IS DEFINED BY 6TH, 7TH AND 8TH PIECES IN THE VSTG + ; PIECE 8=TAG, PIECE 9=ROUTINE, PIECE 8=A PARAMETER PASSED TO THE ENTRY POINT + ; THE 9TH PIECE CONTAINS PT DFN, TIMESTAMP, VISIT TYPE, LOC IEN, AND SERVICE CATEGORY IN A "|" DELIMTED STRING + ; THE ITERATOR CALL TAG^ROUTINE(PARAM) TO GENERATE IENS + ; IN THIS CASE THE SCHEMA IS ATTACHED TO THE VISIT FILE. + ; GIVEN THE INFORMATION IN THE PARAMETER, THE CUSTOM ITERATOR RETURNS POSSIBLE DUPLICATE VISITS + N OUT,%,SIEN + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~1|4/19/04@1PM|I|4585|A~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +TRIGGER ; TEXT TRIGGER FUNCTION + N OUT,%,SIEN + S SIEN=$$SCHEMA("PATIENT DEMOGRAPHICS") + D SS^BMXADO(.OUT,SIEN,"","~1~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ID ; IDENTIFIER FIELD + ; THE SCHEMA IS ATTACHED TO THE VA PATIENT FILE (2) + ; THE SCHEMA HAS A BUILT IN FIELD (.01ID) THAT RETURNS THE IDENTIFIERS + ; THE ENTRY POINT THAT GENERATES THE IDETIFIERS IS STORED IN THE BMX ADO SCHEMA FILE + N OUT,%,SIEN + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") + D SS^BMXADO(.OUT,SIEN,"","~1~1~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JMD ; JOIN MASTER TO DETAIL + N OUT,%,SIEN1,SIEN2,VSTG,SIEN3,JSTG + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") + S SIEN3=$$SCHEMA("VIEW MEDS") + S VSTG="~1~5" ; INSTRUCTIONS FOR GATHERING DATA SET FOR PTS 1-5 FROM THE MASTER FILE + S JSTG=SIEN3_",.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C" ; + INSTRUCTIONS FOR 1ST JOIN TO GET MEDS + S JSTG=JSTG_"@JOIN@"_SIEN2_",.001,.02IEN,AA~1/1/1988~12/31/1988~~~~~|WT|R" ; + INSTRUCTIONS FOR 2ND JOIN TO GET MSRMNTS + D SS^BMXADO(.OUT,SIEN1,"",VSTG,JSTG) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JVPT ; JOIN PT DEMOG TO VISIT + N OUT,%,SIEN1,SIEN2,VSTG,JSTG + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") + S SIEN2=$$SCHEMA("VISITS") + S VSTG="~1~1" ; INSTRUCTIONS FOR GATHERING DATA SET FOR PT 5 FROM THE MASTER FILE + S JSTG=SIEN2_",.05IEN,.001,AC" ; + INSTRUCTIONS FOR 1ST JOIN TO GET VISIT INFO + D SS^BMXADO(.OUT,SIEN1,"",VSTG,JSTG) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JAC ; TEST AC INDEX + N OUT,%,SIEN1,SIEN2 + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") + S SIEN2=$$SCHEMA("VIEW LABS") + S SIEN3=$$SCHEMA("VIEW MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN1,"","~3~5~~~~~~"_SIEN2_",.001,.02IEN,AC@JOIN@"_SIEN3_",.001,.02IEN,AC") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JPB ; TEST AA INDEX JOINS FOR PROBLEM LIST + N OUT,%,SIEN1,SIEN2 + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") + S SIEN2=$$SCHEMA("VIEW PROBLEMS") + D SS^BMXADO(.OUT,SIEN1,"","~1~5~~~~~~"_SIEN2_",.001,.02IEN,AA") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JSUB ; SUBFILE JOIN + ; IN THIS CASE THE RECORDS IN A PARENT FILE ARE "JOINED" TO THE RECORDS IN ONE OF ITS SUB FILES + ; THE SCHEMA IS ATTACHED TO THE "MEDICARE ELIGIBLE" FILE + ; IT IS JOINED TO ITS SUBFILE, "ELIG DATES", VIA THE UPDATE MEDICARE DATES SCHEMA + N OUT,%,SIEN1,SIEN2 + S SIEN1=$$SCHEMA("UPDATE MEDICARE INFO") + S SIEN2=$$SCHEMA("UPDATE MEDICARE DATES") + D SS^BMXADO(.OUT,SIEN1,"","~1~5~~~~~~"_SIEN2_",SUB") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADD ; ADD A NEW ENTRY + ; THIS IS A 2 STEP PROCESS: + ; FIRST GET THE SCHEMA FOR THE FILE YOU WISH TO UPDATE + ; THIS SCHEMA TYPICALLY BEGINS WITH THE WORD "UPDATE" + ; IT CONTAINS NO ID IR IEN FIELDS + ; SECOND ADD THE DATA NODE TO THE ARRAY + ; IT HAS THE SAME FORMAT AS A DATA STRING ASSOCIATED WITH THE SCHEMA EXCEPT THE FIRST "^" PIECE IS NULL + ; THIS PIECE CORRESPONDS TO THE IEN OF THE RECORD. SINCE THE RECORD HASNOT BEEN ADDED YET, IT IS NULL. + ; IN THE DATA STRING, ALL POINTER VALUES ARE PRECEDED BY THE '`' CHARACTER AND EA. STRING ENDS IN $C(30) + ; MULTIPLE DATA STRINGS CAN BE APPENDED AS NEW NODES AT THE BOTTOM OF THE ARRAY + ; IN THIS CASE WE ARE ADDING A RECORD TO THE V MEASUREMENT FILE + ; DATA STRING="^MEASUREMENT TYPE IEN^PATIENT DFN^VISIT IEN^RESULT"_$C(30) + ; THERE ARE 2 INPUT PARAMS: + ; THE CLOSED REF WHERE THE INPUT ARRAY IS STORED + ; SINCE IT IS PASSED BY REFERENCE "OUT" CAN BE NULL OR UNDEFIEND. + ; OUT WILL BE DEFINED AT THE CONCLUSION OF THE TRANSACTION. + ; THE OUTPUT IS IN THE OUT ARRAY + ; OUT(1)="OK|ien" WHERE ien IS THE IEN OF THE RECORD THAT HAS BEE ADDED. + ; IF THE TRANSACTION FAILED, AN ERROR MSG WILL BE IN THE OUT ARRAY + ; + N OUT,%,SIEN,NODE + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`2^`1^`71164^175.75"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q + ; +DELREC ; DELETE AN ENTRY + ; THE SIMPLEST WAY TO DELETE AN ENTRY IS TO PUT THE RECORD IEN IN THE DA STRING PRECEDED BY A MINUS SIGN + ; YOU CAN ALSO SET THE VALUE OF THE .01 FIELD TO "@" + ; IF THE VALUE OF THE .01 FIELD IS NULL AND THE DA STRING IS NOT PRECEDED BY A MINUS SIGN, THE TRANSACTION WILL BE CANCELLED + ; IF THE DA STRING IS NULL, THE TRANSACTION WILL BE CANCELLED + N OUT,%,SIEN,NODE,DEL + S DEL=51385 + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="-"_DEL_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q + ; +EDIT ; EDIT AN EXISTING ENTRY + ; SIMILAR TO ABOVE EXCEPT THAT THE FIRST "^" PIECE OF THE DATA NODE IS THE IEN OF THE RECORD TO BE EDITIED + ; NOTE THAT THERE IS NO '`' IN FRONT OF THE FIRST PIECE. IT IS A PURE INTEGER + N OUT,%,SIEN,NODE + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="51385^^^^176^`6"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q + ; +DELVAL ; DELETE A VALUE IN A FIELD + ; SIMILAR TO EDIT EXCEPT THE VALUE IS "@" + N OUT,%,SIEN,NODE + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="51385^^^^^@"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q diff --git a/m/BMXADOX2.m b/m/BMXADOX2.m new file mode 100644 index 0000000..1587f8c --- /dev/null +++ b/m/BMXADOX2.m @@ -0,0 +1,123 @@ +BMXADOX2 ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; + ;;2.1;BMX;;Jul 26, 2009 + ; EXMAPLES OF FILEMAN SCHEMA GENERATION + ; +DISP(OUT) ; + D DISP^BMXADOX(OUT) + Q + ; +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN + N IEN + S IEN=$O(^BMXADO("B",NAME,0)) + Q IEN + ; + ; ---------------------------------------- LISTS ------------------------------------------ + ; +FIFOLIST N OUT,%,SIEN,NODE,NEXT + S NEXT="70470;8" + S SIEN=$$SCHEMA("VEN MOJO LIST DE FIFO") + D SS^BMXADO(.OUT,SIEN,"","~~~") ; GET ENCOUNTER LIST TO BE PROCESSED BY DATA ENTRY + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +PROBLIST ; LIST PROBLEMS + S SIEN=$$SCHEMA("VEN MOJO DE DX PROBLEM") + D SS^BMXADO(.OUT,SIEN,"","AC~5~5~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +PTLIST ; LIST PATIENT WITH A SPECIFIC LOOKUP VALUE + N VAL + R "PATIENT: ",VAL:DTIME E Q + I '$L(VAL) Q + I VAL?1."^" Q + S SIEN=$$SCHEMA("VEN MOJO LIST PATIENTS") + D SS^BMXADO(.OUT,SIEN,"","~~~~~PT~BMXADOV2~"_VAL) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +CLINLIST ; LIST CLINICS + S SIEN=$$SCHEMA("VEN MOJO LIST CLINICS") + D SS^BMXADO(.OUT,SIEN,"","B~~~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +SEGLIST ; LIST DE SEGMENTS + S SIEN=$$SCHEMA("VEN MOJO DE SEGMENT") + D SS^BMXADO(.OUT,SIEN,"","~~~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +NOTELIST ; LIST NOTES + ;N SIEN + ;D NOTELIST^VENPCCTG(.OUT,"70470") + ;D DISP(OUT) R %:$G(DTIME,60) + ;K ^TMP("BMX ADO",$J) + Q + ; +PRVLIST ; PROVIDER LIST + N SIEN,OUT + S SIEN=$$SCHEMA("VEN MOJO LIST PROVIDERS") + D SS^BMXADO(.OUT,SIEN,"","B~~~5000") ; GET NOTE LIST TO BE PROCESSED BY DATA ENTRY + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +MLIST ; LIST MEASUREMNTS + S SIEN=$$SCHEMA("VEN MOJO LIST MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","B~~~") ; GET PROBLEM LIST TO BE PROCESSED BY DATA ENTRY + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +RXLIST ; A RX LIST FOR A PATIENT + N SIEN,OUT + S SIEN=$$SCHEMA("VEN MOJO RX LIST") + D SS^BMXADO(.OUT,SIEN,"","~~~~~MED~MOJORX~3") ; GET RX LIST + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +TQLIST ; TABLET QUEUE LIST + N SIEN,OUT + S SIEN=$$SCHEMA("VEN MOJO LIST TABLET QUEUE") + D SS^BMXADO(.OUT,SIEN,"","ATS~~~") ; GET PATIENT LIST + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +UHCLIST ; LIST HIDDEN COLUMNS + N SIEN,OUT + ; S SIEN=$$SCHEMA("VEN MOJO DE GFMT UHC") + D SS^BMXADO(.OUT,"VEN MOJO DE FMT GRID","","~~~") ; GET RX LIST + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +GSEGLIST ; LIST GRID PROPERTIES FOR SEGMENTS + N SIEN,OUT + D SS^BMXADO(.OUT,"VEN MOJO DE GRID FMT","","B~~~") ; GET RX LIST + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ICDLIST ; LIST ICD CODE MATCHES + ;N NARR,OUT + ;W !,"Provider narrative: " R NARR:60 E Q + ;I '$L(NARR) Q + ;D ICDMATCH^VENPCCTP(.OUT,NARR) W !! + ;D DISP(OUT) R %:$G(DTIME,60) + ;K ^TMP("BMX ADO",$J) + Q + ; +IMAGE ; LIST SEGMENT IMAGE CONTROL PARAMETERS + N SIEN,OUT + D SS^BMXADO(.OUT,"VEN MOJO DE SEG IMAGE","1,","~~~") ; GET RX LIST + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q diff --git a/m/BMXADOXX.m b/m/BMXADOXX.m new file mode 100644 index 0000000..2e68384 --- /dev/null +++ b/m/BMXADOXX.m @@ -0,0 +1,439 @@ +BMXADOXX ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; + ;;2.1;BMX;;Jul 26, 2009 + ; EXMAPLES OF RPMS SCHEMAE GENERATION + ; + ; +ADDPAT ; + N OUT,%,SIEN,DFN,NODE + ;S DFN=9285 + S SIEN=$$SCHEMA("UPDATE VA PATIENT") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^KANGAROO,KAP^M^1-1-83^151515555"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + ; + Q + ; +DISP(OUT) ; TEMP DISPLAY + N I,X + S I=0 W ! + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X + Q + ; +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN + N IEN + S IEN=$O(^BMXADO("B",NAME,0)) + Q IEN + ; +NEXTNUM(DFN,LOC) ; RETURN THE NEXT PROBLEM NUMBER FOR A PATIENT + N X,LAST,MAX,NUM + S NUM=0,MAX="" + F S NUM=$O(^AUPNPROB("AA",DFN,LOC,NUM)) Q:NUM="" S X=$E(NUM,2,99) I +X>MAX S MAX=+X + I 'MAX Q 1 + S X=X+1 S X=X\1 + Q X + ; +DEMOG ; VIEW DEMOGRAPHICS + N OUT,%,DFN,MAX,SIEN + S DFN=1373,MAX=1000 + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") + D SS^BMXADO(.OUT,SIEN,"",("~"_DFN_"~"_DFN_"~"_MAX)) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +MEDICARE ; UPDATE MEDICARE DATES/INFO + N OUT,%,DAS,PIEN,JIEN,DFN,MAX + S DFN=1,MAX=1000 + S DAS=DFN_"," + S PIEN=$$SCHEMA("UPDATE MEDICARE DATES") + S JIEN=$$SCHEMA("UPDATE MEDICARE INFO") + D SS^BMXADO(.OUT,PIEN,DAS,("~"_DFN_"~"_DFN_"~"_MAX_"~~"_"MEDICARE~BMXADOV2~~"_JIEN_",PARENT")) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +MEDICAID ; VIEW MEDICAID DATES/INFO + N OUT,%,DAS,PIEN,JIEN,DFN,DA + S DFN=322 + S DA(1)=$$MCDIEN^BMXADOV2(DFN) I 'DA(1) Q + S DAS=DA(1)_"," + S PIEN=$$SCHEMA("UPDATE MEDICAID DATES") + S JIEN=$$SCHEMA("UPDATE MEDICAID INFO") + D SS^BMXADO(.OUT,PIEN,DAS,("~~~~~MEDICAID~BMXADOV2~~"_JIEN_",PARENT")) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +PVTINS ; VIEW PRIVATE INSURANCE DATES/INFO + N OUT,%,DAS,SIEN,DFN + S DFN=96 + S DAS=DFN_"," + S SIEN=$$SCHEMA("UPDATE PVT INSURANCE INFO") + D SS^BMXADO(.OUT,SIEN,DAS,"~~~~~PVTINS~BMXADOV2~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +VISIT ; VIEW VISITS + N OUT,%,SIEN,DFN + S DFN=9285 + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1968~6/4/2004~100~~~~9285|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +DUPVIS ; DISPLAY POSSIBLE DUPLICATE VISITS + N OUT,%,SIEN,DFN + S DFN=9285 + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~9285|5/24/04@1PM|I|516|~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDVIS ; ADD A NEW VISIT + N OUT,%,SIEN,DFN,NODE + S DFN=9285 + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^JUN 03, 2004@01:32^I^`9285^`516^A^`2"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +POV ; DISPLAY POVS + N OUT,%,SIEN,DFN + S DFN=9285 + S SIEN=$$SCHEMA("VIEW POVS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~100~~~~9285|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPOV ; ADD A POV TO AN EXISITING VISIT + N OUT,%,SIEN,DFN,NODE + S DFN=9285 + S SIEN=$$SCHEMA("UPDATE POVS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`8718^`9285^`8337^DM II ON EXPMTL MEDS^2^P"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +EDITPOV ; ADD A POV TO AN EXISITING VISIT + N OUT,%,SIEN,DFN,NODE + S DFN=1 + S SIEN=$$SCHEMA("UPDATE POVS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="2815^`8718^`9285^`8337^DM II ON SPECIAL MEDS^2^P"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +PROB ; DISPLAY PROBLEMS + N OUT,%,SIEN,DFN + S DFN=1373 + S SIEN=$$SCHEMA("VIEW PROBLEMS") + D SS^BMXADO(.OUT,SIEN,"","AA~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPROB ; ADD A PROBLEM TO THE PROBLEM LIST + N OUT,%,SIEN,DFN,NODE,NUM,LOC,ICD,TEXT,AIR,IEN + S ICD=2477 + S TEXT="HYPERTENSION ON SPECIAL MEDS" + S DFN=1373,LOC=DUZ(2) + S SIEN=$$SCHEMA("UPDATE PROBLEMS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)=U_"`"_ICD_U_"`"_DFN_U_DT_U_U_TEXT_U_"`"_LOC_U_DT_U_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + S IEN=+$P(OUT(1),"|",2) I '$D(^AUPNPROB(IEN,0)) Q + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + K OUT + S NUM=$$NEXTNUM(DFN,LOC) I 'NUM Q + S SIEN=$$SCHEMA("UPDATE PROBLEM NUMBER") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)=IEN_U_NUM_U_"A"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +MEAS ; DISPLAY MEASUREMENTS + N OUT,%,SIEN,DFN + S DFN=2 + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~10~~~~"_DFN_"|WT|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDMEAS ; UPDATE V MEASUREMENT FILE + N OUT,%,SIEN,DFN,NODE + S DFN=2 + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`2^`"_DFN_"^`7806^172.75"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +MEDS ; DISPLAY MEDS + N OUT,%,SIEN,DFN + S DFN=152 + S SIEN=$$SCHEMA("VIEW MEDS") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1969~12/31/2004~10~~~~"_DFN_"|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDMEDS ; UPDATE V MED FILE + N OUT,%,SIEN,DFN,NODE + S DFN=2 + S SIEN=$$SCHEMA("UPDATE MEDS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`305^`"_DFN_"^`7806^T1T QID^40"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +LAB ; DISPLAY LAB TEST RESULTS + N OUT,%,SIEN,DFN + S DFN=280 + S SIEN=$$SCHEMA("VIEW LABS") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1965~12/31/2003~10~~~~"_DFN_"|175|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDLAB ; UPDATE V LAB + N OUT,%,SIEN,DFN,NODE + S DFN=2 + S SIEN=$$SCHEMA("UPDATE LABS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`175^`"_DFN_"^`7806^216"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +EXAMS ; DISPLAY EXAMS + N OUT,%,SIEN,DFN + S DFN=1373 + S SIEN=$$SCHEMA("VIEW EXAMS") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1966~12/31/2003~10~~~~"_DFN_"|6|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDEXAMS ; UPDATE V EXAM + S DFN=2 + S SIEN=$$SCHEMA("UPDATE EXAMS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`6^`"_DFN_"^`7806^NORMAL"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +IMM ; DISPLAY IMMUNIZATIONS + N OUT,%,SIEN,DFN + S DFN=54 + S SIEN=$$SCHEMA("VIEW IMM") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1966~12/31/2003~10~~~~"_DFN_"|101|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +PROV ; DISPLAY PROVIDERS FOR A VISIT + N OUT,%,SIEN,VIEN + S VIEN=4703 + S SIEN=$$SCHEMA("VIEW PROV") + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPROV ; UPDATE V PROVIDER FILE + N OUT,%,SIEN,NODE,PIEN,DFN + S PIEN=DUZ,DFN=2 + I $P(^DD(9000010.06,.01,0),U,3)["DIC(6" S PIEN=$P(^VA(200,PIEN,0),U,16) ; CONVERT FILE 200 TO FILE 16 IF NECESS. + S SIEN=$$SCHEMA("UPDATE PROV") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`"_PIEN_"^`"_DFN_"^`7806^P"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +PROC ; DISPLAY PROCEDURES + N OUT,%,SIEN,DFN + S DFN=235 + S SIEN=$$SCHEMA("VIEW PROCEDURES") + D SS^BMXADO(.OUT,SIEN,"","AA~1/1/1965~12/31/2003~10~~~~"_DFN_"|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPROC ; UPDATE V PROCEDURES FILE + N OUT,%,SIEN,DFN,NODE + S DFN=2 + S SIEN=$$SCHEMA("UPDATE PROCEDURES") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`2198^`"_DFN_"^`7806^`8718"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +CPT ; DISPLAY CPT CODES + N OUT,%,SIEN,DFN + S VIEN=8082 + S SIEN=$$SCHEMA("VIEW CPT") + D SS^BMXADO(.OUT,SIEN,"","AD~"_VIEN_"~"_VIEN_"~10~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDCPT ; UPDATE V CPT FILE + N OUT,%,SIEN,DFN,NODE + S DFN=2 + S SIEN=$$SCHEMA("UPDATE CPT") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`10000^`"_DFN_"^`7806"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +PH ; DISPLAY PERSONAL HISTORY + N OUT,%,SIEN,DFN + S DFN=1373 + S SIEN=$$SCHEMA("VIEW PERSONAL HISTORY") + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDPH ; UPDATE PERSONAL HX + N OUT,%,SIEN,DFN,NODE,ICD,TEXT + S ICD=2477 + S TEXT="PERSONAL HISTORY OF SERIOUS PROBLEMS" + S DFN=2 + S SIEN=$$SCHEMA("UPDATE PERSONAL HISTORY") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`11353^`"_DFN_"^2851219^"_TEXT_"^2810303"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +FH ; DISPLAY FAMILY HX + N OUT,%,SIEN,DFN + S DFN=631 + S SIEN=$$SCHEMA("VIEW FAMILY HISTORY") + D SS^BMXADO(.OUT,SIEN,"","AC~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDFH ; UPDATE FAMILY HISTORY + N OUT,%,SIEN,DFN,NODE,ICD,TEXT + S ICD=2477 + S TEXT="FAMILY HISTORY OF SERIOUS PROBLEMS" + S DFN=2 + S SIEN=$$SCHEMA("UPDATE FAMILY HISTORY") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`7571^`"_DFN_"^2851219^"_TEXT_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +HF ; DISPLAY HEALTH FACTORS + N OUT,%,SIEN,DFN + S DFN=2390 + S SIEN=$$SCHEMA("VIEW HEALTH FACTORS") + D SS^BMXADO(.OUT,SIEN,"","AC"_"~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDHF ; UPDATE HEALTH FACTORS FILE + N OUT,%,SIEN,DFN,NODE + S DFN=2 + S SIEN=$$SCHEMA("UPDATE HEALTH FACTORS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`3^`"_DFN_U_DT_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; +REPRO ; DISPLAY REPRODUCTIVE FACTORS + N OUT,%,SIEN,DFN + S DFN=1373 + S SIEN=$$SCHEMA("VIEW REPRODUCTIVE FACTORS") + D SS^BMXADO(.OUT,SIEN,"","B"_"~"_DFN_"~"_DFN_"~~~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADDREPRO ; UPDATE REPRODUCTIVE FACTORS + ; THE .O1 FIELD IS DINUMED + ; THEREFORE, THE FILER WILL AUTOMATICALLY SWITCH TO MOD MODE IF A RECORD ALREADY EXISTS FOR THIS PATIENT + N OUT,%,SIEN,DFN,NODE + S DFN=2 + ; I $D(^AUPNREP(DFN)) G ERF + S SIEN=$$SCHEMA("UPDATE REPRODUCTIVE FACTORS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`"_DFN_"^G5P4LC3SA1TA0^"_DT_"^2^3040101^"_DT_$C(30) + D DISP(OUT) R %:$G(DTIME,60) + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) + Q + ; diff --git a/m/BMXADOXY.m b/m/BMXADOXY.m new file mode 100644 index 0000000..3fa3f3d --- /dev/null +++ b/m/BMXADOXY.m @@ -0,0 +1,296 @@ +BMXADOXY ; IHS/CIHA/GIS - RPC CALL: GENERATE AN ADO SCHEMA STRING AND DATA SET ; + ;;2.1;BMX;;Jul 26, 2009 + ; EXMAPLES OF FILEMAN SCHEMA GENERATION + ; + ; + ; +DISP(OUT) ; TEMP DISPLAY OF THE ANR + N I,X + S I=0 W ! + F S I=$O(@OUT@(I)) Q:'I S X=@OUT@(I) S X=$TR(X,$C(30),"}") S X=$TR(X,$C(31),"{") W !,X + Q + ; +SCHEMA(NAME) ; GIVEN SCHEMA NAME, RETURN THE IEN + N IEN + S IEN=$O(^BMXADO("B",NAME,0)) + Q IEN + ; +NUM ; ITERATE BY IEN + ; IX="",START WITH IEN=1, STOP AFTER IEN=20, MAX # RECORDS RETURNED = 5 + ; TO VIEW INTERNAL VALUES SET VSTG="~1~20~5~I" + N OUT,%,SIEN + S SIEN=$$SCHEMA("IHS PATIENT") + D SS^BMXADO(.OUT,SIEN,"","~1~20~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +IX ; ITERATE BY INDEX + ; ITERATE USING THE "B" INDEX + ; START WITH PT NAME "C", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 + N OUT,%,SIEN + S SIEN=$$SCHEMA("IHS PATIENT") + D SS^BMXADO(.OUT,SIEN,"","B~C~D~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +RENT ; ITERATE IN CHUNKS + ; RE-ITERATE USING THE "B" INDEX + ; START WITH PT IEN 5 AS THE "SEED", STOP AFTER PATIENT NAME = "D", MAX # RECORDS RETURNED = 5 + N OUT,%,SIEN,SEED,LSEED,X,Y + S SEED=0,LSEED="" + S SIEN=$$SCHEMA("IHS PATIENT") +RIT F D I '$G(SEED) Q + . D SS^BMXADO(.OUT,SIEN,SEED,"B~CA~CB~5") + . D DISP(OUT) R %:$G(DTIME,60) E S SEED="" Q + . I %?1"^" S SEED="" Q + . S X=$P(@OUT@(1),U,1) + . S SEED=$P(X,"|",3) + . I SEED=LSEED S SEED="" Q + . S LSEED=SEED + . K ^TMP("BMX ADO",$J) + . Q + Q + ; +SUB ; SUBFILE ITERATION + ; THE SCHEMA IS ATTACHED TO THE MEDICARE ELIGIBILITY FILE/ELIG DATE SUBFILE + ; THE DA STRING HAS A VALUE OF '4,',: THE IEN IN THE PARENT FILE (PATIENT DFN). + ; NOTE THE COMMA IN THE DA STRING. THIS INDICATES THAT THE FILE IEN IS 4 BUT THE SUBFILE IEN IS UNSPECIFIED + N OUT,%,SIEN + S SIEN=$$SCHEMA("UPDATE MEDICARE DATES") + ;D SS^BMXADO(.OUT,SIEN,"1,","~~~") + D SS^BMXADO(.OUT,18,"1,","~~~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +DINUM ; DINUMED POINTER ITERATION + ; THE SCHEMA IS ATTACHED TO THE PATIENT FILE (9000001) + ; THE PATIENT FILE IS DINUM'D AND ITS .01 FIELD POINTS TO THE VA PATIENT FILE (2) + ; BECAUSE OF THE SPECIAL RELATIONSHIP BETWEEN THE FILES, WE CAN USE THE B INDEX OF FILE 2 TO ITERATE FILE 9000001. + N OUT,%,SIEN + S SIEN=$$SCHEMA("IHS PATIENT") + D SS^BMXADO(.OUT,SIEN,"","B~A~B~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +IXP ; INDEXED POINTER ITERATION + ; THE SCHEMA IS ATTACHED TO THE V POV FILE + ; THE AC CROSS REFERENCE INDEXES THE PATIENT FIELD + ; BY STARTING AND STOPING WITH PATIENT 235 (MAX=5) WE COLLECT THE FIRST 5 POVS FOR PATIENT 235 IN THE FILE + N OUT,%,SIEN + S SIEN=$$SCHEMA("VIEW POVS") + D SS^BMXADO(.OUT,SIEN,"","AC~235~235~5") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +AA ; ITERATE USING AA INDEX + ; INDEX IS 'AA" THE START AND STOP DATES ARE SPECIFIED IN EXTERNAL FORMAT. MAX=10 + ; THE FOLLOWING FILTERS ARE SPECIFIED IN THE LAST PARAMETER ("235|WT|C"): + ; 235=PATIENT DFN #235 + ; WT=RETURN ONLY WEIGHTS. MEASUREMENT TYPE MUST BE SPECIFIED WITH A VALID, UNAMBIGUOUS LOOKUP VALUE. + ; C=RETRUN VALUES IN CHRONOLOGICAL ORDER USE 'R' INSTEAD OF 'C' FOR REVERSE CHRONOLOGICAL ORDER. DEFAULT=C + ; THE SEED PARAMTER IS SET AND CAN BE USED TO RETURN DATA IN CHUNKS + N OUT,%,SIEN + S SIEN=$$SCHEMA("VIEW MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~5~~~~235|WT|C") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +AA2 ; ITERATE USING AA INDEX + ; THIS SCHEMA IS ATTACHED TO THE VISIT FILE (9000010) + ; IN THIS CASE THERE IS NO ATTRIBUTE TYPE SO THE FILTER PARAM HAS ONLY 2 PIECES "1|R" + ; 235=PATIENT DFN + ; R=RETURN DATA IN REVERSE CHRONOLOGICAL ORDER + N OUT,%,SIEN + S SIEN=$$SCHEMA("VISITS") ;12 + D SS^BMXADO(.OUT,SIEN,"","AA~3/21/1965~6/4/2004~5~~~~235|R") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +CIT ; CUSTOM ITERATOR + ; IF COMPLEX OR UNUSUAL SORTING/FILTERING IS REQUITED, USE A CUSTOM ITERATOR + ; THE CUSTOM ITERATOR IS DEFINED BY 6TH, 7TH AND 8TH PIECES IN THE VSTG + ; PIECE 8=TAG, PIECE 9=ROUTINE, PIECE 8=A PARAMETER PASSED TO THE ENTRY POINT + ; THE 9TH PIECE CONTAINS PT DFN, TIMESTAMP, VISIT TYPE, LOC IEN, AND SERVICE CATEGORY IN A "|" DELIMTED STRING + ; THE ITERATOR CALL TAG^ROUTINE(PARAM) TO GENERATE IENS + ; IN THIS CASE THE SCHEMA IS ATTACHED TO THE VISIT FILE. + ; GIVEN THE INFORMATION IN THE PARAMETER, THE CUSTOM ITERATOR RETURNS POSSIBLE DUPLICATE VISITS + N OUT,%,SIEN + S SIEN=$$SCHEMA("VISITS") + D SS^BMXADO(.OUT,SIEN,"","~~~~~DUPV~BMXADOV2~9285|5/24/04@1PM|I|516|~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ID ; IDENTIFIER FIELD + ; THE SCHEMA IS ATTACHED TO THE VA PATIENT FILE (2) + ; THE SCHEMA HAS A BUILT IN FIELD (.01ID) THAT RETURNS THE IDENTIFIERS + ; THE ENTRY POINT THAT GENERATES THE IDETIFIERS IS STORED IN THE BMX ADO SCHEMA FILE + ; PATIENT DFN=235 + N OUT,%,SIEN + S SIEN=$$SCHEMA("UPDATE PATIENT DEMOGRAPHICS") + D SS^BMXADO(.OUT,SIEN,"","~235~235~") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JSTD ; STANDARD JOIN + ; BY SPECIFYING A JOIN IN THE VSTG, MULTIPLE SCHEMAE AND DATA SETS ARE RETURNED IN ONE PASS + ; THE SCHEMA IS ATTACHED TO THE V MEASUREMENT FILE + ; THIS IS JOINED TO A SECOND FILE, THE VA PATIENT FILE VIA A JOIN + ; THE JOIN IS BASTED ON THE FACT THAT THE PATIENT FIELD (.02) IN THE V MEASUREMENT FILE POINTS TO THE VA PATIENT FILE + ; THE JOIN PARAMETER IS THE 9TH PIECE OF THE VSTG. IT CONSISTS OF 2 PIECES DELIMITED BY A "," + ; PIECE 1 IS THE SCHEMA THAT YOU ARE JOINING TO + ; PIECE 2 IS THE FIELD IN THE PRIMARY FILE THAT ENABLES THE JOIN + ; THE DATA SET FROM THE SECOND (JOIN) FILE CONTAINS ONLY THOSE RECORDS NECESSARY TO COMPLETE THE JOIN + ; PATIENT DFN=235, INDEX=AA, MAX=5, START=3/21/65, STOP=6/4/04 + N OUT,%,SIEN1,SIEN2 + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") + ;SIEN1=23, SIEN2=11 + ;D SS^BMXADO(.OUT,SIEN1,"","AA~3/21/1965~6/4/2004~5~~~~234|WT|C~"_SIEN2_",.02") + D SS^BMXADO(.OUT,SIEN1,"","~234~236~~~~~~"_SIEN2_",.01") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +HWSTD ; + ; PATIENT DFN=235, INDEX=AA, MAX=5, START=3/21/65, STOP=6/4/04 + N OUT,%,SIEN1,SIEN2 + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") + ;SIEN2=23, SIEN1=11 + D SS^BMXADO(.OUT,SIEN1,"","~235~250~~~~~~"_SIEN2_",.01") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JMD ;JOIN MASTER TO DETAIL + N OUT,%,SIEN1,SIEN2,SIEN3,VSTG + S SIEN1=$$SCHEMA("PATIENT DEMOGRAPHICS") + S SIEN2=$$SCHEMA("VIEW MEASUREMENTS") + S SIEN3=$$SCHEMA("VIEW MEDS") + S VSTG="~1~5~~~~~~" + ;S VSTG=VSTG_SIEN3_",.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C" + S VSTG=VSTG_SIEN3_",.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C" + ;S VSTG="~1~5~~~~~~23,.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|WT|C" + ;BMX ADO SS^11^^~1~5~~~~~~23,.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|WT|C + ;BMX ADO SS^11^^~1~5~~~~~~25,.001,.02IEN,AA~1/1/1960~6/30/2004~~~~~|C + D SS^BMXADO(.OUT,SIEN1,"",VSTG) + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JSUB ; SUBFILE JOIN + ; IN THIS CASE THE RECORDS IN A PARENT FILE ARE "JOINED" TO THE RECORDS IN ONE OF ITS SUB FILES + ; THE SCHEMA IS ATTACHED TO THE "MEDICARE ELIGIBLE" FILE + ; IT IS JOINED TO ITS SUBFILE, "ELIG DATES", VIA THE UPDATE MEDICARE DATES SCHEMA + ; THE SYNTAX FOR THE JOIN PIECE IS "sien2,SUB" WHERE sien2=IEN OF SECOND SCHEMA + ; PATIENT DFN=4 + N OUT,%,SIEN1,SIEN2 + S SIEN1=$$SCHEMA("UPDATE MEDICARE INFO") ;17 + S SIEN2=$$SCHEMA("UPDATE MEDICARE DATES") ;18 + ;BMX ADO SS^17^^~4~5~~~~~~18,SUB + D SS^BMXADO(.OUT,SIEN1,"","~4~5~~~~~~"_SIEN2_",SUB") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +JPAR ; PARENT FILE JOIN + ; SIMILAR TO A SUBFILE JOIN EXCEPT THE SUB-FILE IS TREATED AS THE PRIMARY FILE AND IT IS JOINED TO ITS PARENT + ; BECAUSE WE ARE STARTING IN A SUBFILE, THE DA STRING CONTAINS THE IEN OF THE PARENT FILE ("4," + ; THE SYNTAX OF THE 9TH PIECE IS "sien2,PARENT" WHERE sien2 IS THE IEN OF THE SECONDARY SCHEMA + ; PATIENT DFN=4 + N OUT,%,SIEN1,SIEN2 + S SIEN1=$$SCHEMA("UPDATE MEDICARE DATES") + S SIEN2=$$SCHEMA("UPDATE MEDICARE INFO") + D SS^BMXADO(.OUT,SIEN1,"4,","~~~5~~~~~"_SIEN2_",PARENT") + D DISP(OUT) R %:$G(DTIME,60) + K ^TMP("BMX ADO",$J) + Q + ; +ADD ; ADD A NEW ENTRY + ; THIS IS A 2 STEP PROCESS: + ; FIRST GET THE SCHEMA FOR THE FILE YOU WISH TO UPDATE + ; THIS SCHEMA'S NAME TYPICALLY BEGINS WITH THE WORD "UPDATE" + ; IT CONTAINS NO ID OR IEN FIELDS + ; SECOND ADD THE DATA NODE TO THE ARRAY + ; IT HAS THE SAME FORMAT AS A DATA STRING ASSOCIATED WITH THE SCHEMA EXCEPT THE FIRST "^" PIECE IS NULL + ; THIS PIECE CORRESPONDS TO THE IEN OF THE RECORD. SINCE THE RECORD HAS NOT BEEN ADDED YET, IT IS NULL. + ; IN THE DATA STRING, ALL POINTER VALUES ARE PRECEDED BY THE '`' CHARACTER AND EA. STRING ENDS IN $C(30) + ; MULTIPLE DATA STRINGS CAN BE APPENDED AS NEW NODES AT THE BOTTOM OF THE ARRAY + ; IN THIS CASE WE ARE ADDING A RECORD TO THE V MEASUREMENT FILE + ; DATA STRING="^MEASUREMENT TYPE IEN^PATIENT DFN^VISIT IEN^RESULT"_$C(30) + ; THERE ARE 2 INPUT PARAMS: + ; THE CLOSED REF WHERE THE INPUT ARRAY IS STORED + ; SINCE IT IS PASSED BY REFERENCE "OUT" CAN BE NULL OR UNDEFIEND. + ; OUT WILL BE DEFINED AT THE CONCLUSION OF THE TRANSACTION. + ; THE OUTPUT IS IN THE OUT ARRAY + ; OUT(1)="OK|ien" WHERE ien IS THE IEN OF THE RECORD THAT HAS BEE ADDED. + ; IF THE TRANSACTION FAILED, AN ERROR MSG WILL BE IN THE OUT ARRAY + ; MEASUREMENT TYPE=2, PATIENT DFN=2, VISIT IEN=7806, PATIENT'S WEIGHT=172.75 + N OUT,%,SIEN,NODE,DFN + S DFN=2 + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="^`2^`"_DFN_"^`7806^172.75"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q + ; +DEL ; DELETE A RECORD + ; THE SIPLEST WAY TO DELETE AN ENTRY IS TO PUT THE RECORD IEN IN THE DA STRING PRECEDED BY A MINUS SIGN + ; YOU CAN ALSO SET THE VALUE OF THE .01 FIELD TO "@" + ; IF THE VALUE OF THE .01 FIELD IS NULL AND THE DA STRING IS NOT PRECEDED BY A MINUS SIGN, THE TRANSACTION WILL BE CANCELLED + ; IF THE DA STRING IS NULL, THE TRANSACTION WILL BE CANCELLED + ; IN THIS EXAMPLE, WE DELETE A V MEASUREMENT RECORD THAT WAS JUST ADDED + N OUT,%,SIEN,NODE,DEL + S DEL=1621 + S SIEN=$$SCHEMA("UPDATE MEASUREMENTS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="-"_DEL_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q + ; +EDIT ; EDIT AN EXISTING ENTRY + ; SIMILAR TO ABOVE EXCEPT THAT THE FIRST "^" PIECE OF THE DATA NODE IS THE IEN OF THE RECORD TO BE EDITIED + ; NOTE THAT THERE IS NO '`' IN FRONT OF THE FIRST PIECE. IT IS A PURE INTEGER + ; LAB TEST=175, PATIENT DFN=2, VISIT IEN=8040, PT'S GLUCOSE=276, ANORMAL="ABNORMAL" + N OUT,%,SIEN,NODE + S SIEN=$$SCHEMA("UPDATE LABS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="279^`175^`2^`8040^280^H"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q + ; +DELVAL ; DELETE A VALUE IN A FIELD + ; SIMILAR TO EDIT EXCEPT THE VALUE IS "@" + ; DELETE WILL BE ABORTED IF IF FILEMAN SAYS THIS IS A REQUIRED FIELD + N OUT,%,SIEN,NODE + S SIEN=$$SCHEMA("UPDATE LABS") + D SS^BMXADO(.OUT,SIEN,"","") ; GET SCHEMA + S NODE=$O(^TMP("BMX ADO",$J,999999),-1)+1 + S ^TMP("BMX ADO",$J,NODE)="279^`175^`2^`8040^^@"_$C(30) + D DISP(OUT) R %:$G(DTIME,60) ; DISPLAY THE INPUT ARRAY BEFORE UPDATING THE RECORD + D BAFM^BMXADOF1(.OUT,$NA(^TMP("BMX ADO",$J))) ; EP FOR UPDAING THE RECORD + K ^TMP("BMX ADO",$J) + W !!,OUT S %=0 F S %=$O(OUT(%)) Q:'% W !,OUT(%) ; SEND BACK AN ACKNOWLEDGEMENT OR ERROR MSG + Q + ; diff --git a/m/BMXE01.m b/m/BMXE01.m new file mode 100644 index 0000000..2efaf44 --- /dev/null +++ b/m/BMXE01.m @@ -0,0 +1,57 @@ +BMXE01 ; IHS/OIT/FJE - ENVIRONMENT CHECK FOR BMX 2.0 ; + ;;2.1;BMX;;Jul 26, 2009 + ; + S $P(LINE,"*",81)="" + S XPDNOQUE="NO QUE" ;NO QUEUING ALLOWED + S XPDABORT=0 + I '$G(DUZ) W !,"DUZ UNDEFINED OR 0." S XPX="DUZ" D SORRY Q + ; + I '$L($G(DUZ(0))) W !,"DUZ(0) UNDEFINED OR NULL." S XPX="DUZ" D SORRY Q + ; + D HOME^%ZIS,DT^DICRW + S X=$P($G(^VA(200,DUZ,0)),U) + I $G(X)="" W !,"Who are you????" S XPX="DUZ" D SORRY Q + W !,"Hello, "_$P(X,",",2)_" "_$P(X,",") + W !!,"Checking Environment for Install of Version "_$P($T(+2),";",3)_" of "_$P($T(+2),";",4)_"." + ; + S X=$G(^DD("VERSION")) + W !!,"Need at least FileMan 22.....FileMan "_X_" Present" + I X<22 S XPX="FM" D SORRY Q + ; + S X=$G(^DIC(9.4,$O(^DIC(9.4,"C","XU",0)),"VERSION")) + W !!,"Need at least Kernel 8.0.....Kernel "_X_" Present" + I +X<8 S XPX="KERNEL" D SORRY Q + ; + S X=$G(^DIC(9.4,$O(^DIC(9.4,"C","XB",0)),"VERSION")) + W !!,"Need at least XB/ZIB 3.....XB/ZIB "_X_" Present" + I +X<2 S XPX="XB" D SORRY Q + q +ENVOK ; If this is just an environ check, end here. + W !!,"ENVIRONMENT OK." + ; + ; The following line prevents the "Disable Options..." and "Move + ; Routines..." questions from being asked during the install. + I $G(XPDENV)=1 S (XPDDIQ("XPZ1"),XPDDIQ("XPZ2"))=0 + I $G(XPDENV)=1 D ;Updates BMX Version file + .S X="2",DIC="^BMXAPPL(",DLAYGO=90093.2,DIC(0)="E" K DD,D0 D FILE^DICN + .S DA=+Y + .S:+DA DIE="^BMXAPPL(",DR=".02///0;.03////"_DT D ^DIE + .K DIE,DA + Q +SORRY ; + K DIFQ + S XPDABORT=1 + W *7,!!!,"Sorry....something is wrong with your environment" + W !,"Aborting BMX Version 2.0 Install!" + W !,"Correct error and reinstall otherwise" + W !,"please print/capture this screen and notify" + W !,"technical support." + W !!,LINE + D BMES^XPDUTL("Sorry....something is wrong with your environment") + D BMES^XPDUTL("Enviroment ERROR "_$G(XPX)) + D BMES^XPDUTL("Aborting BMX 2.0 install!") + D BMES^XPDUTL("Correct error and reinstall otherwise") + D BMES^XPDUTL("please print/capture this screen and notify") + D BMES^XPDUTL("technical support.") + Q + ; diff --git a/m/BMXFIND.m b/m/BMXFIND.m new file mode 100644 index 0000000..eb26a55 --- /dev/null +++ b/m/BMXFIND.m @@ -0,0 +1,260 @@ +BMXFIND ; IHS/OIT/HMW - BMX GENERIC FIND ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +TABLE(BMXGBL,BMXFL) ;EP + ; + ;---> If file number not provided check for file name. + ;S ^HW("BMXTABLE")=BMXFL + S BMX31=$C(31)_$C(31) + I +BMXFL'=BMXFL D + . S BMXFL=$TR(BMXFL,"_"," ") + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q + . S BMXFL=$O(^DIC("B",BMXFL,0)) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q + D FIND(.BMXGBL,BMXFL,"*",,,10,,,,1) + Q + ; +FIND(BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC,BMXNUM) ;EP + ; + ;TODO: + ; -- Return column info even if no rows returned + ; + ;---> Places matching records from requested file into a + ;---> result global, ^BMXTEMP($J). The exact global name + ;---> is returned in the first parameter (BMXGBL). + ;---> Records are returned one per node in the result global. + ;---> Each record is terminated with a $C(30), for parsing out + ;---> on the VB side, since the Broker concatenates all nodes + ;---> into a single string when passing the data out of M. + ;---> Requested fields within records are delimited by "^". + ;---> NOTE: The first "^"-piece of every node is the IEN of + ;---> that entry in its file; the requested fields follow. + ;---> The final record (node) contains Error Delimiter, + ; $C(31)_$C(31), followed by error text, if any. + ; + ; + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global for Broker. + ; 2 - BMXFL (req) File for lookup. + ; 3 - BMXFLDS (opt) Fields to return w/each entry. + ; 4 - BMXFLG (opt) Flags in DIC(0); If null, "M" is sent. + ; 5 - BMXIN (opt) Input to match on (see Algorithm below). + ; 6 - BMXMX (opt) Maximum number of entries to return. + ; 7 - BMXIX (opt) Indexes to search. + ; 8 - BMXSCR (opt) Screen/filter (M code). + ; 9 - BMXMC (opt) Mixed Case: 1=mixed case, 0=no change. + ; (Converts data in uppercase to mixed case.) + ; 10 - BMXNUM (opt) Include IEN in returned recordset (1=true) + ; + ;---> Set variables, kill temp globals. + ;N (BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC) + S BMX31=$C(31)_$C(31) + S BMXGBL="^BMXTEMP("_$J_")",BMXERR="",U="^" + K ^BMXTMP($J),^BMXTEMP($J) + ; + ;---> If file number not provided check for file name. + I +BMXFL'=BMXFL D + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q + . S BMXFL=$O(^DIC("B",BMXFL,0)) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q + ; + ;---> If no fields provided, pass .01. + ;---> NOTE: If .01 is NOT included, but the Index to lookup on is + ;---> NOT on the .01, then the .01 will be returned + ;---> automatically as the second ^-piece of data in the + ;---> Result Global. + ;---> So it would be: IEN^.01^requested fields... + I $G(BMXFLDS)="" S BMXFLDS=".01" + ; + ;---> If no index or flag provided, set flag="M". + I $G(BMXFLG)="" D + .I $G(BMXIX)="" S BMXFLG="M" Q + .S BMXFLG="" + ; + ;---> If no Maximum Number provided, set it to 200. + I '$G(BMXMX) S BMXMX=200 + ; + ;---> Define index and screen. + S:'$D(BMXIX) BMXIX="" + S:'$D(BMXSCR) BMXSCR="" + ; + ;---> Set Target Global for output and errors. + S BMXG="^BMXTMP($J)" + ; + ;---> If Mixed Case not set, set to No Change. + I '$D(BMXMC) S BMXMC=0 + ; + ;---> If Return IEN not set, set to No + I '$D(BMXNUM) S BMXNUM=0 + S BMXNUM=+BMXNUM + ; + ;---> Silent Fileman call. + D + .I $G(BMXIN)="" D Q + ..D LIST^DIC(BMXFL,,,,BMXMX,0,,BMXIX,BMXSCR,,BMXG,BMXG) + .D FIND^DIC(BMXFL,,,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,,BMXG,BMXG) + ; + D WRITE + Q + ; + ; + ;---------- +WRITE ;EP + ;---> Collect data for matching records and write in result global. + ; + ;---> First, check for errors. + ;---> If errors exist, write them and quit. + N I,N,X + I $D(^BMXTMP($J,"DIERR")) I $O(^("DIERR",0)) D Q + .S N=0,X="" + .F S N=$O(^BMXTMP($J,"DIERR",N)) Q:'N D + ..N M S M=0 + ..F S M=$O(^BMXTMP($J,"DIERR",N,"TEXT",M)) Q:'M D + ...S X=X_^BMXTMP($J,"DIERR",N,"TEXT",M)_" " + .D ERROUT(X,1) + ; + ; + ;---> Write valid results. + ;---> Loop through the IEN node (...2,N) of the temp global. + ; and call GETS^DIQ for each record + N I,N,X S N=0 + S BMXA="A" + ;B + S I=0 + S BMXFLDF=0 +RESULTS F S N=$O(^BMXTMP($J,"DILIST",2,N)) Q:'N D + . S X=^BMXTMP($J,"DILIST",2,N) + . S I=I+1 + . K A + . D GETS^DIQ(BMXFL,X_",",BMXFLDS,,BMXA,BMXA) + . ;--->Once only, write field names + . D:'BMXFLDF FIELDS + . ; + . ; + . ;---> Loop through results global + . S F=0,BMXCNT=0 + . F S F=$O(A(BMXFL,X_",",F)) Q:'F S BMXCNT=BMXCNT+1 + . S F=0 + . S BMXREC="" + . S:BMXNUM ^BMXTEMP($J,I)=X_"^" + . S BMXCNTB=0 + . S BMXORD=BMXNUM + . F S F=$O(A(BMXFL,X_",",F)) Q:'F S BMXCNTB=BMXCNTB+1 D S:BMXCNTBBMXLEN(BMXORD) BMXLEN(BMXORD)=BMXLTMP + . . . . Q + . . . D ;It's a multiple. Implement in next phase + . . . . Q ; + . . . Q + . . E D ;Not a multiple + . . . S I=I+1 + . . . S ^BMXTEMP($J,I)=A(BMXFL,X_",",F) + . . . S:$L(A(BMXFL,X_",",F))>BMXLEN(BMXORD) BMXLEN(BMXORD)=$L(A(BMXFL,X_",",F)) + . . . Q + . . Q + . ;---> Convert data to mixed case if BMXMC=1. + . ;S:BMXMC BMXREC=$$T^BMXTRS(BMXREC) + . ;---> Set data in result global. + . S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_$C(30) + ; + ;---> If no results, report it as an error. + D:'$O(^BMXTEMP($J,0)) + .I BMXIN]"" S BMXERR="No entry matches """_BMXIN_"""." Q + .S BMXERR="Either the lookup file is empty" + .S BMXERR=BMXERR_" or all entries are screened (software error)." + ; + ;---> Tack on Error Delimiter and any error. + S I=I+1 + S ^BMXTEMP($J,I)=BMX31_BMXERR + ;---> Column types and widths + S C=0 + F S C=$O(BMXLEN(C)) Q:'C D + . I BMXLEN(C)>99999 S BMXLEN(C)=99999 + . S ^BMXTEMP($J,C)=BMXTYP(C)_$$NUMCHAR(BMXLEN(C))_^BMXTEMP($J,C) + Q + ; + ; +NUMCHAR(BMXN) ;EP + ;---> Returns Field Length left-padded with 0 + ; + N BMXC + S BMXC="00000"_BMXN + Q $E(BMXC,$L(BMXC)-4,$L(BMXC)) + ; + ;---> Dead code follows + N C,BMXC,F,N,J + S BMXC="" + S N=BMXN + S:N>99999 N=99999 + S:N<0 N=0 + F J=1:1:$L(N) D + . S F=10**(J-1) + . S C=65+(N-((N\(10*F))*(10*F))\F) + . S C=$C(C) + . S BMXC=C_BMXC + S BMXC="AAAAA"_BMXC + Q $E(BMXC,$L(BMXC)-4,$L(BMXC)) + ; + ; +FIELDS ;---> Write Field Names + ;Field name is TAAAAANAME + ;Where T is the field type (T=Text; D=Date) + ; AAAAA is the field size (see NUMCHAR routine) + ; NAME is the field name + S BMXFLDF=1 + K BMXLEN,BMXTYP + D:$D(A) + . I BMXNUM S ^BMXTEMP($J,I)="IEN^",BMXLEN(I)=10,BMXTYP(I)="T",I=I+1 ;TODO: Change from text to number + . S ASDXFNUM=0 + . S BMXIENS=$O(A(BMXFL,0)) + . F S ASDXFNUM=$O(A(BMXFL,BMXIENS,ASDXFNUM)) Q:'ASDXFNUM D + . . S ASDXFNAM=$P(^DD(BMXFL,ASDXFNUM,0),"^") ;Get type here + . . S ASDXFNAM=$TR(ASDXFNAM," ","_") + . . S BMXTYP(I)="T" + . . S BMXLEN(I)=0 ;Start with length zero + . . S:ASDXFNAM="" ASDXFNAM="UNKNOWN"_I + . . S ^BMXTEMP($J,I)=ASDXFNAM_"^" + . . S I=I+1 + . S ^BMXTEMP($J,I-1)=$E(^BMXTEMP($J,I-1),1,$L(^BMXTEMP($J,I-1))-1)_$C(30) + Q + ; + ;---------- +ERROUT(BMXERR,I) ;EP + ;---> Save next line for Error Code File if ever used. + ;---> If necessary, use I>1 to avoid overwriting valid data. + S:'$G(I) I=1 + S ^BMXTEMP($J,I)=BMX31_BMXERR + Q + ; + ; +PASSERR(BMXGBL,BMXERR) ;EP + ;---> If the RPC routine calling the BMX Generic Lookup above + ;---> detects a specific error prior to the call and wants to pass + ;---> that error in the result global rather than a generic error, + ;---> then a call to this function (PASSERR) can be made. + ;---> This call will store the error text passed in the result global. + ;---> The calling routine should then quit (abort its call to the + ;---> BMX Generic Lookup function above). + ; + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global for Broker. + ; 2 - BMXERR (req) Text of error to be stored in result global. + ; + S:$G(BMXERR)="" BMXERR="Error not passed (software error)." + ; + N BMX31 S BMX31=$C(31)_$C(31) + K ^BMXTMP($J),^BMXTEMP($J) + S BMXGBL="^BMXTEMP("_$J_")" + S ^BMXTEMP($J,1)=BMX31_BMXERR + Q diff --git a/m/BMXG.m b/m/BMXG.m new file mode 100644 index 0000000..78c7e49 --- /dev/null +++ b/m/BMXG.m @@ -0,0 +1,54 @@ +BMXG ; IHS/OIT/HMW - UTIL: GET DATA ; + ;;2.1;BMX;;Jul 26, 2009 + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * + ; + ; + ;---------- +GET(FILE,Y,PC) ;EP + ;---> Return text of .01 Field of an entry in a file. + ;---> Parameters: + ; 1 - FILE (req) Number corresponding to desired file: + ; 1 = State File, #5 + ; 2 = Community File, #9999999.5 + ; 3 = Employer File, #9999999.75 + ; 4 = Beneficiary File, #9999999.25 + ; 5 = Tribe File, #9999999.03 + ; 6 = Insurer File, #9999999.18 + ; 7 = Suffix File, #9999999.32 + ; 8 = Employer Group Insurance File, #9999999.77 + ; 9 = Medicare Eligible File, #9000003 + ; 10 = Medicaid Eligible File, #9000004 + ; 11 = Private Insurance Eligible File, #9000006 + ; 12 = Patient File, #9000001 + ; 13 = VA Patient File, #2 + ; 14 = Policy Holder File, #9000003.1 + ; 15 = Relationship File, #9999999.36 + ; + ; 2 - Y (req) IEN in the File storing the desired entry. + ; 3 - PC (opt) Piece of 0-Node to return (default=1). + ; If PC=0 return entire 0-node. + ; + Q:($G(Y)'?1N.N) "" + Q:'$G(FILE) "" + S:$G(PC)="" PC=1 S U="^" + ; + D + .I FILE=1 S GLB="^DIC(5,"_Y_",0)" Q + .I FILE=2 S GLB="^AUTTCOM("_Y_",0)" Q + .I FILE=3 S GLB="^AUTNEMPL("_Y_",0)" Q + .I FILE=4 S GLB="^AUTTBEN("_Y_",0)" Q + .I FILE=5 S GLB="^AUTTTRI("_Y_",0)" Q + .I FILE=6 S GLB="^AUTNINS("_Y_",0)" Q + .I FILE=7 S GLB="^AUTTMCS("_Y_",0)" Q + .I FILE=8 S GLB="^AUTNEGRP("_Y_",0)" Q + .I FILE=9 S GLB="^AUPNMCR("_Y_",0)" Q + .I FILE=10 S GLB="^AUPNMCD("_Y_",0)" Q + .I FILE=11 S GLB="^AUPNPRVT("_Y_",0)" Q + .I FILE=12 S GLB="^AUPNPAT("_Y_",0)" Q + .I FILE=13 S GLB="^DPT("_Y_",0)" Q + .I FILE=14 S GLB="^AUPN3PPH("_Y_",0)" Q + .I FILE=15 S GLB="^AUTTRLSH("_Y_",0)" Q + ; + Q:'FILE "" + Q:PC=0 $G(@GLB) + Q $P($G(@GLB),U,PC) diff --git a/m/BMXGETS.m b/m/BMXGETS.m new file mode 100644 index 0000000..f4c1c36 --- /dev/null +++ b/m/BMXGETS.m @@ -0,0 +1,146 @@ +BMXGETS ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ;;Horace Whitt + ;;Interface to GETS^DIQ + ; + ;---------- +GETS(BMXGBL,BMXFL,BMXIENS,BMXFLDS,BMXFLG,BMXMC,BMXNUM) ;EP + ;---> The final record (node) contains Error Delimiter, + ; $C(31)_$C(31), followed by error text, if any. + ; + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global for Broker. + ; 2 - BMXFL (req) File number for lookup. + ; 3 - BMXFLDS (req) Fields to return w/each entry in IENS format. + ; 4 - BMXFLG (opt) Flags - See GETS^DIQ documentation + ; 9 - BMXMC (opt) Mixed Case: 1=mixed case, 0=no change. + ; (Converts data in uppercase to mixed case.) + ; 6 - BMXNUM (opt) Include IEN as first returned field (1=true) + ; + ;---> Set variables, kill temp globals. + N BMX31 + S BMX31=$C(31)_$C(31) + S BMXGBL="^BMXTEMP("_$J_")",BMXERR="",U="^" + K ^BMXTMP($J),^BMXTEMP($J) + ; + ;---> If file number not provided, return error. + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q + ; + I $G(BMXFLDS)="" S BMXFLDS=".01" + ; + ;---> Set Target Global for output and errors. + S BMXG="^BMXTMP($J)" + ; + ;---> If Mixed Case not set, set to No Change. + I '$D(BMXMC) S BMXMC=0 + ; + ;---> If Return IEN not set, set to No + I '$D(BMXNUM) S BMXNUM=0 + S BMXNUM=+BMXNUM + ; + ;---> Fileman call + D GETS^DIQ(BMXFL,BMXIENS,BMXFLDS,BMXFLG,BMXG,BMXG) + ; + D WRITE + Q + ; + ; + ;---------- +WRITE ;EP + ;---> Collect data for matching records and write in result global. + ; + ;---> First, check for errors. + ;---> If errors exist, write them and quit. + N I,N,X,F,ASDX,ASDC,ASDXFNUM,ASDXFNAM + I $D(^BMXTMP($J,"DIERR")) I $O(^("DIERR",0)) D Q + .S N=0,X="" + .F S N=$O(^BMXTMP($J,"DIERR",N)) Q:'N D + ..N M S M=0 + ..F S M=$O(^BMXTMP($J,"DIERR",N,"TEXT",M)) Q:'M D + ...S X=X_^BMXTMP($J,"DIERR",N,"TEXT",M)_" " + .D ERROUT(X,1) + ; + ; + ;---> Write Field Names + I BMXNUM S $P(ASDX,"^",1)="IEN" + ;F ASDC=1:1:$L(BMXFLDS,";") D + S ASDC=1 + S ASDXFNUM=0 + F S ASDXFNUM=$O(^BMXTMP($J,BMXFL,BMXIENS,ASDXFNUM)) Q:'ASDXFNUM D + . ;S ASDXFNUM=$P(BMXFLDS,";",ASDC) + . S ASDXFNAM=$P(^DD(BMXFL,ASDXFNUM,0),"^") + . S:ASDXFNAM="" ASDXFNAM="UNKNOWN"_ASDC + . S $P(ASDX,"^",ASDC+BMXNUM)=ASDXFNAM + . S ASDC=ASDC+1 + S ^BMXTEMP($J,1)=ASDX_$C(30) + ;---> Write valid results. +AAA ;---> Loop through results global + S I=2,N=0 F S N=$O(^BMXTMP($J,BMXFL,N)) Q:'N D + . S X="",F=0 + . I BMXNUM S X=+N + . F S F=$O(^BMXTMP($J,BMXFL,N,F)) Q:'F D + . . S:X'="" X=X_U + . . I $P(^DD(BMXFL,F,0),U,2) D I 1 ;Multiple or WP + . . . ;Get the subfile number into FL1 + . . . S FL1=+$P(^DD(BMXFL,F,0),U,2) + . . . S FLD1=$O(^DD(FL1,0)) + . . . I $P(^DD(FL1,FLD1,0),U,2)["W" D ;WP + . . . . S WPL=0 F S WPL=$O(^BMXTMP($J,BMXFL,N,F,WPL)) Q:'WPL D + . . . . . S X=X_^BMXTMP($J,BMXFL,N,F,WPL)_" " + . . . . . Q + . . . . Q + . . . D ;It's a multiple. Implement in next phase + . . . . Q ; + . . . Q + . . E D ;Not a multiple + . . . S X=X_^BMXTMP($J,BMXFL,N,F) + . . . Q + . . Q + . ;---> Convert data to mixed case if BMXMC=1. +ZZZ . S:BMXMC X=$$T^BMXTRS(X) + . ; + . ;---> Set data in result global. + . S ^BMXTEMP($J,I)=X_$C(30) + . S I=I+1 + ; + ;---> If no results, report it as an error. + D:'$O(^BMXTEMP($J,0)) + .I BMXIN]"" S BMXERR="No entry matches """_BMXIN_"""." Q + .S BMXERR="Either the lookup file is empty" + .S BMXERR=BMXERR_" or all entries are screened (software error)." + ; + ;---> Tack on Error Delimiter and any error. + S ^BMXTEMP($J,I)=BMX31_BMXERR + Q + ; + ; + ;---------- +ERROUT(BMXERR,I) ;EP + ;---> Save next line for Error Code File if ever used. + ;---> If necessary, use I>1 to avoid overwriting valid data. + S:'$G(I) I=1 + S ^BMXTEMP($J,I)=BMX31_BMXERR + Q + ; + ; +PASSERR(BMXGBL,BMXERR) ;EP + ;---> If the RPC routine calling the BMX Generic Lookup above + ;---> detects a specific error prior to the call and wants to pass + ;---> that error in the result global rather than a generic error, + ;---> then a call to this function (PASSERR) can be made. + ;---> This call will store the error text passed in the result global. + ;---> The calling routine should then quit (abort its call to the + ;---> BMX Generic Lookup function above). + ; + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global for Broker. + ; 2 - BMXERR (req) Text of error to be stored in result global. + ; + S:$G(BMXERR)="" BMXERR="Error not passed (software error)." + ; + N BMX31 S BMX31=$C(31)_$C(31) + K ^BMXTMP($J),^BMXTEMP($J) + S BMXGBL="^BMXTEMP("_$J_")" + S ^BMXTEMP($J,1)=BMX31_BMXERR + Q diff --git a/m/BMXMBRK.m b/m/BMXMBRK.m new file mode 100644 index 0000000..b809516 --- /dev/null +++ b/m/BMXMBRK.m @@ -0,0 +1,216 @@ +BMXMBRK ; IHS/OIT/HMW - BMXNet MONITOR ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +PRSP(P) ;EP -Parse Protocol + ;M Extrinsic Function + ; + ;Inputs + ;P Protocol string with the form + ; Protocol := Protocol Header^Message where + ; Protocol Header := LLLWKID;WINH;PRCH;WISH;MESG + ; LLL := length of protocol header (3 numeric) + ; WKID := Workstation ID (ALPHA) + ; WINH := Window handle (ALPHA) + ; PRCH := Process handle (ALPHA) + ; WISH := Window server handle (ALPHA) + ; MESG := Unparsed message + ;Outputs + ;ERR 0 for success, "-1^Text" if error + ; + N ERR,C,M,R,X + S R=0,C=";",ERR=0,M=512 ;Maximum buffer input + IF $E(P,1,5)="{BMX}" S P=$E(P,6,$L(P)) ;drop out prefix + IF '+$G(P) S ERR="-1^Required input reference is NULL" + IF +ERR=0 D + . S BMXZ(R,"LENG")=+$E(P,1,3) + . S X=$E(P,4,BMXZ(R,"LENG")+3) + . S BMXZ(R,"MESG")=$E(P,BMXZ(R,"LENG")+4,M) + . S BMXZ(R,"WKID")=$P(X,C) + . S BMXZ(R,"WINH")=$P(X,C,2) + . S BMXZ(R,"PRCH")=$P(X,C,3) + . S BMXZ(R,"WISH")=$P(X,C,4) + Q ERR + ; +PRSM(P) ;EP - Parse message + ;M Extrinsic Function + ; + ;Inputs + ;P Message string with the form + ; Message := Header^Content + ; Header := LLL;FLAG + ; LLL := length of entire message (3 numeric) + ; FLAG := 1 indicates variables follow + ; Content := Contains API call information + ;Outputs + ;ERR 0 for success, "-1^Text" if error + N C,ERR,M,R,X,U + S U="^",R=1,C=";",ERR=0,M=512 ;Max buffer + IF '+$G(P) S ERR="-1^Required input reference is NULL" + IF +ERR=0 D + . S BMXZ(R,"LENG")=+$E(P,1,5) + . S BMXZ(R,"FLAG")=$E(P,6,6) + . S BMXZ(R,"TEXT")=$E(P,7,M) + Q ERR + ; +PRSA(P) ;EP - Parse API information, get calling info + ;M Extrinsic Function + ;Inputs + ;P Content := API Name^Param string + ; API := .01 field of API file + ; Param := Parameter information + ;Outputs + ;ERR 0 for success, "-1^Text" if error + ; + N C,DR,ERR,M,R,T,X,U + S U="^",R=2,C=";",ERR=0,M=512 ;Max buffer + IF '+$L(P) S ERR="-1^Required input reference is NULL" + IF +ERR=0 D + . S BMXZ(R,"CAPI")=$P(P,U) + . S BMXZ(R,"PARM")=$E(P,$F(P,U),M) + . S T=$O(^XWB(8994,"B",BMXZ(R,"CAPI"),0)) + . I '+T S ERR="-1^Remote Procedure '"_BMXZ(R,"CAPI")_"' doesn't exist on the server." Q ;P10 - dpc + . S T(0)=$G(^XWB(8994,T,0)) + . I $P(T(0),U,6)=1!($P(T(0),U,6)=2) S ERR="-1^Remote Procedure '"_BMXZ(R,"CAPI")_"' cannot be run at this time." Q ;P10. Check INACTIVE field. - dpc. + . S BMXZ(R,"NAME")=$P(T(0),"^") + . S BMXZ(R,"RTAG")=$P(T(0),"^",2) + . S BMXZ(R,"RNAM")=$P(T(0),"^",3) + . S BMXPTYPE=$P(T(0),"^",4) + . S BMXWRAP=+$P(T(0),"^",8) + Q ERR + ; +PRSB(P) ;EP - Parse Parameter information + ;M Extrinsic Function + ;Inputs + ;P Param := M parameter list + ; Param := LLL,Name,Value + ; LLL := length of variable name and value + ; Name := name of M variable + ; Value := a string + ;Outputs + ;ERR 0 for success, "-1^Text" if error + ; + N A,ERR,F,FL,I,K,L,M,P1,P2,P3,P4,P5,MAXP,R + S R=3,MAXP=+$E(P,1,5) + S P1=$E(P,6,MAXP+5) ;only param string + S ERR=0,F=3,M=512 + IF '+$D(P) S ERR="-1^Required input reference is NULL" + S FL=+$G(BMXZ(1,"FLAG")) + S I=0 + IF '+ERR D + . IF 'FL,+MAXP=0 S P1="",ERR=1 Q + . F D Q:P1="" + . . Q:P1="" + . . S L=+$E(P1,1,3)-1 + . . S P3=+$E(P1,4,4) + . . S P1=$E(P1,5,MAXP) + . . S BMXZ(R,"P",I)=$S(P3'=1:$E(P1,1,L),1:$$GETV($E(P1,1,L))) + . . IF FL=1,P3=2 D ;XWB*1.1*2 + . . . S A=$$OARY^BMXMBRK2,BMXARY=A + . . . S BMXZ(R,"P",I)=$$CREF^BMXMBRK2(A,BMXZ(R,"P",I)) + . . S P1=$E(P1,L+1,MAXP) + . . S K=I,I=I+1 + . IF 'FL Q + . S P3=P + . S L=+$E(P3,1,5) + . S P1=$E(P3,F+3,L+F) + . S P2=$E(P3,L+F+3,M) + . ;instantiate array + . F D Q:+L=0 + . . S L=$$BREAD(3) Q:+L=0 S P3=$$BREAD(L) + . . S L=$$BREAD(3) IF +L'=0 S P4=$$BREAD(L) + . . IF +L=0 Q + . . IF P3=0,P4=0 S L=0 Q + . . IF FL=1 D LINST(A,P3,P4) + . . IF FL=2 D GINST + IF ERR Q P1 + S P1="" + D Q P1 + . F I=0:1:K D + . . IF FL,$E(BMXZ(R,"P",I),1,5)=".BMXS" D Q ;XWB*1.1*2 + . . . S P1=P1_"."_$E(BMXZ(R,"P",I),2,$L(BMXZ(R,"P",I))) + . . . IF I'=K S P1=P1_"," + . . S P1=P1_"BMXZ("_R_",""P"","_I_")" + . . IF I'=K S P1=P1_"," + IF '+ERR Q P1 + Q ERR + ; +BREAD(L) ;read tcp buffer, L is length + N E,X,DONE + S (E,DONE)=0 + R X#L:BMXDTIME(1) + S E=X + IF $L(E)0) D + I '+ERR D CHKPRMIT^BMXMSEC(BMXZ(2,"CAPI")) ;checks if RPC allowed to run + S:$L($G(BMXSEC)) ERR="-1^"_BMXSEC + ;IF 'DEBUG S:$D(XRT0) XRTN="RPC BROKER READ/PARSE" D:$D(XRT0) T1^%ZOSV ;stop RTL + IF '+ERR,(+S=0)!(+S>0) D + . D CAPI^BMXMBRK2(.BMXP,BMXZ(2,"RTAG"),BMXZ(2,"RNAM"),S) + E D CLRBUF ;p10 + IF 'DEBUG K BMXZ + IF $D(BMXARY) K @BMXARY,BMXARY + Q + ; +LINST(A,X,BMXY) ;instantiate local array + IF BMXY=$C(1) S BMXY="" + S X=A_"("_X_")" + S @X=BMXY + Q +GINST ;instantiate global + N DONE,N,T,T1 + S (DONE,I)=0 + ;find piece with global ref - recover $C(44) + S REF=$TR(REF,$C(23),$C(44)) + F D Q:DONE + . S N=$NA(^TMP("BMXZ",$J,$P($H,",",2))) + . S BMXZ("FRM")=REF + . S BMXZ("TO")=N + . IF '$D(@N) S DONE=1 Q + ;loop through all and instantiate + S DONE=0 + F D Q:DONE + . S T=$E(@REF@(I),4,M) + . IF T="" S DONE=1 Q + . S @N@("BMXZ")="" ;set naked indicator + . S @T + . S I=I+1 + K @N@("BMXZ") + Q + ; +GETV(V) ;get value of V - reference parameter + N X + S X=V + IF $E(X,1,2)="$$" Q "" + IF $C(34,36)[$E(V) X "S V="_$$VCHK(V) + E S V=@V + Q V + ; +VCHK(S) ;Parse string for first argument + N C,I,P + F I=1:1 S C=$E(S,I) D VCHKP:C="(",VCHKQ:C=$C(34) Q:" ,"[C + Q $E(S,1,I-1) +VCHKP S P=1 ;Find closing paren + F I=I+1:1 S C=$E(S,I) Q:P=0!(C="") I "()"""[C D VCHKQ:C=$C(34) S P=P+$S("("[C:1,")"[C:-1,1:0) + Q +VCHKQ ;Find closing quote + F I=I+1:1 S C=$E(S,I) Q:C=""!(C=$C(34)) + Q +CLRBUF ;p10 Empties Input buffer + N % + F R %#1:BMXDTIME(1) Q:%="" + Q diff --git a/m/BMXMBRK2.m b/m/BMXMBRK2.m new file mode 100644 index 0000000..4ac062d --- /dev/null +++ b/m/BMXMBRK2.m @@ -0,0 +1,171 @@ +BMXMBRK2 ; IHS/OIT/HMW - BMXNet MONITOR ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +CAPI(BMXY,TAG,NAM,PAR) ;EP - make API call + N R,T,DX,DY + IF BMXZ(1,"FLAG")=2 D + . S PAR=$P(PAR,BMXZ("FRM"))_BMXZ("TO")_$P(PAR,BMXZ("FRM"),2) + S R=$S(PAR'=+PAR&(PAR=""):TAG_"^"_NAM_"(.BMXY)",1:TAG_"^"_NAM_"(.BMXY,"_PAR_")") + U IO + D @R + ; D DEBUG^%Serenji("@R","10.10.10.104") + U $P + Q + ; +BHDR(WKID,WINH,PRCH,WISH) ;Build a protocol header + N S,L + S S="" + S S=WKID_";"_WINH_";"_PRCH_";"_WISH_";" + S L=$L(S) + S S=$E("000"_L,$L(L)+1,$L(L)+3)_S + Q S + ; +BARY(A,R,V) ;add array elements+values to storage array + IF A'["BMXS" Q "-1^ARRAY NAME MUST BE BMXS" + S @A@(R)=V + Q 0 + ; +BLDB(P) ;Build formatted string + N L + S L=$L(P) + Q $E("000"_L,$L(L)+1,$L(L)+3)_P + ; +BLDA(N,P) ;Build API string + ;M Extrinsic Function + ;Inputs + ;N API name + ;P Comma delimited parameter string + ;Outputs + ;String API string if successful, "-1^Text" if error + ; + N I,F,L,T,U,T1,T2 + IF '+$D(N) Q "-1^Required input reference is NULL" + S U="^" + S (F,T,Y)=0 + IF '$D(P) S P="" + IF P'="" D + . S L=$L(P)-$L($TR(P,$C(44)))+1 + . IF L=0 S L=1 + . F I=1:1:L D Q:T + . . S T1=$P(P,",",I) + . . S T2=$E(T1,1,1)="." + . . IF T1=+T1 Q + . . IF $E(T1,1,1)="^" S F=2,T=1 Q + . . IF T2&($E(T1,2,$L(T1))?.ANP) S F=1,T=1 Q + S P=$$BLDB(P) + S L=$L(P)+$L(P)-3 + S P=F_N_U_P + S L=$L(P) + Q $E("000"_L,$L(L)+1,$L(L)+3)_P + ; +BLDS(R) ;Build a parameter string from an array + N L,T,Y + S Y="" + F D Q:R="" + . S R=$Q(@R) + . IF R="" Q + . S L=$L(R)+$L(@R)+1 + . S T=@R + . S T=$TR(T,$C(44),$C(23)) + . S Y=Y_$E("000"_L,$L(L)+1,$L(L)+3)_R_"="_T + Q Y_"000" + ; +BLDU(R) ;Build a parameter string from a scalar + N DONE,L,N,N1,P1 + IF R=+R Q R + S N=$F(R,$C(34)) + IF N=0 Q $C(34)_R_$C(34) + S P1=$E(R,1,N-2) + S (L,DONE)=0 + F D Q:DONE + . S N1=$F(R,$C(34),N) + . IF N1=0 S L=$L(R)+2,N1=L + . S P1=P1_$C(34,34)_$E(R,N,N1-2) + . IF N1=L S DONE=1,P1=$C(34)_P1_$C(34) Q + . S N=N1 + Q $TR(P1,$C(44),$C(23)) + ; +BLDG(R) ;build a parameter string from a global reference + N I,L,L1,M,T,T1,T2,Y + K ^TMP("BMXZ",$J) + IF '$D(R) Q "-1^Reference does not exist" + S Y=$NA(^TMP("BMXZ",$J,$P($H,",",2))) + S I=0 + S M=512 + S T1=$P(R,")") + S L1=$L($P(R,"(")) + F D Q:R="" + . S R=$Q(@R) + . S T2=$F(R,"(") + . IF R=""!(R'[T1) Q + . S L=$L(R)+$L(@R)-L1 + . S T=@R + . S T=$TR(T,$C(44),$C(23)) + . S @Y@(I)=$E("000"_L,$L(L)+1,$L(L)+3)_"^("_$E(R,T2,M)_"="_$$BLDU(T) + . S I=I+1 + S @Y@(I)="000" + S Y=$TR(Y,$C(44),$C(23)) + Q Y + ; +OARY() ;EP - create storage array + N A,DONE,I + S (DONE,I)=0 + F I=1:1 D Q:DONE + . S A="BMXS"_I + . K @A ;temp fix for single array + . IF '$D(@A) S DONE=1 + S @A="" ;set naked + Q A + ; +CREF(R,P) ;EP - Convert array contained in P to reference A + N I,X,DONE,F1,S + S DONE=0 + S S="" + F I=1:1 D Q:DONE + . IF $P(P,",",I)="" S DONE=1 Q + . S X(I)=$P(P,",",I) + . IF X(I)?1"."1A.E D + . . S F1=$F(X(I),".") + . . S X(I)="."_R + . S S=S_X(I)_"," + Q $E(S,1,$L(S)-1) + ; +GETP(P) ;returns various parameters out of the Protocol string + N M,T,BMXZ + S M=512 + S T=$$PRSP^BMXMBRK(P) + IF '+T D + . S T=$$PRSM^BMXMBRK(BMXZ(0,"MESG")) + . IF '+T S T=BMXZ(0,"WKID")_";"_BMXZ(0,"WINH")_";"_BMXZ(0,"PRCH")_";"_BMXZ(0,"WISH")_";"_$P(BMXZ(1,"TEXT"),"^") + Q T + ; +CALLM(X,P,DEBUG) ;make call using Message string + N ERR,S + S X="",ERR=0 + S ERR=$$PRSM^BMXMBRK(P) + IF '+ERR S ERR=$$PRSA^BMXMBRK(BMXZ(1,"TEXT")) + IF '+ERR S S=$$PRSB^BMXMBRK(BMXZ(2,"PARM")) + IF (+S=0)!(+S>0) D + . D CAPI(.X,BMXZ(2,"RTAG"),BMXZ(2,"RNAM"),S) + IF 'DEBUG K BMXZ + K @(X("BMXS")),X("BMXS") + Q + ; +CALLA(X,P,DEBUG) ;make call using API string + N ERR,S + S X="",ERR=0 + S ERR=$$PRSA^BMXMBRK(P) + IF '+ERR S S=$$PRSB^BMXMBRK(BMXZ(2,"PARM")) + IF (+S=0)!(+S>0) D + . D CAPI(.X,BMXZ(2,"RTAG"),BMXZ(2,"RNAM"),S) + IF 'DEBUG K BMXZ + K @(X("BMXS")),X("BMXS") + Q + ; +TRANSPRT() ;Determine the Transport Method + ;DDP is local :=0 + ;TCP/IP is remote :=1 + ;Serial/RS-232 is remote :=2 + Q 1 + ;Q 0 ;Do DDP for Now diff --git a/m/BMXMEVN.m b/m/BMXMEVN.m new file mode 100644 index 0000000..f1e25f0 --- /dev/null +++ b/m/BMXMEVN.m @@ -0,0 +1,252 @@ +BMXMEVN ; IHS/OIT/HMW - BMXNet MONITOR ; + ;;2.1;BMX;;Jul 26, 2009 + ; + Q + ; +REGET ;EP + ;Error trap from REGEVNT, RAISEVNT, and UNREG + ; + I '$D(BMXI) N BMXI S BMXI=999 + S BMXI=BMXI+1 + D REGERR(BMXI,99) + Q + ; +REGERR(BMXI,BMXERID) ;Error processing + S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)=BMXERID_$C(30) + S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)=$C(31) + Q + ; +REGEVNT(BMXY,BMXEVENT) ;EP + ;RPC Called by BMX REGISTER EVENT to inform RPMS server + ;of client's interest in BMXEVENT + ;Returns RECORDSET with field ERRORID. + ;If everything ok then ERRORID = 0; + ; + N BMXI + S BMXI=0 + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY + S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30) + S ^TMP("BMX EVENT",$J,BMXEVENT)=$G(DUZ) + ; + S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31) + Q + ; +RAISEVNT(BMXY,BMXEVENT,BMXPARAM,BMXBACK,BMXKEY) ;EP + ;RPC Called to raise event BMXEVENT with parameter BMXPARAM + ;If BMXBACK = 'TRUE' then event will be raised back to originator + ;Calls EVENT + ;Returns a RECORDSET wit the field ERRORID. + ;If everything ok then ERRORID = 0; + ; + N BMXI,BMXORIG + S BMXI=0 + S BMXORIG=$S($G(BMXBACK)="TRUE":"",1:$J) + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY + S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30) + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") + ; + D EVENT(BMXEVENT,BMXPARAM,BMXORIG,$G(BMXKEY)) + ; + S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31) + Q + ; +EVENT(BMXEVENT,BMXPARAM,BMXORIG,BMXKEY) ;PEP - Raise event to interested clients + ;Clients are listed in ^TMP("BMX EVENT",BMXEVENT,BMXSESS)=DUZ + ;BMXORIG represents the event originator's session + ;The event will not be raised back to the originator if BMXORIG is the session of the originator + ;BMXKEY is a ~-delimited list of security keys. Only holders of one of these keys + ;will receive event notification. If BMXKEY is "" then all registered sessions + ;will be notified. + ; + L +^TMP("BMX EVENT RAISED"):30 + N BMXSESS,BMXINC + S BMXSESS=0 F S BMXSESS=$O(^TMP("BMX EVENT",BMXSESS)) Q:'+BMXSESS D + . I BMXSESS=$G(BMXORIG) Q + . I '$D(^TMP("BMX EVENT",BMXSESS,BMXEVENT)) Q + . ;S BMXDUZ=^TMP("BMX EVENT",BMXEVENT,BMXSESS) + . S BMXDUZ=^TMP("BMX EVENT",BMXSESS,BMXEVENT) + . ;TODO: Test if DUZ holds at least one of the keys in BMXKEY + . S BMXINC=$O(^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,99999999),-1) + . S:BMXINC="" BMXINC=0 + . ;S ^TMP("BMXTRACK",$P($H,",",2))="Job "_$J_" Set "_$NA(^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,BMXINC+1))_"="_$G(BMXPARAM) + . S ^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,BMXINC+1)=$G(BMXPARAM) ;IHS/OIT/HMW SAC Exemption Applied For + . Q + L -^TMP("BMX EVENT RAISED") + Q + ; +POLLD(BMXY) ;EP + ;Debug Entry Point + D DEBUG^%Serenji("POLL^BMXMEVN(.BMXY)") + Q + ; +POLL(BMXY) ;EP + ;Check event queue for events of interest to current session + ;Return DataSet of events and parameters + ;Called by BMX EVENT POLL + ; + N BMXI,BMXEVENT + S BMXI=0 + S X="POLLET^BMXMEVN",@^%ZOSF("TRAP") + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY + S ^TMP("BMX",$J,0)="T00030EVENT"_U_"T00030PARAM"_$C(30) + L +^TMP("BMX EVENT RAISED"):1 G:'$T POLLEND + ; + G:'$D(^TMP("BMX EVENT RAISED",$J)) POLLEND + S BMXEVENT=0 F S BMXEVENT=$O(^TMP("BMX EVENT RAISED",$J,BMXEVENT)) Q:BMXEVENT']"" D + . N BMXINC + . S BMXINC=0 + . F S BMXINC=$O(^TMP("BMX EVENT RAISED",$J,BMXEVENT,BMXINC)) Q:'+BMXINC D + . . ;Set output array node + . . S BMXPARAM=$G(^TMP("BMX EVENT RAISED",$J,BMXEVENT,BMXINC)) + . . S BMXI=BMXI+1 + . . S ^TMP("BMX",$J,BMXI)=BMXEVENT_U_BMXPARAM_$C(30) + . . Q + . Q + ;S ^TMP("BMXTRACK",$P($H,",",2))="Job "_$J_" Killed "_$NA(^TMP("BMX EVENT RAISED",$J)) + K ^TMP("BMX EVENT RAISED",$J) + ; +POLLEND S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)=$C(31) + L -^TMP("BMX EVENT RAISED") + Q + ; +TTESTD(BMXY,BMXTIME) ;Debug entry point + ; + D DEBUG^%Serenji("TTEST^BMXMEVN(.BMXY,BMXTIME)") + Q + ; +TTEST(BMXY,BMXTIME) ;EP Timer Test + ; + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") + S BMXY=$NA(^BMXTMP("BMX",$J)) K @BMXY + S ^BMXTMP("BMX",$J,0)="I00020HANGTIME"_$C(30) + I +BMXTIME H BMXTIME + ; + S BMXI=1 + S BMXI=BMXI+1 + S ^BMXTMP("BMX",$J,BMXI)=BMXTIME_$C(30)_$C(31) + ; + Q + ; +UNREGALL ;EP + ;Unregister all events for current session + ;Called on exit of each session + ; + N BMXEVENT + S BMXEVENT="" + K ^TMP("BMX EVENT",$J) + Q + ; +UNREG(BMXY,BMXEVENT) ;EP + ;RPC Called by client to Unregister client's interest in BMXEVENT + ;Returns RECORDSET with field ERRORID. + ;If everything ok then ERRORID = 0; + ; + N BMXI + S BMXI=0 + S X="REGET^BMXMEVN",@^%ZOSF("TRAP") + S BMXY=$NA(^TMP("BMX",$J)) K @BMXY + S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30) + K ^TMP("BMX EVENT",$J,BMXEVENT) + ; + S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31) + Q + ; +POLLET ;EP + ;Error trap from REGEVNT, RAISEVNT, ASYNCQUE and UNREG + ; + I '$D(BMXI) N BMXI S BMXI=999 + S BMXI=BMXI+1 + D POLLERR(BMXI,99) + Q + ; +POLLERR(BMXI,BMXERID) ;Error processing + S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)=BMXERID_U_$C(30) + S BMXI=BMXI+1 + S ^TMP("BMX",$J,BMXI)=$C(31) + Q + ; +ASYNCQUE(BMXY,BMXRPC,BMXEVN) ;EP + ;RPC Queues taskman to job wrapper ASYNCZTM + ; + ;RETURNS EVENT NAME, ZTSK in PARAM + S X="POLLET^BMXMEVN",@^%ZOSF("TRAP") + S BMXY=$NA(^TMP("BMX ASYNC QUEUE",$J)) K @BMXY + S ^TMP("BMX ASYNC QUEUE",$J,0)="I00030ERRORID"_U_"I00030PARAM"_$C(30) + ; + ;K ZTSK + N ZTSK,ZTRTN,ZTSAVE,ZTDESC,ZTIO,ZTDTH + ;S ZTRTN="ASYNCZTD^BMXMEVN" ;Debugging call + S ZTRTN="ASYNCZTM^BMXMEVN" + S BMXRPC=$TR(BMXRPC,"~",$C(30)) + S ZTSAVE("BMXRPC")="" + S ZTSAVE("BMXEVN")="" + S ZTDESC="BMX ASYNC JOB" + S ZTIO="",ZTDTH=DT + D ^%ZTLOAD + ;D @ZTRTN ;Debugging call + ; + S ^TMP("BMX ASYNC QUEUE",$J,1)=1_U_$G(ZTSK)_$C(30) + S ^TMP("BMX ASYNC QUEUE",$J,2)=$C(31) + Q + ; +ASYNCZTD ;EP Debug entry point + D DEBUG^%Serenji("ASYNCZTM^BMXMEVN") + Q + ; +ASYNCZTM ;EP + ;Called by Taskman with BMXRPC and BMXEVN defined to + ; 1) invoke the BMXRPC (RPC NAME^PARAM1^...^PARAMN) + ; 2) when done, raises event BMXEVN with ZTSK^$J in BMXPARAM + ; + N BMXRTN,BMXTAG,BMXRPCD,BMXCALL,BMXJ,BMXY,BMXNOD,BMXY + N BMXT S BMXT=$C(30) + I $E(BMXRPC,1,6)="SELECT" S BMXRPC="BMX SQL"_$C(30)_BMXRPC + S BMXRPCD=$O(^XWB(8994,"B",$P(BMXRPC,BMXT),0)) + S BMXNOD=^XWB(8994,BMXRPCD,0) + S BMXRTN=$P(BMXNOD,U,3) + S BMXTAG=$P(BMXNOD,U,2) + S BMXCALL="D "_BMXTAG_"^"_BMXRTN_"(.BMXY," + F BMXJ=2:1:$L(BMXRPC,BMXT) D + . S BMXCALL=BMXCALL_$C(34)_$P(BMXRPC,BMXT,BMXJ)_$C(34) + . S:BMXJ<$L(BMXRPC,BMXT) BMXCALL=BMXCALL_"," + . Q + S BMXCALL=BMXCALL_")" + X BMXCALL + D EVENT(BMXEVN,$G(ZTSK)_"~"_$P($G(BMXY),U,2),$J,"") + Q + ; + ; + ;Windows event handler: + ;Catches event with ZTSK^DataLocation parameter + ;Matches ZTSK to process that called event + ;Calls ASYNCGET rpc with DATALOCATION parameter + ; +ASYNCGET(BMXY,BMXDATA) ;EP + ;RPC Retrieves data queued by ASYNCZTM + ;by setting BMXY to BMXDATA + ; + S BMXY="^"_BMXDATA + Q + ; +ASYNCET ;EP + ;Error trap from ASYNCQUE + ; + I '$D(BMXI) N BMXI S BMXI=999 + S BMXI=BMXI+1 + D ASYNCERR(BMXI,0) + Q + ; +ASYNCERR(BMXI,BMXERID) ;Error processing + S BMXI=BMXI+1 + S ^TMP("BMX ASYNC QUEUE",$J,BMXI)=BMXERID_U_$C(30) + S BMXI=BMXI+1 + S ^TMP("BMX ASYNC QUEUE",$J,BMXI)=$C(31) + Q diff --git a/m/BMXMON.m b/m/BMXMON.m new file mode 100644 index 0000000..0884f50 --- /dev/null +++ b/m/BMXMON.m @@ -0,0 +1,354 @@ +BMXMON ; IHS/OIT/HMW - BMXNet MONITOR ; 7/20/2009 + ;;2.1;BMX;;Jul 26, 2009 + ; + ;IHS/OIT/HMW Patch 1 added validity check for passed-in namespace + ; 7/20/2009: Release of patch to support GT.M WV/SMH + ; Changes: + ; Addition of XINETD and GTMLNX entry points for support of GT.M + ; Changes of W *-3 (which only works on Cache) to W ! + ; +STRT(BMXPORT,NS,IS,VB) ;EP + ;Interactive monitor start + ;Optional NS = namespace. If undefined, start in current ns + ;Optional IS = Integrated Security. Default is 1 + ;Optional VB = Verbose. Default is 1 + ; + N Y,BMXNS,BMXWIN + ; + ;Verbose + S BMXVB=$G(VB,1) + ; + ;Check if port already running + I '$$SEMAPHOR(BMXPORT,"LOCK") W:BMXVB "BMXNet Monitor on port "_BMXPORT_" appears to be running already.",! Q + S %=$$SEMAPHOR(BMXPORT,"UNLOCK") + ; + D MARKER(BMXPORT,1) ;record problem marker + ; -- start the monitor + ; + ;Namespace + X ^%ZOSF("UCI") + S BMXNS=$G(NS,$P(Y,",")) + ; + ;Integrated security + S BMXWIN=$G(IS,1) + ; + ;J DEBUG^%Serenji("MON^BMXMON("_BMXPORT_","_BMXNS_","_BMXWIN_")") + J MON^BMXMON(BMXPORT,BMXNS,BMXWIN)::5 I '$T W:BMXVB "Unable to run BMXNet Monitor in background.",! Q ;IHS/OIT/HMW SAC Exemption Applied For + F %=1:1:5 D Q:%=0 + . W:BMXVB "Checking if BMXNet Monitor has started...",! + . H 1 + . S:'$$MARKER(BMXPORT,0) %=0 + I $$MARKER(BMXPORT,0) D + . W:BMXVB !,"BMXNet Monitor could not be started!",! + . W:BMXVB "Check if port "_BMXPORT_" is busy on this CPU.",! + . D MARKER(BMXPORT,-1) ;clear marker + E W:BMXVB "BMXNet Monitor started successfully." + ; + Q + ; +RESTART ;EP + ;Stop and Start all monitors in BMX MONITOR file + ;Called by option BMX MONITOR START + ; + D STOPALL + D STRTALL + Q + ; +STRTALL ;EP + ;Start all monitors in BMX MONITOR file + ; + N BMXIEN + S BMXIEN=0 F S BMXIEN=$O(^BMXMON(BMXIEN)) Q:'+BMXIEN D + . S BMXNOD=$G(^BMXMON(BMXIEN,0)) + . Q:'+BMXNOD + . Q:'+$P(BMXNOD,U,2) + . S BMXWIN=$P(BMXNOD,U,3) + . S BMXNS=$P(BMXNOD,U,4) + . D STRT($P(BMXNOD,U),BMXNS,BMXWIN,0) + . Q + Q + ; +STOPALL ;EP + ;Stop all monitors in BMXNET MONITOR file + ; + N BMXIEN,BMXPORT + S BMXIEN=0 F S BMXIEN=$O(^BMXMON(BMXIEN)) Q:'+BMXIEN D + . S BMXNOD=$G(^BMXMON(BMXIEN,0)) + . Q:'+BMXNOD + . S BMXPORT=+BMXNOD + . D STOP(BMXPORT,0) + Q + ; +STOP(BMXPORT,VB) ;EP Stop monitor on BMXPORT + ;Open a channel to monitor on BMXPORT and send shutdown request + ;Optional VB = Verbose. Default is 1 + ; + N IP,REF,X,DEV + S U="^" D HOME^%ZIS + ; + ;Verbose + S BMXVB=$G(VB,1) + ; + D:BMXVB EN^DDIOL("Stop BMXNet Monitor...") + X ^%ZOSF("UCI") S REF=Y + S IP="0.0.0.0" ;get server IP + IF $G(BMXPORT)="" S BMXPORT=9200 + ; -- make sure the listener is running + I $$SEMAPHOR(BMXPORT,"LOCK") D Q + . S %=$$SEMAPHOR(BMXPORT,"UNLOCK") + . D:BMXVB EN^DDIOL("BMXNet Monitor does not appear to be running.") + ; -- send the shutdown message to the TCP Listener process + D CALL^%ZISTCP("127.0.0.1",BMXPORT) I POP D Q + . S %=$$SEMAPHOR(BMXPORT,"UNLOCK") + . D:BMXVB EN^DDIOL("BMXNet Monitor does not appear to be running.") + U IO + S X=$T(+2),X=$P(X,";;",2),X=$P(X,";") + IF X="" S X=0 + S X=$C($L(X))_X + W "{BMX}00011TCPshutdown",! + R X#3:5 + D CLOSE^%ZISTCP + I X="ack" D:BMXVB EN^DDIOL("BMXNet Monitor has been shutdown.") + E D:BMXVB EN^DDIOL("Shutdown Failed!") + ;change process name + D CHPRN($J) + Q + ; +MON(BMXPORT,NS,IS) ;Monitor port for connection & shutdown requests + ;NS = Namespace to Start monitor + ;IS = 1: Enable integrated security + ; + N BMXDEV,BMXQUIT,BMXDTIME,BMXLEN,BMXACT,BMXWIN,BMXNS + S BMXQUIT=0,BMXDTIME=999999 + ; + ;Set lock + Q:'$$SEMAPHOR(BMXPORT,"LOCK") + ;Clear problem marker + D MARKER(BMXPORT,-1) + ;H 1 + ; + ;Namespace + X ^%ZOSF("UCI") + S BMXNS=$G(NS,$P(Y,",")) + ; + ;Integrated security + S BMXWIN=$G(IS,1) + ; + ;Open server port; + S BMXDEV="|TCP|"_BMXPORT + C BMXDEV ;IHS/OIT/HMW SAC Exemption Applied For + O BMXDEV:(:BMXPORT:"S"):5 I '$T Q ;IHS/OIT/HMW SAC Exemption Applied For + ; + ;S BMXDTIME(1)=BMXDTIME ; TODO: Set timeouts + S BMXDTIME(1)=.5 ;HMW 20050120 + U BMXDEV + F D Q:BMXQUIT + . R BMXACT#5:BMXDTIME ;Read first 5 chars from TCP buffer, timeout=BMXDTIME + . I BMXACT'="{BMX}" S BMXQUIT=1 Q + . R BMXACT#5:BMXDTIME ;Read next 5 chars - message length + . S BMXLEN=+BMXACT + . R BMXACT#BMXLEN:BMXDTIME + . I $P(BMXACT,"^")="TCPconnect" D Q + . . ;IHS/OIT/HMW added validity check for namespace + . . N BMXNSJ,X,Y + . . S BMXNSJ=$P(BMXACT,"^",2) ;Namespace + . . S BMXNSJ=$P(BMXNSJ,",") + . . ;if passed in namespace is invalid, new job will start in listener namespace + . . I BMXNSJ]"" S X=BMXNSJ X ^%ZOSF("UCICHECK") S:Y=0 BMXNSJ=BMXNS + . . ;Job another MONITOR using concurrent connection + . . ;J DEBUG^%Serenji("SESSION^BMXMON("_BMXWIN_")"):(:5:BMXDEV:BMXDEV):5 + . . ;J SESSION^BMXMON(BMXWIN)[$P(BMXNS,",")]:(:5:BMXDEV:BMXDEV):5 ;IHS/OIT/HMW SAC Exemption Applied For + . . J SESSION^BMXMON(BMXWIN)[BMXNSJ]:(:5:BMXDEV:BMXDEV):5 ;IHS/OIT/HMW SAC Exemption Applied For + . I $P(BMXACT,"^")="TCPshutdown" S BMXQUIT=1 W "ack",! + S %=$$SEMAPHOR(BMXPORT,"UNLOCK") ; destroy 'running flag' + Q + ; +XINETD ;PEP Directly from xinetd or inetd for GT.M + N BMXDEV + S U="^",$ETRAP="D ^%ZTER H" ;Set up the error trap + S $ZT="" ;Clear old trap + ; GT.M specific error and device code + S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") + S BMXDEV=$P X "U BMXDEV:(nowrap:nodelimiter:ioerror=""TRAP"")" + S %="",@("%=$ZTRNLNM(""REMOTE_HOST"")") S:$L(%) IO("GTM-IP")=% + I %["::ffff:" S IO("GTM-IP")=$P(%,"::ffff:",2) ; IPv6 support + ; Read message type + N BMXACT,BMXDTIME + S BMXDTIME=999999 + R BMXACT#5:BMXDTIME + Q:BMXACT'="{BMX}" ; Not a BMX message - quit. + ; Fall through to below... +GTMLNX ;EP from XWBTCPM for GT.M + ; not implementing NS and integrated authentication + ; Vars: Read timeout, msg len, msg, windows auth, Namespace + N BMXDTIME,BMXLEN,BMXACT,BMXWIN,BMXNS + S BMXNSJ="",BMXWIN=0 ; No NS on GT.M, no Windows Authentication + S BMXDTIME(1)=.5,BMXDTIME=999999 + R BMXACT#5:BMXDTIME ;Read next 5 chars - message length + S BMXLEN=+BMXACT + R BMXACT#BMXLEN:BMXDTIME + I $P(BMXACT,"^")="TCPconnect" G SESSRES + I $P(BMXACT,"^")="TCPshutdown" W "ack",! Q + Q ; Should't hit this quit, but just in case + ; +SESSION(BMXWIN) ;EP + ;Start session monitor + ;BMXWIN = 1: Enable integrated security +SESSRES ;EP - reentry point from trap + ;IHS/OIT/HMW SAC Exemption Applied For + N $ESTACK S $ETRAP="D ETRAP^BMXMON" + S DIQUIET=1,U="^" D DT^DICRW + D UNREGALL^BMXMEVN ;Unregister all events for this session + U $P D SESSMAIN + ;Turn off the error trap for the exit + S $ETRAP="" + I $G(DUZ) D LOGOUT^XUSRB + K BMXR,BMXARY + C $P ;IHS/OIT/HMW SAC Exemption Applied For + Q + ; +SESSMAIN ; + N BMXTBUF + D SETUP^BMXMSEC(.RET) ;Setup required system vars + S U="^" + U $P + F D Q:BMXTBUF="#BYE#" + . R BMXTBUF#11:BMXDTIME IF '$T D TIMEOUT S BMXTBUF="#BYE#" Q + . I BMXTBUF["XQKEY" S HWMP=1 + . I BMXTBUF="#BYE#" Q + . S BMXHTYPE=$S($E(BMXTBUF,1,5)="{BMX}":1,1:0) ;check HDR + . I 'BMXHTYPE S BMXTBUF="#BYE#" D SNDERR W BMXTBUF,$C(4),! Q + . S BMXTLEN=$E(BMXTBUF,6,10),L=$E(BMXTBUF,11,11) + . R BMXTBUF#4:BMXDTIME(1) S BMXTBUF=L_BMXTBUF + . S BMXPLEN=BMXTBUF + . R BMXTBUF#BMXPLEN:BMXDTIME(1) + . I $P(BMXTBUF,U)="TCPconnect" D Q + . . D SNDERR W "accept",$C(4),! ;Ack + . IF BMXHTYPE D + . . K BMXR,BMXARY + . . IF BMXTBUF="#BYE#" D SNDERR W "#BYE#",$C(4),! Q + . . S BMXTLEN=BMXTLEN-15 + . . D CALLP^BMXMBRK(.BMXR,BMXTBUF) + . . S BMXPTYPE=$S('$D(BMXPTYPE):1,BMXPTYPE<1:1,BMXPTYPE>6:1,1:BMXPTYPE) + . IF BMXTBUF="#BYE#" Q + . U $P + . D SNDERR ;Clears SNDERR parameters + . D SND + . D WRITE($C(4)) W ! ;send eot and flush buffer + D UNREGALL^BMXMEVN ;Unregister all events for this session + Q ;End Of Main + ; +SNDERR ;send error information + ;BMXSEC is the security packet, BMXERROR is application packet + N X + S X=$E($G(BMXSEC),1,255) + W $C($L(X))_X W ! + S X=$E($G(BMXERROR),1,255) + W $C($L(X))_X W ! + S BMXERROR="",BMXSEC="" ;clears parameters + Q + ; +WRITE(BMXSTR) ;Write a data string + ; + I $L(BMXSTR)<511 W ! W BMXSTR Q + ;Handle a long string + W ! ;Flush the buffer + F Q:'$L(BMXSTR) W $E(BMXSTR,1,510),! S BMXSTR=$E(BMXSTR,511,99999) + Q +SND ; -- send data for all, Let WRITE sort it out + N I,T + ; + ; -- error or abort occurred, send null + IF $L(BMXSEC)>0 D WRITE("") Q + ; -- single value + IF BMXPTYPE=1 S BMXR=$G(BMXR) D WRITE(BMXR) Q + ; -- table delimited by CR+LF + IF BMXPTYPE=2 D Q + . S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE(BMXR(I)),WRITE($C(13,10)) + ; -- word processing + IF BMXPTYPE=3 D Q + . S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE(BMXR(I)) D:BMXWRAP WRITE($C(13,10)) + ; -- global array + IF BMXPTYPE=4 D Q + . S I=$G(BMXR) Q:I="" S T=$E(I,1,$L(I)-1) D:$D(@I)>10 WRITE(@I) + . F S I=$Q(@I) Q:I=""!(I'[T) W ! W @I W:BMXWRAP&(@I'=$C(13,10)) $C(13,10) + . IF $D(@BMXR) K @BMXR + ; -- global instance + IF BMXPTYPE=5 S BMXR=$G(@BMXR) D WRITE(BMXR) Q + ; -- variable length records only good upto 255 char) + IF BMXPTYPE=6 S I="" F S I=$O(BMXR(I)) Q:I="" D WRITE($C($L(BMXR(I)))),WRITE(BMXR(I)) + Q + ; +TIMEOUT ;Do this on MAIN loop timeout + I $G(DUZ)>0 D SNDERR,WRITE("#BYE#"_$C(4)) Q + ;Sign-on timeout + S BMXR(0)=0,BMXR(1)=1,BMXR(2)="",BMXR(3)="TIME-OUT",BMXPTYPE=2 + D SNDERR,SND,WRITE($C(4)) + Q + ; +SEMAPHOR(BMXTSKT,BMXACT) ;Lock/Unlock BMXMON semaphore + N RESULT + S U="^",RESULT=1 + D GETENV^%ZOSV ;get Y=UCI^VOL^NODE^BOXLOOKUP of current system + I BMXACT="LOCK" D + . L +^BMXMON("BMXMON",$P(Y,U,2),$P(Y,U),$P(Y,U,4),BMXTSKT):1 + . S RESULT=$T + E L -^BMXMON("BMXMON",$P(Y,U,2),$P(Y,U),$P(Y,U,4),BMXTSKT) + Q RESULT + ; +CHPRN(N) ;Change process name to N. + D SETNM^%ZOSV($E(N,1,15)) + Q + ; +MARKER(BMXPORT,BMXMODE) ;Set/Test/Clear Problem Marker, BMXMODE=0 is a function + N IP,Y,%,REF X ^%ZOSF("UCI") S REF=Y,IP="0.0.0.0",%=0 + L +^BMX(IP,REF,BMXPORT,"PROBLEM MARKER"):1 + I BMXMODE=1 S ^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")=1 + I BMXMODE=0 S:$D(^BMX(IP,REF,BMXPORT,"PROBLEM MARKER")) %=1 + I BMXMODE=-1 K ^BMX(IP,REF,BMXPORT,"PROBLEM MARKER") + L -^BMX(IP,REF,BMXPORT,"PROBLEM MARKER") + Q:BMXMODE=0 % Q + ; +ETRAP ; -- on trapped error, send error info to client + N BMXERC,BMXERR,BMXLGR + ;Change trapping during trap. + S $ETRAP="D ^%ZTER HALT" + S BMXERC=$$EC^%ZOSV + S BMXERR="M ERROR="_BMXERC_$C(13,10)_"LAST REF=" + S BMXLGR=$$LGR^%ZOSV_$C(4) + S BMXERR=BMXERR_BMXLGR + D ^%ZTER ;%ZTER clears $ZE and $ECODE + I (BMXERC["READ")!(BMXERC["WRITE")!(BMXERC["SYSTEM-F") D:$G(DUZ) LOGOUT^XUSRB HALT + U $P + D SNDERR,WRITE(BMXERR) W ! + S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" G SESSRES^BMXMON",$ECODE=",U99," + Q + ; +MENU ;EP - ENTRY ACTION FROM BMXMENU OPTION + ; + N BMX,BMXVER + ;VERSION + D + . S BMXN="BMXNET ADO.NET DATA PROVIDER" I $D(^DIC(9.4,"B",BMXN)) Q + . S BMXN="BMXNET RPMS .NET UTILITIES" I $D(^DIC(9.4,"B",BMXN)) Q + . S BMXN="" + . Q + ; + S BMXVER="" + I BMXN]"",$D(^DIC(9.4,"B",BMXN)) D + . S BMX=$O(^DIC(9.4,"B",BMXN,0)) + . I $D(^DIC(9.4,BMX,"VERSION")) S BMXVER=$P(^DIC(9.4,BMX,"VERSION"),"^") + . E S BMXVER="VERSION NOT FOUND" + S:BMXVER="" BMXVER="VERSION NOT FOUND" + ; + ;LOCATION + N BMXLOC + S BMXLOC="" + I $G(DUZ(2)),$D(^DIC(4,DUZ(2),0)) S BMXLOC=$P(^DIC(4,DUZ(2),0),"^") + S:BMXLOC="" BMXLOC="LOCATION NOT FOUND" + ; + ;WRITE + W ! + W !,"BMXNet Version: ",BMXVER + W !,"Location: ",BMXLOC + Q diff --git a/m/BMXMSEC.m b/m/BMXMSEC.m new file mode 100644 index 0000000..5394814 --- /dev/null +++ b/m/BMXMSEC.m @@ -0,0 +1,77 @@ +BMXMSEC ; IHS/OIT/HMW - BMXNet MONITOR ; 7/20/2009 + ;;2.1;BMX;;Jul 26, 2009 + ; Edit History + ; Line SETUP+2 has been changed to support GT.M //SMH 7/5/09 + ; Per Wally Fort's GT.M code in XWBTCPM, IP for GT.M is stored + ; in IP("GTM-IP"). Changes in BMXMON and here follow that model. + ; +CHKPRMIT(BMXRP) ;EP - checks to see if remote procedure is permited to run + ;Input: BMXRP - Remote procedure to check + Q:$$KCHK("XUPROGMODE") + N ERR,BMXALLOW + S U="^",BMXSEC="" ;clear + ; + ;In the beginning, when no DUZ is defined and no context exist, setup + ;default signon context + S:'$G(DUZ) DUZ=0,XQY0="XUS SIGNON" ;set up default context + ; + I BMXRP'="XWB IM HERE",BMXRP'="XWB CREATE CONTEXT",BMXRP'="XWB RPC LIST",BMXRP'="BMX AV CODE" D ;check exemptions. new exemption for XWB*1.1*6 - dpc + . I $G(XQY0)'="" D + . . S BMXALLOW=$$CHK^XQCS(DUZ,$P(XQY0,U),BMXRP) ;do the check + . . S:'BMXALLOW BMXSEC=BMXALLOW + . E S BMXSEC="Application context has not been created!" + Q + ; +OWNSKEY(RET,LIST) ;EP Does user have Key + N I,K S I="" + I $G(DUZ)'>0 S RET(0)=0 Q + I $O(LIST(""))="" S RET(0)=$$KCHK(LIST) Q + F S I=$O(LIST(I)) Q:I="" S RET(I)=$$KCHK(LIST(I)) + Q +KCHK(%) Q $S($G(DUZ)>0:$D(^XUSEC(%,DUZ)),1:0) ;EP Key Check + ; + ; +SETUP(RET) ;EP - sets up environment for GUI signon + ; + K ^TMP("XQCS",$J) + ; S IO("IP")=$P D ZIO^%ZIS4 ;IHS/OIT/HMW SAC Exemption Applied For + ; --> Begin new code + I $$OS^XWBTCPM="GT.M" S IO("IP")=IO("GTM-IP") + I $$OS^XWBTCPM="OpenM" S IO("IP")=$P + D ZIO^%ZIS4 + ; <-- End new code //SMH + D SET1(0),SET^BMXMSEC("XUS XOPT",XOPT),SET^BMXMSEC("XUS CNT",0) + S %ZIS="0H",IOP="NULL" D ^%ZIS + ;0=server name, 1=volume, 2=uci, 3=device, 4=# attempts, 5=skip signon-screen + S RET(0)=$P(XUENV,U,3),RET(1)=$P(XUVOL,U),RET(2)=XUCI + S RET(3)=$I,RET(4)=$P(XOPT,U,2),RET(5)=0 ;IHS/OIT/HMW SAC Exemption Applied For + I $$INHIBIT() Q + Q + ; +SET1(FLAG) ;Setup parameters + D GETENV^%ZOSV S U="^",XUENV=Y,XUCI=$P(Y,U,1),XQVOL=$P(Y,U,2),XUEON=^%ZOSF("EON"),XUEOFF=^("EOFF") + S X=$O(^XTV(8989.3,1,4,"B",XQVOL,0)),XUVOL=$S(X>0:^XTV(8989.3,1,4,X,0),1:XQVOL_"^y^1") S:$P(XUVOL,U,6)="y" XRTL=XUCI_","_XQVOL + S XOPT=$S($D(^XTV(8989.3,1,"XUS")):^("XUS"),1:"") F I=2:1:15 I $P(XOPT,U,I)="" S $P(XOPT,U,I)=$P("^5^900^1^1^^^^1^300^^^^N^90",U,I) + Q + ; +INHIBIT() ;Is Logon to this system Inhibited? + I $G(^%ZIS(14.5,"LOGON",XQVOL)) Q 1 + I $D(^%ZOSF("ACTJ")) X ^("ACTJ") I $P(XUVOL,U,3),($P(XUVOL,U,3)'>Y) Q 2 + Q 0 + ; +NOW S U="^",XUNOW=$$NOW^XLFDT(),DT=$P(XUNOW,"."),XUDEV=0 + Q + ; +STATE(%) ;Return a state value + ;XWBSTATE is required by XUSRB + Q:'$L($G(%)) $G(XWBSTATE) + Q $G(XWBSTATE(%)) + ; + ; +SET(%,VALUE) ;Set the state variable + I $G(%)="" S XWBSTATE=VALUE + S XWBSTATE(%)=VALUE + Q +KILL(%) ;Kill state variable + I $L($G(%)) K XWBSTATE(%) + Q diff --git a/m/BMXNTEG.m b/m/BMXNTEG.m new file mode 100644 index 0000000..36e3d5f --- /dev/null +++ b/m/BMXNTEG.m @@ -0,0 +1,78 @@ +BMXNTEG ;INTEGRITY CHECKER;FEB 26, 2007 + ;;2.1;BMX;;Jul 26, 2009 + ; +START ; + NEW BYTE,COUNT,RTN + K ^UTILITY($J) + F I=1:1 S X=$T(LIST+I) Q:X="" S X=$P(X,";;",2),R=$P(X,"^",1),B=$P(X,"^",2),C=$P(X,"^",3),^UTILITY($J,R)=B_"^"_C + F I=1:1:6 S X=$P($T(@("LINE"_I)),";;",2,99),@("XBSUMBLD("_I_")=X") + X XBSUMBLD(1) + Q + ; +LINE1 ;;X XBSUMBLD(2),XBSUMBLD(6) +LINE2 ;;S RTN=0 F S RTN=$O(^UTILITY($J,RTN)) Q:RTN="" W !,RTN ZL @RTN S (BYTE,COUNT)=0 S X=$T(+1),X=$P(X," [ ",1) X XBSUMBLD(4),XBSUMBLD(3),XBSUMBLD(5) +LINE3 ;;F I=2:1 S X=$T(+I) Q:X="" X XBSUMBLD(4) +LINE4 ;;F J=1:1 S Y=$E(X,J) Q:Y="" S BYTE=BYTE+1,COUNT=COUNT+$A(Y) +LINE5 ;;S B=$P(^UTILITY($J,RTN),"^",1),C=$P(^(RTN),"^",2) I B'=BYTE!(C'=COUNT) W " has been modified" +LINE6 ;;K XBSUMBLD,B,C,I,J,R,X,Y + ; +LIST ; + ;;BMXADE1^3028^202865 + ;;BMXADE2^3250^215372 + ;;BMXADO^6547^418026 + ;;BMXADO2^3489^255546 + ;;BMXADOF^11562^731974 + ;;BMXADOF1^3281^207224 + ;;BMXADOF2^2138^139496 + ;;BMXADOFD^2831^178610 + ;;BMXADOFS^6515^393782 + ;;BMXADOI^2215^134605 + ;;BMXADOS^9145^575000 + ;;BMXADOS1^2590^161592 + ;;BMXADOV^5739^373823 + ;;BMXADOV1^9072^554887 + ;;BMXADOV2^4690^289898 + ;;BMXADOVJ^3530^225534 + ;;BMXADOX^13904^870277 + ;;BMXADOX1^11753^751110 + ;;BMXADOX2^3126^199406 + ;;BMXADOXX^12226^762799 + ;;BMXADOXY^11992^769511 + ;;BMXE01^2111^148783 + ;;BMXFIND^7919^562996 + ;;BMXG^1970^120467 + ;;BMXGETS^4309^308726 + ;;BMXMBRK^5919^389568 + ;;BMXMBRK2^3621^233089 + ;;BMXMEVN^6627^468908 + ;;BMXMON^9356^664477 + ;;BMXMSEC^2302^160584 + ;;BMXNTEG^2045^127438 + ;;BMXPO^1522^101987 + ;;BMXPRS^2153^134429 + ;;BMXRPC^5716^425699 + ;;BMXRPC1^7622^559198 + ;;BMXRPC2^3531^243875 + ;;BMXRPC3^6466^450166 + ;;BMXRPC4^4967^312485 + ;;BMXRPC5^3896^288926 + ;;BMXRPC6^3757^270667 + ;;BMXRPC7^5687^404431 + ;;BMXRPC8^2236^165523 + ;;BMXRPC9^6408^421855 + ;;BMXSQL^10869^727499 + ;;BMXSQL1^9921^616204 + ;;BMXSQL2^2748^183754 + ;;BMXSQL3^13516^868578 + ;;BMXSQL4^1313^88477 + ;;BMXSQL5^6648^433290 + ;;BMXSQL6^10606^683062 + ;;BMXSQL7^8102^528283 + ;;BMXSQL91^4328^281351 + ;;BMXTABLE^159^9961 + ;;BMXTRS^1300^81264 + ;;BMXUTL1^7818^520369 + ;;BMXUTL2^900^60457 + ;;BMXUTL5^5330^358866 + ;;BMXUTL6^942^62126 + ;;BMXUTL7^163^10646 diff --git a/m/BMXPO.m b/m/BMXPO.m new file mode 100644 index 0000000..0d77613 --- /dev/null +++ b/m/BMXPO.m @@ -0,0 +1,71 @@ +BMXPO ; IHS/CMI/MAW - Populate appcontext with all namespaced RPC's ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +MAIN ;EP - this is the main routine driver + N BMXQFLG + D ASK + I $G(BMXQFLG) D XIT Q + ;D CLEAN(BMXAPP) + D POP(BMXAPP,BMXNS) + D XIT + Q + ; +GUIEP(RETVAL,BMXSTR) ;EP - gui entry point + N P,BMXAPP,BMXNS + S P="|" + S BMXGUI=1 + S BMXAPP=$P(BMXSTR,P) + S BMXNS=$P(BMXSTR,P,2) + K ^BMXTMP($J) + S RETVAL="^BMXTMP("_$J_")" + S ^BMXTMP($J,0)="T00250DATA"_$C(30) + ;D CLEAN(BMXAPP) + D POP(BMXAPP,BMXNS) + D XIT + Q + ; +ASK ;-- ask the name of the OPTION to populate + W ! + S DIC=19,DIC(0)="AEMQZ",DIC("A")="Populate which Application Context: " + D ^DIC + I '$G(Y) S BMXQFLG=1 Q + S BMXAPP=+Y + W ! + K DIC + S DIR(0)="F^1:3",DIR("A")="Populate RPC's from which Namespace: " + D ^DIR + I $D(DIRUT) S BMXQFLG=1 Q + S BMXNS=$G(Y) + Q + ; +CLEAN(APP) ;-- clean out the RPC multiple first + S DA(1)=APP + S DIK="^DIC(19,"_DA(1)_","_"""RPC"""_"," + N BMXDA + S BMXDA=0 F S BDMDA=$O(^DIC(19,APP,"RPC",BMXDA)) Q:'BMXDA D + . S DA=BMXDA + . D ^DIK + K ^DIC(19,APP,"RPC","B") + Q + ; +POP(APP,NS) ;populate the app context with RPC's + I '$G(BMXGUI) W !,"Populating Application Context" + N BMXDA + S BMXDA=NS + F S BMXDA=$O(^XWB(8994,"B",BMXDA)) Q:BMXDA=""!($E(BMXDA,1,3)'=NS) D + . N BMXIEN + . S BMXIEN=0 F S BMXIEN=$O(^XWB(8994,"B",BMXDA,BMXIEN)) Q:'BMXIEN D + .. Q:$O(^DIC(19,APP,"RPC","B",BMXIEN,0)) + .. N BDMIENS,BDMFDA,BDMERR + .. S BDMIENS(1)=APP + .. S BDMIENS="+2,"_APP_"," + .. S BDMFDA(19.05,BDMIENS,.01)=BMXIEN + .. D UPDATE^DIE("","BDMFDA","BDMIENS","BDMERR(1)") + .. I '$G(BMXGUI) W "." + Q + ; +XIT ;-- clean vars + D EN^XBVK("BMX") + Q + ; diff --git a/m/BMXPRS.m b/m/BMXPRS.m new file mode 100644 index 0000000..dcd8096 --- /dev/null +++ b/m/BMXPRS.m @@ -0,0 +1,104 @@ +BMXPRS ; IHS/OIT/HMW - BMX WINDOWS UTILS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +PARSE(X) ;EP-Parse SQL Statement into array + ;Input SQL statement as X + ;Returns BMXTK() array + ;Errors returned in BMXERR + ; + D PRE + Q:$D(BMXERR) + D POST + Q + ; +POST2 ;EP - Remove commas from BMXTK + N J,K + S J=0 F S J=$O(BMXTK(J)) Q:'+J D + . S K=$O(BMXTK(J)) + . I +K,","=$G(BMXTK(K)) D + . . K BMXTK(K) + . . D PACK(J) + . . Q + . Q + Q + ; +POST ; + ;Combine multi-character operators + N J + S J=0 F S J=$O(BMXTK(J)) Q:'+J D + . I ">"=BMXTK(J) D Q + . . I "="[$G(BMXTK(J+1)) D Q + . . . S BMXTK(J)=BMXTK(J)_"=" + . . . K BMXTK(J+1) + . . . D PACK(J) + . . I "<"[$G(BMXTK(J+1)) D Q + . . . S BMXTK(J)="<"_BMXTK(J) + . . . K BMXTK(J+1) + . . . D PACK(J) + . I "<"=BMXTK(J) D Q + . . I "=>"[$G(BMXTK(J+1)) D + . . . S BMXTK(J)=BMXTK(J)_BMXTK(J+1) + . . . K BMXTK(J+1) + . . . D PACK(J) + . I "="=BMXTK(J) D Q + . . I "<>"[$G(BMXTK(J+1)) D + . . . S BMXTK(J)=BMXTK(J+1)_BMXTK(J) + . . . K BMXTK(J+1) + . . . D PACK(J) + Q + ; +PACK(J) ; + F S J=$O(BMXTK(J)) Q:'+J D + . S BMXTK(J-1)=BMXTK(J) + . K BMXTK(J) + Q + ; +PRE N P,T,Q,Q1,A,B S (P,T,Q)=0,BMXTK="",A=0 +START S A=A+1 + S B=$E(X,A) + I B="" G B5 + I 'Q G QUOTE + I B=$C(39) G QUOTE + S BMXTK=BMXTK_B G START +QUOTE I B'=$C(39) G SPACE + I Q G QUOTE2 + ;S Q=1,BMXTK=B G START + S Q=1,BMXTK=BMXTK_B G START +QUOTE2 S Q1=B,A=A+1,B=$E(X,A) + I B']"" G QUOTE3 + I B'=$C(39) G QUOTE3 + S BMXTK=BMXTK_Q1_B G START +QUOTE3 S A=A-1,B=Q1,BMXTK=BMXTK_B,Q=0 G START +SPACE I B'=" " G OP + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" + G START +OP I "=><"'[B G OPAREN + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" + S T=T+1,BMXTK(T)=B,BMXTK="" + G START +OPAREN I B'="(" G CPAREN + S P=P+1 + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" + S T=T+1,BMXTK(T)=B G START +CPAREN I B'=")" G B2 + I P G B1 + G B0 + ; +B0 S BMXERR="SQL SYNTAX ERROR" D ERROR G B5 +B1 S P=P-1 + I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK="" + S T=T+1,BMXTK(T)=B G START +B2 I B'="," G B3 + S T=T+1,BMXTK(T)=BMXTK,T=T+1,BMXTK(T)=",",BMXTK="" G START +B3 S BMXTK=BMXTK_B +B4 G START +B5 I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK + I $D(BMXERR) G B6 + I P S BMXERR="SQL SYNTAX ERROR: MATCHING PARENTHESIS NOT FOUND" D ERROR + E I Q S BMXERR="SQL SYNTAX ERROR: MATCHING QUOTE NOT FOUND" D ERROR + I P>0 G START +B6 Q + ; +ERROR ;W !,"ERROR=",BMXERR,! Q + Q diff --git a/m/BMXRPC.m b/m/BMXRPC.m new file mode 100644 index 0000000..c92634e --- /dev/null +++ b/m/BMXRPC.m @@ -0,0 +1,167 @@ +BMXRPC ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * + ;; GENERIC LOOKUP UTILITY FOR RETURNING MATCHING RECORDS + ;; OR TABLES TO RPC'S. + ; + ; *** NOTE: I have discovered a number of cases where these calls + ; produce errors (with error messages to IO) or simply + ; do not work correctly. ANY CALL to this utility + ; should be thoroughly tested in the M environment + ; before being used as an RPC. + ; + ;---------- +LOOKUP(BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC) ;EP + ;---> Places matching records from requested file into a + ;---> result global, ^BMXTEMP($J). The exact global name + ;---> is returned in the first parameter (BMXGBL). + ;---> Records are returned one per node in the result global. + ;---> Each record is terminated with a $C(30), for parsing out + ;---> on the VB side, since the Broker concatenates all nodes + ;---> into a single string when passing the data out of M. + ;---> Requested fields within records are delimited by "^". + ;---> NOTE: The first "^"-piece of every node is the IEN of + ;---> that entry in its file; the requested fields follow. + ;---> The final record (node) contains Error Delimiter, + ; $C(31)_$C(31), followed by error text, if any. + ; + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global for Broker. + ; 2 - BMXFL (req) File for lookup. + ; 3 - BMXFLDS (opt) Fields to return w/each entry. + ; 4 - BMXFLG (opt) Flags in DIC(0); If null, "M" is sent. + ; 5 - BMXIN (opt) Input to match on (see Algorithm below). + ; 6 - BMXMX (opt) Maximum number of entries to return. + ; 7 - BMXIX (opt) Indexes to search. + ; 8 - BMXSCR (opt) Screen/filter (M code). + ; 9 - BMXMC (opt) Mixed Case: 1=mixed case, 0=no change. + ; (Converts data in uppercase to mixed case.) + ; + ;---> Set variables, kill temp globals. + N (BMXGBL,BMXFL,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,BMXMC) + S BMX31=$C(31)_$C(31) + S BMXGBL="^BMXTEMP("_$J_")",BMXERR="",U="^" + K ^BMXTMP($J),^BMXTEMP($J) + ; + ;---> If file number not provided, return error. + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q + ; + ;---> If no fields provided, pass .01. + ;---> IEN will always be the first piece of data returned. + ;---> NOTE: If .01 is NOT included, but the Index to lookup on is + ;---> NOT on the .01, then the .01 will be returned + ;---> automatically as the second ^-piece of data in the + ;---> Result Global. + ;---> So it would be: IEN^.01^requested fields... + I $G(BMXFLDS)="" S BMXFLDS=".01" + ; + ;---> If no index or flag provided, set flag="M". + I $G(BMXFLG)="" D + .I $G(BMXIX)="" S BMXFLG="M" Q + .S BMXFLG="" + ; + ;---> If no Maximum Number provided, set it to 200. + I '$G(BMXMX) S BMXMX=200 + ; + ;---> Define index and screen. + S:'$D(BMXIX) BMXIX="" + S:'$D(BMXSCR) BMXSCR="" + ; + ;---> Set Target Global for output and errors. + S BMXG="^BMXTMP($J)" + ; + ;---> If Mixed Case not set, set to No Change. + I '$D(BMXMC) S BMXMC=0 + ; + ;---> Silent Fileman call. + D + .I $G(BMXIN)="" D Q + ..D LIST^DIC(BMXFL,,BMXFLDS,,BMXMX,0,,BMXIX,BMXSCR,,BMXG,BMXG) + .D FIND^DIC(BMXFL,,BMXFLDS,BMXFLG,BMXIN,BMXMX,BMXIX,BMXSCR,,BMXG,BMXG) + ; + D WRITE + Q + ; + ; + ;---------- +WRITE ;EP + ;---> Collect data for matching records and write in result global. + ; + ;---> First, check for errors. + ;---> If errors exist, write them and quit. + N I,N,X + I $D(^BMXTMP($J,"DIERR")) I $O(^("DIERR",0)) D Q + .S N=0,X="" + .F S N=$O(^BMXTMP($J,"DIERR",N)) Q:'N D + ..N M S M=0 + ..F S M=$O(^BMXTMP($J,"DIERR",N,"TEXT",M)) Q:'M D + ...S X=X_^BMXTMP($J,"DIERR",N,"TEXT",M)_" " + .D ERROUT(X,1) + ; + ; + ;---> Write Field Names + S $P(ASDX,"^",1)="IEN" + F ASDC=1:1:$L(BMXFLDS,";") D + . S ASDXFNUM=$P(BMXFLDS,";",ASDC) + . S ASDXFNAM=$P(^DD(BMXFL,ASDXFNUM,0),"^") + . S:ASDXFNAM="" ASDXFNAM="UNKNOWN"_ASDC + . S $P(ASDX,"^",ASDC+1)=ASDXFNAM + S ^BMXTEMP($J,1)=ASDX_$C(30) + ;---> Write valid results. + ;---> Loop through the IEN node (...2,N) of the temp global. + N I,N,X S N=0 + F I=2:1 S N=$O(^BMXTMP($J,"DILIST",2,N)) Q:'N D + .;---> Always set first piece of X=IEN of entry. + .S X=^BMXTMP($J,"DILIST",2,N) + .; + .;---> Collect other fields and concatenate to X. + .N M S M=0 + .F S M=$O(^BMXTMP($J,"DILIST","ID",N,M)) Q:'M D + ..S X=X_U_^BMXTMP($J,"DILIST","ID",N,M) + .; + .;---> Convert data to mixed case if BMXMC=1. + .S:BMXMC X=$$T^BMXTRS(X) + .; + .;---> Set data in result global. + .S ^BMXTEMP($J,I)=X_$C(30) + ; + ;---> If no results, report it as an error. + D:'$O(^BMXTEMP($J,0)) + .I BMXIN]"" S BMXERR="No entry matches """_BMXIN_"""." Q + .S BMXERR="Either the lookup file is empty" + .S BMXERR=BMXERR_" or all entries are screened (software error)." + ; + ;---> Tack on Error Delimiter and any error. + S ^BMXTEMP($J,I)=BMX31_BMXERR + Q + ; + ; + ;---------- +ERROUT(BMXERR,I) ;EP + ;---> Save next line for Error Code File if ever used. + ;---> If necessary, use I>1 to avoid overwriting valid data. + S:'$G(I) I=1 + S ^BMXTEMP($J,I)=BMX31_BMXERR + Q + ; + ; +PASSERR(BMXGBL,BMXERR) ;EP + ;---> If the RPC routine calling the BMX Generic Lookup above + ;---> detects a specific error prior to the call and wants to pass + ;---> that error in the result global rather than a generic error, + ;---> then a call to this function (PASSERR) can be made. + ;---> This call will store the error text passed in the result global. + ;---> The calling routine should then quit (abort its call to the + ;---> BMX Generic Lookup function above). + ; + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global for Broker. + ; 2 - BMXERR (req) Text of error to be stored in result global. + ; + S:$G(BMXERR)="" BMXERR="Error not passed (software error)." + ; + N BMX31 S BMX31=$C(31)_$C(31) + K ^BMXTMP($J),^BMXTEMP($J) + S BMXGBL="^BMXTEMP("_$J_")" + S ^BMXTEMP($J,1)=BMX31_BMXERR + Q diff --git a/m/BMXRPC1.m b/m/BMXRPC1.m new file mode 100644 index 0000000..1256188 --- /dev/null +++ b/m/BMXRPC1.m @@ -0,0 +1,238 @@ +BMXRPC1 ; IHS/OIT/HMW - UTIL: REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ;;* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * + ;; UTILITY: CODE FOR REMOTE PROCEDURE CALLS. + ;; RETURNS PATIENT DATA, HEALTH SUMMARY, FACE SHEET. + ; + ; + ;---------- +PDATA(BMXDATA,BMXDFN) ;EP + ;---> Return Patient Data in 5 ^-delimited pieces: + ;---> 1 - DOB in format: OCT 01,1994. + ;---> 2 - Age in format: 35 Months. + ;---> 3 - Text of Patient's sex. + ;---> 4 - HRCN in the format XX-XX-XX. + ;---> 5 - Text of ACTIVE/INACTIVE Status. + ;---> Parameters: + ; 1 - BMXDATA (ret) String of patient data||error. + ; 2 - BMXDFN (req) DFN of patient. + ; + ;---> Delimiter to pass error with result to GUI. + N BMX31,BMXERR S BMX31=$C(31)_$C(31) + S BMXDATA="",BMXERR="" + ; + ;---> If DFN not supplied, set Error Code and quit. + I '$G(BMXDFN) D Q + .;D ERRCD^BMXUTL2(201,.BMXERR) S BMXDATA=BMX31_BMXERR + ; + ;---> DOB. + S BMXDATA=$$TXDT1^BMXUTL5($$DOB^BMXUTL1(BMXDFN)) + ; + ;---> Age. + S BMXDATA=BMXDATA_U_$$AGEF^BMXUTL1(BMXDFN) + ; + ;---> Text of sex. + S BMXDATA=BMXDATA_U_$$SEXW^BMXUTL1(BMXDFN) + ; + ;---> HRCN, format XX-XX-XX. + S BMXDATA=BMXDATA_U_$$HRCN^BMXUTL1(BMXDFN) + ; + ;---> Active/Inactive Status. + ;S BMXDATA=BMXDATA_U_$$ACTIVE^BMXUTL1(BMXDFN) + ; + S BMXDATA=BMXDATA_BMX31 + ; + Q + ; + ; + ;---------- +HS(BMXGBL,BMXDFN) ;EP + ;---> Return patient's Health Summary in global array, ^BMXTEMP($J,"HS". + ;---> Lines delimited by "^". + ;---> Called by RPC: BMX IMMSERVE PT PROFILE + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global containing patient's + ; Health Summary, passed to Broker. + ; 2 - BMXDFN (req) DFN of patient. + ; + ;---> Delimiter to pass error with result to GUI. + N BMX30,BMX31,BMXERR,X + S BMX30=$C(30),BMX31=$C(31)_$C(31) + S BMXGBL="^BMXTEMP("_$J_",""HS"")",BMXERR="" + K ^BMXTEMP($J,"HS") + ; + ;---> If DFN not supplied, set Error Code and quit. + I '$G(BMXDFN) D Q + .;D ERRCD^BMXUTL2(201,.BMXERR) S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + ;---> If patient does not exist, set Error Code and quit. + I '$D(^AUPNPAT(BMXDFN,0)) D Q + .;D ERRCD^BMXUTL2(203,.BMXERR) S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + N APCHSPAT,APCHSTYP + S APCHSPAT=BMXDFN,APCHSTYP=7 + ;---> Doesn't work from Device 56. + ;D GUIR^XBLM("EN^APCHS","^TMP(""BMXHS"",$J,") + ; + ;---> Generate a host file name. + N BMXFN S BMXFN="XB"_$J + ; + D + .;---> Important to preserve IO variables for when $I returns to 56. + .N IO,IOBS,IOF,IOHG,IOM,ION,IOPAR,IOS,IOSL,IOST,IOT,IOUPAR,IOXY + .; + .;---> Open host file to receive legacy code display. + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"W") + .; + .;---> Call to legacy code for Health Summary display. + .D EN^APCHS + .;---> Write End of File (EOF) marker. + .W $C(9) + .; + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? + .;D ^%ZISC + .;---> Buffer won't write out to file until the device is closed + .;---> or the buffer is flushed by some other command. + .;---> At this point, host file exists but has 0 bytes. + .;C 51 + .;---> Now host file contains legacy code display data. + .; + .;---> For some reason %ZISH cannot open the host file a second time. + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"R") + .;O 51:($$HFSPATH^BMXUTL1_BMXFN:"R") + .;U 51 + .; + .;---> Read in the host file. + .D + ..;---> Stop reading Host File if line contains EOF $C(9). + ..;N I,Y F I=1:1 R Y Q:Y[$C(9) S ^TMP("BMXHS",$J,I)=Y + .; + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? + .;D ^%ZISC + .;C 51 + ; + ;---> At this point $I=1. The job has "forgotten" its $I, even + ;---> though %SS shows 56 as the current device. $I=1 causes a + ;---> at CAPI+10^XWBBRK2. A simple USE 56 command + ;---> appears to "remind" the job its $I is 56, and it works. + ;---> Possibly this is something %ZISC ordinarily does. + ;U 56 + ; + ;---> Copy Health Summary to global array for passing back to GUI. + N I,N,U,X S U="^" + S N=0 + F I=1:1 S N=$O(^TMP("BMXHS",$J,N)) Q:'N D + .;---> Set null lines (line breaks) equal to one space, so that + .;---> Windows reader will quit only at the final "null" line. + .S X=^TMP("BMXHS",$J,N) S:X="" X=" " + .S ^BMXTEMP($J,"HS",I)=X_BMX30 + ; + ;---> If no Health Summary produced, report it as an error. + D:'$O(^BMXTEMP($J,"HS",0)) + .;D ERRCD^BMXUTL2(407,.BMXERR) S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + ;---> Tack on Error Delimiter and any error. + S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + ;---> This works; host file gets deleted. + ;S Y=$$DEL^%ZISH($$HFSPATH^BMXUTL1,BMXFN) + K ^TMP("BMXHS",$J) + Q + ; + ; + ;---------- +FACE(BMXGBL,BMXDFN) ;EP + ;---> Return patient's Face Sheet in global array, ^BMXTEMP($J,"FACE". + ;---> Lines delimited by "^". + ;---> Called by RPC: BMX IMMSERVE PT PROFILE + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global containing patient's + ; Face Sheet, passed to Broker. + ; 2 - BMXDFN (req) DFN of patient. + ; + ;---> Delimiter to pass error with result to GUI. + N BMX30,BMX31,BMXERR,X + S BMX30=$C(30),BMX31=$C(31)_$C(31) + S BMXGBL="^BMXTEMP("_$J_",""FACE"")",BMXERR="" + K ^BMXTEMP($J,"FACE") + ; + ;---> If DFN not supplied, set Error Code and quit. + I '$G(BMXDFN) D Q + .;D ERRCD^BMXUTL2(201,.BMXERR) S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR + ; + ;---> If patient does not exist, set Error Code and quit. + I '$D(^AUPNPAT(BMXDFN,0)) D Q + .;D ERRCD^BMXUTL2(203,.BMXERR) S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR + ; + N DFN S DFN=BMXDFN + ;---> Doesn't work from Device 56. + ;---> Generate a host file name. + N BMXFN S BMXFN="XB"_$J + ; + D + .;---> Important to preserve IO variables for when $I returns to 56. + .N IO,IOBS,IOF,IOHG,IOM,ION,IOPAR,IOS,IOSL,IOST,IOT,IOUPAR,IOXY + .; + .;---> Open host file to receive legacy code display. + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"W") + .; + .;---> Call to legacy code for Face Sheet display. + .U 51 + .;D ^BMXFACE + .;---> Write End of File (EOF) marker. + .W $C(9) + .; + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? + .;D ^%ZISC + .;---> Buffer won't write out to file until the device is closed + .;---> or the buffer is flushed by some other command. + .;---> At this point, host file exists but has 0 bytes. + .;C 51 + .;---> Now host file contains legacy code display data. + .; + .;---> For some reason %ZISH cannot open the host file a second time. + .;S Y=$$OPEN^%ZISH($$HFSPATH^BMXUTL1,BMXFN,"R") + .;O 51:($$HFSPATH^BMXUTL1_BMXFN:"R") + .U 51 + .; + .;---> Read in the host file. + .D + ..;---> Need some way to mark the end of legacy code output. + ..;---> Stop reading Host File if line contains EOF $C(9). + ..;---> (I added $C(9) above, after ^BMXFACE completed.) + ..;N I,Y F I=1:1 R Y Q:Y[$C(9) S ^TMP("BMXFACE",$J,I)=Y + .; + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? + .;D ^%ZISC + .;C 51 + ; + ;---> At this point $I=1. The job has "forgotten" its $I, even + ;---> though %SS shows 56 as the current device. $I=1 causes a + ;---> at CAPI+10^XWBBRK2. A simple USE 56 command + ;---> appears to "remind" the job its $I is 56, and it works. + ;---> Possibly this is something %ZISC ordinarily does. + U 56 + ; + ;---> Copy Face Sheet to global array for passing back to GUI. + N I,N,U,X S U="^" + S N=0 + F I=1:1 S N=$O(^TMP("BMXFACE",$J,N)) Q:'N D + .;---> Set null lines (line breaks) equal to one space, so that + .;---> Windows reader will quit only at the final "null" line. + .S X=^TMP("BMXFACE",$J,N) S:X="" X=" " + .;---> Remove Carriage Return (13)_Formfeed (12) characters. + .I X[$C(13)_$C(12) S X=$P(X,$C(13)_$C(12),2) + .; + .S ^BMXTEMP($J,"FACE",I)=X_BMX30 + ; + ;---> If no Health Summary produced, report it as an error. + D:'$O(^BMXTEMP($J,"FACE",0)) + .;D ERRCD^BMXUTL2(408,.BMXERR) S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR + ; + ;---> Tack on Error Delimiter and any error. + S ^BMXTEMP($J,"FACE",I)=BMX31_BMXERR + ; + ;---> This works; host file gets deleted. + ;S Y=$$DEL^%ZISH($$HFSPATH^BMXUTL1,BMXFN) + K ^TMP("BMXFACE",$J) + Q diff --git a/m/BMXRPC2.m b/m/BMXRPC2.m new file mode 100644 index 0000000..ae2ed2d --- /dev/null +++ b/m/BMXRPC2.m @@ -0,0 +1,112 @@ +BMXRPC2 ; IHS/OIT/HMW - FIELD LIST ; + ;;2.1;BMX;;Jul 26, 2009 + ; +FLDLIST(BMXGBL,BMXFL,BMXATTR,BMXSCR) ;EP + ;TODO: Change all this to be a hard-coded $O thru ^DD + ;Returns info in BMXATTR for all fields in file number BMXFL + ;BMXSCR is executable code to set $T + ; When BMXSCR is executed, the field number is in BMXFLD + ;See FileMan documentation for FIELD^DD for description + ;of Attributes + ; + ;---> Set variables, kill temp globals. + ;S ^HW("F",BMXFL)="" + ;S ^HW("F",BMXATTR)="" + N BMX31,BMXERR,BMXG,BMXFLD,BMX,BMXC,BMXT + S BMX31=$C(31)_$C(31) + S BMXGBL="BMXTMP("_$J_")",BMXERR="",U="^" + K BMXTMP($J) + ; + ;---> If file number not provided, return error. + ;I '+BMXFL D ERROUT^BMXRPC("File number not provided.",1) Q + ;---> If file number not provided check for file name. + I +BMXFL'=BMXFL D + . S BMXFL=$TR(BMXFL,"_"," ") + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q + . S BMXFL=$O(^DIC("B",BMXFL,0)) + I '$G(BMXFL) D ERROUT^BMXRPC("File number not provided.",1) Q + ; + ;---> If no such file, return error. + I '$D(^DD(BMXFL,0)) D ERROUT^BMXRPC("File does not exist.",1) Q + ; + ;---> Validate screen code + I $G(BMXSCR)="" S BMXSCR="I 1" + S X=$G(BMXSCR) + I X]"" D ^DIM + I '$D(X) S BMXSCR="I 1" ;Default to no screen + ; + ;---> Set Target Global for output and errors. + S BMXG="BMXTMP($J,""DID"")" + ; + ;---> Loop through ^DD(FileNumber,FieldNumber,0) to get field names + K BMXTMP($J) + I $G(BMXATTR)="" S BMXATTR="LABEL" ;Changed from NAME to LABEL + ;---> Attribute Names + F I=1:1:$L(BMXATTR,";") S BMXT($P(BMXATTR,";",I))="" + S (BMX,BMXC)=0 F S BMX=$O(BMXT(BMX)) Q:BMX="" D + . S BMXC=BMXC+1 + . S $P(BMXT,U,BMXC)="T00030"_BMX + S BMXTMP($J,1)="T00030NUMBER"_U_BMXT_$C(30) + ; + ;S BMXFLD=0 F I=2:1 S BMXFLD=$O(^DD(BMXFL,BMXFLD)) Q:'+BMXFLD D + S BMXTMP($J,2)=".001^BMXIEN"_$C(30) + S BMXFLDN=0 F I=3:1 S BMXFLDN=$O(^DD(BMXFL,"B",BMXFLDN)) Q:BMXFLDN="" D + . S BMXFLD=$O(^DD(BMXFL,"B",BMXFLDN,0)) Q:'+BMXFLD + . X BMXSCR Q:'$T + . D FIELD^DID(BMXFL,BMXFLD,,BMXATTR,BMXG,BMXG) + . K BMXT S (BMXC,BMX)=0 + . F S BMX=$O(BMXTMP($J,"DID",BMX)) Q:BMX="" D + . . S BMXC=BMXC+1 + . . S $P(BMXT,U,BMXC)=BMXTMP($J,"DID",BMX) + . S BMXTMP($J,I)=BMXFLD_U_$TR(BMXT," ","_")_$C(30) + ;S I=I+1,BMXTMP($J,I)=".001^BMXIEN"_$C(30) + S I=I+1 + K BMXTMP($J,"DID") + ;---> Tack on Error Delimiter and any error. + S BMXTMP($J,I)=BMX31_BMXERR + Q + ; +MLTLIST(BMXGBL,BMXFL,BMXONEOK) ;EP + ;Returns list of multiple fields in file BMXFL, returns only one field + ;if BMXONEOK is TRUE + ;S ^HW($H,"MLTLIST","FL")=BMXFL + ;S ^HW($H,"MLTLIST","ONE")=BMXONEOK + N BMX31,BMXERR,BMXG,BMXFLD,BMX,BMXC,BMXT,I + S BMX31=$C(31)_$C(31) + S BMXGBL="BMXTMP("_$J_")",BMXERR="",U="^" + K BMXTMP($J) + ; + ;---> If file number not provided check for file name. + I +BMXFL'=BMXFL D + . S BMXFL=$TR(BMXFL,"_"," ") + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q + . S BMXFL=$O(^DIC("B",BMXFL,0)) + I '$G(BMXFL) D ERROUT^BMXRPC("File number not provided.",1) Q + ; + ;---> If no such file, return error. + I '$D(^DD(BMXFL,0)) D ERROUT^BMXRPC("File does not exist.",1) Q + ; + ;---> Column Headers + S BMXTMP($J,1)="T00030NUMBER"_U_"T00030NAME"_$C(30) + ; + ;---> $O thru ^DD(BMXFL,"SB" to get subfile numbers and names + S I=2 + N BMXSB,BMXSBN,BMXSBF,BMXFOUND + S BMXFOUND=0 + I $D(^DD(BMXFL,"SB")) D + . S BMXSB=0 + . F S BMXSB=$O(^DD(BMXFL,"SB",BMXSB)) Q:'+BMXSB D I BMXFOUND Q:BMXONEOK=1 + . . S BMXSBF=$O(^DD(BMXFL,"SB",BMXSB,0)) + . . Q:'+BMXSBF + . . S BMXSBN=$G(^DD(BMXFL,BMXSBF,0)) + . . Q:BMXSBN="" + . . S BMXZ=$G(^DD(BMXSB,.01,0)) + . . Q:$P(BMXZ,U,2)["W" + . . S BMXFOUND=1 + . . S BMXSBN=$P(BMXSBN,U) + . . S BMXTMP($J,I)=BMXSB_U_BMXSBN_$C(30) + . . S I=I+1 + ; + ;---> Tack on Error Delimiter and any error. + S BMXTMP($J,I)=BMX31_BMXERR + Q diff --git a/m/BMXRPC3.m b/m/BMXRPC3.m new file mode 100644 index 0000000..a51985a --- /dev/null +++ b/m/BMXRPC3.m @@ -0,0 +1,240 @@ +BMXRPC3 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ;Mods by WV/SMH + ;7/26/09 Removed references to ^AUTTSITE, an IHS file in GETFAC* + ; + ; +VARVAL(RESULT,VARIABLE) ;returns value of passed in variable + S VARIABLE=$TR(VARIABLE,"~","^") + S RESULT=VARIABLE ;can do this with the REFERENCE type parameter + Q + ;See GETV^XWBBRK for how we get the REFERENCE type parameter + ; +USER(RESULT,D) ; + ; + I '+D S RESULT="" Q + S RESULT=$P($G(^VA(200,D,0)),"^") + Q + ; +NTUSER(BMXY,BMXNTUSER) ;EP + ;Old code. Retain for reference + ;Returns NTDomain^NTUserName^RPMSName for user having DUZ=D + ;TODO: Move ANMC NT USERS file + ;from AZZWNT to BMX namespace and numberspace + ; + ;N BMX,BMXNOD,BMXDOM,BMXNAM,BMXCOL,BMXRNAM + ;S (BMXDOM,BMXNAM,BMXRNAM)="" + ;S U="^" + ;I '+D S RESULT="" Q + ;S BMXRNAM=$G(^VA(200,D,0)),BMXRNAM=$P(BMXRNAM,U) + ;I '$D(^AZZWNT("DUZ",D)) D NTU1 Q + ;S BMX=$O(^AZZWNT("DUZ",D,0)) + ;I '+BMX D NTU1 Q + ;I '$D(^AZZWNT(BMX,0)) D NTU1 Q + ;S BMXNOD=^AZZWNT(BMX,0) + ;S BMXDOM=$P(BMXNOD,U,2) + ;S BMXNAM=$P(BMXNOD,U) ;,4) + ;D NTU1 + Q + ; + ; +NTUGETD(BMXY,BMXNTNAME) ;EP + ;Entry point for debugging + ; + D DEBUG^%Serenji("NTUGET^BMXRPC3(.BMXY,BMXNTNAME)") + Q + ; +NTUGET(BMXY,BMXNTNAME) ;EP + ; + ;Returns A ENCRYPTED and V ENCRYPTED for NT User BMXNTNAME + ;Called by RPC BMXNetGetCodes + N BMXI,BMXNTID,BMXNTID,BMXNOD,BMXA,BMXV + S BMXI=0 + S BMXY="^BMXTMP("_$J_")" + S X="NTUET^BMXRPC3",@^%ZOSF("TRAP") + S BMXI=BMXI+1 + I BMXNTNAME="" S ^BMXTMP($J,BMXI)="^" Q + S BMXNTID=$O(^BMXUSER("B",BMXNTNAME,0)) + I '+BMXNTID S ^BMXTMP($J,BMXI)="^" Q + S BMXNOD=$G(^BMXUSER(BMXNTID,0)) + S BMXA=$P(BMXNOD,U,2) + S BMXV=$P(BMXNOD,U,3) + S ^BMXTMP($J,BMXI)=BMXA_"^"_BMXV_"^" + Q + ; +WINUGET(BMXWINID) ;EP + ;Returns DUZ for user having Windows Identity BMXWINID + ;Returns 0 if no Windows user found + ; + N BMXIEN,BMXNOD,BMXDUZ + I BMXWINID="" Q 0 + S BMXIEN=$O(^BMXUSER("B",BMXWINID,0)) + I '+BMXIEN Q 0 + S BMXNOD=$G(^BMXUSER(BMXIEN,0)) + S BMXDUZ=$P(BMXNOD,U,2) + Q BMXDUZ + ; +NTUSETD(BMXY,BMXNTNAME) ;EP + ;Entry point for debugging + ; + D DEBUG^%Serenji("NTUSET^BMXRPC3(.BMXY,BMXNTNAME)") + Q + ; +NTUSET(BMXY,BMXNTNAME) ;EP + ;Sets NEW PERSON map entry for Windows Identity BMXNTNAME + ;Returns ERRORID 0 if all ok + ;Called by RPC BMXNetSetUser + ; + ; + N BMXI,BMXNTID,BMXFDA,BMXF,BMXIEN,BMXMSG,BMXAPPTID + S BMXI=0 + S BMXY="^BMXTMP("_$J_")" + S X="NTUET^BMXRPC3",@^%ZOSF("TRAP") + S BMXI=BMXI+1 + ; Quit with error if no DUZ exists + I '+$G(DUZ) D NTUERR(BMXI,500) Q + ; Create entry or file in existing entry in BMX USER + I $D(^BMXUSER("B",BMXNTNAME)) S BMXF="?1," + E S BMXF="+1," + S BMXFDA(90093.1,BMXF,.01)=BMXNTNAME + S BMXFDA(90093.1,BMXF,.02)=$G(DUZ) + K BMXIEN,BMXMSG + D UPDATE^DIE("","BMXFDA","BMXIEN","BMXMSG") + S BMXAPPTID=+$G(BMXIEN(1)) + S BMXI=BMXI+1 + S ^BMXTMP($J,BMXI)=BMXAPPTID_"^0" + Q + ; +NTUET ;EP + ;Error trap from REGEVNT + ; + I '$D(BMXI) N BMXI S BMXI=999 + S BMXI=BMXI+1 + D NTUERR(BMXI,99) + Q + ; +NTUERR(BMXI,BMXERID) ;Error processing + S BMXI=BMXI+1 + S ^BMXTMP($J,BMXI)="^"_BMXERID + Q + ; + ; +NTU1 ;S BMXCOL="T00030NT_DOMAIN^T00030NT_USERNAME^T00030RPMS_USERNAME"_$C(30) + ;S RESULT=BMXCOL_BMXDOM_U_BMXNAM_U_BMXRNAM_$C(30)_$C(31) + Q + ; +GETFC(BMXFACS,DUZ) ;Gets all facilities for a user + ; Input DUZ - user IEN from the NEW PERSON FILE + ; Output - Number of facilities;facility1 name&facility1 IEN;...facilityN&facilityN IEN + N BMXFN,BMXN + S BMXFN=0,BMXFACS="" + F BMXN=1:1 S BMXFN=$O(^VA(200,DUZ,2,BMXFN)) Q:BMXFN="" D + . S:BMXN>1 BMXFACS=BMXFACS_";" S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"&"_BMXFN + ;//smh I BMXN=1 S BMXFN=$P(^AUTTSITE(1,0),U,1) D + ;//smh . S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"&"_BMXFN + S BMXFACS=BMXN-(BMXN>1)_";"_BMXFACS + Q + ; +GETFCRS(BMXFACS,BMXDUZ) ;Gets all facilities for a user - returns RECORDSET + ; + ;TODO: return as global array, add error checking + N BMXFN,BMXN,BMXSUB,BMXRCNT + S BMXDUZ=$TR(BMXDUZ,$C(13),"") + S BMXDUZ=$TR(BMXDUZ,$C(10),"") + S BMXDUZ=$TR(BMXDUZ,$C(9),"") + S BMXFN=0 + S BMXSUB="^VA(200,"_BMXDUZ_",2," + S BMXFACS="T00030FACILITY_NAME^T00030FACILITY_IEN^T00002MOST_RECENT_LOOKUP"_$C(30) + ;F BMXN=1:1 S BMXFN=$O(^VA(200,BMXDUZ,2,BMXFN)) Q:BMXFN="" D + S BMXRCNT=0 ;cmi/maw mod 10/17/2006 + F BMXN=1:1 S BMXFN=$O(^VA(200,BMXDUZ,2,BMXFN)) Q:'BMXFN D ;IHS/ANMC/LJF 8/9/01 + . ;S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"^"_BMXFN_$C(30) + . S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"^"_BMXFN + . ;S BMXRCNT=0 ;cmi/maw orig + . ;I $D(^DISV(BMXDUZ,BMXSUB)),^DISV(BMXDUZ,BMXSUB)=BMXFN S BMXRCNT=1 + . ;I $G(DUZ(2))=BMXFN S BMXRCNT=1 ;cmi/maw orig + . S BMXRCNT=BMXRCNT+1 ;cmi/maw mod + . S BMXFACS=BMXFACS_"^"_BMXRCNT_$C(30) + ;//smh I BMXN=1 S BMXFN=$P(^AUTTSITE(1,0),U,1) D + ;//smh . S BMXFACS=BMXFACS_$P(^DIC(4,BMXFN,0),U,1)_"^"_BMXFN_"^"_1_$C(30) + S BMXFACS=BMXFACS_$C(31) + Q + ; +SETFCRS(BMXY,BMXFAC) ; + ; + ;Sets DUZ(2) to value in BMXFAC + ;Fails if BMXFAC is not one of the current user's divisions + ;Returns Recordset + ; + S X="ERFC^BMXRPC3",@^%ZOSF("TRAP") + S BMXY="T00030DUZ^T00030FACILITY_IEN^T00030FACILITY_NAME"_$C(30) + N BMXSUB,BMXFACN + I '+DUZ S BMXY=BMXY_0_"^"_0_"^"_0_$C(30)_$C(31) Q + I '+BMXFAC S BMXY=BMXY_DUZ_"^"_0_"^"_0_$C(30)_$C(31) Q + I '$D(^VA(200,DUZ,2,+BMXFAC)) S BMXY=BMXY_DUZ_"^"_0_"^"_0_$C(30)_$C(31) Q + S DUZ(2)=BMXFAC ;IHS/OIT/HMW SAC Exemption Applied For + S BMXFACN=$G(^DIC(4,+DUZ(2),0)) + S BMXFACN=$P(BMXFACN,"^") + S BMXSUB="^VA(200,"_DUZ_",2," + S ^DISV(DUZ,BMXSUB)=BMXFAC + S BMXY=BMXY_DUZ_"^"_BMXFAC_"^"_BMXFACN_$C(30)_$C(31) + Q + ; +ERFC ; + D ^%ZTER + S BMXY=$G(BMXY)_0_"^"_0_$C(30)_$C(31) Q + Q + ; +SETFC(BMXY,BMXFAC) ; + ;Sets DUZ(2) to value in BMXFAC + ;Fails if BMXFAC is not one of the current user's divisions + ;Returns 1 if successful, 0 if failed + ; + S BMXY=0 + N BMXSUB + I '+DUZ S BMXY=0 Q + I '+BMXFAC S BMXY=0 Q + I '$D(^VA(200,DUZ,2,+BMXFAC)) S BMXY=0 Q + S DUZ(2)=BMXFAC ;IHS/OIT/HMW SAC Exemption Applied For + S BMXSUB="^VA(200,"_DUZ_",2," + S ^DISV(DUZ,BMXSUB)=BMXFAC + S BMXY=1 + Q + ; +APSEC(BMXY,BMXKEY) ;EP + ;Return IHSCD_SUCCEEDED (-1) if user has key BMXKEY + ;OR if user has key XUPROGMODE + ;Otherwise, returns IHSCD_FAILED (0) + N BMXIEN,BMXPROG,BMXPKEY + I '$G(DUZ) S BMXY=0 Q + I BMXKEY="" S BMXY=0 Q + ; + ;Test for programmer mode key + S BMXPROG=0 + I $D(^DIC(19.1,"B","XUPROGMODE")) D + . S BMXPKEY=$O(^DIC(19.1,"B","XUPROGMODE",0)) + . I '+BMXPKEY Q + . I '$D(^VA(200,DUZ,51,BMXPKEY,0)) Q + . S BMXPROG=1 + I BMXPROG S BMXY=-1 Q + ; + I '$D(^DIC(19.1,"B",BMXKEY)) S BMXY=0 Q + S BMXIEN=$O(^DIC(19.1,"B",BMXKEY,0)) + I '+BMXIEN S BMXY=0 Q + I '$D(^VA(200,DUZ,51,BMXIEN,0)) S BMXY=0 Q + S BMXY=-1 + Q + ; +SIGCHK(BMXY,BMXSIG) ;EP + ;Checks BMXSIG against hashed value in NEW PERSON + ;Return IHSCD_SUCCEEDED (-1) if BMXSIG matches + ;Otherwise, returns IHSCD_FAILED (0) + N X + S BMXY=0 + I '$G(DUZ) Q + I '$D(^VA(200,DUZ,20)) Q ;TODO What if no signature? + S BMXHSH=$P(^VA(200,DUZ,20),U,4) + S X=$G(BMXSIG) + D HASH^XUSHSHP + I X=BMXHSH S BMXY=-1 + Q diff --git a/m/BMXRPC4.m b/m/BMXRPC4.m new file mode 100644 index 0000000..9078262 --- /dev/null +++ b/m/BMXRPC4.m @@ -0,0 +1,148 @@ +BMXRPC4 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; +PTINFORS(BMXY,BMXIEN) ;EP Patient Info Recordset + ; + N BMXDPT,BMXZ,BMXDLIM,BMXXX,BMXRET,BMXAGE,BMXNEXT,BMXSEX,BMXERR,BMXHRN + S BMXDLIM="^",BMXERR="" + S BMXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN^T00020AGE^T00080NEXT_APPT^T00010SEX"_$C(30) + I '$D(DUZ(2)) S BMXY=BMXRET_$C(31)_"No DUZ2" Q + I +$G(DUZ) D + . S ^DISV(DUZ,"^AUPNPAT(")=BMXIEN + . S ^DISV(DUZ,"^DPT(")=BMXIEN + I '$D(^DPT(BMXIEN)) S BMXY=BMXRET_$C(31)_"No such patient" Q + S BMXDPT=$G(^DPT(BMXIEN,0)) + S BMXZ=$P(BMXDPT,U) ;NAME + ;S $P(BMXZ,BMXDLIM,2)=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART + S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART + ;I BMXHRN="" Q ;NO CHART AT THIS DUZ2 + I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" + S $P(BMXZ,BMXDLIM,2)=BMXHRN + ; + S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN + S Y=$P(BMXDPT,U,3) X ^DD("DD") + S $P(BMXZ,BMXDLIM,4)=Y ;DOB + S $P(BMXZ,BMXDLIM,5)=BMXIEN + S BMXAGE=$$AGEF^BMXUTL1(BMXIEN) + S $P(BMXZ,BMXDLIM,6)=BMXAGE + S BMXNEXT=$$NEXTAPPT^BMXUTL2(BMXIEN) + S $P(BMXZ,BMXDLIM,7)=BMXNEXT + S BMXSEX=$$SEXW^BMXUTL1(BMXIEN) + S $P(BMXZ,BMXDLIM,8)=BMXSEX + S BMXRET=BMXRET_BMXZ + S BMXY=BMXRET_$C(30)_$C(31)_BMXERR + Q + ; +PTLOOKRS(BMXY,BMXP,BMXC) ;EP Patient Lookup + ; + ;Find up to BMXC patients matching BMXP* + ;Supports DOB Lookup, SSN Lookup + ; + ;S ^HW("PTLOOK","INPUT")=BMXP + ;S ^HW("PTLOOK","DUZ2")=$G(DUZ(2)) + S BMXP=$TR(BMXP,$C(13),"") + S BMXP=$TR(BMXP,$C(10),"") + S BMXP=$TR(BMXP,$C(9),"") + S:BMXC="" BMXC=10 + N BMXHRN,BMXZ,BMXDLIM,BMXRET + S BMXDLIM="^" + S BMXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN"_$C(30) + I '+$G(DUZ) S BMXY=BMXRET_$C(31) Q + I '$D(DUZ(2)) S BMXY=BMXRET_$C(31) Q +DOB ;DOB Lookup + I +DUZ(2),((BMXP?1.2N1"/"1.2N1"/"1.4N)!(BMXP?1.2N1" "1.2N1" "1.4N)!(BMXP?1.2N1"-"1.2N1"-"1.4N)) D S BMXY=BMXRET_$C(31) Q + . S X=BMXP S %DT="P" D ^%DT S BMXP=Y Q:'+Y + . Q:'$D(^DPT("ADOB",BMXP)) + . S BMXIEN=0,BMXXX=1 F S BMXIEN=$O(^DPT("ADOB",BMXP,BMXIEN)) Q:'+BMXIEN D + . . Q:'$D(^DPT(BMXIEN,0)) + . . S BMXDPT=$G(^DPT(BMXIEN,0)) + . . S BMXZ=$P(BMXDPT,U) ;NAME + . . ;S $P(BMXZ,BMXDLIM,2)=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART + . . S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART + . . I BMXHRN="" Q ;NO CHART AT THIS DUZ2 + . . I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" + . . S $P(BMXZ,BMXDLIM,2)=BMXHRN + . . ; + . . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN + . . S Y=$P(BMXDPT,U,3) X ^DD("DD") + . . S $P(BMXZ,BMXDLIM,4)=Y ;DOB + . . S $P(BMXZ,BMXDLIM,5)=BMXIEN + . . S BMXXX=BMXXX+1 + . . ;S $P(BMXRET,$C(30),BMXXX)=BMXZ + . . S BMXRET=BMXRET_BMXZ_$C(30) + . . Q + . Q + ; + ;Chart# Lookup + I +DUZ(2),BMXP]"",$D(^AUPNPAT("D",BMXP)) D S BMXY=BMXRET_$C(30)_$C(31) Q + . S BMXIEN=0 F S BMXIEN=$O(^AUPNPAT("D",BMXP,BMXIEN)) Q:'+BMXIEN I $D(^AUPNPAT("D",BMXP,BMXIEN,DUZ(2))) D Q + . . Q:'$D(^DPT(BMXIEN,0)) + . . S BMXDPT=$G(^DPT(BMXIEN,0)) + . . S BMXZ=$P(BMXDPT,U) ;NAME + . . ;S $P(BMXZ,BMXDLIM,2)=BMXP ;CHART + . . S BMXHRN=BMXP ;CHART + . . I $D(^AUPNPAT(BMXIEN,41,DUZ(2),0)),$P(^(0),U,3) S BMXHRN=BMXHRN_"(*)" + . . S $P(BMXZ,BMXDLIM,2)=BMXHRN + . . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN + . . S Y=$P(BMXDPT,U,3) X ^DD("DD") + . . S $P(BMXZ,BMXDLIM,4)=Y ;DOB + . . S $P(BMXZ,BMXDLIM,5)=BMXIEN + . . S $P(BMXRET,$C(30),2)=BMXZ + . . Q + . Q + ; + ;SSN Lookup + I (BMXP?9N)!(BMXP?3N1"-"2N1"-"4N),$D(^DPT("SSN",BMXP)) D S BMXY=BMXRET_$C(30)_$C(31) Q + . S BMXIEN=0 F S BMXIEN=$O(^DPT("SSN",BMXP,BMXIEN)) Q:'+BMXIEN D Q + . . Q:'$D(^DPT(BMXIEN,0)) + . . S BMXDPT=$G(^DPT(BMXIEN,0)) + . . S BMXZ=$P(BMXDPT,U) ;NAME + . . S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART + . . I BMXHRN="" Q ;NO CHART AT THIS DUZ2 + . . I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" + . . S $P(BMXZ,BMXDLIM,2)=BMXHRN + . . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN + . . S Y=$P(BMXDPT,U,3) X ^DD("DD") + . . S $P(BMXZ,BMXDLIM,4)=Y ;DOB + . . S $P(BMXZ,BMXDLIM,5)=BMXIEN + . . S $P(BMXRET,$C(30),2)=BMXZ + . . Q + . Q + ; + S BMXFILE=9000001 + S BMXIENS="" + S BMXFIELDS=".01" + S BMXFLAGS="M" + S BMXVALUE=BMXP + S BMXNUMBER=BMXC + S BMXINDEXES="" + S BMXSCREEN=$S(+DUZ(2):"I $D(^AUPNPAT(Y,41,DUZ(2),0))",1:"") + ;I BMXSCREEN]"" S DIC("S")=BMXSCREEN + ;S BMXSCREEN="I 0" + S BMXIDEN="" + S BMXTARG="BMXRSLT" + S BMXMSG="" + D FIND^DIC(BMXFILE,BMXIENS,BMXFIELDS,BMXFLAGS,BMXVALUE,BMXNUMBER,BMXINDEXES,BMXSCREEN,BMXIDEN,BMXTARG,BMXMSG) + ;S BMXRET="" + ;B + I '+$G(BMXRSLT("DILIST",0)) S BMXY=BMXRET_$C(31) Q + F BMXX=1:1:$P(BMXRSLT("DILIST",0),U) D + . ;B + . S BMXIEN=BMXRSLT("DILIST",2,BMXX) + . S BMXZ=BMXRSLT("DILIST","ID",BMXX,.01) ;NAME + . ;S $P(BMXZ,BMXDLIM,2)=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART + . S BMXHRN=$P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,2) ;CHART + . I BMXHRN="" Q ;NO CHART AT THIS DUZ2 + . I $P($G(^AUPNPAT(BMXIEN,41,DUZ(2),0)),U,3) S BMXHRN=BMXHRN_"(*)" + . S $P(BMXZ,BMXDLIM,2)=BMXHRN + . S BMXDPT=$G(^DPT(BMXIEN,0)) + . S $P(BMXZ,BMXDLIM,3)=$P(BMXDPT,U,9) ;SSN + . S Y=$P(BMXDPT,U,3) X ^DD("DD") + . S $P(BMXZ,BMXDLIM,4)=Y ;DOB + . S $P(BMXZ,BMXDLIM,5)=BMXIEN + . S $P(BMXRET,$C(30),BMXX+1)=BMXZ + . Q + ;K BMXRSLT + S BMXY=BMXRET_$C(30)_$C(31) + Q +ZZZ ; diff --git a/m/BMXRPC5.m b/m/BMXRPC5.m new file mode 100644 index 0000000..c30c814 --- /dev/null +++ b/m/BMXRPC5.m @@ -0,0 +1,124 @@ +BMXRPC5 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ;Stolen from Mike Remillard. If it doesn't work, it's his fault. +HS(BMXGBL,BMXDFN,BMXTYPE,BMXRDL,BMXFDL) ;EP + ;---> Return patient's Health Summary in global array, ^BMXTEMP($J,"HS" + ;---> Lines delimited by BMXRDL + ;---> File delimited by BMXFDL + ;---> Called by RPC: BMX HEALTH SUMMARY + ;---> Parameters: + ; 1 - BMXGBL (ret) Name of result global containing patient's + ; Health Summary, passed to Broker. + ; 2 - BMXDFN (req) DFN of patient. + ; + ;---> Delimiter to pass error with result to GUI. + N BMX30,BMX31,BMXERR,X + ;S BMX30=$C(30),BMX31=$C(31)_$C(31) + S BMX30=$G(BMXRDL) + I BMX30="" S BMX30=$C(13)_$C(10) + S BMX31=$G(BMXFDL) + S BMXGBL="^BMXTEMP("_$J_",""HS"")",BMXERR="" + K ^BMXTEMP($J,"HS") + ; + N BMXPATH + ;---> Should get path from a Site Parameter. For now, use MSM default. + S BMXPATH="/usr/spool/uucppublic/" + ;S BMXPATH="C:\MSM\" ;TODO: Change to site parameter + ;--->Flag to test whether running as broker job: + N BMXSOCK + S BMXSOCK=0 + ;I $I=56 S BMXSOCK=1 + ; + ;---> If DFN not supplied, set Error Code and quit. + I '$G(BMXDFN) D Q + . S BMXERR="No Patient DFN" S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + ;---> If patient does not exist, set Error Code and quit. + I '$D(^AUPNPAT(BMXDFN,0)) D Q + . S BMXERR="Patient DFN does not exist" S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + N APCHSPAT,APCHSTYP + S APCHSPAT=BMXDFN + S APCHSTYP=$G(BMXTYPE) + S:'+APCHSTYP APCHSTYP=7 + ;S APCHSTYP=9 + ;---> Doesn't work from Device 56. + ;D GUIR^XBLM("EN^APCHS","^TMP(""BMXHS"",$J,") + ; + ;---> Generate a host file name. + N BMXFN S BMXFN="XB"_$J + ; + D + .;---> Important to preserve IO variables for when $I returns to 56. + .N IO,IOBS,IOF,IOHG,IOM,ION,IOPAR,IOS,IOSL,IOST,IOT,IOUPAR,IOXY + .; + .;---> Open host file to receive legacy code display. + .S Y=$$OPEN^%ZISH(BMXPATH,BMXFN,"W") + .;O 51:(BMXPATH_BMXFN:"W") + .;S IO=51,IOST="P-OTHER80" + .;K ^HW("HS") + .;S ^HW("HS","IOST")=$G(IOST) + .;S ^HW("HS","IO")=$G(IO) + .; + .;---> Call to legacy code for Health Summary display. + .S IOSL=999,IOM=80 + .D EN^APCHS + .;---> Write End of File (EOF) marker. + .W $C(9) + .; + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? + .;D ^%ZISC + .;---> Buffer won't write out to file until the device is closed + .;---> or the buffer is flushed by some other command. + .;---> At this point, host file exists but has 0 bytes. + .;C 51 + .;---> Now host file contains legacy code display data. + .; + .;---> For some reason %ZISH cannot open the host file a second time. + .;S Y=$$OPEN^%ZISH(BMXPATH,BMXFN,"R") + .;O 51:(BMXPATH_BMXFN:"R") + .U 51 + .; + .;---> Read in the host file. + .D + ..;---> Stop reading Host File if line contains EOF $C(9). + ..;N I,Y F I=1:1 R Y Q:Y[$C(9) S ^TMP("BMXHS",$J,I)=Y + .; + .;---> %ZISC doesn't close Device 51 when called from TCPIP socket? + .;D ^%ZISC + .;C 51 + ; + ;---> At this point $I=1. The job has "forgotten" its $I, even + ;---> though %SS shows 56 as the current device. $I=1 causes a + ;---> at CAPI+10^XWBBRK2. A simple USE 56 command + ;---> appears to "remind" the job its $I is 56, and it works. + ;---> Possibly this is something %ZISC ordinarily does. + I BMXSOCK U 56 + ;U 56 + ; + ;---> Copy Health Summary to global array for passing back to GUI. + N I,N,U,X S U="^" + S N=0 + F I=1:1 S N=$O(^TMP("BMXHS",$J,N)) Q:'N D + .;---> Set null lines (line breaks) equal to one space, so that + .;---> Windows reader will quit only at the final "null" line. + .S X=^TMP("BMXHS",$J,N) S:X="" X=" " + .S ^BMXTEMP($J,"HS",I)=X_BMX30 + ; + ;---> If no Health Summary produced, report it as an error. + D:'$O(^BMXTEMP($J,"HS",0)) + . S BMXERR="No Health Summary produced" S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + ;---> Tack on Error Delimiter and any error. + S ^BMXTEMP($J,"HS",I)=BMX31_BMXERR + ; + ;---> Delete host file. + ;---> This doesn't work. + S Y=$$DEL^%ZISH(BMXPATH,BMXFN) + ;---> Call system command. + ;S ^MIKE(1)=BMXPATH + ;S ^MIKE(2)=BMXFN + ;S Y=$ZOS(2,BMXPATH_BMXFN) + K ^TMP("BMXHS",$J) + Q diff --git a/m/BMXRPC6.m b/m/BMXRPC6.m new file mode 100644 index 0000000..b3895e3 --- /dev/null +++ b/m/BMXRPC6.m @@ -0,0 +1,112 @@ +BMXRPC6 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +USRKEYRS(BMXY,BMXDUZ) ;EP - Returns recordset of user's keys + ; + N BMXDPT,BMXZ,BMXDLIM,BMXXX,BMXRET,BMXAGE,BMXNEXT,BMXSEX,BMXERR + S BMXDLIM="^",BMXERR="" + S BMXRET="T00050KEY"_$C(30) + I '$D(DUZ(2)) S BMXY=BMXRET_$C(31)_"No DUZ2" Q + ;Strip CRLFs from parameter + S BMXCRLF=$C(13)_$C(10) + S BMXDUZ=$TR(BMXDUZ,BMXCRLF,"") + I '$D(^VA(200,BMXDUZ)) S BMXY=BMXRET_$C(31)_"No such user" Q + S BMXK=0 F S BMXK=$O(^VA(200,BMXDUZ,51,BMXK)) Q:'+BMXK D + . S BMXKEY=$G(^VA(200,BMXDUZ,51,BMXK,0)) + . Q:BMXKEY="" + . S BMXKEY=$P(BMXKEY,BMXDLIM) + . Q:'+BMXKEY + . Q:'$D(^DIC(19.1,BMXKEY,0)) + . S BMXKEY=$P(^DIC(19.1,BMXKEY,0),BMXDLIM) + . Q:BMXKEY']"" + . S BMXRET=BMXRET_BMXKEY_$C(30) + S BMXY=BMXRET_$C(30)_$C(31)_BMXERR + Q + ; +PDATA(BMXY,BMXP) ;-EP Returns patient demographics for pt with + ;health record number BMXP at the current DUZ(2) + N BMXIEN,BMXDUZ2,BMXSQL + ;Strip CR, LF, TAB, SPACE + S BMXP=$TR(BMXP,$C(13),"") + S BMXP=$TR(BMXP,$C(10),"") + S BMXP=$TR(BMXP,$C(9),"") + S BMXP=$TR(BMXP,$C(32),"") + S BMXDUZ2=$G(DUZ(2)),BMXDUZ2=+BMXDUZ2 + S BMXIEN=0 + I +BMXDUZ2 F S BMXIEN=$O(^AUPNPAT("D",BMXP,BMXIEN)) Q:'+BMXIEN I $D(^AUPNPAT("D",BMXP,BMXIEN,BMXDUZ2)) Q + S BMXSQL="SELECT NAME 'Name', DOB 'DateOfBirth', TRIBE_OF_MEMBERSHIP 'Tribe', MAILING_ADDRESS-STREET 'Street'," + S BMXSQL=BMXSQL_" MAILING_ADDRESS-CITY 'City', MAILING_ADDRESS-STATE 'State', MAILING_ADDRESS-ZIP 'Zip', HOME_PHONE 'HomePhone', OFFICE_PHONE 'WorkPhone' FROM PATIENT WHERE BMXIEN='"_+BMXIEN_"'" + D SQL^BMXSQL(.BMXY,BMXSQL) + S @BMXY@(.5)="T00015Chart^" + I $D(@BMXY@(10)) S @BMXY@(10)=BMXP_"^"_@BMXY@(10) + ; + Q + ; +PDEMOD(BMXY,BMXPAT,BMXCOUNT) ;EP + ;Entry point for Serenji debugging + ; + D DEBUG^%Serenji("PDEMO^BMXRPC6(.BMXY,BMXPAT,BMXCOUNT)") + Q + ; +PDEMO(BMXY,BMXPAT,BMXCOUNT) ;EP + ;This simple RPC demonstrates how to format data + ;for the BMXNet ADO.NET data provider + ; + ;Returns a maximum of BMXCOUNT records from the + ;VA PATIENT file whose names begin with BMXPAT + ; + N BMXI,BMXD,BMXC,BMXNODE,BMXDOB + ; + ;When the VA BROKER calls this routine, BMXY is passed by reference + ;We set BMXY to the value of the variable in which we will return + ;our data: + ;S BMXY="^TMP(""BMX"","_$J_")" + N BMXUID + S BMXUID=$S($G(ZTSK):"Z"_ZTSK,1:$J) + S BMXY=$NA(^BMXTMP("BMXTEST",BMXUID)) + K ^BMXTMP("BMXTEST",BMXUID) + ; + ;The first subnode of the data global contains the column header information + ;in the form "TxxxxxCOLUMN1NAME^txxxxxCOLUMN2NAME"_$C(30) + ;where T is the column data type and can be either T for text, I for numeric or D for date/time. + ;xxxxx is the length of the column in characters: + ; + S BMXI=0,BMXC=0 + S ^BMXTMP("BMXTEST",BMXUID,BMXI)="T00030NAME^T00010SEX^D00020DOB"_$C(30) + ; + ;You MUST set an error trap: + S X="PDERR^BMXRPC6",@^%ZOSF("TRAP") + ; + ;Strip CR, LF, TAB, SPACE from BMXCOUNT parameter + S BMXCOUNT=$TR(BMXCOUNT,$C(13),"") + S BMXCOUNT=$TR(BMXCOUNT,$C(10),"") + S BMXCOUNT=$TR(BMXCOUNT,$C(9),"") + S BMXCOUNT=$TR(BMXCOUNT,$C(32),"") + ; + ;Iterate through the global and set the data nodes: + S:BMXPAT="" BMXPAT="A" + S BMXPAT=$O(^DPT("B",BMXPAT),-1) + S BMXD=0 + F S BMXPAT=$O(^DPT("B",BMXPAT)) Q:BMXPAT="" S BMXD=$O(^DPT("B",BMXPAT,0)) I +BMXD S BMXC=BMXC+1 Q:(BMXCOUNT)&(BMXC>BMXCOUNT) D + . Q:'$D(^DPT(BMXD,0)) + . S BMXI=BMXI+1 + . S BMXNODE=^DPT(BMXD,0) + . ;Convert the DOB from FM date + . S Y=$P(BMXNODE,U,3) + . I +Y X ^DD("DD") + . S BMXDOB=Y + . ;The data node fields are in the same order as the column header, i.e. NAME^SEX^DOB + . ;and terminated with a $C(30) + . S ^BMXTMP("BMXTEST",BMXUID,BMXI)=$P(BMXNODE,U)_U_$P(BMXNODE,U,2)_U_BMXDOB_$C(30) + ; + ;After all the data nodes have been set, set the final node to $C(31) to indicate + ;the end of the recordset + S BMXI=BMXI+1 + S ^BMXTMP("BMXTEST",BMXUID,BMXI)=$C(31) + Q + ; +PDERR ;Error trap for PDEMO + ; + S ^BMXTMP("BMXTEST",BMXUID,BMXI+1)=$C(31) + Q diff --git a/m/BMXRPC7.m b/m/BMXRPC7.m new file mode 100644 index 0000000..13154f1 --- /dev/null +++ b/m/BMXRPC7.m @@ -0,0 +1,134 @@ +BMXRPC7 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +WINVAL(BMXRET,BMXWINID) ;EP + ;Validates user based on Windows Identity + ; + ;Return R(0)=DUZ, R(1)=(0=OK, 1,2...=Can't sign-on for some reason) + ; R(2)=verify needs changing, R(3)=Message, R(4)=0, R(5)=msg cnt, R(5+n) + ; R(R(5)+6)=# div user must select from, R(R(5)+6+n)=div + I $$NEWERR^%ZTER N $ETRAP S $ETRAP="" + N X,BMXUSER,BMXUNOW,BMXUM,BMXUMSG,BMXVCOK K DUZ + S BMXRET(0)=0,BMXRET(5)=0,BMXUM=0,BMXUMSG=0 + S DUZ=0,DUZ(0)="",BMXVCOK=0 D NOW ;IHS/OIT/HMW SAC Exemption Applied For + S BMXUMSG=$$INHIBIT() I BMXUMSG S BMXUM=1 G VAX ;Logon inhibited + ; + S DUZ=$$WINUGET^BMXRPC3(BMXWINID) ;IHS/OIT/HMW SAC Exemption Applied For + I DUZ>0 D USER(DUZ) + S BMXUMSG=$$UVALID() G:BMXUMSG VAX + I DUZ>0 S BMXUMSG=$$POST(1) +VAX S:BMXUMSG>0 DUZ=0 D:DUZ>0 POST2 + S BMXRET(0)=DUZ,BMXRET(1)=BMXUM,BMXRET(2)=BMXVCOK,BMXRET(3)=$S(BMXUMSG:$$TXT(BMXUMSG),1:""),BMXRET(4)=0 + Q + ; +NOW S U="^",BMXUNOW=$$NOW^XLFDT(),DT=$P(BMXUNOW,".") + Q + ; +USER(IX) ;Build USER + S BMXUSER(0)=$G(^VA(200,+IX,0)),BMXUSER(1)=$G(^(.1)) + Q + ; +POST(CVC) ;Finish setup partition, I CVC don't log get + N X,BMXUM + K ^UTILITY($J),^TMP($J) + I '$D(USER(0)),DUZ D USER(DUZ) + S BMXUM=$$USER1A Q:BMXUM>0 BMXUM ;User can't sign on for some reason. + S BMXRET(5)=0 ;The next line sends the post sign-on msg + F BMXPT=1:1 Q:'$D(BMXUTEXT(BMXPT)) S BMXRET(5+BMXPT)=$E(BMXUTEXT(BMXPT),2,256),BMXRET(5)=BMXPT + S BMXRET(5)=0 ;This line stops the display of the msg. Remove this line to allow. + D:'$G(CVC) POST2 + Q 0 +POST2 D:'$D(BMXUNOW) NOW + D DUZ ;^XUS1A ;,SAVE^XUS1,LOG^XUS1,ABT^XQ12 + K BMXUTEXT,BMXOPT,BMXUER ;XUEON,XUEOFF,XUTT + Q + ; +DUZ ;Setup DUZ. SAC exemption applied for. + S:'$D(BMXUSER(0)) BMXUSER(0)=^VA(200,DUZ,0) D:$D(BMXOPT)[0 BMXOPT + S DUZ(0)=$P(BMXUSER(0),U,4),DUZ(1)="",DUZ("AUTO")=$P(BMXOPT,"^",6) ;IHS/OIT/HMW SAC Exemption Applied For + S DUZ(2)=$S($G(DUZ(2))>0:DUZ(2),1:+$P(BMXOPT,U,17)) ;IHS/OIT/HMW SAC Exemption Applied For + S X=$P($G(^DIC(4,DUZ(2),99)),U,5),DUZ("AG")=$S(X]"":X,1:$P(^XTV(8989.3,1,0),U,8)) + S DUZ("BUF")=($P(BMXOPT,U,9)="Y"),DUZ("LANG")=$P(BMXOPT,U,7) ;IHS/OIT/HMW SAC Exemption Applied For + Q + ; +USER1A() ; + N BMXPTB,BMXPTE,BMXPTT + S BMXUTEXT=0,DUZ(2)=0 + F I=0:0 S I=$O(^XTV(8989.3,1,"POST",I)) Q:I'>0 D SET("!"_$G(^(I,0))) + D SET("!"),BMXOPT + S BMXPTH=$P($H,",",2) + D SET("!Good "_$S(BMXPTH<43200:"morning ",BMXPTH<61200:"afternoon ",1:"evening ")_$S($P(BMXUSER(1),U,4)]"":$P(BMXUSER(1),U,4),1:$P(BMXUSER(0),U,1))) + S BMXI1=$G(^VA(200,DUZ,1.1)),X=(+BMXI1_"0000") + I X D SET("! You last signed on "_$S(X\1=DT:"today",X\1+1=DT:"yesterday",1:$$DD(X))_" at "_$E(X,9,10)_":"_$E(X,11,12)) + I $P(BMXI1,"^",2) S I=$P(BMXI1,"^",2) D SET("!There "_$S(I>1:"were ",1:"was ")_I_" unsuccessful attempt"_$S(I>1:"s",1:"")_" since you last signed on.") + I $P(BMXUSER(0),U,12),$$PROHIBIT(BMXPTH,$P(BMXUSER(0),U,12)) Q 17 ;Time frame + I +$P(BMXOPT,U,15) S BMXPT=$P(BMXOPT,U,15)-($H-BMXUSER(1)) I BMXPT<6,BMXPT>0 D SET("! Your Verify code will expire in "_BMXPT_" days") + S:$P(BMXOPT,"^",5) XUTT=1 S:'$D(DTIME) DTIME=$P(BMXOPT,U,10) + I ('X)!$P(BMXOPT,U,4) Q 0 + Q 9 + ; +BMXOPT ;Build the BMXOPT string + N X,I + S:'$D(BMXOPT) BMXOPT=$G(^XTV(8989.3,1,"XUS")) + S X=$G(^VA(200,DUZ,200)) + F I=4:1:7,9,10 I $P(X,U,I)]"" S $P(BMXOPT,"^",I)=$P(X,U,I) + Q + ; +SET(V) ;Set into BMXUTEXT(BMXUTEXT) + S BMXUTEXT=$G(BMXUTEXT)+1,BMXUTEXT(BMXUTEXT)=V + Q + ; +PROHIBIT(BMXPTT,BMXPTR) ;See if a prohibited time, (Current time, restrict range) + N XMSG,BMXPTB,BMXPTE + S BMXPTT=BMXPTT\60#60+(BMXPTT\3600*100),BMXPTB=$P(BMXPTR,"-",1),BMXPTE=$P(BMXPTR,"-",2) + S XMSG=$P($$FMTE^XLFDT(DT_"."_BMXPTB,"2P")," ",2,3)_" thru "_$P($$FMTE^XLFDT(DT_"."_BMXPTE,"2P")," ",2,3) + I $S(BMXPTE'BMXPTE&(BMXPTT'BMXPTB!(BMXPTT0:^XTV(8989.3,1,4,X,0),1:BMXQVOL_"^y^1") S:$P(BMXVOL,U,6)="y" XRTL=BMXCI_","_BMXQVOL + ;I '$D(BMXQVOL) Q 0 + ;I '$D(BMXVOL) Q 0 + I $G(^%ZIS(14.5,"LOGON",BMXQVOL)) Q 1 + I $D(^%ZOSF("ACTJ")) X ^("ACTJ") I $P(BMXVOL,U,3),($P(BMXVOL,U,3)'>Y) Q 2 + Q 0 + ; + ; +UVALID() ;EF. Is it valid for this user to sign on? + I '+$G(BMXWIN) Q 18 + I DUZ'>0 Q 4 + I $P(BMXUSER(0),U,11),$P(BMXUSER(0),U,11)'>DT Q 11 ;Access Terminated + I $P(BMXUSER(0),U,7) Q 5 ;Disuser flag set + Q 0 + ; +DD(Y) Q $S($E(Y,4,5):$P("Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec","^",+$E(Y,4,5))_" ",1:"")_$S($E(Y,6,7):+$E(Y,6,7)_",",1:"")_($E(Y,1,3)+1700) + Q + ; +TXT(BMXPT) ; + S BMXPT=$T(ZZ+BMXPT) + S BMXPT=$P(BMXPT,";",4,9) I BMXPT["|" S BMXPT=$P(BMXPT,"|",1)_$G(BMXUM(0))_$P(BMXPT,"|",2) + Q BMXPT +ZZ ;;Halt;Error Messages +1 ;;1;Signons not currently allowed on this processor. +2 ;;1;Maximum number of users already signed on to this processor. +3 ;;1;This device has not been defined to the system -- contact system manager. +4 ;;0;Not a valid Windows Identity map value. +5 ;;0;No Access Allowed for this User. +6 ;;0;Invalid device password. +7 ;;0;Device locked due to too many invalid sign-on attempts. +8 ;;1;This device is out of service. +9 ;;0;*** MULTIPLE SIGN-ONS NOT ALLOWED *** +10 ;;1;You don't have access to this device! +11 ;;0;Your access code has been terminated. Please see your site manager! +12 ;;0;VERIFY CODE MUST be changed before continued use. +13 ;;1;This device may only be used outside of this time frame | +14 ;;0;'|' is not a valid UCI! +15 ;;0;'|' is not a valid program name! +16 ;;0;No PRIMARY MENU assigned to user or User is missing KEY to menu! +17 ;;0;Your access to the system is prohibited from |. +18 ;;0;Windows Integrated Security Not Allowed on this port. diff --git a/m/BMXRPC8.m b/m/BMXRPC8.m new file mode 100644 index 0000000..ef079b0 --- /dev/null +++ b/m/BMXRPC8.m @@ -0,0 +1,89 @@ +BMXRPC8 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +BMXLOCKD(BMXY,BMXVAR,BMXINC,BMXTIME) ;EP + ;Entry point for debugging + ; + D DEBUG^%Serenji("BMXLOCK^BMXRPC8(.BMXY,BMXVAR,BMXINC,BMXTIME)") + Q + ; +BMXLOCK(BMXY,BMXVAR,BMXINC,BMXTIME) ;EP + ;Called by BMX LOCK rpc to lock variable BMXVAR + ;If BMXVAR = "", argumentless lock is performed to release all locks + ;BMXINC = increment lock if "+", decrement if "-" + ;BMXTIME = lock timeout + ;Returns 1 if lock successful, otherwise 0; + ; + S X="ERR^BMXRPC8",@^%ZOSF("TRAP") + ; + N BMXC + S:$E(BMXVAR,1,1)="~" BMXVAR="^"_$E(BMXVAR,2,$L(BMXVAR)) + S:BMXTIME="" BMXTIME=0 + I BMXVAR="" X "L" S BMXY=1 Q + S BMXC="L " + S BMXC=BMXC_$S(BMXINC="+":"+",BMXINC="-":"-",1:"") + S BMXC=BMXC_BMXVAR_":"_+BMXTIME + X BMXC + S BMXY=$T + Q + ; +ERR ;Error processing + S BMXY=0 + Q + ; +BMXVERD(BMXY,BMXNS,BMXLOC) ;EP + ;Entry point for debugging + ; + D DEBUG^%Serenji("BMXVER^BMXRPC8(.BMXY,BMXNS,BMXLOC)") + Q + ; +BMXVER(BMXY,BMXNS,BMXLOC) ;EP + ; + ;Called by BMX VERSION INFO rpc + ;Returns recordset of version info for server components in namespace BMXNS. + ;If BMXLOC is "", then the version info is assumed to be stored in piece 1-3 of + ;^APPL(1,0) + ; + ;TODO: + ;BMXLOC, if not null, is either a global reference such that $P(@BMXLOC,U,1,3) returns + ;MAJOR^MINOR^BUILD + ;Or BMXLOC can be an extrinsic function call that returns MAJOR^MINOR^BUILD. + ; + ;The returned error field is either "" or contains a text error message. + ; + N X,BMXI,BMXNOD,BMXDAT + ; + S X="VETRAP^BMXRPC8",@^%ZOSF("TRAP") + S BMXI=0 + K ^BMXTMP($J) + S BMXY="^BMXTMP("_$J_")" + S ^BMXTMP($J,BMXI)="T00030ERROR^T00030MAJOR_VERSION^T00030MINOR_VERSION^T00030BUILD"_$C(30) + S BMXI=BMXI+1 + I BMXNS="" D VERR(BMXI,"BMXRPC8: Invalid Null Application Namespace") Q + S BMXNOD="^"_BMXNS_"APPL(1,0)" + S BMXDAT=$G(@BMXNOD) + I BMXNS="" D VERR(BMXI,"BMXRPC8: No version info for Application Namespace") Q + S ^BMXTMP($J,BMXI)="^"_$P(BMXDAT,U,1,3)_$C(30) + Q + ; + ; +VERR(BMXI,BMXERR) ;Error processing + S BMXI=BMXI+1 + S ^BMXTMP($J,BMXI)=BMXERR_"^^^"_$C(30) + S BMXI=BMXI+1 + S ^BMXTMP($J,BMXI)=$C(31) + Q + ; +VETRAP ;EP Error trap entry + D ^%ZTER + I '$D(BMXI) N BMXI S BMXI=999999 + S BMXI=BMXI+1 + D VERR(BMXI,"BMXRPC8 Error: "_$G(%ZTERROR)) + Q + ; +IMHERE(BMXRES) ;EP + ;Entry point for BMX IM HERE remote procedure + S BMXRES=1 + Q + ; diff --git a/m/BMXRPC9.m b/m/BMXRPC9.m new file mode 100644 index 0000000..4f36211 --- /dev/null +++ b/m/BMXRPC9.m @@ -0,0 +1,165 @@ +BMXRPC9 ; IHS/OIT/HMW - RPC CALL FOR EXTENDED BROKER FUNCTIONALITY ; + ;;2.1;BMX;;Jul 26, 2009 + ; UPDATE FILEMAN WITH AN ADO RECORD SET FROM A WINDOWS APPLICATION + ; + ; + ; +SONLY(BMXY,BMXVAL) ;EP Schema Only + ; + I BMXVAL="TRUE" S BMX("SCHEMA ONLY")=1 + E S BMX("SCHEMA ONLY")=0 + S BMXY=BMX("SCHEMA ONLY") + ; + Q + ; +TESTRPC(BMXGBL,BMXSQL) ; + ;Test retrieval/update statement + ; + N BMXI,BMXERR,BMXN,BMXNOD,BMXNAM,BMXSEX,BMXDOB,BMXFAC,BMXTMP,BMXJ + S X="ETRAP^BMXRPC9",@^%ZOSF("TRAP") + S BMXGBL="^BMXTMP("_$J_")",BMXERR="",U="^" + K ^BMXTMP($J) + S BMXI=0 + ; + ;Old column info format: + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="I00010BMXIEN"_U_"D00010DOB"_U_"T00030LOCAL_FACLILITY"_U_"T00030NAME"_U_"T00010SEX"_$C(30) + ; + ;New column info format is @@@meta@@@KEYFIELD|FILE# + ; For each field: ^FILE#|FIELD#|DATATYPE|LENGTH|FIELDNAME|READONLY|KEYFIELD|NULL ALLOWED + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="@@@meta@@@" + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="BMXIEN|2160010^" + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.001|I|10|BMXIEN|TRUE|TRUE^" + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.03|D|10|DOB|FALSE|FALSE^" + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.04|T|60|LOCAL_FACILITY|FALSE|FALSE^" + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.01|T|30|NAME|FALSE|FALSE^" + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)="2160010|.02|T|10|SEX|FALSE|FALSE" + ;S BMXI=BMXI+1,^BMXTMP($J,BMXI)=$C(30) + ; + D SS^BMXADO(.BMXTMP,"","TEST1") + I $G(BMXTMP)=$C(30) D ERR(99,"SCHEMA GENERATION FAILED") Q + S BMXJ=0 F S BMXJ=$O(BMXTMP(BMXJ)) Q:'+BMXJ D + . S BMXI=BMXI+1 + . S ^BMXTMP($J,BMXI)=BMXTMP(BMXJ) + I +$G(BMX("SCHEMA ONLY")) D Q + . S BMXI=BMXI+1 + . S ^BMXTMP($J,BMXI)=$C(31) + . Q + S BMXN=0 + F S BMXN=$O(^DIZ(2160010,BMXN)) Q:'+BMXN D + . Q:'$D(^DIZ(2160010,BMXN,0)) + . S BMXNOD=^DIZ(2160010,BMXN,0) + . S BMXNAM=$P(BMXNOD,U) + . S BMXSEX=$P(BMXNOD,U,2) + . S BMXDOB=$P(BMXNOD,U,3) + . S Y=BMXDOB X ^DD("DD") S BMXDOB=Y + . S BMXFAC=$P(BMXNOD,U,4) + . S:+BMXFAC BMXFAC=$P($G(^DIC(4,BMXFAC,0)),U) + . S BMXI=BMXI+1 + . S ^BMXTMP($J,BMXI)=BMXN_U_BMXDOB_U_BMXFAC_U_BMXNAM_U_BMXSEX_$C(30) + . Q + S BMXI=BMXI+1 + S ^BMXTMP($J,BMXI)=$C(31) + Q + ; +ERR(BMXID,BMXERR) ;Error processing + K ^BMXTMP($J) + S ^BMXTMP($J,0)="I00030ERRORID^T00030ERRORMSG"_$C(30) + S ^BMXTMP($J,1)=BMXID_"^"_BMXERR_$C(30) + S ^BMXTMP($J,2)=$C(31) + Q + ; +ETRAP ;EP Error trap entry + D ^%ZTER + D ERR(99,"BMXRPC9 Error: "_$G(%ZTERROR)) + Q + ; +TEST N OUT S OUT="" D ADO(.OUT,2160010,"1",(".01|A,A"_$C(30)_".02|M"_$C(30)_".03|1/5/1946"_$C(30)_".04|SAN XAVIER"_$C(31))) W !,OUT + Q + ; +ADOX(OUT,FILE,IEN,DATA) ; + ; + D DEBUG^%Serenji("ADOX^BMXRPC9(.OUT,FILE,IEN,DATA)") + ; + Q + ; +ADO(OUT,FILE,IEN,DATA) ; RPC CALL: OUT = OUTBOUND MESSAGE, FILE = FILEMAN FILE NUMBER, IEN = FILE INTERNAL ENTRY NUMBER, DATA = DATA STRING + N OREF,CREF,DIC,DIE,DA,DR,X,Y,%,FLD,CNT,FNO,VAL,TFLG,DFLG,TOT,UFLG,XTFLG,GTFLG,GDFLG + S OUT="",FLD="",GTFLG=0,GDFLG=0 + S IEN=$G(IEN) + I $E(IEN)="-" S IEN=$E(IEN,2,99),GDFLG=1 ; GLOBAL DELETE FLAG + I $E(IEN)="+" S IEN=$E(IEN,2,99),GTFLG=1 ; GLOBAL TRANSACTION FLAG, ROLLBACK IF ANY FIELD FAILS TO UPDATE + I IEN="Add"!(IEN="ADD") S IEN="" + I '$D(^DIC(+$G(FILE),0,"GL")) S OUT="Update cancelled. Invalid FILE number" Q + S OREF=^DIC(FILE,0,"GL") I '$L(OREF) S OUT="Update cancelled. Invalid file definition" Q + S CREF=$E(OREF,1,$L(OREF)-1) I $E(OREF,$L(OREF))="," S CREF=CREF_")" ; CONVERT OREF TO CREF + I IEN,'$D(@CREF@(IEN)) S OUT="Update cancelled. Invalid IEN" Q + I 'GDFLG,IEN,(DATA["-.01|"!(DATA[".01|@")) S GDFLG=1 + I GDFLG,'IEN S OUT="Deletion cancelled. Missing IEN" Q + I GDFLG D DIK(OREF,IEN) S OUT="Record deleted|"_IEN Q + S UFLG=$S($G(IEN):"E",1:"A") ; UPDATE FLAG: ADD OR EDIT + I '$L($G(DATA)) S OUT="Update cancelled. Missing/invalid data string" Q + S TOT=$L(DATA,$C(30)) I 'TOT S OUT="Update cancelled. Missing data string" Q + F CNT=1:1:TOT S DATA(CNT)=$P(DATA,$C(30),CNT) ; BUILD PRIMARY FIELD ARRAY + S %=DATA(1) I %=""!(%=$C(31)) S OUT="Update cancelled. Missing data string" Q + S %=DATA(CNT) I %[$C(31) S %=$P(%,$C(31),1),DATA(CNT)=% ; STRIP OFF END OF FILE MARKER + F CNT=1:1:TOT S X=DATA(CNT) I $L(X) D ; BUILD SECONDARY FIELD ARRAY + . S TFLG=0,DFLG=0 + . I $E(X)="+" S TFLG=1,X=$E(X,2,999),$P(FLD,U)=1 + . I $E(X)="-" S DFLG=1,X=$E(X,2,999) + . S FNO=$P(X,"|"),VAL=$P(X,"|",2) + . I '$D(^DD(FILE,+$G(FNO),0)) S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid field number" Q + . I DFLG,VAL'="" S:$L(OUT) OUT=OUT_"~" S OUT=OUT_FNO_"|Invalid deletion syntax" Q ; CANT DELETE IF A VALUE IS SENT + . I DFLG!(VAL="") S VAL="@" ; SYNC DFLG AND VAL + . I VAL="@" S DFLG=1 ; SYNC DFLG AND VAL + . S FLD(FNO)=VAL_U_TFLG_U_DFLG + . I FNO=.01,TFLG S $P(FLD,U,2)=1 ; + . Q + I $P($G(FLD(.01)),U,3),UFLG="A" S OUT="Record deletion cancelled. Missing IEN" Q ; CAN'T DELETE A RECORD WITHOUT A VALID IEN +DELREC I $P($G(FLD(.01)),U,3) D DIK(OREF,IEN) S OUT="OK" Q ; DELETE THE RECORD + I UFLG="A",'$L($P($G(FLD(.01)),U)) S OUT="Record addition cancelled. Missing .01 field" Q ; CAN'T ADD A RECORD WITHOUT A VALID .01 FIELD +ADDREC I UFLG="A" D ADD(OREF) Q ; ADD A NEW ENTRY TO A FILE +EDITREC I UFLG="E" D EDIT(OREF,IEN) Q ; EDIT AN EXISTING RECORD + Q + ; +DIK(DIK,DA) ; DELETE A RECORD + D ^DIK + D ^XBFMK + Q + ; +ADD(DIC) ; ADD A NEW ENTRY TO A FILE + N X,Y + S X=""""_$P($G(FLD(.01)),U)_"""" + S DIC(0)="L" + D ^DIC + I Y=-1 S OUT="Unable to add a new record" G AX + I $O(FLD(.01)) D EDIT(DIC,+Y) Q + S OUT="OK"_"|"_+Y +AX D ^XBFMK + Q + ; +EDIT(DIE,DA) ; EDIT AN EXISTING RECORD + N DR,RFLG,ERR,FNO,VAL,TFLG,RESULT,MSG,DIERR,DISYS + S FNO=$O(FLD(.01),-1),DR="" ;HMW Changed to include .01 in DR string + I UFLG="A" S OUT="New record added|"_DA + F S FNO=$O(FLD(FNO)) Q:'FNO S X=FLD(FNO) I $L(X) D I $G(RFLG) Q ; CHECK EA FIELD AND BUILD THE DR STRING AND ERROR STRING + . S VAL(FNO)=$P(X,U),TFLG=$P(X,U,2) I '$L(VAL(FNO)) Q + . K ERR,RESULT + . I VAL(FNO)="@"!(VAL(FNO)="") S RESULT="@" + . E D CHK^DIE(FILE,FNO,"",VAL(FNO),.RESULT,"ERR") + . I RESULT=U D Q + .. S MSG=$G(ERR("DIERR",1,"TEXT",1),"Failed FileMan data validation") + .. I $L(OUT) S OUT=OUT_"~" + .. I TFLG!GTFLG S RFLG=1,OUT=FNO_"|"_MSG Q + .. S OUT=OUT_FNO_"|"_MSG + .. Q + . S VAL(FNO)=RESULT + . I $L(DR) S DR=DR_";" + . S DR=DR_FNO_"////^S X=VAL("_FNO_")" ; BUILD DR STRING + . Q + I $G(RFLG) D:UFLG="A" DIK(DIE,DA) S OUT="Record update cancelled"_"|"_OUT G EX ; TRANSACTION ROLLBACK FLAG IS SET, ENTRY DELETED (ADD MODE) OR UPDATE CANCELLED (EDIT MODE) + L +@CREF@(DA):2 I $T D ^DIE L -@CREF@(DA) G:OUT["valid" EX S OUT="OK" S:UFLG="A" OUT=OUT_"|"_DA G EX ; SUCCESS!!!! + S OUT="Update cancelled. File locked" ; FILE LOCKED. UNABLE TO UPDATE + I $L(FLD),UFLG="A" D DIK(DIE,DA) ; ROLLBACK THE NEW RECORD +EX D ^XBFMK ; CLEANUP + Q + ; diff --git a/m/BMXSQL.m b/m/BMXSQL.m new file mode 100644 index 0000000..1660335 --- /dev/null +++ b/m/BMXSQL.m @@ -0,0 +1,406 @@ +BMXSQL ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; + Q + ; +FLDNDX(BMXGBL,BMXFL,BMXFLD) ; + ;Returns index name and set code for all indexes on field + ;on field BMXFLD in file BMXFL + S BMX31=$C(31)_$C(31) + K ^BMXTMP($J),^BMXTEMP($J) + S BMXGBL="^BMXTEMP("_$J_")" + I +BMXFL'=BMXFL D + . S BMXFL=$TR(BMXFL,"_"," ") + . I '$D(^DIC("B",BMXFL)) S BMXFL="" Q + . S BMXFL=$O(^DIC("B",BMXFL,0)) + I '$G(BMXFL) D ERROUT("File number not provided.",1) Q + ; + ;Check for field name + I +BMXFLD'=BMXFLD D + . S BMXFLD=$TR(BMXFLD,"_"," ") + . I '$D(^DD(BMXFL,"B",BMXFLD)) S BMXFLD="" Q + . S BMXFLD=$O(^DD(BMXFL,"B",BMXFLD,0)) + I '$G(BMXFLD) D ERROUT("Field not provided",1) Q + ; + ;Set up Column names + S ^BMXTEMP($J,0)="T"_$$NUMCHAR(30)_"INDEX^T"_$$NUMCHAR(200)_"CODE"_$C(30) + ; + ;Write field data to BMXTEMP + S BMXI=0,I=0 + N BMXNAM,BMXCOD,BMXNOD,BMXTYP + F S BMXI=$O(^DD(BMXFL,BMXFLD,1,BMXI)) Q:'+BMXI Q:$D(BMXERR) D + . S I=I+1 + . S BMXNOD=$G(^DD(BMXFL,BMXFLD,1,BMXI,0)) + . S BMXNAM=$P(BMXNOD,U,2) + . S BMXTYP=$P(BMXNOD,U,3) + . S:BMXTYP="" BMXTYP="REGULAR" + . S BMXCOD=$G(^DD(BMXFL,BMXFLD,1,BMXI,1)) + . S BMXCOD=$TR(BMXCOD,"^","~") + . S ^BMXTEMP($J,I)=BMXNAM_U_BMXTYP_U_BMXCOD_$C(30) + Q + ; +TLIST(BMXGBL,BMXFROM,BMXTO) ; + ;Returns list of Fileman files to which user has READ access + ;TODO: Pass in type of access (RD,DL,WR) in BMXPAR + ; + N A,F,BMXF,BMXFLD,D0,BMXU,I,BMXCNT,BMXMFL,BMXRD,BMXMAX + S U="^" + S:$G(BMXFROM)="RD" BMXFROM="" + K ^BMXTMP($J),^BMXTEMP($J) + S BMXGBL="^BMXTEMP("_$J_")" + S BMXF=1 + S BMXF("FILE")=1 + S BMXFLD("FILE")="1^.01" + S BMXFLD("NUMBER")="1^.001" ;ADDED + S BMXFLDN=$P(BMXFLD("FILE"),"^",2) + S BMXFLDN(1,BMXFLDN)="FILE" + S BMXFLDN=$P(BMXFLD("NUMBER"),"^",2) ;ADDED + S BMXFLDN(1,BMXFLDN)="NUMBER" ;ADDED + S BMXFLDO=2 ;CHANGED FROM 1 TO 2 + S BMXFLDO(0)="1^.01" + S BMXFLDOX(1,.01,"E")=0 + S BMXFLDO(1)="1^.001" ;ADDED + S BMXFLDOX(1,.001,"E")=1 ;ADDED + S BMXFNX(1)="FILE" + S BMXFO(1)="1" + S BMXU=$G(DUZ(0)) + S BMXRD=$C(30) + S ^BMXTEMP($J,0)="T00030FILE^N00010NUMBER"_BMXRD + S BMXSET="S I=I+1,^BMXTEMP($J,I)=$P($G(^DIC(D0,0)),U)_U_D0_BMXRD,BMXCNT=BMXCNT+1" + S D0=0,I=0,BMXCNT=0,BMXMAX=2000 + S BMXFROM=$G(BMXFROM),BMXTO=$G(BMXTO) + I +BMXFROM=BMXFROM D ;BMXFROM is a filenumber + . S F=(+BMXFROM-1),T=+BMXTO + . S:BMXTOT Q:BMXCNT>BMXMAX I $D(^DD(D0)) D TLIST1 + I +BMXFROM'=BMXFROM D ;F is a filename or is null + . S F="",T="zzzzzzz" + . S:$G(BMXFROM)]"" F=$O(^DIC("B",BMXFROM),-1) + . S:$G(BMXTO)]"" T=BMXTO + . F S F=$O(^DIC("B",F)) Q:F="" Q:F]T Q:BMXCNT>BMXMAX D + . . S D0=0 F S D0=$O(^DIC("B",F,D0)) Q:'+D0 D TLIST1 + ; + S I=I+1,^BMXTEMP($J,I)=$C(31) + Q + ; +TLIST1 ; + I BMXU="@" X BMXSET Q + Q:$D(^DIC(D0,0))'=11 + S A=$G(^DIC(D0,0,"RD")) + I $D(^VA(200,DUZ,"FOF",D0,0)) D Q + . ;I $P(^(0),U,5)="1" X BMXSET Q + . I $P(^VA(200,DUZ,"FOF",D0,0),U,5)="1" X BMXSET Q + F J=1:1:$L(A) I DUZ(0)[$E(A,J) X BMXSET + Q + ; +SQLCOL(BMXGBL,BMXSQL) ;EP + D INTSQL(.BMXGBL,.BMXSQL,1) + Q + ; +SQLD(BMXGBL,BMXSQL) ;EP Serenji Debug Entrypoint + D DEBUG^%Serenji("SQL^BMXSQL(.BMXGBL,.BMXSQL)","10.10.10.104") + Q + ; +SQL(BMXGBL,BMXSQL) ;EP + D INTSQL(.BMXGBL,.BMXSQL,0) + Q + ; +INTSQL(BMXGBL,BMXSQL,BMXCOL) ;EP + ; + ;SQL Top Wait for debug break + ;D + ;. F J=1:1:10 S K=$H H 1 + ;. Q + ; + S X="ERRTRAP^BMXSQL",@^%ZOSF("TRAP") + I $G(BMXSQL)="" S BMXSQL="" D + . N C S C=0 F S C=$O(BMXSQL(C)) Q:'+C D + . . S BMXSQL=BMXSQL_BMXSQL(C) + ; + I BMXSQL["call SHAPE" S BMXSQL="SELECT JUNKNAME, MULTCOLOR FROM JUNKMULT" + ; Global-scope variables + K BMXTK + N BMXF,BMXTK,T,BMXFLD,BMXTMP,BMXM,BMXXMAX,BMXFLDN,BMXV + N BMXX,BMXFG,BMXFF,BMXSCR,BMXPFP + N BMXERR,BMXFLDO,BMXFLDOX,BMXFJ,BMXFO,BMXFNX + N BMXMFL,BMXFLDA + D ^XBKVAR + S U="^" + I $D(^%ZOSF("MAXSIZ")) S X=640 X ^%ZOSF("MAXSIZ") + K ^BMXTMP($J),^BMXTEMP($J),^BMXTMPD($J) + S BMXGBL="^BMXTEMP("_$J_")" + ;Remove CR and LF from BMXSQL + S BMXSQL=$TR(BMXSQL,$C(13)," ") + S BMXSQL=$TR(BMXSQL,$C(10)," ") + S BMXSQL=$TR(BMXSQL,$C(9)," ") + S BMXSQL=$TR(BMXSQL,$C(34),"") + D PARSE^BMXPRS(BMXSQL) + S BMXXMAX=1000000 ;Default Maximum records to return. + D KW^BMXSQL1(.BMXTK) + Q:$D(BMXERR) + ; + ;Get file names into BMXF("NAME")="NUMBER" + ;Get file numbers into BMXFNX(NUMBER)="NAME" + ; Files are ordered in BMXFO(order)="NUMBER" + ; +FROM S T=$G(BMXTK("FROM")) + I '+T S BMXERR="'FROM' CLAUSE NOT FOUND" D ERROR Q + S BMXF=0 + F S T=$O(BMXTK(T)) Q:'+T Q:T=$G(BMXTK("WHERE")) Q:T=$G(BMXTK("ORDER BY")) Q:T=$G(BMXTK("GROUP BY")) D Q:$D(BMXERR) + . Q:BMXTK(T)="," + . N BMXFNT + . I BMXTK(T)["'" S BMXTK(T)=$P(BMXTK(T),"'",2) + . S BMXTK(T)=$TR(BMXTK(T),"_"," ") + . I '(BMXTK(T)?.N),'$D(^DIC("B",BMXTK(T))) S BMXERR="FILE NOT FOUND" D ERROR Q + . S BMXF=BMXF+1 + . I BMXTK(T)?.N S BMXFNT=BMXTK(T) + . E S BMXFNT=$O(^DIC("B",BMXTK(T),0)) + . S BMXMFL(BMXFNT,"GLOC")=^DIC(BMXFNT,0,"GL") + . D F1(BMXF,BMXTK(T),BMXFNT) + . I '+BMXF(BMXTK(T)) S BMXERR="FILE NUMBER NOT FOUND" D ERROR Q + . D ;Test alias + . . Q:'+$O(BMXTK(T)) + . . N V + . . S V=T+1 + . . Q:$G(BMXTK(V))="," + . . Q:V=$G(BMXTK("WHERE")) + . . Q:V=$G(BMXTK("ORDER BY")) + . . Q:V=$G(BMXTK("GROUP BY")) + . . S BMXTK(T,"ALIAS")=BMXTK(V) + . . K BMXTK(V) + . . Q + . Q + ; + D SELECT^BMXSQL5 + I $D(BMXERR) G END + D POST2^BMXPRS ;Remove commas from BMXTK + D KW^BMXSQL1(.BMXTK) + ; + D WHERE^BMXSQL7 + ; + ;Find the first WHERE field that has an index + I $D(BMXERR) G END + ; + D INDEX(.BMXFF,.BMXX,.BMXTMP) + ; + S:BMXTMP BMXX=BMXTMP + ; + ;Set up screen logic for where fields + D SCREEN^BMXSQL1 + D SETX^BMXSQL2(.BMXX,.BMXFG,.BMXSCR) + ; + ; +EXEC ;Execute enumerator and screen code to call Output routine + ; + N BMXOUT,J,BMXC + S BMXOUT=0 + ;Debug lines (retain): + ;K ^HW("BMXX") S J=0 F S J=$O(BMXX(J)) Q:'+J S ^HW("BMXX",J)=BMXX(J) + ;K ^HW("BMXSCR") S ^HW("BMXSCR")=$G(BMXSCR) S J=0 F S J=$O(BMXSCR(J)) Q:'+J S ^HW("BMXSCR",J)=BMXSCR(J) + ;Test for SHOWPLAN + I $G(BMXTK("SHOWPLAN"))="TRUE" D WPLAN Q + S BMXM=0 + I 'BMXCOL S J=0 F S J=$O(BMXX(J)) Q:'+J D Q:BMXM>BMXXMAX + . X BMXX(J) + ; + D WRITE^BMXSQL6 + ; +END Q + ; + ; +F1(BMXC,BMXNAM,BMXNUM) ;EP + S BMXF(BMXNAM)=BMXNUM + S BMXFNX(BMXNUM)=BMXNAM + S BMXFO(BMXC)=BMXF(BMXNAM) + Q + ; +OUT ;Set result in ^BMXTMP + S BMXOUT=BMXOUT+1 + S ^BMXTMP($J,"O",D0)="" + S ^BMXTMP($J,BMXOUT)=D0 + S BMXM=BMXM+1 + Q + ; +WPLAN ;Write execution plan + ;Set up Column Names + N BMXLEN,BMXTYP,BMXT,J,BMXSCRT,BMXXT + S I=1 + F BMXT="VARIABLE^","VALUE"_$C(30) D + . S ^BMXTEMP($J,I)=BMXT,BMXLEN(I)=15,BMXTYP(I)="T" + . S I=I+1 + S J=0 + I $D(BMXX) F S J=$O(BMXX(J)) Q:'+J D + . S ^BMXTEMP($J,I)="INDEX("_J_")^" + . S I=I+1 + . S BMXXT(J)=BMXX(J) + . S BMXXT(J)=$P(BMXXT(J)," X BMXSCR") + . S ^BMXTEMP($J,I)=$TR(BMXXT(J),"^","~")_$C(30) + . S:$L(^BMXTEMP($J,I))>BMXLEN(2) BMXLEN(2)=$L(^BMXTEMP($J,I)) + . S I=I+1 + S ^BMXTEMP($J,I)="SCREEN^" + S I=I+1 + S BMXSCRT=$G(BMXSCR) + S BMXSCRT=$P(BMXSCRT,"D:'$D(^BMXTMP") + S ^BMXTEMP($J,I)=$TR(BMXSCRT,"^","~")_$C(30) + S:$L(^BMXTEMP($J,I))>BMXLEN(2) BMXLEN(2)=$L(^BMXTEMP($J,I)) + S I=I+1 + S J=0 + I $D(BMXSCR("C")) F S J=$O(BMXSCR("C",J)) Q:'+J D + . S ^BMXTEMP($J,I)="SCREEN("_J_")^" + . S I=I+1 + . S ^BMXTEMP($J,I)=$TR(BMXSCR("C",J),"^","~")_$C(30) + . S:$L(^BMXTEMP($J,I))>BMXLEN(2) BMXLEN(2)=$L(^BMXTEMP($J,I)) + . S I=I+1 + D COLTYPE + S I=I+1 + D ERRTACK(I) + Q + ; + ; +COLTYPE ;EP - Append column types and widths to output global + ;REQUIRES - BMXLEN(),BMXTYP(),^BMXTEMP + ;IHS/SET/HMW 4-22-2004 Modified to use new schema string + ; + ;"@@@meta@@@BMXIEN|FILE #|DA STRING" + ; + N C + S C=0 + F S C=$O(BMXLEN(C)) Q:'C D + . I BMXLEN(C)>99999 S BMXLEN(C)=99999 + . I BMXLEN(C)=0 S BMXLEN(C)=50 ;Default column length + . S ^BMXTEMP($J,C)=BMXTYP(C)_$$NUMCHAR(BMXLEN(C))_^BMXTEMP($J,C) + Q + ; + ;S ^BXTEMP($J,0)="@@@meta@@@BMXIEN|"_BMXF_"|" ;Last |-piece will be DA string + ;N C + ;S C=0 + ;F S C=$O(BMXLEN(C)) Q:'C D + ;. I BMXLEN(C)>99999 S BMXLEN(C)=99999 + ;. I BMXLEN(C)=0 S BMXLEN(C)=50 ;Default column length + ;. S ^BMXTEMP($J,C)=BMXTYP(C)_$$NUMCHAR(BMXLEN(C))_^BMXTEMP($J,C) + ;Q + ; +ERRTACK(I) ;EP + ; + S ^BMXTEMP($J,I)=$C(31) + S:$D(BMXERR) ^BMXTEMP($J,I)=^BMXTEMP($J,I)_BMXERR + Q + ; +NUMCHAR(BMXN) ;EP + ;---> Returns Field Length left-padded with 0 + ; + N BMXC + S BMXC="00000"_BMXN + Q $E(BMXC,$L(BMXC)-4,$L(BMXC)) + ; + ; +INDEX(BMXFF,BMXRET,BMXXCNT) ; + ;Returns executable enumerator on first where field with an index + ;or "" if no indexed where field + ;IN: BMXFF() + ;OUT: BMXRET() + ; BMXXCNT - size of BMXRET array + ; + N F,BMXNOD,BMXFNUM,BMXFLDNUM,BMXHIT,BMXREF,BMXRNAM,BMXOP,Q,BMXGL + N BMXTMP,BMXTMPV,BMXTMPI,BMXTMPL,BMXTMPN,BMXV,BMXRNOD,BMXTMPP + S BMXXCNT=0 + S Q=$C(34) + I 'BMXFF Q + S F=0,BMXHIT=0 + ; + ;--->Search BMXFF for special case WHERE clause 1 = "0" + ; reset BMXX(1) to return no records + F F=1:1:BMXFF S BMXNOD=BMXFF(F) D Q:$D(BMXERR) Q:BMXHIT + . I ($P(BMXFF(F),"^",2,4)="1^=^0")!($P(BMXFF(F),"^",2,4)="0^=^1") S BMXRET(1)="Q ",BMXHIT=1,BMXXCNT=1 + . Q + Q:BMXHIT + ; + ;Organize the first level into AND- and OR-parts + N BMXR1,BMXR2,BMXE,BMXR3,BMXRNAM + N BMXSTOP,BMXOR + D PLEVEL^BMXSQL3(.BMXFF,.BMXR1,.BMXR2) + ; + N BMXPFF S BMXPFF=0 + S BMXR3=0 + ;Look for an AND-part with only one element. + ; If found, build an iterator on it and quit + F J=1:1:$L(BMXR2,"&") D Q:BMXHIT + . S BMXE=$P(BMXR2,"&",J) + . I +BMXE=BMXE,BMXR1(BMXE,"ELEMENTS")=1 D + . . ;Test index for element + . . F K=BMXR1(BMXE,"BEGIN"):1:BMXR1(BMXE,"END") I "(^)"'[BMXFF(K) D Q ;I'm not sure why this quit was here + . . . Q:$D(BMXFF(K,"JOIN")) + . . . S BMXPFP=K,BMXPFF=0 + . . . D XRTST^BMXSQL3(.BMXFF,K,.BMXR3,.BMXRNAM,.BMXPFP) + . . . I BMXR3 S BMXHIT=1,BMXFF(K,"INDEXED")=1 + . Q:'BMXHIT + . ;Build iterator and quit + . D BLDIT^BMXSQL3(.BMXFF,K,.BMXRNAM,.BMXOR,.BMXPFP) + . S BMXXCNT=1 + . S BMXRET(BMXXCNT)=BMXOR + . Q + Q:BMXHIT + ; + ;None of the single-element AND parts has a good index or + ; there are no single-element AND parts + ;If there are no OR-parts, then there are no good indexes so quit + I $L(BMXR2,"!")=1 Q + ; + ;Test each OR-part for a good index. + ;If an OR-part is multi-element or + ;if one OR-part doesn't have an index + ;then set up to do a table scan and quit + S BMXSTOP=0 + F J=1:1:$L(BMXR2,"!") D Q:BMXSTOP + . S BMXE=$P(BMXR2,"!",J) + . I +BMXE=BMXE D + . . I BMXR1(BMXE,"ELEMENTS")'=1 S BMXSTOP=1 Q ;Multiple elements + . . ;Test index elements + . . F K=BMXR1(BMXE,"BEGIN"):1:BMXR1(BMXE,"END") I "(^)"'[BMXFF(K) D Q + . . . S BMXPFP=K,BMXPFF=0 + . . . D XRTST^BMXSQL3(.BMXFF,K,.BMXR3,.BMXRNAM,.BMXPFP) + . . . I 'BMXR3 S BMXSTOP=1 Q + . . . S BMXFF(K,"INDEXED")=1 + . . . S BMXR1(BMXE,"XREF")=BMXRNAM + ; + ;Build iterator and quit + I BMXSTOP D Q ;One of the elements had no index + . S J=0 F S J=$O(BMXFF(J)) Q:'+J K BMXFF(J,"INDEXED") + S BMXXCNT=0 + F J=1:1:$L(BMXR2,"!") D + . S BMXE=$P(BMXR2,"!",J) + . I +BMXE=BMXE,BMXR1(BMXE,"ELEMENTS")=1 D + . . F K=BMXR1(BMXE,"BEGIN"):1:BMXR1(BMXE,"END") I "(^)"'[BMXFF(K) D Q + . . . D BLDIT^BMXSQL3(.BMXFF,K,BMXR1(BMXE,"XREF"),.BMXOR,.BMXPFP) + . . . S BMXXCNT=BMXXCNT+1 + . . . S BMXRET(BMXXCNT)=BMXOR + . Q + Q + ; + ; + ; +ERROR ;EP - Error processing + ;W !,BMXERR + ;N A + ;S A=0 + ;I $D(I) S A=I + ;D ERROUT(BMXERR,A) + ;B ;ERROR in BMXSQL + Q + ; +ERROUT(BMXERR,I) ;EP + ;---> Save next line for Error Code File if ever used. + ;---> If necessary, use I>1 to avoid overwriting valid data. + D ERRTACK(I) + Q + ; +ERRTRAP ; + ; + K ^BMXTEMP($J) + S ^BMXTEMP($J,0)="T00030M_ERROR"_$C(30) + S BMXZE=$$EC^%ZOSV + S BMXZE=$TR(BMXZE,"^","~") + S ^BMXTEMP($J,1)=BMXZE_$C(30) + S ^BMXTEMP($J,2)=$C(31) + Q diff --git a/m/BMXSQL1.m b/m/BMXSQL1.m new file mode 100644 index 0000000..05ba7f6 --- /dev/null +++ b/m/BMXSQL1.m @@ -0,0 +1,336 @@ +BMXSQL1 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +KW(BMXTK) ;EP + ;Identify and mark keywords in BMXTK + ;MODIFIES BMXTK + ; + N J,BMXSTOP,BMXTMP + ;Combine ORDER BY and GROUP BY into a single token + ; + S J=0 + F S J=$O(BMXTK(J)) Q:'+J D + . S BMXTMP=$$UCASE(BMXTK(J)) + . I BMXTMP="ORDER"!(BMXTMP="GROUP") D + . . I $D(BMXTK(J+1)),$$UCASE(BMXTK(J+1))="BY" D + . . . S BMXTK(J)=BMXTK(J)_" "_BMXTK(J+1) + . . . S BMXTK(J)=$$UCASE(BMXTK(J)) + . . . S BMXTK(BMXTK(J))=J + . . . K BMXTK(J+1) + . . . Q + . . Q + . Q + ; + ;Find SELECT + S J=0,BMXSTOP=0 + F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP + . I $$UCASE(BMXTK(J))="SELECT" D + . . S BMXTK(J)=$$UCASE(BMXTK(J)) + . . S BMXTK("SELECT")=J + . . S BMXSTOP=1 + . . Q + . Q + I '+J S BMXERR="SELECT KEYWORD NOT FOUND" Q + ; + ;DISTINCT + S BMXSTOP=0 + F S J=$O(BMXTK(J)) Q:'+J Q:$$UCASE(BMXTK(J))="FROM" D Q:BMXSTOP + . I $$UCASE(BMXTK(J))="DISTINCT" D + . . S BMXTK("DISTINCT")="TRUE" + . . K BMXTK(J) + . . S J=J-1 + . . S BMXSTOP=1 + . Q + ; + ;FROM + S BMXSTOP=0 + S J=J-1 + F S J=$O(BMXTK(J)) Q:'+J Q:$$UCASE(BMXTK(J))="WHERE" D Q:BMXSTOP + . I $$UCASE(BMXTK(J))="FROM" D + . . S BMXTK(J)=$$UCASE(BMXTK(J)) + . . S BMXTK("FROM")=J + . . S BMXSTOP=1 + . . Q + . Q + ; + I '$D(BMXTK("FROM")) S BMXERR="'FROM' KEYWORD NOT FOUND" Q + ; + ;WHERE + S BMXSTOP=0 + F S J=$O(BMXTK(J)) Q:'+J Q:BMXTK(J)="ORDER BY" Q:BMXTK(J)="GROUP BY" D Q:BMXSTOP + . I $$UCASE(BMXTK(J))="WHERE" D + . . S BMXTK(J)=$$UCASE(BMXTK(J)) + . . S BMXTK("WHERE")=J + . . S BMXSTOP=1 + . Q + ; + ;SHOWPLAN + S J=BMXTK("FROM") + S BMXSTOP=0 + F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP + . I $$UCASE(BMXTK(J))="SHOWPLAN" D + . . S BMXTK("SHOWPLAN")="TRUE" + . . K BMXTK(J) + . . S J=J-1 + . . S BMXSTOP=1 + . Q + ; + ;MAXRECORDS + S J=BMXTK("FROM") + S BMXSTOP=0 + F S J=$O(BMXTK(J)) Q:'+J D Q:BMXSTOP + . I $$UCASE(BMXTK(J))["MAXRECORDS" D + . . S BMXXMAX=+$P(BMXTK(J),":",2)-1 + . . S:+BMXXMAX<0 BMXXMAX=0 + . . K BMXTK(J) + . . S J=J-1 + . . S BMXSTOP=1 + . Q + Q + ; +SCREEN ;EP + ;Set up BMXFG() array of executable screen code + N F,BMXNOD,BMXFNUM,BMXFLDNUM,BMXHIT,BMXREF + N BMXRNAM,BMXRET,BMXOP,Q,BMXPC,BMXV,BMXFLDLO,BMXFLDNO + N BMXGL + S BMXRET="" + S Q=$C(34) + S BMXFG=BMXFF + S BMXFG("C")=0 + I 'BMXFF Q + S F=0,BMXHIT=0 + F F=1:1:BMXFF S BMXNOD=BMXFF(F) D Q:$D(BMXERR) Q:BMXHIT + . I $G(BMXFF(F,"INDEXED"))=1 D Q + . . S BMXFG(F)="1" + . . Q + . I $D(BMXFF(F,"JOIN")) D Q + . . S BMXFG(F)="1" + . . Q + . I "(^)"[BMXFF(F) D Q + . . S BMXFG(F)=BMXFF(F) + . . Q + . I "AND^OR"[BMXFF(F) D Q + . . I BMXFF(F)="AND" S BMXFG(F)="&" Q + . . S BMXFG(F)="!" + . . Q + . S BMXFNUM=$S(+$P(BMXNOD,U):$P(BMXNOD,U),1:$O(^DIC("B",$P(BMXNOD,U),0))) + . I '+BMXFNUM D ;Not a fileman field + . . S BMXFLDNUM=0,BMXFLDNO="" + . . S BMXFLDLO=$P(BMXFF(F),U,2) + . . ; + . E D ;Get fileman field data + . . S BMXGL=^DIC(BMXFNUM,0,"GL") + . . I $D(BMXFF(F,"IEN")) D + . . . S BMXFLDNUM=".001" + . . . S BMXFLDNO="IEN" + . . E D + . . . S BMXFLDNUM=$O(^DD(BMXFNUM,"B",$P(BMXNOD,U,2),0)) + . . . S BMXFLDNO=^DD(BMXFNUM,BMXFLDNUM,0) + . I BMXFLDNO="IEN" D ;BMXIEN field + . . N BMXEXT,C S BMXEXT=0 + . . ;S BMXPC=$P(BMXFLDNO,U,4) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer + . . S BMXFLDLO="D0" + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" + . I $P(BMXFLDNO,U,2)["D" D ;Date field + . . N BMXEXT,C S BMXEXT=0 + . . S BMXPC=$P(BMXFLDNO,U,4) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer + . . S BMXFLDLO="$P($G("_BMXGL_"D0,"_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")" + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" + . I $P(BMXFLDNO,U,2)["S" D ;Set field + . . N BMXEXT,C S BMXEXT=0 + . . S BMXPC=$P(BMXFLDNO,U,4) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer + . . S BMXFLDLO="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")" + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" + . ; + . I $P(BMXFLDNO,U,2)["P" D ;Pointer field + . . N C,BMXEXT + . . S BMXEXT=0 + . . I $P(BMXFF(F),U,5)'=BMXFO(1) D + . . . N R,G,BMXJN,BMXMSCR + . . . S BMXMXCR=1 ;Remove after testing. Find out if the field is from a subfile. + . . . I BMXMXCR D Q + . . . . ;Set up a screen in BMXSCR and in BMXMFL( + . . . . Q + . . . ; + . . . ;Find the node of BMXFF that has the join info + . . . S BMXEXT=1 + . . . S BMXFG("C")=BMXFG("C")+1 + . . . S C=BMXFG("C") + . . . 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 + . . . S BMXJN=BMXFF(G,"JOIN") + . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) + . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 S X=" + . . . S BMXFG("C",C)=BMXJN + . . S BMXFLDLO=$$SCRNP(F,BMXGL,BMXFLDNUM,BMXFLDNO) + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" + . I $P(BMXFLDNO,U,2)["C" D ;Computed field + . . N C + . . S BMXPC=$P(BMXFLDNO,U,5,99) + . . S BMXFG("C")=BMXFG("C")+1 + . . S C=BMXFG("C") + . . ;If computed field not in primary file, connect navigation code + . . I $P(BMXFF(F),U,5)'=BMXFO(1) D + . . . ;Find the node of BMXFF that has the join info + . . . N R,G,BMXJN + . . . 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 + . . . S BMXJN=BMXFF(G,"JOIN") + . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) + . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 " + . . . S BMXJN=BMXJN_BMXPC + . . . S BMXFF(F,0)=$P(BMXFF(F,0),U,1,4) + . . . S $P(BMXFF(F,0),U,5)=BMXJN + . . . S BMXPC=BMXJN + . . S BMXFG("C",C)=BMXPC + . . S BMXFLDLO="BMXSCR(""X"","_C_")" + . I $P(BMXFLDNO,U,2)["N" D ;Numeric field + . . N BMXEXT,C S BMXEXT=0 + . . S BMXPC=$P(BMXFLDNO,U,4) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D EXP ;Extended pointer + . . S BMXFLDLO="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")" + . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXFLDLO,BMXFLDLO="BMXSCR(""X"","_C_")" + . ; + . I $P(BMXFLDNO,U,2)["F" D ;Free Text field + . . N BMXEXT,C S BMXEXT=0,C=0 + . . S BMXPC=$P(BMXFLDNO,U,4) + . . I $P(BMXFF(F),U,5)'=BMXFO(1) S BMXEXT=1 D + . . . N R,G,BMXJN + . . . S BMXFG("C")=BMXFG("C")+1 + . . . S C=BMXFG("C") + . . . 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 + . . . S BMXJN=BMXFF(G,"JOIN") + . . . S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) + . . . S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN + . . . S BMXJN=BMXJN_"I +D0 S X=" + . . . S BMXFG("C",C)=BMXJN + . . . S BMXFLDLO="BMXSCR(""X"","_C_")" + . . I $P(BMXFLDNO,U,4)["E" D + . . . N BMXPC2,BMXTMP + . . . S BMXPC2=$P(BMXPC,"E",2) + . . . S BMXTMP="$E("_BMXGL_"D0,"_$P(BMXPC,";")_"),"_$P(BMXPC2,",")_","_$P(BMXPC2,",",2)_")" + . . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXTMP + . . . E S BMXFLDLO=BMXTMP + . . E D + . . . N BMXTMP + . . . S BMXTMP="$P("_BMXGL_"D0,"_$P(BMXPC,";")_"),U,"_$P(BMXPC,";",2)_")" + . . . S BMXTMP="$S($D("_BMXGL_"D0,"_$P(BMXPC,";")_")):"_BMXTMP_",1:"""")" + . . . I BMXEXT S BMXFG("C",C)=BMXFG("C",C)_BMXTMP + . . . E S BMXFLDLO=BMXTMP + . ; + . S BMXOP=$P(BMXNOD,U,3) + . S BMXV=$P(BMXFF(F),U,4) + . I "<^>^=^["[BMXOP D + . . I BMXOP=">",BMXV?.A S BMXOP="]" + . . I BMXOP="<",BMXV?.A S BMXOP="']" + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" + . . Q + . I "<>"=BMXOP D + . . S BMXOP="'=" + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" + . I ">="=BMXOP D + . . I BMXV="" S BMXRET="(I 1)" Q + . . I +BMXV=BMXV D Q + . . . S BMXOP="'<" + . . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" + . . S BMXV=$$DECSTR^BMXSQL2(BMXV) + . . S BMXOP="]" + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" + . I "<="=BMXOP D + . . I BMXV="" S BMXRET="(I 0)" Q + . . I +BMXV=BMXV D Q + . . . S BMXOP="'>" + . . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" + . . S BMXV=$$INCSTR^BMXSQL2(BMXV) + . . S BMXOP="']" + . . S BMXRET="("_BMXFLDLO_BMXOP_Q_BMXV_Q_")" + . I BMXOP="BETWEEN" D + . . I +$P(BMXV,"~")'=$P(BMXV,"~") D ;BMXV a string + . . . N W,X,Y,Z + . . . S X=$P(BMXV,"~") + . . . S Y=$E(X,1,$L(X)-1) + . . . S Z=$E(X,$L(X)) + . . . S Z=$A(Z) + . . . S Z=Z-1 + . . . S Z=$C(Z) + . . . S W=Y_Z + . . . S $P(BMXV,"~")=W + . . . S BMXRET="(("_BMXFLDLO_"]"_Q_$P(BMXV,"~")_Q_")&("_BMXFLDLO_"']"_Q_$P(BMXV,"~",2)_Q_"))" + . . E D ;BMXV a number + . . . S BMXRET="(("_BMXFLDLO_"'<"_$P(BMXV,"~")_")&("_BMXFLDLO_"'>"_$P(BMXV,"~",2)_"))" + . . Q + . I BMXOP="LIKE" D + . . S BMXRET="("_BMXFLDLO_"?1"_Q_BMXV_Q_".E)" + . I BMXRET]"" D + . . S BMXFG(F)=BMXRET + . . Q + . ;TODO: Pointer fields + . ;TODO: Computed fields + . ;TODO: Sets of codes + . ;TODO: Dates + . Q + Q + ; +SCRNP(F,BMXGL,BMXFLDNU,BMXFLDNO) ; + ;Requires BMXFF() + ;Sets up expression for pointer field + N BMX,BMXCOR,BMXRET,BMXPC + S BMXPC=$P(BMXFLDNO,U,4) + S BMXCOR="$P($G("_BMXGL_"D0,"_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")" + S BMXRET=BMXCOR + Q:$D(BMXFF(F,"INTERNAL")) BMXRET + S BMXFNUM=$P(BMXFLDNO,U,2) + S BMXFNUM=+$P(BMXFNUM,"P",2) + S BMXGL=^DIC(BMXFNUM,0,"GL") + S BMXFLDNUM=".01" + S BMXFLDNO=^DD(BMXFNUM,BMXFLDNUM,0) + F D:$P(BMXFLDNO,U,2)["P" Q:$P(BMXFLDNO,U,2)'["P" + . S BMXPC=$P(BMXFLDNO,U,4) + . S BMXRET="$P($G("_BMXGL_BMXRET_","_Q_$P(BMXPC,";")_Q_")),U,"_$P(BMXPC,";",2)_")" + . S BMXFNUM=$P(BMXFLDNO,U,2) + . S BMXFNUM=+$P(BMXFNUM,"P",2) + . S BMXGL=^DIC(BMXFNUM,0,"GL") + . S BMXFLDNUM=".01" + . S BMXFLDNO=^DD(BMXFNUM,BMXFLDNUM,0) + ;B ;SCRN2 After chain + ;I 0 D ;$P(BMXFLDNO,U,2)["D" D ;Pointer to a date + ;. Q:+$G(BMXFF(F,"INDEXED")) ;Dates converted when iterator built + ;. N BMXD,J + ;. S BMXD=$P(BMXFF(F),U,4) + ;. S %DT="T" + ;. F J=1:1:$L(BMXD,"~") D + ;. . S X=$P(BMXD,"~",J) + ;. . D ^%DT + ;. . S $P(BMXD,"~",J)=Y + ;. S $P(BMXFF(F),U,4)=BMXD + S BMXRET="$P($G("_BMXGL_BMXRET_",0)),U,1)" + S BMXRET="$S(+"_BMXCOR_":"_BMXRET_",1:"""")" + Q BMXRET + ; +CASE(BMXTK) ;EP + ;Convert keywords to uppercase + N J + S J=0 + F S J=$O(BMXTK(J)) Q:'+J D + . F K="DISTINCT","SELECT","WHERE","FROM","SHOWPLAN" D + . . I $$UCASE(BMXTK(J))=K S BMXTK(J)=$$UCASE(BMXTK(J)) + . Q + Q + ; +UCASE(X) ;EP Convert X to uppercase + F %=1:1:$L(X) S:$E(X,%)?1L X=$E(X,0,%-1)_$C($A(X,%)-32)_$E(X,%+1,999) + Q X + ; +EXP ;Extended pointer + N R,G,BMXJN + S BMXEXT=1 + S BMXFG("C")=BMXFG("C")+1 + S C=BMXFG("C") + 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 + S BMXJN=BMXFF(G,"JOIN") + S BMXJN=$P(BMXJN,"IEN0",1)_"D0"_$P(BMXJN,"IEN0",2) + S BMXJN="S X="""","_BMXFF(G,"JOIN","IEN")_"=D0 N D0 "_BMXJN_"I +D0 S X=" + S BMXFG("C",C)=BMXJN + Q diff --git a/m/BMXSQL2.m b/m/BMXSQL2.m new file mode 100644 index 0000000..340841a --- /dev/null +++ b/m/BMXSQL2.m @@ -0,0 +1,97 @@ +BMXSQL2 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +FLDFILE(BMXIN) ;EP - Returns name of file containing field BMXIN + ;in the form FILE^FIELD^FILENUMBER^FIELDNUMBER + ;Based on data contained in the BMXF() array + ;BMXIN can be either an unambiguous field name or FILE.FIELDNAME + ; + N C,BMXA,BMXB,BMXRET,BMXFILN,BMXFLDN,BMXFILNA + S BMXRET="" + I BMXTMPLT D Q BMXRET + . S BMXFILNA=BMXIN + . I '$D(BMXF(BMXFILNA)) S BMXERR="FILE NOT FOUND" S BMXRET="" D ERROR^BMXSQL Q + . I BMXF(BMXFILNA)'=BMXFO(1) S BMXERR="TEMPLATES ONLY SUPPORTED ON PRIMARY FILE" D ERROR^BMXSQL Q + . S BMXRET=BMXFILNA_U_"BMXIEN"_U_BMXF(BMXFILNA)_U_".001" + ; + I BMXIN["." D Q BMXRET + . S BMXFILNA=$P(BMXIN,".") ;File Name + . I '$D(BMXF(BMXFILNA)) S BMXERR="FILE NOT FOUND" S BMXRET="" D ERROR^BMXSQL Q + . S BMXRET=BMXFILNA_U_$P(BMXIN,".",2) + . S $P(BMXRET,U,3)=BMXF(BMXFILNA) + . S BMXFLDN=0 + . I $P(BMXIN,".",2)'="",$D(^DD(BMXF(BMXFILNA),"B",$P(BMXIN,".",2))) D + . . S BMXFLDN=$O(^DD(BMXF(BMXFILNA),"B",$P(BMXIN,".",2),0)) + . I BMXIN["BMXIEN" S BMXFLDN=".001" + . I '+BMXFLDN S BMXERR="FIELD NOT FOUND",BMXRET="" D ERROR^BMXSQL Q + . S $P(BMXRET,U,4)=BMXFLDN + . Q + ;Loop through files in BMXF to locate field name + S C=0,BMXA="" + I 'BMXIEN F S BMXA=$O(BMXF(BMXA)) Q:BMXA="" D Q:$D(BMXERR) + . I $D(^DD(BMXF(BMXA),"B",BMXIN)) S BMXRET=BMXA_U_BMXIN D Q:$D(BMXERR) + . . S C=C+1 + . . I C>1 S BMXERR="AMBIGUOUS FIELD NAME" D ERROR^BMXSQL Q + . . Q + . Q + I BMXIEN D + . S BMXA=BMXFO(1) + . S BMXA=BMXFNX(BMXA) + . S BMXRET=BMXA_U_BMXIN + . S C=1 + I C=0 D Q BMXRET + . S BMXRET="0^"_BMXIN ;String or numeric literal + S BMXFILNA=$P(BMXRET,U) + S BMXFILN=BMXF(BMXFILNA) + S $P(BMXRET,U,3)=BMXFILN + I $D(^DD(BMXFILN,"B",BMXIN)) D + . S BMXFLDN=$O(^DD(BMXFILN,"B",BMXIN,0)) + I BMXIEN S BMXFLDN=".001" + I '+BMXFLDN S BMXERR="FIELD NOT FOUND",BMXRET="" D ERROR^BMXSQL Q + S $P(BMXRET,U,4)=BMXFLDN + Q BMXRET + ; +DECSTR(BMXSTR) ;EP + ;Decrements string collation value by 1 + ; + N A,E,S,L,BMXRET + I BMXSTR="" Q BMXSTR + S L=$L(BMXSTR) + S E=$E(BMXSTR,L) + S B=$E(BMXSTR,1,L-1) + S A=$A(E) + S A=A-1 + S E=$C(A) + S BMXRET=B_E + Q BMXRET + ; +INCSTR(BMXSTR) ;EP + ;Increments string collation value by 1 + Q BMXSTR_$C(1) + ; +SETX(BMXX,BMXFG,BMXSCR) ;EP + ;Set up executable screen code + ;by assembling pieces in BMXFG + ;and attach to executable iterator(s) + ; + ;IN: BMXFG() + ; BMXX() -- modified + ;OUT: BMXSCR + ; + N J + Q:'$D(BMXFG) + S BMXSCR="" + S J=0 F S J=$O(BMXX(J)) Q:'+J D + . S BMXX(J)=BMXX(J)_"X BMXSCR" + F J=1:1:BMXFG S BMXSCR=BMXSCR_BMXFG(J) + S BMXSCR=$S(BMXSCR]"":"I "_BMXSCR_" ",1:"") + S BMXSCR=BMXSCR_"D:'$D(^BMXTMP($J,""O"",D0)) OUT^BMXSQL" + I BMXFG("C") D + . N C + . S C=BMXFG("C") + . S BMXSCR("C")="F BMXC=1:1:"_C_" X BMXSCR(""C"",BMXC) S BMXSCR(""X"",BMXC)=X" + . F C=1:1:BMXFG("C") S BMXSCR("C",C)=BMXFG("C",C) + . S BMXSCR="X BMXSCR(""C"") "_BMXSCR + ; + Q diff --git a/m/BMXSQL3.m b/m/BMXSQL3.m new file mode 100644 index 0000000..854ef94 --- /dev/null +++ b/m/BMXSQL3.m @@ -0,0 +1,330 @@ +BMXSQL3 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +PLEVEL(BMXFF,BMXLVL,BMXRET) ;EP + ;Analyze WHERE statement according to paren level + ;Return a string to guide building of iterator(s) + ; + ;Basically, count the number of OR clauses on the + ;same paren level + ;IN: BMXFF() + ;OUT: BMXLVL(), BMXRET + ; + ;BMXRET = 1&/!2&/!...&/!n clauses + ;BMXLVL(E,"BEGIN")=Index where element E begins + ;BMXLVL(E,"END") =Index where element E ends + ;BMXLVL(E,"ELEMENTS")=Number of subelements in element E + ; + N BMXNOR,BMXNAND,J,C,BMXTMP + N E,L,BMXCNT + ;Test for no ORs or no ANDs + S BMXNOR=1,BMXNAND=1 + S J=0 F S J=$O(BMXFF(J)) Q:'+J D ;Q:'BMXNOR Q:'BMXNAND + . I BMXFF(J)="OR" S BMXNOR=0 + . I BMXFF(J)="AND" S BMXNAND=0 + . Q + ;If no ORs or no ANDs then take all parens out of BMXFF + I ((BMXNOR)!(BMXNAND)) D + . S:$D(BMXFF("INDEX")) BMXTMP("INDEX")=BMXFF("INDEX") + . S J=0,C=0 F S J=$O(BMXFF(J)) Q:'+J D:"(^)"'[BMXFF(J) + . . S C=C+1 + . . S BMXTMP(C)=BMXFF(J) + . . S:$D(BMXFF(J,0)) BMXTMP(C,0)=BMXFF(J,0) + . . S:$D(BMXFF(J,"INTERNAL")) BMXTMP(J,"INTERNAL")=BMXFF(J,"INTERNAL") + . . S:$D(BMXFF(J,"TYPE")) BMXTMP(C,"TYPE")=BMXFF(J,"TYPE") + . . S:$D(BMXFF(J,"IEN")) BMXTMP(C,"IEN")=BMXFF(J,"IEN") + . . S:$D(BMXFF(J,"JOIN")) BMXTMP(C,"JOIN")=BMXFF(J,"JOIN") + . . S:$D(BMXFF(J,"JOIN","IEN")) BMXTMP(C,"JOIN","IEN")=BMXFF(J,"JOIN","IEN") + . . ;I $D(BMXFF(J,"JOIN")) D + . . ;. N K S K=0 F S K=$O(BMXFF(J,"JOIN",K)) Q:'+K D + . . ;. . N L S L=0 F S L=$O(BMXFF(J,"JOIN",K,L)) Q:'+L D + . . ;. . . S BMXTMP(C,"JOIN",K,L)=BMXFF(J,"JOIN",K,L) + . . I $D(BMXFF(J,"SET")) D + . . . N BMXSS + . . . S BMXSS="" F S BMXSS=$O(BMXFF(J,"SET",BMXSS)) Q:BMXSS="" D + . . . . S BMXTMP(C,"SET",BMXSS)=BMXFF(J,"SET",BMXSS) + . K BMXFF + . I $D(BMXTMP("INDEX")) S BMXFF("INDEX")=BMXTMP("INDEX") + . S J=0 F S J=$O(BMXTMP(J)) Q:'+J D + . . S BMXFF(J)=BMXTMP(J) + . . S:$D(BMXTMP(J,0)) BMXFF(J,0)=BMXTMP(J,0) + . . S:$D(BMXTMP(J,"TYPE")) BMXFF(J,"TYPE")=BMXTMP(J,"TYPE") + . . I $D(BMXTMP(J,"JOIN")) S BMXFF(J,"JOIN")=BMXTMP(J,"JOIN") S:$D(BMXTMP(J,"JOIN","IEN")) BMXFF(J,"JOIN","IEN")=BMXTMP(J,"JOIN","IEN") S BMXFJ("JOIN",+$P($P(BMXFF(J,0),U,2),"P",2))=J + . . ;I $D(BMXTMP(J,"JOIN")) D + . . ;. N K S K=0 F S K=$O(BMXTMP(J,"JOIN",K)) Q:'+K D + . . ;. . N L S L=0 F S L=$O(BMXTMP(J,"JOIN",K,L)) Q:'+L D + . . ;. . . S BMXFF(J,"JOIN",K,L)=BMXTMP(J,"JOIN",K,L) + . . I $D(BMXTMP(J,"SET")) D + . . . N BMXSS + . . . S BMXSS="" F S BMXSS=$O(BMXTMP(J,"SET",BMXSS)) Q:BMXSS="" D + . . . . S BMXFF(J,"SET",BMXSS)=BMXTMP(J,"SET",BMXSS) + . . I $D(BMXTMP(J,"INTERNAL")) S BMXFF(J,"INTERNAL")=BMXTMP(J,"INTERNAL") + . . I $D(BMXTMP(J,"IEN")) S BMXFF(J,"IEN")=BMXTMP(J,"IEN") + . S BMXFF=C + . Q + ; + ;Remove excess leading and trailing parens + ;Find close paren corresponding to BMXFF(1) + ;If its the last paren, then remove the first and last parens + ;Else, quit + N BMXEND + S BMXEND=0 + F Q:'((BMXFF(1)="(")&(BMXFF(BMXFF)=")")) Q:BMXEND D + . S L=1,J=1 + . F S J=$O(BMXFF(J)) Q:'+J D:"(^)"[BMXFF(J) Q:BMXEND + . . I BMXFF(J)="(" S L=L+1 Q + . . I BMXFF(J)=")" S L=L-1 + . . I L=0,J0 D Q + . . . S BMXPFF(BMXPFF,1)=BMXREF + . . . S $P(BMXPFF(BMXPFF,1),U,2)=BMXRNAM + . . . S BMXPFP(BMXPFP,BMXPFF,1)=BMXREF + . . . S $P(BMXPFP(BMXPFP,BMXPFF,1),U,2)=BMXRNAM + . . Q + . Q + Q + ; + ; +BLDIT(BMXFF,F,BMXRNAM,BMXRET,BMXPFP) ;EP - Build iterator + ; + K BMXRET + N BMXNOD,BMXOP,BMXV,BMXGL,Q + S BMXNOD=BMXFF(F) + S BMXOP=$P(BMXNOD,U,3) + S BMXV=$P(BMXNOD,U,4) + S BMXGL=$P(BMXNOD,U,7,8) + S Q=$C(34) + I $D(BMXPFP(F)) D BLDIT2 Q ;Pointer + ;TODO Set BMXV to the pointer or set or FM date that corresponds + ; to the user-entered value + I $D(BMXFF(F,"IEN")),BMXFF(F,"IEN")="TEMPLATE" D Q + . N BMXTNUM + . S BMXTNUM=$O(^DIBT("B",$P(BMXFF(F),U,4),0)) + . S BMXRET="S D0=0 F S D0=$O(^DIBT("_BMXTNUM_",1,D0)) Q:'+D0 Q:BMXM>BMXXMAX " + . Q + I BMXOP="=" D Q + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" Q:'+D0 Q:BMXM>BMXXMAX " Q + . S BMXRET="S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D0)) Q:D0="""" Q:BMXM>BMXXMAX " + . Q + ; + I BMXOP=">=" D Q + . I $D(BMXFF(F,"IEN")) S BMXV=BMXV-1,BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q + . N BMXTMP + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" + . S @BMXTMP + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + ; + I BMXOP=">" D Q + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + ; + I BMXOP="<>" D Q + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 I D0'="_BMXV_" Q:BMXM>BMXXMAX " Q + . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + ; + I BMXOP="<=" D Q + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_BMXV_" Q:BMXM>BMXXMAX " Q + . N BMXTMP + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))" + . S @BMXTMP + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + ; + I BMXOP="<" D Q + . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0'<"_BMXV_" Q:BMXM>BMXXMAX " Q + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + ; + I BMXOP="BETWEEN" D Q ;changed '< to > (inclusive BETWEEN) + . I $D(BMXFF(F,"IEN")) D Q + . . S BMXRET="S D0="_(+$P(BMXV,"~")-1)_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX " + . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number + . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + . E D ;BMXV is a string + . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + ; + I BMXOP="LIKE" D Q + . N BMXTMP,BMXV1 + . S BMXV1=BMXV + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" + . S @BMXTMP + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " + Q + ; +BLDIT2 ;Pointer + N BMXPS,J + S BMXPS=$O(BMXPFP(F,999),-1) + S BMXNOD=BMXPFP(F,BMXPS) + S BMXGL=$P(BMXNOD,U,7,8) + I BMXOP="=" D + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . S BMXRET="S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + I BMXOP=">" D + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + I BMXOP=">=" D + . N BMXTMP + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" + . S @BMXTMP + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + I BMXOP="<=" D + . N BMXTMP + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))" + . S @BMXTMP + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + I BMXOP="<>" D + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + I BMXOP="<" D + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + I BMXOP="BETWEEN" D + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number + . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + . E D ;BMXV is a string + . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q + . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + I BMXOP="LIKE" D + . N BMXTMP,BMXV1 + . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) + . S BMXV1=BMXV + . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" + . S @BMXTMP + . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " + ; + F J=BMXPS-1:-1:0 D + . S BMXNOD=BMXPFP(F,J) + . S BMXGL=$P(BMXNOD,U,7,8) + . S BMXRNAM=$P(BMXPFP(F,J,1),U,2) + . S BMXRET=BMXRET_"S D"_J_"=0 F S D"_J_"=$O("_BMXGL_Q_BMXRNAM_Q_",D"_(J+1)_",D"_J_")) Q:'+D"_J_" Q:BMXM>BMXXMAX " + Q + ;TODO: Computed fields + ;TODO: Sets of codes + ;TODO: User-specified index + Q diff --git a/m/BMXSQL4.m b/m/BMXSQL4.m new file mode 100644 index 0000000..27ae9af --- /dev/null +++ b/m/BMXSQL4.m @@ -0,0 +1,33 @@ +BMXSQL4 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +JOIN ;EP - Join processing + ;Create a pointer chain back to the primary file + ;or to a reverse pointer file, E.G.: + ;Either executable code or an expression that returns the + ;IEN of the terminal pointed-to file + ; + ; S IEN1=$P(^DIZ(1000,IEN2,0),U,4) + ; I +IEN1 S IEN=$P(^AUTTLOC(IEN1,0),U,23) + ; + Q:'$D(BMXFJ("JOIN")) + N C,D,E,BMXSTOP,BMXPTF,BMXPTG,BMXPTL,BMXPTN,BMXPTP,BMXPTC + S C=0 F S C=$O(BMXFF(C)) Q:'+C D + . Q:'$D(BMXFF(C,"JOIN")) + . S BMXPTL=1,BMXPTC="",D=C ;Pointer level + . F S BMXPTF=$P(BMXFF(D),U,5) D Q:BMXPTF=BMXFO(1) + . . S BMXPTG=$P(BMXFF(D),U,7,99) ;Pf Global + . . S BMXPTN=$P(BMXFF(D,0),U,4) ;Pf Node + . . S BMXPTP=$P(BMXPTN,";",2) ;Pf Piece + . . S BMXPTN=$P(BMXPTN,";") + . . S BMXPTC="I +IEN"_BMXPTL_" S IEN"_(BMXPTL-1)_"=$P($G("_BMXPTG_"IEN"_BMXPTL_","_BMXPTN_")),U,"_BMXPTP_") "_BMXPTC + . . S BMXPTL=BMXPTL+1 + . . ;S D To the index of the pointed to file's entry in BMXFF + . . Q:BMXPTF=BMXFO(1) + . . S E=0,BMXSTOP=0 F S E=$O(BMXFF(E)) Q:'+E Q:BMXSTOP D + . . . I $D(BMXFF(E,0)),+$P($P(BMXFF(E,0),U,2),"P",2)=BMXPTF S D=E,BMXSTOP=1 Q + . . . I $D(BMXFF(E,0)),BMXPTF=9000001,+$P($P(BMXFF(E,0),U,2),"P",2)=2 S D=E,BMXSTOP=1 Q ;IHS auto join PATIENT to VA PATIENT + . S BMXFF(C,"JOIN")=BMXPTC + . S BMXFF(C,"JOIN","IEN")="IEN"_(BMXPTL-1) + Q diff --git a/m/BMXSQL5.m b/m/BMXSQL5.m new file mode 100644 index 0000000..b8ff450 --- /dev/null +++ b/m/BMXSQL5.m @@ -0,0 +1,181 @@ +BMXSQL5 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +SELECT ;EP - Get field names into BMXFLD("NAME")="FILE#^FIELD#" + N BMXA,BMXB,BMXS,BMXSINGL + N BMXINTNL + S T=$G(BMXTK("SELECT")) + I '+T S BMXERR="'SELECT' CLAUSE NOT FOUND" D ERRTACK^BMXSQL(1) Q + S BMXFLD=0 + N BMXOFF,BMXGS1,BMXLVL + F S T=$O(BMXTK(T)) Q:'+T Q:T=$G(BMXTK("FROM")) I BMXTK(T)'="," S BMXOFF=1,BMXLVL=0 D S1 Q:$D(BMXERR) + Q + ; +SALIAS ; + Q:'+$O(BMXTK(T)) + N V + S V=T+1 + Q:$G(BMXTK(V))="," + Q:V=$G(BMXTK("FROM")) + S:BMXTK(V)["'" BMXTK(V)=$P(BMXTK(V),"'",2) + S BMXFLDA(BMXFILE,BMXFLDN)=BMXTK(V) + S $P(BMXFLDO(BMXFLDO-1),U,6)=BMXTK(V) + S T=T+1 + Q + ; +S1 ; + S BMXTK(T)=$TR(BMXTK(T),"_"," ") + ;Check for INTERNAL[ modifier + S BMXGS1=0 + S BMXINTNL="E" + I BMXTK(T)["[" S BMXINTNL="I",BMXTK(T)=$P(BMXTK(T),"[",2),BMXTK(T)=$P(BMXTK(T),"]",1) + ;If explicit file name + S BMXSINGL=0 + I BMXTK(T)["." D G:BMXGS1 S1 G:BMXSINGL NOTEXP Q + . ;Before FILE.FIELD Parsing + . S BMXA=$P(BMXTK(T),".",1,BMXOFF) ;File Name + . I '$D(BMXF(BMXA)) D Q:$D(BMXERR) Q:BMXSINGL + . . I $D(^DD(BMXFO(1),"B",BMXTK(T))),BMXOFF=1 S BMXSINGL=1 Q + . . S BMXERR="FILE NOT FOUND" D ERRTACK^BMXSQL(1) Q + . S BMXB=$P(BMXTK(T),".",1+BMXOFF,99) ;Field Name TODO: Test here for multiple in extended pointer -- FILE.MULTIPLE.FIELD + . N BMXLAST S BMXLAST=0 + . I $L(BMXB,".")>1 D Q:'BMXLAST ;Multiple + . . N BMXFNUM,BMXFNAM,BMXFNOD,BMXSUBFN,BMXUPFN,BMXGL,W,BMXFOUND + . . ;Multiple or Field-name with period? + . . S BMXFOUND=0 + . . F W=1:1:$L(BMXTK(T),".") D Q:BMXFOUND + . . . S BMXOFF=BMXOFF+1 + . . . I $D(^DD(BMXF(BMXA),"B",$P(BMXB,".",1,W))) D + . . . . S BMXFNAM=$P(BMXB,".",1,W) + . . . . S BMXFOUND=1 + . . . . S:W=$L(BMXB,".") BMXLAST=1 + . . . . S BMXLVL=BMXLVL+1 + . . ; + . . Q:BMXLAST + . . S BMXF=BMXF+1 + . . S BMXFNUM=$O(^DD(BMXF(BMXA),"B",BMXFNAM,0)) ;FieldNumber + . . S BMXFNOD=^DD(BMXF(BMXA),BMXFNUM,0) + . . S BMXGL=$P(BMXFNOD,U,4),BMXGL=$P(BMXGL,";") + . . S BMXSUBFN=+$P(BMXFNOD,U,2) ;Subfile Number + . . S BMXUPFN=^DD(BMXSUBFN,0,"UP") ;Parent File Number + . . D SETMFL(BMXUPFN,BMXSUBFN,BMXGL,BMXLVL,0) + . . S BMXGS1=1 + . S:BMXB["'" BMXB=$P(BMXB,"'",2) + . I BMXB="BMXIEN" D Q + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" + . . D SELECT1 + . I BMXB="*" D Q ;All fields in file BMXA + . . ;BMXIEN Has to be first because ADO doesn't handle it well if a DATE type column is returned first + . . S BMXB="BMXIEN" + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" + . . D SELECT1 + . . S BMXB=0 F S BMXB=$O(^DD(BMXF(BMXA),"B",BMXB)) Q:BMXB="" D + . . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) + . . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) + . . . D SELECT1 + . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) + . I '$D(^DD(BMXF(BMXA),"B",BMXB)) S BMXERR="FIELD NOT FOUND" D ERRTACK^BMXSQL(1) Q + . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) + . D SELECT1 + . Q + ; +NOTEXP ;File not explicit so Loop through files in BMXF to locate field name + ; + I BMXTK(T)["'" S BMXTK(T)=$P(BMXTK(T),"'",2) + S C=0,BMXA="" + I BMXTK(T)="BMXIEN" D Q + . S BMXB=BMXTK(T) + . S BMXA=BMXFO(1) ;File defaults to first named file in FROM + . S BMXA=BMXFNX(BMXA) + . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) + . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" + . D SELECT1 + F S BMXA=$O(BMXF(BMXA)) Q:BMXA="" D Q:$D(BMXERR) + . S BMXB=BMXTK(T) + . I BMXB="*" D Q ;All fields in file BMXA + . . S BMXB="BMXIEN" + . . S BMXA=BMXFO(1) ;File defaults to first named file in FROM + . . S BMXA=BMXFNX(BMXA) + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=".001" + . . D SELECT1 + . . S BMXB=0 F S BMXB=$O(^DD(BMXF(BMXA),"B",BMXB)) Q:BMXB="" D + . . . S BMXS=BMXA_"."_BMXB + . . . S BMXFLD(BMXS)=BMXF(BMXA) + . . . S $P(BMXFLD(BMXS),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) + . . . D SELECT1 + . . . S C=1 + . I $D(^DD(BMXF(BMXA),"B",BMXTK(T))) D Q:$D(BMXERR) + . . S C=C+1 + . . I C>1 S BMXERR="AMBIGUOUS FIELD NAME" D ERRTACK^BMXSQL(1) Q + . . S BMXB=BMXTK(T) ;Field Name + . . I BMXB["'" S BMXB=$P(BMXB,"'",2) + . . S BMXFLD(BMXA_"."_BMXB)=BMXF(BMXA) + . . S $P(BMXFLD(BMXA_"."_BMXB),"^",2)=$O(^DD(BMXF(BMXA),"B",BMXB,0)) + . . D SELECT1 + . . Q + . Q + I C=0 S BMXERR="FIELD NOT FOUND" D ERRTACK^BMXSQL(1) Q + Q + ; +SELECT1 ; + N BMXGNOD,BMXFILE,BMXGNOD1 + S BMXFLDN=$P(BMXFLD(BMXA_"."_BMXB),"^",2) + S BMXFILE=$P(BMXFLD(BMXA_"."_BMXB),U) + S BMXFLDN(BMXFILE,BMXFLDN)=BMXB + I BMXFLDN=".001" S BMXGNOD="IEN",BMXGNOD1="",$P(BMXGNOD1,U,2)="N" + E S BMXGNOD1=^DD(BMXFILE,BMXFLDN,0) + S BMXGNOD=$P(BMXGNOD1,"^",4) + S $P(BMXFLD(BMXA_"."_BMXB),"^",3)=$P(BMXGNOD,";") + S $P(BMXFLD(BMXA_"."_BMXB),"^",4)=$P(BMXGNOD,";",2) + S $P(BMXFLD(BMXA_"."_BMXB),"^",5)=BMXINTNL + S BMXFLDO(BMXFLD)=BMXFILE_"^"_BMXFLDN_"^"_BMXINTNL + I +$P(BMXGNOD1,U,2) D ;Check for WP + . S BMXGNOD1=+$P(BMXGNOD1,U,2) + . Q:'$D(^DD(BMXGNOD1,.01,0)) + . I $P(^DD(BMXGNOD1,.01,0),U,2)["W" S $P(BMXFLDO(BMXFLD),U,4)="W" + ;HMW20030630 Modified next line to make data type of Internal[] for pointer an Integer. + I $P(BMXGNOD1,U,2)["P" S BMXGNOD1=$$PTYPE(BMXGNOD1) Q:BMXGNOD1="" S:$G(BMXINTNL)="I" $P(BMXGNOD1,U,2)="N" ;I BMXGNOD1="" then Pointed-to file doesn't exist + I $P(BMXGNOD1,U,2)["D" S $P(BMXFLDO(BMXFLD),U,5)="D" + I $P(BMXGNOD1,U,2)["N" D + . N Z + . S Z=$P(BMXGNOD1,U,2) + . I +$P(Z,",",2)=0 S $P(BMXFLDO(BMXFLD),U,5)="I" ;Integer + S BMXFLDOX(BMXFILE,BMXFLDN,BMXINTNL)=BMXFLD + S BMXFLD=BMXFLD+1 + S BMXFLDO=BMXFLD + D SALIAS + Q + ; +SETMFL(BMXUPFN,BMXSUBFN,BMXGL,BMXOFF,BMXOTM) ;EP + ; + ;BMXOTM = One-To-Many + N BMXUPG + S BMXMFL("PARENT",BMXSUBFN)=BMXUPFN + S BMXMFL(BMXUPFN,"SUBFILE",BMXSUBFN)="" + S BMXMFL("SUBFILE",BMXUPFN,BMXSUBFN)="" + S BMXUPG=BMXMFL(BMXUPFN,"GLOC") ;Parent File Global Set in FROM clause + S BMXFNAM=BMXA_"."_BMXFNAM ;TODO: Regression test this line with OTM + I 'BMXOTM S BMXMFL(BMXSUBFN,"GLOC")=BMXUPG_"IEN"_(BMXOFF-1)_","_$C(34)_BMXGL_$C(34)_"," + E S BMXMFL(BMXSUBFN,"GLOC")=BMXGL,BMXMFL(BMXSUBFN,"OTM")="" + S BMXMFL(BMXSUBFN,"MULT")="S IEN"_BMXOFF_"=0 F S IEN"_BMXOFF_"=$O("_BMXMFL(BMXSUBFN,"GLOC")_"IEN"_BMXOFF_")) Q:'+IEN"_BMXOFF_" " + I $D(BMXMFL(BMXUPFN,"MULT")) S BMXMFL(BMXSUBFN,"MULT")=BMXMFL(BMXUPFN,"MULT")_" "_BMXMFL(BMXSUBFN,"MULT") + I 'BMXOTM S BMXMFL(BMXSUBFN,"IENS")="N J S BMXIENS="""" F J=0:1:"_BMXOFF_" S BMXIENS=@(""IEN""_J)_"",""_BMXIENS" + E S BMXMFL(BMXSUBFN,"IENS")="N J S BMXIENS="""" S J=1 S BMXIENS=@(""IEN""_J)_"",""_BMXIENS" + S BMXMFL(BMXSUBFN,"EXEC")=BMXMFL(BMXSUBFN,"MULT")_"X BMXMFL(BMXFN,""IENS"")"_" D GETS^DIQ(BMXFN,BMXIENS,BMXGF(BMXFN),""E"",BMXA) D SETIEN(IEN"_BMXOFF_",BMXFN)" + D F1^BMXSQL(BMXF,BMXFNAM,BMXSUBFN) + ; + Q + ; +PTYPE(BMXGNOD1) ; + ;Traverse pointer chain to retrieve data type of pointed-to field + N BMXFILE + I $P(BMXGNOD1,U,2)'["P" Q BMXGNOD1 + S BMXFILE=$P(BMXGNOD1,U,2) + S BMXFILE=+$P(BMXFILE,"P",2) + S BMXGNOD1=$G(^DD(BMXFILE,".01",0)) + S BMXGNOD1=$$PTYPE(BMXGNOD1) + Q BMXGNOD1 diff --git a/m/BMXSQL6.m b/m/BMXSQL6.m new file mode 100644 index 0000000..c4a69d3 --- /dev/null +++ b/m/BMXSQL6.m @@ -0,0 +1,343 @@ +BMXSQL6 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; 7/20/2009 + ;;2.1;BMX;;Jul 26, 2009 + ; Line EOR+3 used a 2 argument form of $Q which is not + ; in the M 95 standard. Replaced this with a call to $$LAST, + ; a new Extrinsic in this routine. + ; + ; +WRITE ;EP + N BMXFN,C,BMXN,BMXGF,BMXA,BMXFLDF,N,A,IEN0,I + N BMXCNT,BMXCNTB,BMXLEN,BMXLTMP,BMXNUM,BMXORD,BMXTYP + N BMXCFN,BMXCFNX,F,BMXROOT,BMXCID,BMXZ ;From MAKEC + N BMXREC,BMXCHAIN ;TODO: COMMENT AFTER TESTING + N BMXIENS + ;Set up FIELD value for GETS^DIQ call + ; BMXFLD("NAME")="FILE#^FIELD#" + ; Need: BMXFLDN(FieldNumber) + ; and : BMXFLDO(SelectOrder) + ; Get file number -- for now just use first file in array + ; TODO: Set up same main file and related files here and in enumerator + S C=0,BMXN="" + N F + S BMXGF=0 + S F=0 F S F=$O(BMXF(F)) Q:F="" S BMXFN=BMXF(F) D + . S C=0,BMXN=-1 F S BMXN=$O(BMXFLDO(BMXN)) Q:BMXN="" D + . . Q:$P(BMXFLDO(BMXN),U)'=BMXFN + . . I $P(BMXFLDO(BMXN),U,2)=".001" S BMXGF=BMXGF+1 Q + . . S C=C+1 + . . S $P(BMXGF(BMXFN),";",C)=$P(BMXFLDO(BMXN),U,2) + . . S:'$D(BMXGF(BMXFN,"INTERNAL")) BMXGF(BMXFN,"INTERNAL")="E" + . . I $P(BMXFLDO(BMXN),U,3)="I" S BMXGF(BMXFN,"INTERNAL")="IE" + . . S BMXGF=BMXGF+1 + . . Q + . Q + ; + I BMXGF>1 K BMXTK("DISTINCT") ;Distinct supported for only one field + S N=0,BMXFLDF=0,I=1,BMXNUM=0 + D FIELDS + D MAKEC + ; + ; + I BMXCOL D COLTYPE^BMXSQL,ERRTACK^BMXSQL(I) Q ;Column info only + ; + S BMXA="A" + N G,R + ;---> Loop through results global + F S N=$O(^BMXTMP($J,N)) Q:'+N D + . K A + . S R=0 F S R=$O(BMXFO(R)) Q:'+R D ;For each file in ORDER array + . . S IEN0=0 + . . S BMXFN=BMXFO(R) + . . Q:$D(BMXMFL(BMXFN,"MULT")) + . . I R=1 S IEN0=^BMXTMP($J,N) ;Primary file + . . I R>1,$D(BMXFJ("JOIN",BMXFN)) D ;Joined file + . . . S IEN0=0 + . . . S G=BMXFJ("JOIN",BMXFN) + . . . S V=BMXFF(G,"JOIN","IEN") + . . . S @V=^BMXTMP($J,N) + . . . X BMXFF(G,"JOIN") + . . I +IEN0 D ;Removed $D(BMXGF(BMXFN)) for mult fld on extdnd ptr + . . . D SUBFILE(BMXFN) + . . I +IEN0,$D(BMXFLDN(BMXFN,.001)) D SETIEN(IEN0,BMXFN) + . . ; + . . I 0,R>1,$D(BMXMFL(BMXFN,"MULT")) D ;Multiple field + . . . Q:'+IEN0 + . . . Q:'$D(BMXGF(BMXFN)) ;Intervening multiple + . . . ;Call GETS for each subentry in multiple + . . . X BMXMFL(BMXFN,"EXEC") + . S F=0,BMXCNT=0 + . ; + . D RECORD + . D OUT + ; + ; + ;---> Tack on Error Delimiter and any error. + S I=I+1 + D ERRTACK^BMXSQL(I) + D COLTYPE^BMXSQL + Q + ; +SETIEN(BMXIEN,BMXFN) ; + ;B ;SETIEN + Q:'$D(BMXFLDN(BMXFN,.001)) + Q:'+BMXIEN + S A(BMXFN,BMXIEN_",",.001,"E")=BMXIEN + Q + ; +SUBFILE(BMXFN) ; + ;Execute GETS for Any fields in BMXGF(SUBFILE) + ; + ;If the subfile itself has subfiles, call SUBFILE(BMXSUBFN) + ; (Loop through BMXMFL(BMXFN,"SUBFILE",BMXSUBFN)) + I $D(BMXMFL(BMXFN,"SUBFILE")) D + . N BMXSUBFN + . S BMXSUBFN=0 + . F S BMXSUBFN=$O(BMXMFL(BMXFN,"SUBFILE",BMXSUBFN)) Q:'+BMXSUBFN D SUBFILE(BMXSUBFN) + . Q + ; + I $D(BMXGF(BMXFN)) D + . I '$D(BMXMFL(BMXFN,"MULT")) S BMXMSCR=1 D GETS^DIQ(BMXFN,IEN0_",",BMXGF(BMXFN),BMXGF(BMXFN,"INTERNAL"),BMXA) Q + . E X BMXMFL(BMXFN,"EXEC") Q + ; + ; + Q + ; +FIELDS ;---> Write Field Names + ;Field name is TAAAAANAME + ;Where T is the field type (T=Text; D=Date) + ; AAAAA is the field size (see NUMCHAR routine) + ; NAME is the field name + N BMXNUM,BMXFNUM,BMXFNAM,R + K BMXLEN,BMXTYP + S BMXFLDF=1 + S BMXNUM=0 + ;B ;In FIELDS sub + D ;:$D(A) + . I BMXNUM S ^BMXTEMP($J,I)="IEN^",BMXLEN(I)=10,BMXTYP(I)="T",I=I+1 ;TODO: Change from text to number + . S BMXFNUM=0 + . S BMXFNAM=0 + . F R=0:1:(BMXFLDO-1) S BMXFN=$P(BMXFLDO(R),U),BMXFNUM=$P(BMXFLDO(R),U,2) D + . . ;S BMXFNAM=$P(^DD(BMXFN,BMXFNUM,0),"^") ;Get type here + . . S BMXFNAM=BMXFLDN(BMXFN,BMXFNUM) + . . I $P(BMXFLDO(R),U,3)="I" S BMXFNAM="INTERNAL["_BMXFNAM_"]" + . . S BMXFNAM=$TR(BMXFNAM," ","_") + . . I BMXF>1 S BMXFNAM=$TR($P(BMXFNX(BMXFN),".")," ","_")_"."_BMXFNAM + . . S BMXTYP(I)="T" + . . S:$P(BMXFLDO(R),U,5)="D" BMXTYP(I)="D" + . . S:$P(BMXFLDO(R),U,5)="I" BMXTYP(I)="I" + . . S BMXLEN(I)=0 ;Start with length zero + . . ;I $D(BMXFLDA(BMXFN,BMXFNUM)) S BMXFNAM=BMXFLDA(BMXFN,BMXFNUM) + . . I $P(BMXFLDO(R),U,6)]"" S BMXFNAM=$P(BMXFLDO(R),U,6) + . . S ^BMXTEMP($J,I)=BMXFNAM_"^" + . . S I=I+1 + . S ^BMXTEMP($J,I-1)=$E(^BMXTEMP($J,I-1),1,$L(^BMXTEMP($J,I-1))-1)_$C(30) + Q + ; +OUT ; + ;Output to BMXTEMP($J + Q:'$D(BMXREC) + N J,K,L,BMXLENT + S J=0 F S J=$O(BMXREC(J)) Q:'+J D + . S K=0 F S K=$O(BMXREC(J,K)) Q:'+K D + . . I +$O(BMXREC(J,K,0)) D Q ;WP + . . . S L=0,BMXLENT=0 F S L=$O(BMXREC(J,K,L)) Q:'+L D + . . . . S:'$D(^BMXTEMP($J,I)) ^BMXTEMP($J,I)="" + . . . . S:$L(^BMXTEMP($J,I))>250 I=I+1,^BMXTEMP($J,I)="" + . . . . S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_BMXREC(J,K,L) + . . . . S BMXLENT=BMXLENT+$L(BMXREC(J,K,L)) + . . . I BMXLEN(K)250 I=I+1,^BMXTEMP($J,I)="" + . . I $G(BMXTK("DISTINCT"))="TRUE",BMXREC(J,K)]"" Q:$D(^BMXTEMP($J,"DISTINCT",BMXREC(J,K))) + . . S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_BMXREC(J,K) + . . S:$L(BMXREC(J,K))>BMXLEN(K) BMXLEN(K)=$L(BMXREC(J,K)) + . . I $G(BMXTK("DISTINCT"))="TRUE" S ^BMXTEMP($J,"DISTINCT",BMXREC(J,K))="" + Q + ; +RECORD ; + ;For each chain + N C,BMXCQ,BMXLCQ,BMXCQN,BMXLCQN,BMXTRACK,BMXNODE,BMXCNAME,BMXWP + K BMXREC,BMXCHAIN ;TODO: REMOVE AFTER TESTING + D BLDCHN + S BMXREC=0 + D RECINI + S C=0 F S C=$O(BMXCHAIN(C)) Q:'+C D + . ;New chain + . ;Go to the end of the chain, writing record pieces as you go + . ;At the end of the chain, write end-of-record marker,increment record counter, copy previous record + . K BMXTRACK + . S BMXCNAME="BMXCHAIN("_C_")" + . S BMXCQN="" + . S BMXCQ=BMXCNAME F S BMXCQ=$Q(@BMXCQ) Q:BMXCQ="" Q:$P(BMXCQ,",")'=("BMXCHAIN("_C) D + . . S BMXNODE=@BMXCQ + . . I $P(BMXNODE,U,2)="" Q + . . S BMXWP=$P(BMXNODE,U,3) + . . S BMXLCQ=$L(BMXCQ,",") + . . S BMXCQN=$Q(@BMXCQ) + . . S BMXLCQN=$L(BMXCQN,",") + . . I BMXWP="W" D + . . . S BMXREC(BMXREC,$P(BMXNODE,U,2),$P(BMXNODE,U,4))=$P(BMXNODE,U) + . . . S BMXTRACK(BMXLCQ-1,$P(BMXNODE,U,2))=BMXNODE + . . E D + . . . S BMXREC(BMXREC,$P(BMXNODE,U,2))=$P(BMXNODE,U)_U + . . . S BMXTRACK(BMXLCQ,$P(BMXNODE,U,2))=BMXNODE + . . I BMXCQN="" D EOR Q + . . I $P(BMXCQN,",")'=("BMXCHAIN("_C) D EOR Q + . . I BMXLCQN>BMXLCQ Q + . . I (BMXLCQN>$S(BMXWP="W":7,1:6)) D Q + . . . I ($P(BMXCQ,",",1,BMXLCQ-2)=$P(BMXCQN,",",1,BMXLCQN-2)) Q + . . . D EOR ;End of chain + Q + ; +RECINI ; + N J + S BMXREC=BMXREC+1 + F J=1:1:BMXFLDO D + . I $P(BMXFLDO(J-1),U,4)="W" S BMXREC(BMXREC,J,999999)="^" Q + . S BMXREC(BMXREC,J)="^" + Q + ; +EOR ; + ;B ;EOR + N J,K,L,M,I,N + ; S M=$Q(BMXREC(9999999),-1) //SMH - Another Cacheism + S M=$$LAST("BMXREC") + S @M=$TR(@M,"^",$C(30)) + Q:BMXCQN="" + I BMXCQN'="" D RECINI + ;K BMXTRACK(BMXLCQ) ;Also kill all track levels between current and next level + F K BMXTRACK($O(BMXTRACK(999999),-1)) Q:$O(BMXTRACK(9999999),-1)'>BMXLCQN + S J=0 F S J=$O(BMXTRACK(J)) Q:'+J D ;Level + . S K=0 F S K=$O(BMXTRACK(J,K)) Q:'+K D ;Order + . . I $D(BMXTRACK(J,K)) S BMXNODE=BMXTRACK(J,K) S BMXREC(BMXREC,$P(BMXNODE,U,2))=$P(BMXNODE,U)_U + . . S L=0 F S L=$O(BMXTRACK(J,K,L)) Q:'+L D ;wp node + . . . I $D(BMXTRACK(J,K,L)) S BMXNODE=BMXTRACK(J,K,L) S BMXREC(BMXREC,$P(BMXNODE,U,2),L)=$P(BMXNODE,U) + Q + ; +BLDCHN ; + N B + D MAKEB + ;D MAKEC + D BUILD + Q + ; +MAKEC ; + ;MAKE Chain + ;How many chains are there? + S BMXZ=0 S BMXCID=1 K BMXCFN + ; + ; + ;Create BMXCHNP(BMXCID) + S F=0 F S F=$O(BMXMFL(F)) Q:'+F I '$D(BMXMFL("SUBFILE",F)),$D(BMXMFL("PARENT",F)) S BMXMFL("BOTTOM",F)="" + N BMXCB,BMXCHNP,BMXP + S BMXCID=0,BMXCB=0,BMXCHNP=0 + I $D(BMXMFL("BOTTOM")) F S BMXCB=$O(BMXMFL("BOTTOM",BMXCB)) Q:'BMXCB D + . S BMXCID=BMXCID+1,BMXCHNP=BMXCID + . S BMXCHNP(BMXCID)=BMXCB + . S BMXP=BMXCB + . F Q:'$D(BMXMFL("PARENT",BMXP)) S BMXP=BMXMFL("PARENT",BMXP) S BMXCHNP(BMXCID)=BMXP_U_BMXCHNP(BMXCID) + ; + N J,K,L,M + ;Create BMXMFL("BASE")="FILE1^FILE2^...^FILEN" + S F=0,M=0,BMXMFL("BASE")="" F S F=$O(BMXMFL(F)) Q:'+F I (('$D(BMXMFL("PARENT",F)))&('$D(BMXMFL(F,"SUBFILE"))))!(BMXFO(1)=F) S M=M+1,$P(BMXMFL("BASE"),U,M)=F ;Changed to make BMXFO(1) always a member of the base + ; + ;Create BMXCFN(BMXCID,BMXZ,FILE) + I BMXCID=0 S BMXCID=1 + S J=0,BMXZ=0 F J=1:1:BMXCID D + . I BMXMFL("BASE")]"" F L=1:1:$L(BMXMFL("BASE"),"^") S F=$P(BMXMFL("BASE"),"^",L) D + . . S BMXZ=BMXZ+100 + . . S BMXCFN(J,BMXZ,F)="" + . I +BMXCHNP F K=1:1:$L(BMXCHNP(J),"^") S F=$P(BMXCHNP(J),"^",K) D + . . Q:F=BMXFO(1) ;BMXFO(1) Is always a member of the base + . . S BMXZ=BMXZ+100 + . . S BMXCFN(J,BMXZ,F)="" + ; + ; + ;B ;FIXCFN + D FIXCFN + Q + ; +BUILD ;Building BMXCHAIN( + N BMXIEN,BMXCID,BMXFLD,BMXCS,BMXINT,BMXCFNC,BMXCFIEN + S BMXCID=0,BMXIEN=0 + F S BMXCID=$O(BMXCFN(BMXCID)) Q:'+BMXCID D + . S BMXCFNC=0 F S BMXCFNC=$O(BMXCFN(BMXCID,BMXCFNC)) Q:'+BMXCFNC S BMXCFN=+BMXCFN(BMXCID,BMXCFNC) D + . . S BMXIEN=0 F S BMXIEN=$O(B(BMXCFN,BMXIEN)) Q:BMXIEN="" D + . . . S $P(BMXCFN(BMXCID,BMXCFNC),U,2)=BMXIEN + . . . S BMXFLD=0 F S BMXFLD=$O(B(BMXCFN,BMXIEN,BMXFLD)) Q:'+BMXFLD D + . . . . S BMXINT="D" F S BMXINT=$O(B(BMXCFN,BMXIEN,BMXFLD,BMXINT)) Q:BMXINT="" D + . . . . . Q:'$D(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)) + . . . . . I $P(BMXFLDO(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)),U,4)="W" D MCWP Q + . . . . . D FIXIEN + . . . . . S BMXCS="BMXCHAIN("_BMXCID_","_$S($L(BMXIEN,",")=2:1,1:2)_","_BMXCFIEN_","_BMXFLD_","_$C(34)_BMXINT_$C(34)_")" + . . . . . S @BMXCS=B(BMXCFN,BMXIEN,BMXFLD,BMXINT)_U_(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)+1) + Q + ; +FIXIEN ; + N BMXC,BMXCFN1,BMXOFF + S BMXC=BMXCFNC + S BMXCFIEN=BMXCFN_","_$P(BMXIEN,",",$L(BMXIEN,",")) + S BMXOFF=1 + F S BMXC=$O(BMXCFN(BMXCID,BMXC),-1) Q:'+BMXC D + . S BMXCFN1=+BMXCFN(BMXCID,BMXC) + . I '$D(BMXMFL(BMXCFN,"OTM")) D + . . I '$D(BMXMFL(BMXCFN1,"SUBFILE",BMXCFN)) Q + . . S BMXCFIEN=BMXCFN1_","_$P(BMXIEN,",",$L(BMXIEN,",")-BMXOFF)_","_BMXCFIEN + . I $D(BMXMFL(BMXCFN,"OTM")) D + . . I '$D(BMXMFL(BMXCFN1,"SUBFILE",BMXCFN)) Q + . . S BMXCFIEN=BMXCFN1_$P(BMXCFN(BMXCID,BMXC),U,2)_","_BMXCFIEN + . S BMXOFF=BMXOFF+1 + ; + ; + Q + ; +FIXCFN ; + N J,K,L + S J=0 F S J=$O(BMXCFN(J)) Q:'+J D + . S K=0 F S K=$O(BMXCFN(J,K)) Q:'+K D + . . S L=0 F S L=$O(BMXCFN(J,K,L)) Q:'+L D + . . . K BMXCFN(J,K,L) + . . . S BMXCFN(J,K)=L + ; + Q + ; +MCWP ; + ;MAKEC Process WP Field + N BMXIENL,BMXWP + S BMXIENL=1 + S:$L(BMXIEN,",")>2 BMXIENL=2 + S BMXWP=0 + ; + F S BMXWP=$O(B(BMXCFN,BMXIEN,BMXFLD,BMXWP)) Q:'+BMXWP D + . S BMXCS="BMXCHAIN("_BMXCID_","_BMXIENL_","_BMXCFN_BMXIEN_","_BMXFLD_","_$C(34)_BMXINT_$C(34)_","_BMXWP_")" + . S @BMXCS=B(BMXCFN,BMXIEN,BMXFLD,BMXWP)_U_(BMXFLDOX(BMXCFN,BMXFLD,BMXINT)+1)_U_"W"_U_BMXWP + Q + ; + ; +MAKEB ; + N BMXFILE,BMXIEN,BMXFLD,BMXINT + N BMXSUB,BMXIENR + S BMXFILE=0 F S BMXFILE=$O(A(BMXFILE)) Q:'+BMXFILE D + . S BMXIEN=0 F S BMXIEN=$O(A(BMXFILE,BMXIEN)) Q:'+BMXIEN D + . . S BMXFLD=0 F S BMXFLD=$O(A(BMXFILE,BMXIEN,BMXFLD)) Q:'+BMXFLD D + . . . S BMXINT=0 F S BMXINT=$O(A(BMXFILE,BMXIEN,BMXFLD,BMXINT)) Q:BMXINT="" D + . . . . S BMXIENR=$$REVERSE(BMXIEN) + . . . . S BMXSUB="B("_BMXFILE_","_$C(34)_BMXIENR_$C(34)_","_BMXFLD_","_$C(34)_BMXINT_$C(34)_")" + . . . . I $D(BMXFLDOX(BMXFILE,BMXFLD,BMXINT)),$P(BMXFLDO(BMXFLDOX(BMXFILE,BMXFLD,BMXINT)),U,5)="D" D Q + . . . . . S @BMXSUB=$TR(A(BMXFILE,BMXIEN,BMXFLD,BMXINT),"@"," ") + . . . . S @BMXSUB=A(BMXFILE,BMXIEN,BMXFLD,BMXINT) + Q + ; +REVERSE(BMXIEN) ; + N J,T,C + S C=1 + F J=$L(BMXIEN,","):-1:1 D + . S $P(T,",",C)=$P(BMXIEN,",",J) + . S C=C+1 + Q T +LAST(VAR) ; Get last entry in an array //SMH new code + N SUB1 S SUB1=$O(@VAR@(""),-1) + N SUB2 S SUB2=$O(@VAR@(SUB1,""),-1) + N SUB3 S SUB3=$O(@VAR@(SUB1,SUB2,""),-1) + I SUB3="" Q $NA(@VAR@(SUB1,SUB2)) + E Q $NA(@VAR@(SUB1,SUB2,SUB3)) diff --git a/m/BMXSQL7.m b/m/BMXSQL7.m new file mode 100644 index 0000000..2f7d8da --- /dev/null +++ b/m/BMXSQL7.m @@ -0,0 +1,232 @@ +BMXSQL7 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +CHKCR(BMXFNUM,BMXFLDNU,BMXRET) ;Returns cross reference to iterate on for related file + N BMXREF,BMXHIT,BMXRNOD,BMXTMP,BMXTMPV,BMXTMPI,BMXTMPP,BMXPFFN,BMXPFF,Q + N BMXHIT,BMXREF,BMXGL,BMXNOD,BMXRNAM,BMXTMPL,BMXTMPN,BMXTST + ; + S BMXNOD=^DD(BMXFNUM,BMXFLDNU,0) + S BMXGL=^DIC(BMXFNUM,0,"GL") ;Subfile global + S BMXREF=0,BMXHIT=0,Q=$C(34),BMXRET="" + F S BMXREF=$O(^DD(BMXFNUM,BMXFLDNU,1,BMXREF)) Q:'+BMXREF D Q:BMXHIT + . Q:'$D(^DD(BMXFNUM,BMXFLDNU,1,BMXREF,0)) + . S BMXRNOD=^DD(BMXFNUM,BMXFLDNU,1,BMXREF,0) + . Q:$P(BMXRNOD,U,3)]"" + . S BMXRNAM=$P(BMXRNOD,U,2) + . S BMXTMP=BMXGL_Q_BMXRNAM_Q_")" + . S BMXTST=$P(BMXTMP,")")_",IEN0," + . Q:'$D(@BMXTMP) + . S BMXTMPV=0,BMXTMPV=$O(@BMXTMP@(BMXTMPV)) + . Q:BMXTMPV="" + . S BMXTMP=BMXGL_Q_BMXRNAM_Q_","_Q_BMXTMPV_Q_")" + . S BMXTMPI=0,BMXTMPI=$O(@BMXTMP@(BMXTMPI)) + . S BMXTMP=$S(BMXGL[",":$P(BMXGL,",")_")",1:$P(BMXGL,"(")) + . Q:'$D(@BMXTMP@(BMXTMPI)) + . S BMXTMPL=$P(BMXNOD,U,4) + . S BMXTMPP=$P(BMXTMPL,";",2) + . S BMXTMPL=$P(BMXTMPL,";") + . Q:BMXTMPL="" + . S BMXTMP=BMXGL_BMXTMPI_")" + . Q:'$D(@BMXTMP@(BMXTMPL)) + . S BMXTMPN=@BMXTMP@(BMXTMPL) + . S BMXTMPP=$P(BMXTMPN,"^",BMXTMPP) + . I BMXTMPP=BMXTMPV S BMXRET=BMXTST,BMXHIT=1 + Q BMXHIT + ; + ; +WHERE ;EP - WHERE-clause processing + ; + ;Set up the defualt iterator in BMXX(1) to scan the entire file. + ;For now, just use first file in the FROM group + ;Later, pick the smallest file if more than one file + ; + ;Set up BMXFF array for each expression element + ; BMXFF(n)=FILENAME^FIELDNAME^OPERATOR^VALUE^FILENUMBER^FIELDNUMBER + ; ^FILE GLOBAL^FIELD DATA LOCATION + ; BMXFF(n,0)=Field descriptor ^DD(FILE,FIELD,0) + ; + N BMXGL,BMXOP,BMXTYP,BMXV,BMXV1,BMXV2,BMXFILE,BMXTMP + N BMXINTNL,BMXTMPLT + N BMXIEN + S BMXGL=^DIC(BMXFO(1),0,"GL") + S BMXX=1 + S BMXX(1)="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " + S BMXTMP=BMXGL + I BMXTMP["," S BMXTMP=$TR(BMXTMP,",",")") + E S BMXTMP=$P(BMXTMP,"(",1) + I $D(@BMXTMP@("B")) D + . S BMXX(1)="S BMXTMP=0 F S BMXTMP=$O("_BMXGL_$C(34)_"B"_$C(34)_",BMXTMP)) Q:BMXTMP="""" S D0=0 F S D0=$O("_BMXGL_$C(34)_"B"_$C(34)_",BMXTMP,D0)) Q:'+D0 Q:BMXM>BMXXMAX " + ; + ;--->BMXFF array: + ; + S T=$G(BMXTK("WHERE")) + S BMXFF=0,C=0 + Q:'+T + F S T=$O(BMXTK(T)) Q:'+T Q:T=$G(BMXTK("ORDER BY")) Q:T=$G(BMXTK("GROUP BY")) D Q:$D(BMXERR) + . ;Get the file of the field + . I "AND^OR^(^)"[BMXTK(T) D Q + . . S C=C+1 + . . S BMXFF(C)=BMXTK(T) + . . S BMXFF=C + . S BMXTK(T)=$TR(BMXTK(T),"_"," ") + . S BMXTK(T)=$TR(BMXTK(T),"'","") + . S BMXINTNL=0 + . S BMXTMPLT=0 + . S BMXIEN=0 + . I BMXTK(T)["INTERNAL[" S BMXINTNL=1,BMXTK(T)=$P(BMXTK(T),"[",2),BMXTK(T)=$P(BMXTK(T),"]",1) + . I BMXTK(T)["TEMPLATE[" S BMXTMPLT=1,BMXTK(T)=$P(BMXTK(T),"[",2),BMXTK(T)=$P(BMXTK(T),"]",1),BMXIEN=1 + . I BMXTK(T)["BMXIEN" S BMXIEN=1 + . S BMXFILE=$$FLDFILE^BMXSQL2(BMXTK(T)) + . Q:$D(BMXERR) + . S C=C+1 + . S BMXFF=C ;This is a count of the where fields + . I BMXFILE]"" D + . . S $P(BMXFF(C),U,1)=$P(BMXFILE,U,1) ;FILENAME + . . S $P(BMXFF(C),U,2)=$P(BMXFILE,U,2) ;FIELDNAME + . . S $P(BMXFF(C),U,5)=$P(BMXFILE,U,3) ;FILENUMBER + . . S $P(BMXFF(C),U,6)=$P(BMXFILE,U,4) ;FIELDNUMBER + . . I $P(BMXFILE,U,3),$D(^DIC($P(BMXFILE,U,3),0,"GL")) S $P(BMXFF(C),U,7)=^DIC($P(BMXFILE,U,3),0,"GL") + . . I BMXIEN S BMXFF(C,0)="IEN",BMXFF(C,"IEN")=1,BMXFF(C,"TYPE")="IEN" + . . E S BMXFF(C,0)=$S(+$P(BMXFILE,U,3):^DD($P(BMXFILE,U,3),$P(BMXFILE,U,4),0),1:"") + . . I BMXINTNL S BMXFF(C,"INTERNAL")=1 + . ; + . ;If BMXFF(C) is a pointer, traverse pointer chain to retrieve type + . I $P(BMXFF(C,0),U,2)["P" D + . . ;B ;WHERE Pointer Type + . . N BMXFILN,BMXFLDN,BMXDD + . . S BMXDD=BMXFF(C,0) + . . F Q:$P(BMXDD,U,2)'["P" D:$P(BMXDD,U,2)["P" + . . . S BMXFILN=$P(BMXDD,U,2) + . . . S BMXFILN=+$P(BMXFILN,"P",2) + . . . S BMXDD=^DD(BMXFILN,".01",0) + . . S BMXFF(C,"TYPE")=$S($P(BMXDD,U,2)["D":"DATE",$P(BMXDD,U,2)["S":"SET",1:"OTHER") + . . I BMXFF(C,"TYPE")="SET" S $P(BMXFF(C,"TYPE"),U,2)=$P(BMXDD,U,3) + . ;B ;WHERE Set Type + . I ($P(BMXFF(C,0),U,2)["S")!($P($G(BMXFF(C,"TYPE")),U)="SET") D ;Set + . . N BMXSET,BMXSETP + . . I $P(BMXFF(C,0),U,2)["S" D + . . . S BMXFF(C,"TYPE")="SET" + . . . S $P(BMXFF(C,"TYPE"),U,2)=$P(BMXFF(C,0),U,3) + . . S BMXSET=$P(BMXFF(C,"TYPE"),U,2) + . . F J=1:1:$L(BMXSET,";") D + . . . S BMXSETP=$P(BMXSET,";",J) + . . . Q:BMXSETP="" + . . . S BMXFF(C,"SET",$P(BMXSETP,":",2))=$P(BMXSETP,":") + . ; + . ;Set up comparisons based on operators + . S T=T+1 + . S BMXOP=BMXTK(T) + . I BMXTMPLT S BMXOP="=" + . I "^<^>^=^[^<>^>=^<=^LIKE"[BMXOP D Q + . . S $P(BMXFF(C),U,3)=BMXTK(T) + . . ;Get the comparison value + . . S T=T+1 + . . S BMXTMP=BMXTK(T) + . . S BMXTMP=$TR(BMXTMP,"'","") + . . I BMXOP="LIKE" S BMXTMP=$P(BMXTMP,"%"),$P(BMXFF(C),U,4)=BMXTMP Q + . . I BMXTMPLT D TMPLATE Q + . . I BMXTMP="*" S T=T+1,BMXTMP=BMXTK(T) D OTM Q + . . I BMXTMP[".",BMXTK(T)'["'" D ;This is a join ;TODO: Extended pointers + . . . ;Setting BMXFJ("JOIN" + . . . S BMXTMP=BMXTK(T) + . . . I $D(BMXF($P(BMXTMP,"."))),BMXF($P(BMXTMP,"."))=BMXFO(1) D Q + . . . . S BMXTMP=BMXTK(T-2) + . . . . D OTM + . . . N BMXJN + . . . S BMXFF(C,"JOIN")="Pointer chain" + . . . S BMXJN=+$P($P(BMXFF(C,0),U,2),"P",2) + . . . S BMXFJ("JOIN",+$P($P(BMXFF(C,0),U,2),"P",2))=C + . . . S:+$P($P(BMXFF(C,0),U,2),"P",2)=2 BMXFJ("JOIN",9000001)=C ;IHS Only -- auto join PATIENT to VA PATIENT + . . I ($P(BMXFF(C,0),U,2)["D")!($G(BMXFF(C,"TYPE"))="DATE") D ;Date + . . . Q:$D(BMXFF(C,"INTERNAL")) + . . . I BMXTMP]"" S X=BMXTMP,%DT="T" D ^%DT S BMXTMP=Y + . . I $P($G(BMXFF(C,"TYPE")),U)="SET" D + . . . Q:$D(BMXFF(C,"INTERNAL")) + . . . Q:BMXTMP="" + . . . I $G(BMXFF(C,"SET",BMXTMP))="" S BMXTMP="ZZZZZZ" Q + . . . S BMXTMP=$G(BMXFF(C,"SET",BMXTMP)) + . . S $P(BMXFF(C),U,4)=BMXTMP + . . Q + . I BMXOP="BETWEEN" D + . . S $P(BMXFF(C),U,3)="BETWEEN" + . . ;Get the comparison value + . . S T=T+1 + . . S BMXV1=BMXTK(T) + . . S:BMXV1["'" BMXV1=$P(BMXV1,"'",2) + . . S T=T+1 + . . I BMXTK(T)'="AND" S BMXERR="'BETWEEN' VALUES NOT SPECIFIED" D ERROR Q + . . S T=T+1 + . . S BMXV2=BMXTK(T) + . . S:BMXV2["'" BMXV2=$P(BMXV2,"'",2) + . . I ($P(BMXFF(C,0),U,2)["D")!($G(BMXFF(C,"TYPE"))="DATE") D ;Date + . . . Q:$D(BMXFF(C,"INTERNAL")) + . . . S X=BMXV1,%DT="T" D ^%DT S BMXV1=Y + . . . S X=BMXV2,%DT="T" D ^%DT S BMXV2=Y + . . I BMXV1>BMXV2 S BMXTMP=BMXV1,BMXV1=BMXV2,BMXV2=BMXTMP + . . S $P(BMXFF(C),U,4)=BMXV1_"~"_BMXV2 + . . Q + . I $P(BMXFF(C),U,3)="" S BMXERR="INVALID OPERATOR" D ERROR Q + . I $D(BMXTK(T+1)),BMXTK(T+1)["[INDEX:" D + . . S T=T+1 + . . N BMXIND + . . S BMXIND=$P(BMXTK(T),"INDEX:",2) + . . S:BMXIND["]" BMXIND=$P(BMXIND,"]") + . . S:BMXIND["'" BMXIND=$P(BMXIND,"'",2) + . . S BMXFF("INDEX")=BMXIND + . Q + ; + Q:$D(BMXERR) + D JOIN^BMXSQL4 + Q + ; +TMPLATE ; + N BMXTNUM,BMXTNOD + I BMXTMP["[" S BMXTMP=$P(BMXTMP,"[",2),BMXTMP=$P(BMXTMP,"]") + S BMXTMP=$TR(BMXTMP,"_"," ") + ;Test template validity + I '$D(^DIBT("B",BMXTMP)) S BMXERR="TEMPLATE NOT FOUND" D ERROR Q + S BMXTNUM=$O(^DIBT("B",BMXTMP,0)) + I '$D(^DIBT(BMXTNUM,0)) S BMXERR="TEMPLATE NOT FOUND" D ERROR Q + S BMXTNOD=^DIBT(BMXTNUM,0) + I $P(BMXTNOD,U,4)'=$P(BMXFF(C),U,5) S BMXERR="TEMPLATE DOES NOT MATCH FILE" D ERROR Q + I '$D(^DIBT(BMXTNUM,1)) S BMXERR="TEMPLATE HAS NO ENTRIES" D ERROR Q + S BMXFF(C,0)="IEN",BMXFF(C,"IEN")="TEMPLATE",BMXFF(C,"TYPE")="IEN" + S $P(BMXFF(C),U,4)=BMXTMP + ; + Q + ; +OTM ;One-To-Many + N BMXUPFN,BMXSUBFN,BMXA,BMXB,BMXSUBFLD,BMXFNAM + I BMXTMP["INTERNAL[" S BMXTMP=$P(BMXTMP,"INTERNAL[",2),BMXTMP=$P(BMXTMP,"]") + S BMXUPFN=BMXFO(1) + S BMXA=$TR($P(BMXTMP,"."),"_"," ") + S BMXB=$TR($P(BMXTMP,".",2),"_"," ") + S BMXFNAM=BMXB ;Required by SETMFL. Won't work if filename BMXB [ "." + ;Get the subfile + I '$D(BMXF(BMXA)) S BMXERR="Related File Not Found" Q + S BMXSUBFN=BMXF(BMXA) + I '$D(^DD(BMXSUBFN,0)) S BMXERR="Related file not found" Q + ;Get the field that points to the main file + I '$D(^DD(BMXSUBFN,"B",BMXB)) S BMXERR="Related field not found" Q + S BMXSUBFLD=$O(^DD(BMXSUBFN,"B",BMXB,0)) + I '+BMXSUBFLD S BMXERR="Related field not found" Q + ; + ;Find a normal index on that field + ;Set up for call to CHKCR^BMXSQL7 + N BMXEXEC + I '$$CHKCR^BMXSQL7(BMXSUBFN,BMXSUBFLD,.BMXEXEC) S BMXERR="Related File not indexed" Q + ; + ; + S BMXFF(C,"JOIN")="One-to-many Join" + ; + ;Call SETMFL^BMXSQL5 to set up the iteration code + D SETMFL^BMXSQL5(BMXUPFN,BMXSUBFN,BMXEXEC,1,1) + ; + ; + ;Upfile is the mainfile, Subfile is the related file + ;BMXOFF is 1 but What is BMXGL? + ; + Q + ; +ERROR Q diff --git a/m/BMXSQL91.m b/m/BMXSQL91.m new file mode 100644 index 0000000..80577ca --- /dev/null +++ b/m/BMXSQL91.m @@ -0,0 +1,141 @@ +BMXSQL91 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ;Below is dead code, but keep for later +SETX2 ;Don't need this unless porting to machine with + ;local variable size limitations + N F,LVL,ROOT,START + S LVL=1,START=1 + S ROOT="BMXY" + F F=1:1:BMXFF D Q:$D(BMXERR) + . S BMX=BMXFF(F) + . I BMX="(" D Q ;Increment level + . . S LVL=LVL+1 + . . ;S ROOT=$S(ROOT["(":$P(ROOT,")")_","_0_")",1:ROOT_"("_0_")") + . . ;Get operator following close paren corresponding to this open + . . ;If op = OR then set up FOR loop in zeroeth node + . . ;if op = AND then set up + . I BMX=")" D Q ;Decrement level + . . S LVL=LVL-1 + . . I LVL=1,$D(BMXFF(F+1)),BMXFF(F+1)="&" D Q + . . . S BMXX=BMXX+1 + . . . S BMXX(BMXX)="" + . . . F J=START:1:F S BMXX(BMXX)=BMXX(BMXX)_BMXFF(J) + . . . S START=F+2 + . . . ;S BMXX(BMXX)="I "_BMXX(BMXX)_" X BMXX("_BMXX+1_")" + . I BMX="AND" D Q ;Chain to previous expression at current level + . I BMX="OR" D Q ;Create FOR-loop to execute screens + ; + Q + ; + ; + ;S F=0 F S F=$O(BMXMFL(F)) Q:'+F S:'$D(BMXMFL(F,"SUBFILE")) BMXMFL("NOSUBFILE",F)="" + ;I $D(BMXMFL("NOSUBFILE")) S F=0 F S F=$O(BMXMFL("NOSUBFILE",F)) Q:'+F D MAKEC1 + ;I $D(BMXMFL("SUBFILE")) S F=0 F S F=$O(BMXMFL("SUBFILE",F)) Q:'+F D MAKEC1 ;S BMXROOTZ=BMXZ+100 + ; + Q +MAKEC1 ; + I '$D(BMXMFL(F,"SUBFILE")),'$D(BMXMFL(F,"MULT")) S BMXZ=BMXZ+100,BMXCFN(BMXCID,BMXZ,F)="" Q + Q:'$D(BMXMFL(F,"SUBFILE")) + Q:$D(BMXMFL(F,"MULT")) + S BMXROOT=F + S BMXROOTZ=BMXZ+100 + S BMXROOTC=BMXCID + D MCNT(F) + Q + ; +MCNT(F) ; + N S + ;B ;MCNT + I '$D(BMXMFL(F,"SUBFILE")) D MCNT2 Q + S S=0 F S S=$O(BMXMFL(F,"SUBFILE",S)) Q:'+S S:'$D(BMXCFN(BMXCID,BMXZ,F)) BMXZ=BMXZ+100,BMXCFN(BMXCID,BMXZ,F)="" S BMXZ=BMXZ+100,BMXCFN(BMXCID,BMXZ,S)="",BMXCFNX(S,F)="" D MCNT(S) + Q + ; +MCNT2 ; + ;B ;Back-chain + ;TODO: RESTART HERE -- $O(BMXCFN(BMXCID,0)) NEEDS TO BE CHANGED TO SOMETHING BESIDES 0 + N BMXFTOP,BMXFBACK + F S BMXFTOP=$O(BMXCFN(BMXROOTC,BMXROOTZ,0)) Q:BMXFTOP=BMXROOT S BMXFBACK=$O(BMXCFNX(BMXFTOP,0)) S BMXROOTZ=BMXROOTZ-1,BMXCFN(BMXCID,BMXROOTZ,BMXFBACK)="" + S BMXCID=BMXCID+1,BMXROOTC=BMXCID + ;Get the root files + I $D(BMXMFL("NOSUBFILE")) D + . N F + . S F=0 F S F=$O(BMXMFL("NOSUBFILE",F)) Q:'+F D + . . Q:$D(BMXMFL(F,"MULT")) + . . Q:F=BMXROOT + . . S BMXZ=BMXZ+100 + . . S BMXCFN(BMXCID,BMXZ,F)="" + S BMXROOTZ=BMXZ+100 + Q + ; + ; +ITER ;Iterate through result array A + S BMXCNT=BMXFLDO ;Field count + S F=0 + S:BMXNUM ^BMXTEMP($J,I)=IEN0_"^" + S BMXCNTB=0 + S BMXORD=BMXNUM + N BMXONOD + N BMXINT + ;B ;WRITE Before REORG + N M,N S N=0 + D REORG + ;B ;WRITE After REORG + F S N=$O(M(N)) Q:'+N D + . S O=0 + . F O=1:1:$L(M(N),U) S BMXFLDO(O-1,"IEN0")=$P(M(N),U,O) + . S BMXORD=BMXNUM + . D OA + Q + ; +REORG N R,IEN,J,CONT,TEST + F R=0:1:BMXFLDO-1 S IEN(R)=0 + F J=1:1 D Q:'CONT + . S CONT=0 + . F R=1:1:BMXFLDO D + . . S TEST=$O(A(+BMXFLDO(R-1),IEN(R-1))) + . . I +TEST S IEN(R-1)=TEST,CONT=1 + . . S $P(M(J),U,R)=IEN(R-1) + . Q + I M(J)=M(J-1) K M(J) + Q + ; + ; +OA ; + I $D(A) F R=0:1:(BMXFLDO-1) S F=$P(BMXFLDO(R),U,2),BMXFN=$P(BMXFLDO(R),U),BMXINT=$P(BMXFLDO(R),U,3) D S:(R+1)BMXLEN(BMXORD) BMXLEN(BMXORD)=BMXLTMP + . . . Q + . . D ;It's a multiple. Implement in next phase + . . . ;S BMXMCT=BMXMCT+1 + . . . ;S BMXMCT(BMXMCT)=BMXFN_U_F + . . . Q ;Process A( for multiple field + . . Q + . E D ;Not a multiple + . . S I=I+1 + . . I $G(BMXTK("DISTINCT"))="TRUE" D Q + . . . Q:A(BMXFN,IEN0,F,BMXINT)="" + . . . I $D(^BMXTMPD($J,A(BMXFN,IEN0,F,BMXINT))) Q + . . . S ^BMXTMPD($J,A(BMXFN,IEN0,F,BMXINT))="" + . . . S ^BMXTEMP($J,I)=A(BMXFN,IEN0,F,BMXINT) + . . . S:$L(A(BMXFN,IEN0,F,BMXINT))>BMXLEN(BMXORD) BMXLEN(BMXORD)=$L(A(BMXFN,IEN0,F,BMXINT)) + . . . Q + . . S ^BMXTEMP($J,I)=A(BMXFN,IEN0,F,BMXINT) + . . S:$L(A(BMXFN,IEN0,F,BMXINT))>BMXLEN(BMXORD) BMXLEN(BMXORD)=$L(A(BMXFN,IEN0,F,BMXINT)) + . Q + ;---> Set data in result global. + I $D(^BMXTEMP($J,I)) S ^BMXTEMP($J,I)=^BMXTEMP($J,I)_$C(30) +ZZZ Q diff --git a/m/BMXTABLE.m b/m/BMXTABLE.m new file mode 100644 index 0000000..9f67235 --- /dev/null +++ b/m/BMXTABLE.m @@ -0,0 +1,7 @@ +BMXTABLE ; IHS/OIT/HMW - BMX RETURN ENTIRE TABLE ; + ;;2.1;BMX;;Jul 26, 2009 + ; +TABLE(BMXGBL,BMXFL,BMXMX) ;EP + ; + D FIND^BMXFIND(.BMXGBL,BMXFL,"*",,,BMXMX,,,,1) + Q diff --git a/m/BMXTRS.m b/m/BMXTRS.m new file mode 100644 index 0000000..08fde46 --- /dev/null +++ b/m/BMXTRS.m @@ -0,0 +1,42 @@ +BMXTRS ; IHS/OIT/HMW - UPPERCASE-LOWERCASE ; + ;;2.1;BMX;;Jul 26, 2009 + ; +T(X) ;EP + ;---> Translate word to mixed case. + ; + N BMXWORD,I + I '$D(X) Q "" + I X="^" Q X + I X=" " Q X + ;-----> REMOVE LEADING INAPPROPRIATE CHARACTERS IF PRESENT. + F Q:$E(X)'?1P S X=$E(X,2,99) + ;-----> CHANGE FIRST LETTER TO UPPERCASE: + S BMXWORD=$E(X) + I $E(BMXWORD)?1L S BMXWORD=$C($A($E(BMXWORD))-32) + ;-----> DO NEXT CHARACTER + F I=2:1:$L(X) D CHAR + ;-----> REMOVE TRAILING SPACE OR QUOTE. + F Q:""" "'[$E(BMXWORD,$L(BMXWORD)) D + .S BMXWORD=$E(BMXWORD,1,($L(BMXWORD)-1)) + ;-----> RESET X EQUAL TO RESULT +EOJ ; + Q BMXWORD + ; +CHAR ; + ;-----> IF THE CHARACTER IS UPPERCASE AND PREVIOUS CHARACTER IS NOT + ;-----> PUNCTUATION (EXCEPT FOR AN APOSTROPHY) OR A SPACE, + ;-----> THEN CHANGE CHARACTER TO LOWERCASE: + I ($E(X,I)?1U)&(($E(X,I-1)'?1P)!($E(X,I-1)="'")) D Q + .S BMXWORD=BMXWORD_$C($A($E(X,I))+32) + ; + ;-----> IF THE CHARACTER IS LOWERCASE AND PREVIOUS CHARACTER IS + ;-----> PUNCTUATION (BUT NOT AN APOSTROPHY) OR A SPACE, THEN CHANGE + ;-----> CHARACTER TO UPPERCASE: + I $E(X,I)?1L,$E(X,I-1)?1P,$E(X,I-1)'="'" D Q + .S BMXWORD=BMXWORD_$C($A($E(X,I))-32) + ; + ;-----> ADD CHARACTER TO BMXWORD STRING WITHOUT MODIFICATION. + ;-----> "\" PLACED BEFORE A LETTER FORCES IT TO BE UPPERCASE; + ;-----> HERE REMOVE ANY "\"'s. + I $E(X,I)'="\" S BMXWORD=BMXWORD_$E(X,I) + Q diff --git a/m/BMXUTL1.m b/m/BMXUTL1.m new file mode 100644 index 0000000..2e2fb4d --- /dev/null +++ b/m/BMXUTL1.m @@ -0,0 +1,330 @@ +BMXUTL1 ; IHS/OIT/HMW - UTIL: PATIENT DEMOGRAPHICS ; + ;;2.1;BMX;;Jul 26, 2009 + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * + ;; UTILITY: PATIENT DEMOGRAPHICS. + ; + ; + ;---------- +NAME(DFN,ORDER) ;EP + ;---> Return text of Patient Name. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - ORDER (opt) ""/0=Last,First 2=First Only + ; 1=First Last 3=Last Only + ; + Q:'$G(DFN) "NO PATIENT" + Q:'$D(^DPT(DFN,0)) "Unknown" + N X S X=$P(^DPT(DFN,0),U) + Q:'$G(ORDER) X + S X=$$FL(X) + Q:ORDER=1 X + Q:ORDER=2 $P(X," ") + Q:ORDER=3 $P(X," ",2) + Q "UNKNOWN ORDER" + ; + ; + ;---------- +FL(X) ;EP + ;---> Switch First and Last Names. + Q $P($P(X,",",2)," ")_" "_$P(X,",") + ; + ; + ;---------- +DOB(DFN) ;EP + ;---> Return Patient's Date of Birth in Fileman format. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; + Q:'$G(DFN) "NO PATIENT" + Q:'$P($G(^DPT(DFN,0)),U,3) "NOT ENTERED" + Q $P(^DPT(DFN,0),U,3) + ; + ; + ;---------- +DOBF(DFN,BMXDT,BMXNOA) ;EP + ;---> Date of Birth formatted "09-Sep-1994 (35 Months)" + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - BMXDT (opt) Date on which Age should be calculated. + ; 3 - BMXNOA (opt) 1=No age (don't append age). + ; + N X,Y + S X=$$DOB($G(DFN)) + Q:'X X + S X=$$TXDT1^BMXUTL5(X) + Q:$G(BMXNOA) X + S Y=$$AGEF(DFN,$G(BMXDT)) + S:Y["DECEASED" Y="DECEASED" + S X=X_" ("_Y_")" + Q X + ; + ; + ;---------- +AGE(DFN,BMXZ,BMXDT) ;EP + ;---> Return Patient's Age. + ;---> Parameters: + ; 1 - DFN (req) IEN in PATIENT File. + ; 2 - BMXZ (opt) BMXZ=1,2,3 1=years, 2=months, 3=days. + ; 2 will be assumed if not passed. + ; 3 - BMXDT (opt) Date on which Age should be calculated. + ; + N BMXDOB,X,X1,X2 S:$G(BMXZ)="" BMXZ=2 + Q:'$G(DFN) "NO PATIENT" + S BMXDOB=$$DOB(DFN) + Q:'BMXDOB "Unknown" + I '$G(BMXDT)&($$DECEASED(DFN)) D Q X + .S X="DECEASED: "_$$TXDT1^BMXUTL5(+^DPT(DFN,.35)) + S:'$G(DT) DT=$$DT^XLFDT + S:'$G(BMXDT) BMXDT=DT + Q:BMXDT Age in Years. + N BMXAGEY,BMXAGEM,BMXD1,BMXD2,BMXM1,BMXM2,BMXY1,BMXY2 + S BMXM1=$E(BMXDOB,4,7),BMXM2=$E(BMXDT,4,7) + S BMXY1=$E(BMXDOB,1,3),BMXY2=$E(BMXDT,1,3) + S BMXAGEY=BMXY2-BMXY1 S:BMXM2 Age in Months. + S BMXD1=$E(BMXM1,3,4),BMXM1=$E(BMXM1,1,2) + S BMXD2=$E(BMXM2,3,4),BMXM2=$E(BMXM2,1,2) + S BMXAGEM=12*BMXAGEY + I BMXM2=BMXM1&(BMXD2BMXM1 S BMXAGEM=BMXAGEM+BMXM2-BMXM1 + I BMXM2 Age in Days. + S X1=BMXDT,X2=BMXDOB + D ^%DTC + Q X + ; + ; + ;---------- +AGEF(DFN,BMXDT) ;EP + ;---> Age formatted "35 Months" or "23 Years" + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - BMXDT (opt) Date on which Age should be calculated. + ; + N Y + S Y=$$AGE(DFN,2,$G(BMXDT)) + Q:Y["DECEASED" Y + Q:Y["NOT BORN" Y + ; + ;---> If over 60 months, return years. + Q:Y>60 $$AGE(DFN,1,$G(BMXDT))_" years" + ; + ;---> If under 1 month return days. + I Y<1 S Y=$$AGE(DFN,3,$G(BMXDT)) Q Y_$S(Y=1:" day",1:" days") + ; + ;---> Return months + Q Y_$S(Y=1:" month",1:" months") + ; + ; + ;---------- +DECEASED(DFN,BMXDT) ;EP + ;---> Return 1 if patient is deceased, 0 if not deceased. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - BMXDT (opt) If BMXDT=1 return Date of Death (Fileman format). + ; + Q:'$G(DFN) 0 + N X S X=+$G(^DPT(DFN,.35)) + Q:'X 0 + Q:'$G(BMXDT) 1 + Q X + ; + ; + ;---------- +SEX(DFN,PRON) ;EP + ;---> Return "F" is patient is female, "M" if male. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - PRON (opt) Pronoun: 1=he/she, 2=him/her,3=his,her + ; + Q:'$G(DFN) "" + Q:'$D(^DPT(DFN,0)) "" + N X S X=$P(^DPT(DFN,0),U,2) + Q:'$G(PRON) X + I PRON=1 Q $S(X="F":"she",1:"he") + I PRON=2 Q $S(X="F":"her",1:"him") + I PRON=3 Q $S(X="F":"her",1:"his") + Q X + ; + ; + ;---------- +SEXW(DFN) ;EP + ;---> Return Patient sex: "Female"/"Male". + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; + Q:$$SEX(DFN)="M" "Male" + Q:$$SEX(DFN)="F" "Female" + Q "Unknown" + ; + ; + ;---------- +NAMAGE(DFN) ;EP + ;---> Return Patient Name concatenated with age. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; + Q:'$G(DFN) "NO PATIENT" + Q $$NAME(DFN)_" ("_$$AGE(DFN)_"y/o)" + ; + ; + ;---------- +SSN(DFN) ;EP + ;---> Return Social Security Number (SSN). + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + N X + Q:'$G(DFN) "NO PATIENT" + Q:'$D(^DPT(DFN,0)) "Unknown" + S X=$P(^DPT(DFN,0),U,9) + Q:X']"" "Unknown" + Q X + ; + ; + ;---------- +HRCN(DFN,DUZ2,AGD) ;EP + ;---> Return IHS Health Record Number. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - DUZ2 (opt) User's Site/Location IEN. If no DUZ2 + ; provided, function will look for DUZ(2). + ; 3 - AGD (opt) If AGD=1 return HRCN with no dashes. + ; + ; + S:'$G(DUZ2) DUZ2=$G(DUZ(2)) + Q:'$G(DFN)!('$G(DUZ2)) "Unknown1" + Q:'$D(^AUPNPAT(DFN,41,DUZ2,0)) "Unknown2" + Q:'+$P(^AUPNPAT(DFN,41,DUZ2,0),"^",2) "Unknown3" + N Y S Y=$P(^AUPNPAT(DFN,41,DUZ2,0),"^",2) + Q:$G(AGD) Y + Q:'+Y Y + I $L(Y)=7 D Q Y + .S Y=$TR("123-45-67",1234567,Y) + S Y=$E("00000",0,6-$L(Y))_Y + S Y=$TR("12-34-56",123456,Y) + Q Y + ; + ; + ;---------- +PHONE(AGDFN,AGOFF) ;EP + ;---> Return patient's home phone number. + ;---> Parameters: + ; 1 - AGDFN (req) Patient's IEN (DFN). + ; 2 - AGOFF (opt) =1 will return Patient's Office Phone. + ; + Q:'$G(AGDFN) "Error: No DFN" + Q $P($G(^DPT(AGDFN,.13)),U,$S($G(AGOFF):2,1:1)) + ; + ; + ;---------- +STREET(DFN) ;EP + ;---> Return patient's street address. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; + Q:'$G(DFN) "No Patient" + Q:'$D(^DPT(DFN,.11)) "" + Q:$P(^DPT(DFN,.11),U)="" "" + Q $P(^DPT(DFN,.11),U) + ; + ; + ;---------- +CITY(DFN) ;EP + ;---> Return patient's city. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; + Q:'$G(DFN) "No Patient" + Q:'$D(^DPT(DFN,.11)) "" + Q:$P(^DPT(DFN,.11),U,4)="" "" + Q $P(^DPT(DFN,.11),U,4) + ; + ; + ;---------- +STATE(DFN,NOTEXT) ;EP + ;---> Return patient's state. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - NOTEXT (opt) If NOTEXT=1 return only the State IEN. + ; If NOTEXT=2 return IEN|Text. + ; + Q:'$G(DFN) "" + N Y S Y=$P($G(^DPT(DFN,.11)),U,5) + Q:$G(NOTEXT)=1 Y + Q:$G(NOTEXT)=2 Y_"|"_$$GET^BMXG(1,Y) + Q $$GET^BMXG(1,Y) + ; + ; + ;---------- +ZIP(DFN) ;EP + ;---> Return patient's zipcode. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; + Q:'$G(DFN) "No Patient" + Q:'$D(^DPT(DFN,.11)) "" + Q:$P(^DPT(DFN,.11),U,6)="" "" + Q $P(^DPT(DFN,.11),U,6) + ; + ; + ;---------- +CTYSTZ(DFN) ;EP + ;---> Return patient's city, state zip. + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; + Q:'$G(DFN) "No Patient" + Q $$CITY(DFN)_", "_$$STATE(DFN)_" "_$$ZIP(DFN) + ; + ; +CURCOM(DFN,NOTEXT) ;EP + ;---> Return patient's Current Community IEN or Text. + ;---> (Item 6 on page 1 of Registration). + ;---> Parameters: + ; 1 - DFN (req) Patient's IEN (DFN). + ; 2 - NOTEXT (opt) If NOTEXT=1 return only the Current Comm IEN. + ; If NOTEXT=2 return IEN|Text. + ; + Q:'$G(DFN) "No Patient" + Q:'$D(^AUPNPAT(DFN,11)) "" ;"Unknown1" + ; + N X,Y,Z + S X=^AUPNPAT(DFN,11) + ;---> Set Y=Pointer (IEN in ^AUTTCOM, piece 17), Z=Text (piece 18). + S Y=$P(X,U,17),Z=$P(X,U,18) + ;---> If both Pointer and Text are null, return "Unknown2". + Q:('Y&(Z="")) "" ;"Unknown2" + ; + ;---> If Y is null or a bad pointer, set Y="". + I Y<1!('$D(^AUTTCOM(+Y,0))) S Y="" + ; + ;---> If no valid pointer and if Text (pc 18) exists in the + ;---> Community file, then set Y=IEN in ^AUTTCOM(. + I Y<1,$D(^AUTTCOM("B",Z)) S Y=$O(^AUTTCOM("B",Z,0)) + ; + Q:'$D(^AUTTCOM(+Y,0)) "" ;"Unknown3" + Q:$G(NOTEXT)=1 Y + Q:$G(NOTEXT)=2 Y_"|"_$$GET^BMXG(2,Y) + Q $$GET^BMXG(2,Y) + ; + ; + ;---------- +PERSON(X,ORDER) ;EP + ;---> Return person's name from File #200. + ;---> Parameters: + ; 1 - X (req) Person's IEN in New Person File #200. + ; 2 - ORDER (opt) ""/0=Last,First 1=First Last + ; + Q:'X "Unknown" + Q:'$D(^VA(200,X,0)) "Unknown" + N Y S Y=$P(^VA(200,X,0),U) + Q:'$G(ORDER) Y + Q $$FL(Y) diff --git a/m/BMXUTL2.m b/m/BMXUTL2.m new file mode 100644 index 0000000..4ed9243 --- /dev/null +++ b/m/BMXUTL2.m @@ -0,0 +1,32 @@ +BMXUTL2 ; IHS/OIT/HMW - UTIL: PATIENT INFO ; + ;;2.1;BMX;;Jul 26, 2009 + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * + ;; UTILITY: PATIENT FUNCTIONS: CONTRAS, INPATIENT, HIDOSE. + ; +NEXTAPPT(BMXDFN) ;EP + ;---> Return patient's next appointment from Scheduling Package. + ;---> Parameters: + ; 1 - BMXDFN (req) Patient's IEN (BMXDFN). + ; + Q:'$G(BMXDFN) "" + Q:'$D(^DPT(BMXDFN)) "" + ; + N BMXAPPT,BMXDT,BMXYES + S BMXDT=DT+.2400,BMXYES=0 + F S BMXDT=$O(^DPT(BMXDFN,"S",BMXDT)) Q:'BMXDT!(BMXYES) D + .N BMXDATA,BMXOI,X + .S BMXDATA=$G(^DPT(BMXDFN,"S",BMXDT,0)) + .Q:BMXDATA="" + .; + .;---> Quit if appointment is cancelled. + .Q:$P(BMXDATA,U,2)["C" + .; + .S X=0 F S X=$O(^SC(+BMXDATA,"S",BMXDT,1,X)) Q:'X D + ..Q:+$G(^SC(+BMXDATA,"S",BMXDT,1,X,0))'=BMXDFN + ..S BMXYES=BMXDT_U_+BMXDATA + ; + Q:'BMXYES "" + ; + S BMXAPPT=$$FMTE^XLFDT(+BMXYES,"1P")_" with " + S BMXAPPT=BMXAPPT_$P($G(^SC($P(BMXYES,U,2),0)),U) + Q BMXAPPT diff --git a/m/BMXUTL5.m b/m/BMXUTL5.m new file mode 100644 index 0000000..b0fbcb6 --- /dev/null +++ b/m/BMXUTL5.m @@ -0,0 +1,217 @@ +BMXUTL5 ; IHS/OIT/HMW - DATE FORMAT ; + ;;2.1;BMX;;Jul 26, 2009 + ;;Stolen from:* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER * + ;; UTILITY: SETVARS, CENTERT, COPYLET, + ;; UPPERCASE XREFS, DATE FORMATS, PADS/SPACES. + ; + ; + ;---------- +SETVARS ;EP + ;---> Set standard variables. + D ^XBKVAR + S:'$D(IOF) IOF="#" + Q + ; + ; + ;---------- +PHONFIX(X) ;EP + ;---> Remove parentheses from Phone#. + ;---> Parameters: + ; 1 - X (req) Input Phone Number; returned without parentheses. + ; + Q:$G(X)="" + S X=$TR(X,"(","") + S X=$TR(X,")","-") + S X=$TR(X,"/","-") + S:X["- " X=$P(X,"- ")_"-"_$P(X,"- ",2) + S:$E(X,4)=" " $E(X,4)="-" + S:X["--" X=$P(X,"--")_"-"_$P(X,"--",2) + S:X?7N X=$E(X,1,3)_"-"_$E(X,4,7) + Q + ; + ; + ;---------- +CENTERT(TEXT,X) ;EP + ;---> Pad TEXT with leading spaces to center in 80 columns. + ;---> Parameters: + ; 1 - TEXT (req) Text to be centered. + ; 2 - X (opt) Columns to adjust to the right. + ; + S:$G(TEXT)="" TEXT="* NO TEXT SUPPLIED *" + S:'$G(X) X=39 + N I + F I=1:1:(X-($L(TEXT)/2)) S TEXT=" "_TEXT + Q + ; + ; + ;---------- +UPPER(X) ;EP + ;---> Translate X to all uppercase. + ;---> Parameters: + ; 1 - X (req) Value to be translated into all uppercase. + ; + S X=$TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") + Q X + ; + ; + ;---------- +UPXREF(X,AGGBL) ;EP + ;---> Set uppercase xref for X. Called from M xrefs on mixed case + ;---> fields where an all uppercase lookup is needed. + ;---> Parameters: + ; 1 - X (req) The value that should be xrefed in uppercase. + ; 2 - AGGBL (req) The global root of the file. + ; + ;---> Variables: + ; 1 - DA (req) IEN of the entry being xrefed. + ; + Q:'$D(AGGBL) Q:$G(X)="" Q:'$G(DA) + S @(AGGBL_"""U"",$E($$UPPER(X),1,30),DA)")="" + Q + ; + ; + ;---------- +KUPXREF(X,AGGBL) ;EP + ;---> Kill uppercase xref for X. Called from M xrefs on mixed case + ;---> fields where an all uppercase lookup is needed. + ;---> Parameters: + ; 1 - X (req) The value that should be xrefed in uppercase. + ; 2 - AGGBL (req) The global root of the file. + ; + ;---> Variables: + ; 1 - DA (req) IEN of the entry being xrefed. + ; + Q:'$D(AGGBL) Q:$G(X)="" Q:'$G(DA) + K @(AGGBL_"""U"",$E($$UPPER(X),1,30),DA)") + Q + ; + ; + ;---------- +SLDT2(DATE) ;EP + ;---> CONVERT FILEMAN INTERNAL DATE TO "SLASH" FORMAT: MM/DD/YYYY. + ;---> DATE=DATE IN FILEMAN FORMAT. + Q:'$G(DATE) "NO DATE" + S DATE=$P(DATE,".") + Q:$L(DATE)'=7 DATE + Q:'$E(DATE,4,5) $E(DATE,1,3)+1700 + Q:'$E(DATE,6,7) $E(DATE,4,5)_"/"_$E(DATE,2,3) + Q $E(DATE,4,5)_"/"_$E(DATE,6,7)_"/"_($E(DATE,1,3)+1700) + ; + ; + ;---------- +SLDT1(DATE) ;EP + ;---> CONVERT FILEMAN INTERNAL DATE TO "SLASH" FORMAT: + ;---> MM/DD/YYYY @TIME + N Y + Q:'$D(DATE) "NO DATE" + S Y=DATE,DATE=$P(DATE,".") + Q:'DATE "NO DATE" + Q:$L(DATE)'=7 DATE + Q:'$E(DATE,4,5) $E(DATE,1,3)+1700 + Q:'$E(DATE,6,7) $E(DATE,4,5)_"/"_$E(DATE,2,3) + D DD^%DT S:Y["@" Y=" @ "_$P($P(Y,"@",2),":",1,2) + Q $E(DATE,4,5)_"/"_$E(DATE,6,7)_"/"_($E(DATE,1,3)+1700)_Y + ; + ; + ;---------- +NOSLDT(DATE) ;EP + ;---> CONVERT FILEMAN INTERNAL DATE TO "NO SLASH" FORMAT: MMDDYYYY. + ;---> DATE=DATE IN FILEMAN FORMAT. + Q:'$G(DATE) "NO DATE" + S DATE=$P(DATE,".") + Q:$L(DATE)'=7 DATE + Q $E(DATE,4,5)_$E(DATE,6,7)_($E(DATE,1,3)+1700) + ; + ; + ;---------- +IMMSDT(DATE) ;EP + ;---> Convert Immserve Date (format MMDDYYYY) TO FILEMAN + ;---> Internal format. + ;---> NOTE: This code is copied into routine ^AGPATUP1 for speed. + ;---> Any changes here should also be made to the call in ^AGPATUP1. + Q:'$G(DATE) "NO DATE" + Q ($E(DATE,5,9)-1700)_$E(DATE,1,2)_$E(DATE,3,4) + ; + ; + ;---------- +TXDT1(DATE,TIME) ;EP + ;---> Return external date in format: DD-Mmm-YYYY@HH:MM, from Fileman + ;---> internal YYYMMDD.HHMM + ;---> Parameters: + ; 1 - DATE (req) Internal Fileman date. + ; 2 - TIME (opt) + ; + Q:'$G(DATE) "NO DATE" + N X,Y,Z + S X="Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec" + S Y=$E(DATE,6,7)_"-"_$P(X,U,$E(DATE,4,5))_"-"_($E(DATE,1,3)+1700) + S:'$E(DATE,6,7) Y=$E(Y,4,99) + S:'$E(DATE,4,5) Y=$E(DATE,1,3)+1700 + Q:'$G(TIME) Y + S Z=$P(DATE,".",2) + Q:'Z Y + Q Y_" @"_$E(Z,1,2)_":"_$$PAD($E(Z,3,4),2,"0") + ; + ; + ;---------- +TXDT(DATE) ;EP + ;---> CONVERT FILEMAN INTERNAL DATE TO "TEXT" FORMAT: MMM DD,YYYY. + N Y + Q:'$D(DATE) "NO DATE" + S Y=DATE D DD^%DT + I Y[", " S Y=$P(Y,", ")_","_$P(Y,", ",2) + I Y["@" S Y=$P(Y,"@")_" "_$P($P(Y,"@",2),":",1,2) + Q Y + ; + ; + ;---------- +NOW() ;EP + ;---> Return Current Date and Time in external format. + N %H,X,Y,Z + S %H=$H + D YX^%DTC + I Y["@" S Y=$P($P(Y,"@",2),":",1,2) + S Z=$$TXDT1(X) + S:Y]"" Z=Z_" @"_Y + Q Z + ; + ; + ;---------- +PAD(D,L,C) ;EP + ;---> Pad the length of data to a total of L characters + ;---> by adding spaces to the end of the data. + ; Example: S X=$$PAD("MIKE",7) X="MIKE " (Added 3 spaces.) + ;---> Parameters: + ; 1 - D (req) Data to be padded. + ; 2 - L (req) Total length of resulting data. + ; 3 - C (opt) Character to pad with (default=space). + ; + Q:'$D(D) "" + S:'$G(L) L=$L(D) + S:$G(C)="" C=" " + Q $E(D_$$REPEAT^XLFSTR(C,L),1,L) + ; + ; + ;---------- +SP(N,C) ;EP + ;---> Return N spaces or other character. + ; Example: S X=$$SP(5)_X Pads the front of X with 5 spaces. + ;---> Parameters: + ; 1 - N (req) Number of spaces to be returned as extrinsic var. + ; 2 - C (opt) Character to pad with (default=space). + ; + Q:$G(N)<1 "" + S:$G(C)="" C=" " + Q $$PAD(C,N,C) + ; + ; + ;---------- +STRIP(X) ;EP + ;---> Strip any punctuation characters from the beginning of X, + ;---> including spaces. + ;---> Parameters: + ; 1 - X (req) String of characters. + ; + Q:$G(X)="" "" + F Q:$E(X)'?1P S X=$E(X,2,99) + Q X diff --git a/m/BMXUTL6.m b/m/BMXUTL6.m new file mode 100644 index 0000000..ffccbf4 --- /dev/null +++ b/m/BMXUTL6.m @@ -0,0 +1,36 @@ +BMXUTL6 ; IHS/OIT/HMW - BMXNET INSTALLATION CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +POST ;EP - Called from BMX Installation postinit + ; + ;Add BMX AV CODE to XUS SIGNON broker option + N BMXFDA,BMXIEN,BMXMSG,BMXIENS,BMXMENN,BMXAVI + S BMXAVI=$O(^XWB(8994,"B","BMX AV CODE",0)) + Q:'+BMXAVI + S BMXIENS=$O(^DIC(19,"B","XUS SIGNON",0)) + Q:'+BMXIENS + ; + S BMXIENS="?+2,"_BMXIENS_"," + S BMXFDA(19.05,BMXIENS,.01)=BMXAVI + K BMXIEN,BMXMSG + S DIC(0)="" + D UPDATE^DIE("","BMXFDA","BMXIEN","BMXMSG") + Q + ; + ; + ; + ;Create BMXNET,APPLICATION user and set attributes + ; + ;N BMXFDA,BMXIEN,BMXMSG,BMXIENS,BMXMENN + ;S BMXIENS = "?+1," + ;S BMXFDA(200,BMXIENS,.01)="BMXNET,APPLICATION" + ;S BMXFDA(200,BMXIENS,2)="1_(a>yr}:3x3ja9\8vbH" + ;S BMXFDA(200,BMXIENS,11)="$;HOSs|:3w25lLD}Be=" + ;S BMXFDA(200,BMXIENS,11.2)="88888,88888" + ;S BMXMENN=$O(^DIC(19,"B","BMXRPC",0)) + ;I +BMXMENN S BMXFDA(200.03,"?+2,?+1,",.01)=BMXMENN + ;K BMXIEN,BMXMSG + ;S DIC(0)="" + ;D UPDATE^DIE("","BMXFDA","BMXIEN","BMXMSG") + Q diff --git a/m/BMXUTL7.m b/m/BMXUTL7.m new file mode 100644 index 0000000..6283e76 --- /dev/null +++ b/m/BMXUTL7.m @@ -0,0 +1,8 @@ +BMXUTL7 ; IHS/OIT/HMW - BMXNET INSTALLATION CALLS ; + ;;2.1;BMX;;Jul 26, 2009 + ; + ; +ENV ;EP Environment Check + I $G(XPDENV)=1 D + . S XPDDIQ("XPZ1")=0 + . S XPDDIQ("XPZ2")=0 diff --git a/m/XWBTCPM.m b/m/XWBTCPM.m new file mode 100644 index 0000000..0952334 --- /dev/null +++ b/m/XWBTCPM.m @@ -0,0 +1,236 @@ +XWBTCPM ;ISF/RWF - BROKER TCP/IP PROCESS HANDLER ;8/29/07 22:11 + ;;1.1;RPC BROKER;**35,43,49**;Mar 28, 1997;Build 6 + ;Based on: XWBTCPC & XWBTCPL, Modified by ISF/RWF + ;Changed to be started by UCX or %ZISTCPS + ; +DSM ;DSM called from ucx, % passed in with device. + D ESET + ;Open the device + S XWBTDEV=% X "O XWBTDEV:(TCPDEV):60" ;Special UCX/DSM open + ;Go find the connection type + U XWBTDEV + G CONNTYPE + ; +CACHEVMS ;Cache'/VMS tcpip entry point, called from XWBTCP_START.COM file + D ESET + S XWBTDEV="SYS$NET" + ; **Cache'/VMS specific code** + O XWBTDEV::5 + X "U XWBTDEV:(::""-M"")" ;Packet mode like DSM + G CONNTYPE + ; +NT ;entry from ZISTCPS + ;JOB LISTEN^%ZISTCPS("port","NT^XWBTCPM","stop code") + D ESET + S XWBTDEV=IO + G CONNTYPE + ; +GTMUCX(%) ;From ucx ZFOO + ;If called from LISTEN^%ZISTCP(PORT,"GTM^XWBTCPM") S XWBTDEV=IO + D ESET + ;GTM specific code + S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") + S XWBTDEV=% X "O %:(RECORDSIZE=512)" + G CONNTYPE + ; +GTMLNX ;From Linux xinetd script + D ESET + ;GTM specific code + S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") + S XWBTDEV=$P X "U XWBTDEV:(nowrap:nodelimiter:ioerror=""TRAP"")" + S %="",@("%=$ZTRNLNM(""REMOTE_HOST"")") S:$L(%) IO("GTM-IP")=% + I %["::ffff:" S IO("GTM-IP")=$P(%,"::ffff:",2) ; ipv6 support + G CONNTYPE + ; +ESET ;Set inital error trap + S U="^",$ETRAP="D ^%ZTER H" ;Set up the error trap + S X="",@^%ZOSF("TRAP") ;Clear old trap + Q + ;Find the type of connection and jump to the processing routine. +CONNTYPE ; + N XWBDEBUG,XWBAPVER,XWBCLMAN,XWBENVL,XWBLOG,XWBOS,XWBPTYPE + N XWBTBUF,XWBTIP,XWBTSKT,XWBVER,XWBWRAP,XWBSHARE,XWBT + N SOCK,TYPE + D INIT + S XWB=$$BREAD^XWBRW(5,XWBTIME) + D LOG("MSG format is "_XWB_" type "_$S(XWB="[XWB]":"NEW",XWB="{XWB}":"OLD",XWB="0:^XTV(8989.3,1,4,X,0),1:"ROU^y^1") + I $G(^%ZIS(14.5,"LOGON",XWBVOL)) Q 0 ;Check INHIBIT LOGONS? + I $D(^%ZOSF("ACTJ")) X ^("ACTJ") I $P(J,U,3),($P(J,U,3)'>Y) Q 0 + Q 1 + ; +M2M ;M2M Broker + S XWBRBUF=XWB_XWBRBUF,(IO,IO(0))=XWBTDEV G SPAWN^XWBVLL + Q + ; +NEW ;New broker + S U="^",DUZ=0,DUZ(0)="",XWBVER=1.108 + D SETTIME(1) ;Setup for sign-on timeout + U XWBTDEV D + . N XWB,ERR,NATIP,I + . S ERR=$$PRSP^XWBPRS + . S ERR=$$PRSM^XWBPRS + . S MSG=$G(XWB(4,"CMD")) ;Build connect msg. + . S I="" F S I=$O(XWB(5,"P",I)) Q:I="" S MSG=MSG_U_XWB(5,"P",I) + . ;Get the peer and save that IP. + . S NATIP=$$GETPEER^%ZOSV S:'$L(NATIP) NATIP=$P(MSG,"^",2) + . I NATIP'=$P(MSG,"^",2) S $P(MSG,"^",2)=NATIP + . Q + S X=$$NEWJOB() D:'X LOG("No New Connects") + I ($P(MSG,U)'="TCPConnect")!('X) D QSND^XWBRW("reject"),LOG("reject: "_MSG) Q + D QSND^XWBRW("accept"),LOG("accept") ;Ack + S IO("IP")=$P(MSG,U,2),XWBTSKT=$P(MSG,U,3),XWBCLMAN=$P(MSG,U,4) + S XWBTIP=$G(IO("IP")) + ;start RUM for Broker Handler XWB*1.1*5 + D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,1) + ;GTM + I $G(XWBT("PCNT")) D + . S X=$NA(^XUTL("XUSYS",$J,1)) L +@X:0 + . D COUNT^XUSCNT(1),SETLOCK^XUSCNT(X) + ;We don't use a callback + K XWB,CON,LEN,MSG ;Clean up + ;Attempt to share license, Must have TCP port open first. + U XWBTDEV ;D SHARELIC^%ZOSV(1) + ;setup null device "NULL" + S %ZIS="0H",IOP="NULL" D ^%ZIS S XWBNULL=IO I POP S XWBERROR="No NULL device" D ^%ZTER,EXIT Q + D SAVDEV^%ZISUTL("XWBNULL") + ;change process name + D CHPRN("ip"_$P(XWBTIP,".",3,4)_":"_XWBTDEV) + ; +RESTART ;The error trap returns to here + N $ESTACK S $ETRAP="D ETRAP^XWBTCPM" + S DT=$$DT^XLFDT,DTIME=30 + U XWBTDEV D MAIN + D LOG("Exit: "_XWBTBUF) + ;Turn off the error trap for the exit + S $ETRAP="" + D EXIT ;Logout + K XWBR,XWBARY + ;stop RUM for handler XWB*1.1*5 + D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,2) + D USE^%ZISUTL("XWBNULL"),CLOSE^%ZISUTL("XWBNULL") + ;Close in the calling script + K SOCK,TYPE,XWBSND,XWBTYPE,XWBRBUF + Q + ; +MAIN ; -- main message processing loop. debug at MAIN+1 + F D Q:XWBTBUF="#BYE#" + . ;Setup + . S XWBAPVER=0,XWBTBUF="",XWBTCMD="",XWBRBUF="" + . K XWBR,XWBARY,XWBPRT + . ; -- read client request + . S XR=$$BREAD^XWBRW(1,XWBTIME,1) + . I '$L(XR) D LOG("Timeout: "_XWBTIME) S XWBTBUF="#BYE#" Q + . S XR=XR_$$BREAD^XWBRW(4) + . I XR="#BYE#" D Q ;Check for exit + . . D QSND^XWBRW("#BYE#"),LOG("BYE CMD") S XWBTBUF="#BYE#" + . . Q + . S TYPE=(XR="[XWB]") ;check HDR + . I 'TYPE D LOG("Bad Header: "_XR) Q + . D CALLP^XWBPRS(.XWBR,$G(XWBDEBUG)) ;Read the NEW Msg parameters and call RPC + . IF XWBTCMD="#BYE#" D Q + . . D QSND^XWBRW("#BYE#"),LOG("BYE CMD") S XWBTBUF=XWBTCMD + . . Q + . U XWBTDEV + . S XWBPTYPE=$S('$D(XWBPTYPE):1,XWBPTYPE<1:1,XWBPTYPE>6:1,1:XWBPTYPE) + . ;I $G(XWBPRT) D RETURN^XWBPRS2 Q ;New msg return + . I '$G(XWBPRT) D SND^XWBRW ;Return data,flush buffer + Q ;End Of Main + ; + ; +ETRAP ; -- on trapped error, send error info to client + N XWBERC,XWBERR + ;Change trapping during trap. + S $ETRAP="D ^%ZTER,EXIT^XWBTCPM HALT" + S XWBERC=$E($$EC^%ZOSV,1,200),XWBERR="M ERROR="_XWBERC_$C(13,10)_"LAST REF="_$$LGR^%ZOSV + I $EC["U411" S XWBERROR="U411",XWBSEC="",XWBERR="Data Transfer Error to Server" + D ^%ZTER ;%ZTER clears $ZE and $ZCODE + D LOG("In ETRAP: "_XWBERC) ;Log + I (XWBERC["READ")!(XWBERC["WRITE")!(XWBERC["SYSTEM-F")!(XWBERC["IOEOF") D EXIT HALT + U XWBTDEV + I $G(XWBT("PCNT")) L ^XUTL("XUSYS",$J,0) + E L ;Clear Locks + ;I XWBOS'="DSM" D + S XWBPTYPE=1 ;So SNDERR won't check XWBR + ;D SNDERR^XWBRW,WRITE^XWBRW($C(24)_XWBERR_$C(4)) + D ESND^XWBRW($C(24)_XWBERR_$C(4)) + S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" D CLEANP^XWBTCPM G RESTART^XWBTCPM",$ECODE=",U99," + Q + ; +CLEANP ;Clean up the partion + N XWBTDEV,XWBNULL D KILL^XUSCLEAN + Q + ; +STYPE(X,WRAP) ;For backward compatability only + I $D(WRAP) Q $$RTRNFMT^XWBLIB($G(X),WRAP) + Q $$RTRNFMT^XWBLIB(X) + ; +BREAD(L,T) ;read tcp buffer, L is length + Q $$BREAD^XWBRW(L,$G(T)) + ; +CHPRN(N) ;change process name + ;Change process name to N + D SETNM^%ZOSV($E(N,1,15)) + Q + ; +SETTIME(%) ;Set the Read timeout 0=RPC, 1=sign-on + S XWBTIME=$S($G(%):90,$G(XWBVER)>1.105:$$BAT^XUPARAM,1:36000),XWBTIME(1)=2 + I $G(%) S XWBTIME=$S($G(XWBVER)>1.1:90,1:36000) + Q +TIMEOUT ;Do this on MAIN loop timeout + I $G(DUZ)>0 D QSND^XWBRW("#BYE#") Q + ;Sign-on timeout + S XWBR(0)=0,XWBR(1)=1,XWBR(2)="",XWBR(3)="TIME-OUT",XWBPTYPE=2 + D SND^XWBRW + Q + ; +OS() ;Return the OS + ; Q $S(^%ZOSF("OS")["DSM":"DSM",^("OS")["UNIX":"UNIX",^("OS")["OpenM":"OpenM",1:"MSM") //SMH + Q $S(^%ZOSF("OS")["DSM":"DSM",^("OS")["GT.M":"GT.M",^("OS")["OpenM":"OpenM",1:"MSM") + ; +INIT ;Setup + S U="^",XWBTIME=10,XWBOS=$$OS,XWBDEBUG=0,XWBRBUF="" + S XWBDEBUG=$$GET^XPAR("SYS","XWBDEBUG") + S XWBT("BF")=$S(XWBOS="GT.M":"#",1:"!") + S XWBT("PCNT")=0 I XWBOS="GT.M",$L($T(^XUSCNT)) S XWBT("PCNT")=1 + D LOGSTART^XWBDLOG("XWBTCPM") + Q + ; +DEBUG ;Entry point for debug, Build a server to get the connect + ;DSM sample;ZDEBUG ON S $ZB(1)="SERV+1^XWBTCPM:1",$ZB="ETRAP+1^XWBTCPM:1" + W !,"Before running this entry point set your debugger to stop at" + W !,"the place you want to debug. Some spots to use:" + W !,"'SERV+1^XWBTCPM', 'MAIN+1^XWBTCPM' or 'CAPI+1^XWBPRS.'",! + W !,"or location of your choice.",! + W !,"IP Socket to Listen on: " R SOCK:300 Q:'$T!(SOCK["^") + ;Use %ZISTCP to do a single server + D LISTEN^%ZISTCP(SOCK,"SERV^XWBTCPM") + U $P W !,"Done" + Q +SERV ;Callback from the server + S XWBTDEV=IO,XWBTIME(1)=3600 D INIT + S XWBDEBUG=1,MSG=$$BREAD^XWBRW(5,60) ;R MSG#5 + D NEW + S IO("C")=1 ;Cause the Listenr to stop + Q + ; +EXIT ;Close out + I $G(DUZ) D LOGOUT^XUSRB + I $G(XWBT("PCNT")) D COUNT^XUSCNT(-1) + Q + ; +LOG(MSG) ;Record Debug Info + D:$G(XWBDEBUG) LOG^XWBDLOG(MSG) + Q + ;