【Salesforce】【Apex】オブジェクトの項目へ動的に値を入出力する

前回記事を書いてから約半年位経ってしまいました。
色々あって技術ブログから離れていましたが、またコードを書く日々に戻りましたので少しずつ再開していこうと思います。

さて、
最近、Salesforce を用いたプロジェクトに関わる事が多くなって来ました。

www.salesforce.com

Salesforce についてはまだ触り始めて数か月ですが、色々知識も溜まってきました。
今回からは Salesforce に関する記事を中心に書いていこうと思います。

Salesforce について

Salesforce とは、馴染みが薄い方に概要を説明すると 社内向けのCMS のようなものです。
特徴は、コードが書けなくても機能の拡張が出来るように設計されている事です。
エンジニアでなくとも、ビジュアルプログラミングの要領でデータベースを使えたりUIを作り事も出来ます。

ローコード開発の弊害

Salesforce の理念はローコード優先であり、エンジニアでなくても一通りの機能を追加出来る事が理想です。
ただ、Salesforce の機能内で出来る事が限界があります。

  • 処理の無駄が多くなる プログラムの設計を考えずに機能を追加してしまいがちになります。
    同じような処理や、不要な処理が残ったままになるなど可読性が低下してしまいます。
    また、既存の機能のみで作る事になるため、(俗にいう)機能をこねくり回して作るため実装目的に比べて内容が複雑になってしまう事もあります。
  • 外部システムとの連携が出来ない あくまで、Salesforce の機能内で出来る事しか出来ません。
    例えば「外部システムとの連携を実装したい」と言う要望を実現するには、既存の機能だけでは難しくなります。
  • フロントエンドの作り込みが出来ない フロントエンドを作れるような機能は一通りそろってはいるのですが、機能の範疇を超えた要望には対応出来ません。 (今回は触れませんが) Salesforce では「Lightning Web コンポーネント 」と呼ばれる、従来の javascript フレームワークに近い機能があるのですが、 javascript, html, css の知識が無いと実装する事が難しいです。

以上のような弊害があり、要望が複雑になればなるほどスクラッチ開発を取り入れる必要が出てきます。

Apex によるバックエンドのスクラッチ開発

Salesforce ではバックエンドのシステムを開発する場合、Apex と言う言語を使用します。
Apex は Java をベースにした開発言語で Salesforce 用にカスタマイズされた言語です。

従来のプログラミング言語のように自由にコードを書いて開発する事が出来ます。
ただし、Java の外部ライブラリを使える訳ではないので、既存の機能にない機能は自作する必要があります。

developer.salesforce.com

また、Java と異なる部分もあります
随時 Apex のドキュメントと照らし合わせて違いを確認する必要もあります。

developer.salesforce.com

閑話休題

Salesforce と Apex の概要はこれくらいにして、 今日の本題は オブジェクト の項目に対して、動的に入出力させる方法についてご紹介です。

オブジェクトに値を代入して、取り出す処理を一項目毎にしてしまうと次のような方法になります。

/**
 * 例えば、Sample オブジェクトに次のような項目があったとします。  
 * - SampleTextA__c  String
 * - SampleTextB__c  String
 * - SampleTextC__c  String
 */

// 入力
Sample sample = new Sample();
sample.SampleTextA__c = 'テキストA';
sample.SampleTextB__c = 'テキストB';
sample.SampleTextC__c = 'テキストC';

// 出力
System.debug(sample.SampleTextA__c);
System.debug(sample.SampleTextB__c);
System.debug(sample.SampleTextC__c);

// テキストA
// テキストB
// テキストC

上記のように少数であれば静的に一項目ずつ設定しても良いかもしれません。
しかし、項目数が多くなれば静的に設定する件数も多くなっていき管理しずらいコードになっていきます。

この記事では、オブジェクトの項目を動的に指定して、代入と取り出しをする方法について説明します。

入力について

オブジェクトの項目に値を代入するには先述したように、項目名を設定する方法以外では SObject クラスの put 関数 を使用します。

developer.salesforce.com

実装例

// フィールド名と代入値の一覧を作成
Map<String, String> fieldValues = new Map<String, String>{
    'SampleTextA__c' => 'テキストA',
    'SampleTextB__c' => 'テキストB',
    'SampleTextC__c' => 'テキストC',
}

Sample sample = new Sample();

// Map は forで処理できないため、キーセット利用 ※1
for(String filedName : fieldValues.keySet()) {
    // put 関数にフィールド名と代入値を代入
    sample.put(filedName, fieldValues.get(filedName));
}

※1 keySet 関数について
developer.salesforce.com

出力について

先述したオブジェクトの項目を動的に取り出します。
オブジェクトから項目を取り出す場合は、 SObject クラスの get 関数を使用します。

developer.salesforce.com

実装例

Map<String, String> fieldValues = new Map<String, String>{
    'SampleTextA__c' => 'テキストA',
    'SampleTextB__c' => 'テキストB',
    'SampleTextC__c' => 'テキストC',
}

// 中略

// 設定した項目名を ログにすべて出力
for(String filedName : fieldValues.keySet()) {
    // put 関数にフィールド名代入します。
    sample.get(filedName);
}


以上の方法で、動的に項目を入出力出来るように実装する事が出来ます。
他の言語では良くある実装方法なのですが、最初は java と Apex の違いですんなり実装出来ませんでした。

この実装方法を参考に、使い慣れた言語と同じような開発が出来るようになっていただければ幸いです。

©︎2017-2018 WebSandBag