簡體   English   中英

SAP ABAP如何進行海量選擇

[英]How to make massive selection SAP ABAP

我正在從數據庫中進行大量選擇,目的是將其保存在應用程序服務器或本地目錄中。 由於數據庫中有大量條目,我首先嘗試了這種方式:

SELECT * FROM db PACKAGE SIZE iv_package
    INTO CORRESPONDING FIELDS OF TABLE rt_data
    WHERE cond  IN so_cond
    AND   cond1 IN so_cond1.

SAVE(rt_data). 
ENDSELECT. 

這導致轉儲,並顯示以下消息:

運行時錯誤:DBIF_RSQL_INVALID_CURSOR
異常:CX_SY_OPEN_SQL_DB

我也嘗試過另一種方法:

 OPEN CURSOR WITH HOLD s_cursor FOR
  SELECT * FROM db
    WHERE cond  IN so_cond
    AND   cond1 IN so_cond1.
  DO.
    FETCH NEXT CURSOR s_cursor INTO TABLE rt_data PACKAGE SIZE iv_package.

    SAVE(rt_data).
ENDDO.

這也導致了包含相同消息的轉儲。

這種情況的最佳方法是什么?

TYPES:
  BEGIN OF key_package_type,
    from TYPE primary_key_type,
    to   TYPE primary_key_type,
  END OF key_package_type.
TYPES key_packages_type TYPE STANDARD TABLE OF key_package WITH EMPTY KEY.
DATA key_packages TYPE key_packages_type.

* select only the primary keys, in packages
SELECT primary_key_column FROM db
    INTO TABLE @DATA(key_package) PACKAGE SIZE package_size
    WHERE cond IN @condition AND cond1 IN other_condition
    ORDER BY primary_key_column.

  INSERT VALUE #( from = key_package[ 1 ]-primary_key_column
                  to   = key_package[ lines( key_package ) ]-primary_key_column )
    INTO TABLE key_packages.

ENDSELECT.

* select the actual data by the primary key packages
LOOP AT key_packages INTO key_package.
  SELECT * FROM db INTO TABLE @DATA(result_package)
    WHERE primary_key_column >= key_package-from
      AND primary_key_column <= key_package-to.
  save_to_file( result_package ).
ENDLOOP. 

如果你的表有復合主鍵,即多列如{MANDT,GJAHR,BELNR},只需將fromto字段的類型替換為結構,並調整第一個SELECT中的列列表和第二個SELECT中的WHERE條件適當地選擇。

如果您的范圍僅包含option = 'EQ'記錄或其中一個條件具有外鍵,您可以在執行選擇之前簡單地開始循環以減小結果表的大小並將方法調用移出打開的游標.

選項 = '情商'

在這里你只是循環范圍:

LOOP AT so_cond ASSIGNING FIELD-SYMBOL(<cond>).

   SELECT * FROM db
     INTO CORRESPONDING FIELDS OF TABLE rt_data
     WHERE cond  = <cond>-low.
     AND   cond1 IN so_cond1.

   save(rt_data).

ENDLOOP.

外鍵

在這種情況下,無法在范圍內循環,因為您無法輕松解決其他選項,如CP 但是您可以從 cond 的外鍵表中獲取范圍選擇的每個值。 然后你遍歷結果表並像上面一樣在里面執行SELECT語句。

SELECT cond FROM cond_foreign_keytab
   WHERE cond IN @so_cond
   INTO TABLE @DATA(cond_values).

LOOP AT cond_values ASSIGNING FIELD-SYMBOL(<cond>).

   SELECT * FROM db
     INTO CORRESPONDING FIELDS OF TABLE rt_data
     WHERE cond  = <cond>.
     AND   cond1 IN so_cond1.

   save(rt_data).

ENDLOOP.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM