How to list “ProcessOnly” Reports in Dynamics NAV 2009

I was doing my “daily NAV tour” on Mibuso and NAV Community forums when I spotted the following 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 applies to NAV new versions only (2015 and later). I could not resist the challenge. Hence my blog post to suggest a solution that applies for all old NAV versions (all version might be a big word because I tested the code in a 2009 R2 database only 😉 )

Let’s get straight to the point. Here are the variables I used:

Name DataType Subtype Length
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

and the code:

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); 

And of course, the code adapted for NAV new versions (NAV 2016 in my test) 😉

Name DataType Subtype
TempObject Record AllObj
AllObj Record AllObj
TempBlob Record TempBlob
ObjectMetadata Record Object Metadata
XMLDOMManagement Codeunit XML DOM Management
XmlDocument DotNet System.Xml.XmlDocument.’System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′
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);
This blog is available also on Microsoft Dynamics NAV Community

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s