VBECDCU ;hoifo/gjc-data conversion & pre-implementation utilities;Nov 21, 2002
 ;;2.0;VBEC;;Jun 05, 2015;Build 4
 ;
 ;Medical Device #:
 ;Note: The food and Drug Administration classifies this software as a
 ;medical device.  As such, it may not be changed in any way.
 ;Modifications to this software may result in an adulterated medical
 ;device under 21CFR820, the use of which is considered to be a
 ;violation of US Federal Statutes.  Acquiring and implementing this
 ;software through the Freedom of Information Act requires the
 ;implementer to assume total responsibility for the software, and
 ;become a registered manufacturer of a medical device, subject to FDA
 ;regulations.
 ;
 ;Call to $$GTF^%ZISH is supported by IA: 2320
 ;Call to $$EXTERNAL^DILFD is supported by IA: 2055
 ;Call to GETS^DIQ is supported by IA: 2056
 ;Call to GETICN^MPIF001 is supported by IA: 2701
 ;Call to $$FMTE^XLFDT is supported by IA: 10103
 ;Call to SETUP^XQALERT is supported by IA: 10081
 ;Call to GETS^DIQ is supported by IA: 10060
 ;Call to ^DIR is supported by IA: 10026
 ;Call to $$FMADD^XLFDT is supported by IA: 10103
 ;
GTF(VBECGR,VBECIS,VBECF) ; save off data stored in a global to a VMS
 ; or NT/2000 file.
 ; input: VBECGR=global reference
 ;        VBECIS=Identifies the incrementing subscript level. For
 ;               example, if you pass ^TMP(115,1,1,0) as the global
 ;               reference parameter, and pass 3 as the incr_subsc
 ;               parameter, $$GTF will increment the third subscript,
 ;               ^TMP(115,1,x), but will read nodes at the full global
 ;               reference ^TMP(115,1,x,0).
 ;         VBECF=Name of the file where the data is to reside.
 ; output: 1=success, 0=failure
 ;
 ; Here's an example (from the Hines development account) on how the
 ; the call works: S Y=$$GTF^%ZISH($NA(^TMP("VBEC NP",$J,1,0)),3,
 ; "SYS$USER:[CEBE]","ZZNP.TXT")
 S VBECP=$P($G(^VBEC(6000,1,0)),U,6) ; VBECP=file path
 ;
 Q $$GTF^%ZISH(VBECGR,VBECIS,VBECP,VBECF)
 ;
