[Salesforce]Lightning コンポーネント作成

SalesforceのLightning コンポーネント作成について共有します。

1.開発コンソル開く

設定 > 開発コンソル リンク押下

2. Lightning コンポーネント 作成

開発コンソル画面にて、

メニュー > File > New > Lightning Component

名前 : helloWorld

<aura:component >
	<p>helloWorld</p>
</aura:component>

2.Lightning Application作成

開発コンソル画面にて、

メニュー > File > New > Ligntning Applicaion

名前 :  harnessApp

<aura:application >
	<c:helloWorld/>
</aura:application>

Previewボタン押下する。

以下のエラーメッセージが表示される。

Lightning コンポーネントには [私のドメイン] が必要です。詳細は、組織のシステム管理者にお問い合わせください。

Salesforceの組織にて、私のドメイン登録する。

testdaeheuitest-test11-dev-ed.my.salesforce.com

ドメイン登録して、使えるまで数分かかる。

ユーザにリリースすると、使えるようにんります。

Previewボタンを押下すると。以下のように表示されます。

helloWorld

[Salesforce]バッチスケジュール

Salesforceのバッチスケジュールについて共有します。

1.バッチサンプル

global with sharing class Batch_sample implements Database.Batchable<sObject>
{
  private String query;
  
  //コンストラクタ
  global Batch_sample(String q){
  	system.debug('query ---:'+query);
      query = q;
  }
  
  //データ取得
  global Database.QueryLocator start(Database.BatchableContext BC){
      return Database.getQueryLocator(query);
  }
  
  //開始
  global void execute(Database.BatchableContext BC, List<sObject> scope){
  
      system.debug('scope.size() ---'+scope.size());//バッチの処理を記述
      executeLogic(scope);
      
  }
  
  //完了
  global void finish(Database.BatchableContext BC)
  {
  	
      //完了後の処理があれば
      String jobName = 'Batch_sample';
      
		CronTrigger ct = getCronTrigger1(jobName);

		if (ct != null) {
			System.abortJob(ct.Id);
		}

      Datetime dt = Datetime.now().addMinutes(2);
      ID pid = System.schedule(jobName, dt.format('0 mm HH dd MM ? yyyy'), new Schedule_sample());
  
  }
  
  public virtual void executeLogic(List<sObject> listSObj){
  	
  	List<Account> accs = new List<Account>();
  	List<customObject__c> customs = new List<customObject__c>();

  	for(sObject sObj : listSobj){
  		Account acc = new Account();
  		acc.Id = String.valueOf(sObj.get('sfid__c'));
  		acc.Dummy__c = Boolean.valueOf(sObj.get('Dummy__c'));
  		accs.add(acc);

  		customObject__c custom = new customObject__c();
  		custom.Id = String.valueOf(sObj.get('Id'));
  		custom.IsProcessed__c = true;
  		customs.add(custom);
  	}
  	
  	try {
  		if(accs.size() > 0){
  			system.debug('executeLogic --- accs.size() --- : '+accs.size());
  			update accs;
  		}
  		if(customs.size() > 0){
  			system.debug('executeLogic --- customs.size() --- : '+customs.size());
  			update customs;
  		}
  	} catch (Exception e) {
  		System.debug(e.getMessage());
  	}
  	
  }

	public static CronTrigger getCronTrigger1(String jobName) {

		List<CronTrigger> result = [
			select		Id
			from		CronTrigger
			where		CronJobDetail.JobType = '7'					// JobType(7) = Scheduled Apex
			and			CronJobDetail.Name =: jobName
			limit		1
		];

		return (result.isEmpty())? null: result[0];

	}


}

2.バッチスケジュールサンプル

global class Schedule_sample implements Schedulable {
  global void execute(SchedulableContext ctx) {
      String soql = 'SELECT Id, SfId__c, Dummy__c, IsProcessed__c FROM customObject__c Where IsProcessed__c = false Order By Id Limit 300';
      Batch_sample b = new Batch_sample(soql);
      Database.executeBatch(b, 200);
  }
}

3.バッチテストクラス

@isTest (SeeAllData = false)
private class TestBatch_sample {

