UglyPickingCNTs BL.Lib.BaseObj 0 1 %Library.Boolean Heeft data maar geen kinderen . Set PBLine=@@airefPB ;airefPB is bijv. aiPB(...), @airefPB is bijv. aPB(...), dus @@airefPB is de data-inhoud van aPB(...) . Quit:($P(PBLine,SEP,2)'=0) ;Enkel lijnen met BKVolgNr=0, de andere zijn gemaakte koppelingen . Set ProductNr=$P(PBLine,SEP,3) . ;Kijken of een toelevering aan de lijn is gekoppeld . Set tmpTLNr=$P(PBLine,SEP,13) . If tmpTLNr'="" Do Quit ;Sluit indien gekoppeld, verder opzoekwerk is overbodig .. Set:('$D(aTLNrsToCheck(tmpTLNr,ProductNr))) aTLNrsToCheck(tmpTLNr,ProductNr)=1 . ;Zoeken naar toelevering(en) voor product . Set lbTLNrsForProd=##class(BL.MB.UGLYPicking.Receptie).GetTLNrsViaProdNr(ProductNr) . Quit:($LL(lbTLNrsForProd)'=1) ;Producten aanwezig in meer dan één (of geen) toelev.: negeren . Set tmpTLNr=$LI(lbTLNrsForProd) . Set:('$D(aTLNrsToCheck(tmpTLNr,ProductNr))) aTLNrsToCheck(tmpTLNr,ProductNr)=1 New AllIsCoupled Set AllIsCoupled=1 ;Opgebouwde lijst met toeleveringen controleren ;lbMarkedProds: hier komen de producten in te staan welke deel uitmaken van een niet volledig ;gekoppelde of gescande toelevering New TLNr Set TLNr="" Set ProductNr="" For Set TLNr=$O(aTLNrsToCheck(TLNr)) Quit:(TLNr="") Do . Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedProdArrayViaToelev(TLNr) . If $O(@airefPTP@(0,""))'="" Do ;Er zijn producten die niet volledig gedaan zijn! .. Set AllIsCoupled=0 .. For Set ProductNr=$O(aTLNrsToCheck(TLNr,ProductNr)) Quit:(ProductNr="") Do ... If '$LF(lbMarkedProds,ProductNr) Do .... ;Quit:(##class(BL.MB.UGLYPicking.ReceptieProductie).GetGekoppeldeCnt(ProductNr)=0) .... Set lbMarkedProds=lbMarkedProds_$LB(ProductNr) Quit AllIsCoupled ]]> aPB aPT aiPB aiPT aiPTP temp_t01.msg 1 %String 1 bfrRGID:%Library.String,bfrVolgNr:%Library.String,bfrLijnNr:%Library.String cache 0 %Library.String document literal 1 ProductNr:%Library.String cache 0 %Library.Boolean document literal 1 BufferKey:%Library.String,bfrRGID:%Library.String,bfrVolgNr:%Library.String,bfrLijnNr:%Library.String cache 0 document literal 1 JobID:%String 1 %Library.Boolean 1 ProductNr:%Library.String cache 0 %Library.Integer document literal 1 ProductNr:%Library.String cache 0 %Library.Integer document literal 1 ProductNr:%Library.String,UseThisTLNr:%Library.String cache 0 %Library.Integer document literal 1 ProductNr:%Library.String,UseThisTLNr:%Library.String cache 0 %Library.Integer document literal 1 ProductNr:%Library.String cache 0 %Library.Integer document literal 1 ProductNr:%Library.String cache 0 %Library.Integer document literal 1 ProductNr:%Library.String cache 0 %Library.String document literal meer dan één toelevering voor een product ; geen toeleveringen voor product New TLNr Set TLNr=$O(@arefPT@(ProductNr,"")) If TLNr="" Do . Set Status=Status_"Z" Else Do . Set TLNr=$O(@arefPT@(ProductNr,TLNr)) . If TLNr'="" Do .. Set Status=Status_"T" ; ===================================================================================================== If Status'["Z" Do ;Indien Z->geen toelevs voor product->dan ook geen '+' of '-' aanduidingen . ; <+> aantal hoger dan aantal in toeleveringen . ; <-> aantal lager dan aantal in toeleveringen . ; SOM TOELEVERING QTYs . New PTSumQtyAvailable ;PBQtyRequestSum: zie boven . Set PTSumQtyAvailable=##class(BL.MB.UGLYPicking.ReceptieProductie).GETPTSumQtyAvailable(ProductNr) . ; COMPARE . If PBSumQtyAvailable>PTSumQtyAvailable Do .. Set Status=Status_"+" . Else If PBSumQtyAvailable 1 BufferKey:%Library.String cache 0 %Library.String document literal 1 ProductNr:%Library.String,BufKey:%Library.String cache 0 %Library.String document literal 1 TLNr:%Library.String,TLUNr:%Library.String cache 0 %Library.String document literal 1 ProductNr:%Library.String cache 0 %Library.Integer document literal 1 ProductNr:%Library.String cache 0 %Library.List document literal of = # gescand? New PBSumQtyAvailable,PTSumQtyAvailable Set PBSumQtyAvailable=##class(BL.MB.UGLYPicking.ReceptieProductie).GETPBSumQtyAvailable(ProductNr) Set PTSumQtyAvailable=##class(BL.MB.UGLYPicking.ReceptieProductie).GETPTSumQtyAvailable(ProductNr) Quit:(PTSumQtyAvailable 1 cache 0 %Library.List document literal 1 toelevering OF ; * 1 bufferlijn -> meerdere toeleveringen OF ; * meerdere bufferlijnen -> 1 toelevering New arefPT,arefPB Set arefPT=..#aPT Set arefPB=..#aPB New ProductNr,TLNr,TLUNr,BufKey New KoppelStr,KoppelCnt,Status New PBSumQtyAvailable,PTSumQtyAvailable,AssocToelev,SEP New MeerdereBufferlijnen,MeerdereToeleveringen Set ProductNr="", SEP=##class(BL.MB.UGLYPicking.Receptie).GetBufferSeperator() Set KoppelStr="", KoppelCnt=0 For Set ProductNr=$O(@arefPT@(ProductNr)) Quit:(ProductNr="") Do . Set AssocToelev="" . Set MeerdereBufferlijnen=($O(@arefPB@(ProductNr,$O(@arefPB@(ProductNr,""))))'="") ;dubbele $order . Set MeerdereToeleveringen=(##class(BL.MB.UGLYPicking.ReceptieProductie).GetToelevCnt(ProductNr)>1) . If 'MeerdereBufferlijnen Do .. ;Ophalen van eventueel geassocieerde toelevering (één bufferlijn voor dit product) .. Set BufKey=$O(@arefPB@(ProductNr,"")) .. Set AssocToelev=$P($G(@arefPB@(ProductNr,BufKey,0)),SEP,13) .. Set:(AssocToelev'="") MeerdereToeleveringen=0 ;A la carte zal de bufferlijn met de AssocToelev koppelen . Quit:(MeerdereBufferlijnen && MeerdereToeleveringen) . ; --- PTSumQtyAvailable=PBSumQtyAvailable->koppelen (tenzij beiden =0)! --- . Set PBSumQtyAvailable=##class(BL.MB.UGLYPicking.ReceptieProductie).GETPBSumQtyAvailable(ProductNr) . Set PTSumQtyAvailable=##class(BL.MB.UGLYPicking.ReceptieProductie).GETPTSumQtyAvailable(ProductNr,AssocToelev) . If (PBSumQtyAvailable<=PTSumQtyAvailable) && (PBSumQtyAvailable'=0) Do Quit .. Set Status=##class(BL.MB.UGLYPicking.ReceptieProductie).KoppelALACARTE(ProductNr) ;alles maken, sum is toch identiek .. If $LI(Status)>0 Do ... Set KoppelStr=KoppelStr_$C(13,10)_"- Product "_ProductNr_" (gelijk aantal: "_PBSumQtyAvailable_")." ... Set KoppelStr=KoppelStr_$C(13,10)_" "_$LI(Status,2) ... Set KoppelCnt=KoppelCnt+1 ;Sortering up-to-date houden (in interface te gebruiken) ;Eigenlijk reeds gebeurt in KoppelALACARTE, want die roept KoppelMANUEEL op en deze bouwt de sortering ;steeds opnieuw op... ;Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedBufferArray() ;Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedToelevArray() Quit:(KoppelCnt=0) $LB(2,"Er zijn geen automatische koppelingen uitgevoerd.") Quit $LB(1,KoppelCnt_" automatische koppeling(en) uitgevoerd: "_$C(13,10)_KoppelStr) ]]> 1 ProductNr:%Library.String,BufferKey:%Library.String,TLNr:%Library.String,TLUNr:%Library.String,OverwriteQtyToTakeFromToelev:%Library.String=0 cache 0 %Library.List document literal koppel 'aantal gescand' .. Set QtyToTakeFromToelev=PBQtyAvailable . Else Do .. Set QtyToTakeFromToelev=PTQtyAvailable ;Aantal gescand > of = Aantal besteld -> koppel 'aantal besteld' Else Do . Set QtyToTakeFromToelev=OverwriteQtyToTakeFromToelev ;KIJKEN OF QTY TO TAKE FROM TOELEV '> PBQTYAvailable New MaxToTake If ##class(BL.MB.UGLYPicking.ReceptieProductie).GetToelevCnt(ProductNr)=1 Do . Set MaxToTake=PBQtyAvailable ;Er kan meer gescand zijn dan het aantal in toelevs (toelaten om scanaantal te nemen) Else Do . Set MaxToTake=PTQtyAvailable ;Default Quit:(QtyToTakeFromToelev>MaxToTake) $LB(-3,"Het maximum aantal dat gekoppeld kan worden is "_MaxToTake_".") ; ========================================================================================================== ; REAL KOPPEL STUFF ; ========================================================================================================== ; --- UPDATE aPB met BKVolgNr=0 --- New PBKlantID,PTKlantID,PBTLNr Set $P(PBLine,SEP,10)=$P(PBLine,SEP,10)+QtyToTakeFromToelev ;QtyReserved augmenteren Set PBKlantID=$P(PBLine,SEP,6) Set PTKlantID=$P(PTLine,SEP,3) If PBKlantID=-1 Do ;nog geen klant opgegeven (op BKVolgNr=0 niveau is klant interfacegewijs ingevuld) . Set $P(PBLine,SEP,6)=PTKlantID Else Do . Set:(PBKlantID'=PTKlantID) $P(PBLine,SEP,6)="..." Set PBTLNr=$P(PBLine,SEP,7) If PBTLNr=-1 Do . Set $P(PBLine,SEP,7)=TLNr Else Do . Set:(PBTLNr'=TLNr) $P(PBLine,SEP,7)="..." Set @arefPB@(ProductNr,BufferKey,0)=PBLine ; --- INSERT aPB met BKVolgNr>0 --- New NewBKVolgNr,PalletID,PTQtyRequest,LocatieID Set NewBKVolgNr=##class(BL.MB.UGLYPicking.ReceptieProductie).GetNewBKVolgNr(ProductNr,BufferKey) Set PalletID=$P(PBLine,SEP,4) Set LocatieID=$P(PBLine,SEP,11) ; hierna wordt PBLine overschreven!!! Set PTQtyRequest=$P(PTLine,SEP,1) Set PBLine=BufferKey_SEP_NewBKVolgNr_SEP_ProductNr_SEP_PalletID_SEP_PTQtyRequest Set PBLine=PBLine_SEP_PTKlantID_SEP_TLNr_SEP_TLUNr_SEP_0_SEP_QtyToTakeFromToelev_SEP_LocatieID_SEP_0 Set @arefPB@(ProductNr,BufferKey,NewBKVolgNr)=PBLine ; --- UPDATE aPT --- Set $P(PTLine,SEP,2)=$P(PTLine,SEP,2)+QtyToTakeFromToelev Set @arefPT@(ProductNr,TLNr,TLUNr)=PTLine ;Indien in de ongekoppelde toelevering QtyRequest < of = QtyReserved ->lijn verwijderen! If $P(PTLine,SEP,1)'>$P(PTLine,SEP,2) Do . Set $P(@arefPB@(ProductNr,BufferKey,NewBKVolgNr),SEP,12)=1 . Kill @arefPT@(ProductNr,TLNr,TLUNr) ; Indien het gescande van de bufferlijn volledig gekoppeld is, dan controleren we ; of er backorder flags geset moeten worden ; VOORWAARDE FLAGS: ; - ALLE gescande bufferlijnen van een PRODUCT zijn gekoppeld ; - Set de flag voor toeleveringslijnen die zijn 'aangetast': ; QtyReq'=QtyRes (zoniet lijn verwijderd) of QtyReq=QtyRes ; EN ; QtyRes'=0 (zoniet is er nog geen koppeling met deze toeleveringslijn) Set PBLine=@arefPB@(ProductNr,BufferKey,0) If $P(PBLine,SEP,5)=$P(PBLine,SEP,10) Do . If ##class(BL.MB.UGLYPicking.ReceptieProductie).CouldBeBackorder(ProductNr) Do .. Do ##class(BL.MB.UGLYPicking.ReceptieProductie).SetBackorderViaProd(ProductNr) ; ========================================================================================================== ; SORTERING up-to-date houden (in interface te gebruiken) ; ========================================================================================================== Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedBufferArray() Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedToelevArray(ProductNr) Quit $LB(1,"Manuele koppeling succesvol uitgevoerd.") ]]> 1 ProductNr:%Library.String cache 0 %Library.List document literal 0) New arefPB Set arefPB=..#aPB New SEP Set SEP=##class(BL.MB.UGLYPicking.Receptie).GetBufferSeperator() New BufferKey,BKVolgNr,PBLine,UndoCnt Set BufferKey="" Set UndoCnt=0 For Set BufferKey=$O(aPB(ProductNr,BufferKey)) Quit:(BufferKey="") Do . Set PBLine=aPB(ProductNr,BufferKey,0) . If $P(PBLine,SEP,10)>0 Do .. Set UndoCnt=UndoCnt+1 . Else Quit . Kill aPB(ProductNr,BufferKey) . Set $P(PBLine,SEP,10)=0 . Set $P(PBLine,SEP,6)=-1 . Set $P(PBLine,SEP,7)=-1 . Set $P(PBLine,SEP,8)=-1 . Set $P(PBLine,SEP,9)=0 . Set aPB(ProductNr,BufferKey,0)=PBLine If UndoCnt=0 Do Quit $LB(2,"Geen koppelingen gevonden om ongedaan te maken.") Else Do Quit $LB(1,UndoCnt_" bufferlijn(en) ge-reset voor product "_ProductNr_".") . Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedBufferArray() . Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedToelevArray(ProductNr) ]]> 1 TimeOut:%Library.Integer=0 cache 0 %Library.Boolean document literal 1 FilterOnProductNr:%Library.String=0 cache 0 %Library.List document literal niet echt een fout... // 0: // 1: SUCCESS // 2: SUCCESS, echter enkele toeleveringen werden uit de array verwijderd wegens een negatieve QtyRequest ;Voer eerst de method 'GetToelevArraySortedOnProd'. Dit genereert default de array 'aPT'. ;De naam van de gegenereerde array kan je dan meegeven aan deze method (ToelevArraySortedOnProdName) ;Deze array wordt dan gewijzigd naar gelang de inhoud van ^UPRCP("R") ;We locken ^UPRCP("R") zodat wijzigingen van iemand anders even in een wachtrij worden geplaatst... Quit:('##class(BL.MB.UGLYPicking.ReceptieProductie).LockReservaties(1)) $LB(-1,"De reservatie-gegevens zijn momenteel in gebruik. Probeer later eens opnieuw.") New arefPT Set arefPT=..#aPT New RCPKey,Rec,ProductNr,TLNr,TLUNr,SEP,QtyRequest,QtyRCP,Delta,QtyErrorStr Set (RCPKey,TLNr,TLUNr)="" Set QtyErrorStr="" Set SEP=##class(BL.MB.UGLYPicking.Receptie).GetBufferSeperator() For Set TLNr=$O(^UPRCP("R",TLNr)) Quit:(TLNr="") Do . For Set TLUNr=$O(^UPRCP("R",TLNr,TLUNr)) Quit:(TLUNr="") Do .. For Set RCPKey=$O(^UPRCP("R",TLNr,TLUNr,RCPKey)) Quit:(RCPKey="") Do ... Set Rec=^UPRCP("R",TLNr,TLUNr,RCPKey) ... Set ProductNr=$P(Rec,SEP,1) ... Quit:(FilterOnProductNr && (ProductNr'=FilterOnProductNr)) ... If $D(@arefPT@(ProductNr,TLNr,TLUNr)) Do .... Set QtyRequest=$P(@arefPT@(ProductNr,TLNr,TLUNr),SEP,1) .... Set QtyRCP=$P(Rec,SEP,2) .... Set Delta=QtyRequest-QtyRCP .... If Delta<1 Do Quit ..... If Delta<0 Do ;Enkel bij <0 een bericht weergeven ...... Set QtyErrorStr=QtyErrorStr_$C(13,10)_"- ProductNr "_ProductNr_", toeleveringsnr "_TLNr_", TLUNr "_TLUNr ...... Set QtyErrorStr=QtyErrorStr_" (Request: "_QtyRequest_", Reserved: "_QtyRCP_")" ..... Kill @arefPT@(ProductNr,TLNr,TLUNr) ;Is geen geldige toeleveringslijn meer... ..... ;Do WL^vhDBG("Killed in aPT: "_ProductNr_","_TLNr_","_TLUNr_": "_Delta) .... Else Do ..... Set QtyRequest=Delta ..... Set $P(@arefPT@(ProductNr,TLNr,TLUNr),SEP,1)=QtyRequest ..... ;Do WL^vhDBG("Pushed in aPT: "_ProductNr_","_TLNr_","_TLUNr_": "_Delta) ;Lock vrijgeven Do ##class(BL.MB.UGLYPicking.ReceptieProductie).UnLockReservaties() Quit:(QtyErrorStr'="") $LB(2,"Volgende toeleveringen hebben ongeldige reservaties:"_$C(13,10)_QtyErrorStr) Quit $LB(1,"Reservaties succesvol aangebracht in ToeleveringsArray.") ]]> 1 makovaStrings:%Library.TMStrings=0,SynchronizeOnly:%Library.Boolean=0 cache 0 %Library.List document literal probeer later opnieuw... New SendCRecsStatus Set SendCRecsStatus=$LB(0) ;neutraal If SynchronizeOnly Do . $$$WriteToLog("Synchronize messages only...") . Set SendCRecsStatus=$$SendCRecs() Quit:($LI(SendCRecsStatus)<0) $LB(-2,$LI(SendCRecsStatus,2)) Quit:($LI(SendCRecsStatus)>0) $LB(1,$LI(SendCRecsStatus,2)) ;=================================================================================================== ; INIT: vars, SEP, locken... ;=================================================================================================== Do AddToLog("Bezig met voorbereiden van de gegevens...") New arefPB,arefPT Set arefPB=..#aPB Set arefPT=..#aPT #Define akeyCRec 1 #Define akeyCompleet 2 #Define akeySplitsNr 3 New SEP Set SEP=##class(BL.MB.UGLYPicking.Receptie).GetBufferSeperator() Do AddToEndOfLog("Ok.") ;=================================================================================================== ; DOORSTUREN ;=================================================================================================== ;Checken of er C-records niet zijn verstuurd, indien dit het geval is: afsluiten! Dan moet in het ;programma eerst deze verwerkt/verwijderd worden! Quit:($D(^aRecProdRecsToSend($J))) $LB(-3,"Enkele synchronisatie-berichten van een vorig doorsturen zijn niet verwerkt. Verwerk/verwijder deze eerst.") ;Locken van toeleveringen+bijhorende producten. Indien niet gelukt, unlock all & quit New ProductNr,BufKey,BKVolgNr,aLockToelevs,PBLine,TLNr,TLUNr Set (ProductNr,BufKey)="" For Set ProductNr=$O(@arefPB@(ProductNr)) Quit:(ProductNr="") Do . For Set BufKey=$O(@arefPB@(ProductNr,BufKey)) Quit:(BufKey="") Do .. Set BKVolgNr=0 .. For Set BKVolgNr=$O(@arefPB@(ProductNr,BufKey,BKVolgNr)) Quit:(BKVolgNr="") Do ... Set PBLine=@arefPB@(ProductNr,BufKey,BKVolgNr) ... Set TLNr=$P(PBLine,SEP,7) ... Set TLUNr=$P(PBLine,SEP,8) ... Set aLockToelevs(TLNr,TLUNr)=1 ;Lock shit New ErrStr Set ErrStr=$$UPRCPLock(.aLockToelevs) Quit:(ErrStr'="") $LB(-4,ErrStr) ;Locken van ^UPRCP("R"), hierin stoeien is even uit den boze Quit:('##class(BL.MB.UGLYPicking.ReceptieProductie).LockReservaties(2)) $LB(3,"De reservatie-gegevens zijn momenteel in gebruik. Probeer later eens opnieuw.") New SendSingleInfoError,SendSingleInfoStatus,DoorstuurCnt Set SendSingleInfoError=0, DoorstuurCnt=0 For Set ProductNr=$O(@arefPB@(ProductNr)) Quit:((ProductNr="") || SendSingleInfoError) Do . For Set BufKey=$O(@arefPB@(ProductNr,BufKey)) Quit:((BufKey="") || SendSingleInfoError) Do .. Set BKVolgNr=0 .. For Set BKVolgNr=$O(@arefPB@(ProductNr,BufKey,BKVolgNr)) Quit:((BKVolgNr="") || SendSingleInfoError) Do ... Do:(BKVolgNr=1) AddToLog(""),AddToLog("---=[ Product "_ProductNr_", Buffer "_BufKey_" ]=---") ... Set SendSingleInfoStatus=$$SendSingleInfo(ProductNr,BufKey,BKVolgNr) ... If $LI(SendSingleInfoStatus)>0 Do .... Set DoorstuurCnt=DoorstuurCnt+1 ... Else Do .... Set SendSingleInfoError=1 ;=================================================================================================== ; VERSTUREN VAN C-RECORDS ;=================================================================================================== Set SendCRecsStatus=$LB(0) If DoorstuurCnt>0 Do ;If 'SendSingleInfoError && (DoorstuurCnt>0) Do . Set SendCRecsStatus=$$SendCRecs() ;=================================================================================================== ; EXIT ;=================================================================================================== Do AddToLog("") Do AddToLog("Bezig met afsluiten...") ;Unlock shit Do UPRCPUnLock(.aLockToelevs) ;Lock op ^UPRCP("R") vrijgeven Do ##class(BL.MB.UGLYPicking.ReceptieProductie).UnLockReservaties() Do AddToEndOfLog("Ok.") Quit:(SendSingleInfoError) $LB(-1,$LI(SendSingleInfoStatus,2)) Quit:($LI(SendCRecsStatus)<0) $LB(-2,$LI(SendCRecsStatus,2)) Quit:(DoorstuurCnt=0) $LB(2,"Er was geen gekoppelde info ter beschikking om door te sturen.") Quit $LB(1,"Er werd(en) "_DoorstuurCnt_" koppeling(en) succesvol doorgestuurd.") ;################################################################################################### ;=================================================================================================== ; WERKELIJKE ROUTINE: 1 koppeling doorsturen... ;=================================================================================================== SendSingleInfo(ProductNr,BufKey,BKVolgNr,aLockToelevs) ;&RecsToSend New PBLine,QtyFromToelev,QtyInToelev Set PBLine=@arefPB@(ProductNr,BufKey,BKVolgNr) Set QtyFromToelev=$P(PBLine,SEP,10) Set QtyInToelev=$P(PBLine,SEP,5) Do AddToLog(" * Koppeling # "_BKVolgNr_", toeleveringsaantal: "_QtyFromToelev_"/"_QtyInToelev_".") ;--- PALLET AANMAKEN/WIJZIGEN ---------------------------------------------------------------------- ; INVENTORY GEGs Do AddToLog($C(9)_"Opvragen inventory status...") New tmpStatus,PalletID,IsNewSectie,IsNewPallet,SectieToUse Set PalletID=$P(PBLine,SEP,4) Set tmpStatus=##class(EWMS.Inventory).GetMyInventoryStatus(PalletID,ProductNr,.IsNewSectie,.IsNewPallet,,.SectieToUse) If $LI(tmpStatus)<0 Do Quit tmpStatus . Do AddToEndOfLog("ERROR (PalletID: "_PalletID_", ProductNr: "_ProductNr_").") Else Do . If IsNewPallet Do .. Do AddToEndOfLog("Ok: nieuwe pallet '"_PalletID_"'.") . Else Do .. If IsNewSectie Do ... Do AddToEndOfLog("Ok: nieuwe sectie '"_SectieToUse_"' op pallet '"_PalletID_"'.") .. Else Do ... Do AddToEndOfLog("Ok.") ; LOCATION GEGs New Locatie Set Locatie=$P(PBLine,SEP,11) Do AddToLog($C(9)_"Locatie '"_Locatie_"' controleren voor pallet '"_PalletID_"'...") New lbLocation Set lbLocation=##class(BL.MB.UGLYPicking.General).GetLocationFromScan(Locatie) If lbLocation="" Do Quit $LB(-1,"De ingescande locatie '"_Locatie_"' is niet geldig!") ;errornr -1 onbelangrijk... . Do AddToEndOfLog("ERROR.") New Result If IsNewPallet Do . Set Result=##class(BL.MB.UGLYPicking.General).CompleteLocationViaEmptyLoc(.lbLocation,PalletID) Else Do . ;Parameters meegevend aan volgende functie: . ;IsNewPallet: indien de pallet op een consolidatie-locatie staat dan zal deze worden verwijderd . ;(dit gebeurt door de laatste parameter op 1 in te stellen). Wanneer dit is gebeurd, dan zal . ;het toch een 'nieuwe' pallet worden, in tegenstelling tot wat de variabele eerst bevatte (anders . ;waren we nooit in deze 'else' lus beland) . Set Result=##class(BL.MB.UGLYPicking.General).CompleteLocationViaPalletID(.lbLocation,PalletID,.IsNewPallet,1) . Do AddToLog("CompleteLocationViaPalletID("_$$LCVT^vhLib(lbLocation)_","_$g(PalletID)_",,1) = '"_Result_"'") . Do:(IsNewPallet) AddToLog("verwijderen (consolidatie): ") New VerwijderQuery,SelectQueryInventory,AantalRecords,AantalProducten If Result = "?" { Do AddToLog("Result = '?' dus is niet goed gecreeerd inventory object.") Set SelectQueryInventory = "SELECT COUNT(1) As AantalRecords, SUM(qty_pcs) As AantalProducten FROM EWMS.Inventory where loc_id = ?" Set RS = $$ExecDynQuery^vhQUERYLIB(SelectQueryInventory,$LB(PalletID)) While RS.Next() { Set AantalRecords = RS.Data("AantalRecords") Set AantalProducten = RS.Data("AantalProducten") Do AddToLog("Voor Inventory met loc_id '"_PalletID_"' zijn gevonden : AantalProducten : "_AantalProducten_", AantalRecords : "_AantalRecords) If (AantalRecords = 1) && ((AantalProducten = 0)||(AantalProducten = "0.0") ) { Do AddToLog("Verwijder slecht gecreëerd inventory object met loc_id : "_PalletID) Set VerwijderQuery = "DELETE FROM EWMS.Inventory where loc_id = ?" Do ExecDynQuery^vhQUERYLIB(VerwijderQuery,$LB(PalletID)) Do AddToLog("U moet de buffer een tweede keer doorsturen.") } } } If Result="" Do . Do AddToEndOfLog("Ok.") Else Do Quit $LB(-1,Result) . Do AddToEndOfLog("ERROR.") ; COMMIT ADD STOCK (HistoryRemark=TLNr) New TLNr,D Set TLNr=$P(PBLine,SEP,7) Set D="\" Set Result="" If $P($G(^KPR(ProductNr,2)),D,15)'=6 Do ;GEEN WERKVLOER(=6) PRODUCT? -> STOCKEREN . Do AddToLog($C(9)_"Aanpassen van de stock...") . Set Result=##class(BL.MB.UGLYPicking.Opslag).CommitAddStock(PalletID,lbLocation,SectieToUse,ProductNr,QtyFromToelev,TLNr) . If Result="" Do .. Do AddToEndOfLog("Ok.") . Else Do .. Do AddToEndOfLog("ERROR.") Quit:(Result'="") $LB(-1,Result) ;--- T01 MESSAGE OPBOUWEN -------------------------------------------------------------------------- New bfrRGID,bfrVolgNr,bfrLijnNr,BufferLine,PTLine Do ##class(BL.MB.UGLYPicking.ReceptieProductie).DecomposeBufferKey(BufKey,.bfrRGID,.bfrVolgNr,.bfrLijnNr) Set BufferLine=##class(BL.MB.UGLYPicking.Receptie).GetBufferLijn(bfrRGID,bfrVolgNr,bfrLijnNr) New TLUNr,UserID,RCPKey Set TLUNr=$P(PBLine,SEP,8) Set PTLine=$G(@arefPT@(ProductNr,TLNr,TLUNr)) Set UserID=$P(BufferLine,SEP,7) ;Set RCPKey=##class(BL.MB.UGLYPicking.ReceptieProductie).GetNewRCPKey(TLNr,TLUNr) Set ^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeySplitsNr)=$G(^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeySplitsNr),0)+1 Set RCPKey=^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeySplitsNr) Do AddToLog($C(9)_"Buffertype '"_bfrRGID_"', VolgNr "_bfrVolgNr_", LijnNr "_bfrLijnNr_" is gekoppeld aan TLNr: "_TLNr_", TLUNr: "_TLUNr_", SplitsNr: "_RCPKey_".") New C Set C="T01" Set C("VOLGNR")="0000000000" Set C("TOENR")=TLNr Set C("TLUNR")=TLUNr Set C("SPLITSNR")=RCPKey Set C("RCPKEY")="" ;niet nodig, we definiëren het onder 'splitsnr' Set C("DELTAIN")=QtyFromToelev Set C("COMPLEET")=0 ;later houden we ons bezig met het bepalen vd echte waarde, zie SendCRecs Set C("PRNR")=ProductNr Set C("BARCODE")=$P(BufferLine,SEP,2) ;ook productscan of dossiernr genoemd Set C("PALETID")=PalletID Set C("STOCKAGEPLAATS")=##class(BL.MB.UGLYPicking.General).GetStockagePlaatsViaLocation(lbLocation) ;kan geen fouten geven wegens eerdere checks Set C("USER")=UserID Set C("DATUMSCAN")=$P(BufferLine,SEP,6) Set C("DATUMIB")=$H ;Records worden toegevoegd op einde van deze routine Do AddToLog($C(9)_"Compleet...") New Compleet If PTLine="" Do . ;overeenkomstige toeleveringslijn is verwijderd, slecht 1 vd opsplitsingen mag compleet geven... . Set Compleet=$P(PBLine,SEP,12) ;12 piece staat of deze bufferlijn de toelevering heeft verwijderd=compleet Else Do . Set Compleet=($P(PTLine,SEP,5)=-1) ;piece 5=backorder, indien -1 dan heeft de gebruiker deze expliciet afgezet Do AddToEndOfLog($S(Compleet:"Ja",1:"Nee")_".") ;--- EIGEN ONDERHOUD (BUFFER/UPRCP("R")/...) ------------------------------------------------------- Do AddToLog($C(9)_"Aanpassen buffer inhoud...") New ZeroPBLine,BufferLineIsDeleted Set ZeroPBLine=@arefPB@(ProductNr,BufKey,0) Do ##class(BL.MB.UGLYPicking.Receptie).DecBufferQtyDone(bfrRGID,bfrVolgNr,bfrLijnNr,QtyFromToelev,.BufferLineIsDeleted) If BufferLineIsDeleted Do . If ##class(BL.MB.UGLYPicking.Receptie).IsBufferEmpty(bfrRGID,bfrVolgNr) Do .. Do ##class(BL.MB.UGLYPicking.Receptie).RemoveBuffer(bfrRGID,bfrVolgNr) .. Do AddToEndOfLog("buffer verwijderd.") . Else Do .. Do AddToEndOfLog("bufferlijn verwijderd.") Else Do . Do AddToEndOfLog("Ok.") ;Old-school synchronize technology ;New RRec ;Set RRec=ProductNr_SEP_QtyFromToelev_SEP_TLNr_SEP_TLUNr_SEP_PalletID_SEP_Locatie_SEP_$H_SEP_UserID_SEP_"P"_SEP_BufKey ;Set ^UPRCP("R",TLNr,TLUNr,RCPKey)=RRec ;Toevoegen van C-records die zoëven werden opgebouwd m ^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey)=C s ^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCompleet)=($G(^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCompleet),0) || Compleet) ;eens 1, altijd 1 Quit $LB(1,"Koppeling-record succesvol opgebouwd.") ;=================================================================================================== SendCRecs() Do AddToLog("") Do AddToLog("Bezig met verwerken van synchronisatie-bericht(en)...") ; --- ^aRecProdRecsToSend doorlopen en compleet enkel '1' maken indien: --- ; * ^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey,"COMPLEET") gelijk aan één is (dwz, de lijn is compleet gekoppeld of een backorder is afgezet) ; * het moet gaan om de laatste regel, maw SplitsNr (of RCPKey) moet de laatste zijn New TLNr,TLUNr,RCPKey New ToelevCompleet Set (TLNr,TLUNr,RCPKey)="" For Set TLNr=$O(^aRecProdRecsToSend($J,TLNr)) Quit:(TLNr="") Do . For Set TLUNr=$O(^aRecProdRecsToSend($J,TLNr,TLUNr)) Quit:(TLUNr="") Do .. ;Tevens ook een test uitvoeren of akeyCRec en akeyCompleet aanwezig zijn, zoniet sluiten .. If '$D(^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCompleet)) Do Quit ... Kill ^aRecProdRecsToSend($J,TLNr,TLUNr) ... $$$WriteToLog("Killed incomplete CRec entry ('Complete' missing): TLNr="_TLNr_", TLUNr="_TLUNr) .. If '$D(^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec)) Do Quit ... Kill ^aRecProdRecsToSend($J,TLNr,TLUNr) ... $$$WriteToLog("Killed incomplete CRec entry ('CRec' missing): TLNr="_TLNr_", TLUNr="_TLUNr) .. Set ToelevCompleet=^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCompleet) .. Quit:('ToelevCompleet) ;indien 0, dan zijn de C-Recs van deze toelevlijn ook al 0 en dan moet er niks wo gedaan .. Set RCPKey=$O(^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey),-1) ;laatste c-rec van toelevlijn opvragen .. Set ^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey,"COMPLEET")=1 ;deze is compleet .. For Set RCPKey=$O(^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey)) Quit:(RCPKey="") Do ... Set ^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey,"COMPLEET")=0 ;de rest is 'not complete' natuurlijk $$$WriteToLog("Voorbereiding C-recs voltooid...") ; --- C-Recs verwerken (zou in vorige lus kunnen komen) --- New C,ProcessErrorStr Set ProcessErrorStr="" Set (TLNr,TLUNr,RCPKey)="" /// JBL : TO DO : checken of TLNR in gebruik is. For Set TLNr=$O(^aRecProdRecsToSend($J,TLNr)) Quit:((TLNr="") || (ProcessErrorStr'="")) Do . For Set TLUNr=$O(^aRecProdRecsToSend($J,TLNr,TLUNr)) Quit:((TLUNr="") || (ProcessErrorStr'="")) Do .. For Set RCPKey=$O(^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey)) Quit:((RCPKey="") || (ProcessErrorStr'="")) Do ... m C=^aRecProdRecsToSend($J,TLNr,TLUNr,$$$akeyCRec,RCPKey) ... $$$WriteToLog("Processing C-rec TLNr: "_TLNr_", TLUNr: "_TLUNr_", RCPKey:"_RCPKey_", Type: "_$G(C,"unknown")) ... Set ProcessErrorStr=##class(BL.MB.UGLYPicking.General).ProcessCRec(.C) If ProcessErrorStr="" Do . Kill ^aRecProdRecsToSend($J) . Do AddToEndOfLog("Ok.") Else Do Quit $LB(-1,ProcessErrorStr) . $$$WriteToLogEx("Process error: "_ProcessErrorStr,$$$clRed) . Do AddToEndOfLog("ERROR.") Quit $LB(1,"C-records succesvol verwerkt.") ;=================================================================================================== ; Lock alle referenties van de doorgegeven toeleveringslijnen ; toeleveringen, producten, orders... UPRCPLock(ToLock) New Rec,TOENr,TLUNr,TLNr,LEVNr,PRNr,KLNr,ORDNr,LockOk,LockNOk,LockRef,HFCode,HFPRNr,D Set TOENr="" Set D="\" For Set TOENr=$O(ToLock(TOENr)) Quit:TOENr="" Do . Set LEVNr=$P(^KTO1(TOENr),D) . Do LOCK("^KTO("_LEVNr_","_TOENr_")",.LockOk,.LockNOk) . Set TLUNr="" . For Set TLUNr=$O(ToLock(TOENr,TLUNr)) Quit:TLUNr="" Do . . Set TLNr=^TO("IU",TOENr,TLUNr) . . Set Rec=^KTO(LEVNr,TOENr,TLNr),PRNr=$P(Rec,D,2),ORDNr=$P(Rec,D,27) . . Do:PRNr . . . Do LOCK("^KPR("_PRNr_")",.LockOk,.LockNOk),LOCK("^KSPW("_PRNr_")",.LockOk,.LockNOk) . . . Do LOCK("^PRSTOCK(""D"","_PRNr_")",.LockOk,.LockNOk) . . . If '$$ISHALUX^PRODUKT2(PRNr),'$$ISNV^PRODUKT2(PRNr) Quit . . . Set HFCode="" . . . For Set HFCode=$O(^PRBS("BS",PRNr,HFCode)) Quit:HFCode="" Do . . . . Set Rec=^PRBS("BS",PRNr,HFCode),HFPRNr=$P(Rec,D) . . . . Quit:$P(Rec,D,3)'="H" ; Geen halffabrikaat . . . . Quit:'HFPRNr Quit:'$D(^KPR(HFPRNr)) . . . . Do LOCK("^KPR("_HFPRNr_")",.LockOk,.LockNOk),LOCK("^PRSTOCK(""D"","_HFPRNr_")",.LockOk,.LockNOk) . . Quit:'ORDNr . . Set KLNr=$P(^KO1(ORDNr,"F"),D) . . Do LOCK("^KOD("_KLNr_",""F"","_ORDNr_")",.LockOk,.LockNOk) Set LockOk="LockOk" For Set LockOk=$Q(@LockOk) Quit:LockOk="" Set LockRef=@LockOk,ToLock("L",LockRef)="" If $D(LockNOk) Do ; Niet alle referenties konden gelockt worden, dus vrijgave van alle gelockte . Do UPRCPUnLock(.ToLock) . Kill ToLock("L") . ; Bepalen van het antwoord . If $D(LockNOk("KTO")) Do . . Set LEVNr=$O(LockNOk("KTO","")),TOENr=$O(LockNOk("KTO",LEVNr,"")) . . Set LockNOk="Toelevering "_TOENr_" van "_$P(^KLE(^KL1(LEVNr),0),D,2) . Else If $D(LockNOk("KPR")) Do . . Set PRNr=$O(LockNOk("KPR","")),LockNOk="Product """_$P(^KPR(PRNr,0),D)_"""" . Else If $D(LockNOk("PRSTOCK")) Do . . Set PRNr=$O(LockNOk("PRSTOCK","D","")),LockNOk="Stock van product """_$P(^KPR(PRNr,0),D)_"""" . Else If $D(LockNOk("KOD")) Do . . Set KLNr=$O(LockNOk("KOD","")),ORDNr=$O(LockNOk("KOD",KLNr,"F","")) . . Set LockNOk="Order "_ORDNr_" van "_$P(^KKL(^KK1(KLNr),0),D,2) . Else If $D(LockNOk("KSPW")) Do . . Set PRNr=$O(LockNOk("KSPW","")),LockNOk="Weekstatistiek van product """_$P(^KPR(PRNr,0),D)_"""" . Else Set LockNOk="Bepaalde referenties zijn" . Set LockNOk=LockNOk_" in gebruik." Quit $G(LockNOk) ; Lock een referentie LOCK(LockRef,LockOk,LockNOk) New %TC,Index Set Index=""""_$P($P(LockRef,"("),"^",2)_""","_$P($P(LockRef,"(",2),")") If '$D(@("LockOk("_Index_")")),'$D(@("LockNOk("_Index_")")) Do . Do ADD^vhLock(LockRef) . If %TC Set @("LockOk("_Index_")")=LockRef . Else Set @("LockNOk("_Index_")")=LockRef Quit ; Vrijgave van alle doorgegeven, gelockte referenties UPRCPUnLock(ToLock) New LockRef Set LockRef="" For Set LockRef=$O(ToLock("L",LockRef)) Quit:LockRef="" Do REMOVE^vhLock(LockRef) Quit AddToLog(Msg) If $E(Msg)=$C(9) Do . $$$WriteToLog($E(Msg,2,9999)) //Bij schrijven naar log, tab teken negeren Else Do . $$$WriteToLog(Msg) Quit:(makovaStrings=0) Do makovaStrings.Add(Msg) Do MApplication.ProcessMessages() Quit AddToEndOfLog(Msg) $$$WriteToEndOfLog(Msg) Quit:(makovaStrings=0) New RegelNr Set RegelNr=makovaStrings.Count-1 Do makovaStrings.SetStrings(RegelNr,makovaStrings.GetStrings(RegelNr)_Msg) Do MApplication.ProcessMessages() Quit ]]> 1 ProductNr:%Library.String,TLNr:%Library.String,TLUNr:%Library.String,Value:%Library.String cache 0 document literal 1 ProductNr:%Library.String cache 0 document literal 1 ProductNr:%Library.String,TLNr:%Library.String,QtyRequest:%Library.String cache 0 %Library.List document literal 1 cache 0 %Library.Boolean document literal 1 cache 0 document literal 1 TLNr:%Library.String,exclProductNr:%Library.String="" cache 0 %Library.List document literal 1 ProductNr:%Library.String cache 0 document literal 1 cache 0 %Library.List document literal Laag omwille van mogelijke delete van een item uit de list . Set lbBuffer=$LI(BufferList,Loop) . Set RGID=$LI(lbBuffer,1) . Set VolgNr=$LI(lbBuffer,2) . If '$D(^UPRCP("B",RGID,VolgNr)) Do Quit .. Set RemovedBuffers=RemovedBuffers_$C(13,10)_"- Type '"_RGID_"', volgnummer "_VolgNr_"." .. Set BufferList=$$$LBDeleteAt(BufferList,Loop) . For Set LijnNr=$O(^UPRCP("B",RGID,VolgNr,LijnNr)) Quit:(LijnNr="") Do .. Set BufferLijn=^UPRCP("B",RGID,VolgNr,LijnNr) .. Set ProductNr=$P(BufferLijn,SEP,1) .. Set PalletID=$P(BufferLijn,SEP,3) .. Set LocatieID=$P(BufferLijn,SEP,4) .. Set BufferKey=##class(BL.MB.UGLYPicking.ReceptieProductie).BuildBufferKey(RGID,VolgNr,LijnNr) ;Concatenatie vd 3 para's .. Set QtyRequest=$P(BufferLijn,SEP,5) .. Set AssocToelev=$P(BufferLijn,SEP,8) .. ;aPB(ProdNr,BufferKey,VolgNr)=QtyRequest+QtyReserved+... met eerste maal VolgNr=0 .. Set PBLine=BufferKey_SEP_0_SEP_ProductNr_SEP_PalletID_SEP_QtyRequest .. Set PBLine=PBLine_SEP_-1_SEP_-1_SEP_-1_SEP_0_SEP_0_SEP_LocatieID_SEP_0_SEP_AssocToelev .. Set @arefPB@(ProductNr,BufferKey,0)=PBLine Do ##class(BL.MB.UGLYPicking.ReceptieProductie).aBuildSortedBufferArray() Quit:(RemovedBuffers'="") $LB(2,"Volgende buffer(s) zijn ondertussen verwijderd:"_$C(13,10)_RemovedBuffers) Quit $LB(1,"Buffers gesorteerd op product succesvol in array geplaatst.") ]]> 1 ProductNr:%Library.String cache 0 %Library.List document literal ERROR ... Set ToelevRecsNotFound=ToelevRecsNotFound_$C(13,10)_"- Leveranciernummer "_LeverancierNr_", toeleveringsnummer "_TLNr_" (TLUNr:"_TLUNr_")." .. Set TLLNr=^TO("IP",ProdNr,TLNr,TLUNr) .. Set QtyRequest=##class(BL.MB.UGLYPicking.Receptie).FGetToeleveringsQty(TLNr,TLLNr) .. If QtyRequest=-1 Do Quit ; => ERROR ... Set ToelevQtysNotFound=ToelevQtysNotFound_$C(13,10)_"- Toeleveringsnummer "_TLNr_", lijnnummer "_TLLNr_"." .. Set KlantNr=$P(^KTO(LeverancierNr,TLNr,1),SEP,8) .. Set LeveringsWeek=$P(^KTO(LeverancierNr,TLNr,TLLNr),SEP,25) .. ;QtyRequest+QtyReserved+KlantNr+LeveringsWeek+Backorder .. Set @arefPT@(ProdNr,TLNr,TLUNr)=QtyRequest_SEP_0_SEP_KlantNr_SEP_LeveringsWeek_SEP_0 Quit ]]> 1 UseThisProdNr:%Library.String cache 0 %Library.Integer document literal