• 吉田 丈治
  • NEWBIE
  • 0 Points
  • Member since 2014
  • 取締役CIO
  • 株式会社リバネス


  • Chatter
    Feed
  • 0
    Best Answers
  • 2
    Likes Received
  • 0
    Likes Given
  • 14
    Questions
  • 13
    Replies
プロセスやフロー、トリガーや各種Apex等。
何かのアクションに関連付けた自動更新の設定は色々な所でできると思うのですが、それらの管理は皆様どのようにされていますか?
たまに、どこが原因で更新されているのかを見失う事があるのです。
デベロッパーコンソールのログを追うというのはもちろんなのですが、わからない場合は色々と複雑に入り組んでいたり条件が沢山ありすぎて探索に時間がかかったりという感じです。
どのように管理されているのでしょうか。知見がありましたら共有いただけると嬉しいです。
lightning componentの開発中に躓きました。
https://developer.salesforce.com/docs/component-library/bundle/lightning:tab/example
こちらを使い、タブの中にいくつかのチャートを表示しようと思っています。
チャート自体は echart.jsを使ってレンダリングします。
https://ecomfe.github.io/echarts-doc/public/en/tutorial.html#Get%20Started%20with%20ECharts%20in%205%20minutes
ここにあるとおり、jsを読み込んでから <div id="main" style="width:600px; height:400px;"></div> と記述することで棒グラフが表示されることが確認できました。
しかし、lightning:tabの中に入れると表示されません。
なぜでしょうか。
Apex(若干省略していますが、マップにString型のキーを作って適当なオブジェクトを詰め込むという処理です:こちらは問題ないです)
Map<String,sObject> keyMap = new Map<String,sObject>();
		...Mapにオブジェクトを入れる処理
		//Mapのキーセットを取得する
		KeySet = new Set<String>();
		KeySet = keyMap.keySet();

Visualforceでは、キーに特定の文字列が入っていたら出力するという処理を行いたいと思っています
<apex:repeat value="{!KeySet}" var="key">
		<apex:outputText value="foo" rendered="{!CONTAINS(key,'特定の文字列')}" />
	</apex:repeat>
エラー
関数 'CONTAINS()' のパラメータ種別が間違っています。期待テキスト、受信オブジェクト

keyの部分がオブジェクトと判定されているようなのですが、何故でしょうか。
それではと思って text(key)とすると今度はtext関数でエラーとなってしまいます
 
'text()' のパラメータ種別が間違っています。期待数字, 日付, DateTime, 選択リスト、受信オブジェクト

このキーをそのまま {!key}で出力するとテキストとして出力されるのですが。
どなたかお知恵をください。
CommunityCloudを利用し、複数のコミュニティを運用しています。
コミュニティAにはプロファイルAが
コミュニティBにはプロファイルBがユーザに適用されるようになっています。

今回コミュニティAとBの両方のサイトにアクセスしたいというニーズが出てきたため、両コミュニティに両プロファイルからアクセスできるようにしたところ問題が発生しました。
新規登録を行った際に、お知らせメールが飛び、ログインURLがかかれているのですが、そのURLが https://コミュニティのルート.force.com/コミュニティA/communitiesSelfReg.....   のようなURLに固定されます。(恐らくプロファイル名を英字でソートした時に最初にくる方だと思います)
このURLはメールテンプレート内にある {!Community_Url} に挿入されるようなのですが、コミュニティBからの登録でもコミュニティAのログインURLが配布されるため、一見ログインは出来てしまうのですが、目的のコミュニティとは違うコミュニティに入る事になってしまいます。

何か解決のヒントをお持ちの方はおりませんでしょうか。
Visualforceページを作っています。
例えば取引先に紐付いたvisualforceページで取引先名のプリフィクスで表示内容を変えるというようなイメージです。
visualforceページにはコンタクトリストを表示したいと思います。
コンタクトリストはSOQLで作成しています。

