inputfieldタグを使用して画面に選択リストを表示させると初期表示として「–なし–」と表示される。
初期表示を変えたい場合には、<apex:selectList>を使って実装するしかありません。
kinkun's blog
inputfieldタグを使用して画面に選択リストを表示させると初期表示として「–なし–」と表示される。
初期表示を変えたい場合には、<apex:selectList>を使って実装するしかありません。
VisualStudioCode Pakage.xmlで、標準Object、カスタムObject取得方法を共有します。
例えば、標準の取引先、すべてのカスタムオブジェクト取得の場合は以下です。
<types>
<members>User</members>
<members>Lead</members>
<members>Account</members>
<members>Contact</members>
<members>Opportunity</members>
<members>*</members>
<name>CustomObject</name>
</types>
他の例です。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>*</members>
<name>ApexClass</name>
</types>
<types>
<members>*</members>
<name>ApexPage</name>
</types>
<types>
<members>*</members>
<name>ApexTrigger</name>
</types>
<types>
<members>*</members>
<name>ApprovalProcess</name>
</types>
<types>
<members>User</members>
<members>Lead</members>
<members>Account</members>
<members>Contact</members>
<members>Opportunity</members>
<members>*</members>
<name>CustomObject</name>
</types>
<types>
<members>*</members>
<name>Workflow</name>
</types>
<types>
<members>*</members>
<name>Layout</name>
</types>
<types>
<members>*</members>
<name>Flow</name>
</types>
<types>
<members>*</members>
<name>FlowDefinition</name>
</types>
<version>47.0</version>
</Package>
Apexのdivide関数について共有します。
テストコードは以下です。
Decimal decimalNumber = 8;
Decimal result1 = decimalNumber.divide(9, 1);
Decimal result2 = decimalNumber.divide(9, 2);
Decimal result3 = decimalNumber.divide(9, 3);
Decimal result4 = decimalNumber.divide(9, 4);
Decimal result5 = decimalNumber.divide(9, 5);
system.debug('result1:'+result1);
system.debug('result2:'+result2);
system.debug('result3:'+result3);
system.debug('result4:'+result4);
system.debug('result5:'+result5);
結果は以下です。
13:00:48:002 USER_DEBUG [15]|DEBUG|result1:0.9
13:00:48:002 USER_DEBUG [16]|DEBUG|result2:0.89
13:00:48:002 USER_DEBUG [17]|DEBUG|result3:0.889
13:00:48:002 USER_DEBUG [18]|DEBUG|result4:0.8889
13:00:48:002 USER_DEBUG [19]|DEBUG|result5:0.88889
divideメソッドは、切り上げしています。
ApexでレコードタイプID取得コードを共有します。
/**
* getRecordTypeIdByQuery
* SOQLを使用してレコードタイプIDを取得
* @param : オブジェクト名(DeveloperName)
* @param : レコードタイプ名(DeveloperName)
* @return : レコードタイプID
*/
private ID getRecordTypeIdByQuery( String objectName, String recordTypeName ){
List<RecordType> recordTypeList = [
SELECT Id
FROM RecordType
WHERE SobjectType = :objectName
AND DeveloperName = :recordTypeName
];
return ( recordTypeList != null && !recordTypeList.isEmpty() ) ? recordTypeList[0].Id : null ;
}
テストする。
Salesforceの開発コンソルにて、上記のソースコードを登録し、以下のソースコードで呼び出す。
ID recordtypeid = getRecordTypeIdByQuery('Account','Business_Account');
System.debug('recordtypeid:'+recordtypeid);
結果
recordtypeid:0xxxx0000000xxxxxx
salesforce カスタムボタンのjavascriptでレコードタイプ取得方法の例を共有します。
{!REQUIRESCRIPT("/soap/ajax/29.0/connection.js")}
var result = sforce.connection.query("Select Id, DeveloperName, Name From RecordType Where SobjectType = 'TestCustomObject__c' AND DeveloperName = 'devtest' limit 1");
var records = result.getArray("records");
alert('id='+records[0].Id+",Name="+records[0].Name+",DeveloperName="+records[0].DeveloperName);
ここで、
TestCustomObject__c : カスタムオブジェクトAPI参照名
レコードタイプ名 : devtest
レコードタイプ表示ラベル : test
SalesforceのObjectNameからPrefixを取得するのを共有します。
開発コンソル画面にて「Debug」タブの「Open Execute Anonymous Window」画面にて以下を実行する。
String objName ='Account';
schema.sObjectType sObjType = Schema.getGlobalDescribe().get(objName);
system.debug('prefix:'+(sObjType.getDescribe().getKeyPrefix()));
DebugLog結果は以下です。
prefix:001
Salesforceの「You have uncommitted work pending. Please commit or rollback before calling out」エラーの原因と解決策について共有します。
・原因
開発においては、外部 Web Service から取得した結果に基いてセールスフォース内のレコードを作成/更新するケースが多々あります。
しかしながら、同じトランザクション内で DML(Insert/Update/Upsert/Delete)発行後にコールアウトを行なう事はでません。
・解決策
上記の様なケースに対応するためには、トランザクションを分け、DMLを発行する前のトランザクションでコールアウト処理を実行する必要があります。
INVALID_FIELD_FOR_INSERT_UPDATE, Account: bad field names on insert/update call: AccountId: [ AccountId]
上記の解決先を共有します。
public void syncContact (Contact contact) {
...
...
Contact newContact = new Contact();
newContact.Id = id;
newContact.IsTarget__c = true;
update newContact;
...
...
}
Dml操作で成功したレコード取得した例を共有します。
list<RecordType> rList = [Select id
From RecordType
Where sObjectType = 'Account' and DeveloperName = 'PersonAccount'];
system.debug('rList:'+rList);
List<Account> accs = new List<Account>();
for(integer i=0; i<10; i++){
Account acc = new Account();
acc.LastName = 'test' + i;
acc.RecordTypeId = rList.get(0).id;
accs.add(acc);
system.debug('acc:'+acc);
}
insert accs;
List<SObject> accList = new List<SObject>();
accList = [select id, LastName From Account];
if(accList.size() > 0){
system.debug('accList.size():'+accList.size());
Set<Id> updatedIds = new Set<Id>();
List<SObject> updatedObjs = new List<SObject>();
Database.SaveResult[] srList = Database.update(accList, false);
for (Database.SaveResult sr : srList) {
if (sr.isSuccess()) {
// Operation was successful, so get the ID of the record that was processed
System.debug('Successfully inserted account. Account ID: ' + sr.getId());
updatedIds.add(sr.getId());
}
else {
// Operation failed, so get all errors
for(Database.Error err : sr.getErrors()) {
System.debug('The following error has occurred.');
System.debug(err.getStatusCode() + ': ' + err.getMessage());
System.debug('Account fields that affected this error: ' + err.getFields());
}
}
}
if(updatedIds.size() > 0){
for(SObject obj : accList){
if(updatedIds.contains(obj.Id)){
System.debug('obj.Id:'+obj.Id);
updatedObjs.add(obj);
}
}
}
}
[Salesforce]スケジュールバッチエラー時メール送信
global class TestBatch implements Database.Batchable<sObject>{
global Database.querylocator start(Database.BatchableContext BC){
return Database.getQueryLocator('SELECT Id FROM Account');
}
global void execute(Database.BatchableContext BC, List<sObject> scope){
throw new MyException('test');
}
global void finish(Database.BatchableContext BC){
AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,
TotalJobItems, CreatedBy.Email
FROM AsyncApexJob WHERE Id =
:BC.getJobId()];
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setToAddresses(new String[]{'mokamoto@salesforce.com'});
mail.setReplyTo('noreply@salesforce.com');
mail.setSenderDisplayName('Batchプロセス');
mail.setSubject('Batch完了');
mail.setPlainTextBody('Batch完了しました。エラー' + a.NumberOfErrors +'件');
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
}
class MyException extends Exception{}
}