1

詳細オブジェクト「注文明細」を持つカスタム オブジェクト「注文」があります。「Create Order」という名前のQuoteヘッダーにカスタムボタンを配置したいと考えています。クリックすると、Quoteヘッダーと詳細レコードがコピーされ、対応する「Order」および「Order Lines」レコードが作成されます。

見積を商談に同期するときの標準と同じ機能を模倣します。

これを行うための最良のアプローチは何ですか?カスタム ボタンは ajax ツールキットを使用し、onclick イベントを使用して JavaScript を実行する必要がありますか?

または、コントローラーを備えた Visualforce ページは、これに適したオプションでしょうか?

この機能を示す例はありますか?

ありがとうございました。

4

1 に答える 1

0

少し 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 行未満になることが確実な場合は、一度にクエリを作成してみてください。

于 2013-04-19T07:27:06.443 に答える