プログラマ38の日記

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

Salesforce: メタデータエクスポートツールのバージョンを上げました(APIVer44)

Salesforce Winter19(APIVer44)用にメタデータエクスポートツールのバージョンをあげました。

 

ダウンロードはこちらからです。

 

今回からツールにjdkを含めています。というのも、OracleJDKが使えなくなる(有償化される)日が近いうちに来るため、openJDKに慣れておきたいと考えたからです。

 

APIVer43と44では、オブジェクト情報にChangeDataCaptureの情報が追加されていたり、ダッシュボードのコンポーネントで数字の小数点の情報などが追加されていたりなど多少違いがありました。

 

最後に

Salesforceの周辺ツール(DataLoaderやforce.com IDE、移行ツールなど)JDKの有償化や、JDK9から32bit版がなかったりなどJavaに関連する対応が気になります。

全く先が読めないですが、これから大変になっていくんですかね。。

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で参照先をたどって取得はできないようです。

 

Java: int から byte と byte から int の変換

急に忘れてしまうので、備忘メモ

 

intからbyteは、キャストする。

    int intval1 = 255;
    
    byte byteval1 = (byte)intval1;

 

byteからintは、ビット演算または、Byte.toUnsignedInt を使う

    byte byteval2 = -1;
    
    int intval2 = byteval2 & 0xFF;
    
    int intval3 = Byte.toUnsignedInt(byteval2);

 

Javaのファイル操作で read の結果が int で そのintの値をbyteで扱いたいときにいちいち調べたりしてしまいます。。 そろそろファイル操作のreadの結果をbyteで返すメソッド追加されないかなー。 なんで int で返ってくるんだろ。。

雑記: はてなのHTML編集ではまったこと(&nbsp;の文字)

色々なソースコードを記載してきましたが、自分の記載したソースコードをコピーして使おうとして気がつきました。
html編集で「&nbsp;」にすると文字コードで「C2A0」という文字で表示されるんですね。。


わざわざ半角スペースを「&nbsp;」に変換して貼り付けていたのが仇となりました。
今までのせてきたものは全部直そうと思います。
良い機会だから<code></code>ではさむようにしとこ。

150程度しか記事はないけど意外と大変です。。

CSV: Excelで開く際に、ゼロサプレスや日付変換を回避する

CSVファイルは、大体Excelに関連付けがされていてダブルクリックするとExcelで開きます。
Excelで中身を確認できるのはとても便利ですが、次のようになってしまい使いづらいことがあります。
CSVの文字は「0001」なのに、Excelでは「1」となる
CSVの文字は「2000-01」なのに、Excelでは日付の「2000/1/1」となる

この現象は数式扱いにすると回避できます。


テキストが変換されてしまうCSVの中身

"0001","2000-01"

Excelで開いた場合の表示

f:id:crmprogrammer38:20180711102325p:plain
ゼロサプレスされるのと、勝手に日付変換されてしまいます。


テキストを数式扱いにしたCSVの中身

="0001",="2000-01"

Excelで開いた場合の表示

f:id:crmprogrammer38:20180711102436p:plain

セルは数式の値でcsvの文字列がそのまま表示されます。

 

気をつけること

ただし、数式扱いにしなければ正しく表示される値でも、数式扱いにすると表示がおかしくなる場合があります。

おかしくなるのは、文字列中にカンマ(,)や改行( )がはいる場合です。


通常のCSV

"000,000,000","AAAAA
BBBBB"

Excel表示

f:id:crmprogrammer38:20180711102214p:plain
正しく表示されます

 

数式に変更

="000,000,000",="AAAAA
BBBBB"

Excel表示

f:id:crmprogrammer38:20180711102123p:plain
表示が崩れてしまいます。


この現象を回避するため、テキスト内のカンマと改行も数式で表現しておく必要があります

="000" & char(44) & "000" & char(44) & "000",="AAAAA" & char(10) & "BBBBB"

 ※カンマはchar(44) で、改行はchar(10)で表現しています。

Excel表示

f:id:crmprogrammer38:20180711102106p:plain

最後に

