ラベル

2022-11-17

Salesforce - オブジェクトの項目一覧取得


Salesforce 上の「標準オブジェクト」および「カスタムオブジェクト」の項目一覧を取得したい。
  • ファイル出力先は salseforce のファイル
  • .csv ファイル形式で出力する(タブ区切り / UTF-8)
  • オブジェクト単位にファイル出力する





String outputFileName = 'OBJECT_FILE_' + System.today();
String NEW_LINE = '\n';
String SEP = '\t';
List<ContentVersion> outputFileList = new List<ContentVersion>();

Map <String,Schema.SObjectType> gd = Schema.getGlobalDescribe();
for(String objName : gd.keySet()) {
  Schema.SObjectType sobjType = gd.get(objName);
  Schema.DescribeSObjectResult sobjResult = sobjType.getDescribe();
  Map<String, Schema.SObjectField> fields = sobjResult.fields.getMap();

  ContentVersion cv = new ContentVersion();
  cv.ContentLocation = 'S';
  cv.PathOnClient = outputFileName + '_' + sobjType + '.csv';
  cv.Title = outputFileName + '_' + sobjType;

  String line = 'オブジェクト名' + SEP + 'オブジェクトAPI参照名' + NEW_LINE;
  line += sobjResult.getLabel() + SEP + sobjType + NEW_LINE;

  line += '項目名' + SEP + 'API参照名' + SEP + 'データ型' + NEW_LINE;
  for(String fieldName : fields.keySet()) {
    Schema.SObjectField field = fields.get(fieldName);
    Schema.DescribeFieldResult fResult = field.getDescribe();

    // ※ //

    line += fResult.getLabel() + SEP + field + SEP +  fResult.getType() + NEW_LINE;
  }
  cv.VersionData = Blob.valueOf(line);
  outputFileList.add(cv);
}

insert outputFileList;
 ※ 出力値に改行等含まれる場合は別途処理が必要
 ex. 下記、数式の場合
String cf = fResult.getCalculatedFormula();
cf = (String.isBlank(cf) ? '' : cf.replaceAll('"', '""'));
line += … + SEP + '"' + cf + '"' … ;


ref:

Salesforce - 開発環境設定


過去記事(削除済み)の修正
VSCode で環境を整える

2023-06-14 追記
この記事は sf コマンド未対応となっております。
sfdx | Salesforce CLI Command Reference → sfdx コマンドは非推奨になったてよ
sf | Salesforce CLI Command Reference → 今後は sf コマンド使えってよ





環境
  • salesforce: Winter '23
  • SFDX: sfdx-cli 7.176.1





前提
  • %SalesforceCLI_HOME%\bin へのパスを環境変数に設定済み





■ ローカル環境にプロジェクトを作成し sandbox 組織からソースを取得する


1. Salesforce DX project を作成する(マニフェスト作成)

作業ディレクトリ: C\:workspace
sfdx force:project:create --projectname sandbox-project --manifest
※ ローカル環境のプロジェクト名は名は任意(「sandbox-project」)


2. 組織へのログインURL を sandbox 組織のものに変更

作業ファイル: C\:workspace\sandbox-project\sfdx-project.json
"sfdcLoginUrl": "https://login.salesforce.com",
        ↓
"sfdcLoginUrl": "https://test.salesforce.com",


3. sandbox 組織の認証を行う

作業ディレクトリ: C\:workspace\sandbox-project
sfdx force:auth:web:login -r https://test.salesforce.com -a sandbox-alias
※ 組織のエイリアス名は任意(「sandbox-alias」)
※ ブラウザで salesforce ログイン画面が表示されるので、ログインする


4. sandbox 組織からソースを取得する

■ クラス
sfdx force:source:retrieve -m ApexClass

■ トリガー
sfdx force:source:retrieve -m ApexTrigger

■ VFage
sfdx force:source:retrieve -m ApexPage

