visualforceで候補リストを作ってみた

visualforceで候補リストを作ってみた

入力された文字列に一致する取引先を検索、候補リストを表示させる機能をvisualforceで作ってみました。 こんなイメージ

f:id:sweaty:20210130223653g:plain

ボタンを使う方法と、actionSupportを使う方法をそれぞれ試してみました。

ボタンを使う方法

visualforceはこんな感じ

<apex:outputPanel id="sample1">
    <apex:inputText value="{!inputParam1}" list="{!lists1}" size="50"/>
</apex:outputPanel>
<apex:commandButton value="候補を検索" action="{!getList1}" reRender="sample1" />

ボタンを押したら取引先を検索し、inputTextで指定したlistに対応する値へ取引先名を格納します。

public PageReference getList1() {
    // リストの初期化
    lists1 = new List<String>();

    // 入力文字を部分一致するように変換
    String searchWord = '%' + inputParam1 + '%';

    // 取引先を検索
    List<Account> accList = new List<Account>();
    accList = [SELECT Id, Name FROM Account WHERE Name LIKE :searchWord];

    // 検索結果を文字列のリストに格納
    if(accList.size() > 0) {
        for(Account a : accList) {
            lists1.add(a.Name);
        }
    }

    return null;
    
}

actionSupportを使う方法

visualforceはこんな感じ

<apex:outputPanel layout="block" id="sample2">
    <apex:inputText value="{!inputParam2}" list="{!lists2}" size="50">
        <apex:actionSupport action="{!getList2}" reRender="sample2" event="onchange" />
    </apex:inputText>
</apex:outputPanel>

Apexは変わらないですね。actionSupport内で指定したイベントに応じてApexを呼び出しています。

実際に使用する際には、エンターキーの処理をどうするかとか考慮する必要もありそうです。

リストビューの権限設定について

デフォルトの標準ユーザプロファイルで、リストビューを作ると「自分のみがこのリストビューを表示できる」しか選択できませんでした。

 

f:id:sweaty:20201024135639p:plain

 

「共有する権限」がないとのことなので、設定を探したところヘルプページにありました。

Lightning Experienceのリストビューの作成またはコピー

f:id:sweaty:20201024140522p:plain

リストビュー

 

デフォルトの標準ユーザプロファイルは設定変更できないようなので、コピーして設定するか権限セットを作成します。今回は権限セットで

 

設定画面から、「ユーザ」 > 「権限セット」を選択して新規に権限セットを作成します。表示ラベルとAPI参照名を設定して入力。

 

f:id:sweaty:20201024141402p:plain

 

設定画面が開いたら、下部の「システム」セクションから「システム権限」を選択。

f:id:sweaty:20201024141645p:plain

 

編集状態にしてから、「公開リストビューの管理」にチェックを入れます。

 

f:id:sweaty:20201024141822p:plain

その後、保存をしたら権限セットの設定は完了したら「割り当ての管理」からユーザへ権限セットを付与しましょう。

表示方法が自分以外を選択できるようになりました。

 

f:id:sweaty:20201024142136p:plain

 

 

salesforceのレポートでバケット項目を試しました

salesforceのレポート機能には「バケット項目」があり、レポート上で項目以外にグルーピングすることが可能です。

 

以前に作成した4-3月で月別の売上金額を集計するレポートに追加してみました。

 

f:id:sweaty:20201011135723j:plain

バケット項目を追加するレポート

まずはレポートを編集状態にしたら列にある「▼」をクリックして、「バケット列を追加」を選択。

 

f:id:sweaty:20201011135848p:plain

バケット列を追加

 

 

クリックしたら、バケット列に指定する項目とバケット列の表示名を登録します。

今回は計上月という項目をグループ化して、四半期というバケット項目を追加します。

 

f:id:sweaty:20201011140020p:plain

バケット列の初期設定

次に、グループ化したい値を選択して、「新しいバケットを追加」をクリックします。

今回、計上月は選択リストなのであらかじめ値を表示されます。テキスト項目をグルーピングする場合は値を検索して該当のテキストを表示します。

 

f:id:sweaty:20201011140327p:plain

バケットの追加

今回の場合は、3か月ごとに1~4Qまでを割り当てるため上の作業をその分繰り返します。(下図のようになります)

すべての作業が完了したら適用をクリックします。後で編集ももちろん可能です。

 

f:id:sweaty:20201011140600p:plain

バケット列の完成

作成したバケット列は、列欄に表示されるのでグループ化したいところに移動します。

表示すると四半期ごとの小計を表示できるようになりました。

 

f:id:sweaty:20201011140858p:plain

完成したレポート

バケット項目は、オブジェクトにグループ化用の項目を作らなくても作成できるので便利ではありますが、他のレポートに使いまわすことはできないので利用頻度が多ければ事前にオブジェクトにグループ化用の項目を作成しておくことをおすすめします。

 

今回の要件を数式で表現するのであれば、

 

CASE( TEXT(計上月),

"4", "1Q",

"5", "1Q",

"6", "1Q",

"7", "2Q",

"8", "2Q",

"9", "2Q",

"10", "3Q",

"11", "3Q",

"12", "3Q",

"1", "4Q",

"2", "4Q",

"3", "4Q",

""

)

 

 こんな感じですね。

また、バケット項目には制限がありますのでご注意ください。

 

help.salesforce.com

 

売上のレポートを年度に合わせて4-3月で表示してみた

