• マスターキートン!
  • NEWBIE
  • 0 Points
  • Member since 2014

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 8
    Questions
  • 10
    Replies
カスタムオブジェクトAにおいて、誰かが変更したら、ホーム画面のフィード画面に
変更を表示したく、フィード追跡を有効化しました。

そうしたところ、自分が編集したレコードは表示されてきますが、
他人がレコードを編集しても、表示されてきませんでした。

原因は、レコードをフォローしていからだと思うのですが、
カスタムオブジェクトAのレコード全て、chatter追跡で監視対象とした項目について更新があったら、
各ユーザのホーム画面のフィードに表示したいのですが、可能でしょうか。


 
javascript remote actionを呼び出して、ファイルアップロード(attachementオブジェクトに登録)を実装しているところで、
1M程度くらいから、input too longでアップロードができなくなります。(remote actionの仕様のため)

1M以上のファイルをあげる為に、以下を参考に、
1MのファイルをバイナリからStringにして何分割かにしてそれを分割した数リクエストして、
DB保存時に前回の値をDBからひっぱってきて、バイナリにして保存という処理を書いたのですが、

https://forceadventure.wordpress.com/2013/07/19/uploading-attachments-to-salesforce-using-javascript-remoting/


1回目のリクエストでinsert後のattachment.id を
2回目に指定して、getAttachment しようとしたところ、
データが取得できません。

なぜ、1回目でinsertした値が読み取れないのでしょうか。。

◯VF(js)
function uploadAttachment(fileId) {
                    var attachmentBody = '';
                    if (fileSize <= positionIndex + chunkSize) {
                        attachmentBody = attachment.substring(positionIndex);
                        doneUploading = true;
                    } else {
                        attachmentBody = attachment.substring(positionIndex, positionIndex + chunkSize);
                    }

                    var apexWrapper = {
                        id: fileId,
                        parentId: "{!parent.Id}",
                        fileName: fileName,
                        fileSize: fileSize,
                        uploadFile: attachmentBody
                    };
                    doSaveByApex(apexWrapper); // →call remote action
                }


◯cls
// 添付ファイルアップサート
            Attachment attachment = JSRemotingFileUploadHelper.getAttachment(wrapper.id);
System.debug('attachment = ' + attachment);
            String newBody = '';
            if (attachment.Body != null) {
                newBody = EncodingUtil.base64Encode(attachment.Body);
            }
            newBody += wrapper.uploadFile;
            attachment.Body = EncodingUtil.base64Decode(newBody);

            if (String.isBlank(wrapper.id)) {
                attachment.Name = wrapper.fileName;
                attachment.ParentId = wrapper.parentId;
                attachment.ContentType = helper.getContentType(wrapper.fileName);
            }
            upsert attachment;
 
global static Attachment getAttachment(String id) {
        List<Attachment> attachments = [
                SELECT
                        Id,
                        Body
                FROM
                        Attachment
                WHERE
                        Id = :id
        ];

        if (attachments.isEmpty()) {
            Attachment a = new Attachment();
            return a;
        } else {
            return attachments[0];
        }
    }






 
visualforce画面でプルダウンを選択した直後、選択された値「hoge」をGETリクエストのaidパラメータにのせて、
例えば、https://salesforce.com/apex/abc?aid=hoge というような感じのリクエストを作りたいです。

すみませんが、どのようにしたらよいか検討つかないのですが、
どのようにしたらよいでしょうか。

ちなみに、以下のような感じだと、ajaxになってしまうためか、urlがかわりません。
<apex:selectList value="{!aId}" size="1">
                                    <apex:selectOptions value="{!aList}"/>
                                    <apex:actionSupport action="{!change}" event="onchange"/>
                                </apex:selectList>
以下のようなgetで受け取れるようにしてパーマネントリンク的なページをつくりたいです。
https://salesforce.com/apex/abc?aid=hoge

何卒よろしくお願い致します。
@IsTest
public with sharing class TestDataHelper {

    public static SObject createAccount(Map<String, Object> parameterValues) {
        Map<String, Object> defaultValues = new Map<String, Object>{
                'name' => 'Test Account'
        };

        Account a = new Account(map_merge(defaultValues, dataValues));  ←ここでSobjectのパラメータとしてMapわたせませんか?
        insert a;
        return a;
    }

    private static Map<String, Object> map_merge(Map<String, Object> data1, Map<String, Object> data2) {
        Map<String, String> result = data1;
        for(String key : data2.keySet()) {
            result.put(key, data2.get(key));
        }
        
        return result;
    }

}


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

TestDataをつくるクラスをつくっているのですが、

Account a = new Account(); ←ここでSobjectのパラメータとしてMapわたせませんでしょうか。

 
salesforceにあるデータを外部javaからoAuth等で取得する際についてですが、20万件程度を取得するとことは可能でしょうか。
 
お世話になっております。

Sandbox環境から本番環境へカスタムオブジェクトとその項目全てをリリースしたいと思います。

