ABSPOSL2 ; IHS/OIT/RAM ; NEW LOGGING FACILITY SYSTEM ; [ 7 JUN 2017 9:37 AM ]
;;1.0;PHARMACY POINT OF SALE;**48**;7 JUN 2017;Build 38
;---
Q ; NOT THE ENTRY POINT... YET.
; /IHS/OIT/RAM ; 7 JUN 2017 ;
; ISSUE: MANY (MOST?) FILEMAN DBS CALLS DISALLOW OR IGNORE ANY ERROR PARAMETER.
; I AIM TO FIX THAT. NEED A FUNCTION THAT WILL SAVE THE LAST 20 OR SO
; DBS CALLS (FILE^DIE & UPDATE^DIE, MAINLY), AND STORE THE ERROR IN A
; GLOBAL AND/OR FILEMAN TABLE. [[ GLOBAL IF DISALLOWED TO CREATE NEW TABLES WITHOUT DBA'S HELP. ]]
;
LOG(ROUTINE,ERROR) ; /IHS/OIT/RAM ; 7 JUN 2017 ; NEW FM DBS CALL LOGGING
;;1.0;PHARMACY POINT OF SALE;**48**;7 JUN 2017
;
; PRETTY SIMPLE ROUTINE HERE -- KEEP THE LAST 'LOGLENGTH' DBS CALL ERRORS.
; ROUTINE SHOULDN'T BE CALLED UNLESS THERE *ACTUALLY* IS AN ERROR; I SHALL
; LEAVE IT UP TO THE CALLING PROCESS TO DETERMINE IF AN ERROR EXISTS.
;
; INPUT VARIABLES:
; ROUTINE == TEXT FIELD CONTAINING THE SUB^ROUTINE THAT CALLED US. NOT CHECKED FOR ACCURACY, JUST FILED.
; ERROR == ARRAY THAT CONTAINS THE 'DIERR' INFORMATION TO BE FILED.
;
N I,I2,I3,J,J2,J3,K,K2,K3,X,Y,%,NOW
N LOGLENGTH,L2FDA,L2ERR,L2FDAIEN,NUMERRS,ERRNUM
;
S NUMERRS=+$G(ERROR("DIERR")) ; LET'S FIND OUT HOW MANY ERRORS WE HAVE TO LOG.
Q:NUMERRS=0 ;; IF THERE'S NO ERRORS PASSED TO US (FOR SOME REASON) EXIT QUIETLY.
;
S LOGLENGTH=30 ; MAXIMUM NUMBER OF ENTRIES IN TABLE; WE DON'T WANT THIS LOG TO GROW TOO LARGE.
D NOW^%DTC S NOW=% ; LOG ERRORS BY DATE/TIME THAT THIS UTILITY WAS CALLED.
; THERE IS A SMALL POSSIBILITY OF LOST DATA IF THIS ROUTINE GETS CALLED TWICE IN THE SAME SECOND.
; =-=-=-=
; FIRST, DETERMINE THEN NUMBER OF ERRORS IN THE LOG. MORE THAN 'LOGLENGTH' ERRORS,
; DELETE THE OLDEST. AS THE IEN IS FILEMAN DTG OF TIME OF CALL, JUST KILL THE 1ST ONE(S)...
;
S (I,I2,I3)=0 F S I=$O(^ABSPFMLOG(I)) Q:+I=0 S I2=I2+1 ; INITIALIZE VARIABLES AND LOOP TO COUNT LOG ENTRY #.
I I2>(LOGLENGTH-1) {
S I=0 K L2FDA,L2ERR,ERRNUM ;; INITIALIZE DBS CALL VARIABLES. MAKE SURE WE USE DIFFERENT VARIABLE NAMES
F I3=1:1:I2-(LOGLENGTH-1) { ;; LOOP THROUGH THE # OF LOGS OVER LOGLENGTH -- EXCEPTING THE ONE WE'RE ABOUT TO ADD.
S I=$O(^ABSPFMLOG(I)) ;; AND GET THE IEN OF EACH LOG ENTRY TO BE DELETED.
;; THAN ORIGINAL CALLING ROUTINE TO INSURE WE DON'T OVERWRITE EXISTING DATA.
; S L2FDA(9002313.71,I+1_",",.01)="@" ;; FOR TESTING THE ERROR HANDLING BELOW; KEEP COMMENTED OUT.
S L2FDA(9002313.71,I_",",.01)="@" ;; SET THE FDA TO DELETE THE ENTRY
}
;
D UPDATE^DIE("","L2FDA","","L2ERR") ;; AND EXECUTE THE DBS CALL TO DELETE.
; JUST IN CASE, IF THIS CALL FAILS SET A SINGLE "INTERNAL ERROR" NODE AND GRAB THE ERROR TEXT.
I $D(L2ERR) S ^ABSPFMLOG("IERR","DELETE",0)=I_U_NOW_U_$G(L2ERR("DIERR",1,"TEXT",1))
;
}
;
K L2FDA,L2ERR,ERRNUM ;; KLOBBER VARIABLES AGAIN AFTER THE 'DELETE' PHASE ABOVE.
S L2FDA(9002313.71,"+1,",.01)=NOW ;; SET UP THE DBS CALL TO ADD A NEW BASE RECORD INTO THE ^ABSPFMLOG FILE.
; S L2FDA(9002313.719,"+1,",.01)=NOW ;; FOR TESTING THE ERROR HANDLING BELOW; KEEP COMMENTED OUT.
S L2FDAIEN(1)=NOW ;; SET THE IEN TO THE DATE/TIME WE WERE CALLED.
D UPDATE^DIE("","L2FDA","L2FDAIEN","L2ERR") ;; AND ADD THE RECORD.
I $D(L2ERR) S ^ABSPFMLOG("IERR","LEVEL1",0)=I_U_$G(L2ERR("DIERR",1,"TEXT",1))
K L2FDA,L2ERR ;; ONCE AGAIN, KILL THE PREVIOUS VARIABLES FOR THE NEXT CALL BELOW.
F I=1:1:NUMERRS { ;; SET UP VARIABLES FOR ALL ERRORS THAT WERE SENT TO US.
S ERRNUM=$G(ERROR("DIERR",I)) ;; GET THE FILEMAN ERROR NUMBER, COULD BE USEFUL FOR LOOKUP LATER.
; S L2FDA(9002313.7119,"+"_I_","_NOW_",",.01)=$G(ROUTINE)_U_ERRNUM_U_$G(ERROR("DIERR",I,"TEXT",1)) ;; FOR TESTING THE ERROR HANDLING BELOW; KEEP COMMENTED OUT.
S L2FDA(9002313.711,"+"_I_","_NOW_",",.01)=$G(ROUTINE)_U_ERRNUM_U_$G(ERROR("DIERR",I,"TEXT",1)) ; SET UP THE DBS SUBNODE ADD VARIABLES.
S L2FDAIEN(I)=I ;; AND SET UP THE DBS SUBNODE IEN INFO.
}
D UPDATE^DIE("","L2FDA","L2FDAIEN","L2ERR") ;; AND ADD THAT INFO TO THE 'ABSP FILEMAN ERROR LOG' TABLE.
I $D(L2ERR) S ^ABSPFMLOG("IERR","LEVEL2",0)=I_U_NOW_U_$G(L2ERR("DIERR",1,"TEXT",1)) ;; AND IF THE ABOVE CALL FAILS, SET A BASIC ERROR NODE.
;
Q ;; YAY! WE'RE DONE -- RETURN TO THE ROUTINE THAT CALLED US.
;
CDATA() ;;
Q 8692
;
CHKDATA(VAR1,VAR2) ;;
M ^BZHZFLERM(1)=@VAR1
M ^BZHZFLERM(2)=@VAR2
Q
;
ABSPOSL2 ; IHS/OIT/RAM ; NEW LOGGING FACILITY SYSTEM ; [ 7 JUN 2017 9:37 AM ]
+1 ;;1.0;PHARMACY POINT OF SALE;**48**;7 JUN 2017;Build 38
+2 ;---
+3 ; NOT THE ENTRY POINT... YET.
QUIT
+4 ; /IHS/OIT/RAM ; 7 JUN 2017 ;
+5 ; ISSUE: MANY (MOST?) FILEMAN DBS CALLS DISALLOW OR IGNORE ANY ERROR PARAMETER.
+6 ; I AIM TO FIX THAT. NEED A FUNCTION THAT WILL SAVE THE LAST 20 OR SO
+7 ; DBS CALLS (FILE^DIE & UPDATE^DIE, MAINLY), AND STORE THE ERROR IN A
+8 ; GLOBAL AND/OR FILEMAN TABLE. [[ GLOBAL IF DISALLOWED TO CREATE NEW TABLES WITHOUT DBA'S HELP. ]]
+9 ;
LOG(ROUTINE,ERROR) ; /IHS/OIT/RAM ; 7 JUN 2017 ; NEW FM DBS CALL LOGGING
+1 ;;1.0;PHARMACY POINT OF SALE;**48**;7 JUN 2017
+2 ;
+3 ; PRETTY SIMPLE ROUTINE HERE -- KEEP THE LAST 'LOGLENGTH' DBS CALL ERRORS.
+4 ; ROUTINE SHOULDN'T BE CALLED UNLESS THERE *ACTUALLY* IS AN ERROR; I SHALL
+5 ; LEAVE IT UP TO THE CALLING PROCESS TO DETERMINE IF AN ERROR EXISTS.
+6 ;
+7 ; INPUT VARIABLES:
+8 ; ROUTINE == TEXT FIELD CONTAINING THE SUB^ROUTINE THAT CALLED US. NOT CHECKED FOR ACCURACY, JUST FILED.
+9 ; ERROR == ARRAY THAT CONTAINS THE 'DIERR' INFORMATION TO BE FILED.
+10 ;
+11 NEW I,I2,I3,J,J2,J3,K,K2,K3,X,Y,%,NOW
+12 NEW LOGLENGTH,L2FDA,L2ERR,L2FDAIEN,NUMERRS,ERRNUM
+13 ;
+14 ; LET'S FIND OUT HOW MANY ERRORS WE HAVE TO LOG.
SET NUMERRS=+$GET(ERROR("DIERR"))
+15 ;; IF THERE'S NO ERRORS PASSED TO US (FOR SOME REASON) EXIT QUIETLY.
IF NUMERRS=0
QUIT
+16 ;
+17 ; MAXIMUM NUMBER OF ENTRIES IN TABLE; WE DON'T WANT THIS LOG TO GROW TOO LARGE.
SET LOGLENGTH=30
+18 ; LOG ERRORS BY DATE/TIME THAT THIS UTILITY WAS CALLED.
DO NOW^%DTC
SET NOW=%
+19 ; THERE IS A SMALL POSSIBILITY OF LOST DATA IF THIS ROUTINE GETS CALLED TWICE IN THE SAME SECOND.
+20 ; =-=-=-=
+21 ; FIRST, DETERMINE THEN NUMBER OF ERRORS IN THE LOG. MORE THAN 'LOGLENGTH' ERRORS,
+22 ; DELETE THE OLDEST. AS THE IEN IS FILEMAN DTG OF TIME OF CALL, JUST KILL THE 1ST ONE(S)...
+23 ;
+24 ; INITIALIZE VARIABLES AND LOOP TO COUNT LOG ENTRY #.
SET (I,I2,I3)=0
FOR
SET I=$ORDER(^ABSPFMLOG(I))
IF +I=0
QUIT
SET I2=I2+1
+25 IF I2>(LOGLENGTH-1)