1

Contact と CampaignMember に関連する情報を返す単純な SOQL クエリがあります。カスタムオブジェクトに SOQL クエリの結果を入力しようとしています。ただし、Visualforce ページをロードするときに次のエラーが発生します。

CampaignMember のフィールド Campaign.name が無効です

リスト CampaignMembers = [キャンペーンメンバーから、キャンペーン名、連絡先 ID、連絡先名、連絡先名、ステータス、キャンペーン ID を選択します。ここで、連絡先 ID = '003U000000U0eNq' およびキャンペーン ID は :campaigns にあります];

for (整数 i = 0; i < CampaignMembers.size(); i++) {
    results.add(新しい CampaignMemberResult(
        (文字列)campaignMembers[i].get('CampaignId'),
        (文字列)campaignMembers[i].get('campaign.name'),
        真実
    ));
}

開発者コンソールで SOQL クエリを個別に実行したところ、正常にクエリが実行されました。for ループ内の SOQL クエリから Campaign.name を取り込めないのはなぜですか?

4

1 に答える 1

5

表示されるエラーは、次のように記述しなければならないという事実が原因ですcampaignMembers[i].Campaign.Name。または、getter 構文に固執する場合は、campaignMembers[i].getSobject('Campaign').get('Name').

ラッパー オブジェクト (または何でもCampaignMemberResult) が必要な特別な理由はありますか? 簡単なことを達成するのにあまりにも多くのコードを書いているような気がします;) 構文はcampaignMembers[i].Campaign.Name、String へのキャストを使用する必要がないことも意味します。


さらに、「このコンタクトがどのキャンペーンで発生するか」を知る必要がある場合は、次の 2 つの方法があります。

平らな

select contact.id,contact.firstname, contact.lastname, 
    campaignid, campaign.name, 
    status 
from CampaignMember 
where contactId = '003U000000U0eNq'

サブクエリ

連絡先からキャンペーンメンバーの関連リストに移動し、キャンペーンまで名前を取得します

SELECT Id, FirstName, LastName,
    (SELECT CampaignId, Campaign.Name FROM CampaignMembers)
FROM Contact WHERE Id = '003U000000U0eNq'

「フラット」結果を visualforce で直接使用する方法の例 ( なしCampaignMemberResult):

頂点:

public List<CampaignMember> flatMembers {get;set;} // insert dick joke here

flatMembers = [select contact.id,contact.firstname, contact.lastname, 
    campaignid, campaign.name, 
    status 
from CampaignMember 
where contactId = '003U000000U0eNq'];

VF:

<apex:pageBlockTable value="{!flatMembers}" var="cm">
    <apex:column value="{!cm.Contact.LastName}" />
    <apex:column value="{!cm.Status}" />
    <apex:column value="{!cm.Campaign.Name}" />

編集

私の最終的な目標は、連絡先がメンバーであるかどうかを示すチェックボックスが横にあるすべてのキャンペーンのリストを表示する、連絡先レコードに表示される Visualforce ページです。

すぐにかなり長いテーブルに成長する可能性があることをご存知ですか? たぶん、キャンペーンのフィルターです (sth advanced について読みたい場合は、"StandardSetController" のドキュメントを確認してください)。また、キャンペーン レポートから連絡先/リードをキャンペーンに追加する方法がいくつかあると確信しています。

しかし、コード ソリューションは非常に簡単です。ヘルパー ラッパー クラスから始めます。

public class CampaignWrapper{
    public Boolean selected {get;set;}
    public Campaign c {get; private set;}
    public CampaignWrapper(Campaign c){
        this.c = c;
        selected = !c.CampaignMembers.isEmpty();
    }
}

次に、クエリを実行してラッパーのリストを作成します。

List<CampaignWrapper> wrappers = new List<CampaignWrapper>();
for(Campaign c : [SELECT Id, Name, (SELECT Id FROM CampaignMember WHERE ContactId = '...')
    FROM Campaign
    LIMIT 1000]){
    wrappers.add(new CampaignMember(c));
}

あなたはすべて設定されているはずです;)それが表示のためだけの場合-ラッパークラスさえ必要ないかもしれません(おそらくvisualforce式のいくつかのトリックまたは使用Map<Campaign, Boolean>さえ...

1000 レコードが Visualforce に渡されるコレクションの制限です (ページが読み取り専用の場合は 10K)。それを過ぎると-ページネーション、おそらく上記のStandardSetControllerで使用されます。

于 2013-04-12T11:47:55.183 に答える