You need to sign in to do that
Don't have an account?
Apexテストのデータ取得について
いつも大変お世話になっております。
DBアクセスについて質問があります。
本番環境に上げる為にApexテストを行いましたがデータが取得出来ていません。
Apexテストを行う際に何か記述しなければいけない事があるのでしょうか?
※[select id from User]では取得できているのですが、[select id from Account]では取得できていません。
System.debug()の有無でテストクラスの実行結果が変化する
トリガのハンドラークラス内で、処理1から処理2に渡す過程に以下のコードがあります。
List<Id> deletedIdList = new List<Id>(); if(deleteList.size() > 0){ for(sObject deleteRecord: deleteList){ deletedIdList.add((Id)deleteRecord.get('Id')); } } returnList.addAll(updateList); for(sObject sObj: sObjList){ for(sObject updated: updateList){ if(updated.Id == sObj.Id){ break; } } System.debug(deletedIdList); if(deletedIdList.size() == 0 || !deletedIdList.contains((Id)sObj.get('Id'))){ returnList.add(sObj); } }処理1では、カスタムオブジェクトAのレコードの中に、特定の項目の値がTrigger.newのレコードと一致するレコードがある場合、一部の項目をその古いレコードに上書きし、Trigger.newのレコード自体は後で削除する、という処理を行っています。
この時、上書きされた古いレコードはupdateListに、Trigger.newのレコードはdeleteListに格納しています。
その後、上のコードの処理で以下のレコードをreturnListに格納させます。
・updateListの全レコード
・sObjList(中身はTrigger.new)のうち、deleteListに格納されていないレコードすべて
returnListに格納後、updateListとdeleteListはそれぞれ更新・削除を行い、returnListを処理2へと渡します。
この時、上のコードでは14行目にあるSystem.debugを削除してしまうと、deleteListの中身がreturnListにも格納されてしまい、処理2でENTITY IS DELETEDがスローされてしまいます。
しかし、このSystem.debugがあると、エラーは発生せず想定通りに処理が終了します。
- このような現象に遭遇した方はいらっしゃいますか。
- このような現象が発生する原因は何が考えられますか。
- System.debugなしで処理を正常に終了させるには、どうすればよいでしょうか。
同じようなエラーに遭遇した者です。
下記サイトにエラーの原因が記載されています。
https://success.salesforce.com/issues_view?id=a1p3A000001RXPlQAO&title=list-contains-fails-to-detect-element-match-when-input-param-is-an-sobject-id-field-it-succeeds-when-debug-logs-are-enabled
簡潔に申しあげますと、
List型の変数に対してcontainsメソッドを実行すると、
そのListがsObjectのIDを格納している場合は
一致する値が入っていてもfalseを返すようです。
しかし、containsの実行前にそのList変数をSystem.debugで呼び出している場合、
上記のようなエラーは起こらないようです。
解決策としまして、
List型をSet型に変更するという方法が提案されています。
もしまだ未解決のようでしたら、どうぞご検討ください。
カスタムオブジェクトの判定方法
添付されたのがどのカスタムオブジェクトなのかを判定する方法として、添付ファイルの親カスタムオブジェクトID(ParentId)をハードコードして判定する方法を利用しているのですが、SandboxとはカスタムオブジェクトIDが異なっているため、リリース前に書き換えるという手段をとっています。
Sandboxと本番組織で同一のコードでカスタムオブジェクトを判定する方法はないでしょうか?
https://qiita.com/s_hayashida/items/517da55c05c6099805dc
使用可能なAPIのバージョンは次の方法で確認できます。
・設定→開発→API→APEX WSDL の生成→Salesforce.com Apex API version 34.0
How to find out what salesforce edition you have?
https://developer.salesforce.com/forums/ForumsMain?id=906F00000008oWkIAI
How do I find out what version is my salesforce?
https://developer.salesforce.com/forums/ForumsMain?id=906F00000008nICIAY
文字列のバイト数を取得したい!
皆様お世話になっております。
表記の通り、文字列のバイト数を求める処理を作成しております。
しかし、ApexではJavaのようにgetBytes()関数が使えないようで、
どのような方法で取得しようか困っております。
解決方法をご存知の方、どうかお助けください。
宜しくおねがい致します。
ご返信ありがとうございます。
意図通りに改行できる方法が早く実装される事を祈りつつ、
解決とさせて頂きます。
テキストエリア項目に対する入力規則で改行入力を防ぎたい
はじめまして。
とあるカスタムオブジェクトにテキストエリア項目があるのですが、入力規則を用いて改行入力を防ぐことは可能でしょうか?
※テキスト型とすると改行は入力できませんが、表示上1行入力となってしまうため、NGです。
こちらで下記入力規則で実装したところ、2行入力(改行1つ)は引っかかるんですが、
3行以上になると引っかからないという罠に陥ってます。。。
■実装した入力規則
REGEX(textArea__c, ".*\\r\\n.*")
誰か解決方法をご存知の方いらっしゃいませんか?
本件、解決しました。
下記入力規則とすることで、3行以上も検知してくれるようになりました。
REGEX(textArea__c, "(.*\\r\\n.*)+")
Visualforceページにanalytics:reportChartでグラフを貼り付けた際に実行ユーザを指定したい
実行ユーザの指定はURLパラメータで指定すれば良いと思うのですが、それを引数にしてfilterをかける事は出来るのでしょうか。
商談のStageName → STAGE_NAME
指定するときのAPI名はWorkbenchで確認できます。
https://workbench.developerforce.com/restExplorer.php
ログイン→utilites→REST Explorerで次のAPIを実行します。
/services/data/v37.0/analytics/reports/<Report ID>/describe
reportTypeMetadataでAPI名を確認できます。
Visualforceにレポート実行結果画面のグラフ部分を貼りつけたい
表題のとおり、Visualforceにレポート実行結果画面のグラフ部分だけを貼りつけたい
と思っているのですが、実現可能でしょうか?
どなたかご存じの方がいらっしゃいましたら教えて下さい。
レポート実行結果のグラフではないのですが、<apex:chart>というタグでグラフの
表示が可能みたいです。
この方法はいかがでしょうか。
■Apexクラス・サンプル
public class ChartController { // Return a list of data points for a chart public List<Data> getData() { return ChartController.getChartData(); } // Make the chart data available via JavaScript remoting @RemoteAction public static List<Data> getRemoteData() { return ChartController.getChartData(); } // The actual chart data; needs to be static to be // called by a @RemoteAction method public static List<Data> getChartData() { List<Data> data = new List<Data>(); data.add(new Data('Jan', 30, 90, 55)); data.add(new Data('Feb', 44, 15, 65)); data.add(new Data('Mar', 25, 32, 75)); data.add(new Data('Apr', 74, 28, 85)); data.add(new Data('May', 65, 51, 95)); data.add(new Data('Jun', 33, 45, 99)); data.add(new Data('Jul', 92, 82, 30)); data.add(new Data('Aug', 87, 73, 45)); data.add(new Data('Sep', 34, 65, 55)); data.add(new Data('Oct', 78, 66, 56)); data.add(new Data('Nov', 80, 67, 53)); data.add(new Data('Dec', 17, 70, 70)); return data; } // Wrapper class public class Data { public String name { get; set; } public Integer data1 { get; set; } public Integer data2 { get; set; } public Integer data3 { get; set; } public Data(String name, Integer data1, Integer data2, Integer data3) { this.name = name; this.data1 = data1; this.data2 = data2; this.data3 = data3; } } }
■Apexページ・サンプル①:円グラフ
<apex:page controller="ChartController"> <apex:chart data="{!data}" height="300" width="400" background="#F5F5F5"> <apex:legend position="left"/> <apex:pieSeries labelField="name" dataField="data1" colorSet="#37241E,#94B3C8,#4D4E24,#BD8025,#816A4A,#F0E68C"/> </apex:chart> </apex:page>
■Apexページ・サンプル②:棒グラフ
<apex:page controller="ChartController"> <apex:chart data="{!data}" height="400" width="500"> <apex:legend position="left"/> <apex:axis type="Numeric" position="left" title="Closed Won" grid="true" fields="data1,data2,data3" dashSize="2"> <apex:chartLabel /> </apex:axis> <apex:axis type="Category" position="bottom" fields="name" title="Stacked Bars"> <apex:chartLabel rotate="315"/> </apex:axis> <apex:barSeries orientation="vertical" axis="left" stacked="true" xField="name" yField="data1,data2,data3" title="MacDonald,Promas,Worle"/> </apex:chart> </apex:page>
Apexロジックによるレコードの自動採番について
はじめまして。Force.comを使い始めて1週間ほどの者です。
初歩的な質問をしてしまうかもしれませんが、よろしくお願い致します。
下記のような機能は実現可能でしょうか?
あるカスタムオブジェクト(ObjAとします)に、ユーザー毎に自動採番される項目(ItemObjIDとします)
を作りたいと思っています。
例えばユーザーAとユーザーBがいた場合、
ユーザーAが作成した1つ目のレコード:「UserA001」
ユーザーAが作成した2つ目のレコード:「UserA002」
ユーザーAが作成した1つ目のレコード:「UserB001」
・・といった具合です。
「新規作成」ボタンからこのオブジェクトを作成する場合、「ObjAの編集」画面が表示されます。
ここで既にItemObjIDが「UserA001」のレコードと「UserA002」のレコードが存在している場合、
「ItemObjID」の入力値項目にデフォルトで「UserA003」と入力されているようにしたいです。
「ObjAの編集」画面が表示される段階で「既に存在するレコードを検索してItemObjIDの
デフォルト値として入力されるべき値が"UserA003"であるということを割り出し、
項目に値を設定する」というApexロジックを差し込めれば実現できるかと思ったのですが、
Apexロジックはこのように使用することが可能な物なのでしょうか?
無知のため頓珍漢なことを聞いてしまっているかもしれません。
もし質問の意図がわかりにくいなどあれば、その旨お返事頂ければ幸いです。
どうぞよろしくお願い致します。
「ObjA」の編集画面を表示した時点で、デフォルト値として埋め込むには、以下の方法が考えられます。
・編集画面自体をVisualforceページとして作成する
(Visualforceページのコントローラで実現できます)
・別オブジェクトのカスタム項目で番号を管理し、デフォルト値の数式で設定する
(ただし、デフォルト値の数式で使えるオブジェクトであり、「ObjA」のトリガでこの番号を管理する等の処理が必要となります)
個人的には、トリガを使ってレコードの挿入時に自動採番するのが最も簡単な方法だと思います。
(編集画面を表示した段階で、自動採番したものを表示することができませんが、
自動採番するような項目は、一般ユーザには参照のみ項目とするべきだと思いますので、
問題ないのではないかと思います)
カスタムオブジェクトの詳細ページにVisualforceページを埋め込む方法
いつもお世話になっております。
カスタムオブジェクトの詳細ページにVisualforceページを埋め込むためにはどのようにすればよいのでしょうか?
標準オブジェクトの場合、例えば
Visualforceページのpageタグで standardController="Account"としておくと、
設定 > カスタマイズ > 取引先(Account) > ページレイアウト
のページレイアウト画面においてパレット上で「Visualforceページ」として選択できるというのは確認できたのですが、
カスタムオブジェクトの場合、どのようにすればよいのかわかりません。
以上、よろしくお願いします。
難しく考えずにstandardController="xxxxx__c"とすればOKです。
テストクラス内では基本的に実際のデータを取得することはできないので自分でテストデータをINSERTして用意する必要があります。