我有一个自定义对象“Order”,其中包含详细对象“Order Lines”。我想在Quote标题上放置一个名为“Create Order”的自定义按钮,单击该按钮将复制Quote标题和详细记录并创建相应的“Order”和“Order Lines”记录。
在将报价同步到商机时模仿相同的标准功能。
我想知道这样做的最佳方法是什么?自定义按钮是否应该使用ajax工具包并使用onclick事件执行javascript?
或者,带有控制器的visualforce页面会更好吗?
是否有任何演示此功能的示例?
谢谢。
答案 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行,一次性查询?