Adsenseコード

ラベル Salesforce の投稿を表示しています。 すべての投稿を表示
ラベル Salesforce の投稿を表示しています。 すべての投稿を表示

2017-11-30

【Apex】レコードやレコードIdからオブジェクトのAPI名を取得する方法


レコードからオブジェクト名を取得する


Apex開発において、あるレコードのオブジェクトの
API名を取得したいときの方法です。

sObject 型のレコードで getSObjectType() のメソッドを
呼んであげると取得できます。

また、この getSObjectType メソッドの戻り値は
Schema 名前空間の sObjectType クラスですので、

String として処理するには、
String.valueOf( sObjectType クラス )
を利用する必要があります。

Account acc = new account(name = 'testAccount', description = 'testDescription');
String objApi = String.valueOf( acc.getSObjectType() );
System.debug( '###: ' + objApi );
System.assertEquals( 'Account', objApi );
Schema.sObjectType expected = Schema.Account.getSObjectType();
System.assertEquals( objApi, expected );

※ sObject.getSObjectType().getDescribe().getName();
でもできます。むしろ、こちらの方が正しいですね。
この場合、戻り値はStringになります。



参考


sObject クラス
SObjectType クラス



レコードIdからオブジェクトのAPI名とプレフィックス名を取得する


さらに、レコードのSalesforceIdのみをキーにしてオブジェクトのAPI名と KeyPrefix を取得する方法です。

まず、必要な知識です。
オブジェクト名と KeyPrefix の取得方法を以下に示します。

Account acc = new account(name = 'testAcme', description = 'testAcme Account');
insert acc;

Schema.SObjectType accSot = acc.getSObjectType();
DescribeSObjectResult dsor = accSot.getDescribe();
String objName = dsor.getName(); // オブジェクト名
String prefix = dsor.getKeyPrefix(); // プレフィックスコード
System.assertEquals( 'Account', objName );
System.assertEquals( '001', prefix );



また、組織内の全てのオブジェクトの SObjectType の取得方法は以下になります。

Map<String, Schema.SObjectType> globalDescribe = Schema.getGlobalDescribe();



あとはレコードIdの先頭3文字をキーにして、
組織内のオブジェクトのプレフィックスと
一致するものを探せば、
その名前がレコードのオブジェクト名となります。

// globalDescribe
public Map<String, Schema.SObjectType> globalDescribe {
get{
if(globalDescribe == null){
globalDescribe = Schema.getGlobalDescribe();
}
return globalDescribe;
}
set;
}
// レコードIdから、オブジェクト名を取得する
public String getObjectNameByRelationFiledId(String objectId){
String objName;
String headFiled = objectId.substring(0, 3); //先頭から3文字
for (Schema.SObjectType globalSOType : globalDescribe.values()) {

String prefix = globalSOType.getDescribe().getKeyPrefix();
if( headFiled == prefix){
objName = globalSOType.getDescribe().getName();
break;
}
}
return objName;
}



参考

【salesforce】IDからオブジェクト名を取得するゼイ。
SObjectType クラス
DescribeSObjectResult クラス



別解 レコードIdからオブジェクトのAPI名を取得する


実はIdクラスにも SObjectType を取得するメソッドが
用意されているので、API名とプレフィックス名の取得は
以下の方法でも可能です。

// レコードIdから、オブジェクト名を取得する
public String getObjectNameByRelationFiledId( Id id ){
return id.getSObjectType().getDescribe().getName();
}



参考
Id クラス



2017-11-28

Salesforce 要件と実現方法集

お客様コードというカスタム項目に値が入ったら、レコードを閲覧専用にしたい


編集用のレコードタイプと、閲覧専用のレコードタイプを用意する
ワークフロールールの項目自動更新のアクションで、以下を条件にレコードタイプを「閲覧専用」に変更する設定をする

!IsBlank( CustomerCD__c )



システム管理者プロファイルでは、ページレイアウトで項目を参照のみに設定しても、項目は編集できる状態になります。