しかしながら、すでに、そのカスタムオブジェクトは本番環境に存在していて、
かつ、Apexからの参照もある状態です。(このApexを消さないとカスタムオブジェクトが消せない)

この状況にて、Sandboxにある、カスタムオブジェクトの内容で、
本番の同じカスタムオブジェクト置き換えたいのですが(データ消えてよいです)
(置き換え対象となるカスタムオブジェクトはひとつです。)


このような場合、おそらく、変更セットによるリリースで

カスタムオブジェクトとその項目を選んでリリースすると、

置き換えが行われるのではなく、オブジェクトが追加の形で設定されるような気がしましたが、
いかがでしょうか。別Sandbox環境がテストできない状況のため、教えて頂ければ幸いです。




 
大量レコードを扱うにあたり、apex batchを実装しています。

その際、Aというオブジェクトから取得したデータをBに突っ込むといったケースの実装につきまして、

まずはじめに、startメソッドでAのデータを取得したのち
executeメソッドにて、さらにAのキーを含むBのデータを取得して、
AのデータとBのデータをforで回しながら、
キーが一致したらアップデートするというような処理を行うとした場合、
Bのデータがexecuteでデータを取得しているので、ガバナ制限に引っかかるといったことは
あるでしょうか。

上記が実装できない場合は、以下のように実装しようかと考えています。

Aのデータを取得して、finishメソッドで別のバッチを起動し、その際、AのscopeをBに渡す。


```
   global List<sObject> scopeA;

   global void execute(Database.BatchableContext BC, List<sObject> scope) {
        scopeA = scope;
   } 
    global void finish(Database.BatchableContext BC) {
        BatchB batchB = new BatchB(scopeA);
        Database.ExecuteBatch(batchB);
    }
```

以下にて、ロケータでAを取得しAを更新するのは理解していますが、
http://tyoshikawa1106.hatenablog.com/entry/2015/02/15/182505
Aを取得した結果をBにいれる場合について
最適な方法を教えて頂ければ幸いです。









 
1対1でリレーション作成は、主従関係または参照関係で設定すると思いますが、
其の場合、1対多のレコードができてしまうかと思います。
1対1に制限するには、どのような方法ができますでしょうか。
トリガーで、1対1以上を登録したときに、エラーを出すという方法は考えられますが、
その場合、データ保存時となるため、データを記載していた場合、無駄になってしまうかと思うので
トリガーでない方法で何かあるでしょうか
 
JavaScriptのコード内でSOQLのように、項目の値を取得することは可能でしょうか?

JavaScriptのコード内で下記を行いたいです。
①商談IDの値で検索→商談の項目Aの値を取得
②IF文で商談の項目Aの値により、アクションを分ける

可能な方法あればご教示ください。
よろしくお願いします。
お世話になっております。
現在案件(商談)オブジェクトの「提案書作成」カスタムボタンで、PDF作成->添付ファイルの処理を行っております。
コミュニティユーザ以外では動作に問題は無いのですが、コミュニティユーザのみ以下のエラーが発生し、添付が行えません。
「エラー: Visualforce ページのダウンロード中にエラーが発生しました。 
連絡を取る必要がある場合は、メールを送信してください。」

コミュニティユーザでも、添付を行なわずにブラウザにPDFを出力する事は可能です。
そのブラウザに出力したPDFファイルをローカルに保存し、そのデータに添付する事も可能です。

        Attachment attObj = new Attachment();
        attObj.name = this.pdfName+'.pdf';
        try{attObj.body = pageRef.getContentAsPDF();}
        catch (VisualforceException e) {
            attObj.body = Blob.valueOf('Some Text');
        }
        attObj.ParentId = parentId ;
        attObj.contenttype = 'PDF';

        insert attObj;

上記コードの「pageRef.getContentAsPDF();」の行で、上記エラーが発生してしまいます。

設定→コミュニティを管理⇒のコミュニティの部分にForce.comリンク⇒コミュニティのサイト設定画面でも使用できるVisualforce ページを指定できるように設定しました。
なお、プロファイルでApex クラスのアクセス権を設定しましたので、原因は特定できませんでした。

コミュニティユーザでのカスタムボタンからのPDF添付作成すること可能でしょうか?可能の場合、作成方法をご教示ください。
javascript remote actionを呼び出して、ファイルアップロード(attachementオブジェクトに登録)を実装しているところで、
1M程度くらいから、input too longでアップロードができなくなります。(remote actionの仕様のため)

1M以上のファイルをあげる為に、以下を参考に、
1MのファイルをバイナリからStringにして何分割かにしてそれを分割した数リクエストして、
DB保存時に前回の値をDBからひっぱってきて、バイナリにして保存という処理を書いたのですが、

https://forceadventure.wordpress.com/2013/07/19/uploading-attachments-to-salesforce-using-javascript-remoting/


1回目のリクエストでinsert後のattachment.id を
2回目に指定して、getAttachment しようとしたところ、
データが取得できません。

なぜ、1回目でinsertした値が読み取れないのでしょうか。。