目的

salesforceのレポートで、年度ごとに月別売上レポートを表示する必要がありました。 会社は期首月が4月なので4-3月で表示してほしいという指示もあり、ちょっとやってみたので残しておこうと思います。

前提

取引先に紐づく形で、売上オブジェクトを作成しています。 売上オブジェクトには、「計上日」と「売上金額」をまずつくりました。 (計上日は日付型、売上金額は通貨型にしています)

f:id:sweaty:20201004190606j:plain
完成イメージ

課題

計上日をグループ化しようとしてみましたが、ちょっといまいちです。 同じ項目で複数グループ化できるとよさそうですが無理ですね。

f:id:sweaty:20201004191736j:plain
計上年月日でグループ化

最初にやってみたこと

計上日1つだと難しいことはわかったので、計上年度と月を数式で作ってみました。 計上年度は、4月はじまりなので計上年月日が1~3月だったら前の年になるようにします。

IF(MONTH( 計上年月日 ) < 4, TEXT(YEAR( 計上年月日 ) - 1), TEXT(YEAR( 計上年月日 )) )

月は、計上年月日から月を取り出しました。

MONTH( 計上年月日 )

これで作ったレポートのサンプルがこちら

f:id:sweaty:20201004194532j:plain
計上年度と月を数式で表現

月の数式で戻り値を数値にしていましたが、そうすると1月はじまりになってしまいました。 期首月が4月になるようにしないとだめですので、これだとうまくいきませんでした。

最終的にやったこと

月を選択リストで表現してみました。 選択リストなら並び順を任意で行えるため、これをやってみました。

f:id:sweaty:20201004200109j:plain
選択肢並び順

ただし選択リストに値を入力するためには、作成時に月の値を登録するか、プロセスビルダーなどで作成時に計上年月日から計上月を更新する必要があります。

f:id:sweaty:20201004200302j:plain
ひとまず完成

そのほかにやれそうなこと

月の頭に接頭辞みたいなものをつけるという方法もあります。 数式でa_4月、b_5月、、、l_3月となるようにする方法もあります。

CASE(MONTH( 計上年月日),
4, "a_4月",
5, "b_5月",
6, "c_6月",
7, "d_7月",
8, "e_8月",
9, "f_9月",
10, "g_10月",
11, "h_11月",
12, "i_12月",
1, "j_1月",
2, "k_12月",
3, "l_3月",
""
)

f:id:sweaty:20201004201844j:plain
別方法でレポート

接頭辞が表示されることに問題がなければこちらの方法が簡単かと思います。 salesforceは考え方次第でいろんなアプローチがあるので、運用に照らして検討するのがよさそうですね。

Trailheadの「ユーザ向けのSalesforce組織の準備」でつまづいた

Chatter グループの作成 単元 | Salesforce Trailhead

こちらのハンズオンをやったときにつまづいたのでメモ。

 

We couldn’t find your message in the 'All Sales' Chatter group. Ensure that you have followed all the instructions for adding a message.

このメッセージがでてしまったので調べました。

 

f:id:sweaty:20200810142802p:plain

 

このテキストをコピペしたのですが、これが原因でした。

Welcome to the All Sales group、which replaces the All Sales email list.

 

これをコピペしたんですが、句読点が全角でチャレンジが通らなかったようです。

半角カンマ「,」に修正したところチャレンジが通りました。

 

同じ個所でつまづいた人の助けになれば。

 

Lightning Experienceに慣れていかねば。。

 

データローダでFORMATを試してみた

Salesforceの日付項目をデータローダで出力すると、YYYY-MM-DDの形式で出力されます。

そこでFORMATを試してみました。

FORMAT()

SELECT 句で FORMAT を使用して、標準およびカスタムの数値、日付、時間、通貨項目にローカライズされた書式を適用できます。 FORMAT 関数が適用されると、これらの項目に特定のユーザロケールに適した書式が反映されます。項目書式は、Salesforce Classic のユーザインターフェースの表示と同じになります。

developer.salesforce.com

データローダで出力

以下のコードで試してみました。商談から完了予定日を例に出力してみました。

SELECT Id, Name, FORMAT(CloseDate) formattedDate, CloseDate FROM Opportunity

出力結果

f:id:sweaty:20200208212951p:plain
出力結果

こんな感じになりました。

もしYYYY/MM/DDの形式で出力したい場合の参考までに。

月末日を求める数式でハマった件

入力された日付項目を基にその月末日を求める数式を作成したところ、12月だけうまく動きませんでした。

最初に設定した数式

単純に月に1を足して日付を作成すればいいと思ってました。

// 翌月1日に変換して、そこから1日引く
DATE(YEAR(inputDate__c), MONTH(inputDate__c) + 1, 1) - 1

f:id:sweaty:20191126224808p:plain
12月末日が計算できない

うまく表示されませんでした。上記の数式だと12月は対応できないことを知らなかったです。

修正した数式

入力日付が12月だった場合のみ、処理を分けました。

// 12月だけ処理を分ける
IF(
    MONTH(inputDate__c) = 12,
    DATE(Year(inputDate__c) + 1, 1, 1) - 1,
    DATE(Year(inputDate__c), MONTH(inputDate__c) + 1, 1) -1
)

f:id:sweaty:20191126224923p:plain
12月末日もOK

12月だけは強制的に翌年1月1日にして、-1日するという対応で解消できました。

同じようにハマった方がいれば参考までに。