Memos About Salesforce

Salesforceにハマってたこと!

SFDC big objects object CRUD create read update delete

こんにちは、管理人の@Salesforce.Zです。

業務上では、初めてbig objectを使った。

そのメモとしても、記載しようと思って記事を作りました

読んだら得ること

★ Big Objectのリリース
★ Big ObjectのレコードCRUD
★ 注意点など

目次

Big Objectのリリース

Big Object全然分からない方はこちらへ

Big Objectの定義ファイル:object xmlファイル

ファイル名をCustomer_Interaction__b.objectとする

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
    <deploymentStatus>Deployed</deploymentStatus>

    <fields>
        <fullName>In_Game_Purchase__c</fullName>
        <label>In-Game Purchase</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Level_Achieved__c</fullName>
        <label>Level Achieved</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Lives_This_Game__c</fullName>
        <label>Lives Used This Game</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Game_Platform__c</fullName>
        <label>Platform</label>
        <length>16</length>
        <required>true</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
     <fields>
        <fullName>Score_This_Game__c</fullName>
        <label>Score This Game</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>

    <fields>
        <fullName>Account__c</fullName>
        <label>User Account</label>
        <referenceTo>Account</referenceTo>
        <relationshipName>Game_User_Account</relationshipName>
        <required>true</required>
        <type>Lookup</type>
    </fields>

    <fields>
        <fullName>Play_Date__c</fullName>
        <label>Date of Play</label>
        <required>true</required>
        <type>DateTime</type>
    </fields>

    <fields>
        <fullName>Play_Duration__c</fullName>
        <label>Play Duration</label>
        <required>false</required>
        <type>Number</type>
        <scale>2</scale>
        <precision>18</precision>
    </fields>

    <indexes>
        <fullName>CustomerInteractionsIndex</fullName>
        <label>Customer Interactions Index</label>
        <fields>
            <name>Account__c</name>
            <sortDirection>DESC</sortDirection>
        </fields>
        <fields>
            <name>Game_Platform__c</name>
            <sortDirection>ASC</sortDirection>
        </fields>
        <fields>
        <name>Play_Date__c</name>
        <sortDirection>DESC</sortDirection>
        </fields>        
    </indexes>
    
    <label>Customer Interaction</label>
    <pluralLabel>Customer Interactions</pluralLabel>
</CustomObject>

big objectのpermissionsetファイル

ファイル名をCustomer_Interaction_BigObject.permissionsetとする

<?xml version="1.0" encoding="UTF-8"?>
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
     
    <label>Customer Interaction Permission Set</label>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.In_Game_Purchase__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Level_Achieved__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Lives_This_Game__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Play_Duration__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Score_This_Game__c</field>
        <readable>true</readable>
    </fieldPermissions>
     

</PermissionSet>

package.xmlファイル

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>*</members>
        <name>CustomObject</name>
    </types>
    <types>
        <members>*</members>
        <name>PermissionSet</name>
    </types>
    <version>48.0</version>
</Package>

リリースツール:workbench

リリースするため、zipファイルが必要なので、

・Customer_Interaction__b.objectファイルをobjectsというフォルダに入れて

・Customer_Interaction_BigObject.permissionsetファイルをpermissionsetsというフォルダに入れて

最終的に圧縮する前にフォルダ構造は下記になります。

f:id:jude2016:20200611142352p:plain
フォルダ構造

上記に対して、圧縮してください。注意点として、圧縮してから、一回解凍して、余計なファイルが作成されてしまったかの確認とします。

zipフォルダは下記になった場合がworkbenchでリリース時にpackage.xmlがないよとエラーになる

f:id:jude2016:20200611142425p:plain
ミスフォルダ構造例

対象リソースより上のフォルダ構造に何かがある場合、要注意。

リリース

check onlyを外したら、本当にbig objectとしてリリースにされます。

f:id:jude2016:20200611142018p:plain
workbench

big object CRUD操作

Apexでbig objectに対して、操作できます。

insert and update = upsert :big objectの場合:database.insertImmediate() 実質はupsertになる

delete:big objectの場合 Database.deleteImmediate()

upsert例

// Define the record.

PhoneBook__b pb = new PhoneBook__b();

pb.FirstName__c = 'John';

pb.LastName__c = 'Smith';

pb.Address__c = '1 Market St';

pb.PhoneNumber__c = '555-1212';

database.insertImmediate(pb);

// A single record will be created in the big object.

delete 例

// Declare sObject using the index of the custom big object -->
List<Customer_Interaction__b> cBO = new List<Customer_Interaction__b>();
cBO.addAll([SELECT Account__c, Game_Platform__c, Play_Date__c FROM Customer_Interaction__b WHERE Account__c = '001d000000Ky3xIAB']);

Database.deleteImmediate(cBO);

CSVファイル操作

CSVファイルを用いて、Bulk APIで一気でデータを登録できる。SOAPではできなかった。

最後に

big objectは、レポートでは、直接使えない:非同期クエリで、データを抽出し、カスタムオブジェクトに入れて そのカスタムオブジェクトに対して、レポートすることが一般的なやり方らしい。 big objectのレポートについて公式サイトはこちらへ

big objectでは、集計関数が使える クエいじには、使えない演算子がある「!=、LIKE、NOT IN、EXCLUDES、INCLUDES」

index項目は最大5個まで含むことができる index項目はs ObjectのIDのイメージで、CRUD操作使えます。

例:index項目の値が同じの場合、database.insertImmediate()メソッド操作すると更新するになる。

  index項目の値が違う場合、database.insertImmediate()メソッド操作すると登録になる