0

この質問をご覧いただきありがとうございます。

これはすべて、非常に長くなる可能性のあるFOR EACHループのコンテキストにあります(100,000レコードと考えてください)。その結果セット内の位置からnレコードを取得する方法を探しています。たとえば、@ 4000を開始し、次の500レコードを取得します。

ABLリファレンスで次のようなキーワードを探していました。

  • ポジション
  • 先のことを考える
  • RECID-n番目の位置にRECIDを見つけることができるかどうか
  • クエリチューニング

これまでのところ運がありません。ヒントのある賢い人はいますか?

4

2 に答える 2

3

スポーツ データベースに対して作成した例を次に示します。sports データベースは、SQL Server の AdventureWorks データベースに似たサンプル データベースです。

これで始められるはずです:

def var v-query as char   no-undo.
def var h       as handle no-undo.

/* Here is where can set a dynamic query */
assign v-query = "for each orderline no-lock".

/* Create handle used for query */
create query h.

/* Set the table against the query so you can access it conveniently */
/* If you have other tables in your "for each", simply do a          */
/* set-buffers on each table */
h:set-buffers(buffer orderline:handle).

/* Prepare Query */
h:query-prepare(v-query).

/* DO Open */
h:query-open.

/* Setup query to row 10 */
h:reposition-to-row(10).

LINE_LOOP:
repeat:

   /* Read next row */
   h:get-next.

   /* Check if we are not past the end */
   if h:query-off-end then leave LINE_LOOP.

   /* Since we added orderline as a buffer we can now use it here */
   disp orderline.ordernum
        orderline.linenum
        orderline.itemnum
        orderline.price
        orderline.qty.

end. /* repeat */

h:query-close.

参考までに、Progress Knowledge ベースPSDNには優れたサンプルとチュートリアルがあります。

于 2012-10-16T05:13:07.767 に答える
0

他の例 - データセット テーブルの入力 - BATCHING

DEFINE TEMP-TABLE ttOrder LIKE Order.
DEFINE DATASET dsOrder FOR ttOrder.

/* you can set a buffer object */
/*DEFINE DATA-SOURCE srcOrder FOR Order.*/

/* or you can set a query */
DEFINE QUERY qOrder FOR Order SCROLLING.
QUERY qOrder:QUERY-PREPARE ("FOR EACH Order").
DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder.


BUFFER ttOrder:ATTACH-DATA-SOURCE( DATA-SOURCE srcOrder:HANDLE ).

/*The maximum number of ProDataSet temp-table rows to retrieve in each FILL operation.*/ 
BUFFER ttOrder:BATCH-SIZE = 10. 

/* Empties the table before the FILL operation begins. 
Without setting this attribute will next rows append to existing in temp-table */
BUFFER ttOrder:FILL-MODE = "EMPTY".  

/* first time - result 1 - 10 */
DATASET dsOrder:FILL ().

FOR EACH ttOrder:
  DISPLAY ttOrder.ordernum.
END.  

/* set the startpoint to position 11 */
DATA-SOURCE srcOrder:RESTART-ROW = 11.

/* second time 11 - 20 */
DATASET dsOrder:FILL ().

FOR EACH ttOrder:
  DISPLAY ttOrder.ordernum.
END.
于 2012-10-17T10:05:54.517 に答える