2011-09-05

Force.com : Upsert - Data Loader CLIq


@途中


upsert
  • 取引先(Account)へ 外部IDを利用して更新・挿入するバッチを作成する



◆ バッチの作成

  1. CLIq を起動する



◆ upsert レコードの設定

  1. $ApexDataLoader_HOME/cliq_process/upsert_account/read/upsert_account.csv
    • upsert_account.csv ファイルに upsert を行うデータを記述する
    • エンコーディングは「UTF-8」(日本語が含まれる場合は「UTF-8N」)
  2. $ApexDataLoader_HOME/cliq_process/upsert_account/config/upsert_account.sdl
    • upsert_account.csv の項目と Salesforce のオブジェクトの関連付けを行う
  3. $ApexDataLoader_HOME/cliq_process/upsert_account/config/process-conf.xml
    • 以下の entry タグを追加する
      <entry key="sfdc.externalIdField" value="{外部IDのAPI参照名}"/>
      



◆ バッチの実行

  1. $ApexDataLoader_HOME/cliq_process/upsert_account/upsert_account.bat を実行する
  2. 実行ログは $ApexDataLoader_HOME/cliq_process/upsert_account/log ディレクトリ配下に格納される



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0

Force.com : Insert - Data Loader CLIq


insert
  • 取引先(Account)へ レコードを挿入するバッチを作成する



◆ バッチの作成

  1. CLIq を起動する
  2. 下記を入力し[Next]ボタンを押下する
    • Select Operation : Insert
    • Enter Process Name : insert_account


  3. 下記を入力し[Verify Username and Password]ボタンを押下する。ログインに成功したら[Next]ボタンを押下する
    • Username : ユーザ名
    • Password : パスワード(+セキュリティートークン)


  4. [Entity (Object) to Modify]に「Account」を入力し[Verify]ボタンを押下する。問題がなければ[Next]ボタンを押下する


  5. [Summary]の内容を確認し[Create Data Loader CLIFiles]ボタンを押下する。成功したら[Finish]ボタンを押下し、終了する


  6. $ApexDataLoader_HOME/cliq_process ディレクトリ配下に insert_account ディレクトリが作成される
    • insert_account
      • config
      • log
      • read
      • write
      • insert_account.bat
      • insert_account.sh



◆ insert レコードの設定

  1. $ApexDataLoader_HOME/cliq_process/insert_account/read/insert_account.csv
    • insert_account.csv ファイルに insert を行うデータを記述する
    • エンコーディングは「UTF-8」(日本語が含まれる場合は「UTF-8N」)
  2. $ApexDataLoader_HOME/cliq_process/insert_account/config/insert_account.sdl
    • insert_account.csv の項目と Salesforce のオブジェクトの関連付けを行う



◆ バッチの実行

  1. $ApexDataLoader_HOME/cliq_process/insert_account/insert_account.bat を実行する
  2. 実行ログは $ApexDataLoader_HOME/cliq_process/insert_account/log ディレクトリ配下に格納される



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0

Force.com : Export - Data Loader CLIq


Export
  • 取引先(Account)から Id, 取引先名, 取引先部門を取得するバッチを作成する



◆ バッチの作成

  1. CLIq を起動する
  2. 下記を入力し[Next]ボタンを押下する
    • Select Operation : Export
    • Enter Process Name : export_account


  3. 下記を入力し[Verify Username and Password]ボタンを押下する。ログインに成功したら[Next]ボタンを押下する
    • Username : ユーザ名
    • Password : パスワード(+セキュリティートークン)


  4. [Query]に SOQL を入力し[Verify]ボタンを押下する。Query に問題がなければ[Next]ボタンを押下する


  5. [Summary]の内容を確認し[Create Data Loader CLIFiles]ボタンを押下する。成功したら[Finish]ボタンを押下し、終了する


  6. $ApexDataLoader_HOME/cliq_process ディレクトリ配下に export_account ディレクトリが作成される
    • export_account
      • config
      • log
      • read
      • write
      • export_account.bat
      • export_account.sh



◆ バッチの実行

  1. $ApexDataLoader_HOME/cliq_process/export_account/export_account.bat を実行する
  2. $ApexDataLoader_HOME/cliq_process/export_account/write ディレクトリ配下に Export されたデータが csv 形式で出力される
  3. 実行ログは $ApexDataLoader_HOME/cliq_process/export_account/log ディレクトリ配下に格納される



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0

Force.com : 設定 - Data Loader CLIq


※ 記事書き直し中
※ 下記、済み



◆ Data Loader CLIq




◆ 設定

  1. download サイトより Apex Data Loader のバージョンにあった CLIq をダウンロードする
  2. ダウンロードした zip ファイルを解凍する
  3. 解凍してできた cliq ディレクトリ以下を Apex Data Loader のホームディレクトリに展開する



◆ 起動

  1. $ApexDataLoader_HOME/cliq/cliq.bat をクリックする
  2. バッチが実行され、以下の画面が表示されれば起動成功




◆ その他




◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0



◇ 参考


2011-08-03

Force.com : Apex でメール送信機能を実装したい


Apex でメール送信機能を実装したい



○ メール送信機能
■ メール送信クラス
public with sharing class OutboundEmail {

    /** メッセージリスト */
    private List<Messaging.SingleEmailMessage> messages;

    /**
     * コンストラクタ
     */
    public OutboundEmail() {
        messages = new List<Messaging.SingleEmailMessage>();
    }

    /**
     * メッセージ作成
     * @param replyTo 返信先アドレス
     * @param senderDisplayName 差出人名
     * @param toAddresses To アドレス
     * @param ccAddresses Cc アドレス
     * @param subject 件名
     * @param planText 本文
     */
    public void createSendMessage(
            String replyTo
            , String senderDisplayName
            , String[] toAddresses
            , String[] ccAddresses
            , String subject
            , String planText) {
        Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
        if(replyTo != null) {
            message.setReplyTo(replyTo);
        }
        if(senderDisplayName != null) {
            message.setSenderDisplayName(senderDisplayName);
        }
        message.setToAddresses(toAddresses);
        if(ccAddresses != null) {
            message.setCcAddresses(ccAddresses);
        }
        message.setSubject(subject);
        message.setPlainTextBody(planText);
        message.setUseSignature(false);
        addMessage(message);
    }

    /**
     * メッセージ追加
     * @param message メッセージ
     */
    private void addMessage(Messaging.SingleEmailMessage message) {
        if(messages == null) {
            messages = new List<Messaging.SingleEmailMessage>();
        }
        messages.add(message);
    }

    /**
     * メール送信
     */
    public void send() {
        if(messages != null && messages.size() > 0) {
            Messaging.sendEmail(messages);
        }
    }
}

■ 使い方
OutboundEmail mail = new OutboundEmail();
mail.createSendMessage('xxx@g.com'
                        , '差出人名'
                        , new String[]{'yyy@g.com'}
                        , null
                        , '件名'
                        , '本文');
mail.send();



◆ メモ
■ 注意
  • 処理が完了するまでメールは送信されない
  • 1 処理ごとに呼び出せる sendEmail メソッドは最大 10 迄
  • saleseforce ライセンスで指定されているメール送信処理数を上回るとエラーが発生する

■ SingleEmailMessage
  • 差出人名・メールアドレス・署名のデフォルトは実行ユーザのメールの設定([設定]→[個人設定・メール]→[私のメール設定])が適用される
  • 差出人を BCC に含めるかの設定(setBccSender)のデフォルトは false
  • 署名を付加するかの設定(setUseSignature)のデフォルトは true
  • メールテンプレートが使えるぽい(setTemplateID)



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0



◇ 参考

2011-07-15

Force.com : 取引先(Account)のレコードを 200 件以上取得したい


取引先(Account)のレコードを 200 件以上取得したい



ここ] 見れば解決。
でも、試してみる。



○ 取引先(Account)のレコードを 200 件以上取得したい

