Production Process Steering - Tandembox
Genereert van een Toelevering de verpakkingsdefinitie
Code voorbeeld :
Set blOptiVHoss=##class(BL.PPS.TBX.OptiVHoss).Create($LB(TOENrs, ...))
Do blOptiVHoss.Optimize()
; De multidimensional blOptiVHoss.VHoss bevat de geoptimaliseerde versie.
Prod.Product,BL.Prod.OptiBox,BL.PPS.TBX.Common,BL.Sys.Toegang,BL.Sys.Proxy
1
%RegisteredObject
0
structuur :
VHoss(VHossNr,Zijkant,VolgNr)=$LB(SlotPos;MajorLink;MinorLink;SideLink;PRNr;FABKey;LadeType;Diepte;Breedte;KlantSort;ProductieSort)
VHoss(VHossNr,Zijkant,VolgNr,SubNr)=$LB($LB(AllowedLadeTypes);MaxDiepte;MaxBreedte)
SlotPos is de label op de VHoss, via MajorLink, MinorLink en SideLink wordt er verwezen naar SlotPos en niet naar VolgNr
rem : KlantSort is de productie volgorde die de klant wenst
het subnivo bevat de slot restricties
%String
1
1 lege VHoss, wordt aangemaakt
VHossEmpty(Zijkant,VolgNr)=$LB(SlotPos;MajorLink;MinorLink;SideLink;PRNr;FABKey;LadeType;Diepte;Breedte;KlantSort;ProductieSort)
VHossEmpty(Zijkant,VolgNr,SubNr)=$LB($LB(AllowedLadeTypes);MaxDiepte;MaxBreedte)
%String
1
structuur
VHossIndex(Zijkant,SlotPos)=VolgNr
%String
1
structuur : Index(VHossNr,Zijkant,SortKey,VolgNr)
%String
1
%String
1
producten in volgorde
structuur : Products(VolgNr)=$LB(PRNr;FABKey;LadeType;Diepte;Breedte,KlantSort)
rem : KlantSort is de productie volgorde die de klant wenst (KlantSort is gelijk aan VolgNr)
%String
1
ProdGrp="+" : ProPlus vr Keller
="A" : Kast
%String
%List
192.168.1.15
Slot dimensies
600
1200
Product dimensies
650
1200
100
Minimum aantal laden vooralleer er met meerdere mogelijkheden rekening wordt gehouden
10
;M;MZ;B;BZ;C;CZ;K;KZ;D;DZ;DL;DLZ;CM;CL;CLZ;N;DLS2;CLS2;BS2;MS2;DS2;MY;BY
4
listitem VHOSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
listitem VHOSS sublevel : slot restricties
1
2
3
listitem Products
1
2
3
4
5
6
7
8
9
10
Na de create moet nog bl.Optimize opgeroepen worden waarna in de multidimensional de bl.VHoss de optimilasatie is opgeslagen
1
BL.PPS.TBX.OptiVHoss
lbTOENrs:%List,ProdGrp:%String
Opvragen van optimalisatie : Initialisatie
Opvragen van optimalisatie : Volgende opvragen
Opvragen van optimalisatie : Ophalen data
Eerst wordt de Optimalisatie berekend van de stockage en pas in tweede stap wordt een index opgebouwd die de productie optimaliseerd
ProdGrp="+" : ProPlus vr Keller
="A" : Kast
VHossOrder
Sorteersleutel voor de productieoptimalisatie
lbSlot
1
",$$ListToPieces^vhLib($LI(lb),", "),"; ",$$ListToPieces^vhLib($LI(lb,2,3),"; "),!
]]>
Delim,MetGrootte=1
CR<")
Do ..CountSlots(.QtyLaden,.QtyLege)
Write "Laden:",*9,QtyLaden,*9," Lege:",*9,QtyLege,*9, "Bezet:",*9,$S(QtyLege+QtyLaden:$TR($J(QtyLaden/(QtyLege+QtyLaden),0,4),".",","),1:""),!
Set VHossNr=""
For Set VHossNr=$O(..VHoss(VHossNr)) Quit:VHossNr="" Do
. Set Zijkant=""
. For Set Zijkant=$O(..VHoss(VHossNr,Zijkant)) Quit:Zijkant="" Do
. . Write "*** VHoss:",VHossNr," - Zij:",Zijkant," ***",!
. . Set Count=""
. . For Rij=1,2,3 Do
. . . Set StartVak=(Rij-1)*10
. . . For Vak=1:1:10 Do
. . . . Set Label=StartVak+Vak
. . . . Set Count=""
. . . . For Set Count=$O(..VHoss(VHossNr,Zijkant,Count)) Quit:Count="" Quit:$LI(..VHoss(VHossNr,Zijkant,Count))=Label
. . . . If 'Count Write "Label "_Label_" not found" Quit
. . . . Set lbSlot=..VHoss(VHossNr,Zijkant,Count)
. . . . Write Label
. . . . If $LG(lbSlot,..#iVHossPRNr) Do
. . . . . Write Delim,"PR:",$LG(lbSlot,..#iVHossPRNr),Delim,"IB:",$LG(lbSlot,..#iVHossBreedte),Delim,"LD:",$LG(lbSlot,..#iVHossDiepte)
. . . . . Write Delim,"LT:",$LG(lbSlot,..#iVHossLadeType),Delim,"KLS:",$LG(lbSlot,..#iVHossKlantSort),Delim,"PPS:",$LG(lbSlot,..#iVHossProductieSort)
. . . . Else Do ; bepalen of het vak gevuld is doos een gelinkt slot
. . . . . Set Empty=0
. . . . . Set DefNr=""
. . . . . For Set DefNr=$O(..VHoss(VHossNr,Zijkant,Count,DefNr)) Quit:DefNr="" Do
. . . . . . Set lbDef=..VHoss(VHossNr,Zijkant,Count,DefNr)
. . . . . . If ($LG(lbDef,..#iVHossSubMaxBreedte)>0)&&($LG(lbDef,..#iVHossSubAllowedLadeTypes)'="") Set Empty=1
. . . . . If Empty Do
. . . . . . Write Delim,"empty"
. . . . . Else Do
. . . . . . Write Delim,"n/a"
. . . . If $G(MetGrootte) Do
. . . . . Write Delim,"Link:",$LG(lbSlot,..#iVHossSideLink)
. . . . . Set DefNr=""
. . . . . For Set DefNr=$O(..VHoss(VHossNr,Zijkant,Count,DefNr)) Quit:DefNr="" Do
. . . . . . Set lbDef=..VHoss(VHossNr,Zijkant,Count,DefNr)
. . . . . . Write Delim,"MLT:",$$ListToPieces^vhLib($LG(lbDef,..#iVHossSubAllowedLadeTypes)),Delim,"MBR:",$LG(lbDef,..#iVHossSubMaxBreedte),Delim,"MHO:",$LG(lbDef,..#iVHossSubMaxDiepte)
. . . . Write *9
. . . Write !
Set Count=""
Do ..ExportLijst(Dev) Q
For Set Count=$O(..Products(Count)) Quit:Count="" Do
. Write Count,*9,$$ListToPieces^vhLib(..Products(Count),$C(9)),*9,$P(^KPR($LI(..Products(Count)),0),"\"),!
close:0'[Dev Dev
]]>
Dev
Tellen van de gevulde slots en van de lege slots.
Slots die leeg blijven doordat in een gelinkt vak een hoge of brede lade zit worden niet meegeteld als lege slot.
1
2
. . Set VolgNr=""
. . For Set VolgNr=$O(VHoss(VHossNr,LastZijkant,VolgNr),-1) Quit:VolgNr="" Do Quit:LastSlot ; wordt gevuld van onderaan (grootste nummer) naar bovenaan (kleine nummer)
. . . Set:$LG(VHoss(VHossNr,LastZijkant,VolgNr),..#iVHossPRNr)'="" LastSlot=VolgNr
; tellen
Set Zijkant=""
Set Count=0
For Set Zijkant=$O(VHoss(VHossNr,Zijkant)) Quit:Zijkant="" Do
. If Zijkant>LastZijkant Quit ; zijkant bevat geen producten
. Set VolgNr=""
. For Set VolgNr=$O(VHoss(VHossNr,Zijkant,VolgNr)) Quit:VolgNr="" Do
. . If Zijkant=LastZijkant,VolgNr>LastSlot Quit ; voorbij laatste lade
. . If $LG(VHoss(VHossNr,Zijkant,VolgNr),..#iVHossPRNr)'="" Do
. . . Set QtyLaden=QtyLaden+1
. . Else Do ; controle dat er nog een lade kan staan (bij brede of hoge laden kan het gelinkt vak geen lade meer bevatten)
. . . Set Empty=0
. . . Set DefNr=""
. . . For Set DefNr=$O(VHoss(VHossNr,Zijkant,VolgNr,DefNr)) Quit:DefNr="" Do
. . . . Set lbDef=VHoss(VHossNr,Zijkant,VolgNr,DefNr)
. . . . If ($LG(lbDef,..#iVHossSubMaxBreedte)>0)&&($LG(lbDef,..#iVHossSubAllowedLadeTypes)'="") Set Empty=1
. . . If Empty Set QtyLege=QtyLege+1
Quit
]]>
1
10
. . Set LRec=^KTO($$$LevHalux,TOENr,TLNr)
. . Set PRNr=$P(LRec,"\",2)
. . Quit:$P($$GENTYP^HAD(PRNr),"\")'="TBX"
. . Set Geschikt=..ProductGeschikt(PRNr,.Diepte,.Breedte,.Type)
. . Do ..GetKlantRef(TOENr,TLNr,.KlantOrdRef,.KlantProdRef,.TransportRef)
. . If Geschikt<1 Do ; Ongeldig
. . . Set ..Skipped($O(..Skipped(""),-1)+1)=$LB(PRNr,TOENr,TLNr,Diepte,Breedte,Type,Geschikt)
. . Else Do
. . . For J=1:1:$P(LRec,"\",3) Do ; qty
. . . . Set Count=Count+1
. . . . Set ..Products(Count)=$LB(PRNr,(TOENr_";"_$P(LRec,"\",15)),Type,Diepte,Breedte,Count,..SlotCat(Type,Diepte),KlantOrdRef,KlantProdRef,TransportRef)
. . . . ;w "product",$$ListToPieces^vhLib(..Products(Count)),!
;k %Products m %Products=..Skipped zw %Products
]]>
1
1
70 Type=Type_"Z"
Set:$R(100)>50 Breedte=300+$R(900)
Set:$R(100)>50 Diepte=300+($R(8)*50)
Set:$R(100)>90 Type="DZ"
*/
Quit:(Diepte>..#MaxDiepte) -1
Quit:(Breedte>..#MaxBreedte) -2
Quit:(Breedte<..#MinBreedte) -3
Quit:('$F(..#MaxTypes,Type)) -4
Quit:$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"ODSP"))'="" -5 ; geen Onderdelen special
Quit:$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"VERPAK"))'?1(1"A",1"B") -6 ; Verpakking moet KAST zijn
Quit:(..ProdGrp="+")&&("0"'[$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"ASM"))) -10 ; geen Antislipmat
Quit 1
]]>
Conversie van de ongeschikte producten (skipped) naar tekstveld.
Delim
CR<")
Set Tekst=""
For I=1:1:$O(..Skipped(""),-1) Do
. Set Tekst=Tekst_$S($L(Tekst):Delim,1:"")_$P(^KPR($LI(..Skipped(I)),0),"\",1)_", "_$$ListToPieces^vhLib(..Skipped(I),", ")
Quit Tekst
]]>
De minor slot is deze waar alleen lage lades kunnen geplaatst worden
De major slot is deze waar lage en hoge lades kunnen geplaatst worden
1
Type,Diepte
550:3,1:1)+$S($LF($$$MinorTypes,Type):0,1:1)
]]>
1
1
",$$LCVT^vhLib(lbProd),!
. Set Status=..GetFreeSlot(.VHoss,1,lbProd,.SlotPos)
. If SlotPos Do
. . Do ..MarkSlot(.VHoss,1,SlotPos,lbProd)
. . Set VHoss=$LB(StartProd,CurrentProd)
. . If CurrentProd-StartProd>..#MinDrawers Do ; min 10 lades
. . . Merge VHossTry($I(VHossTry))=VHoss ; meerdere versies bijhouden die slechts gedeeltelijk gevuld zijn
If VHossTry=0 Merge VHossTry($I(VHossTry))=VHoss ; als bij de laatste minder dan 10 lades zijn
; Zijkant 2
For VHossCnt=VHossTry:-1:1 Do
. Quit:'$D(VHossTry(VHossCnt))
. ;Quit:$LG(VHossTry(VHossCnt),2)="" ; alle laden werden reeds verwerkt
. Kill VHoss
. Merge VHoss=VHossTry(VHossCnt)
. Set CurrentProd=$LG(VHoss,2)
. For Set CurrentProd=..NextProduct(CurrentProd,.lbProd) Quit:CurrentProd="" Do Quit:Status="NoSlot"
. . Set Status=..GetFreeSlot(.VHoss,2,lbProd,.SlotPos)
. . If SlotPos Do
. . . Do ..MarkSlot(.VHoss,2,SlotPos,lbProd)
. . . Set $LI(VHoss,2)=CurrentProd
. Kill VHossTry(VHossCnt)
. Merge VHossTry(VHossCnt)=VHoss
; Zoek VHoss met meeste laden
;Write "VHossTry:",VHossTry,!
Set MaxLade=0
For VHossCnt=VHossTry:-1:1 Do
. Quit:'$D(VHossTry(VHossCnt))
. If ($LI(VHossTry(VHossCnt),2)-$LI(VHossTry(VHossCnt),1))>MaxLade Do
. . ;Write VHossCnt," -> ",MaxLade,!
. . Kill VHoss
. . Merge VHoss=VHossTry(VHossCnt)
. . Set MaxLade=$LI(VHossTry(VHossCnt),2)-$LI(VHossTry(VHossCnt),1)
;Do ..Show(.VHossTry)
]]>
1
%Status
",..#MaxSlotCat,!
For SlotCat=$LI(lbProd,..#iProdSlotCat):1:..#MaxSlotCat Do Quit:SlotPos ; eerst die slots nemen die het dichts bij de categorie liggen
. For Set VolgNr=$O(VHoss(Zijkant,VolgNr)) Quit:VolgNr="" Do Quit:SlotPos
. . Quit:$LG(VHoss(Zijkant,VolgNr),..#iVHossPRNr)'="" ; bevat reeds een product
. . Quit:$LG(VHoss(Zijkant,VolgNr),..#iVHossSlotCat)>SlotCat ; SlotCategorie is groter
. . ;w "SlotCat",$LG(VHoss(Zijkant,VolgNr),..#iVHossSlotCat),">",SlotCat,!
. . Quit:'..CheckSlot(.VHoss,Zijkant,VolgNr,$LI(lbProd,..#iProdLadeType),$LI(lbProd,..#iProdDiepte),$LI(lbProd,..#iProdBreedte))
. . ; gevonden
. . Set SlotPos=VolgNr
If 'SlotPos Quit "NoSlot"
Quit ""
]]>
1
$LI(lbDef,..#iVHossSubMaxDiepte)
. Quit:Breedte>$LI(lbDef,..#iVHossSubMaxBreedte)
. Quit:'$LF($LI(lbDef,..#iVHossSubAllowedLadeTypes),Type)
. Set Found=1
Quit Found
]]>
1
600 zorgt ervoor dat het slot aan de andere zijkant ook gevuld is
If $LG(lbSlot,..#iVHossMinorLink) Do ; het is een major
. If $LF($$$HogeLades,$LG(lbProd,..#iProdLadeType)) Do ; hoge lade
. . Do EraseAll(Zijkant,$LG(lbSlot,..#iVHossMinorLink))
. . Do EraseAll(Zijkant+1,$$GetLink(Zijkant,$LG(lbSlot,..#iVHossMinorLink)))
. ;Else If $LG(VHoss(Zijkant,$$$GetKey(Zijkant,..#iVHossMinorLink)),..#iProdPRNr)?4.7N Do ; geen hoge lade aan de andere kant indien minor reeds gevuld
. ;. Do Erase(Zijkant+1,$LG(lbSlot,..#iVHossSideLink),$$$HogeLades)
Else If $LG(lbSlot,..#iVHossMajorLink) Do ; het is een minor
. Do Erase(Zijkant,$LG(lbSlot,..#iVHossMajorLink),$$$HogeLades)
. Do Erase(Zijkant+1,$$GetLink(Zijkant,$LG(lbSlot,..#iVHossMajorLink)),$$$HogeLades)
;W "ReduceLink",Zijkant+1," ",$$$GetSide," ",$$$GetBreedte,!
Do ReduceLink(Zijkant+1,$LG(lbSlot,..#iVHossSideLink),$LG(lbProd,..#iProdBreedte))
Quit
EraseAll(Zijkant,SlotPos)
Quit:'SlotPos
; Zoeken van SlotPos in Zijkant
Set Key=$$$GetKey(Zijkant,SlotPos)
Quit:'Key
;Wissen van alle AllowedLadeTypes
Set DefNr=""
For Set DefNr=$O(VHoss(Zijkant,Key,DefNr)) Quit:DefNr="" Do
. Set $LI(VHoss(Zijkant,Key,DefNr),..#iVHossSubAllowedLadeTypes)=""
; Linked aan de andere kant
Quit
Erase(Zijkant,SlotPos,lbDelTypes)
Quit:'SlotPos
Set Key=$$$GetKey(Zijkant,SlotPos)
Quit:'Key
Set DefNr=""
For Set DefNr=$O(VHoss(Zijkant,Key,DefNr)) Quit:DefNr="" Do
. Set lbTypes=$LG(VHoss(Zijkant,Key,DefNr),..#iVHossSubAllowedLadeTypes)
. For I=1:1:$LL(lbDelTypes) Do
. . Set DelPos=$LF(lbTypes,$LI(lbDelTypes,I))
. . Quit:'DelPos
. . Set $LI(lbTypes,DelPos)=""
. Set $LI(VHoss(Zijkant,Key,DefNr),..#iVHossSubAllowedLadeTypes)=lbTypes
Quit
GetLink(Zijkant,SlotPos)
Quit:'SlotPos ""
; Zoeken van SlotPos in Zijkant
Set Key=$$$GetKey(Zijkant,SlotPos)
Quit:Key="" ""
Quit $LG($G(VHoss(Zijkant,Key)),..#iVHossSideLink)
ReduceLink(Zijkant,SlotPos,Breedte)
Quit:'SlotPos
Set Key=$$$GetKey(Zijkant,SlotPos)
Quit:'Key
Set DefNr=""
For Set DefNr=$O(VHoss(Zijkant,Key,DefNr)) Quit:DefNr="" Do
. Set $LI(VHoss(Zijkant,Key,DefNr),..#iVHossSubMaxBreedte)=$S(Breedte>..#HalfSlotBreedte:0,1:..#HalfSlotBreedte)
Quit
]]>