Apex例
public class customAccontPage{
	public customAccontPage(ApexPages.StandardController controller) {
		this.acc = (Account)controller.getRecord();
	}
    public void getCustomQuery(){
    	if( acc.Name.contains('prifix 1') ){
    		customquery = 'phone';//電話番号
    	}else if( acc.Name.contains('prifix 2') ){
    		customquery = 'mobile__c';//携帯電話
    	}
	}
    public void getContactList(){
        this.clist = new List <Contact> ();
        this.clist = Database.query('SELECT Id, Name, ' + customquery + ' FROM Contact');
    }
}

このような場合にvisualforceページでpageBlockでコンタクトリストを表示したいと思っています。
先ほどapexに書いたように、取引先名のプリフィクスに入っている文字列によって取得する項目を分けているので、それに応じた表示をしたいのです。
<apex:pageBlock title="ルーチン" id="TcoR">
            <apex:pageBlockTable value="{!clist}" var="c">
                <apex:column value="{!c.Id}"/>
                <apex:column value="{!c.name}"/>
                <apex:column value="{!c.       }"/> // ここにcustomqueryで取得した項目をだしたい
            </apex:pageBlockTable>
        </apex:pageBlock>


そのようなことは可能でしょうか?

例えばapex側で customqueryの後ろ側に変数名として customNameのようなものを振ることができれば、それを呼び出せばよいかと思ったのですが、それはできなさそうでした。
this.clist = Database.query('SELECT Id, Name, ' + customquery + ' customName FROM Contact');

何か良い方法は無いでしょうか。
Visualforceページに
・ユーザー一覧
・年月
のようなドロップダウンリスト2つを置き、移動ボタンを押すとその2つのパラメータを含んだURLへと遷移するような事をしたいと思っています。
URLは /apex/pageName?uid=ユーザーID&yearmonth=2017-01
のようなイメージです。

該当するユーザの該当月のEvent一覧を出力するようなイメージなのですが、どのような実装が可能でしょうか。

・表示されるドロップダウンリストは該当ユーザと年月が選択された状態になっていると尚良い
・ユーザを受け取ると、年月のドロップダウンリストはEventが存在している年月のみだと尚良い

特に分からないこと
・年月のドロップダウンリストのようなものを自動生成出来るのか
こちらを参照してトリガとハンドラを作っています

商談オブジェクト(Opportunity)の中にカスタム項目で親商談(parentOpp__c)という項目を作り、商談に親子関係を作っています。
親商談1に対して子商談が複数付く事があります。

トリガで実現したいのは、
1:子商談の紐付けがされた時に親商談の親商談フラグ(parentOppFlag__c)をTRUEにするということと
2:子商談の親商談の紐付け(parentOpp__c)が削除された時、子商談自体が削除された時に、削除された parentOpp__cのIDを持っている商談をSELECTしてそのリストが1以上だった場合は親の商談のparentOppFlag__cはTRUEのまま。0だった場合にはparentOppFlag__cをFALSEにする
というものです。

1については、冒頭のリンク先を参照して以下のように実装しました。
2については、Trigger.oldを使ってデータを取得する必要がありどのように実装すべきかがわかっておりせん。
どなたかお知恵を拝借できないでしょうか。

1のコードは以下の通り

Trigger
trigger updateChildOppTrigger on Opportunity (after update , after delete , after insert) {
    
    updateChildOppTriggerHandler handler = new updateChildOppTriggerHandler();
    
    if (Trigger.isAfter) {
        if (Trigger.isInsert) {
            // 新規の場合:親商談がある商談を更新
            handler.updateOpportunityInsert(Trigger.new);
        }

    }
}


Handler
public with sharing class updateChildOppTriggerHandler {

    public updateChildOppTriggerHandler() {
        
    }

    public void updateOpportunityInsert(List<Opportunity> prmOpportunities) {
        
        // 最初に商談に紐付く親商談IDを取得
    	Set<Id> opportunityIds = new Set<Id>();
        for (Opportunity o : prmOpportunities) {
            if (String.isNotEmpty(o.parentOpp__c )) {
            	opportunityIds.add(o.parentOpp__c );
            }
        }

        // 取引先IDを条件に取引先を取得する
        List<Opportunity> opportunities = [SELECT Id,parentOpp__c  FROM Opportunity WHERE Id IN: opportunityIds];

        // 取引先に値をセットする
        for (Opportunity a : opportunities) {
        	a.parentOppFlag__c = True;
        }

        // 取引先を更新する
        update opportunities;
    }
}

 
主従関係や参照関係でデータを引っ張ってくるという形については理解できました。

