Verwerking van de optimisatie van een doos.
De metadefinitie definieert de BoxSelect van de Optimizer en geeft defaults voor de BoxData
BL.Prod.OptiBox,vhLib.Macro
1
%RegisteredObject
%String
192.168.200.6
%Integer
8888
%Boolean
0
WS.Prod.PanOpti.q1.CUTREQ
%String
1
%Boolean
%String
TECH.Process.ProcessAPI
1
%String
1
%Status
D ##class(BL.Prod.OptiBox.Optimize).GetStatus()
1
ID
%SQLQuery
PPSGroep,PPSSubgroep,ObjType,ObjRef,ObjLijnRef,ParentID
Select DISTINCT BoxDeelVan
from Prod.OptiBox_SnijData
where PPSGroep=:PPSGroep and PPSSubgroep=:PPSSubgroep and ObjType=:ObjType and ObjRef=:ObjRef
and ((:ObjLijnRef is null) OR ((:ObjLijnRef is not null) and (ObjLijnRef=:ObjLijnRef)))
and ((:ParentID is null) OR ((:ParentID is not null) and (Parent=:ParentID)))
order by to_number(Sequentie),%ID
PPSGroep,PPSSubgroep,ObjType,ObjRef,ObjLijnRef,ParentID
%List
%SQLQuery
ObjType,ObjRef,ObjLijnRef,ParentID
Select %ID as ID
from Prod.OptiBox_SnijData
where ObjType=:ObjType and ObjRef=:ObjRef
and ((:ObjLijnRef is null) OR ((:ObjLijnRef is not null) and (ObjLijnRef=:ObjLijnRef)))
and ((:ParentID is null) OR ((:ParentID is not null) and (Parent=:ParentID)))
order by to_number(Sequentie),%ID
Ophalen van de master snijdata, deze wordt steeds gebruikt als referentie voor de ganse blok.
SnijID:%Integer
DS.Prod.OptiBox.SnijData
In sommige dozen worden meerdere producten gestoken bv. verschillende afm. van matjes worden verpakt in één doos
Dit geeft de lijst met producten en hun aantallen in een list
$LB($LB(Product,Aantal),...)
arResult is optioneel voor format zie GetInfo. Indien niet meegegeven dan wordt deze berekend.
%List
arResult=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, , , 7:QtyRequired)
arResult(SnijId)=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, 4:HeeftSnijDef, 5:Usage, 6:PPSPrioriteit, 7:QtyRequired, 8:QtyRequested, 9:QtyFinished)
arResult(SnijId,SnijId)=Object SnijData ; Clone
==========================================================================================================================
QUERY: QGetAllInfo .
==========================================================================================================================
%Query
paObjType:%String,paObjRef:%String
--------------------------------------------------------------------------------------------------------------------------
1
0
%Status
1
QGetAllInfoExecute
0
%Status
1
QGetAllInfoExecute
0
%Status
==========================================================================================================================
Vertrekken van de master snijdata wordt de ganse sub structuur opgehaald.
Param oMasterSnijData is het master object, als het geen object is wordt eerst GetMaster uitgevoerd
MaxRecurse : Aantal niveaus dat subdozen mogen opgehaald worden, 0 is geen, 1 is een niveau dieper, 99 is alle nivos
ParentQty moet niet ingevuld worden, is nodig voor recursie
de arResult moet door de oproepende gekilled worden
arResult=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, , , 7:QtyRequired)
arResult(SnijId)=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, 4:HeeftSnijDef, 5:Usage, 6:PPSPrioriteit, 7:QtyRequired, 8:QtyRequested, 9:QtyFinished)
arResult(SnijId,SnijId)=Object SnijData ; Clone
1
0
If List="" Do
. Set $LI(List,$$$snPRNr)=oSnijData.PRNr
. Set $LI(List,$$$snProductRef)=oSnijData.ProductRef
. Set $LI(List,$$$snProductAantal)=oSnijData.ProductAantal
. Set $LI(List,$$$snHasSnijDef)=HasSnijDef
. Set $LI(List,$$$snBoxUsage)=$S(HasSnijDef:oSnijData.BoxUsage,1:"")
. Set $LI(List,$$$snLabel)=..Label(oSnijData)
. Set $LI(List,$$$snPPSPrioriteit)=$S(HasSnijDef:$S(oSnijData.PPSPrioriteit:oSnijData.PPSPrioriteit,1:1),1:"")
Set $LI(List,$$$snAantalGevraagd)=$LG(List,$$$snAantalGevraagd)+(oSnijData.Aantal*ParentQty)
If HasSnijDef Do
. Set arResult(MasterID,oSnijData.%Id())=oSnijData ; onderdelen alleen als er snijdefinities zijn
. Set:oSnijData.Status="Q" $LI(List,$$$snAantalQueued)=$LG(List,$$$snAantalQueued)+oSnijData.Aantal
. Set:oSnijData.Status="F" $LI(List,$$$snAantalFinished)=$LG(List,$$$snAantalFinished)+oSnijData.Aantal
Set arResult(MasterID)=List
]]>
Geeft een label - moet nog defitig uitgewerkt worden met opzoek tabellen
oSnijData
w ##class(BL.Prod.OptiBox.Snijden).GetPathAndFile("70123_L.386400.1236470_default_01_06.JPG","FLEX")
1
File:%String,Type:%String
pxSnijRes:BL.Prod.OptiBox.sub.pxSnijResult
1 Do ; Callback
. . . Do $zobjclassmethod($LI(CallBack), $LI(CallBack,2) ,ObjType, ObjRef, $LG(CallBack,3), SnijDataID, $$$qtSnijden, SnijStatus, "") ; Finished, no message
. . Else
. . Set oHist=..OptiBoxHistoriek(pxSnijRes,oQ.SnijData)
. . Do ..ProductHistoriek(oHist)
. Else Do ; No queue data, zou niet mogen voorkomen maar we gaan wel de voorraad aanpassen.
. . Set oHist=..OptiBoxHistoriek(pxSnijRes)
. . Do ..ProductHistoriek(oHist)
&sql(CLOSE ProcessSnijResult)
]]>
SnijDataID,NewStatus,MarkDeelVan,MarkParent
D ##class(BL.Prod.OptiBox.Snijden).%New().StatusAllFinished("L",309692)
ObjType,ObjRef
1
SnijDataID
BL.Sys.Proxy.pxStatus
1
SnijDataID
%Boolean
Later nodig voor optimalisatie carton breedte
pxSnijRes,oSnijData
oHist
0
1
Simulate,DebugInfo
1
ObjType,ObjRef
SnijMachineID,Prioriteit,CallBack:%List
%String
wordt opgevangen worden door een errortrap !
. $$$LastLogUpdate("E",,,,,"NO STATUS",,)
Quit $G(Status)
]]>
SnijID
Snijden van alle SnijData opgenomen in de array
Opbouw parameter arSnijRefs
arSnijRef(VolgNr) = $LB(oSnijData of SnijID, ...)
SnijMachineID,Prioriteit,arSnijRefs,CallBack:%List
Snijden van alle SnijData opgenomen in de array
Opbouw parameter arSnijRefs
arSnijRef(VolgNr) = $LB(oSnijData of SnijID, ...)
SnijMachineID,Prioriteit,arSnijRefs,CallBack:%List
Hersnijden van een of meerdeze SnijData
parameter
SnijMachineID : VH of HALUX
lbSnijIDs : format $LB($LB(SnijID,Qty), ...) waarbij SnijID ook een objectreferentie mag zijn
Prioriteit : 1..9
PPSOutput : 0 = rechtdoor, 1 = rechts, 2 = links
HasSnijDef : returnvalue, is true als er snijopdrachten in de wachtrij zijn geplaatst
WS.Prod.PanOpti.q1.STATUSRES
1
SnijOpdrachten:%ArrayOfDataTypes,Prioriteit:%String,PPSOutput:%String,MachineID:%String,CallBack:%List
BL.Sys.Proxy.pxStatus
$lb
Set SnijID=""
Set lbSnijOpdracht=""
For Set Qty=SnijOpdrachten.GetNext(.SnijID) Quit:(SnijID="") Do
. Set lbSnijOpdracht=lbSnijOpdracht_$LB($LB(SnijID,Qty))
Set PanStatus=%blProdOptiBoxSnijden.SnijReDo(MachineID,lbSnijOpdracht,Prioriteit,PPSOutput, .CallBack)
Quit:(PanStatus.STATUS'=$$$PanOptiStatusOK) $$$pxStatusErrorEx("Fout tijdens snijden.",PanStatus.MESSAGE_$C(13,10)_$$LCVT^vhLib(lbSnijOpdracht))
Quit $$$pxStatusOK
]]>
Alle delen van de doos worden onmiddellijk gesneden. Alle aantallen voor een deel worden gesneden en dan pas alle aantallen van het tweede deel, ...
SnijMachineID : VH of HALUX
SnijID : verwijzing naar een SnijDatao object mag ook een objectreferentie mag zijn
Prioriteit : 1..9
lbLimitUsage : optioneel, beperking op welke delen (BoxUsage bv. Bottom, Sub, Lid, Filler, ...) er mogen gesneden worden.
PPSOutput : 0 = rechtdoor, 1 = rechts, 2 = links
HasSnijDef : returnvalue, is true als er snijopdrachten in de wachtrij zijn geplaatst
WS.Prod.PanOpti.q1.STATUSRES
Eerst wordt er 1 doos (met al zijn delen) in hoge prioriteit en daarna steeds per stuk in steeds lagere prioriteit.
Dit geeft geeft de machine de mogelijkheid om voor een andere werkpost er werk tussen te nemen.
SnijMachineID : VH of HALUX
SnijID : verwijzing naar een SnijDatao object mag ook een objectreferentie mag zijn
Prioriteit : 1..9
lbLimitUsage : Beperking op welke delen (BoxUsage bv. Bottom, Sub, Lid, Filler, ...) er mogen gesneden worden.
PPSOutput : 0 = rechtdoor, 1 = rechts, 2 = links
HasSnijDef : returnvalue, is true als er snijopdrachten in de wachtrij zijn geplaatst
deel verwerkt, 1 -> alles verwerkt, -1 -> geen enkel te verwerken]]>
SnijID:%Integer,lbLimitUsage:%List,PPSOutput,Qty:%Integer=0,MaxRecurse:%Integer=99
1
Ophalen van de snijdefinities en deze groeperen per usage (Bottom, main, filler, ...)
Parameter :
SnijID startpunt in de SnijData bestand
arSnijData : resultaat SnijDefs(PPSPrioriteit,VolgNr)=object SnijDef
lbLimitUsage : Welke BoxUsage worden toegelaten
ReDo : alleen de openstaande of ook de reeds verwerkte
MaxRecurse : Aantal keren dat subdozen mogen opgehaald worden
ParentQty : moet niet ingevuld worden (nodig voor recusie). SnijDefs is steeds per stuk daarom moeten sub definities vermenigvuldig worden met het parentqty
k ar D ##class(BL.Prod.OptiBox.Snijden).%New().GetSnijDefs(43295,.ar,$lb("LID"),99) zw ar
1
oSnijData,ReqQty,OptiQty,WithReDo
1
1
oSnijData
1
WS.Prod.PanOpti.q1.CUTREQCUT
ObjType,ObjRef
Do ##class(BL.Prod.OptiBox.Snijden).CleanOld($H)
1
Datum:%Date