function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
MorookaMorooka 

いつも大変お世話になっております。

 

DBアクセスについて質問があります。

本番環境に上げる為にApexテストを行いましたがデータが取得出来ていません。

Apexテストを行う際に何か記述しなければいけない事があるのでしょうか?

 

※[select id from User]では取得できているのですが、[select id from Account]では取得できていません。

Best Answer chosen by Admin (Salesforce Developers) 
Taiki YoshikawaTaiki Yoshikawa
テストクラス内でテストデータの作成は行なっていますでしょうか。
テストクラス内では基本的に実際のデータを取得することはできないので自分でテストデータをINSERTして用意する必要があります。
muromuromuromuro 
いつもお世話になっております。

トリガのハンドラークラス内で、処理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があると、エラーは発生せず想定通りに処理が終了します。
  1. このような現象に遭遇した方はいらっしゃいますか。
  2. このような現象が発生する原因は何が考えられますか。
  3. System.debugなしで処理を正常に終了させるには、どうすればよいでしょうか。
以上3点、わかる方がいらっしゃいましたらよろしくお願いします。
Best Answer chosen by muromuro
T.AbeT.Abe
muromuro様

同じようなエラーに遭遇した者です。

下記サイトにエラーの原因が記載されています。
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型に変更するという方法が提案されています。
もしまだ未解決のようでしたら、どうぞご検討ください。
真一 武田真一 武田 
特定のカスタムオブジェクトに添付ファイルが投稿された際に動作するApex Triggerを作成しています。

添付されたのがどのカスタムオブジェクトなのかを判定する方法として、添付ファイルの親カスタムオブジェクトID(ParentId)をハードコードして判定する方法を利用しているのですが、SandboxとはカスタムオブジェクトIDが異なっているため、リリース前に書き換えるという手段をとっています。

Sandboxと本番組織で同一のコードでカスタムオブジェクトを判定する方法はないでしょうか?
Best Answer chosen by 真一 武田
Taiki YoshikawaTaiki Yoshikawa
schema処理で取得可能です。こちらのページが参考になると思います。
https://qiita.com/s_hayashida/items/517da55c05c6099805dc
Shinichiro WakamiyaShinichiro Wakamiya 
現在のSalesforceのバージョンと、使用可能なAPIのバージョンはどのようにしたら確認できますでしょうか?
Best Answer chosen by Shinichiro Wakamiya
Taiki YoshikawaTaiki Yoshikawa
Salesforceにログインした後、左上に表示されるロゴでバージョンが確認できます。

使用可能な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
wayawaya 

 

皆様お世話になっております。 

 

 

 表記の通り、文字列のバイト数を求める処理を作成しております。 

 しかし、ApexではJavaのようにgetBytes()関数が使えないようで、 

 どのような方法で取得しようか困っております。  

 解決方法をご存知の方、どうかお助けください。

宜しくおねがい致します。

Best Answer chosen by Admin (Salesforce Developers) 
wayawaya

ご返信ありがとうございます。
意図通りに改行できる方法が早く実装される事を祈りつつ、
解決とさせて頂きます。

nomenome 

はじめまして。

 

とあるカスタムオブジェクトにテキストエリア項目があるのですが、入力規則を用いて改行入力を防ぐことは可能でしょうか?

※テキスト型とすると改行は入力できませんが、表示上1行入力となってしまうため、NGです。

 

こちらで下記入力規則で実装したところ、2行入力(改行1つ)は引っかかるんですが、

3行以上になると引っかからないという罠に陥ってます。。。

 

■実装した入力規則

REGEX(textArea__c, ".*\\r\\n.*")

 

誰か解決方法をご存知の方いらっしゃいませんか?

Best Answer chosen by Admin (Salesforce Developers) 
nomenome

本件、解決しました。

 

下記入力規則とすることで、3行以上も検知してくれるようになりました。

REGEX(textArea__c, "(.*\\r\\n.*)+")

吉田 丈治吉田 丈治 
ダッシュボードの様に実行ユーザを指定してVisualforceページに貼り付けたレポートを呼び出すことは出来るのでしょうか。
実行ユーザの指定はURLパラメータで指定すれば良いと思うのですが、それを引数にしてfilterをかける事は出来るのでしょうか。
Best Answer chosen by 吉田 丈治
Taiki YoshikawaTaiki Yoshikawa
filterに指定するときのAPI名は通常の名前とは異なります。
商談の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名を確認できます。
User-added image
KeronKeron 

表題のとおり、Visualforceにレポート実行結果画面のグラフ部分だけを貼りつけたい

と思っているのですが、実現可能でしょうか?

どなたかご存じの方がいらっしゃいましたら教えて下さい。

 

Best Answer chosen by Admin (Salesforce Developers) 
Taiki YoshikawaTaiki Yoshikawa

レポート実行結果のグラフではないのですが、<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>

 

 

kobackykobacky 

はじめまして。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ロジックはこのように使用することが可能な物なのでしょうか?

 

無知のため頓珍漢なことを聞いてしまっているかもしれません。
もし質問の意図がわかりにくいなどあれば、その旨お返事頂ければ幸いです。
どうぞよろしくお願い致します。

Best Answer chosen by Admin (Salesforce Developers) 
n-hayashin-hayashi

「ObjA」の編集画面を表示した時点で、デフォルト値として埋め込むには、以下の方法が考えられます。

 

 ・編集画面自体をVisualforceページとして作成する

 (Visualforceページのコントローラで実現できます


 ・別オブジェクトのカスタム項目で番号を管理し、デフォルト値の数式で設定する

 (ただし、デフォルト値の数式で使えるオブジェクトであり、「ObjA」のトリガでこの番号を管理する等の処理が必要となります)

 

 

個人的には、トリガを使ってレコードの挿入時に自動採番するのが最も簡単な方法だと思います。

(編集画面を表示した段階で、自動採番したものを表示することができませんが、

 自動採番するような項目は、一般ユーザには参照のみ項目とするべきだと思いますので、

 問題ないのではないかと思います)

 


 

UsajiUsaji 

いつもお世話になっております。

 

カスタムオブジェクトの詳細ページにVisualforceページを埋め込むためにはどのようにすればよいのでしょうか?

 

標準オブジェクトの場合、例えば

Visualforceページのpageタグで standardController="Account"としておくと、

設定 > カスタマイズ > 取引先(Account) > ページレイアウト

のページレイアウト画面においてパレット上で「Visualforceページ」として選択できるというのは確認できたのですが、

カスタムオブジェクトの場合、どのようにすればよいのかわかりません。

 

以上、よろしくお願いします。

Best Answer chosen by Admin (Salesforce Developers) 
ikouikou

難しく考えずにstandardController="xxxxx__c"とすればOKです。