やりたいことは
主オブジェクト
 子オブジェクト1
 子オブジェクト2
主従関係でリンクされたオブジェクトがあるとします。
主オブジェクトのIDで子オブジェクト1および子オブジェクト2に登録されたレコード数をまとめたりというような事をしたいと思っています。
SOQLでは出来ないという事なのですが、このような場合にはどうやって処理するのが良いのでしょうか。

別オブジェクトを作ってバッチ処理でデータをそちらに蓄積しておいて表示するようなやり方くらいしか思い浮かばず、何かベストプラクティスがあればご教示いただけると助かります。
https://developer.salesforce.com/forums/?id=906F00000009BPVIA2
http://blog.flect.co.jp/salesforce/2011/08/pdf-0409.html
このあたりに目を通しております。

PDF化するVisualforceページにURLパラメータから取得したパラメータによって出力が変わるような分岐が入っています。
そのような場合にページを取得するにはどうしたらよいでしょうか。
http://coenraets.org/blog/2016/01/slack-salesforce-integration/
こちらのコードなのですが、プロセスビルダーから特定の条件が発生した時にApexを呼び出してSlackに通知をPostするClassとなっております。
このような場合にテストはどのように書けばよいのでしょうか。
User-added image

WorkbenchのSOQL Queryでこんな感じの表が出力出来そうなことは分かっているのですが、Visualforceページにうまくのせられず困っております。

User-added image
SELECT sum(point_2016_8__c),CreatedById,PMT__c 
FROM projectmembers__c 
WHERE member__c = 'a1i10000004Mnfj'  
group by CreatedById,PMT__c

Class
public void countPMT(){
        repoOwnerId = [Select Id,ownerId from MyReport__c where Id= :repo.Id].ownerId;
        List<AggregateResult> allPMTByOthers = [SELECT sum(point_2016_8__c) pointsum ,CreatedById,PMT__c 
                               FROM projectmembers__c 
                               WHERE member__c = :repoOwnerId 
                               group by CreatedById,PMT__c 
                                  ];
    }

VF
 <apex:pageBlockTable value="{!allPMTByOthers}" var="t">
                <apex:column value="{!t.CreatedById}"/>
                <apex:column value="{!t.PMT__c}"/>
                <apex:column value="{!t.pointsum}"/> 
            </apex:pageBlockTable>

良くわからないこと
・Matrix表示時に、Rowを指定する方法
  ・columnは上記のような感じで良さそうなのですが、rowの指定はどのようにすればよいのでしょうか
・sum(point_2016_8__c) pointsum としているのですが、VF側で{!t.pointsum}とするとエラーが出ます
エラー: Invalid field pointsum for SObject projectmembers__c

WorkbenchのQuery resultの様に表示をしたいのですが、そこでつまづきました。
お知恵をいただけると助かります。
Failed to create createContainerMember for containerId=1dc10000000QXrZAAW: このコンテナメンバーは、deploymentId=1drp00000011qub を指定した現在未完了の保存要求があるコンテナに属しています。これが完了するまでこのコンテナのメンバーは一切変更することができません。: メタデータコンテナ ID

開発者コンソールでApexのclassを保存しようとするとこんな表示が出てしまいました。
コードを書いているclassのみでなく、新規作成したclassファイルの保存でも上記のエラーが出ます。
ファイルの作成は出来るのですが、保存ができないという状態です。昨晩より時間を置いてみたのですが、時間が解決してくれる訳ではないようです。

http://blog.livedoor.jp/androidbeginner/archives/38718541.html

こちらも試してみたのですが

この URL は、現在存在しません。

という表示になってしまいました。
解決策をご存知のかた、いらっしゃいませんでしょうか。
 