@isTest
private class Test {
    static testMethod void test() {

        String log = '\n********** ********** ********** ********** ********** ';

        Integer accountCount1 = [SELECT COUNT() FROM Account];
        log += '\naccount count 1: ' + accountCount1.format();

        for(Integer i=0; i<5; i++) {
            List<account> iaccounts = new List<account>();
            for(Integer j=0; j<200; j++) {
                iaccounts.add(new Account(Name=(i * j).format()));
            }
            insert iaccounts;
        }
        Integer accountCount2 = [SELECT COUNT() FROM Account];
        log += '\naccount count 2: ' + accountCount2.format();

        Integer countA = 0;
        Integer countB = 0;
        for(List<account> accounts : [SELECT Id, Name FROM Account]) {
            countA++;
            for(Account account : accounts) {
                countB++;
            }
        }
        log += '\ncount A: ' + countA.format();
        log += '\ncount B: ' + countB.format();
        log += '\n********** ********** ********** ********** ********** ';

        System.debug(log);
    }
}
デバッグログ
22.0 APEX_CODE,FINE;APEX_PROFILING,FINE;DB,INFO;VALIDATION,INFO;WORKFLOW,FINEST
18:27:24.062 (62635000)|EXECUTION_STARTED
18:27:24.062 (62764000)|CODE_UNIT_STARTED|[EXTERNAL]|01pA0000002xdKd|Test.test
18:27:24.062 (62881000)|METHOD_ENTRY|[2]|01pA0000002xdKd|Test.Test()
18:27:24.062 (62955000)|METHOD_EXIT|[2]|Test
18:27:24.063 (63095000)|SOQL_EXECUTE_BEGIN|[7]|Aggregations:0|SELECT COUNT() FROM Account
18:27:24.081 (81325000)|SOQL_EXECUTE_END|[7]|Rows:22
18:27:24.130 (130766000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:25.124 (1124205000)|DML_END|[15]
18:27:25.180 (1180964000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:26.274 (2274698000)|DML_END|[15]
18:27:26.319 (2319497000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:27.406 (3406968000)|DML_END|[15]
18:27:27.451 (3451056000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:28.853 (4853143000)|DML_END|[15]
18:27:28.896 (4896512000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:30.000 (6000677000)|DML_END|[15]
18:27:30.001 (6001131000)|SOQL_EXECUTE_BEGIN|[17]|Aggregations:0|SELECT COUNT() FROM Account
18:27:30.020 (6020864000)|SOQL_EXECUTE_END|[17]|Rows:1022
18:27:30.021 (6021130000)|SOQL_EXECUTE_BEGIN|[22]|Aggregations:0|SELECT Id, Name FROM Account
18:27:30.144 (6144360000)|SOQL_EXECUTE_END|[22]|Rows:1022
18:27:30.303 (6303727000)|USER_DEBUG|[32]|DEBUG|
********** ********** ********** ********** **********
account count 1: 22
account count 2: 1,022
count A: 6
count B: 1,022
********** ********** ********** ********** **********
18:27:30.808 (6303844000)|CUMULATIVE_LIMIT_USAGE
18:27:30.808|LIMIT_USAGE_FOR_NS|(default)|
Number of SOQL queries: 3 out of 100
Number of query rows: 2066 out of 50000
Number of SOSL queries: 0 out of 20
Number of DML statements: 5 out of 150
Number of DML rows: 1000 out of 10000
Number of script statements: 2055 out of 200000
Maximum heap size: 0 out of 3000000
Number of callouts: 0 out of 10
Number of Email Invocations: 0 out of 10
Number of fields describes: 0 out of 100
Number of record type describes: 0 out of 100
Number of child relationships describes: 0 out of 100
Number of picklist describes: 0 out of 100
Number of future calls: 0 out of 10

18:27:30.808|TOTAL_EMAIL_RECIPIENTS_QUEUED|0
18:27:30.808 (6303844000)|CUMULATIVE_LIMIT_USAGE_END

18:27:30.303 (6303947000)|CODE_UNIT_FINISHED|Test.test
18:27:30.303 (6303976000)|EXECUTION_FINISHED
18:27:32.455|CUMULATIVE_PROFILING_BEGIN
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for SOQL operations
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for SOSL operations
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for DML operations
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for method invocations
18:27:32.455|CUMULATIVE_PROFILING_END



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0



◇ 参考


Force.com : Visualforce ページのレコード一覧表示をした際に、ページング機能が欲しい


@途中
2011.07.25 追記



Visualforce ページのレコード一覧表示をした際に、ページング機能が欲しい



ここ ]見れば解決。



○ ページング機能が欲しい
Ex.
  • 表示されているページに対して前のページがある場合は[Prev]を表示して、前頁へ戻れるようにする
  • 表示されているページに対して次ぎのページがある場合は[Next]を表示して、次頁へ進めるようにする
  • ページの最大表示件数は 20 件とする
  • 表示されているページに全件数に対して何件目から何件目までのレコードが表示されているかを示す

■ Visualforce ページ
<apex:page standardController="Foo__c" extensions="FooPagination" tabStyle="Foo__c" action="{!view}">
    <apex:sectionHeader title="Foo" />
    <apex:pageBlock title="Viewing Foos" rendered="{!(dtos.size > 0)}">
        <apex:form id="theForm">
            <apex:pageBlockTable value="{!dtos}" var="d">
                <apex:column style="width:30px;text-align:center;">
                    <apex:facet name="header"><apex:outputText value="No." /></apex:facet>
                    <apex:outputText value="{!d.lineNo}" />
                </apex:column>                
                <apex:column style="width:120px">
                    <apex:facet name="header"><apex:outputText value="Name" /></apex:facet>
                    <apex:outputField value="{!d.foo.Name}" />
                </apex:column>                
            </apex:pageBlockTable>
            <apex:panelGrid columns="3">
                <apex:outputText value="{!page}" />
                <apex:commandLink action="{!first}" rendered="{!ssc.HasPrevious}" value="[First]" />
                <apex:commandLink action="{!previous}" rendered="{!ssc.HasPrevious}" value="[Prev]" />
                <apex:commandLink action="{!next}" rendered="{!ssc.HasNext}" value="[Next]" />
                <apex:commandLink action="{!last}" rendered="{!ssc.HasNext}" value="[Last]" />
            </apex:panelGrid>
        </apex:form> 
    </apex:pageBlock>
</apex:page>

■ FooPagination クラス
public with sharing class FooPagination {

    /**
     * 画面表示クラス
     */
    public class DTO {
        /** 行番号  */
        public Integer lineNo { get; set; }
        /** [Foo]オブジェクト */
        public Foo__c foo { get; set; }
        /**
         * コンストラクタ
         */
        public DTO() {
            lineNo = 0;
            foo = new Foo__c();
        }
    }

    /**
     * コンストラクタ
     * @param controller
     */
    public FooPagination(ApexPages.StandardController controller) {
        // レコード一覧の設定
        ssc = new ApexPages.StandardSetController (Database.getQueryLocator([SELECT Id, Name FROM Foo__c ORDER BY Name]));
        // 一頁最大表示件数の設定(default:20)
        ssc.setPageSize(20);
    }

    /** 画面一覧 */
    public List<DTO> dtos { get; set; }
    /** ページ情報 */
    public String page { get; set; }
    /** StandardSetController */
    public ApexPages.StandardSetController ssc { get; set; }

    /**
     * 表示
     */
    public void view() {
        Integer firstLineNo = ((ssc.getPageNumber() - 1) * ssc.getPageSize()) + 1;

        // ページ情報設定
        page = '';
        page += firstLineNo;
        page += ' - ';
        page += firstLineNo + ssc.getPageSize() - 1;
        page += ' / ';
        page += ssc.getResultSize();

        // 画面一覧設定
        dtos = new List<DTO>();
        List<Foo__c> fs = ssc.getRecords();
        for(Integer i=0; i<fs.size(); i++) {
            DTO d = new DTO();
            d.lineNo = (firstLineNo + i);
            d.foo = fs.get(i);
            dtos.add(d);
        }
    }
    /**
     * 最初のページへ
     */
    public void first() {
        ssc.first();
        view();
    }
    /**
     * 最後のページへ
     */
    public void last() {
        ssc.last();
        view();
    }
    /**
     * 次へ
     */
    public void next() {
        ssc.next();
        view();
    }
    /**
     * 前へ
     */
    public void previous() {
        ssc.previous();
        view();
    }
}



◆ メモ
public void previous() {
    try {
        ssc.previous();
    } catch (System.VisualforceException e) {
        System.debug(e);
        init(ssc.getPageNumber() - 2);
    }
    view();
}
private void init(Integer pageNumber) {
    ssc = new ApexPages.StandardSetController (Database.getQueryLocator([SELECT Id, Name FROM Foo__c ORDER BY Name]));
    for(Integer i=0; i<pageNumber; i++) {
        ssc.next();
    }
}



◆ メモ (注意)
  • 「このページは QueryLocator を使用しますが、これは無効です。QueryLocator はユーザあたり 5 個という制限があります。」のメッセージが表示される場合:
    Edit: This only happens after 15 minutes of idle usage. If after that point someone tries to call a method on the StandardSetController it throws an uncatchable exception.

    Community - Working around "This page uses a QueryLocator that... - Force.com Discussion Boards
    ... 15 分以上放置してページ遷移しようとしたら、catch できない例外が発生するらしい ;-(。



◆ StandardSetController クラス
@TODO



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0



◇ 参考

2011-06-30

Force.com : NewsFeed メモ

 
@途中



NewsFeed メモ



○ 一覧の取得

※ Summer'11 から FeedPost は非推奨となり、API バージョン 22.0 以降では使用できない
  → pdf: Salesforce.com Summer '11 リリースノート
NewsFeed[] nfs = [SELECT Id, Type, ParentId, Parent.Name, CreatedBy.Id, CreatedBy.Name, CreatedDate, FeedPost.Body, FeedPost.Title, FeedPost.LinkUrl
                    ,(SELECT Id, FieldName, OldValue, NewValue FROM FeedTrackedChanges)
                    ,(SELECT Id, CreatedDate, CreatedById, CreatedBy.Name, CommentBody FROM FeedComments ORDER BY CreatedDate DESC)
                    FROM NewsFeed 
                    ORDER BY CreatedDate DESC, Id DESC];

for(NewsFeed nf : nfs) {
    String s = '\n********** ********** ********** ********** **********';
    s += '\n type: ' + nf.Type;
    s += '\n parent id: ' + nf.ParentId;
    s += ', parent name: ' + nf.Parent.Name;
    s += '\n created by id: ' + nf.CreatedBy.Id;
    s += ', created by name: ' + nf.CreatedBy.Id;
    s += ', created date: ' + nf.CreatedDate;
    s += '\n feed post body: ' + nf.FeedPost.Body;
    s += '\n feed post title: ' + nf.FeedPost.Title;
    s += ', feed post link url: ' + nf.FeedPost.LinkUrl;

    if(nf.FeedTrackedChanges.size() > 0) {
        // [フィード追跡]に関する情報
        // [type: TrackedChange]の場合に設定される
        s += '\n * feed teacked changes';
        for(FeedTrackedChange ftc : nf.FeedTrackedChanges) {
            s += '\n* field name: ' + ftc.FieldName;
            s += ', old value: ' + ftc.OldValue;
            s += ', new value: ' + ftc.NewValue;
        }
    }

    if(nf.FeedComments.size() > 0) {
        // Chatter に投稿されたレコードのコメントに関する情報
        s += '\n * feed comments';
        for(FeedComment fc : nf.FeedComments) {
            s += '\n* created by id: ' + fc.CreatedBy.Id;
            s += ', created by name: ' + fc.CreatedBy.Id;
            s += ', created date: ' + fc.CreatedDate;
            s += ', comment body: ' + fc.CommentBody;
        }
    }
    s += '\n********** ********** ********** ********** **********';
    System.debug(s);
}



○ メモ

  • 実行ユーザの投稿か、実行ユーザがフォローしているユーザもしくはレコードの投稿のみを取得する(ユーザの[ホーム]タブに表示される情報を取得する)
  • 他のユーザの投稿を取得するには UserProfileFeed を使用する



◇ 環境

  • Salesforce - Developer Edition - API バージョン 20.0



◇ 参考

 

2011-05-06

Force.com : メモ - Force.com Connect Offline


メモ - Force.com Connect Offline



◆ 標準ボタンの表示について

  • 変更は不可能
  • 「編集」「削除」「コピー」が表示される



◆ カスタムボタンの表示について

  • 利用できない



◆ Visualforce の画面について

  • 利用できない



◆ クライアントで Force.com Connect Offline がタイムアウトを発生する場合の対応

  1. [レジストリエディタ]を起動する([Windows キー + R キー]から[regedit]を実行する)
  2. [HKEY_LOCAL_MACHINE]→[SOFTWARE]→[salesforce.com]→[Offline2]から[HttpTimeout]レジストリの設定を変更する



◇ 参考


2011-05-02

Force.com : ワークフローの設定を行いたい


ワークフローの設定
  • 特定の項目の自動更新を行いたい



○ 特定の項目の自動更新を行いたい

Ex.
  1. オブジェクト[A]とその項目に[項目1][項目2]を作成する (略)
  2. オブジェクト[A]のレコードが新規作成、更新時に[項目1]に「foo」という値が設定されていたら[項目2]に「boo」という値を自動で設定する

  1. [アプリケーションの設定]→[作成]→[ワークフローと承認申請]→[ワークフロールール]
  2. ワークフロールール画面の[新規ルール]ボタンを押下
    1. [ステップ1]オブジェクトの選択
      • オブジェクトの選択: A
      [次へ]ボタンを押下
    2. [ステップ2]ワークフロールールの設定
      • ルールの編集
        • オブジェクト: A 
        • ルール名: Aオブジェクト項目2の自動更新 
        • 説明: (※ 任意)
      • 評価条件 ★ 1.
        • ルールの評価: レコードが作成されたときまたはルール条件を満たしていなかったレコードが編集されたときだけ
      • ルールの条件
        • 次の場合に、このルールを実行します。: 条件が一致する
        • 条件: [項目]項目1 [演算子]次の文字列と一致する [値]foo
      [保存 & 次へ]ボタンを押下
    3. [ステップ3] ワークフローアクションの指定 [ルール適用時のアクション]の[ワークフローアクションの追加]から[新規項目自動更新]を選択
      1. ID
        • 名前: A.項目2
        • 一意の名前: update_A_item2
        • 説明: (※ 任意)
        • オブジェクト: A
        • 更新する項目: 項目2
        [更新する項目]を選択後しばらくすると、[新規項目地の設定]等が表示される
        • 項目データの種別: テキスト (※ [項目2]はテキスト型で作成)
      2. 新規項目値の指定
        • テキストオプション: 数式を使用して新しい値を設定する [数式]"boo"
      3. [保存]ボタンを押下
    4. [ステップ3] ワークフローアクションの指定 [完了]ボタンを押下
  3. 作成したワークフロールールの詳細画面から[有効化]ボタンを押下



◇ メモ

■ ★ 1.
  • [レコードが作成されたときまたはルール条件を満たしていなかったレコードが編集されたときだけ]
    ルールが適用済みですでにルール条件を満たしている場合を除き、このオプションを選択して新規レコードと既存のレコードへの更新を含めます。このルールは、ルール条件に影響しない編集作業によって再度起動されることはありません。
  • [レコードが作成されたときだけ]
    既存レコードの更新時には適用しない場合は、このオプションを選択します。
  • [レコードが作成されたか編集されたとき]
    すでに条件を満たしているかどうかに関わらず、新規レコードと既存レコードの更新に適用する場合は、このオプションを選択します。[レコードが作成されたか編集されたとき] を選択すると、そのルールには時間ベースのアクションを追加できません。



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

2011-04-25

Force.com : 操作 - Force.com Connect Offline


操作 - Force.com Connect Offline
  • Force.com Connect Offline の起動



◆ Force.com Connect Offline の起動

  1. [$CONNECT-OFFLINE_HOME\bin\Offline 2 Runtime.exe]を起動する
  2. Offline ランタイム
    • ユーザ名 : ログインするユーザ名
    • パスワード : ログインするユーザのパスワード
    • タブの名称を更新 : Salesforce の項目、オブジェクト、およびタブの名前に対する変更があった場合更新が行われる
    • 私のデータを同期 : Connect Offline ブリーフケースと Salesforce との同期が行われる
  3. [ログイン]ボタンを押下



◇ Force.com Connect Offline の起動のメモ

  • 起動 : 初回ログイン時にはインターネットに接続していること
  • パスワード : 必要であれば、パスワードにセキュリティートークンを付加する



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

Force.com : 設定 - Force.com Connect Offline


設定 - Force.com Connect Offline
  • ライセンスの割り当て
  • クライアントに対しての Force.com Connect Offline のインストール
  • ブリーフケースの設定



◆ ライセンスの割り当て

  1. [管理者設定]→[ユーザの管理]→[ユーザ]
  2. ライセンスを割り当てるユーザの[編集]ボタンを押下
  3. [オフラインユーザ]のチェックボックスを ON にする
  4. [保存]ボタンを押下



◆ クライアントに対しての Force.com Connect Offline のインストール

  1. [個人設定]→[デスクトップ統合]→[Force.com Connect Offline]
  2. [今すぐインストール]ボタンを押下
  3. DL した .exe ファイルからインストールを行う



◆ ブリーフケースの設定

Ex.
  • ブリーフケースを設定するユーザのプロファイルを「OfflineUser」とする


  1. [管理者の設定]→[デスクトップ管理者]→[オフラインブリーフケース構成]
  2. [すべてのオフラインブリーフケース構成]から[新規オフラインブリーフケース構成]ボタンを押下
  3. オフラインブリーフケース構成の編集
    • 名前 : TEST-01
    • 有効 : ON 
    • 説明 : (任意)
    • ユーザとプロファイルの割り当て : プロファイル: OfflineUser
  4. [保存]ボタンを押下
  5. 作成した「TEST-01」の[データセット]から[編集]ボタンを押下
  6. データセットを定義
  7. [完了]ボタンを押下



◇ ブリーフケースの設定のメモ

  • ブリーフケースが割り当てられていないユーザにはデフォルトの Connect Offline ブリーフケースが割り当てられる
  • 1 つのユーザまたはプロファイルに設定できるブリーフケースは 1 つだけとなる
    Ex. 上記で設定したブリーフケースに加え下記を設定する
    1. [すべてのオフラインブリーフケース構成]から[新規オフラインブリーフケース構成]ボタンを押下
    2. オフラインブリーフケース構成の編集
      • 名前 : TEST-02
      • 有効 : ON 
      • 説明 : (任意)
      • ユーザとプロファイルの割り当て : プロファイル: OfflineUser
    3. [保存]ボタンを押下
    「TEST-01」から割り当てたプロファイル(「プロファイル: OfflineUser」)は削除される



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

2011-04-22

Force.com : 特定のオブジェクトに対して、アクセス権を制御したい


特定のオブジェクトに対して、アクセス権を制御したい
  • レコードの所有者に基づいてアクセス権を制限したい
  • 条件基づいてアクセス権を制限したい
  • 所有しているレコードのみアクセス権を制限したい



◆ 準備

■ オブジェクト
  • オブジェクト名 : X
  • オブジェクト名 : Y
    • 項目 : キーワード(選択リスト)
  • オブジェクト名 : Z


■ プロファイル (カスタムオブジェクト権限)
参照 作成 編集 削除 参照 作成 編集 削除 参照 作成 編集 削除
P-企画××××××××
P-開発×××××××××××
P-営業×××××××××××
P-一般×××××××××××
P-その他××××××××


■ ロール
  • R-企画
  • R-開発
  • R-営業
  • R-一般
  • R-その他


■ ユーザ
  • R-企画 ⇔ P-企画
  • R-開発 ⇔ P-開発
  • R-営業 ⇔ P-営業
  • R-一般 ⇔ P-一般
  • R-その他 ⇔ P-その他



○ レコードの所有者に基づいてアクセス権を制限したい

Ex.
  • オブジェクト[X]に対して、ロールが「R-企画」「R-開発」「R-営業」のレコードは、ロールが「R-企画」「R-開発」「R-営業」のみ参照可とする
  • オブジェクト[X]に対して、ロールが「R-企画」「R-開発」「R-営業」のレコードは、ロールが「R-企画」のみ更新可とする
  • それ以外のユーザには参照・更新できないとする


■ 公開グループの作成
  1. [管理者の設定]→[ユーザの管理]→[公開グループ]
  2. [新規]ボタンを押下
  3. 新規グループ
    • グループ名 : グループA
    • 選択済みのユーザ : ロール: R-企画, ロール: R-開発, ロール: R-営業
  4. [保存]ボタンを押下
  5. [新規]ボタンを押下
  6. 新規グループ
    • グループ名 : グループB
    • 選択済みのユーザ : ロール: R-企画
  7. [保存]ボタンを押下


■ 共有ルールの設定
  1. [管理者の設定]→[セキュリティのコントロール]→[共有設定]
  2. [組織の共有設定]の[編集]ボタンを押下
  3. 組織の共有設定の編集
    • X : 非公開
  4. [保存]ボタンを押下
  5. [X共有ルール]の[新規]ボタンを押下
  6. X共有ルール
    • ステップ1: ルールタイプ : レコードの所有者に基づく
    • ステップ2: X: 所有者の所属 : グループ: グループA
    • ステップ3: 共有先 : グループ: グループA
    • ステップ4: アクセス権 : 参照のみ
  7. [保存]ボタンを押下
  8. [X共有ルール]の[新規]ボタンを押下
  9. X共有ルール
    • ステップ1: ルールタイプ : レコードの所有者に基づく
    • ステップ2: X: 所有者の所属 : グループ: グループA
    • ステップ3: 共有先 : グループ: グループB
    • ステップ4: アクセス権 : 参照・更新
  10. [保存]ボタンを押下



○ 条件基づいてアクセス権を制限したい

Ex.
  • オブジェクト[Y]に対して、[キーワード]が「いっぱん」レコードは、ロールが「R-一般」のみ参照可とする
  • それ以外のユーザには参照・更新できないとする


■ 公開グループの作成
  1. [管理者の設定]→[ユーザの管理]→[公開グループ]
  2. [新規]ボタンを押下
  3. 新規グループ
    • グループ名 : グループC
    • 選択済みのユーザ : ロール: R-一般
  4. [保存]ボタンを押下


■ 共有ルールの設定
  1. [管理者の設定]→[セキュリティのコントロール]→[共有設定]
  2. [組織の共有設定]の[編集]ボタンを押下
  3. 組織の共有設定の編集
    • Y : 非公開
  4. [保存]ボタンを押下
  5. [Y共有ルール]の[新規]ボタンを押下
  6. Y共有ルール
    • ステップ1: ルールタイプ : 条件に基づく
    • ステップ2: 項目「キーワード」, 演算子「次の文字と一致する」, 値「いっぱん」
    • ステップ3: 共有先 : グループ: グループA
    • ステップ4: アクセス権 : 参照のみ


□ 共有ルールの設定のメモ
  • 各オブジェクトに、最大 50 件の条件が指定可能
  • 共有の条件として使用できる項目
    • レコードタイプ
      • 標準項目:
      • 名前
      • 所有者 ID
      • 作成者 ID
      • 最終更新者 ID
    • カスタム項目:
      • 自動採番
      • チェックボックス
      • 日付
      • 日付/時間
      • 電子メール
      • 数値
      • パーセント
      • 電話
      • 選択リスト
      • テキスト
      • テキストエリア
      • URL
      • 参照関係 (ユーザ ID またはキュー ID に対して)



○ 所有しているレコードのみアクセス権を制限したい

Ex.
  • オブジェクト[Z]に対して、所有しているレコードのみのみ参照・更新とする
  • それ以外のユーザには参照・更新できないとする


■ 共有ルールの設定
  1. [管理者の設定]→[セキュリティのコントロール]→[共有設定]
  2. [組織の共有設定]の[編集]ボタンを押下
  3. 組織の共有設定の編集
    • X : 非公開
  4. [保存]ボタンを押下






◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

2011-04-15

Force.com : Visualforce のページから承認プロセスを行いたい


@TODO 一旦投稿。



Visualforce のページから承認プロセスを行いたい



○ Visualforce のページから承認プロセスを行いたい

Ex. @TODO 適当に(あとで修正する
  1. [設定]→[アプリケーションの設定]→[作成]→[ワークフローと承認申請]→[承認プロセス]から[取引先]オブジェクトに対して適当な承認プロセスを作成し、有効にしておく
  2. [取引先]レコードはどこかで作成しておく
  3. [取引先]レコードの[申請][承認][却下][取消]処理を行う画面を作成し、処理を行う

■ Visualforce ページ
<apex:page controller="AccountController" tabStyle="Account">
    <apex:sectionHeader title="[取引先]" subtitle="申請・承認・却下・取消" />
    <apex:pageMessages />
    <apex:form >
        <apex:pageBlock title="xx" mode="edit">
            <apex:pageBlockButtons >
                <apex:commandButton action="{!apply}" value="申請" />
                <apex:commandButton action="{!approve}" value="承認"  />
                <apex:commandButton action="{!reject}" value="却下"  />
                <apex:commandButton action="{!cancel}" value="取消"  />
            </apex:pageBlockButtons>
            <apex:pageBlockSection title="取引先情報">
                <apex:outputField value="{!dto.account.name}"/>
                <apex:outputText value="ステータス( {!dto.status} )" id="status" />
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>


■ AccountController クラス
public with sharing class AccountController {

    /** 画面表示クラス */
    public class DTO {
        public Account account { get; set; }
        public String status { get; set; }

        public DTO(){
            account = new Account();
            status = '';
        }
    }
    public DTO dto { get; set; }

    /**  コンストラクタ */
    public AccountController() {
        Id id = ApexPages.currentPage().getParameters().get('id');
        dto = new DTO();
        dto.account = [SELECT Id, Name FROM Account WHERE Id = :id];

        Integer cnt = [SELECT COUNT() FROM ProcessInstance WHERE TargetObjectId = :id AND Status = 'Pending'];
        if(cnt != 0) {
            dto.status = '申請中';
        }
    }

    /** 申請 */
    public PageReference apply() {
        Id id = ApexPages.currentPage().getParameters().get('id');

        Approval.ProcessSubmitRequest request =  new Approval.ProcessSubmitRequest();
        request.setNextApproverIds(new Id[]{UserInfo.getUserId()});
        request.setObjectId(id);
        Approval.ProcessResult result;
        try {
            result = Approval.process(request);
        } catch (System.DmlException e) {
            if(e.getMessage().contains('NO_APPLICABLE_PROCESS')) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, '承認プロセスに該当するレコードではありませんでした.'));
                return null;
            }
        }

        if(result.isSuccess()) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, '申請に成功しました.'));
            dto.status = '申請中';
        } else {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '申請に失敗しました.'));
        }
        return null;
    }

    /** 承認 */
    public PageReference approve() {
        Id id = ApexPages.currentPage().getParameters().get('id');

        Integer cnt = [SELECT COUNT() FROM ProcessInstance WHERE TargetObjectId = :id AND Status = 'Pending'];
        if(cnt == 0) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, '申請済みのレコードではありません.'));
            return null;
        }
        Id processId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = :id AND Status = 'Pending' LIMIT 1].Id;
        Id workitemId = [SELECT Id FROM ProcessInstanceWorkitem WHERE ProcessInstanceId= :processId LIMIT 1].Id;

        Approval.ProcessWorkitemRequest request = new Approval.ProcessWorkitemRequest();
        request.setAction('Approve');
        request.setNextApproverIds(new Id[]{UserInfo.getUserId()});
        request.setWorkitemId(workitemId);
        Approval.ProcessResult result = Approval.process(request);

        if(result.isSuccess()) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, '承認に成功しました.'));
            dto.status = '';
        } else {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '承認に失敗しました.'));
        }
        return null;
    }

    /** 却下 */
    public PageReference reject() {
        // @TODO
        return null;
    }

    /** 取消 */
    public PageReference cancel() {
        // @TODO
        return null;
    }
}



