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

ORCMEDT8.m

Go to the documentation of this file.
  1. ORCMEDT8 ;SLC/JM-QO, Generate quick order CRC ;Oct 20, 2021@13:26:11
  1. ;;3.0;ORDER ENTRY/RESULTS REPORTING;**245,243,280,405**;Dec 17, 1997;Build 211
  1. Q
  1. ;
  1. UPDQNAME(ORIEN) ; Rename personal quick order name if needed
  1. N OLDNAME,NEWNAME,DA,DR,DIE,DIDEL
  1. I $P($G(^ORD(101.41,ORIEN,0)),U,4)'="Q" Q
  1. S OLDNAME=$P($G(^ORD(101.41,ORIEN,0)),U,1)
  1. I $E($P(OLDNAME,U),1,6)'="ORWDQ " Q
  1. S NEWNAME="ORWDQ "_$$CRC4QCK(ORIEN)
  1. I OLDNAME'=NEWNAME D
  1. . S NEWNAME=$$ENSURNEW(NEWNAME)
  1. . S DA=ORIEN,DR=".01///"_NEWNAME,DIE="^ORD(101.41," D ^DIE
  1. Q
  1. ;
  1. ENSURNEW(NAME) ; Ensures the name is a new entry
  1. N IDX,BASENAME,ABC,NEWNAME
  1. S NEWNAME=NAME
  1. S IDX=0,BASENAME=NEWNAME,ABC=97 ; Find an unused name
  1. F S IDX=$O(^ORD(101.41,"B",NEWNAME,0)) Q:'IDX D
  1. . S NEWNAME=BASENAME_$C(ABC) ; append letter 'a' - 'z'
  1. . S ABC=ABC+1 I ABC>122 S BASENAME=BASENAME_"a",ABC=97
  1. Q NEWNAME
  1. RAWCRC(ORIEN) ; Get a raw CRC value to determine if a record has changed
  1. N ORDATA,RESULT,ADDCRLF,LASTLINE,LASTIDX,OLDCRC
  1. S (RESULT,OLDCRC)=""
  1. I $P($G(^ORD(101.41,ORIEN,0)),U,4)'="Q" G RWQ
  1. I $E($P($G(^ORD(101.41,ORIEN,0)),U),1,6)'="ORWDQ " G RWQ
  1. D LOADRSP^ORWDX(.ORDATA,ORIEN)
  1. D PARSE
  1. RWQ Q RESULT
  1. ;
  1. ; The following code attemps to duplicate the CRC calculated by the Delphi code
  1. ; in CPRS for quick orders. It will not match all the time, since not all the
  1. ; data neded to make the determination is stored on the M side, but it does it's best.
  1. ;
  1. CRC4QCK(ORIEN) ; Get CRC for a personal quick order
  1. N ORDATA,DISPGRP,DEFDLG,FORMID,RESULT,FORMDATA,ADDCRLF
  1. N LASTLINE,LASTIDX,OLDCRC,FORMINFO,IDINFO,NEXTFORM
  1. S RESULT="",FORMID=0
  1. ; Must be personal quick order
  1. I $P($G(^ORD(101.41,ORIEN,0)),U,4)'="Q" G EXT
  1. I $E($P($G(^ORD(101.41,ORIEN,0)),U),1,6)'="ORWDQ " G EXT
  1. S OLDCRC=$E($P($G(^ORD(101.41,ORIEN,0)),U,1),7,14)
  1. F Q:(RESULT=OLDCRC)!(FORMID="") D
  1. . K ORDATA D LOADRSP^ORWDX(.ORDATA,ORIEN)
  1. . ; First pass don't use any form id - get baseline CRC
  1. . I FORMID=1 D Q:FORMID=""
  1. . . S FORMID=""
  1. . . S DISPGRP=$P($G(^ORD(101.41,ORIEN,0)),U,5) I '+DISPGRP Q ; Must have a valid display group
  1. . . S DEFDLG=$P($G(^ORD(100.98,DISPGRP,0)),U,4) I '+DEFDLG Q ; Display group must have a valid default dialog
  1. . . D FORMID^ORWDXM(.FORMID,DEFDLG) I '+FORMID S FORMID="" Q ; Default dialog must have a valid windows form ID
  1. . . I (FORMID=130)!(FORMID=140) D
  1. . . . N NEWFORM D CHK94^ORWDPS1(.NEWFORM) I NEWFORM=1 S FORMID=135
  1. . . D FORMINFO(.FORMINFO,.IDINFO,.NEXTFORM)
  1. . I FORMID=0 S FORMID=1
  1. . E D SORTDATA I FORMDATA="" S FORMID="" Q ; Updates FORMID
  1. . D PARSE
  1. EXT Q RESULT
  1. ;
  1. PARSE ; Parse Data
  1. N DATAIDX,IDX,LINE,CODE,CRCDATA,OUTPUT,DONE,ISMASTER,LASTMSTR,FIRST,P3,LK4SPACE
  1. S DATAIDX="",(IDX,DONE,ISMASTER,LASTMSTR,LASTIDX)=0,LASTLINE=""
  1. F D GETLINE Q:DONE D Q:DONE
  1. . I ISMASTER D
  1. . . S OUTPUT=+$P(LINE,U,1)_U_+$P(LINE,U,2)_U
  1. . . S IDX=IDX+1,CRCDATA(IDX)=OUTPUT
  1. . . S FIRST=1,P3=$P(LINE,U,3)
  1. . . I P3="COMMENT" S ADDCRLF=1,LK4SPACE=1
  1. . . E D
  1. . . . I P3="STATEMENTS" S ADDCRLF=1,LK4SPACE=0
  1. . . . E S ADDCRLF=0,LK4SPACE=0
  1. . . F D GETLINE Q:DONE!ISMASTER D
  1. . . . I CODE="i" S IDX=IDX+1,CRCDATA(IDX)=LINE
  1. . . . I CODE="t" D
  1. . . . . I FIRST S FIRST=0,OUTPUT=LINE
  1. . . . . E D
  1. . . . . . I $L(LASTLINE)=0 S OUTPUT=$C(13)_$C(10)_LINE Q
  1. . . . . . I LK4SPACE,$L(LASTLINE)>1,$E(LASTLINE,$L(LASTLINE))=" " S OUTPUT=""
  1. . . . . . E D
  1. . . . . . . I ADDCRLF S OUTPUT=$C(13)_$C(10) ; ,$L(LASTLINE)<65
  1. . . . . . . E S OUTPUT=" "
  1. . . . . . S OUTPUT=OUTPUT_LINE
  1. . . . . S LASTLINE=LINE
  1. . . . . S IDX=IDX+1,CRCDATA(IDX)=OUTPUT
  1. . . . . I ADDCRLF S LASTIDX=IDX
  1. . . I ISMASTER,'DONE S LASTMSTR=1
  1. S RESULT=$$CRC4ARRY^ORCRC(.CRCDATA)
  1. ; Same data can generate 2 different CRCs - CRLF on end of comments are stripped
  1. I OLDCRC'="",RESULT'=OLDCRC,LASTIDX>0 D
  1. . S CRCDATA(LASTIDX)=CRCDATA(LASTIDX)_$C(13)_$C(10)
  1. . S RESULT=$$CRC4ARRY^ORCRC(.CRCDATA)
  1. Q
  1. ;
  1. SORTDATA ; Sorts data by fields according to FormID
  1. N IN,OUT,LINE,DATA,ID,CODE,INDEX,END,IDX,RTN,SUBFORM,SUBFORM2,SUBIDX,NODE
  1. S SUBFORM="",SUBFORM2=""
  1. S FORMDATA=$G(FORMINFO(FORMID)) I FORMDATA="" Q
  1. I $E(FORMDATA,1,2)'="00" S RTN="SUBID"_$E(FORMDATA,1,2) D @RTN S FORMDATA=$G(FORMINFO(FORMID)) I FORMDATA="" Q
  1. S IN=0,OUT=0,END=1000000,IDX=0
  1. F S IN=$O(ORDATA(IN)) Q:'+IN D
  1. . S LINE=ORDATA(IN)
  1. . I $E(LINE)="~" D
  1. . . S IDX=1,ID=$P(LINE,U,3),CODE="."_IDINFO(ID)_".",NODE=$P(LINE,U,2)
  1. . . S INDEX=$F(FORMDATA,CODE),SUBIDX=0
  1. . . I INDEX=0,SUBFORM'="" D
  1. . . . S INDEX=($F(FORMDATA,".ZZZ."))
  1. . . . I INDEX>0 S SUBIDX=$F(SUBFORM,CODE) I SUBIDX<1 S INDEX=0
  1. . . I INDEX=0,SUBFORM2'="" D
  1. . . . S INDEX=($F(FORMDATA,".XXX."))
  1. . . . I INDEX>0 S SUBIDX=$F(SUBFORM2,CODE) I SUBIDX<1 S INDEX=0
  1. . . I INDEX=0 S OUT=END,END=END+1
  1. . . E D
  1. . . . I SUBIDX>0 D I 1
  1. . . . . S OUT=(INDEX-4)*250
  1. . . . . S SUBIDX=(SUBIDX-4)\4
  1. . . . . S OUT=OUT+SUBIDX+(NODE*20)
  1. . . . E S OUT=(INDEX-4)*250
  1. . I IDX>0 D
  1. . . S DATA(OUT,IDX)=LINE
  1. . . S IDX=IDX+1
  1. K ORDATA
  1. S (IN,OUT,INDEX)=0
  1. F S IN=$O(DATA(IN)) Q:'+IN D
  1. . F S INDEX=$O(DATA(IN,INDEX)) Q:'+INDEX D
  1. . . S OUT=OUT+1
  1. . . S ORDATA(OUT)=DATA(IN,INDEX)
  1. S FORMID=$G(NEXTFORM(FORMID))
  1. Q
  1. ;
  1. GETLINE ;
  1. I LASTMSTR S LASTMSTR=0 Q
  1. S DATAIDX=$O(ORDATA(DATAIDX))
  1. S DONE=(DATAIDX="")
  1. I 'DONE S CODE=$E(ORDATA(DATAIDX),1),LINE=$E(ORDATA(DATAIDX),2,9999),ISMASTER=(CODE="~")
  1. Q
  1. ;
  1. FORMINFO(FORMINFO,IDINFO,NEXTFORM) ; populates FORMINFO,IDINFO and NEXTFORM arrays
  1. N IDX,LINE,CODE,RTN,NEXT
  1. S IDX=1
  1. F S LINE=$E($T(FORMTBL+IDX),21,999) Q:$L(LINE)<1 D
  1. . S CODE=$E(LINE,1,3),NEXT=$E(LINE,5,7),LINE=$E(LINE,9,999)
  1. . S FORMINFO(CODE)=LINE
  1. . I NEXT'=" " S NEXTFORM(CODE)=NEXT
  1. . S IDX=IDX+1
  1. S IDX=1
  1. F S LINE=$E($T(IDTABLE+IDX),4,999) Q:$L(LINE)<1 D
  1. . S CODE=$E(LINE,1,3),LINE=$E(LINE,5,99)
  1. . S IDINFO(LINE)=CODE,IDX=IDX+1
  1. Q
  1. ;
  1. HASCODE(CODE) ; scans data for code
  1. N RESULT,IDX,LINE S IDX="",RESULT=0
  1. F S IDX=$O(ORDATA(IDX)) Q:IDX="" D Q:IDX=""
  1. . S LINE=ORDATA(IDX)
  1. . I $E(LINE)="~" D
  1. . . S LINE=$P(LINE,U,3)
  1. . . I LINE=CODE S RESULT=1,IDX=""
  1. Q RESULT
  1. ;
  1. SUBID ; SubID codes are used to change the form ID depending on depending on data
  1. ; Data below is FormID;SubID.list of ID codes in order of use
  1. ; SubID's are used to change the FormID depending on data values.
  1. Q
  1. SUBID01 ; Generic Meds dialog
  1. N INPT,COMPLEX
  1. S INPT=$$HASCODE("NOW"),COMPLEX=$$HASCODE("DAYS")
  1. I INPT D I 1
  1. . I COMPLEX S FORMID="INX",SUBFORM=$G(FORMINFO("MDX"))
  1. . E S FORMID="INP"
  1. E I COMPLEX S FORMID="OPX",SUBFORM=$G(FORMINFO("MDX"))
  1. Q
  1. SUBID02 ; IV Meds
  1. S SUBFORM=$G(FORMINFO("IVL"))
  1. Q
  1. SUBID03 ; Delphi code adds URGENCY prompt that does not exist in dialog on M side
  1. I '$$HASCODE("URGENCY") D
  1. . N X
  1. . S X=$O(ORDATA(999999),-1)+1
  1. . S ORDATA(X)="~0^1^URGENCY"
  1. Q
  1. SUBID04 ; Blood Bank will probably be wrong - quick orders not working in v26
  1. S SUBFORM=$G(FORMINFO("BBK"))
  1. S SUBFORM2=$G(FORMINFO("BBX"))
  1. Q
  1. SUBID05 ; Diet
  1. I FORMID="117" S SUBFORM=$G(FORMINFO("DLN"))
  1. I FORMID="TBF" S SUBFORM=$G(FORMINFO("TBL"))
  1. Q
  1. FORMTBL ; Form Table - Forms allowing personal quick orders, as of CPRS GUI v26 (OR*3*215)
  1. ;;Consult ;110;CS2;00.ORD.CLS.URG.PLA.MSC.COD.PRV.COM.ERD.
  1. ;; ;CS2; ;00.ORD.CLS.URG.PLA.MSC.COD.COM.PRV.ERD.
  1. ;;Procedure ;112;PR2;00.SER.ORD.CLS.URG.PLA.MSC.COD.PRV.COM.ERD.
  1. ;; ;PR2;PR3;00.SER.ORD.COM.CLS.URG.PLA.MSC.COD.PRV.ERD.
  1. ;; ;PR3; ;00.SER.ORD.CLS.URG.PLA.MSC.COD.COM.PRV.ERD.
  1. ;;Diet ;117;TBF;05.STT.STP.ZZZ.COM.DEL.CAN.
  1. ;; ;TBF;OPM;05.ZZZ.COM.CAN.
  1. ;; ;OPM; ;00.ORD.MEL.STT.STP.SCH.COM.DEL.
  1. ;; ;DLN; ;00.ORD.
  1. ;; ;TBL; ;00.ORD.STR.INS.
  1. ;;Lab ;120; ;00.ORD.SAM.SPE.URG.COM.COL.STT.SCH.DAY.
  1. ;;Blood Bank ;125;BB2;04.ZZZ.DTE.COL.URG.COM.STT.MSC.REA.YN0.XXX.LAB.
  1. ;; ;BB2; ;04.ZZZ.URG.COM.COL.DTE.MSC.REA.YN0.STT.XXX.
  1. ;; ;BBK; ;00.ORD.QTY.MDF.SPC.
  1. ;; ;BBX; ;00.RES.
  1. ;;Inpatient Meds ;130; ;00.ORD.DRG.INS.ROU.SCH.URG.COM.SCT.ADM
  1. ;;Generic Meds ;135; ;01.ORD.INS.DRG.DOS.STR.NAM.ROU.SCH.URG.COM.SUP.QTY.REF.SC0.PCK.PI0.SIG.IND.
  1. ;; ;INP; ;00.ORD.INS.DRG.DOS.STR.NAM.ROU.SCH.URG.COM.NOW.SIG.
  1. ;; ;OPX; ;00.ORD.STR.NAM.DRG.ZZZ.URG.COM.SUP.QTY.REF.SC0.PCK.PI0.SIG.TTR.
  1. ;; ;INX; ;00.ORD.STR.NAM.DRG.ZZZ.URG.COM.NOW.SIG.
  1. ;; ;MDX; ;00.INS.DOS.ROU.SCH.DAY.CNJ.
  1. ;;Outpatient Meds ;140; ;00.ORD.DRG.INS.MSC.ROU.SCH.QTY.REF.PCK.URG.COM.SC0.TTR.
  1. ;;Non-VA Meds ;145; ;03.ORD.INS.DRG.DOS.STR.NAM.ROU.SCH.URG.COM.STT.STA.NOW.SIG.
  1. ;;Radiology ;160; ;00.ORD.STT.URG.MOD.CLS.IML.PRG.YN0.PRE.COM.MDF.PRV.CON.RSH.LOC.
  1. ;;IV Meds ;180; ;02.ZZZ.RAT.URG.DAY.COM.SCH.TYP.ADM
  1. ;; ;IVL; ;00.ORD.VOL.ADD.STR.UNT.
  1. ;;
  1. IDTABLE ; ID table - returns codes used in the form table IDINFO("LONGNAME")=SHORNAME
  1. ;;ADD;ADDITIVE
  1. ;;ADM:ADMIN
  1. ;;CAN;CANCEL
  1. ;;CLS;CLASS
  1. ;;COD;CODE
  1. ;;COL;COLLECT
  1. ;;COM;COMMENT
  1. ;;CNJ;CONJ
  1. ;;CON;CONTRACT
  1. ;;DTE;DATETIME
  1. ;;DAY;DAYS
  1. ;;DEL;DELIVERY
  1. ;;DOS;DOSE
  1. ;;DRG;DRUG
  1. ;;ERD;EARLIEST
  1. ;;IML;IMLOC
  1. ;;IND;INDICATION
  1. ;;INS;INSTR
  1. ;;ISO;ISOLATION
  1. ;;LAB;LAB
  1. ;;LOC;LOCATION
  1. ;;MEL;MEAL
  1. ;;MSC;MISC
  1. ;;MOD;MODE
  1. ;;MDF;MODIFIER
  1. ;;NAM;NAME
  1. ;;NOW;NOW
  1. ;;ORD;ORDERABLE
  1. ;;PI0;PI
  1. ;;PCK;PICKUP
  1. ;;PLA;PLACE
  1. ;;PRG;PREGNANT
  1. ;;PRE;PREOP
  1. ;;PRV;PROVIDER
  1. ;;QTY;QTY
  1. ;;RAT;RATE
  1. ;;REA;REASON
  1. ;;REF;REFILLS
  1. ;;RSH:RESEARCH
  1. ;;RES;RESULTS
  1. ;;ROU;ROUTE
  1. ;;SAM;SAMPLE
  1. ;;SC0;SC
  1. ;;SCH;SCHEDULE
  1. ;;SCT:SCHTYPE
  1. ;;SER;SERVICE
  1. ;;SIG;SIG
  1. ;;SPE;SPECIMEN
  1. ;;SPC;SPECSTS
  1. ;;STT;START
  1. ;;STA;STATEMENTS
  1. ;;STP;STOP
  1. ;;STR;STRENGTH
  1. ;;SUP;SUPPLY
  1. ;;TIM;TIME
  1. ;;TTR:TITR
  1. ;;TYP:TYPE
  1. ;;UNT;UNITS
  1. ;;URG;URGENCY
  1. ;;VIS;VISITSTR
  1. ;;VOL;VOLUME
  1. ;;XFU;XFUSION
  1. ;;YN0;YN
  1. ;;XXX;XXX
  1. ;;ZZZ;ZZZ
  1. ;;