http://www.saaspie.com/2015/03/02/filtering-records-related-list-using-visualforce/

ここに書いてある事とほぼおなじなのですが、リストが表示されず、どこが間違っているのかご教示下さい。こちらとの違いはカスタムオブジェクトを用いているという部分です。

カスタムオブジェクト ObjectA
にリレーションが貼ってあり
Aに対して、子となるカスタムオブジェクト ObjectBが複数存在するとします。
ObjectBには、カスタム項目で参照関係が登録してあり、ObjectBtoA__c という項目にObjectAのIdが指定されているとします。

class
public class getBFromA {
    public ObjectA__c obj_a;
    public List <ObjectB__c> obj_bs { get; set; }
    public getBFromA(ApexPages.StandardController controller) {
        this.obj_a = (ObjectA__c)controller.getRecord();
    }
    
    public List<ObjectB__c> getBonlyA(){
        obj_bs = new List <ObjectB__c> ();
        obj_bs = [SELECT Id,
                            Name
                        FROM ObjectB__c
                        WHERE ObjectBtoA__c = :obj_a.Id
                    ];
        System.debug('ObjectB' + obj_bs);
        return obj_bs;
    }
}

VisualforcePage
<apex:page standardController="ObjectA" extensions="getBFromA" title="getBFromA">
    <apex:form >
        <apex:pageBlock title="getBFromA" id="getBFromA">
            <apex:pageBlockTable value="{!obj_bs}" var="b">
                <apex:column value="{!b.Id}"/>
                <apex:column value="{!b.Name}"/>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>

https://myOrg.visual.force.com/apex/getBfromA?id=*******obj_aのid******
こんなURLでアクセスしています。

ログを見たところ、this.obj_aまでは取れているようでした
15:11:03:017 VARIABLE_ASSIGNMENT [5]|this.obj_a|{"s":1,"v":{"CurrencyIsoCode":"JPY","Id":"*******obj_aのid******","Name":"ObjectAの名前"}}|0x4f25b83e

ページ側には空のapex:pageBlockが表示されます。
何がまずいのでしょうか。
ダッシュボードの様に実行ユーザを指定してVisualforceページに貼り付けたレポートを呼び出すことは出来るのでしょうか。
実行ユーザの指定はURLパラメータで指定すれば良いと思うのですが、それを引数にしてfilterをかける事は出来るのでしょうか。
http://coenraets.org/blog/2016/01/slack-salesforce-integration/
こちらのコードなのですが、プロセスビルダーから特定の条件が発生した時にApexを呼び出してSlackに通知をPostするClassとなっております。
このような場合にテストはどのように書けばよいのでしょうか。
ダッシュボードの様に実行ユーザを指定してVisualforceページに貼り付けたレポートを呼び出すことは出来るのでしょうか。
実行ユーザの指定はURLパラメータで指定すれば良いと思うのですが、それを引数にしてfilterをかける事は出来るのでしょうか。
Apex(若干省略していますが、マップにString型のキーを作って適当なオブジェクトを詰め込むという処理です:こちらは問題ないです)
Map<String,sObject> keyMap = new Map<String,sObject>();
		...Mapにオブジェクトを入れる処理
		//Mapのキーセットを取得する
		KeySet = new Set<String>();
		KeySet = keyMap.keySet();

Visualforceでは、キーに特定の文字列が入っていたら出力するという処理を行いたいと思っています
<apex:repeat value="{!KeySet}" var="key">
		<apex:outputText value="foo" rendered="{!CONTAINS(key,'特定の文字列')}" />
	</apex:repeat>
エラー
関数 'CONTAINS()' のパラメータ種別が間違っています。期待テキスト、受信オブジェクト

keyの部分がオブジェクトと判定されているようなのですが、何故でしょうか。
それではと思って text(key)とすると今度はtext関数でエラーとなってしまいます
 
'text()' のパラメータ種別が間違っています。期待数字, 日付, DateTime, 選択リスト、受信オブジェクト

