プログラマ38の日記

主にプログラムメモです。

Salesforce: 階層を持つフォルダとそのフォルダのレポート・ダッシュボードをデプロイする

Summer18からレポート・ダッシュボードフォルダは階層を持つことができるようになりました。

 

変更セットを使えば、フォルダの階層関係とレポート・ダッシュボードをそのまま他の組織にリリースできます。(サブフォルダは更新できませんので変更セットでもリリース先にフォルダがあるとエラーになります)

が、メタデータからのデプロイでは次の問題があります。

メタデータからのデプロイの問題点

  • サブフォルダとサブフォルダ内のレポート・ダッシュボードは、retrieveしたZipファイルをそのままdeployできずpackage.xmlの編集が必要

問題点の詳細と対策

そもそもメタデータでretrieveすると次のようになります。
例として、フォルダ「Lv1」の下にフォルダ「Lv2」、フォルダ「Lv2」の下にはレポート「Lv2Report」という構成とします。

f:id:crmprogrammer38:20181021185518p:plain

retrieveしたメタデータ

f:id:crmprogrammer38:20181021190458p:plain


Salesforceのフォルダ階層と同じように、メタデータのフォルダも階層となっています。(※workbenchで取得したためunpackagedフォルダがルートにありますが、Force.com IDEや、Ant移行ツールでは多少違いがあります)


そして、package.xmlは次のようになります。

<!--?xml version="1.0" encoding="UTF-8"?-->

<package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>

        <members>Lv1</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv2</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv2/Lv2Report</members>

        <name>Report</name>

    </types>

    <version>43.0</version>

</package>

問題の詳細ですが、

  • Lv2フォルダは、Lv1のサブなので本来であれば「Lv1/Lv2」なのですが、retrieveしたpackage.xmlでは「Lv2」となっていること
  • 同様に、Lv2Reportレポートも本来であれば「Lv1/Lv2/Lv2Report」なのですが、retrieveしたpackage.xmlでは「Lv2/Lv2Report」となっていること
  • サブフォルダは、Deployで更新すると「このフォルダの一意の名前はこのフォルダ種別ですでに使用されているか、以前に使用されていました。別の名前を選択してください。」のエラーが発生します。(これは変更セットでも同様です)

 

上記を踏まえると、deployする前には次のようにpackage.xmlの編集が必要です。

<!--?xml version="1.0" encoding="UTF-8"?-->

<package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>

        <members>Lv1</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv1/Lv2</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv1/Lv2/Lv2Report</members>

        <name>Report</name>

    </types>

    <version>43.0</version>

</package>

フォルダ構成を押さえておいて、サブフォルダやサブフォルダのレポートのコンポーネントにトップレベルからのフォルダの記載をする必要があります。

そして、deploy先にサブフォルダが既に存在する場合は次のようにpackage.xmlの記載から削除しておく必要があります。

<!--?xml version="1.0" encoding="UTF-8"?-->

<package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>

        <members>Lv1</members>

        <name>Report</name>

    </types>

<!--
<types> <members>Lv1/Lv2</members> <name>Report</name> </types>
--> <types> <members>Lv1/Lv2/Lv2Report</members> <name>Report</name> </types> <version>43.0</version> </package>

 レポートフォルダを例としましたが、ダッシュボードフォルダも同様です。

最後に

まだフォルダが階層を持てるようになってから期間が短いので、メタデータのretrieveが最新の仕様に追い付いていない状況です。

モジュールのバックアップとしてメタデータを取得しておいて、うっかり削除してしまった際にはバックアップしたメタデータをdeployして元に戻す運用にしている場合があります。

ですが、レポート・ダッシュボードでフォルダを階層にしている場合、上記の問題がありそのままでは復旧できないので注意が必要です。

また、参考としてAPI43以上であればフォルダ(Folder)オブジェクトに、Folder ID(ParentId )項目があるので、DataLoaderで取得した後にフォルダの階層情報をたどることができます。※Folder IDには参照先名がないので、SOQLで参照先をたどって取得はできないようです。