◆ ProcessInstance オブジェクト

  • ID
  • TARGETOBJECTID
  • STATUS
  • ISDELETED
  • CREATEDDATE
  • CREATEDBYID
  • LASTMODIFIEDDATE
  • LASTMODIFIEDBYID
  • SYSTEMMODSTAMP
  • @TODO



◆ ProcessInstanceWorkitem オブジェクト

  • ID
  • PROCESSINSTANCEID
  • ORIGINALACTORID
  • ACTORID
  • ISDELETED
  • CREATEDDATE
  • CREATEDBYID
  • SYSTEMMODSTAMP
  • @TODO



◆ Approval オブジェクト

  • ID
  • ISDELETED
  • PARENTID
  • OWNERID
  • CREATEDDATE
  • CREATEDBYID
  • LASTMODIFIEDDATE
  • LASTMODIFIEDBYID
  • STATUS
  • REQUESTCOMMENT
  • APPROVECOMMENT
  • SYSTEMMODSTAMP
  • @TODO



◆ ProcessSubmitRequest クラス

  • @TODO



◆ ProcessWorkitemRequest クラス

  • @TODO



◇ @TODO

  • @TODO な箇所諸々
  • レコードのロック?
  • [申請][承認]処理は確認済み



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


Force.com : 標準の salesforce の詳細ページと同じ画面を Visualforce ページで表示したい[Visualforceタグ]


