Salesforce 技术总结(全是干货,喜欢点个关注会持续跟新)

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

1、获取记录类型

        RecordType Type =  [select Id from RecordType where SobjectType = 'DocumentCompiling' and DeveloperName = 'BidDocumentation' limit 1];        

        Id  recordTypeId = Schema.SObjectType.对象API.getRecordTypeInfosByName().get('记录类型名').getRecordTypeId();//说一下这里,中文环境下记录类型Name才能用,否则会报错

        Schema.getGlobalDescribe().get(objectName).getDescribe().getRecordTypeInfosById().get(strRecordTypeId).getName();  //根据记录类型Id获取记录类型的名字

        Id rid = [select Id from RecordType where DeveloperName = 'Campaign' and sobjecttype ='DocumentCompiling__c'][0].Id;

2、计算两个日期之间的时间差

        TODAY() - DATEVALUE( CreatedDate )日期必须为标准工时

3、完整版REST services demo

        @RestResource(urlMapping='/Cases/*')
global with sharing class CaseManager {
    @HttpGet
    global static Case getCaseById() {
        RestRequest req = RestContext.request;
        String caseId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        Case result = [SELECT CaseNumber, Subject, Status, Origin, Priority
                       FROM Case
                       WHERE Id = :caseId];
        return result;
    }
    /*
HttpGet步骤:
1、创建RestRequest类型的req对象(RestContext.request的返回值类型就是RestRequest)
2、通过req对象的requestURI属性利用字符串检索技术拿到caseId
3、创建Case对象result,并将通过caseId查到的记录赋值给该对象,注意“WHERE Id = :caseId”
4、返回Case对象
*/
    @HttpPost
    global static ID createCase(String subject, String status,
        String origin, String priority) {
        Case thisCase = new Case(
            Subject=subject,
            Status=status,
            Origin=origin,
            Priority=priority);
        insert thisCase;
        return thisCase.Id;
    }
    /*
HttpPost步骤:
1、声明并创建一个Case类型对象thisCase,并为该对象的标准字段赋值
2、将自定义对象插入到Case表中形成一条记录
3、返回一个新纪录的类型为ID的变量Id用于查找新纪录
*/
    @HttpDelete
    global static void deleteCase() {
        RestRequest req = RestContext.request;
        String caseId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
        delete thisCase;
    }
    /*
思路:
要删除某一条记录首先要找到该记录,而方法可以是利用soql语言查找到某一记录的主码,这里是Id(使用rest服务请求获取到uri后从uri中取得的id)
HttpDelete步骤:
1、创建ResrRequest对象req
2、声明caseId,并将rest请求到的uri截取/后的值赋给该变量
3、利用soql语句查到Id = :caseId的那条记录
4、删除该记录
*/
    @HttpPut
    global static ID upsertCase(String id, String subject, String status, String origin, String priority) {
        Case thisCase = new Case(
        Id = id,
            Subject = subject,
            Status = status,
            Origin = origin,
            Priority = priority
        );
        upsert thisCase;
        return thisCase.Id;
    }
    /*
HttpPut步骤:
1、声明并创建一个Case类型对象thisCase,并为该对象定义标准字段赋值
2、将自定义对象插入到Case表中形成一条记录或者更新Id为id的记录
3、返回一个新纪录的类型为ID的变量Id用于查找新纪录
*/
    @HttpPatch
    global static ID updateCaseFields() {
        RestRequest req = RestContext.request;
        String caseId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
        Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(req.requestBody.toString());
        for(String fieldName : params.keySet()) {
            thisCase.put(fieldName, params.get(fieldName));
        }
        update thisCase;
        return thisCase.Id;
    }
    /*
HttpPatch步骤:
1、创建RestRequest类型的req对象(RestContext.request的返回值类型就是RestRequest)
2、通过req对象的requestURI属性利用字符串检索技术拿到caseId
3、创建Case对象,并把按Id查到的Case表记录赋值给该对象
4、将请求获得的requestBody转化成字符串后,反序列化为对象强制转化为Map<String, Object>后赋值给Map变量params
5、遍历对象的key,并在通过id找到的Case对象thisCase中写入key-value
6、更新记录
7、返回记录的id
*/
}
/*
共性:
1、每个对象系统自带一个Id属性,它是系统自动分配的;
2、每一种Http方法均为global static
3、@HttpPut与@HttpPost的区别(upsert,insert)
*/

