CreateAll() ; parameters: ProfielLijst,KlantID,SubDir,&ReturnPath,ProgType Set ReturnPath="" Quit:(%this.FreesBed.Count()=0) 1 Quit:(%this.FreesBed.GetNext("").IsLeeg()) 1 New DestinDir,Resl Set Resl=%this.CNCGetDir($G(SubDir)) ; ##class(Fabr.Frees.BedLijst).CNCGetDir($G(SubDir)) Quit:($E(Resl,1)="0") Resl ; DestinDir contains the errormessage ; Else Set DestinDir=Resl Set Resl=%this.CNCCreateProg($G(KlantID),DestinDir,$G(ProgType)) Quit:(Resl'=1) Resl ; Else Set Resl=%this.XMLCreateFile(.ReturnPath,$G(KlantID),DestinDir) Quit:(Resl'=1) Resl ; Else Set:($G(ProfielLijst)) Resl=ProfielLijst.BookAantalGelegd() Quit Resl CNCCreateProg() ; parameters: KlantID,DestinDir,ProgType New BedKey,emBed,Resl ; just to test ;Set $P(^KTO(6332,262328,0), "\", 4)="" ; Remove last if empty For Quit:(%this.FreesBed.Count()=0) Quit:('%this.FreesBed.GetPrevious("").IsLeeg()) Do %this.FreesBed.RemoveAt(%this.FreesBed.Previous("")) Set Resl=1 Set BedKey="" For Set emBed=%this.FreesBed.GetNext(.BedKey) Quit:BedKey="" Do Quit:(Resl'=1) . Set Resl=emBed.CNCCreateProg(BedKey,$G(KlantID),$G(DestinDir),$G(ProgType)) Quit Resl AlleWeghalen() ; Parameters: PLijst,Opties New emBed,BedKey,msg Set msg="" For Do Quit:(msg'="") . Set msg=%this.ProfielWeghalen($G(PLijst),,$G(Opties)) . Set:($E(msg,1)="1") msg="" . Quit:(msg'="") . Set:(%this.FreesBed.Count()=1) msg=$S(%this.FreesBed.GetAt(1).IsLeeg():"1", 1:"") Quit msg ; msg<>"" ==> foutmelding GekoppeldeWeghalen() ; Parameters: PLijst,BedKey,VakKey New OptiesPVW,Rsl Set OptiesPVW="O=PVW" Set Rsl=%this.ProfielWeghalen(PLijst,1,OptiesPVW,,BedKey,VakKey) Quit Rsl #define ErrP001 "P001;Geen ProfielLijst" #define ErrP004 "P004;Ongeldige PLIndex" #define ErrP005 "P005;Geen Profiel" #define ErrP006 "P006;Geen emBed aanwezig" #define ErrP007 "P007;emBed niet gevonden" #define ErrP009 "P009;Geen emBedVak" #define ErrP012(%v) "P012;Profiel te lang voor kaliber ("_%v_" vakken)" #define ErrU001 "U001;Geen Profiel in dit vak" #define ErrU002 "U002;Profiel is gekoppeld gelegd." ProfielWeghalen() ; Parameters: PLijst,MaxAantal,Opties,BedLijst2,BedKey,VakKey ;BedLijst.ProfielWeghalen(PLijst,MaxAantal) ;Het weghalen van profielen (van eenzelfde soort/LijstElement) werkt als volgt: ; * De positie van het laatst gelegde profiel wordt gezocht. ; * Dit wordt weggehaald, i.e. Status van emVak(ken) terug op "V"rij gezet en AantalGelegd (in ProfielElement) terug verlaagd. ; * Het vorige gelegde profiel wordt gezocht; indien dit afkomstig is van hetzelfde ProfielElement, wordt dit op dezelfde wijze als het eerste weggehaald. ; * Dit gaat zo verder totdat een ander profiel gevonden wordt, of tot het begin van de arrays (FreesBed,Vakken) bereikt is. ; * Vanaf de positie van het laatst weggehaalde profiel tot het einde van de array worden alle vakken met Status "A"utoBelet teruggezet op "V". ; ; Als het laatste bed volledig leeggemaakt is, wordt het verwijderd uit de array (FreesBed), behalve het laatste bed. ; MaxAantal is optioneel; indien niet doorgegeven, wordt gestopt bij een ander profiel. ; ; Opties: ; * O=PVW : Profiel Vrij Weghalen: d.i. profiel NIET sequentieel weghalen: BedKey en VakKey zijn verplicht door te geven, MaxAantal moet =1 zijn! ; Optie "O=GKL" is niet mogelijk in combinatie met "O=PVW"! ; * O=GKW : GeKoppeld Weghalen: roept de method %this.GekoppeldWeghalen() op voor ieder weggehaald profiel dat een emVak.Gekoppeld heeft; ; BedLijst2 is verplicht door te geven! ; * O=PZK : alleen Profielen Zonder Koppeling weghalen: dwz. als emVak.Gekoppeld ingevuld is, dan NIET weghalen ; Quit:('$G(PLijst)) $$$ErrP001 If $G(Opties)["O=PVW" Do . If Opties["O=GKW" Set Opties=$$REPLACE^vhRtn1(Opties,"O=GKW","") New emBed,PLIndex,PLElem,emProf,ProfVakken,PMaxVak,MultipleBed,UndoAantal,blnStop ; ,BedKey,VakKey New msg Set msg="" Set blnStop=0 Set UndoAantal=0 Set:($G(Opties)["O=PVW") MaxAantal=1 Set:(+$G(MaxAantal)'>0) MaxAantal=999999 Set PLIndex="" ; emBed bepalen: laatste bed opzoeken If $G(Opties)["O=PVW", $G(BedKey)>0 Set emBed=%this.FreesBed.GetAt(BedKey) Else Do . Set BedKey="" . Set emBed=%this.FreesBed.GetPrevious(.BedKey) Quit:(BedKey="") $$$ErrP006 Quit:('emBed) $$$ErrP007 Set MultipleBed=$S(emBed.EindeVolgNr>BedKey:emBed.EindeVolgNr-BedKey+1, 1:1) ; blnStop wordt op 1 gezet als: ; * BedKey=1 en VakKey=1 (begin van BedLijst bereikt) ; * Een ander profiel gevonden wordt ; * MaxAantal bereikt EN één van vorige voorwaarden voldaan For Quit:(msg'="") Do Quit:(blnStop) ; Quit:(UndoAantal'0) . Set msg=$$prwRemoveFromBed Quit:(msg'="") msg ; msg<>"" ==> foutmelding Do prwUndoAutoBelet(VakKey) Set PMaxVak=$$prwDetermineMaxVak Do prwRecalcAutoBelet Quit "1;"_$G(PLIndex) prwRemoveFromBed() ; Deze routine blijft binnen 1 emBed. ; Verwijdert sequentieel de profielen van dit bed (van achter naar voor uiteraard) ... : ; ... tot een ander profiel (PLIndex '=) gevonden is, of het maximum aantal bereikt is, of totdat het bed leeg is. ; Als het bed leeg is, wordt het verwijdert. New msg,blnOtherProf,emVak Set msg="" Set blnOtherProf=0 If $G(Opties)["O=PVW", UndoAantal=0, $G(VakKey)>0 Do ; Niks, gebruik doorgegeven VakKey Else Set VakKey="" For Quit:(msg'="") Do Quit:(blnOtherProf) Quit:(VakKey'>0) Quit:(UndoAantal'<$G(MaxAantal,999999)) . Set msg=$$prwRemoveLastProf Quit:(msg'="") msg ; msg<>"" ==> foutmelding If VakKey="" Do . ; Laatste profiel van emBed weggehaald, emBed is dus leeg: verwijder emBed . Set:(BedKey=1) blnStop=1 . Do prwRemoveCurrentBed Else If blnOtherProf Do . Set blnStop=1 ;Else If UndoAantal'"" ==> foutmelding . Set msg=$$prwVakBepalenPVW Else Do . For Do emBed.PreviousVak(.VakKey) Quit:(VakKey'>0) Set emVak=emBed.Vakken.GetAt(VakKey) Quit:(emVak.BezetCode="P") Quit:(VakKey'>0) "" ; Begin van het emBed bereikt. ; Else: Profiel gevonden If PLIndex="" Do ; Alleen de eerste keer dat een profiel wordt weggehaald . Set msg=$$prwInitializeProf Quit:($G(msg)'="") msg ; msg<>"" ==> foutmelding If UndoAantal'0) Do Quit ; alleen Profielen Zonder Koppeling weghalen .. Set blnOtherProf=1 .. Set msg=$$$ErrU002 . Do prwProfWeghalen(emBed.GetRij(VakKey),emBed.GetKolom(VakKey),ProfVakken) . Do prwSetProfsTeruggelegd(MultipleBed) Else Do ; Profiel is van een ander LijstElement: stoppen met weghalen . Set blnOtherProf=1 Quit msg prwVakBepalenPVW() Set emVak=emBed.Vakken.GetAt(VakKey) Quit:('emVak) $$$ErrP009 Quit:(emVak.BezetCode'="P") $$$ErrU001 Quit "" prwInitializeProf() ; Initiaisatie van PLIndex,PLElem,emProf,ProfVakken en ev. UndoAantal Set PLIndex=emVak.ProfielLijstIndex Set PLElem=PLijst.Profielen.GetAt(PLIndex) Quit:('PLElem) $$$ErrP004 Set emProf=PLElem.Profiel Quit:('emProf) $$$ErrP005 Set ProfVakken=emBed.BedDef.VakAantal(emProf.Lengte) Quit:(ProfVakken>emBed.MaxKolom()) $$$ErrP012(ProfVakken) Quit "" prwProfWeghalen(VakRij,VakKol,ProfVakken) ; Profiel uit Vak wissen; i.e. gegevens in emVak leegmaken ; !!! DO NOT pass ProfVakken by Reference !!! It will be modified in case emProf is too long! New i,NVakken,VakKeyGKL,Rsl Set:($G(Opties)["O=GKW") VakKeyGKL=emVak.Gekoppeld Set:(VakKol+ProfVakken-1>emBed.MaxKolom()) ProfVakken=emBed.MaxKolom()-VakKol+1 For i=0:1:ProfVakken-1 Do . Do emBed.Vakken.GetAt(emBed.GetRijKolomKey(VakRij,VakKol+i)).Invullen("","","V","","","") ; Vak op "V"rij zetten Do emBed.SetProfielBeperking() ; Wijzigingen aanduiden in UpdateArray Do PLijst.UpdateArraySet("PL"_+(PLijst),PLIndex,1) Do PLijst.UpdateArraySet("BL"_+(%this),,1) ; Gekoppeld Profiel If $G(Opties)["O=GKW", $G(BedLijst2), $G(VakKeyGKL)>0 Do . ; Vanuit het oorspronkelijke vak het gekoppelde vak leegmaken ;, en bij positief resultaat de gekoppelde VakKey invullen . Set Rsl=BedLijst2.GekoppeldeWeghalen(PLijst,BedKey,VakKeyGKL) . Set:($E(Rsl,1,2)'="1;") $ECODE=",UFout bij gekoppeld weghalen," Quit prwSetProfsTeruggelegd(N) ; Update data in ProfielElement + increase UndoAantal Set UndoAantal=UndoAantal+N Set PLElem.AantalGelegd=PLElem.AantalGelegd-N Set:(PLElem.AantalGelegd<0) PLElem.AantalGelegd=0 Set:(PLElem.Status="F") PLElem.Status="E" ; Enabled Set PLElem.ErrorStatus="" Quit prwRemoveCurrentBed ; Laatste bed van de array verwijderen, tenzij er nog maar slechts één aanwezig is (i.e. het eerste) Quit:(%this.FreesBed.Previous("")'=BedKey) ; Alleen als laatste bed If BedKey=1 Do . ; Do NOT Remove first bed; Only reset EindeVolgNr . Set emBed.EindeVolgNr="" . Set emBed.GekoppeldActief=1 Else Do . Do emBed.%Close() . Do %this.FreesBed.RemoveAt(BedKey) . Set BedKey="" . Set emBed=%this.FreesBed.GetPrevious(.BedKey) . Set MultipleBed=$S(emBed.EindeVolgNr>BedKey:emBed.EindeVolgNr-BedKey+1, 1:1) Quit prwUndoAutoBelet(VakKey) ; Alle vakken vanaf VakKey tot einde v/d array op Vrij zetten indien AutoBelet ; Daarna RecalcAutoBelet() uitvoeren met nieuwe PMaxVak (ook nog te bepalen) ; !!! DO NOT pass VakKey by Reference !!! New emVak If VakKey>0 Do . Set emVak=emBed.Vakken.GetAt(VakKey) . Set:(emVak) emBed.GekoppeldActief=(+emVak.Gekoppeld>0) For Do emBed.NextVak(.VakKey) Quit:(VakKey'>0) Do ; Vakken aflopen kolom per kolom, dus niet via emBed.Vakken.GetNext(), want dat is rij per rij . Set emVak=emBed.Vakken.GetAt(VakKey) . Set:(emVak.BezetCode="A") emVak.BezetCode="V" Quit prwRecalcAutoBelet ; Over de lengte van het profiel (#ProfVakken): alle vrije vakken van iedere rij op AutoBelet zetten (behalve in VakKol zelf) New i,Rij,VakKol,emVak Quit:(PMaxVak<2) Set VakKol=emBed.GetKolom(VakKey) For Rij=1:1:emBed.MaxRij() Do . For i=VakKol+1:1:VakKol+PMaxVak-1 Do .. Set emVak=emBed.Vakken.GetAt(emBed.GetRijKolomKey(Rij,i)) .. Set:(emVak.BezetCode="V") emVak.BezetCode="A" ; AutoBelet, i.e. Niet-Positioneerbaar Quit prwDetermineMaxVak() ; Zoekt het langste profiel in de kolom bepaald door VakKey, en geeft het aantal vakken terug New Rij,Kol,emVak,PMaxVak,emProf,NVak Set PMaxVak=0 Set Kol=emBed.GetKolom(VakKey) For Rij=1:1:emBed.MaxRij() Do . Set emVak=emBed.Vakken.GetAt(emBed.GetRijKolomKey(Rij,Kol)) . Quit:('emVak) ; Error . If emVak.BezetCode="P", emVak.ProfielLijstIndex>0 Do .. Set emProf=PLijst.Profielen.GetAt(emVak.ProfielLijstIndex).Profiel .. Quit:('emProf) .. Set NVak=emBed.BedDef.VakAantal(emProf.Lengte) .. Set:(NVak>PMaxVak) PMaxVak=NVak Quit PMaxVak