標準の salesforce の詳細ページと同じ画面を Visualforce ページで表示したい (<apex:detail>)



◆ <apex:detail> コンポーネント

<apex:page>
    <apex:detail />
</apex:page>

属性備考
inlineEdit="(true|false)"
  • インライン編集が可能を指定する
  • <apex:form> コンポーネント内で使用可能
  • デフォルト : false
  • 型 : Boolean
relatedList="(true|false)"
  • 関連リスト等を表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
rendered="(true|false)"
  • ページ上に表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
showChatter="(true|false)"
  • Chatter を表示するかを指定する
  • <apex:page> コンポーネントの[showHeader]属性が「true」であること
    かつ
    <apex:page> コンポーネントの[title]属性が「true」であること
  • デフォルト : false
  • 型 : Boolean
subject="(ID)"
  • レコードの ID を指定する
  • 型 : String
title="(true|false)"
  • タイトル(<apex:sectionHeader> コンポーネントあたり)を表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
※ 詳細は apex:detail を参照



○ 標準の salesforce の詳細ページと同じ画面を Visualforce ページで表示したい

Ex.
  1. [取引先]オブジェクトの[タイトル]欄と[取引先の詳細]欄のみをインライン編集を可能な状態で表示する

■ Visualforce ページ
<apex:page standardController="Account">
    <apex:form>
        <apex:detail subject="{!account.Id}" relatedList="false" inlineEdit="true" />
    </apex:form>
