yamaday0u
@yamaday0u

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Apexトリガで、リレーションで関連づけられた取引先責任者を更新する方法について教えてください。

Salesforceを学び始めて1週間です。
タイトルの件で、3日間実装にチャレンジし続けているのですが、一向に解決できず、エラーメッセージを読んでもわかりません。
debugもできず困り果てています。​
どのようにApexトリガのコードを修正すれば望んだ機能が実装できるのか、皆様のお知恵をお借りしたいです。

​【前提】

オブジェクト​は以下の2つです。

  • 取引先責任者(Contact)
  • 試合(Game__c)

 取引先責任者オブジェクトにはカスタム項目として出場試合数(Game_c、データ型は数値)を追加しています。
 試合オブジェクトには出場選手(Player1_c)​のカスタム項目があり、データ型は参照関係(取引先責任者)となっています。

【実現したいこと】​

 ​試合オブジェクトで出場選手を入れてレコードを登録すると、取引先責任者オブジェクトの該当する出場選手が含まれるレコードの出場試合数(Game__c)が「+1」される。​

【発生している問題】​

 試合オブジェクトで出場選手を入れてレコードを登録しようとすると「List has no rows for assignment to SObject」というエラーが出る。
スクリーンショット 2021-07-07 22.42.29.png

エラー文の意味はわかりますが、どのようにコードを修正すれば解決できるのかわかりません。

以下がApexトリガ(AddPlayedGameTrigger)のコードです。

Apex
trigger AddPlayedGameTrigger on Game__c (after insert) {
  for(Game__c game : Trigger.New) {
    // Contactの出場試合数を更新する
    Contact contact = [SELECT Account.Name FROM Contact WHERE Name = :game.Player1__c LIMIT 1];
    contact.Game__c = contact.Game__c + 1;
    upsert contact;
  }
}

debugをしようにも以下のようなエラーが連発して、それすらままならず途方に暮れています。​

  • Illegal assignment from Contact to Id
  • System.StringException: Invalid id: 王城
  • Unexpected token 'game'.」

debugで試したコード​

Apex
Contact contact = [SELECT Name FROM Contact WHERE Name='王城'];
Game__c game = new Game__c(Player1__c = contact.Name);
insert game;

よろしくお願いします。

0

1Answer

trigger AddPlayedGameTrigger on Game__c (after insert) {
List<Contact> contacts = new List<Contact>();
if(Trigger.isInsert && Trigger.isAfter){
 for(Game__c game : Trigger.New) {
    // Contactの出場試合数を更新する
    Contact contact = [SELECT Account.Name FROM Contact WHERE Name = :game.Player1__c LIMIT 1];
    contact.Game__c = contact.Game__c + 1;
    contacts.add(contact);
  }
 if(contacts.size() > 0)
    update contacts;
 }
}
1Like

Your answer might help someone💌