0

apex を使用して Salesforce に同期を実装したいと考えています。

私の要件は、将来のメソッドからフィールドを更新する必要があるということです。

データベースに Counter_ c という名前のフィールドがあり、そのメソッドが 3 つの将来のメソッドを呼び出すメソッドを呼び出しています。これらの将来のメソッドは、カウンター_c の値を 1 ずつインクリメントしようとしますが、フィールドは更新されません。

これが私のコードです:

public void generateReports() {

  ReportHistory__c repHst = new ReportHistory__c();
  repHst.Counter__c = 0;
  insert repHst;

  generateReport1(repHst.Id);
  generateReport2(repHst.Id);
  generateReport3(repHst.Id);

}

@future
public static void generateReport1(Id id) {

List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
     if(!lstRep.isEmpty()) {
        ++lstRep[0].Counter__c;
     }
     update lstRep;
}


@future
public static void generateReport2(Id id) {

List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
     if(!lstRep.isEmpty()) {
        ++lstRep[0].Counter__c;
     }
     update lstRep;
}


@future
public static void generateReport3(Id id) {

List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
     if(!lstRep.isEmpty()) {
        ++lstRep[0].Counter__c;
     }
     update lstRep;
}

上記のコードを実行した後、Counter__c を 3 にする必要があります。しかし、まだ 0 または 1 の場合もあります。

今後のすべての呼び出しで Counter__c の値を 1 ずつ更新するように将来の呼び出しを制御できる方法があれば、助けてください。

ありがとう、ヴィベク

4

1 に答える 1

1

あなたのコード例から、lstRep.isEmpty()チェックに否定が欠けているようです。

!例if 条件に a を追加します。

@future
public static void generateReport1(Id id) {

    List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
    if(!lstRep.isEmpty()) {
        lstRep[0].Counter__c++;
    }
    update lstRep;
}

今後のメソッドがキューから取り出され、異なるアプリケーション サーバーによって並行して処理される可能性もあります。この場合、同時実行性の問題があります。Force.com の非同期処理を読んでください。FOR UPDATEキーワードを SOQL クエリに追加してみることができますが、これにより、将来のメソッドの一部がタイムアウトになる可能性があります。

于 2013-03-17T02:40:12.620 に答える