</apex:page>
※ レコードの id が存在しない場合は、真っ白のページとなる



◇ @TODO

  • ページレイアウトの割り当てが行われている時の表示



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


Force.com : 任意のテキストを表示したい[Visualforceタグ]


任意のテキストを表示したい (<apex:outputText>)
  • 任意の日付を表示したい
  • 任意の数値を表示したい



◆ <apex:outputText> コンポーネント

<apex:page>
    <apex:outputText value="(表示文字列)" />
</apex:page>

属性備考
rendered="(true|false)"
  • ページ上に表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
value="(表示文字列)"
※ 詳細は apex:outputText を参照



○ 任意の日付を表示したい

Ex.
  1. 今の日付時刻を表示する
  2. 今の日付時刻を[yyyy-MM-dd HH:mm:ss]の形式で表示する

■ Visualforce ページ
<apex:page>
    <-- 1. -->
    <apex:outputText value="只今の日付時刻 : {!NOW()}" />
    <p />

    <-- 2. -->
    <apex:outputText value="只今の日付時刻 : {0, date, yyyy-MM-dd HH:mm:ss}">
        <apex:param value="{!NOW()}" />
    </apex:outputText>
    <p />
</apex:page>



○ 任意の数値を表示したい

Ex.
  1. 「1234567890123」を[金額]の形式で表示する
  2. 「0.10」を[%]の形式で表示する

■ Visualforce ページ
<apex:page>
    <-- 1. -->
    <-- 表示:$1,234,567,890,123.00 -->
    <apex:outputText value="{0, number, currency}">
        <apex:param value="{!VALUE('1234567890123')}" />
    </apex:outputText>
    <p />
    <-- 表示:1,234,567,890,123 -->
    <apex:outputText value="{0, number, ###,###,###}">
        <apex:param value="{!VALUE('1234567890123')}" />
    </apex:outputText>
    <p />

    <-- 2. -->
    <-- 表示:10% -->
    <apex:outputText value="{0, number, percent}">
        <apex:param value="{!VALUE('0.10')}" />
    </apex:outputText>
</apex:page>



◇ @TODO

  • Locale の設定の仕方



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


2011-04-13

Force.com : 任意のチェックボックスを作成したい[Visualforceタグ]


任意のチェックボックスを作成したい (<apex:selectCheckboxes>)



◆ <apex:selectCheckboxes> コンポーネント

<apex:page controller="SampleController">
    <apex:form>
        <apex:selectCheckboxes value="{!(選択値)}" >
            <apex:selectOptions value="{!(選択オプション)}"/>
        </apex:selectCheckboxes>
    </apex:form>
</apex:page>

属性備考
disabled="(true|false)"
  • 無効の状態で表示するかを指定する
  • デフォルト : false
  • 型 : Boolean
disabledClass="(CSS クラス名)"
  • 無効な状態での CSS を指定する
  • 型 : String
enabledClass="(CSS クラス名)"
  • 有効な状態での CSS を指定する
  • 型 : String
readonly="(true|false)"
  • 読み取りのみにするか指定する
  • デフォルト : false
  • 型 : Boolean
rendered="(true|false)"
  • ページ上に表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
required="(true|false)"
  • 必須のフィールドであるかを指定する
  • デフォルト : false
  • 型 : Boolean
value="{!(選択値)}"
  • 選択値を指定する
  • 型 : String[]
※ 詳細は apex:selectCheckboxes を参照



○ 任意のチェックボックスを作成したい

Ex.
  1. 色のチェックボックスを作成する
  2. 色を選択し、ボタンを押下する
  3. 画面を再描画する
  4. 選択したすべての色[value]値を選択した色で表示する

■ Visualforce ページ
<apex:page controller="SampleController">
    <apex:form >
        <apex:selectCheckboxes value="{!selections}" >
            <apex:selectOptions value="{!options}"/>
        </apex:selectCheckboxes>
        <p />
        <apex:commandButton value="button" action="{!redraw}" rerender="out" />
    </apex:form>
    <p />
    <apex:outputPanel id="out">
        <apex:outputText value="▼ selected options" />
        <hr />
        <apex:outputPanel >
            <apex:dataList value="{!selections}" var="s">
                <apex:outputText style="color:{!s}" value="{!s}" />
            </apex:dataList>
        </apex:outputPanel>
    </apex:outputPanel>
</apex:page>


■ SampleController クラス
public with sharing class SampleController {

    /** 選択値 */
    public String[] selections = new String[]{};

    /** 再描画処理 */
    public PageReference redraw() {
        return null;
    }

    /** 選択オプション取得 */
    public List<SelectOption> getOptions() {
        List<SelectOption> options = new List<SelectOption>();
        options.add(new SelectOption('Red', '赤'));
        options.add(new SelectOption('Yellow ', '黄'));
        options.add(new SelectOption('Green', '緑'));
        options.add(new SelectOption('Blue', '青'));
        options.add(new SelectOption('Purple', '紫'));
        return options;
    }

    /** 選択値取得 */
    public String[] getSelections() {
        return selections;
    }

    /** 選択値設定 */
    public void setSelections(String[] values) {
        this.selections = values;
    }
}
※ <apex:selectList>, <apex:selectRadio> コンポーネントの場合は
    /** 選択値 */
    public String[] selections { get; set; }
でもいけたのに、 <apex:selectCheckboxes> コンポーネントだとだめだった


■ 画面イメージ



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


Force.com : 任意のラジオボタンを作成したい[Visualforceタグ]


任意のラジオボタンを作成したい (<apex:selectRadio>)



◆ <apex:selectRadio> コンポーネント

<apex:page controller="SampleController">
    <apex:form>
        <apex:selectRadio value="{!(選択値)}">
            <apex:selectOptions value="{!(選択オプション)}"/>
        </apex:selectRadio>
    </apex:form>
</apex:page>

属性備考
disabled="(true|false)"
  • 無効の状態で表示するかを指定する
  • デフォルト : false
  • 型 : Boolean
disabledClass="(CSS クラス名)"
  • 無効な状態での CSS を指定する
  • 型 : String
enabledClass="(CSS クラス名)"
  • 有効な状態での CSS を指定する
  • 型 : String
readonly="(true|false)"
  • 読み取りのみにするか指定する
  • デフォルト : false
  • 型 : Boolean
rendered="(true|false)"
  • ページ上に表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
required="(true|false)"
  • 必須のフィールドであるかを指定する
  • デフォルト : false
  • 型 : Boolean
value="{!(選択値)}"
  • 選択値を指定する
  • 型 : String
※ 詳細は apex:selectRadio を参照



○ 任意のラジオボタンを作成したい

Ex.
  1. 色のラジオボタンを作成する
  2. 色を選択し、ボタンを押下する
  3. 画面を再描画する
  4. 選択した色の[value]値を選択した色で表示する

■ Visualforce ページ
<apex:page controller="SampleController">
    <apex:form >
        <apex:selectRadio value="{!selection}">
            <apex:selectOptions value="{!options}"/>
        </apex:selectRadio>
        <p />
        <apex:commandButton value="button" action="{!redraw}" rerender="out" />
    </apex:form>
    <p />
    <apex:outputPanel id="out">
        <apex:outputText value="▼ selected options" />
        <hr />
        <apex:outputPanel >
            <apex:outputText style="color:{!selection}" value="{!selection}" />
        </apex:outputPanel>
    </apex:outputPanel>
</apex:page>


■ SampleController クラス
public with sharing class SampleController {

    /** 選択値 */
    public String selection { get; set; }

    /** 再描画処理 */
    public PageReference redraw() {
        return null;
    }

    /** 選択オプション取得 */
    public List<SelectOption> getOptions() {
        List<SelectOption> options = new List<SelectOption>();
        options.add(new SelectOption('Red', '赤'));
        options.add(new SelectOption('Yellow ', '黄'));
        options.add(new SelectOption('Green', '緑'));
        options.add(new SelectOption('Blue', '青'));
        options.add(new SelectOption('Purple', '紫'));
        return options;
    }
}