	// 同期バッチテスト1 (スケジュールクラステスト)
	static testMethod void myUnitTest1() {

		List<Account> accs = new List<Account>();
		for(Integer i =1; i<=100; i++ ){
			Account acc = new Account();
			acc.Name = 'test' + String.ValueOf(i);
			accs.add(acc);
		}
		insert accs;

		List<Account> accList = new List<Account>();
		accList = [SELECT Id From Account];		
		List<customObject__c> customs = new List<customObject__c>();
		for(Integer i =0; i<100; i++ ){
			customObject__c custom = new customObject__c();
			custom.SfId__c = String.ValueOf(accList.get(i).Id);
			custom.Dummy__c = true;
			custom.IsProcessed__c = false;
			customs.add(custom);
		}
		insert customs;
		
		test.startTest();
		ID pid = System.schedule('TestBatch_sample', Datetime.now().addMinutes(2).format('0 mm HH dd MM ? yyyy'), new Schedule_sample());
		test.stopTest();
		

	}


    
}

[Salesforce]SOQL比較演算子

SalesforceのSOQL比較演算子について共有します。

SELECT Name FROM Account
WHERE BillingState IN ('California', 'New York')

SELECT AccountId, FirstName, lastname
FROM Contact
WHERE lastname LIKE 'appl%'

SELECT Name FROM Account
WHERE BillingState NOT IN ('California', 'New York')

SELECT Id 
FROM Account 
WHERE Id NOT IN
  (
    SELECT AccountId
    FROM Opportunity
    WHERE IsClosed = false
  )

SELECT Id, Name
FROM Account
WHERE Parent.Name = 'myaccount'

Account A = new Account(Name='xxx');
insert A;
Account B;

// A simple bind
B = [SELECT Id FROM Account WHERE Id = :A.Id];

// A bind with arithmetic
B = [SELECT Id FROM Account 
     WHERE Name = :('x' + 'xx')];

String s = 'XXX';

// A bind with expressions
B = [SELECT Id FROM Account 
     WHERE Name = :'XXXX'.substring(0,3)];

// A bind with an expression that is itself a query result
B = [SELECT Id FROM Account
     WHERE Name = :[SELECT Name FROM Account
                    WHERE Id = :A.Id].Name];

Contact C = new Contact(LastName='xxx', AccountId=A.Id);
insert new Contact[]{C, new Contact(LastName='yyy', 
                                    accountId=A.id)};

// Binds in both the parent and aggregate queries
B = [SELECT Id, (SELECT Id FROM Contacts
                 WHERE Id = :C.Id)
     FROM Account
     WHERE Id = :A.Id];

// One contact returned
Contact D = B.Contacts;

// A limit bind
Integer i = 1;
B = [SELECT Id FROM Account LIMIT :i];

// An OFFSET bind
Integer offsetVal = 10;
List<Account> offsetList = [SELECT Id FROM Account OFFSET :offsetVal];

// An IN-bind with an Id list. Note that a list of sObjects
// can also be used--the Ids of the objects are used for 
// the bind
Contact[] cc = [SELECT Id FROM Contact LIMIT 2];
Task[] tt = [SELECT Id FROM Task WHERE WhoId IN :cc];

// An IN-bind with a String list
String[] ss = new String[]{'a', 'b'};
Account[] aa = [SELECT Id FROM Account 
                WHERE AccountNumber IN :ss];

// A SOSL query with binds in all possible clauses

String myString1 = 'aaa';
String myString2 = 'bbb';
Integer myInt3 = 11;
String myString4 = 'ccc';
Integer myInt5 = 22;

List<List<SObject>> searchList = [FIND :myString1 IN ALL FIELDS 
                                  RETURNING 
                                     Account (Id, Name WHERE Name LIKE :myString2
                                              LIMIT :myInt3), 
                                     Contact, 
                                     Opportunity, 
                                     Lead 
                                  WITH DIVISION =:myString4 
                                  LIMIT :myInt5];

List keyAccounts;
「WHERE ID IN :keyAccounts」

[Salesforce]VisualForce、Apex で現在のユーザ情報取得

SalesforceでVisualForce、Apex で現在のユーザ情報取得方法を共有します。

1. VisualForceで現在のユーザ情報取得方法

<apex:page>
  <h1>Congratulations</h1>
   This is your new Apex Page
   <p>The current company name for this 
      user is: {!$User.CompanyName}</p>
   <p>Is the user active?  
      {!$User.isActive}</p>
</apex:page>

2. Apex で現在のユーザ情報取得方法

String result = UserInfo.getLocale();
System.assertEquals('en_US', result);

[Salesforce]StandardControllerとStandardSetController使い分け

Salesforceでよく使われているStandardControllerとStandardSetController使い分けについて共有する。

1.カスタムボタンでの使い分け

