Abap 如何访问用于for ALL ENTRIES语句的表中的数据?

Abap 如何访问用于for ALL ENTRIES语句的表中的数据?,abap,opensql,Abap,Opensql,我需要一些数据从表BKPF和BSEG压缩在一个表中。例如,假设最后一个表必须如下所示: | BKPF-BUKRS | BKPF-GJAHR | BKPF-MONAT | BSEG-DMBTR | |============|============|============|============| | 01 | 2014 | 02 | 1,751.55 | | 01 | 2014 | 02 |

我需要一些数据从表BKPF和BSEG压缩在一个表中。例如,假设最后一个表必须如下所示:

| BKPF-BUKRS | BKPF-GJAHR | BKPF-MONAT | BSEG-DMBTR |
|============|============|============|============|
|         01 |       2014 |         02 |   1,751.55 |
|         01 |       2014 |         02 |     526.45 |
|         02 |       2014 |         02 |  32,112.01 |
|            |            |            |     ...... |
|============|============|============|============|
SELECT BUKRS BELNR GJAHR MONAT 
  FROM BKPF 
  INTO CORRESPONDING FIELDS OF TABLE IT_BKPF
  WHERE .... 

IF IT_BKPF IS NOT INITIAL. 
  SELECT DMBTR
    FROM BSEG 
    INTO CORRESPONDING FIELDS OF LS_BSEG 
    FOR ALL ENTRIES IN IT_BKPF 
    WHERE BUKRS = IT_BKPF-BUKRS AND 
          BELNR = IT_BKPF-BELNR AND 
          GJAHR = IT_BKPF-GJAHR. 

    LS_RESULT-BUKRS = LS_BSEG-BUKRS.
    LS_RESULT-GJAHR = LS_BSEG-GJAHR.
    LS_RESULT-MONAT = ???
    LS_RESULT-DMBTR = LS_BSEG-DMBTR.

    COLLECT LS_RESULT INTO IT_RESULT.
  ENDSELECT.
ENDIF.
FIELD-SYMBOLS: <fs_str_bkpf> LIKE LINE OF it_bkpf.

SELECT.
...
  READ TABLE it_bkpf WITH KEY bukrs = ls_bseg-bukrs belnr = ls_bseg-belnr
    gjahr = ls_bseg-gjahr ASSIGNING <fs_str_bkpf>.
...
    ls_result-monat = <fs_str_bkpf>-monat.
ENDSELECT.
为了提高程序的效率,我想对所有条目使用该语句。所以看起来是这样的:

| BKPF-BUKRS | BKPF-GJAHR | BKPF-MONAT | BSEG-DMBTR |
|============|============|============|============|
|         01 |       2014 |         02 |   1,751.55 |
|         01 |       2014 |         02 |     526.45 |
|         02 |       2014 |         02 |  32,112.01 |
|            |            |            |     ...... |
|============|============|============|============|
SELECT BUKRS BELNR GJAHR MONAT 
  FROM BKPF 
  INTO CORRESPONDING FIELDS OF TABLE IT_BKPF
  WHERE .... 

IF IT_BKPF IS NOT INITIAL. 
  SELECT DMBTR
    FROM BSEG 
    INTO CORRESPONDING FIELDS OF LS_BSEG 
    FOR ALL ENTRIES IN IT_BKPF 
    WHERE BUKRS = IT_BKPF-BUKRS AND 
          BELNR = IT_BKPF-BELNR AND 
          GJAHR = IT_BKPF-GJAHR. 

    LS_RESULT-BUKRS = LS_BSEG-BUKRS.
    LS_RESULT-GJAHR = LS_BSEG-GJAHR.
    LS_RESULT-MONAT = ???
    LS_RESULT-DMBTR = LS_BSEG-DMBTR.

    COLLECT LS_RESULT INTO IT_RESULT.
  ENDSELECT.
ENDIF.
FIELD-SYMBOLS: <fs_str_bkpf> LIKE LINE OF it_bkpf.

SELECT.
...
  READ TABLE it_bkpf WITH KEY bukrs = ls_bseg-bukrs belnr = ls_bseg-belnr
    gjahr = ls_bseg-gjahr ASSIGNING <fs_str_bkpf>.
