> >********************************************************** >DEFINE CLASS EMPS_Class AS SESSION OLEPUBLIC > > IMPLEMENTS DMSWinsockControlEvents IN "c:\windows\system32\mswinsck.ocx" > > oSock = NULL > > > ********************************************************** > PROCEDURE DMSWinsockControlEvents_Error(NUMBER AS INTEGER, DESCRIPTION AS STRING, Scode AS NUMBER, SOURCE AS STRING, HelpFile AS STRING, HELPCONTEXT AS NUMBER, CancelDisplay AS LOGICAL) AS VOID HELPSTRING "Error occurred" > * add user code here > > ENDPROC > > > ********************************************************** > PROCEDURE DMSWinsockControlEvents_DataArrival(bytesTotal AS NUMBER) AS VOID HELPSTRING "Occurs when data has been received from the remote computer" > > * strData = SPACE(256) && Define string to pass to GetData > >* JJ - TESTING ONLY >STRTOFILE('DataArrival: ' + DTOS(DATE()) + +CHR(10) + CHR(13),'c:\fmsrun\logfile.log',1) > > THIS.oSock.OBJECT.GETDATA(@strData) > > lnStart = SECONDS() > DO WHILE THIS.oSock.State = 6 AND SECONDS() - lnStart <= 5 > DOEVENTS > ENDDO > > IF THIS.oSock.State = 7 > * Testing code to parse HL7 billing data from Medinotes Client to EM tables > =Convert_HL7_Billing_Data(strData) > ENDIF > > ENDPROC > > > ********************************************************** > PROCEDURE DMSWinsockControlEvents_Connect() AS VOID HELPSTRING "Occurs connect operation is completed" > * add user code here > > ENDPROC > > > ********************************************************** > PROCEDURE DMSWinsockControlEvents_ConnectionRequest(requestID AS NUMBER) AS VOID HELPSTRING "Occurs when a remote client is attempting to connect" > > #DEFINE sckClosed 0 > > IF THIS.OBJECT.State <> sckClosed > THIS.oSock.OBJECT.CLOSE > ENDIF > > *!* Accept the request with the requestID > *!* parameter. > THIS.oSock.OBJECT.ACCEPT(requestID) > > ENDPROC > > > ********************************************************** > PROCEDURE DMSWinsockControlEvents_Close() AS VOID HELPSTRING "Occurs when the connection has been closed" > * add user code here > > ENDPROC > > > ********************************************************** > PROCEDURE DMSWinsockControlEvents_SendProgress(bytesSent AS NUMBER, bytesRemaining AS NUMBER) AS VOID HELPSTRING "Occurs during process of sending data" > * add user code here > > ENDPROC > > > ********************************************************** > PROCEDURE DMSWinsockControlEvents_SendComplete() AS VOID HELPSTRING "Occurs after a send operation has completed" > * add user code here > > ENDPROC > > > ********************************************************** > PROCEDURE INIT > > THIS.oSock = CREATEOBJECT("MSWinsock.Winsock.1") > EVENTHANDLER(THIS.oSock, THIS) > > ENDPROC > >ENDDEFINE > > > >********************************************************** >DEFINE CLASS EMPS_Server_Class AS EMPS_Class > > ********************************************************** > PROCEDURE INIT > > DODEFAULT() > >* THIS.oSock.LocalHostName = m.HostName > THIS.oSock.LocalPort = m.Port > THIS.oSock.Listen() > * oSock.SendData("This is a test.") > > ENDPROC > >ENDDEFINE > > > >********************************************************** >DEFINE CLASS EMPS_Client_Class AS EMPS_Class > > ********************************************************** > PROCEDURE INIT > > DODEFAULT() > > THIS.oSock.RemoteHost = m.HostName > THIS.oSock.RemotePort = m.Port > THIS.oSock.Connect() > * oSock.SendData("This is a test.") > > ENDPROC > >ENDDEFINE > > > >******************************************************************************* >PROCEDURE Convert_HL7_Billing_Data > ******************************************************************************* > > PARAMETERS tInput > > strProcessData = tInput > > * TESTING ONLY > * USE "\DATA\Proc_Lock.DBF" IN 0 > > IF !USED("Proc_Lock") > USE "c:\FMSRun\DATA\Proc_Lock.DBF" IN 0 > ENDIF > > SELECT Proc_Lock > > IF Proc_Lock.Locked = .T. > WAIT WINDOW 'Unable to update HL7 at this time.' > ELSE > > SELECT Proc_Lock > REPLACE Proc_Lock.Locked WITH .T. > > WAIT WINDOW 'Ready to update HL7...' > > * TESTING ONLY > * USE "\DATA\JMJ_IN.DBF" IN 0 AGAIN > USE "c:\FMSRun\DATA\JMJ_IN.DBF" IN 0 > > *!* TEXT TO strProcessData NOSHOW > *!* MSH|^~\&|Medinotes|CP|External||20070718121318||DFT^P03|469E3C972923|P|2.4|||AL||| > *!* EVN|P03|20070718121318|20070718121318 > *!* PID|1|1001601|464C71FA040D||Cruise^Tom||19650101000000||||||||||||587879879 > *!* PV1|1|O|Ambulatory Surgery Center^^^^^^^^Ambulatory Surgery Center||||^Cardio^Full|||||||||||||||||||||||||||||||||||||20070718121318|||||| > *!* ORC|SN| > *!* FT1|1|||20070718121318||CG||||||||||^^^Ambulatory Surgery Center|||153.6^Malignant Neoplasm Of Ascending Colon^I9|^Cardio^Full|||||12053^Layer Closure Of Wounds Of Face, Ears, Eyelids, Nose, Lips And/Or Mucous Membranes; 5.1 cm To 7.5 cm^C4| > *!* DG1|1||153.6^Malignant Neoplasm Of Ascending Colon^I9|||F > *!* MSH|^~\&|Medinotes|CP|External||20070705154008||DFT^P03|468D4AD320F3|P|2.4|||AL||| > *!* EVN|P03|20070705154008|20070705154008 > *!* PID|1|11384|468AE48A7926||Johengen^Neil||20051108000000|||||||||||| > *!* PV1|1|O|Ambulatory Surgery Center^^^^^^^^Ambulatory Surgery Center||||^Cardio^Full|||||||||||||||||||||||||||||||||||||20070705154008|||||| > *!* ORC|SN| > *!* FT1|1|||20070705154008||CG||||||||||^^^Ambulatory Surgery Center|||250.00^Diabetes Mellitus Without Mention Of Complication, Type II Or Unspecified Type, Not Stated As Uncontrolled^I9|^Cardio^Full|||||99212^Office Or Other Outpatient Visit For The Evaluation And Management Of An Established Patient, Which Requires At Least Two Of These Three Key Components: A Problem Focused History; A Problem Focused Examination; Straightforward Medical Decision Making. Counseling And/Or Coordination Of Care With Other Providers Or Agencies Are Provided Consistent With The Nature Of The Problem(s) And The Patient's And/Or Family's Needs. Usually, The Presenting Problem(s) Are Self Limited Or Minor. Physicians Typically Spend 10 Minutes Face-To-Face With The Patient And/Or Family.^C4| > *!* DG1|1||250.00^Diabetes Mellitus Without Mention Of Complication, Type II Or Unspecified Type, Not Stated As Uncontrolled^I9|||F > *!* ENDTEXT > > m.MessageCount = 0 > m.MessageLineCount = 0 > > m.FirstMessage = .T. > > FOR ix=1 TO ALINES(laLines,strProcessData) > > STORE LineToObject(laLines[m.ix]) TO ('loObj'+LTRIM(STR(m.ix))) > m.Segment = ALLTRIM(UPPER(EVALUATE('loObj'+LTRIM(STR(m.ix))+".Segment"))) > DO CASE > CASE m.Segment = 'MSH' > SELECT JMJ_IN > APPEND BLANK > m.MessageCount = m.MessageCount + 1 > m.MessageLineCount = 1 > WITH EVALUATE('loObj'+TRANSFORM(m.ix)) > REPLACE JMJ_IN.CODE WITH ALLTRIM(UPPER(.Segment)) > ENDWITH > IF m.FirstMessage = .T. > m.FirstMessage = .F. > ELSE > * JUST FOR TESTING - Real call will send concantenated variable > * Send ACK for all messages except the final one > m.Acknowledgement = "MSH|^~\&|Medinotes e||||20070810113347||" > m.Acknowledgement = m.Acknowledgement + "ACK|20070214102554000008|P|2.4|||||||" > m.Acknowledgement = m.Acknowledgement + "MSA|AA|20070214102554000008||||" > =Acknowledgement(m.Acknowledgement) > ENDIF > CASE m.Segment = 'EVN' > m.MessageLineCount = m.MessageLineCount + 1 > CASE m.Segment = 'PID' > m.MessageLineCount = m.MessageLineCount + 1 > WITH EVALUATE('loObj'+TRANSFORM(m.ix)) > REPLACE JMJ_IN.Pat_No WITH ALLTRIM(UPPER(.Field002)) > ENDWITH > CASE m.Segment = 'PV1' > m.MessageLineCount = m.MessageLineCount + 1 > CASE m.Segment = 'ORC' > m.MessageLineCount = m.MessageLineCount + 1 > CASE m.Segment = 'FT1' > m.MessageLineCount = m.MessageLineCount + 1 > WITH EVALUATE('loObj'+TRANSFORM(m.ix)) > REPLACE JMJ_IN.Raw_Date WITH ALLTRIM(UPPER(.Field004)) > REPLACE JMJ_IN.Charge WITH VAL(.Field011) > REPLACE JMJ_IN.Units WITH VAL(.Field012) > REPLACE JMJ_IN.Diag1 WITH LEFT(ALLTRIM(UPPER(.Field019)),AT('^',.Field019)-1) > REPLACE JMJ_IN.PROC WITH LEFT(ALLTRIM(UPPER(.Field025)),AT('^',.Field025)-1) > ENDWITH > CASE m.Segment = 'DG1' > m.MessageLineCount = m.MessageLineCount + 1 > OTHERWISE > m.MessageLineCount = m.MessageLineCount + 1 > ENDCASE > > =AMEMBERS(gaPropArray, EVALUATE('loObj'+LTRIM(STR(m.ix))), 1) && Array containing object properties > FOR iFields = 1 TO EVALUATE('loObj'+LTRIM(STR(m.ix))+".FieldCount") > * ? gaPropArray(iFields,1) > ENDFOR > > IF m.MessageCount > 0 > * WAIT WINDOW 'Store Segment Now' > * CLEAR > ENDIF > > ENDFOR > > * JUST FOR TESTING - Real call will send concantenated variable > * Send ACK for last message processed > =Acknowledgement(m.Acknowledgement) > > SELECT Proc_Lock > REPLACE Proc_Lock.Locked WITH .F. > > USE IN JMJ_IN > USE IN Proc_Lock > > ENDIF > > RETURN .T. > ******************************************************************************* > > > > ******************************************************************************* >PROCEDURE Acknowledgement(tcACK) > ******************************************************************************* > > * Send ACK back to HL7 Client > IF THISFORM.tcpServer.OBJECT.State = 7 > THISFORM.tcpServer.OBJECT.SendData(tcACK) > ELSE > WAIT WINDOW "Not Connected." TIMEOUT 1 > * Need to log this to say that the acknowledgement was not sent > ENDIF > > RETURN .T. > ******************************************************************************* > > > > ******************************************************************************* >PROCEDURE LineToObject(tcLine) > ******************************************************************************* > > LOCAL loRecord,ix > > loRecord = CREATEOBJECT('Empty') > > ADDPROPERTY(loRecord, 'Segment', GETWORDNUM( m.tcLine,1,'|')) > > m.FieldCount = 0 > > FOR ix=1 TO OCCURS('|',m.tcLine) > m.Stepper = 0 > IF ix = 1 AND loRecord.Segment = 'MSH' > ADDPROPERTY(loRecord, 'Field001', '|') > m.FieldCount = m.FieldCount + 1 > m.Stepper = 1 > ENDIF > ADDPROPERTY(loRecord, 'Field'+PADL(m.ix+m.Stepper,3,'0'), STREXTRACT(m.tcLine,'|','|',m.ix,2)) > m.FieldCount = m.FieldCount + 1 > ENDFOR > > ADDPROPERTY(loRecord, 'FieldCount', m.FieldCount) > > RETURN loRecord > >ENDPROC >******************************************************************************* >