Adsenseコード

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

【MySQL】テーブルのストレージエンジンを設定する方法




■以下のエラーが発生


<エラーメッセージ>
「Error Code: 1253. COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'binary'」
<ファンクションの定義>
CREATE DEFINER=`root`@`%` FUNCTION `SUMPlanMM`(projectCode VARCHAR(7) CHARACTER SET utf8, memberName VARCHAR(150) CHARACTER SET utf8, date date) RETURNS double
BEGIN
    DECLARE w DOUBLE DEFAULT 0.0;
    DECLARE c CURSOR FOR SELECT SUM(p.WORKLOAD) FROM aries.ANLY_MemberPlanWorkLoad__c p
        WHERE p.PROJECTCODE__C = @projectCode COLLATE utf8_unicode_ci
        AND p.NAME__C = @memberName COLLATE utf8_unicode_ci
        AND p.RESULTYM__C > @date;
    OPEN c;
    FETCH c INTO w;
RETURN w;
END




■以下を実行


CREATE TABLE `YoteiKosu__c` (
  `ID` char(18) COLLATE utf8_unicode_ci NOT NULL,
  `ISDELETED` tinyint(4) DEFAULT NULL,
  `NAME` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `CREATEDDATE` datetime DEFAULT NULL,
  `CREATEDBYID` char(18) COLLATE utf8_unicode_ci DEFAULT NULL,
  `LASTMODIFIEDDATE` datetime DEFAULT NULL,
  `LASTMODIFIEDBYID` char(18) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYSTEMMODSTAMP` datetime DEFAULT NULL,
  `LASTACTIVITYDATE` datetime DEFAULT NULL,
  `KAIHATUANKEN__C` char(18) COLLATE utf8_unicode_ci DEFAULT NULL,
  `RESULTYM__C` date DEFAULT NULL,
  `KADOYOTEIKOSU__C` double(8,2) DEFAULT NULL,
  `YOJITSU__C` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `PARTNERMEMBER__C` char(18) COLLATE utf8_unicode_ci DEFAULT NULL,
  `KADOZANTIME__C` int(11) DEFAULT NULL,
  `KADOCOST__C` decimal(18,1) DEFAULT NULL,
  `KADOYOTEI__C` double(8,2) DEFAULT NULL,
  `KEY1__C` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `YOUINSEI__C` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `MEMO__C` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `YOTEIKOSU__C` double(8,2) DEFAULT NULL,
  `JISSEKIKOSU__C` double(8,2) DEFAULT NULL,
  `COMPLETEDATE__C` date DEFAULT NULL,
  `GENKA__C` decimal(18,1) DEFAULT NULL,
  `ANKEN_YOJITSU__C` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ANKEN_TANTOU__C` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `TANTOU_ANKEN__C` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `PRJCODE__C` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ENGINEERIDAPP__C` char(18) COLLATE utf8_unicode_ci DEFAULT NULL,
  `YOTEIESTIMATEDCOST__C` decimal(18,1) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;




■解決の候補


グローバルとセッションで値がずれてる?
http://atsuizo.hatenadiary.jp/entry/2016/08/23/095537







【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-23

【ApexTrigger】トリガ処理で標準画面にエラーメッセージを表示させる処理を入れる

トリガの対象のレコードに対してエラーメッセージを付加することで、
beforeトリガとafterトリガの間で実行されるDML操作をせず、
エラーメッセージを表示させる方法です。


beforeTrigger のロジックの中で
Trigger.new の一部のレコードに以下の処理をします。


Map<Id, sObject > newMap = Trigger.new;
sObject record = newMap.values();
sr.addError( '表示するエラーメッセージ' );



■ApexPages 名前空間に addMessage(message) する方法

以下の方法で ApexPages 名前空間にメッセージを付加させても
うまくはいかないようです。


下記の方法は、Visualforce のコントローラとして Apex を
記述した場合に使える方法です。


大体の挙動は以下を参照してください。


ApexPages.addMessage( new ApexPages.Message(ApexPages.Severity.CONFIRM,'概要メッセージです' ,'詳細メッセージです' ) );
ApexPages.addMessage( new ApexPages.Message(ApexPages.Severity.ERROR,'概要メッセージです' ,'詳細メッセージです' ) );
ApexPages.addMessage( new ApexPages.Message(ApexPages.Severity.FATAL,'概要メッセージです' ,'詳細メッセージです' ) );
ApexPages.addMessage( new ApexPages.Message(ApexPages.Severity.INFO,'概要メッセージです' ,'詳細メッセージです' ) );
ApexPages.addMessage( new ApexPages.Message(ApexPages.Severity.WARNING,'概要メッセージです' ,'詳細メッセージです' ) );



参考
sObject クラス
https://developer.salesforce.com/docs/atlas.ja-jp.208.0.apexcode.meta/apexcode/apex_methods_system_sobject.htm#apex_System_SObject_addError

ApexPages クラス
https://developer.salesforce.com/docs/atlas.ja-jp.200.0.apexcode.meta/apexcode/apex_methods_system_apexpages.htm?search_text=ApexPages





【Apex】テストクラスで期待されるテスト内容

■以下のテストがされるの期待されています

・単一操作

・一括操作

・ポジティブ動作

・ネガティブ動作

・制限ユーザ



参考
https://developer.salesforce.com/docs/atlas.ja-jp.200.0.apexcode.meta/apexcode/apex_testing_what.htm?search_text=%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8





プログラミングで伸び悩んだ時の処方箋

■階層手法

以下の階層からなる
・クライアント層
  クライアントアプリやブラウザなど
・プレゼンテーション層
  HTML
・ビジネス層
  計算やデータの加工など
・インテグレーション層
  アダプタ
・リソース層
  DBやレガシーシステム、ERPなど



参考
https://www.samuraiz.co.jp/adobeproduct/jrun/docs/jr4/docs/html/Programmers_Guide/designpatterns2.html



■3階層システム 3階層アーキテクチャ

http://e-words.jp/w/3%E9%9A%8E%E5%B1%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html



■うまくクラス名をつけるための参考情報 レイヤから考える

https://qiita.com/KeithYokoma/items/ee21fec6a3ebb5d1e9a8






2017-10-20

UML関連

■書けるようにしておくべきUML

アクティビティ図
 処理フローや業務の流れなどを表現する
クラス図
シーケンス図
 クラス図だけではわかりづらい場合に書く
状態遷移図
 組込では必要になる
ロバストネス図
 IFなど


コードレビューをしてもらう際には、
事前にクラス図を書いておくと良い



■アクティビティ図(フローチャート)について
スイムレーンにロールをかく
大事なこと1: ロールの決め方 → 全体の良しあしが決まる
大事なこと2: 箱の粒度を揃える
左上に開始、右下に終了
開始、終了、フォーク、マージはお客さんに提出時に消してしまう
データベースはデータフロー図に書くこと



参考






2017-10-18

覚えておきたい mac OS の定番操作

メモになります・・・

Finder関連


ショートカット
cmd + o ファイルを開く
cmd + ↑ フォルダの上の階層に移動する
cmd + ↓ 選択しているフォルダを開く

URLリンクのファイルを作成する


URLのテキストを選択した状態でFinderにドラッグ&ドロップすると「.webloc」が作成されます。
このファイルを実行すると、設定したURLのページに移動できます。

参考
http://mattintosh.blog.so-net.ne.jp/57174166


キャプチャのショートカット、クリップボードにキャプチャをコピーする方法


画面キャプチャーのショートカットまとめ [Win/Mac]


D&D でファイルをコピーする


mac OS ではファイルを D&D (ドラッグ・アンド・ドロップ)すると
ファイルは移動されますが、

option キーを押しながら D&D することで

ファイルのコピーを行ってくれます。


ファイルのパス名を取得


 macOS の finder からファイルのパスをクリップボードにコピーする方法です。


パスをえたいファイルを右クリックし、
option キーを押します


ファイルをコピーする選択肢の部分が
パス名のコピーになるので、そこをクリックします。


参考ページより


「6. デスクトップを複数作成し、どのデスクトップにアプリを開くかを指定して振り分ける」
なんかは知っておきたいですね。


参考
http://lovemac.jp/blog/1342/



ターミナルからウィンドウの大きさを指定して変更する





参考
https://dev.classmethod.jp/smartphone/iphone/mac-app-resize/