順次追記していきたいと思います。




2017-11-15

実はできないSalesforceの落とし穴

できると思ってたけど実は出来なかった、
そんな細かいところまで考慮してなかった
など経験者でも陥りやすい罠について記録してみます。

■活動のリストビューではインライン編集ができない


設定画面の
ビルド> カスタマイズ> ユーザ> ユーザインターフェース
にある「インライン編集を有効化」


をオンにしているんですが、できませんね。


詳細画面では可能なようです。






■ユーザへの参照項目を必須項目とすることができない


カスタムオブジェクトを作成し、ユーザへの参照項目を作成すると、
必須オプションが表示されず、参照項目を必須項目に設定することができませんでした。

画面からの入力レベルで良ければレイアウトで必須設定で対応
データ連携も含めて弾きたければ、入力規則、トリガ
で制御する必要があるようです。


■ユーザは参照項目を作れない


ユーザのカスタム項目では参照項目を作れません。
少なくとも標準のGUIでは用意されていませんでした。




項目自動更新を使えるのは


項目自動更新を利用できるのは、子の変更内容を親に反映させたいときだけ
親から子だと、子は複数いるので一括変更になるからです。

発火条件として新規作成時、編集時、特定の条件を満たす編集時があります。
条件設定は数式が使えるので、工夫次第で色々使えます。



インライン編集が無効になる場合


レコードの View のインライン編集を使った項目の一括更新は、以下の場合に無効になり、その項目だけインライン編集が不可能になります。

・項目の連動関係
・View でレコードタイプの絞込条件が設定されていない場合(レコードタイプが2つ以上設定されている時)

■新規作成ボタンを全てのレイアウトから削除できない?


※以下の記述はプロファイルのオブジェクト権限で「すべて更新」を
オンにしたまま「新規」をオフにできるという観点が抜けているため、
関連するバックエンド処理(Apex等)がWith Sharingで記述されていない限り、
オブジェクト権限の設定で対処することができます。

作成はトリガで行うけど、編集はユーザ操作でできるようにしたい
かつ他人所有のレコードも編集したい要件の場合の話になります。

オブジェクト権限で作成権限を与えているプロファイルのユーザでは、
親レコードの関連リスト、リストビュー、レコード参照画面からは
「新規作成」ボタンは削除できるのですが、
タブを押したときに最初に表示される「タブ画面?」からは消去できないようです。

どうしても「新規作成」ボタンを表示させたくない場合は、
タブの表示権限をなくすか、オブジェクトの作成権限をなくすしかなさそうです。

Classicに変更してもダメです。

実は、オブジェクトの新規作成の権限をオフにしても、
共有設定次第で他人所有のレコードの編集を可能にすることはできそうですが
共有設定の変更はセキュリティモデル全体への影響があるので、慎重に検討する必要はあります。

具体的には、共有設定を変更可にするとくことです。

他の解決方法としては、新規作成ボタンは表示させるけど、
新規ボタンの割当をVFページにし、そのページで新規作成はできない旨を案内するという方法や、Beforeトリガで弾いてしまうという方法も考えられます。

標準ボタンをVFで上書いてしまう方法の注意点については、次でお話します。

■削除ボタンを全てのレイアウトから削除できない?


※プロファイルのオブジェクト権限の「すべて更新」と「削除」は
連動しているため、「すべて更新」をオンかつ「削除」をオフ
という設定ができません。
なので下記の内容は正しく記述されています。

前述のパターンと似ているのですが、他人所有のレコードを編集させたいがために
オブジェクト権限ですべて変更をチェックを入れている場合、削除権限のチェックを単独で外すことはできません。

削除ボタンについても、ある程度設定やレイアウトで削除ボタンを
非表示にすることは可能ですが、どうしても消せない場所があります。

親オブジェクトの関連リストからレコードを参照したときの右側にある、
その他の操作のボタンリストには新規や削除があります。

