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
Oproepen via :
Do ##class(BL.Prod.VoorraadTelling).PrintTestByWimV( , , )
1
Printer:%String="VHIP2",InitieelNr:%Integer=0,IniteelLabel:%String="TestByWimV"
1
Test method
Printer:%String,InitieelNr:%Integer=0,IniteelLabel:%String=""
1
1
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