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 ]]>