Production Process Steering - Tandembox Genereert van een Toelevering de verpakkingsdefinitie serial Prod.Product,BL.PPS.OL,BL.Prod.OptiBox,BL.Sys.Toegang,BL.Sys.Proxy,BL.Derde.KlantSpecifiek,vhLib.Macro 1 %SerialObject Cutting simulatie 0 \ %String "VH" Definities voor de labelprinter Parameter LabelPrinter1 = "\\FOP_disabled\OL Verpak2 6x10"; Parameter LabelPrinter2 = "\\FOP_disabled\OL Verpak2 6x10"; Parameter LabelPrinter1 = "OrgaluxColor"; ORGALUX1 KLEUR ORGALUX2 KLEUR \\FOP_disabled\OL Verpak3 6x10 TAORIndeling OLDoos TAORIndelingDoos OLProduct TAORIndelingProduct Waarde 1, 2, 3, TAOR, dient bij initialisatie ingevuld te worden. Voor welke inpaktafel de output bedoeld is %String "1" %Integer %String %Integer %String %XML.DataSet Persistent storage bestaat uit 4 delen: 1) type "O" (Overdoos), "OE" (Overdoos Einde), "P" (product) 2) SnijId 3) ProductSequence 4) Abrev (Pos 4-11 van de KortTekst) %String list BL.PPS.OL.Inpak.MultiCountBepaler 1 1 TECH.String 1 DOM.PM.ProductTypeAPI 1 1 DOM.VKP.VerkoopAPI 1 1 DOM.VKP.impl.BonTypeAPI 1 1 %String 1 %String 1 %String 1 %String Open : Initialiseren van object (properties + ophalen sequentie) BONNr:%String,InpakTafelNr:%String=1 BL.Sys.Proxy.pxStatus 1 #dim OverdoosID As %String = $LI(lbOverdozen,1) #dim lbProducten As %List = ..GetProducten(OverdoosID) Quit:lbProducten="" Quit:$LL(lbProducten)>Max #dim SnijDataID As %String = $LI(lbProducten,1) #dim Status As BL.Sys.Proxy.pxStatus = ..BlokkeerVerpakking(OverdoosID) ]]> GetBONOverview : XmlDataset opbouwen met info alle te verpakken BONNr's BL.Sys.Proxy.pxStatus List : XmlDataset opbouwen met info alle te verpakken dozen BL.Sys.Proxy.pxStatus 0) of achterwaarts (pDir<0) De nodige snij- en (etiket)print-opdrachten worden verstuurd]]> BL.Sys.Proxy.pxStatus 0)&&(..CurID >= ..SequenceList.Count())) $$$pxStatusErrorEx("Kan pointer niet verder voorwaarts verplaatsen", "..CurID="_..CurID_" ..SequenceList.Count()="_..SequenceList.Count()_" Dir="_pDir) Quit:((pDir<1)&&(..CurID <= 1)) $$$pxStatusErrorEx("Kan pointer niet verder achterwaarts verplaatsen", "..CurID="_..CurID_" Dir="_pDir) // pointer incrementeren (of decrementeren) Set ..CurID=$S(pDir>0:..CurID+1,1:..CurID-1) // we hebben een valid item, meer info opvragen en de juiste snijopdracht uitvoeren #dim SnijItem As %List =..SequenceList.GetAt(..CurID) Set pxInpakInfo = ##class(BL.PPS.OL.pxInpakInfo).%New() #dim pxStatus As %Status = ..GetInfo(SnijItem, .pxInpakInfo,..CurID) Quit:($$$pxStatusIsERR(pxStatus)) pxStatus Do ..BepaalOutput(pxInpakInfo.PRNr) // Snijopdrachten : // - Een overdoos moet gesneden worden, er mag dan onmiddellijk verdergegaan worden tot het eerste item // van die doos, die mag ook gesneden worden // - Een product mag gesneden worden (als minstens 1 item is waarbij HasSnijDef=true If ($LI(SnijItem,$$$lbPosType) = "O") { Do ..PrintAllEtiket() Do ..PrintAlleEtikettenOpnieuwIndienNodigOpOverdoosVoorKlant( pxInpakInfo ) Set pxInpakInfo.Status = $$$StatusStartOverdoos Set pxStatus = ..SnijOverdoosStart($LI(SnijItem,$$$lbPosSnijId)) Set:$$$pxStatusIsOK(pxStatus) pxStatus = ..Next(pDir, .pxInpakInfo) } ElseIf ($LI(SnijItem,$$$lbPosType) = "OE") { Set pxInpakInfo.Status = $S((..CurID=..SequenceList.Count()):$$$StatusEindeBon,1:$$$StatusEindeOverdoos) Set pxStatus = ..SnijOverdoosEnd($LI(SnijItem,$$$lbPosSnijId)) do:$$$pxStatusIsOK(pxStatus) ..PrintOverdoos(pxInpakInfo, 1, 0) Do:pxInpakInfo.Status=$$$StatusEindeBon %blProdOptiBoxSnijden.StatusAllFinished("L",..BONNr) } ElseIf ($LI(SnijItem,$$$lbPosType) = "P") { Set pxInpakInfo.Status = $$$StatusProduct If 'pxInpakInfo.VoorVerpakt { Set pxStatus = ..SnijProduct($LI(SnijItem,$$$lbPosSnijId)) #dim LabelPrinter As BL.Sys.LabelPrinter = ##class(BL.Sys.LabelPrinter).Instantiate() do:$$$pxStatusIsOK(pxStatus) ..PrintProduct(LabelPrinter, pxInpakInfo, 0) Do ..PrintEnResetLabelPrinter(.LabelPrinter) } } #dim xmlst As %Status = pxInpakInfo.XMLExportToString(.xmlOut,,"literal,indent") #dim xmlOut As %String = $Extract(xmlOut,0,32000) // Voorkomen dat we over de maximum length van een String gaan. Quit:($$$pxStatusIsERR(pxStatus)) pxStatus Quit pxStatus ]]> pxInpakInfo:BL.PPS.OL.pxInpakInfo Refresh : meest actuele data ophalen van current element BL.Sys.Proxy.pxStatus BL.Sys.Proxy.pxStatus HersnijDoos : Snijopdracht versturen voor actuele productlijn todo : nog verder afwerken pxInpakRedo:BL.PPS.OL.pxInpakRedo BL.Sys.Proxy.pxStatus 0 do . . Set lbSnijIDs = lbSnijIDs_$LB($LB(pxInpakRedo.Detail.GetAt(i).SnijID, +pxInpakRedo.Detail.GetAt(i).AantalRedo)) Do %blProdOptiBoxSnijden.SnijReDo(..SnijMachineID, lbSnijIDs, 9, 1) Quit $$$pxStatusOK ]]> HersnijNieuweDoos : Doos hersnijden volgens zijn nieuwe definitie pxInpakRedo:BL.PPS.OL.pxInpakRedo BL.Sys.Proxy.pxStatus 0)) do . . Do ##class(BL.PPS.OL.OptiBox).SnijBoxDirect(SnijData.PRNr, +pxInpakRedo.Detail.GetAt(i).AantalRedo, ..SnijMachineID) Quit $$$pxStatusOK ]]> HerDrukEtiket : Een nieuwe PrintOpdracht voor etiketten maken Ofwel is snijID ingevuld, dan herprinten we betreffend etiket Ofwel is er niets ingevuld, en herprinten we etiket van de Current Id pSnijID:%String,pPRNr:%String BL.Sys.Proxy.pxStatus 1 BlokkeerVerpakking : Status van een doos op "Finished" forceren, zodat de doos niet zal gesneden worden pSnijID:%String BL.Sys.Proxy.pxStatus StartBerekening : Optimalisatieberekening opstarten voor een Bon pBONNr:%String BL.Sys.Proxy.pxStatus GetInfo : Alle info van een product ophalen en in een structuur steken die door de WS en zijn clients kan begrepen worden Remark : woordje uitleg bij de velden : - ProdQty ($$$snProductAantal) = aantal producten dan in 1 doos moet verpakt worden - QtyRequired ($$$snAantalGevraagd) = Het aantal kartons dat moet versneden worden (berekend door optimizer) - QtyRequested ($$$snAantalQueued) = Het aantal snijopdrachten dat naar snijmachine gestuurd is - QtyFinished ($$$snAantalFinished) = Het aantal afgewerkte snijopdrachten 1 BL.Sys.Proxy.pxStatus ", 1) Set ProductInfo.LangTekst=ProductInfo.LangTekst_"
"_"Onderdelen:"_"
"_..BouwStenenTekst(ProductInfo.PRNr,"
"," : ") ;"" Set ProductInfo.LangTekst=ProductInfo.LangTekst_"

