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

NameTypeSubtype / Description
TempObjectRecordAllObj
AllObjRecordAllObj
ObjectMetadataRecordObject Metadata
XMLDocumentAutomation’Microsoft XML, v6.0’.DOMDocument60
InStrInStream
TempFileFile
TempFileNameText250
TempStringText1024

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

NameTypeSubtype / Description
TempObjectRecordAllObj
AllObjRecordAllObj
TempBlobRecordTempBlob
ObjectMetadataRecordObject Metadata
XMLDOMManagementCodeunitXML DOM Management
XmlDocumentDotNetSystem.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.