新規ボタンは親オブジェクトのレイアウトにより非表示にすることはできますが、
削除ボタンについては現状レイアウト設定からは非表示にすることはできません。

この場合についても、削除ボタンをユーザ操作でレコードを削除できない旨の
VF画面で上書いてしまうという方法が取れます。

しかしこの標準ボタンを上書きしてしまう方法は、プロファイルに関係なく
一律VFの処理に動きが統一されてしまうため、
システム管理者であっても削除ボタンを押した時は同様のVF画面が表示されることになります。

Apexでコントローラを作成してあれこれできなくはないですが、
消せない削除ボタン一箇所のために、個別開発をするというのも考えものです。

お客様と運用で回避することで握れるのであれば、
ここまでする必要もないと思われます。

ちなみにですが、共有設定を変更可にしてオブジェクト権限の削除のチェックを外せば
要件を満たせそうですが、セキュリティモデルを大きく変更することになりますので、
この方法を取る場合は慎重に検討する必要があります。

■システム管理者プロファイル以外のユーザは、DataSpiderから公開グループをInsertできない


Salesforceのヘルプでは、下記の記述があります。

公開グループを作成および編集できるのは管理者と代理管理者のみですが、誰でも自分の非公開グループを作成および編集できます。

https://help.salesforce.com/articleView?id=creating_and_editing_groups.htm&type=5

DataSpider連携用にユーザを作成して、連携用のプロファイルを作成している場合、
そもそも公開グループの作成権限がない可能性があります。

公開グループの作成権限がないユーザを代理管理者に設定すれば、
公開グループを作成できると思い、試してみたのですが、
APIを利用しての公開グループの登録は禁止されていて、エラーにより弾かれてしまいました。

代理管理者が悪いことをできないようにセキュリティがしっかりと考えられているようです。
Salesforceはやはりセキュリティがしっかりしていますねと思わされる事象でした。



2017-10-27

Salesforceエラーメッセージ集 Apexテスト実行、変更セットリリースエラー等

Salesforce の Apex の実行時のエラーを
書き溜めていきたいと思います。


◆ Apex保存時のエラー

■ Invalid type: CustomObject__Share

オブジェクトに対応する共有設定のオブジェクトを参照したときに、そんなものはない!って言われたときは、下記を確認します。

1.主従関係の項目があるオブジェクトではないか
2.共有設定が更新可能になっていないか

初歩的ではありますが、私は2で少しはまってしまいました・・・。

■ Method does not exist or incorrect signature: void startTest() from the type test

下記のように書き換えたらエラーが解消しました・・・。
バージョンアップの仕様変更かな?

Test.startTest();
...
Test.stopTest();

       ↓↓↓

System.test.startTest();
...
System.test.stopTest();


◆ System.DmlException

■ System.LimitException: DML currently not allowed

■ MISSING_ARGUMENT, Id not specified in an update call: []


以下のようなメッセージが表示されるエラーです。

Update failed. First exception on row 0; first error: MISSING_ARGUMENT, Id not specified in an update call: []


発生条件:
まだ Insert されていないレコードの List を Update した時に発生します。


解決策:
Insert してから Update しましょう。



■ FIELD_INTEGRITY_EXCEPTION, メールアドレスが無効です


以下のようなメッセージが表示されるエラーです。

Insert failed. First exception on row 0; first error: FIELD_INTEGRITY_EXCEPTION, メールアドレスが無効です: ドメイン ... のアドレスを指定してください: [Email]


発生条件:
 組織で指定したドメインに基いたEmailアドレスが設定されないユーザを insert しようとしたときに表示されました。


解決策:
 組織で指定されたドメイン(上記エラー分の「...」の部分)を設定したユーザで insert する。



◆ System.QueryException


■ List has no rows for assignment to SObject


発生条件:
 リスト型ではないsObjectに複数になるクエリ実行結果を
 セットしたときやクエリの実行結果が0件だったときなどに発生する。


