#include vhLib.Macro #define EWRECRLoggerGroep "EWRECR" EWRECR ;E'WMS Ontvangen van gegevens [ 12/06/2003 4:22 PM ] #define MailTrap New $ESTACK,$ETRAP Set $ETRAP="Do MailTrap^EWRECR()" ; Quit ; SHOW(Key) New Rec,Kode,C Set Rec=$S(Key?1A2N.E:Key,1:@Key) Set Kode=$E(Rec,1,3) Do TRANSREC(Rec,Kode) Write ! ZWrite C Write ! Quit START Set $ZTrap="OnEWRECRError" Do ##class(vhLib.Logger).%New($$$EWRECRLoggerGroep).Info("Start","EWRECR wordt gestart."_" Device: "_$I) Do INIT IF EWLoop="STOP" Do Quit . Do ##class(vhLib.Logger).%New("EWRECR").Info("Start","EWRECR kon NIET gestart worden."_" Device: "_$I) . Write !,!,"OPGELET : EWRECR kon NIET gestart worden. Check vhLib.Logging !",!,! Do ERROR^EWLOG($T(GESTART)) Do ##class(vhLib.Logger).%New($$$EWRECRLoggerGroep).Info("Start","EWRECR is gestart.") For Quit:EWLoop="STOP" Do Quit:EWLoop="STOP" . ;Use WDev . Set Ok=$System.Event.Wait("EWRECFAST",$S(FastMode:FastTime,1:HangTime)) . If Ok=1 Set FastMode=$P($H,",",2)+^EWREC("P","WAITTIME") ;Read van interjob is voortijdig beeindigd, fastmode ingesteld voor max. 2 min . If FastMode,$D(^EWREC("WHC"))<10 Set FastMode="" ;Geen WaitHandle -> geen fastmode . If FastMode,FastMode<$P($H,",",2) Set FastMode="" ;FastMode is verstrekenen . Do CHECK . Do WMSALIVE . Do:$D(^ORDW("BON")) CHKBON^EWORDF2 ; Verder op bon zetten en afdrukken . Do:$D(^RCP("URG")) CHKURG^EWRCPF ; Urgentie door mailen naar user . Do:$G(^RCP("AUTO")) CHKAUTO^EWRCPF() ; Automatisch inboeken Halux . Lock +^cLOG(cs,"CTK0","JOB"):0 ; Controle of caretaker nog draait . If $T Do ; Indien gelocked dan caretaker gestopt . . Lock -^cLOG(cs,"CTK0","JOB") . . Job ^cQCTK1 . Lock ^EWREC("R") ; unlock alles en terug locken van EWREC("R") . Set Ok=$System.Event.Wait("EWRECSTOP",0) . Set:Ok=1 EWLoop="STOP" Do:EWLoop="STOP" ERROR^EWLOG($T(GESTOPT)) Do ##class(vhLib.Logger).%New($$$EWRECRLoggerGroep).InfoMail("Stop","EWRECR is gestopt (var EWLoop="_EWLoop_").") Do CLEANUP ;Close:$G(WDev) WDev Set $ZTrap="" Quit OnEWRECRError // ErrorHandling added by WimV on 18/08/2011 Set $ZTrap="" New Exception Set Exception = ##class(TECH.ExceptionHandler).Catch() Do ##class(vhLib.Logger).%New($$$EWRECRLoggerGroep).ErrorMail("ErrorTrap","EWRECR is gecrashed: "_Exception.ToString()_" "_$$$CRLF_$$GetJobInfo^vhLib.System()) Do CLEANUP Quit CLEANUP // opkuisen van System.Events en Locks // wordt opgeroepen bij afsluiten van EWRECR en wanneer EWRECR crasht Kill ^EWREC("P","CHKJOB"),^EWREC("P","CHKDEV") Set Ok=$System.Event.Delete("EWRECSTOP") Set Ok=$System.Event.Delete("EWRECFAST") Set:($System.Event.Defined("EWRECSTOPPED")) Ok=$System.Event.Signal("EWRECSTOPPED") Lock Quit STOP New Ok Write "Stop signaal verstuurd",! Set Ok=$$StopSignal() If Ok=1 Write !,"EWRECR is gestopped",! Else Write !,"EWRECR is NIET gestopped",! Quit StopSignal(TimeOut) New Ok,Ok2 Do ERROR^EWLOG($T(MANSTOP)) Do ##class(vhLib.Logger).%New($$$EWRECRLoggerGroep).Info("Stop",$TEXT(MANSTOP)_". Device: "_$I) Do ##class(vhLib.Logger).%New($$$EWRECRLoggerGroep).Info("Stop","Stop triggered from code; Stack= "_$$$CRLF_$$GetStackToString^vhLib()_$$$CRLF_$$GetJobInfo^vhLib.System()) ; Toegevoegd om mysterieuze STOP te achterhalen bij vdr - Added by WimV on 03/10/2011 Set Ok=$System.Event.Create("EWRECSTOPPED") Set Ok=$S($System.Event.Defined("EWRECSTOP"):$System.Event.Signal("EWRECSTOP"),1:0) Set Ok=$System.Event.Wait("EWRECSTOPPED",$G(TimeOut,30)) ; wachten totdat EWREC gestopped Set Ok2=$System.Event.Delete("EWRECSTOPPED") Quit Ok INIT Set Q="K" D ^cA604 ;Set D="\",U=";",Q="K" Set EWLoop="STOP" ; Indien problemen met initialisatie Lock ; Alles unlocken Lock ^EWREC("R"):1 Else Quit Set Ok=$System.Event.Create("EWRECSTOP") Set Ok=$System.Event.Create("EWRECFAST") Set HangTime=^EWREC("P","CHKTIME") Set FastTime=$G(^EWREC("P","CHKFASTTIME"),1) Set WMSTime=$G(^EWREC("P","WMSALIVETIME"),700) Set WMSAlive=$H ; Initilisatie Set $P(WMSAlive,",",2)=$P(WMSAlive,",",2)+WMSTime Set FastMode=1 ;Set WDev=$$OPENJQ^vhDEV ;If 'WDev Do ERROR^EWLOG($T(NOQUEUE)) Quit ; Open van interjob comm. queue ;Set ^EWREC("P","CHKDEV")=WDev+1 Set ^EWREC("P","CHKJOB")=$J Set ^EWREC("P","JOBSTART")=$H Set EWLoop="" ; Geen problemen Quit /* MailTrap() Quit:($ZError="ErrorHandled")&&$Quit "" Quit:($ZError="ErrorHandled") Set ErrorTrace=$$ErrorTrace() Do MailError(ErrorTrace) Set $ZError="ErrorHandled" Quit:$Quit "" Quit MailError(ErrorTrace) Set Body="" Set Body=Body_$S($D(ErrorTrace):ErrorTrace,1:$$ErrorTrace()) Set From="System@vanhoecke.be" Set Subj="EWRECR - Errortrap "_$ZError Set To=$LB("pv@vanhoecke.be") Do SendMiniMail^vhLib(From,To,Subj,Body,,,,,) Quit ErrorTrace(oLog) New ErrorTrace Set ErrorTrace=$C(13)_"$ZERROR: "_$ZERROR Set:$G(%objlasterror)'="" ErrorTrace=ErrorTrace_$C(13)_"Object Last Error: "_$$ParseStatus^vhLib(%objlasterror) Set ErrorTrace=ErrorTrace_$C(13)_"$ECode: "_$ECode Set ErrorTrace=ErrorTrace_$C(13)_"Stack: " For EST=1:1:$ESTACK Set ErrorTrace=ErrorTrace_$C(13)_" "_$STACK($STACK-EST,"PLACE") Set ErrorTrace=ErrorTrace_$C(13)_$C(13)_"Device: "_$I_" Job: "_$J Set ErrorTrace=ErrorTrace_$C(13)_"Server: "_$ZU(110)_" NameSpace: "_$ZU(5) Quit ErrorTrace */ CHECK ;Use $P ;Lock +DirScan New DirR,DirRA,SelDir,FileNm,Files,RecTypes Set DirR=##class(TECH.Config.ConfigMgr).Instance().GetString("WMSExchange_RootDir")_^EWREC("P","DIRR") Set DirRA=##class(TECH.Config.ConfigMgr).Instance().GetString("WMSExchange_RootDir")_^EWREC("P","DIRRARCHIVE") Set Error=0 Do SCANDIR^vhDEV(DirR,"*.*",$NA(Files),"A") Hang $S($P($H,",",2)<3600:10,1:1) ; wachten tot de FTP klaar is met het bestand ; Verwerking in volgorde van kreatie van de bestanden Set FileNm="" For Set FileNm=$O(Files(FileNm)) Quit:FileNm="" Do .Quit:FileNm["WK" ; Er komen bestanden voor die met WK beginnen maar het zijn geen geldige bestanden .Do CONVERT(DirR,$E(FileNm,2,99),.RecTypes) .If RecTypes=-1 Set FileNm="z" Quit ; Fout in het lezen van het bestand, probeer later nogmaals .If RecTypes'=";W01" Do ; Niet alleen ALIVE message ..Set X=$$MOVEFILE^vhDEV(DirR,$E(FileNm,2,99),DirRA,$E(FileNm,2,99)) ..If X Do ERROR^EWLOG($T(NOMOVE)) .Else Do ; Alleen Alive message -> delete file ..Set X=$$DELFILE^vhDEV(DirR,$E(FileNm,2,99)) ..If X Do ERROR^EWLOG($T(NODEL)) Quit CONVERT(DirR,FileNm,RecTypes) ; RecTypes via .Local New Dev,RNext,C,Error,Retry ;Set $ZT="TRAPFILE^EWRECR" Do:$H<59560 ERROR^EWLOG($T(READFILE)) ; logging voor de volgorde van verwerking Set RecTypes="" If $E(FileNm,1,14)'?14N Do ERROR^EWLOG($T(BADFILE)) Quit ; foutief filenaam ; Als het bestand leeg is dan tot drie maal proberen For Retry=0:1:2 Do Quit:RecTypes'="" Hang 1 Do ERROR^EWLOG($T(EMPTYFILE)) . Set FileNm=$$READ^vhDEV(DirR,FileNm,"D`CONVONE^"_$ZN,"EM") ; Lijn per lijn Quit CONVONE(Rec) ; RecTypes globaal gedefinieerd New Kode,RNext Set Kode=$E(Rec,1,3) Do TRANSREC(Rec,Kode) Do:(C'="T01")&(C'="U02")&(C'="S05") CHKVOLG(C("VOLGNR")) Do:(C'="W01")&(C'="T01")&(C'="U02")&(C'="S05") WRITEREC(FileNm,C("VOLGNR"),Rec) ; Alle berichten behalve ALIVE Set RecTypes=RecTypes_";"_C Do CALL Quit TRANSREC(Rec,Kode) New Pos,LNext,LRec,Label,Len,Type,Piece,Pos Set Pos=14 Kill C Set C=Kode Set C("VOLGNR")=$$ADDNUM($E(Rec,4,13),0) For LNext=1:1:$O(^EWREC("D",Kode,""),-1) Do .Set LRec=^EWREC("D",Kode,LNext) .Set Label=$P(LRec,D,1) .Set Len=$P(LRec,D,2) .Set Type=$P(LRec,D,3) .Set Piece=$E(Rec,Pos,Pos+Len\1-1) .Set Pos=Pos+Len\1 .Set Piece=$TR(Piece,"""","'") .If Type="N" Set C(Label)=$$ADDNUM(Piece,$P(Len,".",2)) Quit .If Type="DT" Set C(Label)=$$ADDDAT(Piece) Quit .Set C(Label)=$$ADDALFA(Piece) Quit CALL ; Nakijken of er een routine aan het wachten is, anders oproepen van de respectievelijke routine ;Set $ZT="TRAPEXEC^EWRECR" If $D(^EWREC("WHC"))>1 Do LOCATE^EWRECW ; Nakijken wie er wacht Quit:'$D(C) ; LOCATE kan C verwijderen Set:$G(C)="" C="*" ; Test If C'?1A1(1"P"1N,2N) Do ERROR^EWLOG($T(NOTYPE)) Quit If $T(@C)="" Do ERROR^EWLOG($T(NOTYPE)) Quit If C'="S02",C'="W01" Kill S02Cnt ; Dit om te weten dat er een nieuwe reeks van S02 records begint. Goto @C Quit TRAPEXEC Do ERROR^EWLOG($T(ERROR)) Quit TRAPFILE If $P($ZERROR,">")="60 Do Quit . Do ERROR^EWLOG($T(DUBBEL)) . Set EWLoop="STOP" . ;Set MailId=$$SYSTEM^vhMAIL("","",$ZN,"EWMS","EWRECR gestopt door DUBBEL voorkomen van record","EWMS\\R","U","A") If $L(Rec)<510 Set ^EWREC("R",FileNm,RNext)=Rec Else Do .Set Cnt=0 .For Quit:Rec="" Do ..Set Cnt=Cnt+1 ..Set ^EWREC("R",FileNm,RNext,Cnt)=$E(Rec,1,510) ..Set $E(Rec,1,510)="" Quit CTK ; Controle door de caretaker dat de START routine nog draait Lock +^EWREC("CTK"):1 Else Quit ; Kan maar een keer gestart worden New Set Q="K" Do ^cA604,INIT^vhTERMINA Quit:$$JOBRUN Do ERROR^EWLOG($T(NOSTART)) Set Tekst="De link met het EWMS is verbroken!!!~Routine ^EWRECR draait niet meer~Gelieve dit dringend op te lossen!!!" Set MailId=$$SYSTEM^vhMAIL("","",$ZN,"EWMS",Tekst,"EWMS\\R","U","A") ; Om de 10 sec een beep geven indien START^EWRECR niet loopt For Count=1:1 Set Job=$G(^EWREC("P","CHKJOB")) Quit:'Job Set Routine=$$ROUTINE^cS(Job) Quit:Routine=$ZN Zu 1 Write *7 Hang 10 Quit JOBRUN() For Count=1:1:10 Set Job=$G(^EWREC("P","CHKJOB")) Quit:'Job Set Routine=$$ROUTINE^cS(Job) Quit:Routine=$ZN Hang 1 Quit:'Job 0 Quit Routine=$ZN RESTART ; Oproep voor de LINK-button in vhMAIL om EWRECR terug op te starten New ReStart Set ReStart=$$^vhTXTPOP("EWRECR","RESTARTV") If ReStart Do .Job START^EWRECR:30 .Kill:$G(MailId) ^vhMAIL("D",MailId,"R") .Set ReStart=$$^vhTXTPOP("EWRECR","RESTARTB") Else Do .For I=1:1 Quit:'$D(LD("B",I)) Do ..If $P(LD("B",I),"`",2)'="A" Set $P(LD("B",I),"`",3)="HD" Quit ; ; Oproepen van de routines waarvoor er een record is binnengekomen C01 ;Orderlijn picking Do OL^EWORDF(.C) Quit C02 ;Afsluiten orderpicking voor EWMS gedeelte van een order Set C("SOFTV")="E" Do PICKEND^EWORDF(.C) Quit U02 ;Afsluiten orderpicking voor uglypicking gedeelte van een order Do PICKEND^EWORDF(.C) Quit C03 ; Consolidatie voor een SUBOL Do CONSOL^EWORDF2(.C) Quit C04 ; Confirm consolidatie afsluiten Do CONSEND^EWORDF2(.C) Quit C05 ; Confirm receptie controle op aantal Do CONTROL^EWRCPF(.C) Quit C06 ; Confirm receptie opslag Do STOCK^EWRCPF(.C) Quit C07 ; Confirm afsluiten van een receptie Do END^EWRCPF(.C) Quit S05 ; Stockwijziging van UglyPick S01 ; Stockwijziging Do STOCK^EWPAL(.C) Quit S02 ; Nachtelijke stockoverdracht Do CONTROL^EWPAL(.C) Quit S03 ; Einde van de nachtelijke stockoverdracht Do ENDCTRL^EWPAL Quit T01 ; Ugly picking receptie Do UPRCP^EWTOE(.C) Quit W01 ; WatchDog WMS Do:$P(WMSAlive,",",2)=999999 ERROR^EWLOG($T(ALIVE)) Set WMSAlive=$H Set $P(WMSAlive,",",2)=$P(WMSAlive,",",2)+WMSTime If $G(^EWLOG("DEBUG")) Use $P Write "." Quit WMSALIVE New MailId ; Bij middernacht overschrijding -> reset ; Van middernacht tot 1 uur 's morgens geen Alive - > reset If $P($H,",")>$P($G(WMSAlive),",")!($P($H,",",2)<3600) Do W01 Quit If $P($H,",",2)<$P(WMSAlive,",",2) Quit ; Alivetijd nog niet verstreken Do ERROR^EWLOG($T(NOTALIVE)) Set Tekst="De link met het EWMS is verbroken!!!~Het WMS-Alive bericht wordt niet meer ontvangen~Gelieve dit dringend op te lossen!!!" Set MailId=$$SYSTEM^vhMAIL("","",$ZN,"EWMS",Tekst,"EWMS\\R","U","A") Set $P(WMSAlive,",",2)=999999 ; Bericht kan maar een keer voorkomen na mekaar eenmaal per dag voorkomen Quit Quit ; Errormeldingen NOQUEU ;"Geen JobQueue" CURDRIVE ;"Current drive "_$E(DirR) CURDIR ;"Current dir "_DirR READFILE ;"Te verwerken bestand "_FileNm EMPTYFILE ;"Leeg bestand "_FileNm_" retry "_Retry BADFILE ;"Foutief bestandnaam "_FileNm NODEL ;"Kan file niet verwijderen "_DirR_";"_FileNm NOMOVE ;"Fout in Move file "_FileNm_" from "_DirR_" to "_DirRA NOOPEN ;"Kan file niet openen "_DirR_";"_FileNm FILEERR ;"Fout tijdens lezen bestand "_DirR_";"_FileNm MODER ;" error "_DirR_";"_FileNm VOLGORD ;"VolgNr mismatch "_(^EWREC("R")+1)_" <-> "_VolgNr NOSTART ;"START^EWRECR draait niet meer" GESTOPT ;"EWRECR gestopt via STOP" GESTART ;"EWRECR gestart" MANSTOP ;"STOP^EWRECR opgeroepen" ERROR ;"Feedback oproep in de fout :"_C_";"_C("VOLGNR")_";"_FileNm DUBBEL ;"Dubbel record, bestaat reeds :"_C_";"_C("VOLGNR")_";"_FileNm NOTYPE ;"Geen routine gedefinieerd voor binnenkomend record :"_C NOTALIVE ;"E'WMS is niet meer ALIVE "_$H ALIVE ;"E'WMS is terug ALIVE "_$H