#include BL.Derde.KlantSpecifiek #include BL.Derde.LevSpecifiek MRPRES ;Reservatie van halffabrikaten [ 11/29/2003 8:15 AM ] CLEAN(TOENr) Set FabKey=TOENr_";" For Set FabKey=$O(^HADPR("F",FabKey)) Quit:$P(FabKey,";")'=TOENr Do .Set Rec=^HADPR("F",FabKey) .Kill ^HADPR("F",FabKey) .Set ^HADPR("F",FabKey)=Rec Quit ONEPK(CRef,FabKey,PRNr,QtyToe,Status) ; Produktieklaar maken, laatste controle voor reservatie en eventueel aanmaak van transfer orders ;Status via .Local ;Do ONERES(CRef,FabKey,PRNr,QtyToe,"FPW",.Status) ; De hercalculatie gebeurt globaal op voorhand, niet meer individueel ; Nakijken of een transfer order nodig is ;If ((Status["W")!(Status["F")!(Status["P")),(Status'["X") Do Set Status="" Do BLDTORD(CRef,FabKey,PRNr) Quit BLDTORD(CRef,FabKey,PRNr,TotWeek) ; Controle welke halffabrikaten moeten opgenomen worden in een transferorder ; @CRef@("TO",FabKey,HFCode)=HFPRNr_D_MagStuks New HFCode,HFPRNr,DimBrut,HFQty,ARRec,HFRec,HFRecD Quit:$P($G(^HADPR("F",FabKey,"K")),D,3)="A" ; Reeds productie klaar Set (HFCode)="" For Set HFCode=$O(^HADPR("F",FabKey,"AR",HFCode)) Quit:HFCode="" Do . Set ARRec=^HADPR("F",FabKey,"AR",HFCode) . Quit:$P(ARRec,D,6)'="W"&($P(ARRec,D,6)'="P")&($P(ARRec,D,6)'="F") ; Te kort op werkvloer wordt bepaald door ACTIVERING . Set HFRec=^PRBS("BS",PRNr,HFCode) . Quit:$P(HFRec,D,3)'="H" ; Geen halffabrikaat . Set HFRecD=$G(^PRBS("BS",PRNr,HFCode,"D")) . Set HFPRNr=$P(HFRec,D,1) . Quit:('$P(^KPR(HFPRNr,2),D,15))&&($$GETSTOCK^PRODUKT4(HFPRNr,"F",,0,1)<1) ; Werkvloer product zonder voorraad in magazijn . If $L($P($G(^KPR(HFPRNr,15)),D,5)) Do ; Er is een herbestelpunt ingevuld daarom overlaten aan de SCAN^MRPSTOCK .. Set ScanWeek=$S('ScanWeek:$$EXTDATE^vhDTyp($$CALCDATE^vhDTyp($H,"A",5),"DW"),1:ScanWeek) .. Do SCANONE^MRPSTOCK(CRef,HFPRNr,"R",ScanWeek) . Else Do .. Set DimBrut=$P(HFRecD,D,2) .. Set HFQty=$P(ARRec,D,2) ; Aantal HFprodukten = QtyToe*QtyHFperAfgewerkStuk .. Set @CRef@("TO",HFPRNr,FabKey,HFCode)=HFQty .. Set:$L(HFRecD) @CRef@("TO",HFPRNr,FabKey,HFCode,"D")=HFRecD Quit ONERES(CRef,FabKey,PRNr,QtyToe,Opties,Status,NoResDel) ; Controle en reservatie van HFprods ; Status via .Local ; Opties: wat te controleren F=Fysische stock,Praktische stock, W=werkvloer magazijn, T=toelevering, Z = Alles of niets Set Status="" Do DELONE(FabKey,PRNr,.Status,$G(NoResDel)) Quit:Status="LCK" ; HF gelockt Do CHKONE(CRef,FabKey,PRNr,QtyToe,Opties,.Status) Do MARK(FabKey,PRNr,QtyToe,Status,$TR(Opties,"TZ","")_"X") Quit SCANZonderActivering New NoActivering Set NoActivering=1 SCAN New Scan Set Scan=1 Write @F11,@F1,@FMTI," CONTROLE Reservatie halffabrikaten"," - ",QN,@FMTi NIGHT New D,FabKey,Batch,VolgNr,CRef,Time,HFCode,HFRec,HFPRNr,PRNr,RecO,QtyWV,Qty,Cnt Set D="\",CRef=$$OPEN^MRPRES() Set PRNr=0 Set ScanWeek=$$EXTDATE^vhDTyp($$CALCDATE^vhDTyp($H,"A",5),"DW") ; week tot waar de SCANONE de halffabrikaten mag sommeren Set (Cnt,OrdCnt)=0 If $G(Scan) Set FP=2301 Write @F,@F2,"Opzoeken gereserveerde halffabrikaten" ; Herreservatie (zonder toelevering) Set CRef=$$OPEN() Set (Batch,VolgNr)="" ; Doorlopen van alle batches For Set Batch=$O(^HADPR("O",Batch)) Quit:Batch="" Do . For Set VolgNr=$O(^HADPR("O",Batch,VolgNr)) Quit:VolgNr="" Do .. Set RecO=^HADPR("O",Batch,VolgNr) .. Set PRNr=$P(RecO,D,3) .. Quit:PRNr'?4.7N .. Quit:'$D(^PRBS("BS",PRNr)) ; Alleen producten met halffabrikaten ! .. Set FabKey=$$FABKEYB^HADOPV(RecO) .. ;Write:'$D(^TO("IU",$P(FabKey,";"),$P(FabKey,";",2))) "Does not exist FabKey",Batch," ",VolgNr," ",FabKey,! .. If '$D(^HADPR("F",FabKey,"A")),'$G(NoActivering),$P($$GENTYP^HAD(PRNr),D,1,2)'=("TBX"_D_"PR+") Do ; Opzetten van Activering markering ... Quit:$$CheckContract^HADOPV(FabKey) ; geen contracten ... Set Qty=$$MARKPR^HADOPV(FabKey,"A","+",$P(RecO,D,7),$H) .. Set Time=$P($G(^HADPR("F",FabKey,"A")),D,2) ; tijdstip van activering, belangrijk voor herbereken reservering .. Quit:'Time .. Set Cnt=Cnt+1 .. If $G(Scan),Cnt#10=0 Set FP=2325 Write @F,@F2,Cnt .. If $P($G(^HADPR("F",FabKey,"K")),D,3)'="A" Do ; Niet In productie ... Set @CRef@("S",Time,FabKey)=RecO ; bijhouden voor activering & Sorteren volgens activerings tijdstip .. Else Do ; Cumul van de reservatie van HFprod nog in productie ... Set HFCode="" ... For Set HFCode=$O(^HADPR("F",FabKey,"AR",HFCode)) Quit:HFCode="" Do .... Set HFRec=^HADPR("F",FabKey,"AR",HFCode) .... Set HFPRNr=$P(HFRec,D) .... Set QtyWV=$P(HFRec,D,3) .... ; Alleen indien het halffabrikaat nog op de werkvloer staat en nog niet op 'HalfFabrikaat' .... Set:$P(HFRec,D,8)'="H" @CRef@("P",HFPRNr)=$G(@CRef@("P",HFPRNr))+QtyWV ; Wissen van de reservatie door gelijk te stellen aan de productie reservatie Set HFPRNr="" If $G(Scan) Set FP=2301 Write @F,@F2,"Wissen werkvloerreservering " For Set HFPRNr=$O(^PRSTOCK("D",HFPRNr)) Quit:HFPRNr="" Do . Do SETWVRES^MRPSTOCK(HFPRNr,$G(@CRef@("P",HFPRNr))+$P(^PRSTOCK("D",HFPRNr),D,9)) ; Herberekenen reservatie If $G(Scan) Set FP=2301 Write @F,@F2,"Herberekenen reservering" Set (Time,FabKey)="" For Set Time=$O(@CRef@("S",Time)) Quit:Time="" Do . For Set FabKey=$O(@CRef@("S",Time,FabKey)) Quit:FabKey="" Do .. Set RecO=@CRef@("S",Time,FabKey) .. Set PRNr=$P(RecO,D,3) .. Set Qty=$P(RecO,D,7) .. Do ONERES(CRef,FabKey,PRNr,Qty,"WFP",.Status,1) ;Set TmpNr=$O(^PVMRP(""),-1)+1 ;Set ^PVMRP(TmpNr)=$zdt($H,3) ;m ^PVMRP(TmpNr,1)=@CRef Kill @CRef@("S") Do CLOSE(CRef) Quit ExceedHFLeverTermijn(FabKey) ; Bepalen of de gevraagde levertermijn van het eindproduct groter is dan max. levertermijn van de halffabrikaten Set TLNr=^TO("IU",$P(FabKey,";"),$P(FabKey,";",2)) Set TLRec=^KTO(6332,$P(FabKey,";"),TLNr) Set TLLeverWeek=$$INTDATE^vhDTyp($P(TLRec,D,25),"DW") Set HFLeverTermijn=$$LeverTermijn^PRBS($P(TLRec,D,2),1) Set HFLeverWeek=$$CALCDATE^vhDTyp($H,"AW",HFLeverTermijn) Quit:TLLeverWeek>HFLeverWeek 1 Quit 0 OPEN() ; Aanmaak van de cache New %J Set %J=$$%J^vhRtn1() Kill ^HULP(%J) Quit $NAME(^HULP(%J)) CLOSE(CRef) ; Aan te maken transfer order met eventueel KOMtoelevering : ; @CRef@("TO",HFPRNr)=Qty\SubMag ; @CRef@("TO",HFPRNr,FabKey,HFCode)=QtyHF\DimUitv\SubMag If $D(@CRef@("TO")) Do . Set TimeStamp=$H . Merge ^MRPRESLog($P(TimeStamp,",",1),$P(TimeStamp,",",2),"FETCH")=@CRef . Do BalanceLiRe(CRef) . Merge ^MRPRESLog($P(TimeStamp,",",1),$P(TimeStamp,",",2),"BALANCE")=@CRef@("TO") . Do SplitSubMag(CRef) . Kill @CRef@("TO") . Merge ^MRPRESLog($P(TimeStamp,",",1),$P(TimeStamp,",",2),"SPLIT")=@CRef@("STO") . Do BLD^MRPTORD($NAME(@CRef@("STO"))) . Merge ^MRPRESLog($P(TimeStamp,",",1),$P(TimeStamp,",",2),"ORDER")=@CRef@("STO") Quit VoegKenmerkToe(lbKenm, Kenmerk) New tmp //kenmerk opvragen Set tmp=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TB",PRNr,Kenmerk)) //omdraaien als LiRe li->re; re->li If Kenmerk = "LiRe" do . Set tmp = $S(tmp="LI":"RE",tmp="RE":"LI",1:tmp) // toevoegen aan lijst Set:$L(tmp) lbKenm=lbKenm_$lb($lb(Kenmerk,tmp)) Quit GetMirrorPRNr(PRNr) // Het rechts/links mirror product ophalen van een product adhv de kenmerken ; KLNr is optioneel het kan zijn het product beperkt wordt New blMetaKenm, lbKenm, LiRe, MirrorLiRe ; Het mirrorproduct wordt opgehaald adhv de kenmerken van het referentie product ; (alle kenmerken worden opgevraagd, en als ze gedefineerd zijn, toegevoegd aan de kenmerklijst) ; (LiRe is speciaal geval : het moet omgedraaid worden li->re; re->li Set lbKenm="" Do VoegKenmerkToe(.lbKenm, "BasisType") Do VoegKenmerkToe(.lbKenm, "GlijderType") Do VoegKenmerkToe(.lbKenm, "Verpakking") Do VoegKenmerkToe(.lbKenm, "LadeDiepte") Do VoegKenmerkToe(.lbKenm, "DraagKracht") Do VoegKenmerkToe(.lbKenm, "Design") Do VoegKenmerkToe(.lbKenm, "Opties") Do VoegKenmerkToe(.lbKenm, "FrontType") Do VoegKenmerkToe(.lbKenm, "BreedteIntern") Do VoegKenmerkToe(.lbKenm, "Kleur") Do VoegKenmerkToe(.lbKenm, "ZijwandHoogte") Do VoegKenmerkToe(.lbKenm, "RugHoogte") Do VoegKenmerkToe(.lbKenm, "RugBreedte") Do VoegKenmerkToe(.lbKenm, "FBevestiging") Do VoegKenmerkToe(.lbKenm, "LiRe") Set Actief=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TB",PRNr,"Actief")) ; Actief geeft soms de klantnr Set KLNr=$S(Actief?4.6N:Actief,1:"") ; lijst van mirrorproducten ophalen (we kunnen er enkel iets mee doen als het er slechts 1 is) ; Set blMetaKenm=##class(Prod.GAMeta.ItemPR).%New() ; Set PRList=blMetaKenm.GetProductViaKenm("TB",lbKenm, "") Set lbPR=$$PRGetProductViaKenmerkLijst^Prod.GAMeta.Item.tmpDev("TB",lbKenm,KLNr) Quit:lbPR="" "" Quit:$LL(lbPR)>1 "" Quit $LI(lbPR) BalanceLiRe(CRef) New PRNr, MirrorPRNr, RefQty, MirrorQty,Actief,KLNr Kill @CRef@("BAL") ; Balance Set PRNr="" For Set PRNr=$O(@CRef@("TO",PRNr)) Quit:PRNr="" Do . Do CNTRDEF^MRP(PRNr) ; controle default . Quit:$D(@CRef@("BAL",PRNr)) . Set LiRe=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TB",PRNr,"LiRe")) ; Links Of rechts . Quit:(LiRe'="LI")&&(LiRe'="RE") . Set MirrorPRNr=$$GetMirrorPRNr(PRNr) . Quit:MirrorPRNr="" . Set RefQty=$P($G(@CRef@("TO",PRNr)),D) . Set MirrorQty=$P($G(@CRef@("TO",MirrorPRNr)),D) . //Set:MirrorQty'=RefQty $P(@CRef@("TO",MirrorPRNr),D)=$S(MirrorQty rollback . Kill ToeCache ; Deel is niet gelukt dan geen toelevering aanmaken . Do DELONE(FabKey,PRNr) . Set Status="STOP" Merge @CRef@("TO")=ToeCache Quit ; controleren of het losse onderdelen zijn die voor klant DeDecker ; opm : de losse onderdelen worden door DeDecker separaat als Proforma besteld CheckLosDedecker(TOENrOrFabKey,PRNr,BSRec) New KLNr Quit:$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"VERPAK"))'?1(1"A",1"B") 0 ; alleen verpakking = VHOSS Quit:$P(BSRec,D,19)'="LOS" 0 ; alleen losse onderdelen Quit:$P(TOENrOrFabKey,";")="" 0 Set KLNr=$P(^KTO($$$LevHalux,$P(TOENrOrFabKey,";"),1),"\",8) Quit KLNr=$$$KlantDedecker CHKHF(FabKey,PRNr,HFCode,HFPRNr,QtyToe,Opties,Status,QtyRes,QtyEenh,ToeCache) ; Controle en reservatie van een halffabrikaat ; Status, QtyRes,QtyEenh,ToeCache via .Local ; opties: wat te controleren F=fysische stock, P=praktische stock, W=werkvloer magazijn, T=toelevering New FysStock,Rec15,Rec0,Rec1,Rec2,MetaTag,WVStock,WVRes,HFRec,QtyHF,HFRecD,NetDim,BrutDim,UitvDim,QtyReq,QtyMagReq,QtyWVRes,QtyWVReq,TotHFSt,StockE,TotMagSt,RecJ If '$D(^KPR(HFPRNr,0)) Do Quit ; HalfFabrikaat bestaat niet .Set Status="X" .Set (QtyRes,QtyEenh)=0 Lock +^PRSTOCK(HFPRNr):5 Else Do Quit . Set Status="LCK",(QtyRes,QtyEenh)=0 Set PrakStock=$$GETSTOCK^PRODUKT4(HFPRNr,"P") Set FysStock=$$GETSTOCK^PRODUKT4(HFPRNr,"F") Set Rec0=$G(^KPR(HFPRNr,0)) Set Rec1=$G(^KPR(HFPRNr,1)) Set Rec2=$G(^KPR(HFPRNr,2)) Set Rec15=$G(^KPR(HFPRNr,15)),StockRec=$G(^PRSTOCK("D",HFPRNr)) Set MetaTag=$P(Rec15,D,10) Set WVStock=$P(StockRec,D,5) Set WVRes=$P(StockRec,D,6) Set HFRec=^PRBS("BS",PRNr,HFCode) Set QtyHF=$P(HFRec,D,2) If "PR"[MetaTag Set HFRecD="1\1\1" Else Set HFRecD=$G(^PRBS("BS",PRNr,HFCode,"D")) Set NetDim=$P(HFRecD,D,1) Set BrutDim=$P(HFRecD,D,2) Set UitvDim=$P(HFRecD,D,3) Set (QtyRes,QtyReq)=QtyToe*QtyHF,Status="" Set QtyMagReq=$$TELMAGST^MRP(HFPRNr,QtyReq,1,BrutDim,NetDim) Set (QtyWVRes,QtyWVReq)=$$CV2WV^MRP(HFPRNr,0,QtyRes,UitvDim,$P(Rec15,D,7)) If QtyHF,Opties["W" Do ;Kijken of in het werkvloer magazijn voldoende producten zijn . ; Aantal HF mogelijk met de WV voorraad . If ($P(Rec15,D,5)="")&&(+($P(Rec2,D,15))'=0) Do ;Er wordt geen voorraad gehouden van dit product Of het product, dus steeds bij bestellen - toegevoegd PV 15/02/02009 . . Set Status="W" . Else Do . . Set TotHFSt=$$TELHFST^MRP(HFPRNr,WVStock-WVRes,BrutDim,NetDim) . . If TotHFSt<(QtyReq) Do ; te weinig in voorrraad . . . Set Status="W" If QtyHF,Opties["P",Status["W" Do ; Kijken of er voldoende praktische stock is . Set StockE=$$CV2EENH^MRP(HFPRNr,PrakStock)+WVStock-WVRes . Set TotHFSt=$$TELHFST^MRP(HFPRNr,StockE,BrutDim,NetDim) . If TotHFSt0 Do .Do MODWVRES^MRPSTOCK(HFPRNr,QtyWVRes) Do SETHFAR(FabKey,HFCode,HFPRNr,HFStatus,QtyRes,QtyWVRes,QtyReq,QtyWVReq) Lock -^PRSTOCK(HFPRNr) Set:QtyHF QtyRes=QtyRes\QtyHF ; aantal eindproducten ; via .Local Status;AantalEindProducten;AantalHalffabrikaten Quit SETHFAR(FabKey,HFCode,HFPRNr,Status,QtyRes,QtyWVRes,QtyReq,QtyWVReq) ; Opzetten van het activatie/reservering record in ^HADPR New HFRec Set HFRec=$G(^HADPR("F",FabKey,"AR",HFCode)) Set $P(HFRec,D,1)=HFPRNr Set $P(HFRec,D,2)=QtyRes Set $P(HFRec,D,3)=QtyWVRes Set $P(HFRec,D,4)=QtyReq Set $P(HFRec,D,5)=QtyWVReq Set $P(HFRec,D,6)=Status Set $P(HFRec,D,7)=$H Set ^HADPR("F",FabKey,"AR",HFCode)=HFRec Quit PROPAGA(HFStatus,QtyHF,HFPRNr,Status,QtyRes) ; Propagatie: overbrengen van de halffabricaat status naar de product status ; QtyRes en Status doorgeven via .Local If HFStatus="LCK" Set QtyRes=0,Status=HFStatus ; Halffabrikaat was gelockt For I=1:1:$L(HFStatus) Do . Set StatChar=$E(HFStatus,I) . Quit:Status[StatChar ; reeds aanwezig . ;Quit:Status="W",HFPRNr in Magazijn "M" . Set Status=Status_StatChar Set:QtyRes>QtyHF QtyRes=QtyHF Quit DELONE(FabKey,PRNr,Status,NoResDel,QtyRcp) ; Reservatie van alle halffabrikaten verwijderen van een eindprod New HFCode Quit:$P($G(^HADPR("F",FabKey,"K")),D,3)="A" ; Reeds productie klaar Set (Status,HFCode)="" For Set HFCode=$O(^HADPR("F",FabKey,"AR",HFCode)) Quit:HFCode="" Do Quit:Status="LCK" . Quit:$P(^HADPR("F",FabKey,"AR",HFCode),D,8)="H" ; Reeds op HalfFabrikaat gezet reservatie is reeds verwijderd . If $D(QtyRcp) && $D(^PRBS("BS",PRNr,HFCode)) Do .. Set QtyHFRcp=QtyRcp*$P(^PRBS("BS",PRNr,HFCode),D,2) .. Do DELHF(FabKey,HFCode,.Status,$G(NoResDel),QtyHFRcp) ; Gedeelte reservatie verwijderen . Else Do DELHF(FabKey,HFCode,.Status,$G(NoResDel)) ; Bestaande reservatie verwijderen Quit DELHF(FabKey,HFCode,Status,NoResDel,QtyHFRcp) ; Verwijderen van de reservatie op een halffabrikaten ; Status via .Local New HFRec,StockRec,HFPRNr Set Status="" Set HFRec=^HADPR("F",FabKey,"AR",HFCode) Set HFPRNr=$P(HFRec,D,1) Quit:'$P(HFRec,D,2) ; Niets gereserveerd dus ook niet wissen If $D(QtyRcp) Do ; Verwijderen van de reservatie beperkt tot gerecepteerd aantal . Set QtyWVRes=$P(HFRec,D,5)*QtyHFRcp/$P(HFRec,D,4) . Set:QtyWVRes>$P(HFRec,D,3) QtyWVRes=$P(HFRec,D,3),QtyHFRcp=$P(HFRec,D,2) . If 'NoResDel,$$MODWVRES^MRPSTOCK(HFPRNr,-QtyWVRes,5) ; Reservatie verwijderen . Else If 'NoResDel Set Status="LCK" Quit . Set $P(HFRec,D,2)=$P(HFRec,D,2)-QtyHFRcp . Set $P(HFRec,D,3)=$P(HFRec,D,3)-QtyWVRes . Set ^HADPR("F",FabKey,"AR",HFCode)=HFRec Else Do ; Volledige reservatie aantal verwijderen . Set QtyWVRes=$P(HFRec,D,3) . If 'NoResDel,$$MODWVRES^MRPSTOCK(HFPRNr,-QtyWVRes,5) ; Reservatie verwijderen . Else If 'NoResDel Set Status="LCK" Quit . Set $P(HFRec,D,2)="" . Set $P(HFRec,D,3)="" . Set $P(HFRec,D,6)=$TR($P(HFRec,D,6),"FPW","") ; Verwijderen van de status F, P en W . Set $P(HFRec,D,7)="" ; Tijdstip . Set ^HADPR("F",FabKey,"AR",HFCode)=HFRec Quit