原文链接:Salesforce Apex 中常用技能总结(持续更新)_salesforce apex 赋值-CSDN博客

4、Apex中在使用类继承时需要使用到的关键字:

extends,super,virtual,override.跟Java继承不同的是,超类必须使用virtual修饰,子类使用override和extends修饰,如果需要重写父类的方法,父类中该方法需要用virtual修饰,子类需要使用override。另外如果子类需要使用超类的域或者方法则需要使用super关键字,注意构造方法的复用不需要用成对的virtual和override关键字修饰超类的构造方法和子类的构造方法。
原文链接:https://blog.csdn.net/Mrs_chens/article/details/103913966

5、MD5加密

String myString = 'Some String';//要加密的数据
Blob myBlob = Blob.valueOf(myString);
Blob md5hash = Crypto.generateDigest('MD5',myBlob);
System.debug(EncodingUtil.convertToHex(md5hash));//显示密文

6、Basic64转码

String uspastr = EncodingUtil.base64Encode(str );
 

7、图片压缩

// 创建 Image 对象
var img = new Image();
img.src = "image.jpg";
img.onload = function () {
  var _this = this;
  var canvas = document.getElementById("canvas");
  canvas.width = img.width;
  canvas.height = img.height;
  var ctx = canvas.getContext("2d");
  ctx.drawImage(_this, 0, 0, img.width, img.height);
  // 使用 toDataURL 方法压缩图像
  var dataUrl = canvas.toDataURL("image/jpeg", 0.5);
  // 使用新的 Data URL 更新图像
};

例子:

var maxSize = 100 * 1024; // 最大文件大小为100KB
var img = new Image();
img.src = "base64 or path";
img.onload = function () {
  const _this = this;
  var canvas = document.createElement("canvas");
  var ctx = canvas.getContext("2d");
  var width = img.width;
  var height = img.height;
  canvas.width = width;
  canvas.height = height;
  ctx.drawImage(_this, 0, 0, width, height);
  var quality = 0.8;
  let newBase64Image, resultBlob;
  do {
    newBase64Image = canvas.toDataURL("image/jpeg", quality);
    resultBlob = base64ToBlob(newBase64Image);
    quality -= 0.1;
  } while (resultBlob.size > maxSize && quality > 0.1);
};
 
// 将base64 转换为Blob
function base64ToBlob(base64) {
  var arr = base64.split(","),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {
    type: mime,
  });
}

原文链接

如何使用js对图像进行压缩_js 图片压缩-CSDN博客

8、获取页面URL

Url.getSalesforceBaseUrl().toExternalForm()   

ApexPages.currentPage().getURL()//获取的完全链接

9、发邮件

public class EmailManager {
    // Public method
    public static void sendMail(String address, String subject, String body) {
        // Create an email message object
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        String[] toAddresses = new String[] {address};
        mail.setToAddresses(toAddresses);
        mail.setSubject(subject);
        mail.setPlainTextBody(body);
        // Pass this email message to the built-in sendEmail method 
        // of the Messaging class
        Messaging.SendEmailResult[] results = Messaging.sendEmail(
                                 new Messaging.SingleEmailMessage[] { mail });
        // Call a helper method to inspect the returned results
        inspectResults(results);
    }
    // Helper method
    private static Boolean inspectResults(Messaging.SendEmailResult[] results) {
        Boolean sendResult = true;
        // sendEmail returns an array of result objects.
        // Iterate through the list to inspect results. 
        // In this class, the methods send only one email, 
        // so we should have only one result.
        for (Messaging.SendEmailResult res : results) {
            if (res.isSuccess()) {
                System.debug('Email sent successfully');
            }
            else {
                sendResult = false;
                System.debug('The following errors occurred: ' + res.getErrors());                 
            }
        }
        return sendResult;
    }
}

10、Apex重置密码

system.setpassword(Userld, newPassword);

11、触发器
 

使用上下文变量
要访问导致触发器触发的记录,请使用上下文变量。例如,Trigger .new包含insert或update触发器中插入的所有记录。
Trigger.old提供在update触发器中更新之前的旧版本sObject,或 delete触发器中已删除的 sObject列表。当插入一条记录或通过API或Apex批量插入记录时,会触发触发器。因此,诸如Trigger.new 之类的上下文变量只能包含一条或多条记录。您可以遍历Trigger.new来获取每个独立的sObject。
 

变量

使用情况