◯VF(js)
function uploadAttachment(fileId) {
                    var attachmentBody = '';
                    if (fileSize <= positionIndex + chunkSize) {
                        attachmentBody = attachment.substring(positionIndex);
                        doneUploading = true;
                    } else {
                        attachmentBody = attachment.substring(positionIndex, positionIndex + chunkSize);
                    }

                    var apexWrapper = {
                        id: fileId,
                        parentId: "{!parent.Id}",
                        fileName: fileName,
                        fileSize: fileSize,
                        uploadFile: attachmentBody
                    };
                    doSaveByApex(apexWrapper); // →call remote action
                }


◯cls
// 添付ファイルアップサート
            Attachment attachment = JSRemotingFileUploadHelper.getAttachment(wrapper.id);
System.debug('attachment = ' + attachment);
            String newBody = '';
            if (attachment.Body != null) {
                newBody = EncodingUtil.base64Encode(attachment.Body);
            }
            newBody += wrapper.uploadFile;
            attachment.Body = EncodingUtil.base64Decode(newBody);

            if (String.isBlank(wrapper.id)) {
                attachment.Name = wrapper.fileName;
                attachment.ParentId = wrapper.parentId;
                attachment.ContentType = helper.getContentType(wrapper.fileName);
            }
            upsert attachment;
 
global static Attachment getAttachment(String id) {
        List<Attachment> attachments = [
                SELECT
                        Id,
                        Body
                FROM
                        Attachment
                WHERE
                        Id = :id
        ];

        if (attachments.isEmpty()) {
            Attachment a = new Attachment();
            return a;
        } else {
            return attachments[0];
        }
    }






 
visualforce画面でプルダウンを選択した直後、選択された値「hoge」をGETリクエストのaidパラメータにのせて、
例えば、https://salesforce.com/apex/abc?aid=hoge というような感じのリクエストを作りたいです。

すみませんが、どのようにしたらよいか検討つかないのですが、
どのようにしたらよいでしょうか。

ちなみに、以下のような感じだと、ajaxになってしまうためか、urlがかわりません。
<apex:selectList value="{!aId}" size="1">
                                    <apex:selectOptions value="{!aList}"/>
                                    <apex:actionSupport action="{!change}" event="onchange"/>
                                </apex:selectList>
以下のようなgetで受け取れるようにしてパーマネントリンク的なページをつくりたいです。
https://salesforce.com/apex/abc?aid=hoge

何卒よろしくお願い致します。
salesforceにあるデータを外部javaからoAuth等で取得する際についてですが、20万件程度を取得するとことは可能でしょうか。
 
お世話になっております。

Sandbox環境から本番環境へカスタムオブジェクトとその項目全てをリリースしたいと思います。

しかしながら、すでに、そのカスタムオブジェクトは本番環境に存在していて、
かつ、Apexからの参照もある状態です。(このApexを消さないとカスタムオブジェクトが消せない)

この状況にて、Sandboxにある、カスタムオブジェクトの内容で、
本番の同じカスタムオブジェクト置き換えたいのですが(データ消えてよいです)
(置き換え対象となるカスタムオブジェクトはひとつです。)


このような場合、おそらく、変更セットによるリリースで

カスタムオブジェクトとその項目を選んでリリースすると、

置き換えが行われるのではなく、オブジェクトが追加の形で設定されるような気がしましたが、
いかがでしょうか。別Sandbox環境がテストできない状況のため、教えて頂ければ幸いです。




 
大量レコードを扱うにあたり、apex batchを実装しています。

その際、Aというオブジェクトから取得したデータをBに突っ込むといったケースの実装につきまして、

まずはじめに、startメソッドでAのデータを取得したのち
executeメソッドにて、さらにAのキーを含むBのデータを取得して、
AのデータとBのデータをforで回しながら、
キーが一致したらアップデートするというような処理を行うとした場合、
Bのデータがexecuteでデータを取得しているので、ガバナ制限に引っかかるといったことは
あるでしょうか。

上記が実装できない場合は、以下のように実装しようかと考えています。

Aのデータを取得して、finishメソッドで別のバッチを起動し、その際、AのscopeをBに渡す。


```
   global List<sObject> scopeA;

   global void execute(Database.BatchableContext BC, List<sObject> scope) {
        scopeA = scope;
   } 
    global void finish(Database.BatchableContext BC) {
        BatchB batchB = new BatchB(scopeA);
        Database.ExecuteBatch(batchB);
    }
```

以下にて、ロケータでAを取得しAを更新するのは理解していますが、
http://tyoshikawa1106.hatenablog.com/entry/2015/02/15/182505
Aを取得した結果をBにいれる場合について
最適な方法を教えて頂ければ幸いです。









 
1対1でリレーション作成は、主従関係または参照関係で設定すると思いますが、
其の場合、1対多のレコードができてしまうかと思います。
1対1に制限するには、どのような方法ができますでしょうか。
トリガーで、1対1以上を登録したときに、エラーを出すという方法は考えられますが、
その場合、データ保存時となるため、データを記載していた場合、無駄になってしまうかと思うので
トリガーでない方法で何かあるでしょうか