このキーをそのまま {!key}で出力するとテキストとして出力されるのですが。
どなたかお知恵をください。
こちらを参照してトリガとハンドラを作っています

商談オブジェクト(Opportunity)の中にカスタム項目で親商談(parentOpp__c)という項目を作り、商談に親子関係を作っています。
親商談1に対して子商談が複数付く事があります。

トリガで実現したいのは、
1:子商談の紐付けがされた時に親商談の親商談フラグ(parentOppFlag__c)をTRUEにするということと
2:子商談の親商談の紐付け(parentOpp__c)が削除された時、子商談自体が削除された時に、削除された parentOpp__cのIDを持っている商談をSELECTしてそのリストが1以上だった場合は親の商談のparentOppFlag__cはTRUEのまま。0だった場合にはparentOppFlag__cをFALSEにする
というものです。

1については、冒頭のリンク先を参照して以下のように実装しました。
2については、Trigger.oldを使ってデータを取得する必要がありどのように実装すべきかがわかっておりせん。
どなたかお知恵を拝借できないでしょうか。

1のコードは以下の通り

Trigger
trigger updateChildOppTrigger on Opportunity (after update , after delete , after insert) {
    
    updateChildOppTriggerHandler handler = new updateChildOppTriggerHandler();
    
    if (Trigger.isAfter) {
        if (Trigger.isInsert) {
            // 新規の場合:親商談がある商談を更新
            handler.updateOpportunityInsert(Trigger.new);
        }

    }
}


Handler
public with sharing class updateChildOppTriggerHandler {

    public updateChildOppTriggerHandler() {
        
    }

    public void updateOpportunityInsert(List<Opportunity> prmOpportunities) {
        
        // 最初に商談に紐付く親商談IDを取得
    	Set<Id> opportunityIds = new Set<Id>();
        for (Opportunity o : prmOpportunities) {
            if (String.isNotEmpty(o.parentOpp__c )) {
            	opportunityIds.add(o.parentOpp__c );
            }
        }

        // 取引先IDを条件に取引先を取得する
        List<Opportunity> opportunities = [SELECT Id,parentOpp__c  FROM Opportunity WHERE Id IN: opportunityIds];

        // 取引先に値をセットする
        for (Opportunity a : opportunities) {
        	a.parentOppFlag__c = True;
        }

        // 取引先を更新する
        update opportunities;
    }
}

 
主従関係や参照関係でデータを引っ張ってくるという形については理解できました。

やりたいことは
主オブジェクト
 子オブジェクト1
 子オブジェクト2
主従関係でリンクされたオブジェクトがあるとします。
主オブジェクトのIDで子オブジェクト1および子オブジェクト2に登録されたレコード数をまとめたりというような事をしたいと思っています。
SOQLでは出来ないという事なのですが、このような場合にはどうやって処理するのが良いのでしょうか。

別オブジェクトを作ってバッチ処理でデータをそちらに蓄積しておいて表示するようなやり方くらいしか思い浮かばず、何かベストプラクティスがあればご教示いただけると助かります。
http://coenraets.org/blog/2016/01/slack-salesforce-integration/
こちらのコードなのですが、プロセスビルダーから特定の条件が発生した時にApexを呼び出してSlackに通知をPostするClassとなっております。
このような場合にテストはどのように書けばよいのでしょうか。
User-added image

WorkbenchのSOQL Queryでこんな感じの表が出力出来そうなことは分かっているのですが、Visualforceページにうまくのせられず困っております。

User-added image
SELECT sum(point_2016_8__c),CreatedById,PMT__c 
FROM projectmembers__c 
WHERE member__c = 'a1i10000004Mnfj'  
group by CreatedById,PMT__c

Class
public void countPMT(){
        repoOwnerId = [Select Id,ownerId from MyReport__c where Id= :repo.Id].ownerId;
        List<AggregateResult> allPMTByOthers = [SELECT sum(point_2016_8__c) pointsum ,CreatedById,PMT__c 
                               FROM projectmembers__c 
                               WHERE member__c = :repoOwnerId 
                               group by CreatedById,PMT__c 
                                  ];
    }

