Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: MDCLIO

MDCLIO.m

Go to the documentation of this file.
  1. MDCLIO ;HINES OIFO/DP - CliO backend driver;02 Feb 2005
  1. ;;1.0;CLINICAL PROCEDURES;**16**;Apr 01, 2004;Build 280
  1. ;Per VHA Directive 2004-038, this routine should not be modified.
  1. ;
  1. ; This routine uses the following IAs:
  1. ; # 3027 - PTSEC^DGSEC4 Registration (supported)
  1. ; # 2701 - $$GETICN^MPIF001 Master Patient Index VistA (supported)
  1. ; #10112 - $$SITE^VASITE() call Registration (supported)
  1. ; #10070 - ^XMD call MailMan (supported)
  1. ; # 2263 - $$GET^XPAR Toolkit (supported)
  1. ; # 2263 - GETWP^XPAR Toolkit (supported)
  1. ; # 4440 - $$PROD^XUPROD call Kernel (supported)
  1. ; #10076 - access ^XUSEC( Kernel (supported)
  1. ; #1381 - GMRV VITAL MEASUREMENT Vitals (controlled subscription)
  1. ;
  1. RPC(RESULTS,OPTION,P1,P2,P3,P4,P5,P6,P7,P8,P9) ; Generic RPC tag
  1. N MD,MDD,MDCMD,MDIEN,MDERR,MDIENS,MDFLD,MDFLAG,MDOBS,MDVUID,MDRET,MDLIST,MDTMP,MDVAL,MDRTN,MDQRY,MDIDX,MDCACHED,MDNAME,MDCMT,MDROOT,MDXROOT
  1. K ^TMP("MDCLIO",$J) ; Default scratch space for all calls
  1. S RESULTS=$NA(^TMP($J)) K @RESULTS
  1. I '($T(@OPTION)]"") S @RESULTS@(0)="-1^Option '"_OPTION_"' not found in routine "_$T(+0)_"." Q
  1. D @OPTION
  1. I '$D(@RESULTS) S @RESULTS@(0)="-1^Unspecified Error"
  1. K ^TMP("MDCLIO",$J) ; Default scratch space for where clauses
  1. Q
  1. ;
  1. EXECUTE ; Executes the command in P1
  1. D GETWP^XPAR(.MDCMD,"SYS","MD COMMANDS",P1,.MDERR)
  1. S MDNAME=P1,Y=MDCMD(1,0),MDCMD=$P(Y,";",1),MDFILE=$P(Y,";",2),MDRTN=$P(Y,";",3),MDROOT=$P(Y,";",4),MDWHERE=$P(Y,";",5),MDIDX=$P(Y,";",6)
  1. S MDCACHED=$P(Y,";",7)&($$GET^XPAR("SYS","MD PARAMETERS","ALLOW_CACHED_QUERIES")=1)&('$D(P2))
  1. D FLDS(.MDCMD)
  1. I MDRTN="" S MDRTN=MDCMD ; Custom routine to perform the whole command
  1. I MDWHERE]"" D @MDWHERE ; Custom where clause
  1. D @MDRTN
  1. K MDWHERE
  1. Q
  1. ;
  1. FLDS(MDTXT) ; Builds MDFLD() from a command wp-text
  1. F Y=1:0 S Y=$O(MDTXT(Y)) Q:'Y D
  1. .S X=MDTXT(Y,0)
  1. .I $E(X,1)=";" Q
  1. .I $E(X,1)="@" D FLDS($E($P(X,";",1),2,250)) Q ; Warning, recursion is an evil thing :)
  1. .S MDFLD(+$O(MDFLD(""),-1)+1)=X
  1. Q
  1. ;
  1. IENLIST ; Builds MDROOT from P2(0..n) as IEN list
  1. S MDROOT=$NA(^TMP("MDCLIO",$J)) K @MDROOT
  1. S MDIEN=""
  1. F S MDIEN=$O(P2(MDIEN)) Q:MDIEN="" S @MDROOT@(P2(MDIEN))=""
  1. Q
  1. ;
  1. IMPORT ; Import a record for the TDBConnection_Vista object
  1. N MDFILE,MDIENS,MDX,MDVAL,MDFDA,MDRET
  1. S MDFILE=$$TABLE(P1),MDIENS=P2
  1. F MDX=0:2 Q:'$D(P3(MDX)) D
  1. .S MDFLD=$$FLDNUM^DILFD(MDFILE,P3(MDX))
  1. .D VAL^DIE(MDFILE,MDIENS,MDFLD,"FU",$G(P3(MDX+1)),.MDVAL,"MDFDA","MDRET") Q:'$D(MDRET)
  1. S X="MDFDA" F S X=$Q(@X) Q:X="" D
  1. .S Y=$O(@RESULTS@(99999,""),-1)+1
  1. .S @RESULTS@(99999,Y)=X_"="_@X
  1. D:MDIENS?1"+1," UPDATE^DIE("K","MDFDA",,"MDERR")
  1. D:MDIENS'?1"+1," FILE^DIE("K","MDFDA","MDERR")
  1. I '$D(MDERR) S @RESULTS@(0)="WOO HOO, IT'S FILED!" Q
  1. S @RESULTS@(0)="OH POOP",X="MDERR"
  1. F S X=$Q(@X) Q:X="" D
  1. .S Y=$O(@RESULTS@(""),-1)+1
  1. .S @RESULTS@(Y)=X_"="_@X
  1. Q
  1. ;
  1. GETIEN ; Returns the ien of a record for generic updates **pk only**
  1. N MDVAL F X=0:1 Q:'$D(P2(X)) S MDVAL(X+1)=P2(X)
  1. S @RESULTS@(0)=+$$FIND1^DIC($$TABLE(P1),,"KXP",.MDVAL)
  1. Q
  1. ;
  1. QUERY ; Executes a standard query
  1. N MDXTMP S MDXTMP="MDCACHE_"_MDNAME
  1. I MDCACHED,$D(^XTMP(MDXTMP)) L +(^XTMP(MDXTMP)):5 I $T D Q ; Returning the cached copy
  1. .M @RESULTS=^XTMP(MDXTMP,1)
  1. .L -(^XTMP(MDXTMP)) ; Later Gater!
  1. D NEWDOC("RESULTS")
  1. I $$ROOT^DILFD(MDFILE,"",1)=MDROOT D D ENDDOC("RESULTS") Q
  1. .I '$D(P2(0))!($G(P2(0))="*") D Q ; Load whole file
  1. ..F MDREC=0:0 S MDREC=$O(@MDROOT@(MDREC)) Q:'MDREC D XMLREC(MDFILE,MDREC)
  1. .S MDVAL=$G(P2(0)) F X=0:1 Q:'$D(P2(X)) D
  1. ..I P2(X)?4N1"-"2N1"-"2N1" "2N1":"2N1":"2N S P2(X)=$$FMDT(P2(X))
  1. ..S MDVAL(X+1)=P2(X)
  1. .D FIND^DIC(MDFILE,"","@","KP",.MDVAL,"*",MDIDX) Q:'$O(^TMP("DILIST",$J,0))
  1. .F MDREC=0:0 S MDREC=$O(^TMP("DILIST",$J,MDREC)) Q:'MDREC D XMLREC(MDFILE,+^(MDREC,0))
  1. S MDROOT=$NA(@MDROOT),MDIDX=$$OREF^DILF(MDROOT)
  1. F S MDROOT=$Q(@MDROOT) Q:MDROOT="" Q:$P(MDROOT,MDIDX,1)'="" D
  1. .S MDREC=$QS(MDROOT,$QL(MDROOT)) D XMLREC(MDFILE,MDREC)
  1. D ENDDOC("RESULTS")
  1. K MDREC
  1. Q
  1. ;
  1. STPROC ; Place holder for no routine entered into a stored procedure type
  1. D NEWDOC("RESULTS")
  1. D XMLADD("NO PROCEDURE SPECIFIED")
  1. D ENDDOC("RESULTS")
  1. Q
  1. ;
  1. ROLES ; Temporary Role Based Query
  1. D NEWDOC("RESULTS","USER ROLES")
  1. S X="A" F S X=$O(^XUSEC(X)) Q:X="" D:$D(^XUSEC(X,DUZ))
  1. .D XMLHDR("RECORD"),XMLDATA("ROLE_ID",X),XMLFTR("RECORD")
  1. D ENDDOC("RESULTS")
  1. Q
  1. ;
  1. XQUERY ; Runs the standard query after a pre-process routine has prepared the entries into @MDXROOT@(ien...)
  1. D NEWDOC("RESULTS","FILEMAN FILE #"_MDFILE_" "_MDCMT)
  1. F MD=0:0 S MD=$O(@MDXROOT@(MD)) Q:'MD D XMLREC(MDFILE,@MDXROOT@(MD))
  1. K @MDXROOT
  1. D ENDDOC("RESULTS")
  1. Q
  1. ;
  1. INSERT ; Performs an insert
  1. K MDERR
  1. F Y=0:0 S Y=$O(MDFLD(Y)) Q:'Y D
  1. .Q:$G(P2(Y-1))=""
  1. .I $P(MDFLD(Y),";",4)["DATE" S @$$FDA(MDFILE)@($P(MDFLD(Y),";"))=$$FMDT(P2(Y-1)) Q
  1. .I $P(MDFLD(Y),";",3)="I"!($G(P2(Y-1))="") S @$$FDA(MDFILE)@($P(MDFLD(Y),";"))=$G(P2(Y-1)) Q ; RPC Broker sends 0..n array
  1. .D CHK^DIE(MDFILE,$P(MDFLD(Y),";"),"",$G(P2(Y-1)),.MDVAL,"MDERR")
  1. .I MDVAL="^" M @RESULTS@(Y)=MDERR("DIERR",1,"TEXT") K MDERR,MDVAL Q
  1. .S @$$FDA(MDFILE)@($P(MDFLD(Y),";"))=MDVAL
  1. I $O(@RESULTS@(0)) S @RESULTS@(0)="-1^Errors found validating data" Q
  1. D UPDATE^DIE("",$$FDA(),,"MDERR")
  1. I $D(MDERR) D Q
  1. .F Y=0:0 S Y=$O(MDERR("DIERR",Y)) Q:'Y M @RESULTS@(Y)=MDERR("DIERR",Y,"TEXT")
  1. .S @RESULTS@(0)="-1^Insert Error"
  1. S @RESULTS@(0)="1^Insert complete"
  1. Q
  1. ;
  1. UPDATE ; Performs an update
  1. ; Must find an EXACT match - Need to re-evaluate later for an update where like SQL statement
  1. S MDIEN=$$FIND1^DIC(MDFILE,,"KXP",P2(0))
  1. I MDIEN'>0 S @RESULTS@(0)="-1^No such record '"_P2(0)_"'" Q
  1. F Y=0:0 S Y=$O(MDFLD(Y)) Q:'Y D
  1. .I $G(P2(Y))="" S @$$FDA(MDFILE,MDIEN)@($P(MDFLD(Y),";"))="" Q
  1. .I $P(MDFLD(Y),";",4)["DATE" S @$$FDA(MDFILE,MDIEN)@($P(MDFLD(Y),";"))=$$FMDT(P2(Y)) Q
  1. .I $P(MDFLD(Y),";",3)="I" S @$$FDA(MDFILE,MDIEN)@($P(MDFLD(Y),";"))=P2(Y) Q ; Notice P2 offset matches here
  1. .K MDERR,MDHELP,MDVAL D VAL^DIE(MDFILE,MDIEN,$P(MDFLD(Y),";"),"",P2(Y),.MDVAL,"","MDERR")
  1. .I MDVAL="^" M @RESULTS@(Y)=MDERR("DIERR",1,"TEXT") Q
  1. .S @$$FDA(MDFILE,MDIEN)@($P(MDFLD(Y),";"))=MDVAL ; Set the internal value for filing !!!
  1. I $O(@RESULTS@(0)) S @RESULTS@(0)="-1^Errors found validating data" Q
  1. K MDERR D FILE^DIE("K",$$FDA(),"MDERR")
  1. I $O(MDERR(""))]"" M @RESULTS@(1)=MDERR S @RESULTS@(0)="-1^Error" Q
  1. S @RESULTS@(0)="1^Update complete!"
  1. Q
  1. ;
  1. DELETE ; Performs standard Delete command
  1. ; Will find records like the update but can return multiple entries
  1. S X="" F S X=$O(P2(X)) Q:X="" S MDVAL($O(MDVAL(""),-1)+1)=P2(X)
  1. D FIND^DIC(MDFILE,"","@;.01","PK",.MDVAL,"*",MDIDX)
  1. I '$O(^TMP("DILIST",$J,0)) S @RESULTS@(0)="1^No records found to delete" Q
  1. F X=0:0 S X=$O(^TMP("DILIST",$J,X)) Q:'X S MDIEN=+^(X,0),@$$FDA(MDFILE,MDIEN)@(.01)="@"
  1. D FILE^DIE("",$$FDA(),"MDERR")
  1. I $O(MDERR(""))]"" M @RESULTS@(1)=MDERR S @RESULTS@(0)="-1^Error" Q
  1. S @RESULTS@(0)="1^Records successfully deleted."
  1. Q
  1. ;
  1. DELALL ; Used to purge entire file ** XML Import calls ONLY!!!! **
  1. S MDROOT=$$ROOT^DILFD(MDFILE,"",1)
  1. F X=0:0 S X=$O(@MDROOT@(X)) Q:'X S @$$FDA(MDFILE,X)@(.01)="@"
  1. D:$D(@$$FDA()) FILE^DIE("",$$FDA(),"MDERR")
  1. I $O(MDERR(""))]"" M @RESULTS@(1)=MDERR S @RESULTS@(0)="-1^Error" Q
  1. S @RESULTS@(0)="1^Records successfully deleted."
  1. Q
  1. ;
  1. XMLREC(DD,IEN) ; Builds an XML Record based on DD, IEN & values in MDFLD(1..n)
  1. N MD,MDIENS,MDTAG,MDFMT,MDTYP,X,Y
  1. D XMLHDR("RECORD")
  1. S MDIENS=+IEN_","
  1. F MD=0:0 S MD=$O(MDFLD(MD)) Q:'MD D
  1. .S MDFLD=$P(MDFLD(MD),";",1)
  1. .S MDTAG=$P(MDFLD(MD),";",2)
  1. .S MDFMT=$P(MDFLD(MD),";",3)
  1. .S MDTYP=$P(MDFLD(MD),";",4)
  1. .I MDFLD?1"$$".E D @("XMLDATA(MDTAG,"_MDFLD_")") Q
  1. .I MDFLD?1"D ".E X MDFLD Q
  1. .I MDTYP["DATE" S Y=$$GET1^DIQ(DD,MDIENS,MDFLD,"I") D:Y]"" XMLDT(MDTAG,Y) Q
  1. .D XMLDATA(MDTAG,$$GET1^DIQ(DD,MDIENS,MDFLD,MDFMT))
  1. D XMLFTR("RECORD")
  1. Q
  1. ;
  1. SETACL ; Sets the ACL for an Item
  1. ; P2(0)=Item
  1. ; P2(1)=User ID (DUZ)
  1. ; P2(2)=Access Level
  1. N MDIEN,MDFDA
  1. S MDIEN=$O(^MDC(704.001,"PK",P2(0),P2(1),0))
  1. D:'MDIEN
  1. .S MDFDA(704.001,"+1,",.01)=P2(0)
  1. .S MDFDA(704.001,"+1,",.02)=P2(1)
  1. .S MDIEN="+1"
  1. S MDFDA(704.001,MDIEN_",",.03)=$G(P2(2),0)
  1. D UPDATE^DIE("","MDFDA")
  1. S @RESULTS@(0)="1^ACL Updated."
  1. Q
  1. ;
  1. DELACL ; Removes and item from ACL
  1. ; P2(0)=Item
  1. ; P2(1)=User ID (DUZ) - if blank or undefined deletes all record for P2(0)
  1. N MDIEN,MDFDA,MDUSER
  1. D:$G(P2(1))]""
  1. .S MDIEN=$O(^MDC(704.001,"PK",P2(0),P2(1),0))
  1. .D:MDIEN
  1. ..S MDFDA(704.001,MDIEN_",",.01)="@"
  1. D:$G(P2(1))=""
  1. .S MDUSER=""
  1. .F S MDUSER=$O(^MDC(704.001,"PK",P2(0),MDUSER)) Q:MDUSER="" D
  1. ..S MDIEN=$O(^MDC(704.001,"PK",P2(0),MDUSER,0))
  1. ..S MDFDA(704.001,MDIEN_",",.01)="@"
  1. D:$D(MDFDA) UPDATE^DIE("","MDFDA")
  1. S @RESULTS@(0)="1^ACL Updated."
  1. Q
  1. ;
  1. SENDMAIL ; Sends an EMail Message
  1. ; Example of the P2(0..n) array
  1. ; P2(0)="SUB:Message Subject"
  1. ; P2(1)="TEXT:THIS IS LINE 1"
  1. ; P2(2)="TEXT:THIS IS LINE 2"
  1. ; P2(3)="TO:user.one@domain.ext;user.two@domain.ext"
  1. N MDTO,MDTEXT,XMDUZ,XMSUB,XMTEXT,XMY
  1. S XMDUZ="Clinical Procedure Notification System"
  1. S XMTEXT="MDTEXT("
  1. S X="" F S X=$O(P2(X)) Q:X="" D
  1. .I P2(X)?1"SUB:".E S XMSUB=$P(P2(X),":",2,250) Q
  1. .I P2(X)?1"TO:".E D Q
  1. ..S MDTO=$P(P2(X),"TO:",2,250) ; We can store recipient lists as ';' delimited strings - Just like Outlook :)
  1. ..I MDTO]"" F Y=1:1:$L(MDTO,";") S XMY($P(MDTO,";",Y))=""
  1. .I P2(X)?1"TEXT:".E D Q
  1. ..S Y=$O(MDTEXT(""),-1)+1,MDTEXT(Y,0)=$P(P2(X),"TEXT:",2,250)
  1. S MDTEXT(0)="^^"_$O(MDTEXT(""),-1)_U_DT
  1. D ^XMD
  1. S @RESULTS@(0)="1^E-Mail Sent"
  1. Q
  1. ;
  1. ; Special extrinsic field calls
  1. ID() Q "`"_IEN
  1. ROWID() Q IEN
  1. ICN() Q:MDFILE'=2 "" Q $$GETICN^MPIF001(IEN)
  1. NAME() Q $$GET1^DIQ(MDFILE,IEN,.01,"E")
  1. SNSTV() N MDRET D PTSEC^DGSEC4(.MDRET,IEN) Q ($G(MDRET(1))'=0)
  1. CCOW() S X="patient.id.mrn.dfn_"_$P($$SITE^VASITE(),U,3) S:'$$PROD^XUPROD() X=X_"_test" Q X ; IUser.getCCOWDFNItemName
  1. VITALSID() Q "{GMRV-"_IEN_"}"
  1. VSTATUS() Q $S(+$$GET1^DIQ(120.5,IEN_",",2,"I"):4,1:1)
  1. ;
  1. XMLCMT(COMMENT) ; Add a comment to a document
  1. D XMLADD("<!-- "_COMMENT_" -->")
  1. Q
  1. ;
  1. XMLHDR(TAG) ; Add a header tag to the global
  1. S TAG=$$TAGSAFE(TAG)
  1. D XMLADD("<"_TAG_">")
  1. Q
  1. ;
  1. XMLFTR(TAG) ; Add a footer tag to the global
  1. D XMLHDR("/"_TAG)
  1. Q
  1. ;
  1. XMLDATA(TAG,X) ; Add a data element to the global
  1. S TAG=$$TAGSAFE(TAG)
  1. S X=$$XMLSAFE(X)
  1. Q:X=""
  1. D XMLADD("<"_TAG_">"_X_"</"_TAG_">")
  1. Q
  1. ;
  1. XMLFLDS(FLDLST,DD,FLDS) ; Build FLDS into an array of FLDS
  1. K FLDLST
  1. F X=1:1:$L(FLDS,";") D
  1. .S FLDLST($P(FLDS,";",X),"TAG")=$$GET1^DID(DD,$P(FLDS,";",X),"","LABEL")
  1. .S FLDLST($P(FLDS,";",X),"TYPE")=$$GET1^DID(DD,$P(FLDS,";",X),"","TYPE")
  1. Q
  1. ;
  1. XMLDT(TAG,X) ; Add date or date/time to the global
  1. S TAG=$$TAGSAFE(TAG)
  1. I $G(X)="" D XMLADD("<"_TAG_" />") Q ; No data
  1. S Y=(1700+$E(X,1,3))_"-"_$E(X,4,5)_"-"_$E(X,6,7)
  1. D:X]"."
  1. .S X=X+.0000001
  1. .S Y=Y_" "_$E(X,9,10)_":"_$E(X,11,12)_":"_$E(X,13,14)
  1. D XMLDATA(TAG,Y)
  1. Q
  1. ;
  1. XMLIDS(TAG,IDS,CLOSE) ; Add a data element to the global with ids
  1. N X,Y
  1. S TAG="<"_$$TAGSAFE(TAG)
  1. F X=0:0 S X=$O(IDS(X)) Q:'X D
  1. .S Y="" F S Y=$O(IDS(X,Y)) Q:Y="" D
  1. ..S TAG=TAG_" "_Y_"="""_$$XMLSAFE(IDS(X,Y))_""""
  1. S:$G(CLOSE) TAG=TAG_" /" ; Close out the tag element
  1. S TAG=TAG_">"
  1. D XMLADD(TAG)
  1. Q
  1. ;
  1. XMLADD(X) ; Add to the global
  1. S @RESULTS@($O(@RESULTS@(""),-1)+1)=$G(X)
  1. Q
  1. ;
  1. XMLSAFE(X) ; Transform X into XML safe data
  1. ; Strip off the spaces and make life easier
  1. D STRIP(.X)
  1. S X=$$TRNSLT(X,"&","&")
  1. S X=$$TRNSLT(X,"<","<")
  1. S X=$$TRNSLT(X,">",">")
  1. S X=$$TRNSLT(X,"'","'")
  1. S X=$$TRNSLT(X,"""",""")
  1. S X=$$TRNSLT(X,":",":")
  1. Q X
  1. ;
  1. TAGSAFE(X) ; Transform X into XML tag
  1. S:X?1N.E X="_"_X ; Remove starting numeric
  1. Q $TR(X," '`()<>*[]","__________")
  1. ;
  1. STRIP(X) ; Strip off leading and trailing spaces
  1. F Q:$E(X)'=" " S X=$E(X,2,$L(X))
  1. F Q:$E(X,$L(X))'=" " S X=$E(X,1,$L(X)-1)
  1. Q
  1. ;
  1. NEWDOC(ROOT,COMMENT) ; Start a new document
  1. K @RESULTS
  1. D XMLADD("<?xml version=""1.0"" standalone=""yes""?>")
  1. D XMLCMT("OPTION = "_$G(OPTION,"NULL"))
  1. I $G(COMMENT)]"" D XMLCMT(COMMENT)
  1. D XMLCMT("P1 = "_$G(P1,"NULL"))
  1. I $D(P2)#2 D XMLCMT("P2 = "_P2)
  1. S X="" F S X=$O(P2(X)) Q:X="" D XMLCMT("P2("_X_") = "_P2(X))
  1. D XMLHDR($G(ROOT,"RESULTS"))
  1. Q
  1. ;
  1. ENDDOC(ROOT) ; End this document
  1. D XMLFTR($G(ROOT,"RESULTS"))
  1. Q
  1. ;
  1. QUICKDOC(TAG,VALUE) ; Builds a single record, single field document
  1. D NEWDOC()
  1. D XMLHDR("RECORD")
  1. D XMLDATA(TAG,VALUE)
  1. D XMLFTR("RECORD")
  1. D ENDDOC()
  1. Q
  1. ;
  1. SRVRDT ; Returns Server Date/Time
  1. D QUICKDOC("SERVER_DATE_TIME",$$NOW)
  1. Q
  1. ;
  1. TRNSLT(X,X1,X2) ; Translate every Y to Z in X
  1. N Y
  1. Q:X'[X1 X ; Nothing to translate
  1. S Y="" F Q:X="" D
  1. .I X[X1 S Y=Y_$P(X,X1)_X2,X=$P(X,X1,2,250) Q
  1. .S Y=Y_X,X=""
  1. Q Y
  1. ;
  1. ; Extrinsic Functions
  1. ;
  1. FDA(DD,IEN) ; Construct a standard FDA
  1. ; Returns ^TMP("MDCLIO",$J,{DD},{IEN:+1})
  1. Q $S($G(DD):$NA(^TMP("MDCLIO",$J,DD,$G(IEN,"+1")_",")),1:$NA(^TMP("MDCLIO",$J)))
  1. ;
  1. SQLDATE(X) ; Returns SQL standard XML Date/Time string from FM
  1. S X=X+.0000001
  1. Q ($E(X,1,3)+1700)_"-"_$E(X,4,5)_"-"_$E(X,6,7)_" "_$E(X,9,10)_":"_$E(X,11,12)_":"_$E(X,13,14)
  1. ;
  1. FMDT(X) ; Returns FM standard date/time from SQL style
  1. N Y S Y=X
  1. S X=($E(X,1,4)-1700)_$E(X,6,7)_$E(X,9,10)_"."_$E(X,12,13)_$E(X,15,16)_$E(X,18,19)
  1. Q +X
  1. ;
  1. NOW() ; Returns Date/Time
  1. D NOW^%DTC
  1. Q $$SQLDATE(%)
  1. ;
  1. TABLE(X) ; Return file number from the name
  1. Q $$FIND1^DIC(1,,"KXP",X)
  1. ;