■ 画面イメージ



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


Force.com : 任意の選択リストを作成したい[Visualforceタグ]


任意の選択リストを作成したい (<apex:selectList>)
  • 任意の単一選択リストを作成したい
  • 任意の複数選択リストを作成したい



◆ <apex:selectList> コンポーネント

<apex:page controller="SampleController">
    <apex:form>
        <apex:selectList value="{!(選択値)}" size="(表示数)" multiselect="(true|false)">
            <apex:selectOptions value="{!(選択オプション)}"/>
        </apex:selectList>
    </apex:form>
</apex:page>

属性備考
disabled="(true|false)"
  • 無効の状態で表示するかを指定する
  • デフォルト : false
  • 型 : Boolean
disabledClass="(CSS クラス名)"
  • 無効な状態での CSS を指定する
  • 型 : String
enabledClass="(CSS クラス名)"
  • 有効な状態での CSS を指定する
  • 型 : String
multiselect="(true|false)"
  • 複数選択可能かを指定する
  • デフォルト : false
  • 型 : Boolean
readonly="(true|false)"
  • 読み取りのみにするか指定する
  • デフォルト : false
  • 型 : Boolean
rendered="(true|false)"
  • ページ上に表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
required="(true|false)"
  • 必須のフィールドであるかを指定する
  • デフォルト : false
  • 型 : Boolean
size="(表示数)"
  • 表示するオプションのサイズを指定する
  • 指定がない場合は、選択可能なすべてのオプションが表示される
  • 型 : String
value="{!(選択値)}"
  • 選択値を指定する
  • multiselect="true" の場合の型 : String[]
  • multiselect="false" の場合の型 : String
※ 詳細は apex:selectList を参照



○ 任意の単一選択リストを作成したい

Ex.
  1. 色の選択リストを作成する
  2. 色を選択し、ボタンを押下する
  3. 画面を再描画する
  4. 選択した色の[value]値を選択した色で表示する

■ Visualforce ページ
<apex:page controller="SampleController">
    <apex:form >
        <apex:selectList value="{!selection}" size="1" style="width:120px;">
            <apex:selectOptions value="{!options}"/>
        </apex:selectList>
        <p />
        <apex:commandButton value="button" action="{!redraw}" rerender="out" />
    </apex:form>
    <p />
    <apex:outputPanel id="out">
        <apex:outputText value="▼ selected options" />
        <hr />
        <apex:outputPanel >
            <apex:outputText style="color:{!selection}" value="{!selection}" />
        </apex:outputPanel>
    </apex:outputPanel>
</apex:page>


■ SampleController クラス
public with sharing class SampleController {

    /** 選択値 */
    public String selection { get; set; }

    /** 再描画処理 */
    public PageReference redraw() {
        return null;
    }

    /** 選択オプション取得 */
    public List<SelectOption> getOptions() {
        List<SelectOption> options = new List<SelectOption>();
        options.add(new SelectOption('Red', '赤'));
        options.add(new SelectOption('Yellow ', '黄'));
        options.add(new SelectOption('Green', '緑'));
        options.add(new SelectOption('Blue', '青'));
        options.add(new SelectOption('Purple', '紫'));
        return options;
    }
}


■ 画面イメージ



○ 任意の複数選択リストを作成したい

Ex.
  1. 色の複数選択リストを作成する
  2. 色を選択し、ボタンを押下する
  3. 画面を再描画する
  4. 選択したすべての色[value]値を選択した色で表示する

■ Visualforce ページ
<apex:page controller="SampleController">
    <apex:form >
        <apex:selectList value="{!selections}" size="5" multiselect="true" style="width:120px;">
            <apex:selectOptions value="{!options}"/>
        </apex:selectList>
        <p />
        <apex:commandButton value="button" action="{!redraw}" rerender="out" />
    </apex:form>
    <p />
    <apex:outputPanel id="out">
        <apex:outputText value="▼ selected options" />
        <hr />
        <apex:outputPanel >
            <apex:dataList value="{!selections}" var="s">
                <apex:outputText style="color:{!s}" value="{!s}" />
            </apex:dataList>
        </apex:outputPanel>
    </apex:outputPanel>
</apex:page>


■ SampleController クラス
public with sharing class SampleController {

    /** 選択値 */
    public String[] selections { get; set; }

    /** 再描画処理 */
    public PageReference redraw() {
        return null;
    }

    /** 選択オプション取得 */
    public List<SelectOption> getOptions() {
        List<SelectOption> options = new List<SelectOption>();
        options.add(new SelectOption('Red', '赤'));
        options.add(new SelectOption('Yellow ', '黄'));
        options.add(new SelectOption('Green', '緑'));
        options.add(new SelectOption('Blue', '青'));
        options.add(new SelectOption('Purple', '紫'));
        return options;
    }
}


■ 画面イメージ



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


Force.com : 任意の選択オプションを作成したい[Visualforceタグ]


任意の選択オプションを作成したい (<apex:selectOptions>)



◆ <apex:selectOptions> コンポーネント

<apex:page controller="SampleController">
    <apex:form>
        <apex:selectList value="{!(選択値)}" size="(表示数)" multiselect="(true|false)">
            <apex:selectOptions value="{!(選択オプション)}"/>
        </apex:selectList>
    </apex:form>
</apex:page>

備考
<apex:selectCheckBoxes>, <apex:selectRadio>, <apex:selectList> コンポーネント内で使用可能
属性備考
rendered="(true|false)"
  • ページ上に表示するかを指定する
  • デフォルト : true
  • 型 : Boolean
value="{!(選択値)}"
  • 必須項目
  • 選択オプションを指定する
  • 型 : Object(SelectOption クラスのリスト)
※ 詳細は apex:selectOptions を参照



○ 任意の選択オプションを作成したい

下記を参照



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


2011-04-12

Force.com : 標準の salesforce のページから Visualforce のページへ遷移したい

 
標準の salesforce のページから Visualforce のページへ遷移したい
  • カスタムボタン・リンクの設定
  • [controller]属性を指定した Visualforce ページを表示したい



○ カスタムボタン・リンクの設定

■ 準備
  • [standardController]属性を指定した Visualforce ページを用意する
  • [standardController]属性のオブジェクトとVisualforce のページを表示したいオブジェクトは一緒のこと

■ 設定
  1. [設定]→[アプリケーションの設定]→[(Visualforce のページを表示したいオブジェクト)]を押下
  2. オブジェクトのカスタムボタンとカスタムリンクの[新規]ボタンを押下
  3. カスタムボタン・リンクの設定
    • 表示ラベル : 画面で表示される名称
    • 名前 : システムで使われる名称
    • 説明 : ボタン・リンクの任意の説明
    • 表示の種類 : ボタン・リンクを表示する場所を指定
      • 詳細ページリンク
      • 詳細ページボタン
      • リストボタン
    • 動作 : 画面の表示方法を指定 
      • 新規ウィンドウに表示
      • 現在のウィンドウにサイドバー付きで表示
      • 現在のウィンドウにサイドバーなしで表示
      • 現在のウィンドウにサイドバーおよびヘッダなしで表示
      • JavaScript を実行 : [内容のソース]で「Visualforce ページ」を選択できない
      (※ サイドバー、ヘッダの表示・非表示は <apex:page> タグで指定したほうがよさ気)
    • 内容のソース : 「Visualforce ページ」を選択
    • コンテンツ : 準備した Visualforce ページを選択
  4. カスタムボタンまたはカスタムリンクの編集の[保存]ボタンを押下
  5. 必要があればオブジェクトのカスタムボタンとカスタムリンク欄の[作成したボタン・リンク]を押下し、[ウィンドウオープンプロパティ]ボタンからウィンドウのプロパティの設定を行う
  6. オブジェクトのページレイアウトにボタン・リンクを配置する



○ [controller]属性を指定した Visualforce ページを表示したい

  • Ex. [取引先]オブジェクトの標準 salesforce のページに[ContactListController]クラスを呼び出すカスタムボタン・リンクを作成したい
■ Visualforce ページ
<apex:page standardController="Account" extensions="ConatctListController" tabStyle="Contact" action="{!view}">
    <apex:sectionHeader title="取引先責任者一覧" />
    <apex:pageMessages id="messagearea" showDetail="false" />
    <apex:outputpanel >
        <apex:pageBlock title="" rendered="{!(dtos.size == 0)}">レコードはありません。</apex:pageBlock>
        <apex:pageBlock title="{!pageBlockTitle}" rendered="{!(dtos.size > 0)}">
            <apex:pageblockTable value="{!dtos}" var="d">
                <apex:column style="width:120px;">
                    <apex:facet name="header"><apex:outputText value="{!$ObjectType.Contact.fields.Name.label}"  /></apex:facet>
                    <apex:outputLink value="/{!d.contact.Id}"><apex:outputField value="{!d.contact.Name}" /></apex:outputLink>
                </apex:column>
            </apex:pageblockTable>
        </apex:pageBlock>
    </apex:outputpanel>
</apex:page>

<apex:page controller="ConatctListController" tabStyle="Contact" action="{!view}">
としたいところを、
<apex:page standardController="Account" extensions="ConatctListController" tabStyle="Contact" action="{!view}">
とすればよいらしい。