isExecuting

如果 Apex 代码的当前上下文是触发器,而不是 Visualforce 页面、Web 服务或 executeanonymous() API 调用,则返回 true。

isInsert

如果此触发器由于插入操作,并从 Salesforce 用户界面、Apex 或 API 触发,则返回 true

isUpdate

如果此触发器由于更新操作,并从 Salesforce 用户界面、Apex 或 API 触发,则返回 true

isDelete

如果此触发器由于删除操作,并从 Salesforce 用户界面、Apex 或 API 触发,则返回 true

isBefore

如果在保存任何记录之前触发此触发器,则返回 true

isAfter

如果在保存任何记录之后触发此触发器,则返回 true

isUndelete

如果在从回收站恢复记录后触发此触发器,则返回 true。从 Salesforce 用户界面、Apex 或 API 执行取消删除操作后,会出现恢复记录的情况。

new

返回 sObject 记录的新版本列表。

此 sObject 列表仅在 insertupdate 和 undelete 触发器中可用,并且只能在 before 触发器中修改记录。

newMap

ID 到 sObject 新版本记录的映射。

此映射仅在 before updateafter insertafter update 以及 after undelete 触发器中可用。

old

返回 sObject 记录的旧版本列表。

此 sObject 列表仅在 update 和 delete 触发器中可用。

oldMap

ID 到 sObject 旧版本记录的映射。

此映射仅在 update 和 delete 触发器中可用。

operationType

返回与当前操作对应的 System.TriggerOperation 类型的枚举。

System.TriggerOperation 枚举的可能值包括:BEFORE_INSERTBEFORE_UPDATEBEFORE_DELETEAFTER_INSERTAFTER_UPDATEAFTER_DELETE 和 AFTER_UNDELETE。如果您根据不同的触发器类型改变编程逻辑,请考虑使用 switch 语句,该语句具有独特触发器执行枚举状态的不同排列。

size

触发器调用中包含的新旧记录总数。

12、触发器获取old的数据

Trigger.oldMap.get(objectId);

13、JSON数据的序列化与反序列化

比如String filedata = '[{"fileType":"123", "fileName":"Test", "fileContent":"123"}]';

JSON.deserialize( filedata,List<object>.class或者object.class );

=========================================================================

14、Switch语句

String waterLevel = 'empty';
  
//option 1 using a single value
switch on waterLevel {
    when 'empty' {
        System.debug('Fill the tea kettle');
    }
    when 'half' {
        System.debug('Fill the tea kettle');
    }
    when 'full' {
        System.debug('The tea kettle is full');
    }
    when else {
        System.debug('Error!');
    }
}
  
//option 2 using multiple values
switch on waterLevel {
    when 'empty', 'half' { //when waterLevel is either empty or half
        System.debug('Fill the tea kettle');
    }
    when 'full' {
        System.debug('The tea kettle is full');
    }
    when else {
        System.debug('Error!');
    }
}

15、父查子AND子查父

1、
SELECT Name, (SELECT LastName FROM Contacts) FROM Account WHERE Name = 'SFDC Computing'
2、
Contact[] cts = [SELECT Account.Name FROM Contact 
                 WHERE FirstName = 'Carol' AND LastName='Ruiz'];
Contact carol = cts[0];
String acctName = carol.Account.Name;
System.debug('Carol\'s account name is ' + acctName);

//子查父

public class PropertyUtility {
    public static void newListedProperties(){
        List<Property__c> newPropList = [select Name,Broker__r.Email__c,Days_On_Market__c from Property__c   where Days_On_Market__c < 30];
        for(Property__c newProp : newPropList){
            String propEmail = newProp.Name + ':' + newProp.Broker__r.Email__c;
        }
    }
}

16、在 Batch Apex 中使用 Iterable 来定义范围

public class batchClass implements Database.batchable{

   public Iterable start(Database.BatchableContext info){

       return new CustomAccountIterable();

   }     

   public void execute(Database.BatchableContext info, List<Account> scope){

       List<Account> accsToUpdate = new List<Account>();

       for(Account a : scope){

           a.Name = 'true';

           a.NumberOfEmployees = 70;

           accsToUpdate.add(a);

       }

       update accsToUpdate;

   }     

   public void finish(Database.BatchableContext info){     

   }

}

17、upsert语法