表示ボタン :  StandardController

リストビューボタン :  StandardSetController

※表示ボタン : 詳細画面に配置して使用

※リストビューボタン : 関連リストのメニューに配置して使用

2.Visualforceとコントローラでの使い分け

StandardController の場合

・Visualforce page

<apex:page standardController="Account" extensions="myControllerExtension">
    {!greeting} <p/>
    <apex:form>
        <apex:inputField value="{!account.name}"/> <p/>
        <apex:commandButton value="Save" action="{!save}"/>
    </apex:form>
</apex:page>

・コントローラ

public class myControllerExtension {

    private final Account acct;
    
    // The extension constructor initializes the private member
    // variable acct by using the getRecord method from the standard
    // controller.
    public myControllerExtension(ApexPages.StandardController stdController) {
        this.acct = (Account)stdController.getRecord();
    }

    public String getGreeting() {
        return 'Hello ' + acct.name + ' (' + acct.id + ')';
    }
}

StandardSetController

・Visualforce Page

<apex:page controller="opportunityList2Con">
    <apex:pageBlock>
        <apex:pageBlockTable value="{!opportunities}" var="o">
            <apex:column value="{!o.Name}"/>
            <apex:column value="{!o.CloseDate}"/>
        </apex:pageBlockTable>
    </apex:pageBlock>
</apex:page>

・コントローラ

public class opportunityList2Con {
    // ApexPages.StandardSetController must be instantiated
    // for standard list controllers
    public ApexPages.StandardSetController setCon {
        get {
            if(setCon == null) {
                setCon = new ApexPages.StandardSetController(Database.getQueryLocator(
                    [SELECT Name, CloseDate FROM Opportunity]));
            }
            return setCon;
        }
        set;
    }

    // Initialize setCon and return a list of records
    public List<Opportunity> getOpportunities() {
        return (List<Opportunity>) setCon.getRecords();
    }
}

[Salesforce]ClassicのOnClick JavaScriptボタンのLightning Experience移行

SalesforceのClassicでOnClick JavaScriptボタンをLightning Experienceに移行する際にその方法の一つを共有します。

1.詳細ボタンの場合

Classic:

window.open(“/apex/Test_VF?id=”+ ids, “_blank”);

Lightning Experience:

window.location.href = '/apex/Test_VF?id={!ids}';

2.リストビューボタンの場合

Classic:

var ids = {!GETRECORDIDS($ObjectType.Test__c)};

if (ids.length === 0) {
    alert('None');
} else {
    var test_url = '{!URLFOR("/apex/Test_VF?id=")}' ;
    window.open(test_url + ids, 'Test');
} 

Lightning Experience:

<script type="text/javascript">
    var __sfdcSessionId = '{!GETSESSIONID()}';
</script>

<script src="../../soap/ajax/44.0/connection.js" type="text/javascript"></script>

<script src="../../soap/ajax/44.0/apex.js" type="text/javascript"></script>

<script type="text/javascript">
    var ids = "<apex:repeat value="{!selected}" var="obj">{!obj.Id},</apex:repeat>".slice(0,-1).split(',');
    if (ids[0] == "") { 
        alert('None');
        history.back();
    } else { 
        window.location.href = '/apex/Test_VF?id='+ids;
    }
</script>

[Salesforce]リストボタン

Salesforceのリストボタンについて共有する。

以下に例で説明する。

1.取引先レコード作成する。

取引先タブ > 新規ボタン 

取引先名 : testAccount

保存する。

2.取引先責任者レコード作成する。

取引先責任者タブ > 新規 

姓 : testCotact

取引先 : testAccount

保存する。

3.取引先責任者にリストボタン作成する。

設定 > カスタマイズ > 取引先責任者 > ボタン、リンク、およびアクション > 新規ボタンまたはリンク

表示ラベル : testListView

名前 : testListView

表示の種類 : リストボタン

動作 : JavaScriptを実行

内容のソース : OnClick JavaScript

内容:

var iframe_url = ‘{!URLFOR(“/apex/testVF?id=”)}’ ;
var id = “{!Contact.Id}”;
window.open(iframe_url + id, ‘testVF’);

保存する。

4.リストビュー配置する。

設定 > カスタマイズ > 取引先 > ページレイアウト > Account Layout > 編集 > 関連リスト > 取引先責任者 > 関連リストのプロパティ > ボタン > 手順3.で作成したリストビューを選択したボタンに移動 > OKボタン押下 > 保存ボタン押下

