How to List ProcessOnly Reports in Dynamics NAV 2009
While browsing Mibuso and NAV Community forums, I spotted this question:
I have about 300 new reports in my NAV database and I need to write down the names of only those that are not ProcessingOnly. Do you know any smart way how to do this quick?
A member suggested an answer, but it only applies to NAV 2015 and later. I couldn’t resist the challenge—so here’s a solution that works for older NAV versions (tested on 2009 R2).
Variables Used
| Name | Type | Subtype / Description |
|---|---|---|
| TempObject | Record | AllObj |
| AllObj | Record | AllObj |
| ObjectMetadata | Record | Object Metadata |
| XMLDocument | Automation | ’Microsoft XML, v6.0’.DOMDocument60 |
| InStr | InStream | |
| TempFile | File | |
| TempFileName | Text | 250 |
| TempString | Text | 1024 |
Code for NAV 2009 (Classic Client)
ObjectMetadata.SETRANGE("Object Type", ObjectMetadata."Object Type"::Report);
// Filter On report ID if needed
// ObjectMetadata.SETFILTER("Object ID", 'MyFilter');
IF ObjectMetadata.FINDSET THEN
REPEAT
ObjectMetadata.CALCFIELDS(Metadata);
IF ObjectMetadata.Metadata.HASVALUE THEN BEGIN
TempFileName := DELCHR(TEMPORARYPATH + FORMAT(CREATEGUID) + '.xml', '=', '{}-');
TempFile.CREATE(TempFileName);
TempFile.WRITEMODE := TRUE;
TempFile.TEXTMODE := TRUE;
ObjectMetadata.Metadata.CREATEINSTREAM(InStr);
InStr.READTEXT(TempString, 1024);
WHILE NOT InStr.EOS DO BEGIN
CLEAR(TempString);
InStr.READTEXT(TempString, 1024);
TempFile.WRITE(TempString);
END;
TempFile.CLOSE;
IF ISCLEAR(XMLDocument) THEN
CREATE(XMLDocument);
XMLDocument.load(TempFileName);
FILE.ERASE(TempFileName);
// 1 is ProcessOnly, 0 Others
IF XMLDocument.selectSingleNode('Report/ProcessingOnly').text = '0' THEN BEGIN
AllObj.GET(ObjectMetadata."Object Type", ObjectMetadata."Object ID");
TempObject.INIT;
TempObject.TRANSFERFIELDS(AllObj);
TempObject.INSERT;
END;
END;
UNTIL ObjectMetadata.NEXT = 0;
FORM.RUNMODAL(FORM::"All Objects", TempObject);
Code for Newer NAV Versions (NAV 2016+)
| Name | Type | Subtype / Description |
|---|---|---|
| TempObject | Record | AllObj |
| AllObj | Record | AllObj |
| TempBlob | Record | TempBlob |
| ObjectMetadata | Record | Object Metadata |
| XMLDOMManagement | Codeunit | XML DOM Management |
| XmlDocument | DotNet | System.Xml.XmlDocument |
ObjectMetadata.SETRANGE("Object Type", ObjectMetadata."Object Type"::Report);
// ObjectMetadata.SETFILTER("Object ID", '3');
IF ObjectMetadata.FINDSET THEN
REPEAT
ObjectMetadata.CALCFIELDS(Metadata);
IF ObjectMetadata.Metadata.HASVALUE THEN BEGIN
TempBlob.Blob := ObjectMetadata.Metadata;
XMLDOMManagement.LoadXMLDocumentFromText(TempBlob.ReadAsText('', TEXTENCODING::UTF8), XmlDocument);
IF XMLDOMManagement.FindNodeText(XmlDocument, 'Report/ProcessingOnly') = '0' THEN BEGIN
AllObj.GET(ObjectMetadata."Object Type", ObjectMetadata."Object ID");
TempObject.INIT;
TempObject.TRANSFERFIELDS(AllObj);
TempObject.INSERT;
END;
END;
UNTIL ObjectMetadata.NEXT = 0;
PAGE.RUNMODAL(PAGE::"All Objects", TempObject);
Related: Text encoding in NAV 2009 R2 Classic Client – Part 2
Print to different trays in NAV – Part 1
Dynamics NAV Web Client: Filters & FlowFilters on pages
Have questions or suggestions? Reach out via LinkedIn or Twitter.