少し Apex コードを使用します。純粋に JavaScript ツールキットに加えてそれに直面するよりも高速で、S コントロールは過去のものです。あなたの同僚が将来それを維持する必要がある場合、彼は Apex を知っているかもしれませんが、JS ツールキットを知らない可能性があります。
今 - シンプルな JS ボタン +webservice
キーワードまたは visualforce ページで公開された Apex への呼び出し?. それに答えられるのはあなただけです。「編集」ページを表示し、ユーザーがいくつかの値を変更して後で保存できるようにしますか? クローンを保存する前に「リセット」する必要があるオーダーまたはラインアイテムのステータスはありますか?
実際のコードについては、クローンの最適なタイプはすべてを動的に選択します (そのため、将来、新しいフィールドを追加するときにも機能します)。残念ながらSELECT *
、Apex には構文がありません。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;
自由に試してみてください (ヘルパー メソッドにリファクタリングし、具体的な Orders の代わりにジェネリック sObjects で作業します...結局のところ、ルックアップの変更だけを行う必要がある場合は、なぜですか?)。また、注文が 200 行未満になることが確実な場合は、一度にクエリを作成してみてください。