テキストを数式扱いしたCSVは連携用途で扱えません、Excelでの表示用途に限定したやり方になります。

業務ユーザにCSVを配布した際にゼロサプレスされては困る、勝手に日付変換されたら困る項目に限定して数式扱いにするのがいいのかなと思います。

Salesforce: レイアウト項目一覧の取得Excelマクロでミニページレイアウトの表示を追加しました

レイアウトの一覧とレイアウト項目 を取得するExcelマクロを以前作成しました。

レイアウト項目は、詳細項目と関連リストを対象としていたのですが、ミニページレイアウトの項目の追加しました。

 

ダウンロードはこちら からになります。

 

次のようにレイアウト項目でミニページレイアウト項目とミニページレイアウトの関連リストを表示を追加しました。

 

f:id:crmprogrammer38:20180620195657p:plainf:id:crmprogrammer38:20180620195747p:plain

 

[前回作成時の記事]

crmprogrammer38.hatenablog.com

 

最後に

ページレイアウトを設定する時に、ミニページレイアウトの設定はあまり深く考えないで項目を置いておくことが多いです。

そして、レコードタイプの追加にあわせてレイアウトを増やしていくと、見直し作業が意外と手間な時があります。

そんな時に使えるかなーと思います。

といっても、メタデータAPI名を一覧で表示しているだけで、ラベルの表示はしてなくてあまり使いやすくはないですけどね。

Salesforce: Lightningレコードページの割り当てをリリースする

結論として、Lightningレコードページの割り当てをリリースするには、「オブジェクト」「Lightning アプリケーション」をリリースする必要があります。

 

メタデータでLightningレコードページの割り当てがどこに記載されているかを確認したところ、オブジェクトとLightning アプリケーション(メタデータのCustomApplication)に情報が記載されていました。

 

メタデータの詳細

まず、Lightningレコードページの割り当ては次の内容です。

f:id:crmprogrammer38:20180616223338p:plain

  • 組織のデフォルト
  • アプリケーションのデフォルト
  • アプリケーション、レコードタイプ、プロファイル

表示の優先度は下からなので、「アプリケーション、レコードタイプ、プロファイル」を指定していれば、組織のデフォルトより優先されて表示されます。

 

上記の内容はメタデータ上では次のようになっています。

 

組織のデフォルト(メタデータ:オブジェクト)
    <actionOverrides>
        <actionName>View</actionName>
        <comment>Action override created by Lightning App Builder during activation.</comment>
        <content>LightningレコードページのAPI</content>
        <formFactor>Large</formFactor>
        <skipRecordTypeSelect>false</skipRecordTypeSelect>
        <type>Flexipage</type>
    </actionOverrides>

 

アプリケーションのデフォルト(メタデータ:アプリケーション)
    <actionOverrides>
        <actionName>View</actionName>
        <comment>Action override created by Lightning App Builder during activation.</comment>
        <content>LightningレコードページのAPI</content>
        <formFactor>Large</formFactor>
        <skipRecordTypeSelect>false</skipRecordTypeSelect>
        <type>Flexipage</type>
        <pageOrSobjectType>オブジェクトのAPI</pageOrSobjectType>
    </actionOverrides>

 

 アプリケーション、レコードタイプ、プロファイル(メタデータ:アプリケーション)
    <profileActionOverrides>
        <actionName>View</actionName>
        <content>LightningレコードページのAPI</content>
        <formFactor>Large</formFactor>
        <pageOrSobjectType>オブジェクトのAPI</pageOrSobjectType>
        <recordType>オブジェクトのAPI.レコードタイプのAPI</recordType>
        <type>Flexipage</type>
        <profile>プロファイル名</profile>
    </profileActionOverrides>

 

最後に

今までのプロファイル・レコードタイプ別のレイアウト割り当てで、ページの項目の表示を変更した後に、さらに、アプリケーション・レコードタイプ・プロファイルでLighningレコードページで表示の使い分けができて便利です。

が、リリース時の確認も本当に大変だなーと思いました。(アプリケーションをリリースしないとなると手動になってしまいますし)