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.