upsert语法
upsert s0bject l s0bject[]
upsert s0bject / s0bject[] field
可选字段是字段令牌。例如,要指定MyExternalID字段,语句是:
upsert sobjectList Account.Fields.MyExternalld;
upsert 使用 sObject记录的主键(ID)、Lookup字段或外部ID字段来确定是应该创建新记录还是更新已有记录:·如果主键不匹配,则创建新对象记录。
·如果主键匹配一次,则更新已有对象记录。
·如果主键匹配多次,则会产生错误,并且不插入也不更新对象记录。
(其实就是有此记录就更新,如果没有会自动插入)

18、数据库方法

Database.insert()

Database.update()

Database.upsert()

Database.delete()

Database.undelete()

Database.merge()

upsert 操作返回 Database.UpsertResult 对象,delete 操作返回 Database.DeleteResult 对象。

与DML语句不同,数据库方法有一个可选的allOrNone参数,它允许您指定操作是否可以部分成功。当该参数设置为false时,如果部分记录集发生错误,将提交成功的记录,并为失败的记录返回错误。另外,部分成功选项不会抛出异常。

比如:Database.SaveResult[ ] results = Database.insert(recordList,false);
数据库方法返回包含每个记录的成功或失败信息的结果对象。
 

实例:

// Create a list of contacts

List<Contact> conList = new List<Contact> {

        new Contact(FirstName='Joe',LastName='Smith',Department='Finance'),

        new Contact(FirstName='Kathy',LastName='Smith',Department='Technology'),

        new Contact(FirstName='Caroline',LastName='Roth',Department='Finance'),

        new Contact()};

// Bulk insert all contacts with one DML call

Database.SaveResult[] srList = Database.insert(conList, false);

// Iterate through each returned result

for (Database.SaveResult sr : srList) {

    if (sr.isSuccess()) {

        // Operation was successful, so get the ID of the record that was processed

        System.debug('Successfully inserted contact. Contact ID: ' + sr.getId());

    } else {

        // Operation failed, so get all errors

        for(Database.Error err : sr.getErrors()) {

            System.debug('The following error has occurred.');

            System.debug(err.getStatusCode() + ': ' + err.getMessage());

            System.debug('Contact fields that affected this error: ' + err.getFields());

 }

    }

}

19、在Apex中使用静态资源加载jquery的代码:

<apex:page>
    <apex:includeScript value="{!$Resource.jQuery}"/>
 
    <script type="text/javascript">
            jQuery.noConflict();
            JQuery(document).ready(function(){
                jQuery("#message").html("Hello!");
            });
    </script>
 
    <h1 id="message"></h1>
</apex:page>

原文链接Salesforce零碎知识点(一)-CSDN博客

20、用户简档的查询

String profileName = [SELECT Profile.Name FROM WHERE Id = :userId].Profile.Name];

21、Apexpage的用法

ApexPages.currentPage().getParameters().get('xxx');获取页面参数对应的值

ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, Label.ERR004));

PageReference page = new PageReference(url);可以作为方法返回值,进行页面重定向

22、Apex中的自定义页面提示

对象.addError('');

ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '责任人字段必填'));

23、获取选项列表的值

List<String> listHaveAcquiredLsit = new List<String>();
        List<String> designInformationList = new List<String>();
        Integer i = 0;
        Schema.DescribeSObjectResult dsr = 对象名.sObjectType.getDescribe();
        Map<String, Schema.SObjectField> field_map = dsr.fields.getMap();
        List<Schema.PicklistEntry> HaveAcquiredValues = field_map.get('字段名').getDescribe().getPickListValues();
        List<Schema.PicklistEntry> DesignInfoValues = field_map.get('字段名').getDescribe().getPickListValues();
        for (Schema.PicklistEntry a : HaveAcquiredValues) {
            listHaveAcquiredLsit.add(a.getValue());
        }
        for (Schema.PicklistEntry a : DesignInfoValues) {
            designInformationList.add(a.getValue());
        }


public static Map<String,String> getPickList(String objectName,String fieldname){
        Map<String,String> picklistMap = new Map<String,String>();
        Schema.SObjectType targetType = Schema.getGlobalDescribe().get(objectName);//From the Object Api name retrieving the SObject
        Sobject Object_name = targetType.newSObject();
        Schema.sObjectType sobject_type = Object_name.getSObjectType(); //grab the sobject that was passed
        Schema.DescribeSObjectResult sobject_describe = sobject_type.getDescribe(); //describe the sobject
        Map<String, Schema.SObjectField> field_map = sobject_describe.fields.getMap(); //get a map of fields for the passed sobject
        List<Schema.PicklistEntry> pick_list_values = field_map.get(fieldname).getDescribe().getPickListValues(); //grab the list of picklist values for the passed field on the sobject
        for (Schema.PicklistEntry a : pick_list_values) { //for all values in the picklist list
          picklistMap.put(a.getValue(), a.getLabel());
       }
       return picklistMap;
    }
