2

現在、カスタムオブジェクトがあります。このオブジェクトをmyObjectと呼びましょう。

オブジェクトには次のフィールドがあります。

  • 作成-テキスト(20)
  • モデル-テキスト(20)
  • StartTime-日付/時刻
  • 終了時刻-日付/時刻
  • 国-テキスト(20)
  • objContact-ルックアップ(連絡先)*

*注:連絡先は、挿入前トリガーから設定されます。

要件は、ユーザーが複数のmyObjectを作成し、それぞれに画像を添付できるようにするアプリケーションを作成することです(最大1MB)。

注:リッチテキスト領域フィールドを使用して画像をmyObjectにプッシュしましたが、これは32kbに制限されたアプローチです。

次のコードでSalesforceSoapAPI(C#)を使用しています(わかりやすくするためにインラインメソッドを使用しています)。

public void Create(List<Cars> myCars)
{
    SforceService sforceService = new SforceService() { Timeout = 60000 };
    LoginResult result = sforceService.login(USERNAME, PASSWORD);
    if (result.passwordExpired != true)
    {
        String authEndPoint = sforceService.Url;
        sforceService.Url = "result.serverUrl;
        sforceService.SessionHeaderValue = new SessionHeader();
        sforceService.SessionHeaderValue.sessionId = result.sessionId;

        sObject[] myObjectArr = new sObject[myObjects.Count * 2];
        for (int i = 0, carCount = myCars.Count; i < carCount; i++)
        {        
            myObject__c myObj = new myObject__c();
            myObj.Make__c = myCars[i].make;
            myObj.Model__c = myCars[i].model;
            myObj.StartTime__c = myCars[i].startTime;
            myObj.EndTime__c = myCars[i].endTime;
            myObj.Country__c = myCars[i].country;

            //Convert Image to Byte[]:
            byte[] imageBytes = new byte[];
            using (MemoryStream ms = new MemoryStream())
            {
                myCars[i].Image.Save(ms, ImageFormat.Jpeg);
                imageBytes = ms.ToArray();
            }

            Attachment myAttachment = new Attachment();
            myAttachment.Body = imageBytes;
            myAttachment.ContentType = "image/jpeg";
            myAttachment.Name = "FileName";
            myAttachment.ParentId = myObj.id;

            myObjectArr[i] = myObj;
            myObjectArr[i + myCars.Count] = myAttachment;
        }
        sforceService.create(myObjectArr);
    }
}

コードは適切に実行され、関数に渡されたCarオブジェクトごとに新しいmyObjectが作成されます。ただし、一時的なmyObjはまだSFDCに挿入されていないため、IDはありません。myAttachment.ParentIdが割り当てられると、myObj.idはnullになります。

関数はmyCarsリストの1〜2000個のオブジェクトで呼び出されるため、バルク化されていないアプローチは受け入れられません。

挿入操作中に添付ファイルのParentIdフィールドをmyObjSFIDに設定する方法はありますか?

私が考えることができる唯一のアプローチは、各MyObjに一時ID(datetime + GUID)を作成し、Attachment.Nameをその一時ID(datetime + GUID)に設定し、挿入後に2つを関連付けるトリガーを作成することです。これを解決するためのより良い方法はありますか?

前もって感謝します。

編集:これがうまくいったものです:

public void Create(List<Cars> myCars)
{
    SforceService sforceService = new SforceService() { Timeout = 60000 };
    LoginResult result = sforceService.login(USERNAME, PASSWORD);
    if (result.passwordExpired != true)
    {
        String authEndPoint = sforceService.Url;
        sforceService.Url = "result.serverUrl;
        sforceService.SessionHeaderValue = new SessionHeader();
        sforceService.SessionHeaderValue.sessionId = result.sessionId;

        List<string> GUIDList = new List<string>();
        List<Attachment> AttachmentList = new List<Attachment>();

        sObject[] myObjectArr = new sObject[myObjects.Count];
        sObject[] myObjectArr_Attachments = new sObject[myObjects.Count];

        for (int i = 0, carCount = myCars.Count; i < carCount; i++)
        {   
            string tempGUID = Guid.NewGuid();
            GUIDList.add(tempGUID);

            myObject__c myObj = new myObject__c();
            myObj.Make__c = myCars[i].make;
            myObj.Model__c = myCars[i].model;
            myObj.StartTime__c = myCars[i].startTime;
            myObj.EndTime__c = myCars[i].endTime;
            myObj.Country__c = myCars[i].country;
            myObj.GUID__c = tempGUID;

            //Convert Image to Byte[]:
            byte[] imageBytes = new byte[];
            using (MemoryStream ms = new MemoryStream())
            {
                myCars[i].Image.Save(ms, ImageFormat.Jpeg);
                imageBytes = ms.ToArray();
            }

            Attachment myAttachment = new Attachment();
            myAttachment.Body = imageBytes;
            myAttachment.ContentType = "image/jpeg";
            myAttachment.Name = tempGUID;
            AttachmentList.add(myAttachment);

            myObjectArr[i] = myObj;
        }

        sforceService.create(myObjectArr);

        string GUIDListString = "( ";
        for ( int i = 0, listLen = GUIDList.Count; i < listLen; i++)
        {
            if (i < GUIDList.Count - 1)
            {
                 GUIDListString += string.Format("'{0}', ", GUIDList[i]);
            }
            else
            {
                 GUIDListString += string.Format("'{0}')", GUIDList[i]);
            }
        }


        string queryString = String.Format("SELECT id, GUID__c FROM myObj__c WHERE GUID__c IN {0}", GUIDListString);
        QueryResult myObjResult = sforceService.query(queryString);
        sObject[] sObjQuery = myObjResult.records;

        List<myObject__c> myObjs = new List<myObject__c>();

        foreach(sObject sObj in sObjQuery)
        {
             myObjs.Add((myObject__c)sObj);
        }

        for (int i = 0, attLen = AttachmentList.Count; i < attLen; i++)
        {
            foreach (myObject__c obj in myObjs)
            {
                if(AttachmentList[i].Name == obj.GUID__c)
                {
                    AttachmentList[i].ParentId = obj.Id;
                    sObjArr_Attachments[i] = AttachmentList[i];
                }
            }
        }
        SaveResult[] sr_att = sforceService.create(sObjArr_Attachments);
    }
}
4

1 に答える 1

2

1回の呼び出しではできませんが、車のリストを挿入する2つだけに分割できます。その結果が得られたら、2回目の呼び出しを行って添付ファイルのリストを挿入できます。

于 2012-08-22T20:28:25.523 に答える