...
    ls_result-monat = <fs_str_bkpf>-monat.
ENDSELECT.
现在的问题是:如何获得每个条目的BKPF-MONAT值?是否有一种方法可以对所有条目执行此操作?另一种解决方案是两个选择循环,类似于:

SELECT BUKRS BELNR GJAHR MONAT 
  FROM BKPF 
  INTO CORRESPONDING FIELDS OF LS_BKPF
  WHERE .... 

  SELECT DMBTR
    FROM BSEG 
    INTO CORRESPONDING FIELDS OF LS_BSEG 
    WHERE BUKRS = LS_BKPF-BUKRS AND 
          BELNR = LS_BKPF-BELNR AND 
          GJAHR = LS_BKPF-GJAHR. 

    LS_RESULT-BUKRS = LS_BKPF-BUKRS.
    LS_RESULT-GJAHR = LS_BKPF-GJAHR.
    LS_RESULT-MONAT = LS_BKPF-MONAT.
    LS_RESULT-DMBTR = LS_BSEG-DMBTR.

    COLLECT LS_RESULT INTO IT_RESULT.
  ENDSELECT.
ENDSELECT.
但我想这不是很有效。。
通常情况下,您会使用连接进行此操作,但如果您不能使用集群表(BSEG)进行此操作。

请尝试从
选择框内的
IT\u BKPF
读取条目。结束选择

例如:

| BKPF-BUKRS | BKPF-GJAHR | BKPF-MONAT | BSEG-DMBTR |
|============|============|============|============|
|         01 |       2014 |         02 |   1,751.55 |
|         01 |       2014 |         02 |     526.45 |
|         02 |       2014 |         02 |  32,112.01 |
|            |            |            |     ...... |
|============|============|============|============|
SELECT BUKRS BELNR GJAHR MONAT 
  FROM BKPF 
  INTO CORRESPONDING FIELDS OF TABLE IT_BKPF
  WHERE .... 

IF IT_BKPF IS NOT INITIAL. 
  SELECT DMBTR
    FROM BSEG 
    INTO CORRESPONDING FIELDS OF LS_BSEG 
    FOR ALL ENTRIES IN IT_BKPF 
    WHERE BUKRS = IT_BKPF-BUKRS AND 
          BELNR = IT_BKPF-BELNR AND 
          GJAHR = IT_BKPF-GJAHR. 

    LS_RESULT-BUKRS = LS_BSEG-BUKRS.
    LS_RESULT-GJAHR = LS_BSEG-GJAHR.
    LS_RESULT-MONAT = ???
    LS_RESULT-DMBTR = LS_BSEG-DMBTR.

    COLLECT LS_RESULT INTO IT_RESULT.
  ENDSELECT.
ENDIF.
FIELD-SYMBOLS: <fs_str_bkpf> LIKE LINE OF it_bkpf.

SELECT.
...
  READ TABLE it_bkpf WITH KEY bukrs = ls_bseg-bukrs belnr = ls_bseg-belnr
    gjahr = ls_bseg-gjahr ASSIGNING <fs_str_bkpf>.
...
    ls_result-monat = <fs_str_bkpf>-monat.
ENDSELECT.

您是否绝对确定对所有条目使用
将使程序更高效?@Jagger如果您对所有条目使用
的表是排序表类型,则它将是排序表类型。@ravendramer我不确定排序在这种情况下是否有帮助。看看这个开放式SQL查询实际上是如何转换为底层数据库的SQL查询的,这将是一件有趣的事情。这是一篇有趣的文章,展示了SQL Server的外观。看起来有几个(取决于所有条目的
表有多大)
SELECT
语句被创建和统一,在这种情况下排序没有帮助。@Jagger不排序表,键入排序表。数据库无法知道任何给定参数是否已排序(这会导致更快、更高效的查询),除非向其传递类型为“排序表”。@RavenDreamer正如我所说的,由于语句转换为DB SQL的方式,它与表的类型无关。我也考虑过这一点,但担心表的额外读取会导致性能问题。正如你所说的那样,散列或排序语句应该可以做到这一点!