Afmeting nu te stapelen:
"_..GeefAfmetingInfo(MasterSnijData) Set ProductInfo.Image=..GeefProductAfbeelding(($LG(Prd,1)),##class(APPS.common.enu.Toepassing).Flex()) Set ProductInfo.Aantal = $LG(Prd,2) do pxInpakInfo.ProductInfo.Insert(ProductInfo) } Set pxInpakInfo.KlantNaam = ..KlantNaam Set pxInpakInfo.BONNr = ..BONNr Set pxInpakInfo.PRNr = $LG(arInfo,$$$snPRNr) Set pxInpakInfo.ProductSequence = SnijItemProductSequence Set pxInpakInfo.AantalProducten = $LG(arInfo,$$$snProductAantal) Set pxInpakInfo.AantalDozen = $LG(arInfo,$$$snAantalGevraagd) Set ProductSnijData = ##class(DS.Prod.OptiBox.SnijData).%OpenId(SnijItemId) If ((##class(TECH.StringUtils).Contains(ProductSnijData.BoxImage, ##class(TECH.Config.ConfigMgr).Instance().GetString("APPS.Verpakking.OrgaluxBonOptimizer.ImageURL"))) || (##class(TECH.StringUtils).Contains(ProductSnijData.StapelImage, ##class(TECH.Config.ConfigMgr).Instance().GetString("APPS.Verpakking.OrgaluxBonOptimizer.ImageURL")))) { Set pxInpakInfo.BoxImage = ProductSnijData.BoxImage Set pxInpakInfo.StapelImage = ProductSnijData.StapelImage } Else { Set pxInpakInfo.BoxImage = %blProdOptiBoxSnijden.GetPathAndFile($$$URL(ProductSnijData.BoxImage),"FLEX") Set pxInpakInfo.StapelImage = %blProdOptiBoxSnijden.GetPathAndFile(ProductSnijData.StapelImage,"FLEX") } //Alle elementen uit arInfo in de px steken // product is voorverpakt, tenzij er een item bij is waarvoor een doos moet gesneden worden Set pxInpakInfo.VoorVerpakt = 1 #dim SnijID As %String = "" For set SnijID=$Order(arInfo(SnijID)) quit:SnijID="" do . Set dtl = ##class(BL.PPS.OL.pxInpakInfoDtl).%New() . Set dtl.SnijID = SnijID . Set dtl.BoxUsage = $LI(arInfo(SnijID),$$$snLabel) . Set dtl.AantalGevraagd = $LI(arInfo(SnijID),$$$snAantalGevraagd) . Set dtl.AantalAf = $LI(arInfo(SnijID),$$$snProductAantal) . if $LI(arInfo(SnijID),$$$snHasSnijDef) do . . Set pxInpakInfo.VoorVerpakt = 0 . . do pxInpakInfo.Detail.Insert(dtl) Set pxInpakInfo.AantalIdentiekeProducten = 1 if (SequenceID > 0) do . Set pxInpakInfo.AbrevCurrent = $LG(..SequenceList.GetAt(SequenceID),$$$lbPosAbrev) . Set:SequenceID>1 pxInpakInfo.AbrevPrevious = $LG(..SequenceList.GetAt(SequenceID-1),$$$lbPosAbrev) . Set:SequenceID<..SequenceList.Count() pxInpakInfo.AbrevNext = $LG(..SequenceList.GetAt(SequenceID+1),$$$lbPosAbrev) . if (pxInpakInfo.AbrevCurrent'="") do . . Set pxInpakInfo.AantalIdentiekeProducten = 0 . . For i=1:1:..SequenceList.Count() do . . . Set:($LG(..SequenceList.GetAt(i),$$$lbPosAbrev)=$LG(..SequenceList.GetAt(SequenceID),$$$lbPosAbrev)) pxInpakInfo.AantalIdentiekeProducten = pxInpakInfo.AantalIdentiekeProducten + 1 Quit $$$pxStatusOK ]]>
SnijData:DS.Prod.OptiBox.SnijData 1 %String PRNr:%String,LijnSep:%String,KolomSep:%String 1 "_Txt_"" ]]> GetKortTekstFromSnijID : KortTekst van het product ophalen adhv snijID SnijItemID:%String 1 %String Ophalen van de overdozen lijst uit de optimalisatie 1 %List OverdoosID:%String 1 SnijID:%String 1 BL.Sys.Proxy.pxStatus SnijID:%String 1 BL.Sys.Proxy.pxStatus SnijID:%String 1 BL.Sys.Proxy.pxStatus Bij opstarten van de leveringsbon worden all etiketten eerst gedrukt Dit omdat de kleuren labelprinter veel trager is dan een zwartwit labelprinter Forced:%Boolean 1 1) && ModuloFrequentieOpAantalMultiCount = 0) ){ Do ..PrintProduct(LabelPrinter,pxInpakInfo,$G(Forced)) } Do:('isVerzameldoos) GeprinteProducten.Verhoog(pxInpakInfo.PRNr) } } Do ..PrintEnResetLabelPrinter(.LabelPrinter) Set ..CurID = MemID ; terugzetten ]]> 1 %Boolean 1 Etiket printen voor overdoos pxInpakInfo:BL.PPS.OL.pxInpakInfo,Aantal:%Integer,Forced:%Boolean 1 Etiket(ten) printen voor inhoud van 1 doos ofwel (meestal) : 1 etiket voor 1 product ofwel (Antislipmatten) : 1 etiket per product in de doos LabelPrinter:BL.Sys.LabelPrinter,pxInpakInfo:BL.PPS.OL.pxInpakInfo,Forced:%Boolean 1 Etiket printen voor overdoos zonder bijkomende controle BONNr:%String,Aantal:%Integer Etiket(ten) printen voor 1 product zonder bijkomende controle)[ Private ] Set bl=##class(BL.PPS.OL.Inpak).%New() Set bl.Output=3 For I=1:1:15 D bl.PrintProductBare(371065,379831,1) BonID:%String,ProductID:%String,Aantal:%Integer=1 BonID:%String,ProductID:%String,Aantal:%Integer 1 BL.Sys.LabelPrinter LabelPrinter:BL.Sys.LabelPrinter,BonID:%String,ProductID:%String,Aantal:%Integer 1 BL.Sys.LabelPrinter BonID:%String,ProductID:%String,Aantal:%Integer 1 %ListOfObjects ELEMENTTYPE="BL.Sys.pxLabel" 1 { #dim Step As %Integer For Step=1:1:MultiCount { Set pxLabel.MultiDeel = Step_"/"_MultiCount Do pxLabels.Insert(pxLabel.%ConstructClone()) } }Else{ Do pxLabels.Insert(pxLabel.%ConstructClone()) } Quit pxLabels ]]> ProductID:TECH.String 1 BonID:%String,ProductID:%String,Aantal:%Integer 1 BL.Sys.pxLabel 1 Set pxLabel.MultiDeel="x"_Aantal, pxLabel.Aantal=1 Set pxLabel.Device=..LabelDev() If ..ProductTypeAPI.IsTAORIndelingProduct(ProductID) { Set pxLabel.Layout = ..#LabelProductTAORIndeling }Else{ Set pxLabel.Layout = ..#LabelProductOrgalux } Set pxLabel.Layout = pxLabel.Layout_##class(BL.Sys.LabelPrinter).PrinterLabelSize(pxLabel.Device) Quit pxLabel ]]> PRNr:%String,pxLabel:BL.Sys.pxLabel 1 Emum : "BARTENDER","FLEX" ]]> ProductID:%String,Toepassing:APPS.common.enu.Toepassing 1 IsTAORIndeling:%Boolean,BONNr:%String 1 TECH.String 1 LabelPrinter is afhankelijk van de werkpost bepaalt door property Output 1 *************************************************************************** ListQuery %Query 1 0 %Status 1 ListQueryExecute %Status 1 ListQueryExecute %Status *************************************************************************** StapelImagesQuery %Query 1 0 %Status 1 StapelImagesQueryExecute %Status 1 StapelImagesQueryExecute %Status Zie ook de gelijknamigee method (niet de query) "GetBONOverview" (N.B. Studio toont enkel de query via Ctrl+G)! %Query 1 0 %Status 1 GetBONOverviewExecute %Status 1 GetBONOverviewExecute %Status 1 BONNr:%String D,Q,U 1 Datum:%Date,DueTime:%String,Cnt:%Integer %Boolean 1 BL.Sys.Proxy.pxStatus 1 BONNr:%String %String w ##class(BL.PPS.OL.Inpak).GetBonStatus(303276) 1 BONNr:%String %String geen status // 2. als er min. 1 Error is, is heel de bon in Error --> E // 3. als alle rijen Finnished of Volume of Blocked zijn, is heel de bon Finished --> F // 4. Als sommige rijen Finnished of Queued zijn is de bon partieel verwerkt --> P // 5. Anders is ie wachtend --> W if TerugName Do . Set retval="-" else if Cnt = 0 do . Set retval = " " else if ($Get(arrCntST($$$ssError),0) > 0) do . Set retval=$$$ssError else if (($Get(arrCntST($$$ssFinished),0) + $Get(arrCntST($$$ssVolume),0) + $Get(arrCntST($$$ssBlocked),0)) = Cnt),$Get(arrCntST($$$ssFinished),0) Do . Set retval=$$$ssFinished else if (BonProdCnt'=SnijProdCnt) do . Set retval=$$$ssMissing else if (($Get(arrCntST($$$ssFinished),0) > 0) || ($Get(arrCntST($$$ssQueued),0) > 0) ) do . Set retval=$$$ssPartieel else do . Set retval=$$$ssWachtend quit retval ]]> 1 SessionID:%String Ophalen van de werkvolgorde : Overdoos 1 Product 1.1 Product 1.2 Overdoos 2 Product 2.1 Product 2.2 met extra informatie als product, aantal, afgewerkt aantal, status parameter : InclFinished ook de reeds afgewerkte opnemen InclVolume ook de Volume (voor verpakte dozen) moeten opgenomen worden %Query InclFinished:%Boolean,InclVolume:%Boolean Als de gebruiker op Prev/Next klikt moet de vorige/volgende taak opgehaald worden en de proxy klasse ingevuld met de taakinformatie In de persistent storage wordt de taaksequence opgeslagen. Key:%String,Dir:%String %RegisteredObject %Library.CacheSerialState InpakState ^BL.PPS.OL.InpakS "BL.PPS.OL.Inpak" BONNr Count CurID ListResult SequenceList KlantNaam SnijMachineID Output BonTypeAPI InpakTafelNr