VF
 <apex:pageBlockTable value="{!allPMTByOthers}" var="t">
                <apex:column value="{!t.CreatedById}"/>
                <apex:column value="{!t.PMT__c}"/>
                <apex:column value="{!t.pointsum}"/> 
            </apex:pageBlockTable>

良くわからないこと
・Matrix表示時に、Rowを指定する方法
  ・columnは上記のような感じで良さそうなのですが、rowの指定はどのようにすればよいのでしょうか
・sum(point_2016_8__c) pointsum としているのですが、VF側で{!t.pointsum}とするとエラーが出ます
エラー: Invalid field pointsum for SObject projectmembers__c

WorkbenchのQuery resultの様に表示をしたいのですが、そこでつまづきました。
お知恵をいただけると助かります。
Failed to create createContainerMember for containerId=1dc10000000QXrZAAW: このコンテナメンバーは、deploymentId=1drp00000011qub を指定した現在未完了の保存要求があるコンテナに属しています。これが完了するまでこのコンテナのメンバーは一切変更することができません。: メタデータコンテナ ID

開発者コンソールでApexのclassを保存しようとするとこんな表示が出てしまいました。
コードを書いているclassのみでなく、新規作成したclassファイルの保存でも上記のエラーが出ます。
ファイルの作成は出来るのですが、保存ができないという状態です。昨晩より時間を置いてみたのですが、時間が解決してくれる訳ではないようです。

http://blog.livedoor.jp/androidbeginner/archives/38718541.html

こちらも試してみたのですが

この URL は、現在存在しません。

という表示になってしまいました。
解決策をご存知のかた、いらっしゃいませんでしょうか。
 
http://www.saaspie.com/2015/03/02/filtering-records-related-list-using-visualforce/

ここに書いてある事とほぼおなじなのですが、リストが表示されず、どこが間違っているのかご教示下さい。こちらとの違いはカスタムオブジェクトを用いているという部分です。

カスタムオブジェクト ObjectA
にリレーションが貼ってあり
Aに対して、子となるカスタムオブジェクト ObjectBが複数存在するとします。
ObjectBには、カスタム項目で参照関係が登録してあり、ObjectBtoA__c という項目にObjectAのIdが指定されているとします。

class
public class getBFromA {
    public ObjectA__c obj_a;
    public List <ObjectB__c> obj_bs { get; set; }
    public getBFromA(ApexPages.StandardController controller) {
        this.obj_a = (ObjectA__c)controller.getRecord();
    }
    
    public List<ObjectB__c> getBonlyA(){
        obj_bs = new List <ObjectB__c> ();
        obj_bs = [SELECT Id,
                            Name
                        FROM ObjectB__c
                        WHERE ObjectBtoA__c = :obj_a.Id
                    ];
        System.debug('ObjectB' + obj_bs);
        return obj_bs;
    }
}

VisualforcePage
<apex:page standardController="ObjectA" extensions="getBFromA" title="getBFromA">
    <apex:form >
        <apex:pageBlock title="getBFromA" id="getBFromA">
            <apex:pageBlockTable value="{!obj_bs}" var="b">
                <apex:column value="{!b.Id}"/>
                <apex:column value="{!b.Name}"/>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>

https://myOrg.visual.force.com/apex/getBfromA?id=*******obj_aのid******
こんなURLでアクセスしています。

ログを見たところ、this.obj_aまでは取れているようでした
15:11:03:017 VARIABLE_ASSIGNMENT [5]|this.obj_a|{"s":1,"v":{"CurrencyIsoCode":"JPY","Id":"*******obj_aのid******","Name":"ObjectAの名前"}}|0x4f25b83e

ページ側には空のapex:pageBlockが表示されます。
何がまずいのでしょうか。
ダッシュボードの様に実行ユーザを指定してVisualforceページに貼り付けたレポートを呼び出すことは出来るのでしょうか。
実行ユーザの指定はURLパラメータで指定すれば良いと思うのですが、それを引数にしてfilterをかける事は出来るのでしょうか。