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

时间:2013-04-19 03:23:05

标签: salesforce apex-code

我有一个自定义对象“Order”,其中包含详细对象“Order Lines”。我想在Quote标题上放置一个名为“Create Order”的自定义按钮,单击该按钮将复制Quote标题和详细记录并创建相应的“Order”和“Order Lines”记录。

在将报价同步到商机时模仿相同的标准功能。

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

或者,带有控制器的visualforce页面会更好吗?

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

谢谢。

1 个答案:

答案 0 :(得分:0)

我会选择一些Apex代码。比纯粹使用JavaScript工具包更快,让我们面对它,S-Controls已成为过去。有可能如果你的同事将来必须维护它,他会知道Apex,但可能不是JS工具包。

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

至于实际代码 - 最佳类型的克隆将动态选择所有(因此在将来添加新字段时它也会起作用)。遗憾的是,Apex中没有SELECT *语法,您需要使用describe调用。

这样的事情(未经测试!只是为了给你一个想法)

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而不是具体的订单......毕竟如果查找更改是唯一要做的事情 - 为什么不呢?)。此外,如果您确定订单将具有&lt;您可以尝试200行,一次性查询?