■ ContactListController クラス
public with sharing  class ConatctListController {

    /** コンストラクタ */
    public ConatctListController(ApexPages.StandardController controller) {
    }

    /** 画面表示用クラス */
    public class DTO {
        public Contact contact { get; set; }
        public DTO() {
            contact = new Contact();
        }
    }
    public List<DTO> dtos { get; set; }

    /** タイトル */
    public String pageBlockTitle { get; set; }

    /** 処理 */
    public void view() {
        String paramId = ApexPages.currentPage().getParameters().get('id');
        Id id;
        try {
            id = paramId;
        } catch (System.StringException e) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'ID の取得に失敗'));
        }
        pageBlockTitle = [SELECT Name FROM Account WHERE Id = :id].Name;
        Contact[] contacts = [SELECT Id, Name FROM Contact WHERE AccountId = :id ORDER BY Name LIMIT 200];
        dtos = new List<DTO>();
        for(Contact c : contacts) {
            DTO d = new DTO();
            d.contact = c;
            dtos.add(d);
        }
    }
}
※ 下記のコンストラクタを追加すればよいらしい
    /** コンストラクタ */
    public ConatctListController(ApexPages.StandardController controller) {
    }
※ パラメータの[id]は[取引先]オブジェクトの ID がやってきた

■ 設定
  • 上記(○ カスタムボタン・リンクの設定)を参照



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

Force.com : 静的リソースを Visualforce で指定したい

 
静的リソースを Visualforce で指定したい
  • 静的リソースへデータをアップロードしたい
  • 静的リソースの CSS を Visualforce で指定したい (<apex:stylesheet>)
  • 静的リソースの JavaScript を Visualforce で指定したい (<apex:includeScript>)
  • 静的リソースの画像を Visualforce で指定したい (<apex:image>)



○ 静的リソースへデータをアップロードしたい

■ アップロードできるファイル
  • アーカイブ (.zip や .jar ファイルなど)
  • 画像
  • スタイルシート
  • JavaScript
  • その他のファイルなど、Visualforce ページ内で参照できるコンテンツ

■ アップロード
  1. [設定]→[アプリケーションの設定]→[開発]→[静的リソース]を押下
  2. 静的リソースの[新規]ボタンを押下
  3. 静的リソースの情報の設定
    • 名前 : Visualforce で使われる名称
      • 英数字・アンダースコアが使用可能
      • 英字で始まること
      • アンダースコアで終わらないこと
      • アンダースコアを 2 つ続けて使用しないこと
    • 説明 : リソースの任意の説明
    • ファイル : アップロードするファイル
      • 1 つの静的リソースの最大は 5MB まで
    • キャッシュコントロール : Salesforce サーバにキャッシュされた静的リソースを他のユーザと共有するかを指定
  4. 静的リソース編集の[保存]ボタンを押下



○ 静的リソースの CSS を Visualforce で指定したい (<apex:stylesheet>)

■ 静的リソースのファイルを指定する場合
<apex:page>
    <apex:stylesheet value="{$Resource.(静的リソースのファイル名)}">
</apex:page>

■ 静的リソースのアーカイブを指定する場合
<apex:page>
    <apex:stylesheet value="{!URLFOR{$Resource.(静的リソースのアーカイブ名), '(ファイル名)'}}">
</apex:page>



○ 静的リソースの JavaScript を Visualforce で指定したい (<apex:includeScript>)

■ 静的リソースのファイルを指定する場合
<apex:page>
    <apex:includeScript value="{$Resource.(静的リソースのファイル名)}">
</apex:page>

■ 静的リソースのアーカイブを指定する場合
<apex:page>
    <apex:includeScript value="{!URLFOR{$Resource.(静的リソースのアーカイブ名), '(ファイル名)'}}">
</apex:page>



○ 静的リソースの画像を Visualforce で指定したい (<apex:image>)

■ 静的リソースのファイルを指定する場合
<apex:page>
    <apex:image value="{$Resource.(静的リソースのファイル名)}" width="50" height="50">
</apex:page>

■ 静的リソースのアーカイブを指定する場合
<apex:page>
    <apex:image url="{!URLFOR{$Resource.(静的リソースのアーカイブ名), '(ファイル名)'}}" width="50" height="50">
</apex:page>



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

2011-04-08

Force.com : 標準の salesforce のページに似たページを作成したい[Visualforceタグ]


標準の salesforce のページに似たページを作成したい (<apex:pageBlock>, <apex:pageBlockSection>, <apex:pageBlockTable>)
  • 子要素のデフォルトのユーザモードを指定したい (<apex:pageBlock>)
  • カラム数を指定したい (<apex:pageBlockSection>)
  • 一覧を表示したい (<apex:pageBlockTable>)



◆ <apex:pageBlock> コンポーネント

<apex:page>
    <apex:pageBlock></apex:pageBlock>
</apex:page>

備考
  • 標準の salesforce の詳細ページに似た領域
属性備考
mode="(detail|maindetail|edit)"
  • 子要素のユーザモードを指定する
  • デフォルト : detail
  • 型 : String
title="(タイトル)"
  • page block のタイトルを指定する
  • 型 : String
※ 詳細は apex:pageBlock を参照



◆ <apex:pageBlockSection> コンポーネント

<apex:page>
    <apex:pageBlock>
        <apex:pageBlockSection></apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>

備考
  • 標準の salesforce のページレイアウト定義のセクションに似た領域
  • <apex:pageBlock> コンポーネント内で使用可能
属性備考
columns="(カラム数)"
  • セクションのカラム数を指定する
  • デフォルト : 2
  • 型 : Integer
title="(タイトル)"
  • page block section のタイトルを指定する
  • 型 : String
※ 詳細は apex:pageBlockSection を参照



◆ <apex:pageBlockTable> コンポーネント

<apex:page>
    <apex:pageBlock>
        <apex:pageBlockSection>
            <apex:pageBlockTable value="{!(リスト)}" var="(変数名)"></apex:pageBlockTable>
        </apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>

備考
  • 標準の salesforce の関連リスト、リストビューに似た領域
  • <apex:pageBlock>, <apex:pageBlockSection> コンポーネント内で使用可能
属性備考
value="{!(リスト)}"
  • 一覧を指定する
  • 必須項目
  • 型 : Object
var="(変数名)"
  • 一覧のオブジェクトの変数名を宣言する
  • 必須項目
  • 型 : String
※ 詳細は apex:pageBlockTable を参照



○ 子要素のデフォルトのユーザモードを指定したい (<apex:pageBlock>)

Ex. 詳細モード

■ Visualforce ページ
<apex:page standardController="Account" >
    <apex:sectionHeader title="sectionHeader - title" subtitle="sectionHeader - subtitle" />
    <apex:pageBlock title="page block - mode : detail" mode="detail">
        <apex:pageBlockSection title="page block section">
            <apex:outputField value="{!account.name}"/>
            <apex:outputField value="{!account.site}"/>
            <apex:outputField value="{!account.Website}"/>
            <apex:outputField value="{!account.Industry}"/>
        </apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>


■ 画面イメージ


Ex. メイン詳細モード

■ Visualforce ページ
<apex:page standardController="Account" >
    <apex:sectionHeader title="sectionHeader - title" subtitle="sectionHeader - subtitle" />
    <apex:pageBlock title="page block - mode : maindetail" mode="maindetail">
        <apex:pageBlockSection title="page block section">
            <apex:outputField value="{!account.name}"/>
            <apex:outputField value="{!account.site}"/>
            <apex:outputField value="{!account.Website}"/>
            <apex:outputField value="{!account.Industry}"/>
        </apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>


■ 画面イメージ


Ex. 編集モード

■ Visualforce ページ
<apex:page standardController="Account" >
    <apex:sectionHeader title="sectionHeader - title" subtitle="sectionHeader - subtitle" />
    <apex:form >
        <apex:pageBlock title="page block - mode : edit" mode="edit">
            <apex:pageBlockButtons >
                <apex:commandButton action="{!save}" value="save"/>
                <apex:commandButton action="{!cancel}" value="cancel"/>
            </apex:pageBlockButtons>
            <apex:pageBlockSection title="page block section - column : 3" columns="3">
                <apex:inputField value="{!account.name}"/>
                <apex:inputField value="{!account.site}"/>
                <apex:inputField value="{!account.Website}"/>
                <apex:inputField value="{!account.Industry}"/>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>


■ 画面イメージ



○ カラム数を指定したい (<apex:pageBlockSection>)

Ex. 3 カラム

■ Visualforce ページ
<apex:page standardController="Account">
    <apex:sectionHeader title="sectionHeader - title" subtitle="sectionHeader - subtitle" />
    <apex:pageBlock title="page block" mode="detail">
        <apex:pageBlockSection title="page block section" columns="3"></apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>



○ 一覧を表示したい (<apex:pageBlockTable>)

Ex.
  1. [取引先]オブジェクトの[取引先責任者]一覧を表示