参考
https://developer.salesforce.com/forums/?id=906F00000005JdHIAU



◆System.SObjectException


■Invalid field (項目API名) for (オブジェクトAPI名)


発生条件:
 Account.get( 'TestField__c' );
 などオブジェクトに存在しない項目を参照しようとしたときに発生します。
 それ以外には、下記のケースもあるようです。
  http://blog.livedoor.jp/volvic_beer/archives/52118741.html

■Field is not writeable: 主従項目API名


発生条件:
 主従項目で親の変更が禁止されていて、親の変更を実行しようとした時

解決策:
 主従項目の設定で、親レコードの変更を許可をする設定をします。




◆System.EmailException


■endEmail failed. First exception on row 0;

first error: NO_MASS_MAIL_PERMISSION, Single email is not enabled for
your organization or profile.: []

以下のようなメッセージが表示されるエラーです。

System.EmailException: SendEmail failed. First exception on row 0;
first error: NO_MASS_MAIL_PERMISSION, Single email is not enabled for
your organization or profile.: []
Stack Trace: ...

発生条件:
 組織のメールの送信権限で引っかかると発生します。

解決策:
 組織のメールの送信権限をすべてのユーザに設定します。

参考:
 http://blog.livedoor.jp/volvic_beer/archives/52596281.html



◆System.UnexpectedException


■No more than one executeBatch can be called from within a test method.  Please make sure the iterable returned from your start method matches the batch size, resulting in one executeBatch invocation.


テスト実行時に表示されるエラーです。テスト実行時はバッチは1バッチのみ実行が許可されています。

例えば、下記は2バッチ実行されますが、こういった処理はテスト実行ではNGとなります。

<SampleBatchTest>
insert new List<Account>{
    new Account( Name = 1 )
    , new Account( Name = 2 )
};
Database.executeBatch( new SampleBatch(), 1 );

<SampleBatch>
public Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator( [
SELECT
Id
from
Account
] );
}

参考
http://www30304u.sakura.ne.jp/blog/?p=1104


◆リリース時のエラーメッセージ


■field integrity exception: unknown (required must not be specified)


発生条件:
1.外部IDを設定した項目で発生します。
2.Apexで使っている項目で、テキスト項目のデータ型を自動採番に変更しようとするときに発生します。

解決策:
1.一時的に外部ID項目を解除します。
2.Apexの該当箇所を全てコメントアウト&テストコードが通るソースを用意してリリースした上で、反映したいソースをリリースします。
(API名の違う別の項目にすることができればそれが楽ですが、数式、レイアウト、関連リストの設定項目、リストビュー、レポートなど、影響範囲の確認と修正が必要になります)

参考:
 https://web.plus-idea.net/2012/12/salesforce-deploy-field-integrity-exception/

■IF_Stasusは存在しないか、アクションViewの有効な上書きではありません。


発生条件:
 恐らくオブジェクトで設定しているLightningページもしくわVFが、リリース先の環境に存在しないと発生します。

解決策:
 Lightningページを変更セットのコンポーネントに含めるか、Lightningページの割り当てを解除します。

Cannot set sharingModel to ControlledByParent on a CustomObject without a MasterDetail relationship field


発生条件:
 変更セットにカスタムオブジェクトコンポーネントが含まれている場合に発生します。
変更セットに含まれているカスタムオブジェクトの中に、主従関係の子オブジェクトが含まれており、かつその子オブジェクトから親へのリレーションを定義する参照項目が、同じ変更セット内に含んでいないとこのエラーが発生します。

解決策:
 主従関係の子オブジェクトの項目で、親を参照している項目を変更セットに追加します。

参考:
 https://help.salesforce.com/articleView?id=000199646&language=ja&type=1


■Component [force:relatedListSingleContainer] attribute [relatedListApiName]: Could not find related list [MST_KY_YK_Account__r] for entity [Account]


