#include vhLib.Macro vhLock ;Verwerking van locks [ 12/03/2003 8:16 AM ] ; LOCKW(BList,T1,T2,T3,T4,T5) ; met waarschuwing New J,N,Y,Ask,GRef LOCKW2 Set %TC=1 For J=1:1:5 Quit:$G(@("T"_J))="" S Y="Lock +"_@("T"_J)_":0" x Y Quit:'$T Quit:$T 1 Set GRef=@("T"_J) For J=1:1:J-1 S Y="Lock -"_@("T"_J)_":0" x Y ; Steeds unlocken Set Ask=$$WARN(GRef,$G(BList)) Goto LOCKW2:Ask="N" ; Nogmaals Set %TC=0 Quit Ask WARN(Ref,BList) ;BList : N = Nogmaals, R = Alleen lezen, X = eXit Set:$G(BList)="" BList="NX" New Dev,UserDev,User,R,Tekst,Button,Ask,GName,Job,Devio Set Job=$$LOCKJOB(Ref) Set GebruikerInfoJob = $$GebruikerInfoJob(Job) Set GName=$$TRANSREF(Ref) Set Tekst=0 If $L(GName) Do . Set Tekst=Tekst+1,Tekst(Tekst)=$$INITCAP^vhRtn1(GName)_" in gebruik" . Set Tekst=Tekst+1,Tekst(Tekst)="Referentie: "_Ref Else Do . Set Tekst=Tekst+1,Tekst(Tekst)="Referentie: "_Ref_" in gebruik" If $Length(GebruikerInfoJob) > 0 Do .Set Tekst=Tekst+1,Tekst(Tekst)=GebruikerInfoJob Set Button=0 Set:BList["N" Button=Button+1,Button(Button)="Nogmaals&N" Set:BList["R" Button=Button+1,Button(Button)="Alleen lezen&R" Set:BList["X" Button=Button+1,Button(Button)="Stoppen&X" if ##class(vhLib.TerminalDevice).IsCurrentSessionATerminalSession() { Set Ask=$$WILD^vhTXTPOP("C;C","Bestand in gebruik","Tekst","Button",3) } else { New iterator set iterator = ##class(TECH.ArrayOneDimIterator).%New(.Tekst) New Info set Info = "" while iterator.HasNext() { set Info = Info_iterator.Next()_" " } new Exception set Exception = ##class(TECH.Exceptions.LockedException).%New(Info) do ##class(TECH.ExceptionHandler).Throw(Exception) } Quit Ask TRANSREF(GlobRef) New Ref,Piece,Txt Set Ref=GlobRef Set:$E(Ref)="^" $E(Ref)="" Set:$E(Ref)="[" Ref=$P(Ref,"]",2,99) ; uci Set:$E(Ref)="|" Ref=$P(Ref,"|",3,99) ; uci Set Ref=$P(Ref,"(",1) Set Piece=$P($T(GNAME),";"_Ref_";") Quit:Piece=$T(GNAME) "" Set Txt=$P($T(GOMS),";",$L(Piece,";")+1) Quit Txt GNAME ;KPR;KOD;KKL;ORDW;PRBS;KTO;RCP;KUL;KLE;KlachtD;REMBOURS; GOMS ;product;order;klant;wms-order;bouwsteen;toelevering;receptie;levering;leverancier;klacht;Rembours; ; LDISP(LockNaam,Info) ; Waarschuwing gebruiker indien lock niet mogelijk If ##class(CHUI.Context).Instance().HeeftUserInterface() { New ResultSet,Status,LockJob,InfoLijn1,InfoLijn2 Set ResultSet=##class(%ResultSet).%New("%SYS.LockQuery:List") Set Status = ResultSet.Execute() If 'Status w "Fout Rset.Execute() : "_$$ParseStatus^vhLib(Status) Set LockJob = $$LOCKJOB(LockNaam) If $G(Info)="" Set Info="Bestand "_LockNaam Set InfoLijn1=Info_" in gebruik" Set InfoLijn2 = $$GebruikerInfoJob(LockJob) Do ##class(vhLib.Logger).%New().Warning("LDISP",InfoLijn1_$C(13,10)_InfoLijn2_$C(13,10)_$$GetStackToString^vhLib.System()) Set FP=2301 Write @F,@F1,@FMTI," ",InfoLijn1," [] = ok ",@FMTi If ($Length(InfoLijn2) > 0){ Set FP=2401 Write @F,@F1,@FMTI," ",InfoLijn2,@FMTi } Do IK^PROC1 Quit:$G(zb)="ENTER" Set FP=2401 Write @F,@F1 Do:$G(QW) ZWINT^vhRtn2(0) } else { Do ##class(vhLib.Logger).%New().Warning("LDSIP","Er is een lock '" _LockNaam _"' opgetreden en er is geen CHUI beschikbaar om een melding te geven. Mogelijks vangt de code zelf de lock op en onderneemt deze de nodige acties." _$C(13,10) _Info) } Quit GebruikerInfoJob(Job) New ClientInfo, Process, User, Info Set ClientInfo = "" Set Process = ##class(%SYS.ProcessQuery).%OpenId(Job) If ($IsObject(Process)){ Set ClientInfo = $Piece(Process.ClientNodeName,"/") If ('$Length(ClientInfo)) Set ClientInfo = Process.ClientIPAddress set ClientInfo = ClientInfo _ $$$IfLength(Process.ClientExecutableName," ","") } Set Info = "(Process "_Job If ($Length(ClientInfo)>0){ Set Info = Info_ " op "_ClientInfo_")" }Else{ Set Info = Info_")" } Quit Info ADD(T1,T2,T3,T4,T5,T6=0) New J,N,Y Set %TC=1 For J=1:1:5 Quit:$G(@("T"_J))="" S Y="Lock +"_@("T"_J)_":"_T6 x Y Quit:'$T Quit:$T For J=1:1:J-1 Lock -@("T"_J) Set %TC=0 Quit ; REMOVE(T1) X "Lock -"_T1 Quit ; ADDTAB(TName) New J,Y Set %TC=1 For J=1:1:+$G(@TName) S Y="Lock +"_(@TName@(J))_":0" x Y Quit:'$T Goto:'$T LOCKT2 Quit ; TLOCK(Ref,Dev) Quit $$LOCKDEV(Ref)=Dev ; LOCKT2 For J=J-1:-1:1 Lock -@(Table(J)) Set %TC=0 Quit ; ;Geeft het device welke een bepaalde referentie gelockt heeft LOCKDEV(sT) New Job,LockJob,Dev,LockDev,I,DevTab Set LockJob=$$LOCKJOB(sT) If 'LockJob Quit "" ;Locktable bevat geen lock op sT Set LockDev=$$DEVICE^cS(LockJob) Quit LockDev ; ;Geeft de job welke een bepaalde referentie gelockt heeft LOCKJOB(LockNaam) New ResultSet,Status,LockJob,Temp Set ResultSet=##class(%ResultSet).%New("%SYS.LockQuery:List") Set Status = ResultSet.Execute() If 'Status w "Fout Rset.Execute()" Set LockJob = "" /// Omdat LockNaam nog lokale variabele kan nodig hebben, deze via een omweg ook in LockNaam steken. Try{ set Temp = $Data(@LockNaam) Set LockNaam = $ZREFERENCE }Catch Exception { /// Indien in catch terecht komt wordt de gewone LockNaam nog gebruikt en weten we zeker dat het niet nodig om via indirectie de naam op te bouwen. } While (ResultSet.Next() && ($Length(LockJob) = 0)) { If (ResultSet.Data("LockString") = LockNaam) Set LockJob = ResultSet.Data("Owner") } Do ResultSet.Close() Quit LockJob // Schrijft de Lock-lijst naar device LOCKLIST() New ResultSet,Status Set ResultSet=##class(%ResultSet).%New("%SYS.LockQuery:List") Set Status = ResultSet.Execute() If 'Status w "Fout Rset.Execute() : "_$$ParseStatus^vhLib(Status) While (ResultSet.Next()) { Write !, ResultSet.Data("LockString")," job: ", ResultSet.Data("Owner") } Quit ;