■ Visualforce ページ
<apex:page standardController="Account">
    <apex:sectionHeader title="section header - title" subtitle="section header - subtitle" />
    <apex:outputpanel>
        <apex:pageBlock title="page block - title">
            <apex:pageBlockTable value="{!account.Contacts}" var="contact">
                <apex:facet name="caption">table caption</apex:facet>
                <apex:facet name="header">table header</apex:facet>
                <apex:facet name="footer">table footer</apex:facet>
                <apex:column style="width:120px;">
                    <apex:facet name="header">column header [取引先責任者名]</apex:facet>
                    <apex:outputLink value="/{!contact.Id}"><apex:outputField value="{!contact.Name}" /></apex:outputLink>
                    <apex:facet name="footer">column footer [取引先責任者名]</apex:facet>
                </apex:column>
                <apex:column style="width:120px;">
                    <apex:facet name="header">column header [取引先名]</apex:facet>
                    <apex:outputLink value="/{!contact.Account.Id}"><apex:outputField value="{!contact.Account.Name}" /></apex:outputLink>
                    <apex:facet name="footer">column footer [取引先名]</apex:facet>
                </apex:column>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:outputpanel>
</apex:page>


■ 画面イメージ



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


Force.com : Visualforceタグ <apex:page>

 
<apex:page>
  • コントローラを指定したい
  • salesforce のヘッダ及びサイドバーの表示・非表示を指定したい
  • salesforce の標準のスタイルシートを指定したい・したくない(※ [showHeader]属性が「false」の場合)
  • ページのスタイルを統一したい
  • ページが要求された時に表示される前に何かの処理を行いたい
  • キャッシュ



○ コントローラの指定したい

■ オブジェクト名を指定
standardController="(オブジェクト名)"
Ex. [取引先]オブジェクトを指定する
<apex:page standardController="Account"></apex:page>

■ カスタムコントローラクラス名を指定
controller="(カスタムコントローラクラス名)"
Ex. 作成した[FooController]クラスを指定する
<apex:page controller="FooController"></apex:page>

※ [standardController]属性と[controller]属性を両方指定することは不可



○ salesforce のヘッダ及びサイドバーの表示・非表示を指定したい

■ ヘッダの表示・非表示
showHeader="{true|false}"
  • default : true
Ex. ヘッダを表示しない
<apex:page standardController="Account" showHeader="false"></apex:page>

■ サイドバーの表示・非表示
sidebar="(true|false)"
  • default : true
Ex. サイドバーを表示しない
<apex:page standardController="Account" sidebar="false"></apex:page>



○ salesforce の標準のスタイルシートを指定したい・したくない([showHeader]属性が「false」の場合)

standardStylesheets="(true|false)"
  • default : false
  • [showHeader]属性が「false」の場合に、標準のスタイルシートを使用するか設定を行う
  • ※ [showHeader]属性が「true」の場合は、ページのヘッダに標準のスタイルシートが追加されるため指定は無効となる
Ex. ヘッダは表示しないけど、スタイルシートは標準のスタイルシートを使用する
<apex:page standardController="Account" showHeader="false" standardStylesheets="true"></apex:page>
※ 標準のスタイルシート以外を使用する場合は <apex:stylesheet> を指定する



○ ページのスタイルを統一したい

tabStyle="(オブジェクト名|タブ名)"
Ex. [取引先]オブジェクトと一緒
  • [取引先]タブを選択した状態で表示させたい
  • [取引先]タブで使用しているアイコンをセクションのヘッダに表示させたい
  • ... etc
  • ※ 上記を満たすためにはヘッダが表示されている必要がある
<apex:page controller="FooController" showHeader="true" tabStyle="Account"></apex:page>



○ ページが要求された時に表示される前に何かの処理を行いたい

action="{!(アクション名)}"
  • ページがサーバによって要求された時に呼び出される
  • アクションを指定しない場合は、単にページが返される
  • 初期化のために使用しない
Ex. [FooController]クラスの[init]メソッドを指定する
<apex:page controller="FooController" action="{!init}"></apex:page>
public class FooController {
    public void init() {
        // 何かの処理
    }
}



○ キャッシュ

cache="(true|false)"
  • default : true
Ex. ブラウザのキャッシュページに指定しない
<apex:page standardController="Account" cache="false"></apex:page>



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

Force.com : タイトル、サブタイトルを表示したい[Visualforceタグ]

 
タイトル、サブタイトルを表示したい (<apex:sectionHeader>)



◆ <apex:sectionHeader> コンポーネント

<apex:page standardController="Account">
    <apex:sectionHeader />
</apex:page>

属性備考
title="(タイトル)"
  • タイトルを指定
  • 型 : String
subtitle="(サブタイトル)"
  • サブタイトルを指定
  • 型 : String



○ タイトルとサブタイトルを表示したい

Ex.
  1. タイトルとサブタイトルを指定

■ Visualforce ページ
<apex:page standardController="Account">
    <apex:sectionHeader title="sectionHeader - title" subtitle="sectionHeader - subtitle" />
</apex:page>


■ 画面イメージ



○ タイトルを表示したい

Ex.
  1. タイトルを指定

■ Visualforce ページ
<apex:page standardController="Account">
    <apex:sectionHeader title="sectionHeader - title only" />
</apex:page>


■ 画面イメージ



○ サブタイトルを表示したい

Ex.
  1. サブタイトルを指定

■ Visualforce ページ
<apex:page standardController="Account">
    <apex:sectionHeader subtitle="sectionHeader - subtitle only" />
</apex:page>


■ 画面イメージ



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

2011-04-05

Force.com : Date クラスのメモ

 
Date クラスのメモ



○ static メソッド

  • static Integer daysInMonth(Integer year, Integer month)
    指定した年の月の日数を返す。
    • 引数
         year : 年
         month : 月(1 = Jan)
    • 戻り値
         引数の年月の日数
  • static Boolean isLeapYear(Integer year)
    閏年か否かを返す。
    • 引数
         year : 年
    • 戻り値
         true : 閏年
  • static Date newInstance(Integer year, Integer month, Integer day)
    整数(年月日)から Date を生成する。
    • 引数
         year : 年
         month : 月(1 = Jan)
         day : 日
    • 戻り値
         日付
  • static Date parse(String s)
    文字列から Date を生成する。
    • 引数
         s : 日付文字列(形式:ローカルの日付形式に依存)
    • 戻り値
         日付
  • static Date today(String str)
    ユーザのタイムゾーンの現在日付を返す。
    • 戻り値
         日付
  • static Date valueOf(String s)
    文字列から Date を生成する。
    • 引数
         s : 日付文字列(形式:yyyy-MM-dd HH:mm:ss)
    • 戻り値
         日付
  • static Date valueOf(anyType x)
    ???から Date を生成する。
    • 引数
         x : ???
    • 戻り値
         日付
    ※ anyType 型は [Web Services API Developer's Guide] の [Field Types] を見ればわかるらしいけれどもわからなかった。



○ インスタンスメソッド

  • Date addDays(Integer addDays)
    日数を追加する。
    • 引数
         addDays : 日数
    • 戻り値
         日付
    Ex.
    Date d = Date.newInstance(2011, 3, 1);
    System.debug(d);               // 2011-03-01 00:00:00
    System.debug(d.addDays(10));   // 2011-03-11 00:00:00
    System.debug(d.addDays(-10));  // 2011-02-19 00:00:00
    
  • Date addMonths(Integer addMonths)
    月数を追加する。
    • 引数
         addMonths : 月数
    • 戻り値
         日付
    Ex.
    Date d = Date.newInstance(2011, 3, 1);
    System.debug(d);                 // 2011-03-01 00:00:00
    System.debug(d.addMonths(6));   // 2010-09-01 00:00:00
    System.debug(d.addMonths(-6));  // 2011-09-01 00:00:00
    
  • Date addYears(Integer addYears)
    年数を追加する。
    • 引数
         addYears : 年数
    • 戻り値
         日付
    Ex.
    Date d = Date.newInstance(2011, 3, 1);
    System.debug(d);                // 2011-03-01 00:00:00
    System.debug(d.addYears(15));   // 2026-03-01 00:00:00
    System.debug(d.addYears(-15));  // 1996-02-01 00:00:00
    
  • Integer day()
    day of month
    日を返す。
    • 戻り値
         日数
  • Integer dayOfYear()
    day of year
    呼び出したメソッドの日付の年が始まってから何日目かを返す。
    • 戻り値
         日数
  • Integer daysBetween(Date compDate)
    呼び出したメソッドの日付から、引数の日付まで何日あるかを返す。
    • 引数
         compDate : 日付
    • 戻り値
         日数
    Ex.
    Date d = Date.newInstance(2011, 3, 1);
    System.debug(d.daysBetween(d.addDays(10)));    // 10
    
  • String format()
    日付を文字列として返す。
    • 戻り値
         日付文字列
  • Boolean isSameDay(Date compDate)
    呼び出したメソッドの日付と、引数の日付が同じか否かを返す。
    • 戻り値
         true : 同じ
  • Integer month()
    月を返す。
    • 戻り値
         月(1 = Jan)
  • Integer monthsBetween(Date compDate)
    呼び出したメソッドの日付から、引数の日付まで何ヶ月あるかを返す。
    • 引数
         compDate : 日付
    • 戻り値
         月数
    Ex.
    Date d = Date.newInstance(2011, 3, 1);
    System.debug(d.monthsBetween(d.addDays(10)));     // 0
    System.debug(d.monthsBetween(d.addMonths(1)));    // 1
    
  • Date toStartOfMonth()

    • 戻り値
         日付
  • Date toStartOfWeek()

    • 戻り値
         日付
  • Integer year()
    年を返す。
    • 戻り値
         年



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考