■ すべて
sfdx force:source:retrieve
※ 『sf retrieve metadata コマンドはリリースと同様ですが、逆の動作となります。初めて取得を実行するときは、すべてのものが取得されますが、次回取得を実行するときは、組織で変更されたものだけが取得されます。--source-dir、--metadata、または --manifest を指定しない場合は、force:source:pull と同様に組織のすべての変更が取得されます。』(sf のソース追跡について





ref:

2021-11-01

Salesforce - Schema.DescribeFieldResult


Schema.DescribeFieldResult に関するメモ書き
  • 任意のオブジェクトの項目の表示ラベルを apex で取得したい





■ Account.Name の表示ラベルを取得する 

静的

Schema.SObjectType.Account.fields.Name.label;

動的

Schema.getGlobalDescribe().get('Account').getDescribe().fields.getMap().get('Name').getDescribe().getLabel();

オブジェクト:静的 / 項目:動的

Map<String, Schema.SObjectField> accountFieldMap = Schema.SObjectType.Account.fields.getMap();
String label = accountFieldMap.get('Name').getDescribe().getLabel();


ref:

2021-09-17

Salesforce - Attachment


添付ファイルに関するメモ書き
  • VFPage から任意のオブジェクトレコードに添付ファイルをアップロードしたい
  • VFPage に任意のオブジェクトレコードの添付ファイル一覧を表示したい(ファイル名のみ)





■ 添付ファイルのアップロード 

VFPage

<apex:form>

	<apex:outputLabel value="ファイル" for="file" />
	<apex:inputFile value="{!attachment.Body}" filename="{!attachment.Name}" id="file" />

	<apex:commandButton value="アップロード" action="{!doUpload}" />

</apex:form>

Apex

public class SampleController {

	private Id recordId;

	public Attachment attachment { get; set; }

	public SampleController(ApexPages.StandardController controller) {

		this.recordId = controller.getId();

		this.attachment= new Attachment();
	}

	public PageReference doUpload() {

		if(this.attachment.Body != null && String.isNotBlank(this.attachment.Name) ) {

			this.attachment.ParentId = this.recordId;

			insert this.attachment;
		}
		return null;
	}
}

■ 添付ファイル一覧の表示 

VFPage

<apex:dataList value="{!attachmentList}" var="attachment">
	<apex:outputText value="{!attachment.Name}"/>
</apex:dataList>

Apex

public class SampleController {

	private Id recordId;

	public List<Attachment> attachmentList { get; set; }

	public SampleController(ApexPages.StandardController controller) {

		this.recordId = controller.getId();

		this.attachmentList = [SELECT Id, Name FROM Attachment WHERE ParentId = :this.recordId ORDER BY CreatedDate ASC];
	}
}


ref:

2021-09-06

Salesforce - レポート


レポートに関するメモ書き
  • アクセス権の設定





■ レポートのリリース状況 

  • 設定 → ビルド → 作成 → レポートタイプ から編集可能
  • リリース状況
    • 開発中: 「カスタムレポートタイプの管理」権限を持つユーザのみアクセス可能
    • リリース済み: すべてのユーザがアクセス可能
  • ref: カスタムレポートタイプの作成 - Salesforce Help

■ レポートフォルダのアクセス権 


■ プロファイル 

  • レポートが参照するオブジェクト・項目に「参照」アクセス権があること・必要に応じて下記権限が付与されていること
  • システム管理者権限
    • 公開レポートの管理
    • すべてのデータの参照 ※ 権限を制御する場合は OFF
    • 設定・定義を参照する ※ 管理レポートの場合
  • 一般ユーザ権限
    • レポートの作成とカスタマイズ
    • レポートビルダー
    • レポートの実行

■ 共有設定 

  • レポートが参照するオブジェクトにユーザの「参照」アクセス権があること



ref:

2021-08-29

Salesforce - Visualforce - apex:selectList


apex:selectList のメモ書き
  • 任意の選択リスト型の入力項目を表示する
※ 2021/09/06: 「SelectOption」のラベルと値がの設定が逆だったため修正





■ select 

VFPage

<apex:selectList label="選択リスト" value="{!option}" size="1" >
        <apex:selectOptions value="{!options}"/>
</apex:selectList>

※ 複数選択リストにする場合は、「apex:selectList コンポーネント」に「multiselect="true"」属性を追加する
※ 「size="1"」表示される選択肢を 1 個にする

Apex

public class SampleController {

	public String option { get; set; }
	public List<SelectOption> options { get; set; }

	public SampleController(ApexPages.StandardController controller) {

		this.option = '';
		this.options = this.getSelectOption(`オブジェクト名`, `選択リストのフィールド名`);

	}

	public List<SelectOption> getSelectOption(Strin sObjectName, String fieldName) {
		List<SelectOption> retval = new List<SelectOption>();
        retval.add(new SelectOption('', '下記から選択してください。', true));	// ラベルを表示・非選択
		Schema.DescribeFieldResult f = Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().get(fieldName).getDescribe();
		List<Schema.PicklistEntry> pickList = f.getPicklistValues();
		for(Schema.PicklistEntry pick : pickList) {
			if(pick.isActive()) {
				retval.add(new SelectOption(pick.getValue(), pick.getLabel()));		// ラベルを表示・選択可能
			}
		}
		return retval;
	}

}



ref:

2021-08-27

Salesforce - Visualforce - apex:outputText


apex:outputText のメモ書き
  • 日付型の項目をフォーマット指定して表示する





■ date 

VFPage

<apex:outputText label="日付" value="{0,date,yyyy/MM/dd}" >
	<apex:param value="{!NOW}" />
</apex:outputText>



ref:

Salesforce - Visualforce - apex:input


apex:input のメモ書き
  • 任意の日付型の入力項目を表示する(入力値の最大値・最小値の制限も加える)





■ type : date 

VFPage

<apex:page docType="html-5.0" StandardController="Contact" extensions="SampleController">

<apex:input label="日付" type="date" value="{!sampleDate}" html-min="{!sampleMinDate}" html-max="{!sampleMaxDate}"  />

</apex:page>

※ 「type 属性」を使うには「apex:page コンポーネント」の「docType 属性」を指定する
※ 「html-min 属性」「html-max 属性」はパススルー属性

Apex

public class SampleController {

	public Date sampleDate { get; set; }
	public String sampleMinDate { get; private set; }
	public String sampleMaxDate { get; private set; }

	public SampleController(ApexPages.StandardController controller) {

		this.sampleMinDate = String.valueOf(System.today());
		this.sampleMaxDate = String.valueOf(System.today().addYears(1));

	}
}



ref:

2019-12-19

Salesforce - VSCode


環境
  • jdk: jdk-8u221-windows-x64.exe
  • VS Code: version 1.41.1





■ 開発環境構築: VSCode


1. VSCode の Extensions から拡張機能をインストールする
  • Salesforce Extension Pack(※)

Prerequisites
  • Salesforce CLI をインストール済みであること
    • 後から Salesforce CLI をインストールした場合、VSCode のコマンドパレットに SFDX コマンドは表示されない
    • 後から Salesforce CLI をインストールした場合、Salesforce Extension Pack を uninstall -> install する
  • Java 8 or Java 11 がインストール済みであること
  • 複数の Java をインストールするしている場合は、VSCode のユーザ設定で使用する Java を設定すること
  • VSCode のバージョンが 1.26 移行であること


2. Salesforce DX project の作成

SFDX: Create Project
    or
SFDX: Create Project with Manifest
選択の後、「標準」を選択し、任意のプロジェクト名を入力する
※ コマンドパレットで SFDX コマンドを使用するには Salesforce DX project で作業している必要がある


ref: