diff --git a/p/CCRMEDS2.m b/p/CCRMEDS2.m index 3812d77..7e3a385 100644 --- a/p/CCRMEDS2.m +++ b/p/CCRMEDS2.m @@ -78,46 +78,62 @@ EXTRACT(MINXML,DFN,OUTXML) ; EXTRACT MEDICATIONS INTO PROVIDED XML TEM . ; NDC not supplied in API, but is rather trivial to obtain . ; MED(11) piece 1 has the IEN of the drug (file 50) . ; IEN is field 31 in the drug file. + . ; + . ; MEDIEN (node 11 in the returned output) might not necessarily be defined + . ; It is not defined when a dose in not chosen in CPRS. There is a long + . ; series of fields that depend on it. We will use If and Else to deal + . ; with that . N MEDIEN S MEDIEN=$P(MED(11),U) - . S @MAP@("MEDPRODUCTNAMECODEVALUE")=$$GET1^DIQ(50,MEDIEN,31,"E") - . S @MAP@("MEDPRODUCTNAMECODINGINGSYSTEM")="NDC" - . S @MAP@("MEDPRODUCTNAMECODEVERSION")="none" - . S @MAP@("MEDBRANDNAMETEXT")="" - . D DOSE^PSS50(MEDIEN,,,,,"DOSE") - . I $D(^TMP($J,"DOSE",MEDIEN)) D ; GPL ; CALL SUCCESSFUL + . I +MEDIEN>0 D + . . S @MAP@("MEDPRODUCTNAMECODEVALUE")=$$GET1^DIQ(50,MEDIEN,31,"E") + . . S @MAP@("MEDPRODUCTNAMECODINGINGSYSTEM")="NDC" + . . S @MAP@("MEDPRODUCTNAMECODEVERSION")="none" + . . S @MAP@("MEDBRANDNAMETEXT")="" + . . D DOSE^PSS50(MEDIEN,,,,,"DOSE") . . N DOSEDATA M DOSEDATA=^TMP($J,"DOSE",MEDIEN) . . S @MAP@("MEDSTRENGTHVALUE")=DOSEDATA(901) . . S @MAP@("MEDSTRENGTHUNIT")=$P(DOSEDATA(902),U,2) - . E D ; GPL CALL UNSUCCESSUFL - . . S @MAP@("MEDSTRENGTHVALUE")="" ; NO DOSE INFORMATION AVAILABLE - . . S @MAP@("MEDSTRENGTHUNIT")="" ; - . ; Units, concentration, etc, come from another call - . ; $$CPRS^PSNAPIS which returns dosage-form^va class^strengh^unit - . ; This call takes nodes 1 and 3 of ^PSDRUG(D0,"ND") as parameters - . ; NDF Entry IEN, and VA Product Name - . ; These can be obtained using NDF^PSS50 (IEN,,,,,"SUBSCRIPT") - . ; Documented in the same manual. - . D NDF^PSS50(MEDIEN,,,,,"CONC") - . N NDFDATA M NDFDATA=^TMP($J,"CONC",MEDIEN) - . N NDFIEN S NDFIEN=$P(NDFDATA(20),U) - . N VAPROD S VAPROD=$P(NDFDATA(22),U) - . N CONCDATA - . ; If a drug was not matched to NDF, then the NDFIEN is gonna be "" - . ; and this will crash the call. So... - . I NDFIEN="" S CONCDATA="" - . E S CONCDATA=$$CPRS^PSNAPIS(NDFIEN,VAPROD) - . S @MAP@("MEDFORMTEXT")=$P(CONCDATA,U,1) - . S @MAP@("MEDCONCVALUE")=$P(CONCDATA,U,3) - . S @MAP@("MEDCONCUNIT")=$P(CONCDATA,U,4) - . S @MAP@("MEDSIZETEXT")=$P(NDFDATA(23),U,2)_" "_$P(NDFDATA(24),U,2) - . S @MAP@("MEDQUANTITYVALUE")=$$GET1^DIQ(52.41,RXIEN,12) - . ; Oddly, there is no easy place to find the dispense unit. - . ; It's not included in the original call, so we have to go to the drug file. - . ; That would be DATA^PSS50(IEN,,,,,"SUBSCRIPT") - . ; Node 14.5 is the Dispense Unit - . D DATA^PSS50(MEDIEN,,,,,"QTY") - . N QTYDATA M QTYDATA=^TMP($J,"QTY",MEDIEN) - . S @MAP@("MEDQUANTITYUNIT")=QTYDATA(14.5) + . . ; Units, concentration, etc, come from another call + . . ; $$CPRS^PSNAPIS which returns dosage-form^va class^strengh^unit + . . ; This call takes nodes 1 and 3 of ^PSDRUG(D0,"ND") as parameters + . . ; NDF Entry IEN, and VA Product Name + . . ; These can be obtained using NDF^PSS50 (IEN,,,,,"SUBSCRIPT") + . . ; Documented in the same manual. + . . D NDF^PSS50(MEDIEN,,,,,"CONC") + . . N NDFDATA M NDFDATA=^TMP($J,"CONC",MEDIEN) + . . N NDFIEN S NDFIEN=$P(NDFDATA(20),U) + . . N VAPROD S VAPROD=$P(NDFDATA(22),U) + . . N CONCDATA + . . ; If a drug was not matched to NDF, then the NDFIEN is gonna be "" + . . ; and this will crash the call. So... + . . I NDFIEN="" S CONCDATA="" + . . E S CONCDATA=$$CPRS^PSNAPIS(NDFIEN,VAPROD) + . . S @MAP@("MEDFORMTEXT")=$P(CONCDATA,U,1) + . . S @MAP@("MEDCONCVALUE")=$P(CONCDATA,U,3) + . . S @MAP@("MEDCONCUNIT")=$P(CONCDATA,U,4) + . . S @MAP@("MEDSIZETEXT")=$P(NDFDATA(23),U,2)_" "_$P(NDFDATA(24),U,2) + . . S @MAP@("MEDQUANTITYVALUE")=$$GET1^DIQ(52.41,RXIEN,12) + . . ; Oddly, there is no easy place to find the dispense unit. + . . ; It's not included in the original call, so we have to go to the drug file. + . . ; That would be DATA^PSS50(IEN,,,,,"SUBSCRIPT") + . . ; Node 14.5 is the Dispense Unit + . . D DATA^PSS50(MEDIEN,,,,,"QTY") + . . N QTYDATA M QTYDATA=^TMP($J,"QTY",MEDIEN) + . . S @MAP@("MEDQUANTITYUNIT")=QTYDATA(14.5) + . E D + . . S @MAP@("MEDPRODUCTNAMECODEVALUE")="" + . . S @MAP@("MEDPRODUCTNAMECODINGINGSYSTEM")="" + . . S @MAP@("MEDPRODUCTNAMECODEVERSION")="" + . . S @MAP@("MEDBRANDNAMETEXT")="" + . . S @MAP@("MEDSTRENGTHVALUE")="" + . . S @MAP@("MEDSTRENGTHUNIT")="" + . . S @MAP@("MEDFORMTEXT")="" + . . S @MAP@("MEDCONCVALUE")="" + . . S @MAP@("MEDCONCUNIT")="" + . . S @MAP@("MEDSIZETEXT")="" + . . S @MAP@("MEDQUANTITYVALUE")="" + . . S @MAP@("MEDQUANTITYUNIT")="" + . ; . ; . ; --- START OF DIRECTIONS --- . ; Sig data is not in any API. We obtain it using the IEN from diff --git a/p/CCRMEDS3.m b/p/CCRMEDS3.m index 204757d..fda92b1 100644 --- a/p/CCRMEDS3.m +++ b/p/CCRMEDS3.m @@ -74,25 +74,28 @@ EXTRACT(MINXML,DFN,OUTXML) ; EXTRACT MEDICATIONS INTO PROVIDED XML TEM . S @MAP@("MEDSOURCEACTORID")="ACTORPROVIDER_"_MED(12,"I") . S @MAP@("MEDPRODUCTNAMETEXT")=MED(.01,"E") . ; NDC is field 31 in the drug file. - . ; The actual drug entry in the drug file is not necessarily supplied. + . ; The actual drug entry in the drug file (MEDIEN) is not necessarily supplied. . ; It' node 1, internal form. . N MEDIEN S MEDIEN=MED(1,"I") - . S @MAP@("MEDPRODUCTNAMECODEVALUE")=$S($L(MEDIEN):$$GET1^DIQ(50,MEDIEN,31,"E"),1:"") - . S @MAP@("MEDPRODUCTNAMECODINGINGSYSTEM")=$S($L(MEDIEN):"NDC",1:"") - . S @MAP@("MEDPRODUCTNAMECODEVERSION")=$S($L(MEDIEN):"none",1:"") - . S @MAP@("MEDBRANDNAMETEXT")="" - . I $L(MEDIEN) D DOSE^PSS50(MEDIEN,,,,,"DOSE") - . I $L(MEDIEN) N DOSEDATA M DOSEDATA=^TMP($J,"DOSE",MEDIEN) - . S @MAP@("MEDSTRENGTHVALUE")=$S($L(MEDIEN):DOSEDATA(901),1:"") - . S @MAP@("MEDSTRENGTHUNIT")=$S($L(DOSEDATA(902))>0:$P(DOSEDATA(902),U,2),1:"") ; SAM PLEASE CHECK - . ; Units, concentration, etc, come from another call - . ; $$CPRS^PSNAPIS which returns dosage-form^va class^strengh^unit - . ; This call takes nodes 1 and 3 of ^PSDRUG(D0,"ND") as parameters - . ; NDF Entry IEN, and VA Product Name - . ; These can be obtained using NDF^PSS50 (IEN,,,,,"SUBSCRIPT") - . ; Documented in the same manual. - . N NDFDATA,CONCDATA - . I $L(MEDIEN) D + . I +MEDIEN D + . . S @MAP@("MEDPRODUCTNAMECODEVALUE")=$$GET1^DIQ(50,MEDIEN,31,"E") + . . S @MAP@("MEDPRODUCTNAMECODINGINGSYSTEM")="NDC" + . . S @MAP@("MEDPRODUCTNAMECODEVERSION")="none" + . . S @MAP@("MEDBRANDNAMETEXT")="" + . . D DOSE^PSS50(MEDIEN,,,,,"DOSE") + . . N DOSEDATA M DOSEDATA=^TMP($J,"DOSE",MEDIEN) + . . S @MAP@("MEDSTRENGTHVALUE")=DOSEDATA(901) + . . S @MAP@("MEDSTRENGTHUNIT")=$P(DOSEDATA(902),U,2) + . . ; Units, concentration, etc, come from another call + . . ; $$CPRS^PSNAPIS which returns dosage-form^va class^strengh^unit + . . ; This call takes nodes 1 and 3 of ^PSDRUG(D0,"ND") as parameters + . . ; NDF Entry IEN, and VA Product Name + . . ; These can be obtained using NDF^PSS50 (IEN,,,,,"SUBSCRIPT") + . . ; Documented in the same manual. + . . ; + . . ; If the drug is not matched to the National Drug File + . . ; there will be no NDF Data. + . . N NDFDATA,CONCDATA . . D NDF^PSS50(MEDIEN,,,,,"CONC") . . M NDFDATA=^TMP($J,"CONC",MEDIEN) . . N NDFIEN S NDFIEN=$P(NDFDATA(20),U) @@ -101,21 +104,31 @@ EXTRACT(MINXML,DFN,OUTXML) ; EXTRACT MEDICATIONS INTO PROVIDED XML TEM . . ; and this will crash the call. So... . . I NDFIEN="" S CONCDATA="" . . E S CONCDATA=$$CPRS^PSNAPIS(NDFIEN,VAPROD) - . E S (NDFDATA,CONCDATA)="" ; This line is defensive programming to prevent undef errors. - . S @MAP@("MEDFORMTEXT")=$S($L(MEDIEN):$P(CONCDATA,U,1),1:"") - . S @MAP@("MEDCONCVALUE")=$S($L(MEDIEN):$P(CONCDATA,U,3),1:"") - . S @MAP@("MEDCONCUNIT")=$S($L(MEDIEN):$P(CONCDATA,U,4),1:"") - . S @MAP@("MEDSIZETEXT")=$S($L(MEDIEN):$P(NDFDATA(23),U,2)_" "_$P(NDFDATA(24),U,2),1:"") - . S @MAP@("MEDQUANTITYVALUE")="" ; not provided for in Non-VA meds. - . ; Oddly, there is no easy place to find the dispense unit. - . ; It's not included in the original call, so we have to go to the drug file. - . ; That would be DATA^PSS50(IEN,,,,,"SUBSCRIPT") - . ; Node 14.5 is the Dispense Unit - . I $L(MEDIEN) D + . . S @MAP@("MEDFORMTEXT")=$P(CONCDATA,U,1) + . . S @MAP@("MEDCONCVALUE")=$P(CONCDATA,U,3) + . . S @MAP@("MEDCONCUNIT")=$P(CONCDATA,U,4) + . . S @MAP@("MEDSIZETEXT")=$P(NDFDATA(23),U,2)_" "_$P(NDFDATA(24),U,2) + . . S @MAP@("MEDQUANTITYVALUE")="" ; not provided for in Non-VA meds. + . . ; Oddly, there is no easy place to find the dispense unit. + . . ; It's not included in the original call, so we have to go to the drug file. + . . ; That would be DATA^PSS50(IEN,,,,,"SUBSCRIPT") + . . ; Node 14.5 is the Dispense Unit . . D DATA^PSS50(MEDIEN,,,,,"QTY") . . N QTYDATA M QTYDATA=^TMP($J,"QTY",MEDIEN) . . S @MAP@("MEDQUANTITYUNIT")=QTYDATA(14.5) - . E S @MAP@("MEDQUANTITYUNIT")="" + . E D + . . S @MAP@("MEDPRODUCTNAMECODEVALUE")="" + . . S @MAP@("MEDPRODUCTNAMECODINGINGSYSTEM")="" + . . S @MAP@("MEDPRODUCTNAMECODEVERSION")="" + . . S @MAP@("MEDBRANDNAMETEXT")="" + . . S @MAP@("MEDSTRENGTHVALUE")="" + . . S @MAP@("MEDSTRENGTHUNIT")="" + . . S @MAP@("MEDFORMTEXT")="" + . . S @MAP@("MEDCONCVALUE")="" + . . S @MAP@("MEDCONCUNIT")="" + . . S @MAP@("MEDSIZETEXT")="" + . . S @MAP@("MEDQUANTITYVALUE")="" + . . S @MAP@("MEDQUANTITYUNIT")="" . ; . ; --- START OF DIRECTIONS --- . ; Dosage is field 2, route is 3, schedule is 4