発生条件:
 Lightningレコードページにて子オブジェクトの関連リストを表示するように設定し、かつその子オブジェクトから親へのリレーション項目で、組織間で子リレーション名が異なる場合に発生する。

解決策:
 子リレーション名を修正するか、リレーション項目を変更セットに含めてください。


◆外部連携ツールエラー



■AsyncApiException  exceptionCode='ExceededQuota'exceptionMessage='ApiBatchItems Limit exceeded.'


発生条件:
 外部の連携ツールで24時間以内に1万バッチ以上Salesforce組織に送信すると発生

解決策:
 制限内になるまで待つ。またはSOAP API を使って送信する

参考:
 https://developer.salesforce.com/docs/atlas.ja-jp.212.0.api_asynch.meta/api_asynch/asynch_api_concepts_limits.htm
 https://developer.salesforce.com/forums/?id=906F0000000Ai1QIAS
 https://success.salesforce.com/answers?id=9063A000000DnViQAK

◆デバッグログの容量を超えたとき


■デバッグログを削除して下さい(エラーメッセージ忘れました・・・)


発生条件:
 デバッグログが250MB以上たまると発生します

解決策:
 設定画面のデバッグログの「すべてを削除」ボタンを押してもエラーが解消されない場合、開発者コンソールでクエリを叩き、デバッグログを「Delete Row」で削除します

 以下のクエリで抽出可能です

 SELECT Id FROM ApexLog

参考:
 http://www.subnetwork.jp/blog/?p=1110


2017-10-26

【Salesforce】SOQLの中級者向け使いこなし集

■標準オブジェクトの「子リレーション名」を調べたい


例えば、Event(行動)のサブクエリとして
EventRelation (招集された側の行動)をとってくるSOQL文を書きたいが、 EventRelation の relationshipName (子リレーション名)がわからない時の方法です。



開発者コンソールを開き、上のメニューから
Debug > Open Execute Anonymous Window を開き、
以下を記入して実行する。

Schema.DescribeSObjectResult R = Event.SObjectType.getDescribe();
List<Schema.ChildRelationship> C = R.getChildRelationships();
for(Schema.ChildRelationship cr: C) {
system.debug('@@' + Cr); 
}



表示されたログで「Debug Only」のチェックをオンにし、
デバッグのみを表示します。



以下が出てきます。
getChildSObject=AcceptedEventRelation;
の部分が、Event の子オブジェクトに設定されているオブジェクト名です。