DELETE(VBECY) ; purge the ^TMP("VBEC*",$J) global
 ; input: VBECY=$J or process id, or zero to kill along all processes.
 S VBECY=+$G(VBECY),VBECX="VBEC FINI"
 F  S VBECX=$O(^TMP(VBECX)) Q:VBECX=""!(VBECX]"VBEC63 zzz")  D  Q:'VBECYN
 .I '$D(VBECYN)#2 D  Q:'VBECYN
 ..K DIR,DTOUT,DUOUT,DIRUT
 ..S DIR(0)="Y",DIR("A")="Are you sure you want to delete the temporary globals"
 ..S DIR("B")="No",DIR("?")="Answer 'Yes' to delete globals, or 'No' forgo global deletion." D ^DIR S VBECYN=Y
 ..S:$D(DIRUT)#2 VBECYN=0
 ..Q
 .W !,"Killing ^TMP("""_VBECX_""""
 .W $S(VBECY>0:","_VBECY_")",1:")")
 .K:VBECY ^TMP(VBECX,VBECY) K:'VBECY ^TMP(VBECX)
 .H 1
 .Q
 W:'$D(VBECYN)#2 !!,"No data to delete."
 W:$D(VBECYN)#2 !!,"Done..." K VBECX,VBECY,VBECYN,X,Y
 Q
 ;
NP200(IEN) ; gather New Person information in order to populate
 ; the appropriate SQL Server table on the VBECS side.
 ; Name, SSN, Termination Date, & Division are the attributes returned.
 ; Input: IEN the internal entry number of the New Person record.
 ; We'll be saving New Person (NP) data off in ^TMP("VBEC NP",$J) and
 ; plan to create our NP VMS file after all other VMS files are closed.
 Q:IEN=""!(+IEN'=IEN)  K LRARY N LRSTR
 S LRTRMDT="" D GETS^DIQ(200,IEN_",",".01;9;9.2;16*","EI","LRARY")
 S LRNAME=LRARY(200,IEN_",",.01,"E")
 S LRSSN=LRARY(200,IEN_",",9,"E") S:LRSSN="" LRSSN="*"
 Q:($D(^TMP("VBECX NP",$J,IEN,LRNAME,LRSSN)))#2  ; data already exists
 S:LRARY(200,IEN_",",9.2,"I")'="" LRTRMDT=$$DATE(LRARY(200,IEN_",",9.2,"I"))
 I ($D(LRARY(200.02))\10) D
 .S LRA="" F  S LRA=$O(LRARY(200.02,LRA)) Q:LRA=""  D
 ..S DIVPTR=LRARY(200.02,LRA,.01,"I")
 ..S DIVNAME=LRARY(200.02,LRA,.01,"E")
 ..S CNT=$$CNT("VBEC NP",$J),CNT=CNT+1
 ..S LRSTR=IEN_"^"_LRNAME_"^"_LRSSN_"^"_LRTRMDT_"^"_DIVPTR_"^"_DIVNAME
 ..S VBECTOT("VBEC NP")=+$G(VBECTOT("VBEC NP"))+1
 ..S ^TMP("VBEC NP",$J,CNT,0)=LRSTR_$C(13)
 ..S ^TMP("VBECX NP",$J,IEN,LRNAME,LRSSN)=""
 ..Q
 .Q
 E  D
 .S CNT=$$CNT("VBEC NP",$J),CNT=CNT+1
 .S LRSTR=IEN_"^"_LRNAME_"^"_LRSSN_"^"_"^"_LRTRMDT_"^^"
 .S VBECTOT("VBEC NP")=+$G(VBECTOT("VBEC NP"))+1
 .S ^TMP("VBEC NP",$J,CNT,0)=LRSTR_$C(13)
 .S ^TMP("VBECX NP",$J,IEN,LRNAME,LRSSN)=""
 .Q
 K CNT,DIVNAME,DIVPTR,LRA,LRNAME,LRSSN,LRTRMDT ; LRTRMDT=termination date
 K LRARY Q
 ;
XTRNL(LRFL,LRFD,LRFLG,LRINT) ; change data from its internal value
 ; to its external value.
 ; LRFL-file or subfile number   LRFLD-field number
 ; LRFLG-Output transform for pointer data. 'F' if the first field
 ;  in a pointer chain has a output transform, apply the transform
 ;  & quit.  'L' if the last field in a pointer chain has a output
 ;  transform, apply the transform & quit.  'U' if the first field
 ;  in a pointer chain has a output transform, apply the transform
 ;  to the last field in the pointer chain & quit.
 ;  function documented @ VA FileMan v22 Programmer Manual pg:2-171
 ;  LRINT-the internal value being converted.
 Q $$EXTERNAL^DILFD(LRFL,LRFD,LRFLG,LRINT)
 ;
DATE(LRDATE) ; date/time transformed.  Initial format created in order to
 ; handle an individual's date of birth, input in 'LRDATE', formatted
 ; 'mm/dd/yy<sp>time'.
 ;
 ; check for midnight date/time (yyymmdd.24) and convert it to
 ; a valid SQL Server date/time.  Example: if date/time is: 3030715.24
 ; convert to: 3030715.235959
 I $P(LRDATE,".",2)=24 S LRDATE=$$FMADD^XLFDT(LRDATE,0,0,0,-1)
 ;
 S LRMTH="^Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec"
 S LRDATE=$$FMTE^XLFDT(LRDATE,1),LRDATE=$TR(LRDATE,",","")
 S LRDATE=$TR(LRDATE,$P(LRDATE," "),$L($P(LRMTH,U_$P(LRDATE," ")),U))
 S LRDATE=$TR($P(LRDATE,"@")," ","/")_$S(LRDATE["@":"@"_$P(LRDATE,"@",2),1:"")
 Q $TR(LRDATE,"@"," ")
 ;
ALERT(DUZ,TSK,FLG,ABN) ;trigger an alert when the pre-implementation or
 ;data conversion finishes.
 ;Input: DUZ-The user initiating these tasks, and ultimately informed
 ;           when the process completes.
 ;       TSK-The task being executed; either the pre-implementation or
 ;           the data conversion.  '1' implies data conversion, '0'
 ;           implies the pre-implementation
 ;       FLG-status of data conversion: >0=anomalies, 0=no anomalies
 ;       ABN-flag to indicate if abnormal conditions exist, specifically
 ;           if the user stopped the process via TaskMan, or if data to
 ;           convert does not exist.  Input will be -1 for no data, and
 ;           "S" if the user stopped the process.
 ;
 K XQA,XQAMSG,XQAROU S XQA(DUZ)=""
 S XQAMSG="VBECS "_$S(TSK=0:"Anomaly Check",1:"Data Conversion")_" complete"
 S:ABN=-1 XQAMSG=XQAMSG_", data non-existent"
 S:ABN="S" XQAMSG=XQAMSG_", user terminated"
 I FLG=0 S XQAMSG=XQAMSG_", anomalies non-existent."
 I FLG>0 S XQAMSG=XQAMSG_", anomalies identified."
 D SETUP^XQALERT K XQA,XQAMSG,XQAROU
 Q
 ;
RPT(TSK) ;report header
 ; Input: TSK-The task being executed; either the pre-implementation or
 ;           the data conversion.  'DC' implies data conversion, 'PI'
 ;           implies the pre-implementation
 W:$E(IOST,1,2)="C-" @IOF
 S $P(VBECLN,"-",(IOM+1))=""
 W !,"VBECS "_$S(TSK="DC"=1:"data conversion",1:"pre-implementation")_" process",?$S(IOM=132:117,1:65),"Page 1 of 1",VBECLN
 Q
 ;
CNT(X,Y) ; return the value of a subscript
 ; Input: X=the name of the subscript, i.e., "VBEC63 DEM"
 ;        Y=$J
 Q +$O(^TMP(X,Y,999999999999),-1)
 ;
SWAP(LRF,LRP) ; swap the VistA pointer (or free-text blood supplier) data for
 ; the SQL GUID equivalent.  In the case that the entry is not mapped
 ; (VistA pointer has no corresponding SQL Server GUID), this utility
 ; returns null.
 ; input: LRF=file being mapped
 ;        LRP=VistA pointer value (IEN or record 'pointed to')
 ;return: null or a valid GUID
 ;
 Q:LRF="" "" Q:LRP="" "" N VBEC6005,VBEC6007
 I LRF'=66.01 S VBEC6005=$O(^VBEC(6005,"B",LRF_"-"_LRP,""))
 E  S VBEC6005=$O(^VBEC(6005,"AA",LRF,LRP,""))
 Q:VBEC6005="" ""
 S VBEC6007=$P($G(^VBEC(6005,VBEC6005,0)),U,5)
 Q:VBEC6007="" ""
 Q $P($G(^VBEC(6007,VBEC6007,0)),U,3)
 ;
BLUT(Y) ; obtain ABO GROUP (#.05) & RH TYPE (#.06) from Lab Data (#63) file
 S Y("ABO")=$P($G(^LR(Y,0)),U,5),Y("RH")=$E($P($G(^LR(Y,0)),U,6),1)
 ; note: we're interested 'n' for negative & 'p' for positive (1 char)
 Q Y("ABO")_U_Y("RH")
 ;
ICN(DFN) ; obtain the patient's ICN.  DFN is input, and either the ICN,
 ; if it exists, or null will be returned.
 ;   APIs used by this subroutine (in extrinsic function $$ICN)
 ; #2701-$$GETICN^MPIF001(DFN), this function returns the ICN
 S LRICN="" ; default to null
 I ($T(GETICN^MPIF001)'="") D
 .; the $$GETICN^MPIF001 returns delimited data.  If the ICN exists,
 .; it's returned as ICN_'V'_ICN checksum.  If it doesn't exist, it's
 .; returned as -1_'^'_error message.  We change -1 to null for SQL
 .S LRICN=$$GETICN^MPIF001(DFN),LRICN=$S($P(LRICN,"^")="-1":"",1:LRICN)
 .Q
 Q LRICN
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HVBECDCU   8918     printed  Sep 23, 2025@20:20:19                                                                                                                                                                                                     Page 2
VBECDCU   ;hoifo/gjc-data conversion & pre-implementation utilities;Nov 21, 2002
 +1       ;;2.0;VBEC;;Jun 05, 2015;Build 4
 +2       ;
 +3       ;Medical Device #:
 +4       ;Note: The food and Drug Administration classifies this software as a
 +5       ;medical device.  As such, it may not be changed in any way.
 +6       ;Modifications to this software may result in an adulterated medical
 +7       ;device under 21CFR820, the use of which is considered to be a
 +8       ;violation of US Federal Statutes.  Acquiring and implementing this
 +9       ;software through the Freedom of Information Act requires the
 +10      ;implementer to assume total responsibility for the software, and
 +11      ;become a registered manufacturer of a medical device, subject to FDA
 +12      ;regulations.
 +13      ;
 +14      ;Call to $$GTF^%ZISH is supported by IA: 2320
 +15      ;Call to $$EXTERNAL^DILFD is supported by IA: 2055
 +16      ;Call to GETS^DIQ is supported by IA: 2056
 +17      ;Call to GETICN^MPIF001 is supported by IA: 2701
 +18      ;Call to $$FMTE^XLFDT is supported by IA: 10103
 +19      ;Call to SETUP^XQALERT is supported by IA: 10081
 +20      ;Call to GETS^DIQ is supported by IA: 10060
 +21      ;Call to ^DIR is supported by IA: 10026
 +22      ;Call to $$FMADD^XLFDT is supported by IA: 10103
 +23      ;
GTF(VBECGR,VBECIS,VBECF) ; save off data stored in a global to a VMS
 +1       ; or NT/2000 file.
 +2       ; input: VBECGR=global reference
 +3       ;        VBECIS=Identifies the incrementing subscript level. For
 +4       ;               example, if you pass ^TMP(115,1,1,0) as the global
 +5       ;               reference parameter, and pass 3 as the incr_subsc
 +6       ;               parameter, $$GTF will increment the third subscript,
 +7       ;               ^TMP(115,1,x), but will read nodes at the full global
 +8       ;               reference ^TMP(115,1,x,0).
 +9       ;         VBECF=Name of the file where the data is to reside.
 +10      ; output: 1=success, 0=failure
 +11      ;
 +12      ; Here's an example (from the Hines development account) on how the
 +13      ; the call works: S Y=$$GTF^%ZISH($NA(^TMP("VBEC NP",$J,1,0)),3,
 +14      ; "SYS$USER:[CEBE]","ZZNP.TXT")
 +15      ; VBECP=file path
           SET VBECP=$PIECE($GET(^VBEC(6000,1,0)),U,6)
 +16      ;
 +17       QUIT $$GTF^%ZISH(VBECGR,VBECIS,VBECP,VBECF)
 +18      ;
DELETE(VBECY) ; purge the ^TMP("VBEC*",$J) global
 +1       ; input: VBECY=$J or process id, or zero to kill along all processes.
 +2        SET VBECY=+$GET(VBECY)
           SET VBECX="VBEC FINI"
 +3        FOR 
               SET VBECX=$ORDER(^TMP(VBECX))
               if VBECX=""!(VBECX]"VBEC63 zzz")
                   QUIT 
               Begin DoDot:1
 +4                IF '$DATA(VBECYN)#2
                       Begin DoDot:2
 +5                        KILL DIR,DTOUT,DUOUT,DIRUT
 +6                        SET DIR(0)="Y"
                           SET DIR("A")="Are you sure you want to delete the temporary globals"
 +7                        SET DIR("B")="No"
                           SET DIR("?")="Answer 'Yes' to delete globals, or 'No' forgo global deletion."
                           DO ^DIR
                           SET VBECYN=Y
 +8                        if $DATA(DIRUT)#2
                               SET VBECYN=0
 +9                        QUIT 
                       End DoDot:2
                       if 'VBECYN
                           QUIT 
 +10               WRITE !,"Killing ^TMP("""_VBECX_""""
 +11               WRITE $SELECT(VBECY>0:","_VBECY_")",1:")")
 +12               if VBECY
                       KILL ^TMP(VBECX,VBECY)
                   if 'VBECY
                       KILL ^TMP(VBECX)
 +13               HANG 1
 +14               QUIT 
               End DoDot:1
               if 'VBECYN
                   QUIT 
 +15       if '$DATA(VBECYN)#2
               WRITE !!,"No data to delete."
 +16       if $DATA(VBECYN)#2
               WRITE !!,"Done..."
           KILL VBECX,VBECY,VBECYN,X,Y
 +17       QUIT 
 +18      ;
NP200(IEN) ; gather New Person information in order to populate
 +1       ; the appropriate SQL Server table on the VBECS side.
 +2       ; Name, SSN, Termination Date, & Division are the attributes returned.
 +3       ; Input: IEN the internal entry number of the New Person record.
 +4       ; We'll be saving New Person (NP) data off in ^TMP("VBEC NP",$J) and
 +5       ; plan to create our NP VMS file after all other VMS files are closed.
 +6        if IEN=""!(+IEN'=IEN)
               QUIT 
           KILL LRARY
           NEW LRSTR
 +7        SET LRTRMDT=""
           DO GETS^DIQ(200,IEN_",",".01;9;9.2;16*","EI","LRARY")
 +8        SET LRNAME=LRARY(200,IEN_",",.01,"E")
 +9        SET LRSSN=LRARY(200,IEN_",",9,"E")
           if LRSSN=""
               SET LRSSN="*"
 +10      ; data already exists
           if ($DATA(^TMP("VBECX NP",$JOB,IEN,LRNAME,LRSSN)))#2
               QUIT 
 +11       if LRARY(200,IEN_",",9.2,"I")'=""
               SET LRTRMDT=$$DATE(LRARY(200,IEN_",",9.2,"I"))
 +12       IF ($DATA(LRARY(200.02))\10)
               Begin DoDot:1
 +13               SET LRA=""
                   FOR 
                       SET LRA=$ORDER(LRARY(200.02,LRA))
                       if LRA=""
                           QUIT 
                       Begin DoDot:2
 +14                       SET DIVPTR=LRARY(200.02,LRA,.01,"I")
 +15                       SET DIVNAME=LRARY(200.02,LRA,.01,"E")
 +16                       SET CNT=$$CNT("VBEC NP",$JOB)
                           SET CNT=CNT+1
 +17                       SET LRSTR=IEN_"^"_LRNAME_"^"_LRSSN_"^"_LRTRMDT_"^"_DIVPTR_"^"_DIVNAME
 +18                       SET VBECTOT("VBEC NP")=+$GET(VBECTOT("VBEC NP"))+1
 +19                       SET ^TMP("VBEC NP",$JOB,CNT,0)=LRSTR_$CHAR(13)
 +20                       SET ^TMP("VBECX NP",$JOB,IEN,LRNAME,LRSSN)=""
 +21                       QUIT 
                       End DoDot:2
 +22               QUIT 
               End DoDot:1
 +23      IF '$TEST
               Begin DoDot:1
 +24               SET CNT=$$CNT("VBEC NP",$JOB)
                   SET CNT=CNT+1
 +25               SET LRSTR=IEN_"^"_LRNAME_"^"_LRSSN_"^"_"^"_LRTRMDT_"^^"
 +26               SET VBECTOT("VBEC NP")=+$GET(VBECTOT("VBEC NP"))+1
 +27               SET ^TMP("VBEC NP",$JOB,CNT,0)=LRSTR_$CHAR(13)
 +28               SET ^TMP("VBECX NP",$JOB,IEN,LRNAME,LRSSN)=""
 +29               QUIT 
               End DoDot:1
 +30      ; LRTRMDT=termination date
           KILL CNT,DIVNAME,DIVPTR,LRA,LRNAME,LRSSN,LRTRMDT
 +31       KILL LRARY
           QUIT 
 +32      ;
XTRNL(LRFL,LRFD,LRFLG,LRINT) ; change data from its internal value
 +1       ; to its external value.
 +2       ; LRFL-file or subfile number   LRFLD-field number
 +3       ; LRFLG-Output transform for pointer data. 'F' if the first field
 +4       ;  in a pointer chain has a output transform, apply the transform
 +5       ;  & quit.  'L' if the last field in a pointer chain has a output
 +6       ;  transform, apply the transform & quit.  'U' if the first field
 +7       ;  in a pointer chain has a output transform, apply the transform
 +8       ;  to the last field in the pointer chain & quit.
 +9       ;  function documented @ VA FileMan v22 Programmer Manual pg:2-171
 +10      ;  LRINT-the internal value being converted.
 +11       QUIT $$EXTERNAL^DILFD(LRFL,LRFD,LRFLG,LRINT)
 +12      ;
DATE(LRDATE) ; date/time transformed.  Initial format created in order to
 +1       ; handle an individual's date of birth, input in 'LRDATE', formatted
 +2       ; 'mm/dd/yy<sp>time'.
 +3       ;
 +4       ; check for midnight date/time (yyymmdd.24) and convert it to
 +5       ; a valid SQL Server date/time.  Example: if date/time is: 3030715.24
 +6       ; convert to: 3030715.235959
 +7        IF $PIECE(LRDATE,".",2)=24
               SET LRDATE=$$FMADD^XLFDT(LRDATE,0,0,0,-1)
 +8       ;
 +9        SET LRMTH="^Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec"
 +10       SET LRDATE=$$FMTE^XLFDT(LRDATE,1)
           SET LRDATE=$TRANSLATE(LRDATE,",","")
 +11       SET LRDATE=$TRANSLATE(LRDATE,$PIECE(LRDATE," "),$LENGTH($PIECE(LRMTH,U_$PIECE(LRDATE," ")),U))
 +12       SET LRDATE=$TRANSLATE($PIECE(LRDATE,"@")," ","/")_$SELECT(LRDATE["@":"@"_$PIECE(LRDATE,"@",2),1:"")
 +13       QUIT $TRANSLATE(LRDATE,"@"," ")
 +14      ;
ALERT(DUZ,TSK,FLG,ABN) ;trigger an alert when the pre-implementation or
 +1       ;data conversion finishes.
 +2       ;Input: DUZ-The user initiating these tasks, and ultimately informed
 +3       ;           when the process completes.
 +4       ;       TSK-The task being executed; either the pre-implementation or
 +5       ;           the data conversion.  '1' implies data conversion, '0'
 +6       ;           implies the pre-implementation
 +7       ;       FLG-status of data conversion: >0=anomalies, 0=no anomalies
 +8       ;       ABN-flag to indicate if abnormal conditions exist, specifically
 +9       ;           if the user stopped the process via TaskMan, or if data to
 +10      ;           convert does not exist.  Input will be -1 for no data, and
 +11      ;           "S" if the user stopped the process.
 +12      ;
 +13       KILL XQA,XQAMSG,XQAROU
           SET XQA(DUZ)=""
 +14       SET XQAMSG="VBECS "_$SELECT(TSK=0:"Anomaly Check",1:"Data Conversion")_" complete"
 +15       if ABN=-1
               SET XQAMSG=XQAMSG_", data non-existent"
 +16       if ABN="S"
               SET XQAMSG=XQAMSG_", user terminated"
 +17       IF FLG=0
               SET XQAMSG=XQAMSG_", anomalies non-existent."
 +18       IF FLG>0
               SET XQAMSG=XQAMSG_", anomalies identified."
 +19       DO SETUP^XQALERT
           KILL XQA,XQAMSG,XQAROU
 +20       QUIT 
 +21      ;
RPT(TSK)  ;report header
 +1       ; Input: TSK-The task being executed; either the pre-implementation or
 +2       ;           the data conversion.  'DC' implies data conversion, 'PI'
 +3       ;           implies the pre-implementation
 +4        if $EXTRACT(IOST,1,2)="C-"
               WRITE @IOF
 +5        SET $PIECE(VBECLN,"-",(IOM+1))=""
 +6        WRITE !,"VBECS "_$SELECT(TSK="DC"=1:"data conversion",1:"pre-implementation")_" process",?$SELECT(IOM=132:117,1:65),"Page 1 of 1",VBECLN
 +7        QUIT 
 +8       ;
CNT(X,Y)  ; return the value of a subscript
 +1       ; Input: X=the name of the subscript, i.e., "VBEC63 DEM"
 +2       ;        Y=$J
 +3        QUIT +$ORDER(^TMP(X,Y,999999999999),-1)
 +4       ;
SWAP(LRF,LRP) ; swap the VistA pointer (or free-text blood supplier) data for
 +1       ; the SQL GUID equivalent.  In the case that the entry is not mapped
 +2       ; (VistA pointer has no corresponding SQL Server GUID), this utility
 +3       ; returns null.
 +4       ; input: LRF=file being mapped
 +5       ;        LRP=VistA pointer value (IEN or record 'pointed to')
 +6       ;return: null or a valid GUID
 +7       ;
 +8        if LRF=""
               QUIT ""
           if LRP=""
               QUIT ""
           NEW VBEC6005,VBEC6007
 +9        IF LRF'=66.01
               SET VBEC6005=$ORDER(^VBEC(6005,"B",LRF_"-"_LRP,""))
 +10      IF '$TEST
               SET VBEC6005=$ORDER(^VBEC(6005,"AA",LRF,LRP,""))
 +11       if VBEC6005=""
               QUIT ""
 +12       SET VBEC6007=$PIECE($GET(^VBEC(6005,VBEC6005,0)),U,5)
 +13       if VBEC6007=""
               QUIT ""
 +14       QUIT $PIECE($GET(^VBEC(6007,VBEC6007,0)),U,3)
 +15      ;
BLUT(Y)   ; obtain ABO GROUP (#.05) & RH TYPE (#.06) from Lab Data (#63) file
 +1        SET Y("ABO")=$PIECE($GET(^LR(Y,0)),U,5)
           SET Y("RH")=$EXTRACT($PIECE($GET(^LR(Y,0)),U,6),1)
 +2       ; note: we're interested 'n' for negative & 'p' for positive (1 char)
 +3        QUIT Y("ABO")_U_Y("RH")
 +4       ;
ICN(DFN)  ; obtain the patient's ICN.  DFN is input, and either the ICN,
 +1       ; if it exists, or null will be returned.
 +2       ;   APIs used by this subroutine (in extrinsic function $$ICN)
 +3       ; #2701-$$GETICN^MPIF001(DFN), this function returns the ICN
 +4       ; default to null
           SET LRICN=""
 +5        IF ($TEXT(GETICN^MPIF001)'="")
               Begin DoDot:1
 +6       ; the $$GETICN^MPIF001 returns delimited data.  If the ICN exists,
 +7       ; it's returned as ICN_'V'_ICN checksum.  If it doesn't exist, it's
 +8       ; returned as -1_'^'_error message.  We change -1 to null for SQL
 +9                SET LRICN=$$GETICN^MPIF001(DFN)
                   SET LRICN=$SELECT($PIECE(LRICN,"^")="-1":"",1:LRICN)
 +10               QUIT 
               End DoDot:1
 +11       QUIT LRICN
 +12      ;