Salesforce 使用自定义按钮复制标题和详细信息

Salesforce 使用自定义按钮复制标题和详细信息,salesforce,apex-code,Salesforce,Apex Code,我有一个自定义对象顺序和详细对象顺序行。我想在报价单标题上放置一个名为“创建订单”的自定义按钮,单击该按钮将复制报价单标题和明细记录,并创建相应的订单和订单行记录 模拟将报价与opportunity同步时的标准功能 我想知道做这件事最好的方法是什么?自定义按钮是否应该使用ajax工具包并使用onclick事件执行javascript 或者,带控制器的visualforce页面是更好的选择吗 是否有任何示例演示此功能 谢谢。我想说一点Apex代码。比单纯使用JavaScript工具包更快,让我们面

我有一个自定义对象顺序和详细对象顺序行。我想在报价单标题上放置一个名为“创建订单”的自定义按钮,单击该按钮将复制报价单标题和明细记录,并创建相应的订单和订单行记录

模拟将报价与opportunity同步时的标准功能

我想知道做这件事最好的方法是什么?自定义按钮是否应该使用ajax工具包并使用onclick事件执行javascript

或者,带控制器的visualforce页面是更好的选择吗

是否有任何示例演示此功能


谢谢。

我想说一点Apex代码。比单纯使用JavaScript工具包更快,让我们面对现实吧,s控件已经成为过去。如果您的同事将来需要维护它,他可能会知道Apex,但可能不会知道JS工具包

现在-使用webservice关键字或visualforce页面对Apex进行简单的JS按钮+调用?。只有你能回答这个问题。是否要显示编辑页面,让用户更改某些值,然后再保存?在保存克隆之前,是否必须重置订单或行项目的某些状态

至于实际代码,最佳克隆类型将动态选择all,以便将来添加新字段时也能正常工作。遗憾的是,Apex中没有SELECT*语法,您需要使用descripe调用

像这样的东西没有经过测试!只是给你一个想法

List<Schema.SObjectField> orderFields = Schema.SObjectType.Order__c.fields.getMap().values();
List<Schema.SObjectField> itemFields = Schema.SObjectType.Order_Line__c.fields.getMap().values();

// You might also want to use simple fields.getMap().keyset(), that'll be set of strings
Id orderId = 'a01...';

String orderQuery = 'SELECT ' + String.join(orderFields, ', ') + ' FROM Order__c WHERE Id = :orderId';
Order__c oldOrder = Database.query(orderQuery);
Order__c newOrder = oldOrder.clone(false,true); //options do not retain ID; deep clone

insert newOrder;

String itemsQuery = 'SELECT ' + String.join(itemFields, ', ') + ' FROM Order_Line__c WHERE Order__c = :orderId';
List<Order_Line__c> oldLines = Database.query(itemsQuery);
List<Order_Line__c> newLines = oldLines.deepClone(false);
for(Order_Line__c newLine : newLines){
    newLine.Order__c = newOrder.Id;
}
insert newLines;
您可以随意尝试将它重构为一个助手方法,处理一般的Sobject而不是具体的命令。。。毕竟,如果查找更改是唯一要做的事情,为什么不呢?。另外,如果您确定订单的行数小于200行,您可以尝试一次性查询