どうもフリーランスエンジニアのTABEです。
salesforceの構築要件で
毎月ある一定の日付のレコードを作成して欲しいという要望がありました。
その際の基準となる
日の設定が厄介だったので記録しておきます。
salesforceとして日付の日は数式で Day(Today())
の形で今日が何日かを簡単に出せます。
ただ、上記のToday()
の部分が日付型ではなく、数値や文字列の場合は
DATE関数の中でDay()
関数を使うと存在しない日付を指定した時にエラーになります。
例えば 指定日(SpecifiedDate__c とAPI名につけたと仮定します。)という項目があり
選択リスト型で1から31を選択できるとします。
その場合指定日がレコード上で31を選択されていた場合
になった時にフローで自動的に9/31のレコードを作ろうとした時
9/31は存在しない為
数式で今月の指定日を設定する場合、以下の様に数式を作るのですが
DATE(YEAR(Today() ),MONTH(Today() ),VALUE(TEXT({!$Record.SpecifiedDate__c} )
この数式だと、9/31は存在しない為、DATE関数がエラーで数式が何も帰ってこない状態になります。
ですので、IF分で場合分けをして31日がある月ない月、また2月の閏年の考慮をIF分で、しなくてはならないことがありました。
実際の数式が以下の数式になります。
(選択リストには、必ず「末日」になるように「末」という選択リスト値もあったので、「末」の分岐も組み込まれています。
また、「末」を選択した場合、対象月の次の月に設定してから日付を-1にするという計算で、末日を割り出しているのですが、1月1日から-1をするとエラーになってしまう仕様の様でする。
なのでその分のIF分も入れてあります。
IF(
OR(
AND(OR(MONTH(Today())=4,MONTH(Today())=6,MONTH(Today())=9,MONTH(Today())=11), TEXT({!$Record.SpecifiedDate__c}) = '31')
, AND(MONTH(Today())=2, OR(TEXT({!$Record.SpecifiedDate__c}) = '29', TEXT({!$Record.SpecifiedDate__c}) = '30',TEXT({!$Record.SpecifiedDate__c}) = '31')))
, DATE(YEAR(Today() ),MONTH(Today() ) + 1,1)-1
, IF(AND(TEXT({!$Record.SpecifiedDate__c} ) = "末",MONTH(Today() )=12)
, DATE(Year(Today() ) + 1, 1, 1) - 1
, IF (AND(TEXT({!$Record.SpecifiedDate__c} ) != "末", TEXT({!$Record.SpecifiedDate__c} ) != null)
, DATE(YEAR(Today() ),MONTH(Today() ),VALUE(TEXT({!$Record.SpecifiedDate__c} )))
, DATE(YEAR(Today() ),MONTH(Today() ) + 1,1)-1
)
)
)
単純に末かどうか?を判定して対応すればいいと思ったのですが、、、
これだけで結構多めの処理になってしました。
同じ様な要件で困った方がいて、力になれれば幸いです!
salesforceの解説用動画をUdemyで作っています。
興味のある方は見てもらえたら嬉しいです。
よろしくお願いします!