链接:https://blog.csdn.net/trjays/article/details/119531160

24、字符串去空行


opp.Field4YZSQ__c = opp.Field4YZSQ__c.replaceAll('((\r\n)|\n)[\\s\t ]*(\\1)+', '$1').replaceAll('^((\r\n)|\n)', '');

replaceAll(旧值,新值);

25、当前用户的ID与获取页面的链接

UserInfo.getId();

Url.getSalesforceBaseUrl().toExternalForm()     //基础链接

ApexPages.currentPage().getURL()      //完全链接

26、通过外部网址下载附件保存到salesforce

Http h = new Http();
// Instantiate a new HTTP request, specify the method (GET) as well as the endpoint
HttpRequest req = new HttpRequest();
req.setEndpoint('YOUR_URL');
req.setTimeout(60000);//sets maximum timeout
req.setMethod('GET');
// Send the request, and return a response
HttpResponse res = h.send(req);
Blob body = res.getBodyAsBlob();
//then you can attach this body wherever you want
Attachment att = new Attachment(Name = 'SET A NAME', Body = body, ContentType = 'SET A VALID CONTENT TYPE', ParentId='PARENT_OBJ_ID');
insert att;
来自 Discussion Forums Migration FAQs | Salesforce Developers

27、文件下载

public class ImportOrderItemController
{
    public class PrboObj
    {
        public Boolean isCheck {get; set; }
        public Pricebook2 prbo {get; set; }
    }
    public Blob csvFileBody {get; set; } //csv文件内容
    public string csvAsString {get; set; }
    public String[] csvFileLines {get; set; } //存储csv中每行数据
    public String downurl {get; set; }
    public String orderId; //订单Id
    public class OritList
    {
        public String productCode {get; set; } //产品代码
        public String productname {get; set; } //产品名称
        public String callGues {get; set; }
        public OrderItem orit {get; set; }
    }
    public List < OritList > orderItemList {get; set; } //订单明细
    public List < PrboObj > prboList {get; set; }
    public String prboID = '';
    public String currencyIsoCode = '';
    public ImportOrderItemController()
    {
        prboList = new List < PrboObj > ();
        csvFileLines = new String[]
        {};
        orderItemList = New List < OritList > ();
        orderId = system.currentPageReference().getParameters().get('id');
        Order ord = [select Id, Pricebook2Id, Pricebook2.CurrencyIsoCode, CurrencyIsoCode from Order where Id = : orderId][0];
        if (ord.Pricebook2Id != null)
        {
            prboID = ord.Pricebook2Id;
        }
        currencyIsoCode = ord.CurrencyIsoCode;
        String query = 'select Id,name,Description,IsStandard, CurrencyIsoCode from Pricebook2  ';
        if (!String.isEmpty(prboID))
        {
            query +=  ' where Id =\'' + prboID + '\' ';
        }
        query += ' order by name limit 5000 ';
        system.debug(query);
        List < Pricebook2 > prboList_sele = Database.query(query);
        for (Pricebook2 prbo: prboList_sele)
        {
            PrboObj prob = new PrboObj();
            prob.isCheck = false;
            if (!String.isEmpty(prboID)) prob.isCheck = true;
            prob.prbo = prbo;
            prboList.add(prob);
        }
        downurl = Url.getSalesforceBaseUrl().toExternalForm() + '/apex/DownloadOrderItemTemplate?orId=' + orderId;
        System.debug(downurl);
    }
    //获取csv中的数据,封装成订单明细对象
    public void importCSVFile()
    {
        //先选择价格手册,如果没有选择则报错
        Set < String > strset_prbo = new Set < String > ();
        for (PrboObj prbo: prboList)
        {
            if (prbo.isCheck == true)
            {
                strset_prbo.add(prbo.prbo.Id);
                prboID = prbo.prbo.Id;
            }
        }
        if (strset_prbo.size() == 0)
        {
            ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '请先选择价格手册');
            ApexPages.addMessage(errorMessage);
            return;
        }
        if (strset_prbo.size() != 1)
        {
            ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '只能选择一个价格手册');
            ApexPages.addMessage(errorMessage);
            return;
        }
        //选择价格手册结束
        try
        {
            orderItemList = New List < OritList > ();
            //调用方法解析分级
            csvAsString = blobToString(csvFileBody, 'GBK');
            System.debug(csvAsString);
            csvFileLines = csvAsString.split('\n');
            System.debug('订单记录Id:' + system.currentPageReference().getParameters().get('id'));
            if(csvFileLines.size() < 2)
            {
                ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '没有需要导入的记录');
                ApexPages.addMessage(errorMessage);
                return;
            }
            //查找产品
            Set < String > strSet_produ = new Set < String > ();
            for (Integer i = 1; i < csvFileLines.size(); i++)
            {
                string[] csvRecordData = csvFileLines[i].split(',');
                Integer cssize = csvRecordData.size() - 1;
                if (cssize >= 3) strSet_produ.add(csvRecordData[3]);
                if (cssize >= 4) strSet_produ.add(csvRecordData[4]);
                strSet_produ.add(csvRecordData[0]);
            }
            //查询产品
             List < PricebookEntry > prenList = new List < PricebookEntry > ([
                    select Id, Product2Id, Product2.Name,Product2.ProductCode, UnitPrice, CurrencyIsoCode,Pricebook2Id from PricebookEntry
                    where Pricebook2Id in : strset_prbo and CurrencyIsoCode = : currencyIsoCode and (Product2.Name in: strSet_produ or Product2.ProductCode in: strSet_produ)]);
            Map < String, PricebookEntry > strMap_id = new Map < String, PricebookEntry > ();
            /*List < Product2 > prduList_sele = new List < Product2 > ([
                select Id, name, ProductCode from Product2 where name in : strSet_produ or ProductCode in : strSet_produ]);*/
            for (PricebookEntry prdu: prenList)
            {
                strMap_id.put(prdu.Product2Id, prdu);
                if (prdu.Product2.Name != null)
                {
                    strMap_id.put(prdu.Product2.Name, prdu);
                }
                if (prdu.Product2.ProductCode != null)
                {
                    strMap_id.put(prdu.Product2.ProductCode, prdu);
                }
            }
            //
            List < OrderItem > oritlist_sele = new List < OrderItem > ([select
                Id, Productline__c, Specification__c, Product2Id, Quantity,
                SubtotalF__c, Call_Guest__c, Description, Product_Name__c, UnitPrice2__c,
                OrderItemNumber, OrderId,PricebookEntryId
                from orderItem where id in : strSet_produ]);
            if (!oritlist_sele.isEmpty() && oritlist_sele[0].OrderId != orderId)
            {
                ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '订单明细关联的订单与本订单不符合');
                ApexPages.addMessage(errorMessage);
                return;
            }
            Map < String, OrderItem > strobjmap_orit = new Map < String, OrderItem > ();
            for (OrderItem orit: oritlist_sele)
            {
                strobjmap_orit.put(orit.Id, orit);
            }
            //构建订单明细
            Set < String > strset_produId = new Set < String > ();
            for (Integer i = 1; i < csvFileLines.size(); i++)
            {
                string[] csvRecordData = csvFileLines[i].split(',');
                Integer cssize = csvRecordData.size() - 1;
                System.debug(csvRecordData.size() + '===' + 'csvRecordData' + csvRecordData);
                //
                OritList orli = new OritList();
                if (cssize >= 3) orli.productCode = csvRecordData[3]; //产品代码
                if (cssize >= 8) orli.callGues = csvRecordData[8]; //客供否
                orli.productname = csvRecordData[4]; //品名
                OrderItem orderItem = new OrderItem();
                if (!string.isEmpty(csvRecordData[0]))
                {
                    orderItem = strobjmap_orit.get(csvRecordData[0]);
                    System.debug(orderItem);
                }
                else
                {
                    orderItem.OrderId = orderId;
                }
                //价格手册和产品赋值
                if (string.isEmpty(csvRecordData[1]))
                {
                    PricebookEntry pren = strMap_id.get(csvRecordData[3]) == null ? strMap_id.get(csvRecordData[4]) : strMap_id.get(csvRecordData[3]);//获取价格手册条目
                    if (pren == null) 
                    {
                        ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '第' + i + '行中的产品不在该价格手册下');
                        ApexPages.addMessage(errorMessage);
                        return;
                    }
                    String proId = strMap_id.get(csvRecordData[3]) == null ? strMap_id.get(csvRecordData[4]).Id : strMap_id.get(csvRecordData[3]).Id; //获取产品Id
                    orderItem.Product2Id = pren.Product2Id; //产品
                    orderItem.Product_Name__c = pren.Product2.Name;
                    orderItem.PricebookEntryId = pren.Id;
                    orderItem.UnitPrice2__c = pren.UnitPrice;
                    strset_produId.add(proId);
                }
                System.debug(csvRecordData[2]);
                if (cssize >= 2) orderItem.Productline__c = csvRecordData[2]; //产品项次
                System.debug(orderItem.Productline__c);
                if (cssize >= 5) orderItem.Specification__c = csvRecordData[5]; //规格型号
                if (cssize >= 6 && !String.isEmpty(csvRecordData[6])) orderItem.Quantity = Decimal.valueOf(csvRecordData[6]); //数量/面积 
                if (cssize >= 7 && !String.isEmpty(csvRecordData[7])) orderItem.SubtotalF__c = Decimal.valueOf(csvRecordData[7]); //卖价总计
                if (cssize >= 8) orderItem.Call_Guest__c = csvRecordData[8] == '是' ? true : false; //客供否      
                if (cssize >= 9) orderItem.Description = csvRecordData[9]; //行备注  
                orderItem.UnitPrice = 0;
                orli.orit = orderItem;
                orderItemList.add(orli);
            }
            /*List < PricebookEntry > prenList = new List < PricebookEntry > ([
                    select Id, Product2Id, Product2.Name, UnitPrice, CurrencyIsoCode from PricebookEntry
                    where Product2Id in : strset_produId and Pricebook2Id in : strset_prbo and CurrencyIsoCode = : currencyIsoCode]);
            Map < String, PricebookEntry > strmap_propri = new Map < String, PricebookEntry > ();
            for (PricebookEntry pren: prenList)
            {
                strmap_propri.put(pren.Product2Id, pren);
            }
            for (OritList oritli: orderItemList)
            {
                OrderItem orderItem = oritli.orit;
                if (orderItem.Id == null)
                {
                    System.debug(strmap_propri.get(orderItem.Product2Id));
                    if(strmap_propri.get(orderItem.Product2Id) != null)
                    {
                        orderItem.PricebookEntryId = strmap_propri.get(orderItem.Product2Id).id;
                        orderItem.UnitPrice2__c = strmap_propri.get(orderItem.Product2Id).UnitPrice;
                    }
                    orderItem.OrderId = orderId;
                }
            }*/
            csvFileBody = null;
        }
        catch (Exception e)
        {
            if(e.getMessage().contains('Argument cannot be null.'))
            {

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Salesforce是一种用于管理和监控客户关系的云计算平台。Salesforce技术开发是指使用Salesforce平台进行应用程序和解决方案开发的过程。 在Salesforce技术开发中,开发人员可以使用Apex编程语言来创建自定义对象、字段和布局以及触发器和工作流规则。此外,Salesforce还提供了强大的API和集成工具,使开发人员能够与其他系统进行集成,并实现数据交换和自定义操作。 Salesforce技术开发可以用于创建和定制各种应用程序和解决方案,如CRM系统、客户服务管理、销售和市场营销自动化等。开发人员可以根据客户的需求和业务流程,使用Salesforce提供的丰富功能和组件来构建功能强大的应用程序。 在Salesforce技术开发过程中,开发人员需要了解Salesforce平台的特性和功能,掌握Apex编程语言和Visualforce页面开发,并熟悉Salesforce的数据模型和安全模型。此外,开发人员还需要具备良好的逻辑思维和问题解决能力,以设计和实现高效可靠的解决方案。 Salesforce技术开发在企业中得到了广泛应用,帮助企业提高销售效率、优化客户关系管理,并实现业务流程的自动化和数字化。Salesforce平台的灵活性和易用性使得开发人员能够快速构建和交付解决方案,并随着业务需求的变化进行灵活调整和扩展。 总之,Salesforce技术开发是一项重要的技能,它能够帮助企业实现数字化转型,提高业务效率和客户满意度。掌握Salesforce技术开发的知识和技能,将为开发人员带来更多的职业机和发展空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值