[5]|DEBUG|@@(
Schema.ChildRelationship[getChildSObject=AcceptedEventRelation;  ・・・
Schema.ChildRelationship[getChildSObject=ActivityExtension;  ・・・
Schema.ChildRelationship[getChildSObject=AttachedContentDocument;  ・・・



この中から、
getChildSObject=EventRelation
となっている場所を探すと、以下になります。

14:28:22:012 USER_DEBUG [4]|DEBUG|@@
Schema.ChildRelationship[
getChildSObject=EventRelation;
getField=EventId;
getJunctionIdListNames=();
getRelationshipName=EventRelations;
isCascadeDelete=true;
isDeprecatedAndHidden=false;
isRestrictedDelete=false;
]



このうち、
getRelationshipName=EventRelations;
が、子リレーション名なので、
EventRelations ということがわかります。



Account (取引先)の子の Contact ()の
子リレーション名 Contacts と同様の法則に基づいていますね




参考
ChildRelationship クラス
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_class_Schema_ChildRelationship.htm#!
relationshipName (リレーション名)について
https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_understanding.htm?search_text=relationshipName






2017-10-25

【Salesforce】活動、行動オブジェクト関連

■Apexでリソースカレンダーの名前を取得したい


以下に参考ページをまとめます
ここではできないという結論が出ている・・・
http://deferloader.blog.uhuru.co.jp/?p=2061
https://developer.salesforce.com/forums?id=906F00000008jcqIAA
https://developer.salesforce.com/forums?id=906F00000008ujFIAQ


一番最後の画像の選択リストのリソース名はどうやって取得しているんだろう・・・
http://soact2.blog.fc2.com/blog-entry-17.html


これは確かリソース名を表示してたようなきがする
http://blog.livedoor.jp/minoaw/archives/2030537.html




■関連するオブジェクトのAPI名


EventRelation 招待元の行動と招待先のユーザを
 紐付けるためのオブジェクト
APP_CALENDAR 公開リソース
DeclinedEventRelation 招集を未回答にしているユーザ
AcceptedEventRelation 招集を参加にしているユーザ
UndecidedEventRelation 招集を不参加にしているユーザ




■SalesforceId のプレフィックスの一覧(公式)


https://help.salesforce.com/articleView?id=000005995&language=ja&type=1








2017-10-17

【Salesforce】リリース方法のいろいろ

■手作業
 変更セット
 Force.com IDE
  Deploy to Server


■ウェブアプリ
 Workbench


■クライアントアプリ
 MavensMate


■Antベース
 Froce.com 移行ツール


■コマンドライン
 Salesforce DX CLI


参考
http://appirio.co.jp/blog-category/tech-blog/force-com%E7%A7%BB%E8%A1%8C%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9Fsalesforce%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4/






2017-10-13

【Salesforce】行動のいろいろ


共有


ロールや公開グループを使った共有ルールは作れません

http://www30304u.sakura.ne.jp/blog/?p=2922
http://divecafe.hateblo.jp/entry/2012/08/24/%E6%B4%BB%E5%8B%95%E3%80%81%E8%A1%8C%E5%8B%95%E3%80%81%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%A7%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%EF%BC%915%E3%81%AE%E3%81%93%E3%81%A8



代わりに共有設定から「親レコードに連動」を設定して、
関連先のオブジェクトのアクセス権限に連動して共有することはできます



ユーザを追加した場合


ユーザを追加した場合は、Event オブジェクトに
IsChild フラグが true になった状態で
招集したユーザの数だけ Event オブジェクトが作成されます。



参考
https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_event.htm



リソースを追加した場合


リソースを追加した数だけ EventRelation レコードが
作成されます



Shared Activities


これを有効にすると、リソースが被って行動を登録しても
登録できるようになります


この場合はリソースが紐付けられた行動を削除して復元しても、
リソースの紐付けも復元されます


他、この状態はトリガ、ワークフロー、データ入力規則を
サポートしなくなります


通常は Shared Activities が有効ではないと思われますが、
反対に Shared Activities が無効の場合、
この場合は親の行動レコードを削除して復元しても、
行動に紐付けられたリソース情報は復元されません
行動を削除したときに、行動に設定されたリソースは削除されます


招集したユーザに関してはどちらの設定にかかわらず、
行動を削除して復元をすると招集ユーザの情報も復元されます



参考
https://developer.salesforce.com/docs/atlas.ja-jp.200.0.object_reference.meta/object_reference/sforce_api_objects_eventattendee.htm?search_text=%E8%A1%8C%E5%8B%95

【Salesforce】データローダを使用して手動で共有ルールを作成する方法

Account__Share オブジェクトに
個別の共有ルールに関するレコードがあるので、
これを操作することにより可能



参考
https://help.salesforce.com/articleView?id=000005614&language=ja&type=1



【Salesforce】よくあるトラブルシューティング集

Lightning アプリケーションビルダーで Chatterコンポーネントが表示されない

Chatterのフィード追跡で「フィード追跡の有効化」をオンにすると Chatterコンポーネントが表示されます。





■レコードの「共有」ボタンが表示されない

オブジェクトの共有設定が「非公開」になっているか確認
https://developer.salesforce.com/forums/?id=906F00000009B59IAE



■サイトゲストユーザのデバッグログがとれない

ブラウザにクッキーを仕込んであげる




【Salesforce】キューについて

■作成したキューごとに、対象のオブジェクトを選択することができる
 ・オブジェクトを選択する部分で目的のオブジェクトが
  表示されないと、そのオブジェクトにはキューを
  利用することができない
 ・特に、 Event (行動)の OwnerId (任命先)に設定して、
  カレンダーの予定を誰でも編集できるようにする
  といったことはできません

2017-10-11

【Salesforce】選択リスト値のデフォルト設定はいつ有効なのか

■前提

Salesforce Winter'18



■調査内容

Salesforce の選択リスト値にある
「マスタリストのデフォルト値に設定する」
のオプションは、どんなときに有効なのか調査しました。


具体的には、
デフォルト値が設定してある選択リスト項目を
Apexトリガの beforeInsert, beforeUpdate の処理で
null や空文字を指定してを実行すると、
デフォルト値の設定で上書きされないか、です



■結果

以下の場合でデフォルト選択設定が適用されるかを確認する
※ ×:適用されなかった

beforeInsert で
・nullをセットした場合 ×
・空文字をセットした場合 ×


値がセットされていなくて、beforeUupdate で
・操作なし ×
・null をセットした場合 ×
・空文字をセットした場合 ×


既に値がセットされていて、beforeUpdate で
・操作なし ×
・null をセットした場合 ×
・空文字をセットした場合 ×



冷静に考えると「操作なし」の検証は、
操作していないものが update する度に
デフォルト値になってしまう仕様は現実的ではないので
調べるまでもなかったですね



■insert での操作なしについて

・レコード詳細画面に項目を配置している場合
→ デフォルト値がセットされた状態で表示されます

  そこで選択リストを改めて選択すれば、
  もちろん選択した値が登録されます



・レコード詳細画面に項目を表示していない場合
→ そのままデフォルト値が登録されます



■結論

「マスタリストのデフォルト値に設定する」は
GUI, Apex 等で積極的に値の選択がなかった場合にのみ
有効になる設定



■不具合情報

選択リスト値セットを使用した
選択リスト項目のデフォルト値が動作しない


といった現象が、Winter'18にバージョンアップ以降に発生しているようです


デフォルト値をセットした選択リスト値セットを
レコードタイプを使用したオブジェクトと
レコードタイプを使用しないオブジェクトの
両方に用いると、設定したデフォルト値が動作しないようです


参考
https://success.salesforce.com/issues_view?id=a1p3A000000mCYTQA2



■10月12日追記
本日パッチがあてられたそうです
https://success.salesforce.com/issues_releases_view?release=210009001






2017-09-27

【Salesforce】サイトで公開したページが「構築中です。」と表示される場合

# トラブルシューティング

以下を確認する
1.サイトに対象のVFページを追加しているか。
2.サイトゲストユーザプロファイルに、
  VFページとApexコントローラの権限を与えているか
3.移動先のURLのドメインが、サイト用のドメインになっているか
4.少し待ってみる(30分程度)
   Salesforce の内部処理が終わってなくて、
   設定が反映されていないことがあります
5.コントローラで返しているURLはサイトドメインのURLか



# 補足

5について

次のページに遷移させる処理を記述する時、
グローバル変数で記述する Page.VF_NextPage は
コントローラのメソッドとして return する形式でないと
サイト用のドメインのURLに変換してURLを返してません。

上記とは別にコントローラに Page.VF_NextPage を
public な変数として置き、その変数を get する方法だと、
サイトドメインのURLを返さずに
組織内部のログインユーザ向けのURLをそのまま返します。
 こんな感じのやつ → /apex/VF_NextPage



サンプルコード(サイトドメインのURLに変換してくれない例)
(Apex)
public PageReference nextPage {
  get {
    return Page.VF_NextPage;
  }
  set;
}

(Visualforce)
```<a href="{! nextPage}">次ページ</a>```



サンプルコード(サイトドメインのURLに変換してくれる例)
(Apex)
public PageReference nextPage() {
  return Page.VF_NextPage;
}

(Visualforce)
```<apex:commandbutton action="{! nextPage}" value="次ページ" />```


※ 下の場合は、Salesforceが裏側でサイトドメインのURLに変換してくれるので、サイトゲストユーザプロファイルでも閲覧できる。)






2017-09-08

【VisualForce】VFを使ってExcelファイルを出力する方法

以下のように設定する


<apex:page controller="コントローラクラス" 
  cache="true" 
  contentType="text/xml;charset=UTF-8#test.xml" 
  readOnly="true">


Excelでテスト用のファイルを作り、保存をするときにxml形式で保存する
保存したファイルのソースコードを確認し、apex:page タグの間に挿入する


このVFページを呼び出す


あとは、Apexなどを使い


    <apex:repeat value="{!csvRows}" var="row">
        <apex:outputText value="{!row.columns}" />
    </apex:repeat>


などでxmlを出力させてあげれば、
動的にExcelファイル(正確にはxml?)を生成することができる





【Salesforce】項目変更履歴から商談の変更をApexで検出する話

変更履歴に関するHistoryオブジェクトたち
・OpportunityHistory
項目内の値の変更を記録しているオブジェクト
カスタムオブジェクトでいう Foo__history にあたるもの


・OpportunityFieldHistory
フェーズの変更を記録しているオブジェクト


参考資料
https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_opportunityhistory.htm?search_text=Opportunity https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_opportunityfieldhistory.htm?search_text=%E5%B1%A5%E6%AD%B4



設定
デフォルトでは、項目履歴の設定はオフになっているので、
オブジェクトの設定からオンにしてあげる


考えられる制限
・項目変更履歴を設定できる項目数は20か40そこららしい
・項目変更履歴を保持している期間、数の制限がある可能性







2017-09-01

【Salesforce】メールサービスについて

制限

・処理可能メール数はユーザライセンス数×1000(最大100万通)
・メールが (本文テキスト、本文 HTML および添付ファイルを合わせて) 約 10 MB を
超える場合、メールメッセージは拒否される


参考
https://help.salesforce.com/articleView?id=code_email_services_editing.htm&type=0
https://help.salesforce.com/articleView?id=code_inbound_email.htm&type=0







2017-08-21

Salesforce 入門

Salesforceを使った開発パターン

http://qiita.com/stomita/items/992f6be7084565420e8d



2017-08-15

カスタムオブジェクトを新規にリリースするときに気をつけたいポイント

概要


Salesforceでリリース手順等を考える際のテンプレートです。

新規カスタムオブジェクトを内容に含むリリースのテンプレ


・変更セットコンポーネント


カスタムオブジェクトを新規にリリースしようとして、エラーが発生した場合、
以下のコンポーネントを追加すると解決する可能性があります

カスタムオブジェクト
  カスタムオブジェクトそのものです。
・Lightningページ(LEX)
  これがないと、以下のエラーが出ます。
  「(LightningページAPI名)は存在しないか、アクションViewの有効な上書きではありません。」
・コンパクトレイアウト
  システムデフォルト以外を設定している場合は必要です。
カスタム項目
  特に、検索レイアウトの検索結果に設定した項目を含めてないとエラーが出ます。

以下のコンポーネントは、カスタムオブジェクト新規リリース時には、
なくても直接エラーが発生しないものです。

ページレイアウト
  なくてもリリースできます
・ボタン、リンク
  ページレイアウトを変更セットに含めた場合、ページレイアウト内に含まれていれば必要になります。
タブ
  なくてもリリースできます
・リストビュー
  なくてもリリースできます

・以下の順番でプロファイル設定を考える


1.カスタムオブジェクト権限設定
2.項目レベルセキュリティ
3.タブの表示設定
4.アプリケーションの設定タブ
  →アプリケーションに含まれないタブは、
   グローバル検索の検索対象にならないようです。
  →また、グローバル検索に表示されるオブジェクト順は、
   タブの表示順に依存するようです。
5.ページレイアウトに項目を配置