BL.Derde.KlantSpecifiek,BL.Derde.LevSpecifiek,Prod.Product,vhLib.Macro 1 %RegisteredObject Property pxDoc As BL.Prod.sub.pxVoorraadTelSettings; 30 BL.Prod.VoorraadTellingDoc %Integer %List
  • -99: telnummer na update van de stock en aanmaak van de kredietnota : Verwijderd in code
  • -1 : telnummer na de import van de producten
  • InitieleTelling1 : initiële telling 1
  • InitieleTelling2 : initiële telling 2
  • ...: eigenlijke hertellingen ]]> %String Instelling van de sortkey %String
  • 1: basistype
  • 2: status
  • 3: multiprod
  • 4: voorraadtype
  • 5: toegevoegde zone
  • 6: voorraad
  • 7: verschil
  • 8: lijstnummer
  • ]]>
    %List
    Lijst met producten om af te drukken om de printer BL.Prod.VoorraadTelSettingsList %String Initieel 1 %String Initieel 2 DOM.PM.ProductRolAPI 1 BL.Sys.FOP.DocBaseV7Helper 1 BL.Sys.FOP.DocBaseDirectoryUtils 1 1 jobnr:%Numeric Aanmaken van een tabel met de productgegevens. De oude tabel wordt gewist %Numeric Zoekt de verschillende productiezones van een product Hoekkast, Keller, V1 en alle andere. 1 Toevoegen van een product aan de lijst PRNr:%Numeric,ManueelToegevoegd:%Boolean 5, dan worden producten niet gegroepeerd #dim VoorraadWerkVloer As %Integer = $Piece($G(^PRSTOCK("D",PRNr)),"\",5) If ((VoorraadWerkVloer>0) && '..ProductRolAPI.IsMoederVanEenBedoeldKindProduct(PRNr)){ If 'ManueelToegevoegd Set ^HULP(..%J,"Prod",PRNr)="" #dim xStock As %String = $G(^PRSTOCK("D",PRNr)) #dim VoorraadReservatie As %String = $Piece(xStock,"\",6) Do ..VulInfo(PRNr,VoorraadWerkVloer,VoorraadReservatie,ManueelToegevoegd) } }Else{ #dim TotWerkVloer,TotReservatie As %Integer = 0 #dim AantMP As %Integer = 0 #dim MoederProductIDIt As TECH.Iterator = ..ProductRolAPI.GeefBedoeldKindProduct(PRNr).GeefMoederProductIDIterator() While MoederProductIDIt.HasNext() { #dim MoederProductID As %String = MoederProductIDIt.Next() #dim AantalVoorraadTelling As %String = 0 #dim AantalMultiple As %String = 0 If ManueelToegevoegd &sql(Select count(1) into :AantalVoorraadTelling from Prod.VoorraadTelling where (Product->ProductNr)=:MoederProductID) If ManueelToegevoegd &sql(Select count(1) into :AantalMultiple from Prod.VoorraadTelling_MultipleProducts where MultipleProducts_Product->ProductNr=:MoederProductID) If ('ManueelToegevoegd) || ( ManueelToegevoegd && (AantalVoorraadTelling>0) && (AantalMultiple>0)){ If (('$D(^HULP(..%J,"Prod",MoederProductID)))) { Set ^HULP(..%J,"Prod",MoederProductID)="" Set xStock=$G(^PRSTOCK("D",MoederProductID)) Set VoorraadWerkVloer=+$Piece(xStock,"\",5) Set VoorraadReservatie=+$Piece(xStock,"\",6) Do ..LaatsteWijziging(MoederProductID,.LaatsteInvoer,.LaatsteVerwerking) If (+VoorraadWerkVloer&+LaatsteInvoer&+LaatsteVerwerking){ ; een product met stock en met bewegingen wordt toegevoegd Set AantMP=AantMP+1 Set TotWerkVloer=TotWerkVloer+VoorraadWerkVloer Set TotReservatie=TotReservatie+VoorraadReservatie Set Lst(VoorraadWerkVloer,MoederProductID)="" Set Zone=$Piece($G(^KPR(PRNr,15)),"\",12) Set Lst1(MoederProductID)=VoorraadWerkVloer_"\"_LaatsteInvoer_"\"_LaatsteVerwerking } } } } If AantMP > 0{ Set Voorraad=$O(Lst(""),-1) Set MoederProductID = $O(Lst(Voorraad,"")) Do ..VulInfo(MoederProductID,TotWerkVloer,TotReservatie,ManueelToegevoegd,.Lst1) } } ]]> Invullen van de eigenschappen in het productobject m.i.v. de multiproducts 1 MPLaatsteVerwerking) Set MPLaatsteVerwerking=LaatsteVerwerking . . If +LaatsteInvoer,(LaatsteInvoer>MPLaatsteInvoer) Set MPLaatsteInvoer=LaatsteInvoer . . Set oMP=##class(DS.Prod.VoorraadTellingMultiProd).%New() . . Do oMP.ProductSetObjectId(PR1) . . Set oMP.WerkVloerBefore=WerkVloerBefore . . Do ..ZoekZone(PR1,.ZoneLst,.SubZoneLst) ;de zone van een subproduct wordt toegevoegd aan de zone van het hoofdproduct . . Do oProd.MultipleProducts.SetAt(oMP,PR1) . Set oProd.Zones=ZoneLst . Set oProd.SubZones=SubZoneLst . Set oProd.LaatsteInvoer=MPLaatsteInvoer ;de laatste invoer= de laaste invoer over alle subproducten . Set oProd.LaatsteVerwerking=MPLaatsteVerwerking ;de laatste verwerking= de laatste verwerking van alle subproducten Else Do . ; invullen van de info van een gewoon product . Do ..ZoekZone(PRNr,.ZoneLst,.SubZoneLst) . Set oProd.Zones=ZoneLst . Set oProd.SubZones=SubZoneLst . Set Lst(PRNr)="" . Do ..LaatsteWijziging(PRNr,.LaatsteInvoer,.LaatsteVerwerking) . Set oProd.LaatsteInvoer=LaatsteInvoer . Set oProd.LaatsteVerwerking=LaatsteVerwerking Do oProd.Save() ]]> Zoekt de laatste invoer en de laatste verwerking van een product 1 1 LaatsteInvoer Set LaatsteInvoer=Datum . Else If (Type="H")&&'VerwerkingGevonden Do . . Set VerwerkingGevonden=1 . . If Datum>LaatsteVerwerking Set LaatsteVerwerking=Datum If LaatsteInvoer=0 Set LaatsteInvoer="" If LaatsteVerwerking=0 Set LaatsteVerwerking="" ]]> ProductID:%String,ElementKey:%Integer Opslaan van de getelde stock in de global ^PRSTOCK en ^PRHIST. 1 %Status StockTyp,Aktie,PRNr,Aantal,Ref 1 0 Verdelen van de getelde voorraden over de subproducten van een product 1 0&(i'>Verschil) Set BerekendeSubTelling=BerekendeSubTelling+1 . . If Verschil<0&((-i)'0&(i'>Verschil) Set BerekendeSubTelling=BerekendeSubTelling+1 . . If Verschil<0&((-i)' Toevoegen van een getelde hoeveelheid TelNr:%Integer,PRNr:%Numeric,Aantal:%Numeric 1 %Status Aantal:%Numeric 1 6 { Set Exceptie = ##class(TECH.Exceptions.InvalidInputException).%New("Het ingegeven aantal moet kleiner zijn dan 1000000 of mag maximum 6 karakters bevatten.") Do Exceptie.VoegToeExtraInfo("Aantal: "_Aantal) Do ##class(TECH.ExceptionHandler).Throw(Exceptie) } If '$IsValidNum(Aantal){ Set Exceptie = ##class(TECH.Exceptions.InvalidInputException).%New("Het ingegeven aantal is geen geldige waarde.") Do Exceptie.VoegToeExtraInfo("Aantal: "_Aantal) Do ##class(TECH.ExceptionHandler).Throw(Exceptie) } ]]> Wijzigen van een getelde hoeveelheid ProductID:%String,ElementKey:%Numeric,Aantal:%Numeric %Status ProductID:%String 1 0 { #dim PositieVorigeTelling As %Integer = PositieHuidigeTelling + 1 #dim VorigTellingNummer = HertellijstNummers.GetAt(PositieVorigeTelling) Set VoorraadTellingAantalIt = ##class(TECH.ListIterator).%New(..GeefTellingenVoorLijstNummer(ProductID,VorigTellingNummer)) While VoorraadTellingAantalIt.HasNext() { #dim NieuwVoorraadTellingAantal As DS.Prod.VoorraadTellingAantal = VoorraadTellingAantalIt.Next().%ConstructClone() Set NieuwVoorraadTellingAantal.TellingNr = ..HertelNr Do VoorraadTelling.VoegToeAanTellingen(NieuwVoorraadTellingAantal) } } Do ..ZetTellingStatus(ProductID,##class(DS.Prod.enu.TellingStatus).Ingegeven()) Do VoorraadTelling.Save() TCOMMIT }Catch{ Set Exception = ##class(TECH.ExceptionHandler).Catch() TROLLBACK Do ##class(TECH.ExceptionHandler).Rethrow(Exception) } ]]> Controleert de status als het scherm productdetail wordt gesloten ProductID:%String,TellingStatus:DS.Prod.enu.TellingStatus,Forceer:%Boolean=0 %Status ProductID:%String,TellingNr:%Integer ProductID:%String,ElementKey:%Numeric %Status 1 Activeren of desactiveren van een subproduct van een multiproduct PRNr:%Numeric,ElementKey:%Numeric,Actief:%Boolean Afdrukken van de tellingen van alle producten van één hertelling Printer:%String,ReeksZones:%String 1 %Status Printer:%String,IsInitieleLijst:%Boolean=0,InitieelNr:%Integer=0,IniteelLabel:%String="" 1 1 %Status Afdrukken van de tellingen van alle producten van één hertelling Printer:%String,ReeksZones:%String %Status pxDoc:BL.Prod.sub.pxVoorraadTelSettings,Printer:%String 1 1 ")_" "_pxDoc.TellingOms_".pdf" #dim FilePath As %String = $$FULLPAD^vhDEV($$DIRUSER^vhDEV(),FileName) If (FilePath = "") || ($L(FilePath,"\")<=2) { Do ##class(TECH.ExceptionHandler).Throw(##class(TECH.Exceptions.GeneralErrorException).%New("Kon geen correct pad genereren om '"_pxDoc_"' te printen naar printer '"_Printer_"'. Pad : '"_FilePath_"'")) } Do ##class(vhLib.Logger).%New("VoorraadTelling").Info("PrintOne","Print naar bestand : "_FilePath) Set:$$$ISOK(sc) sc=..blVoorraadtellingDoc.RenderAndFile(..pxDocList,FilePath) #dim PrintPath As %String = ##class(TECH.Config.ConfigMgr).Instance().GeefString("APPS.PM.Maatwerk.Doc_XMLPrint_WatchFolderDir") #dim SubPath As %String = ##class(BL.Legacy.PrinterMapping).FOPPrinterNaamNaarWatchFolder(Printer) If SubPath = "" { Do ##class(TECH.ExceptionHandler).Throw(##class(TECH.Exceptions.InvalidInputException).%New("Er kan niet geprint worden naar de printer : "_Printer_".")) } Set PrintPath = ##class(TECH.Files).AppendSubPath(PrintPath,SubPath) Set FileName = $tr($zts,",.")_FileName Set PrintPath = ##class(TECH.Files).AppendFile(PrintPath,FileName) Do ##class(TECH.Files).CopyFile(FilePath,PrintPath) Do ..pxDocList.Settings.Clear() Quit sc ]]> pxDoc:BL.Prod.sub.pxVoorraadTelSettings,Printer:%String 1 1 NEW method : use with DocBase v7 on DocBase01-DEV/ACP/PRD pxDoc:BL.Prod.sub.pxVoorraadTelSettings,Printer:%String 1 1 ")_"_"_pxDoc.TellingOms_".pdf" #dim FilePathOnShared As %String = $$FULLPAD^vhDEV($$DIRUSER^vhDEV(),FileName) If (FilePathOnShared = "") || ($L(FilePathOnShared,"\")<=2) { Do ##class(TECH.ExceptionHandler).Throw(##class(TECH.Exceptions.GeneralErrorException).%New("Kon geen correct pad genereren om '"_pxDoc_"' te printen naar printer '"_Printer_"'. Pad : '"_FilePathOnShared_"'")) } Do Logger.Info("PrintOne","Print naar bestand : "_FilePathOnShared) #dim DirectoryOnDfs As %String = ..DocBaseDirectoryUtils.GeefPDFTestDir() ; Indien DFS problemen geeft, gebruik dan effe "\\Notes01\FOP\TestOutput\CacheTst2010\" #dim FilePathOnDfs As %String = ##class(TECH.Files).AppendFile(DirectoryOnDfs,FileName) #dim sc As %Status = $$$OK // 1. RenderAndFile via DFS Set sc=..blVoorraadtellingDoc.RenderAndFile(..pxDocList,FilePathOnDfs) Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(sc,"Error while generating 'VoorraadTellingDoc'. Failed to create DocBase task for '"_FileName_"'.") // 2. Wait until caché can see #dim lbWaitSeconds = $ListBuild(1,1,1,1,2,2,3,4,5,5,5) #dim blnFileExists As %Boolean = ##class(TECH.Files).WaitUntilFileExists(FilePathOnDfs, lbWaitSeconds, Logger, "Render VoorraadTellingDoc", "RenderAndFile.FilePath: ") Do:($$$Not(blnFileExists)) ##class(TECH.Exceptions.GeneralErrorException).Throw("Error while generating 'VoorraadTellingDoc' for '"_FileName_"'. After DocBase task 'RenderAndFile' caché-server could not find file '"_FilePathOnDfs_"'. ") // 3. Print file (from DFS) to Printer --> 2 gekende problemen : zie (*) Do ##class(BL.Sys.FOP.CommonTasks).PrintPDF(FilePathOnDfs,Printer,1) Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(sc,"Error while generating 'VoorraadTellingDoc'. DocBase failed to print file '"_FilePathOnDfs_"'.") // 4. Copy file to Shared-dir Do ##class(TECH.Files).CopyFile(FilePathOnDfs,FilePathOnShared) // 5. Clean up file on DFS #dim IsFileDeleted As %Integer = 0 ; ##class(TECH.File).Delete(FilePathOnDfs) Do Logger.Info("PrintOne","Opkuis VoorraadTellingDoc : bestand : '"_FilePathOnDfs_"' is "_$S(IsFileDeleted=1 :"verwijderd.", 1:"NIET verwijderd (result='"_IsFileDeleted_"'")) Do ..pxDocList.Settings.Clear() Quit sc ]]> NEW method : use with DocBase v7 on DocBase01-DEV/ACP/PRD pxDoc:BL.Prod.sub.pxVoorraadTelSettings,Printer:%String 1 1 ")_"_"_pxDoc.TellingOms_".pdf" #dim FilePathOnShared As %String = $$FULLPAD^vhDEV($$DIRUSER^vhDEV(),FileName) If (FilePathOnShared = "") || ($L(FilePathOnShared,"\")<=2) { Do ##class(TECH.ExceptionHandler).Throw(##class(TECH.Exceptions.GeneralErrorException).%New("Kon geen correct pad genereren om '"_pxDoc_"' te printen naar printer '"_Printer_"'. Pad : '"_FilePathOnShared_"'")) } Do Logger.Info("PrintOne","Print naar bestand : "_FilePathOnShared) #dim DirectoryOnDfs As %String = ..DocBaseDirectoryUtils.GeefPDFTestDir() ; Indien DFS problemen geeft, gebruik dan effe "\\Notes01\FOP\TestOutput\CacheTst2010\" #dim FilePathOnDfs As %String = ##class(TECH.Files).AppendFile(DirectoryOnDfs,FileName) #dim sc As %Status = $$$OK // 1a. RenderAndPrint (in PostScript formaat) Set sc=..blVoorraadtellingDoc.RenderAndPrint(..pxDocList,Printer) Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(sc,"Error while generating 'VoorraadTellingDoc'. Failed to create DocBase task for printer '"_Printer_"'.") // 1b. RenderAndFile via DFS Set sc=..blVoorraadtellingDoc.RenderAndFile(..pxDocList,FilePathOnDfs) Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(sc,"Error while generating 'VoorraadTellingDoc'. Failed to create DocBase task for '"_FileName_"'.") // 2. Wait until caché can see #dim lbWaitSeconds = $ListBuild(1,1,1,1,2,2,3,4,5,5,5) #dim blnFileExists As %Boolean = ##class(TECH.Files).WaitUntilFileExists(FilePathOnDfs, lbWaitSeconds, Logger, "Render VoorraadTellingDoc", "RenderAndFile.FilePath: ") Do:($$$Not(blnFileExists)) ##class(TECH.Exceptions.GeneralErrorException).Throw("Error while generating 'VoorraadTellingDoc' for '"_FileName_"'. After DocBase task 'RenderAndFile' caché-server could not find file '"_FilePathOnDfs_"'. ") // 3. Print file (from DFS) to Printer --> 2 gekende problemen : zie (*) ;Do ##class(BL.Sys.FOP.CommonTasks).PrintPDF(FilePathOnDfs,Printer,1) ;Do ##class(TECH.Exceptions.StatusException).ThrowIndienNietOK(sc,"Error while generating 'VoorraadTellingDoc'. DocBase failed to print file '"_FilePathOnDfs_"'.") // 4. Copy file to Shared-dir Do ##class(TECH.Files).CopyFile(FilePathOnDfs,FilePathOnShared) // 5. Clean up file on DFS #dim IsFileDeleted As %Integer = ##class(TECH.File).Delete(FilePathOnDfs) Do Logger.Info("PrintOne","Opkuis VoorraadTellingDoc : bestand : '"_FilePathOnDfs_"' is "_$S(IsFileDeleted=1 :"verwijderd.", 1:"NIET verwijderd (result='"_IsFileDeleted_"'")) Do ..pxDocList.Settings.Clear() Quit sc /* Gekende problemen bij Print file (from DFS) to Printer : - [OK] Printer moet PDF ondersteunen; - [OK] hoe DFS aan DocBase doorgeven : Log van DocBase : Error occurred while trying to read 'file:///\\vanhoecke.be\APPS\DEV\DocBase\PDFTest\VoorraadTel_onbekend_TestByWimV.pdf'. - [CHECK] Als punt 3 de printopdracht is (lees: Zet FopTaak op de FopQueue en ga voort), dan volgt meteen punt 4 en 5, zijnde kopieer en kuis op. Dus als de opkuis eerder gebeurt dan dat DocBase begint te printen, dan is de file weg en zal DocBase fout geven "file not found" ! Conclusie : misschien toch eenvoudiger om 2x DocBase aan te roepen : 1x RenderAndPrint (.PS-formaat) en 1x RenderAndFile (.PDF) */ ]]> Controleert of er zones zijn die in beide lijsten staan PRNr:%Numeric,Zones:%List,SelZones:%String Sorteersleutel berekenen PRNr:%String Beperkingen:%List Zone:%String HertelNr:%String Zonetekst opzoeken Zone:%String %String ") Set txtZone=txtZone_" "_$Piece(Zone," ",2,99) If $E(txtZone,$L(txtZone))=" " Set txtZone=$E(txtZone,1,$L(txtZone)-1) Quit txtZone ]]> Export van een textbestand van alle producten met de getelde aantallen Directory:%String,FileName:%String PRNr:%String,Week:%String Week ; LeverWeek ligt verder in de toekomst . . . If FaktorH Do ; Als er geen KOM-link is, dus product is reeds gefabriceerd en de halffabr reeds in mindering gebracht . . . . Set Aantal=$P(TLRec,"\",3)*(FaktorH) . . . . Set TotaalH=TotaalH+Aantal . . . . Set:$P($G(^HADPR("F",FabKey,"K")),"\",3)="A" TotaalK=TotaalK+Aantal ; Reeds productie klaar . . . . Set:$P($G(^HADPR("F",FabKey,"A")),"\",3)="A" TotaalA=TotaalA+Aantal ; Reeds productie actief ; Totaal \ ActiefHalffabk \ KlaarGezetHalffabr Quit $LB(TotaalH,TotaalA,TotaalK) ]]> %Boolean %Integer HertelNr:%String %Integer %Integer %Integer TellingStatus:DS.Prod.enu.TellingStatus 1 %Integer TellingStatus:DS.Prod.enu.TellingStatus 1 %Integer Zone:%String %ArrayOfDataTypes Overzicht producten %SQLQuery KortTekst from Prod.VoorraadTelling order by Product->KortTekst]]> Overzicht van de tellingen per artikel en tellingnummer %SQLQuery PRNr Product As PRNr, Tellingen_OpslagZone, Tellingen_ToegevoegdeOpslagZone, sum(Tellingen_Aantal) as Aantal , Tellingen_TellingNr as TelNr from Prod.VoorraadTelling_Tellingen where VoorraadTelling->Product=:PRNr and (Tellingen_ToegevoegdeOpslagZone=1) group by VoorraadTelling->Product, Tellingen_OpslagZone,Tellingen_TellingNr order by VoorraadTelling->Product]]> %SQLQuery KortTekst,LaatsteVerwerking,WerkVloerBefore,ReservatieBefore from Prod.VoorraadTelling]]> 1 ProductID:%String,Hertelnummer:%Integer %ListOfObjects ELEMENTYPE="DS.Prod.VoorraadTellingAantal" Product = ? AND Tellingen_TellingNr = ?" #dim RS As %ResultSet = $$ExecDynQuery^vhLib.Query(Query,$LB(ProductID,Hertelnummer)) While RS.Next() { Set VoorraadTellingAantal = ##class(DS.Prod.VoorraadTellingAantal).%New() Set VoorraadTellingAantal.Aantal = RS.Data("Aantal") Set VoorraadTellingAantal.OpslagZone = RS.Data("OpslagZone") Set VoorraadTellingAantal.Gebruiker = RS.Data("Gebruiker") Set VoorraadTellingAantal.ToegevoegdeOpslagZone = RS.Data("ToegevoegdeOpslagZone") Set VoorraadTellingAantal.TellingNr = Hertelnummer Set VoorraadTellingAantal.ElementKey = RS.Data("ElementKey") Do Tellingen.Insert(VoorraadTellingAantal) } Quit Tellingen ]]> 1 ProductID:%String,Hertelnummer:%Integer %Integer Product = ? AND Tellingen_TellingNr = ?" #dim RS As %ResultSet = $$ExecDynQuery^vhLib.Query(Query,$LB(ProductID,Hertelnummer)) While RS.Next() { Set TotaalAantal = RS.Data("TotaalAantal") } Quit TotaalAantal ]]> %Library.CacheStorage ^BL.Prod.VoorraadTellingD VoorraadTellingDefaultData ^BL.Prod.VoorraadTellingD ^BL.Prod.VoorraadTellingI ^BL.Prod.VoorraadTellingS %%CLASSNAME