• Mingos
  • NEWBIE
  • 25 Points
  • Member since 2012

  • Chatter
    Feed
  • 1
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 2
    Questions
  • 2
    Replies

visualforceやApexでの開発した資源を移行するにあたっての作業についてお聞きしたいのですが。

 

今回は無料のDeveloperEdition?お試し版のような環境にてコード開発を行いました。

そして、いざ有料の製品版に移行しようとした際に、移行先にサンプルサイト用のApexコードやpageなどが存在しており、削除する必要があるのですが、

参照関係やら何やらで、全部削除する作業に一苦労しています。

(お試し版でつくる際も、同様なことがあり苦労しました)

 

みなさんも同じように苦労してるんですかね?それとも参照関係を一発で断ち切って一括で削除できる方法がありますでしょうか?

Apexでサイトを利用する取引先から毎月資料を送信してもらうという機能を作成しています。
そこで、apex:inputFileからアップロードしたファイルを親となるカスタムオジェクトに関連させて添付ファイル(Attachment)に登録しています。
資料を再アップロードする場合は、添付ファイルの中味(Attachment.Body)だけ更新をかけています。

ただし、担当者Aが登録したAttachmentレコードを同じ取引先の担当者Bが再アップロードして更新した際に、以下のようなエラーが発生しました。

 

System.DmlException: Update failed. First exception on row 0 with id XXXXXXXXXX…; first error: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, insufficient access rights on cross-reference id: [] (XXXXXXXXXX…はレコードID)

 

原因がわからないのですが多分 所有者が異なることで発生したのだと思います。
Attachmentを登録した担当者が、同じレコードを更新することはできます。
Attachmentの所有者が同じ取引先のユーザなら更新できるような方法があったら教えてください。

よろしくお願いします。

 

補足
トリガで共有ルールを作ればいいのかなと以下のサイトを参考にしてみましたが、途中で行き詰まりました。
http://blog.flect.co.jp/salesforce/2012/02/
⇒Schema.Item__Shareが解説されていないので、どう設定するのか解らず。

Apexでサイトを利用する取引先から毎月資料を送信してもらうという機能を作成しています。
そこで、apex:inputFileからアップロードしたファイルを親となるカスタムオジェクトに関連させて添付ファイル(Attachment)に登録しています。
資料を再アップロードする場合は、添付ファイルの中味(Attachment.Body)だけ更新をかけています。

ただし、担当者Aが登録したAttachmentレコードを同じ取引先の担当者Bが再アップロードして更新した際に、以下のようなエラーが発生しました。

 

System.DmlException: Update failed. First exception on row 0 with id XXXXXXXXXX…; first error: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, insufficient access rights on cross-reference id: [] (XXXXXXXXXX…はレコードID)

 

原因がわからないのですが多分 所有者が異なることで発生したのだと思います。
Attachmentを登録した担当者が、同じレコードを更新することはできます。
Attachmentの所有者が同じ取引先のユーザなら更新できるような方法があったら教えてください。

よろしくお願いします。

 

補足
トリガで共有ルールを作ればいいのかなと以下のサイトを参考にしてみましたが、途中で行き詰まりました。
http://blog.flect.co.jp/salesforce/2012/02/
⇒Schema.Item__Shareが解説されていないので、どう設定するのか解らず。

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

Select for update を使用して行ロックをしたいと思い、その際のテストコードの書き方に苦慮しております。

 

ネットを検索したところ、http://www.tgerm.com/2011/04/visualizing-record-locking-in-soql-ie.html に良さそうなサンプルがあり、試してみたのですが結果は予想と異なるものでした。

以下、テストしたコードです。

 

public class TestRecordLocking {

 

  testmethod public static void testLocking() {
    Account accoutU1 = new Account(Name = 'Abhinav Gupta');
    insert accoutU1;
    accoutU1 = [Select Id, Name, Website from Account where Id =:accoutU1.id for update];
    accoutU1.website = 'www.salesforce.com';

    User u2 = [Select Id from user where id !=:UserInfo.getUserId() limit 1];
    System.runAs(u2) {
      Account accountU2 = [Select Id, Name, Website from Account where Id =:accoutU1.id ];  
      accountU2.WebSite = 'www.yahoo.com';
      update accountU2;
      system.debug('####accountU2####'+accountU2.WebSite);     //#1
    }
    update accoutU1;
    system.debug('####accountU1####'+accoutU1.website);          //#2
  }


  testmethod public static void testLocking2() {

    Account accoutU1 = new Account(Name = 'Abhinav Gupta');
    insert accoutU1;
    accoutU1 = [Select Id, Name, Website from Account where Id =:accoutU1.id for update];
    accoutU1.website = 'www.salesforce.com';

    User u2 = [Select Id from user where id !=:UserInfo.getUserId() limit 1];
    System.runAs(u2) {
      Account accountU2 = [Select Id, Name, Website from Account where Id =:accoutU1.id ];
      delete accountU2;      //#3
    }
    update accoutU1;         //#4
  }
}

 

testLocking()では、行ロックをかけたレコードに、runAs()で別のユーザーとしてアップデートをかけています。

私は、アップデート時に例外が発生すると思ったのですが、普通にアップデートがかかり(#1)、その後元の

ユーザーで上書きアップデート(#2)されています。

 

また、testLocking2()では、別のユーザーでdeleteさせてみたのですが、これも#3の部分でレコードが削除され、

#4で例外が発生します。

 

これは、Select for update が効いていないということなのでしょうか?あるいはrunAsの使い方に問題が

あるのでしょうか?

 

どうか、ご教授願います。宜しくお願いします。