5.動作確認する。

手順1.で作成した取引先レコード詳細画面を表示する。

関連リスト > 取引先責任者 > 手順4.で配置したリストビューボタンを押下する。

testViewのVisualforceページが表示されることを確認する。

[Salesforce]承認プロセス

Salesforceは承認プロセスが標準機能として備えられています。

その承認プロセスについて共有します。

1.承認プロセスの対象

Salesforceの標準オブジェクト、またはカスタムオブジェクト

2.承認プロセスの構成

・申請条件

 条件を加えることで、レコードタイプ毎など分けて処理することができる。

・申請時のメールテンプレート

 メールテンプレートは標準メールテンプレートも備えられてあるが、カスタマイズして使用することができる。

 メールテンプレートは承認申請時に、例えば承認申請者に承認申請したことを知らせるメールなどで使われています。

 または承認ステップにて、承認者へ、またはそのほかのユーザに対してメールを送信することができる。

・承認ステップ

 承認するステップを意味しており、組織の該当オブジェクトに対して業務に応じて作成することができる。

・最終承認

 最終承認時に必要なアクションを追加することができる。

・承認取消

 承認を途中で取消ことができて、その時に必要なアクションを追加することができる。

・承認却下

 承認ステップにて承認却下した際に、必要なアクションを追加することができる。

・承認申請すると、該当レコードはロックされ、最終承認、承認取消、承認却下後にロックが解除される。

[Salesforce]EclipseにForce.comのIDEインストール

Salesforce開発環境の代表的なものとして、Eclipseのインストールと、その上にForce.comのIDEをインストールについて共有する。

1.Eclipseインストール

Eclipseを利用するためにはJavaをインストールする必要があります。

例えば、

jre1.8.0_181

ダウンロードするURLは以下の公式サイトにて行う。

https://www.oracle.com/technetwork/java/javase/downloads/index.html

Javaインストール後にコマンドプロンプトにて以下のコマンドインストール済みJavaバージョンを確認できます。

java -version

例えば、

C:\xxx>java -version
java version “1.8.0_181”
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

次にEclipseをインストールする。

例えば、

https://www.eclipse.org/downloads/packages/release/neon/3

2.EclipseにForce.comのIDEをインストールする。

EclipseでForce.com開発するためにはEclipseにForce.comのIDEをインストールする必要があります。

Eclipse > Help > Install NewSoftware にて、

Work with: の入力欄に以下を入力する。

例えば、

http://media.developerforce.com/force-ide/eclipse42

Nameに以下を入力する。

例えば、

Force.com IDE

インストール対象はまずいかでよいです。

Force.com IDE

3.EclipseでForce.comプロジェクト作成する。

File > New > Force.com Projectにて以下の項目値を入力する。

Project Name

User Name

Password

Finishボタン押下することでEclipse上でForce.comのプロジェクトが作成されるようになります。

[Salesforce]Lightningのアクション押下してVisualforceページ表示

SalesforceLightningのオブジェクトの詳細画面で、アクション押下して、Visualforceページを表示することを共有します。

1.カスタムボタンを配置するレコード作成

例えば、取引先のレコードを作成する。

2.アクション用Visualforceページ作成

ホームページ画面で、開発者コンソールリンクを押下する。

開発者コンソールリンクを押下すると、以下のコンソル画面が表示される。

Visualforceページ作成

File→New→Visualforce Page順で選択する。

Visualforceページ名入力欄にページ名を入力して、OKボタン押下する。

ページ名は、例えば「testActionPage」とする。

以下のコードを挿入する。

<apex:page standardController=”Account”>
<script>
window.open(‘/apex/testPage’);
</script>
</apex:page>

3.アクション作成する。

SalesforceLightningの以下の設定ボタン押下する。

オブジェクトマネージャリンク押下する。

取引先リンク押下する。

ボタン、リンク、およびアクションリンク押下する。

新規アクションボタン押下する。

新規アクション入力画面で、入力する。

入力値は、例えば以下の設定する。

アクション種別 : カスタム Visualforce

Visualforceページ : testActionpage

高さ : 250ピクセル

表示ラベル : testActionPage

名前 : testActionPage

4.アクション配置する。

ページレイアウトにアクションを配置する。


該当ページレイアウトリンク押下する。

配置するアクション指定する。

アクション配置する。

5.アクション確認する。

アプリケーションランチャリンク押下する。

取引先先リンク押下する。

該当レコード押下する。

実行するアクション選択する。


動作確認する。