簡體   English   中英

從表中獲取最新數據

[英]Get the latest data from table

我想從 ABAP 中的表中獲取最新數據。

這是表ckmlcr中的一個示例:

曼德 KALNR BDATJ 波珀 UNTPER CURTP 佩恩 VPRSV STPRS PVPRS WAERS ...
100 000100000000 2020 007 000 10 1 小號 1.00 0.00 日元 ...
100 000100000000 2020 007 000 30 1 小號 1.00 0.00 日元 ...
100 000100000000 2020 007 000 31 1 小號 1.00 0.00 日元 ...
100 000100000000 2020 008 000 10 1 小號 1.00 0.00 日元 ...
100 000100000000 2020 008 000 30 1 小號 1.00 0.00 日元 ...
100 000100000000 2020 008 000 31 1 小號 1.00 0.00 日元 ...
100 000199999999 2020 007 000 10 1 小號 20.00 0.00 歐元 ...
100 000199999999 2020 007 000 30 1 小號 25.00 0.00 歐元 ...
100 000199999999 2020 007 000 31 1 小號 20.00 0.00 歐元 ...

我想獲取每個KALNR的最新數據,因此這意味着我的 output 表應具有以下值:

曼德 KALNR BDATJ 波珀 UNTPER CURTP 佩恩 VPRSV STPRS PVPRS WAERS ...
100 000100000000 2020 008 000 10 1 小號 1.00 0.00 日元 ...
100 000100000000 2020 008 000 30 1 小號 1.00 0.00 日元 ...
100 000100000000 2020 008 000 31 1 小號 1.00 0.00 日元 ...
100 000199999999 2020 007 000 10 1 小號 20.00 0.00 歐元 ...
100 000199999999 2020 007 000 30 1 小號 25.00 0.00 歐元 ...
100 000199999999 2020 007 000 31 1 小號 20.00 0.00 歐元 ...

我的程序應該選擇年份

PARAMETERS: bdatj TYPE ckmlcr-bdatj DEFAULT sy-datum+0(4) OBLIGATORY.

並且應該為每個成本估算數字 ( KALNR POPER

實現這一目標的最簡單方法是什么? 由於數據很多,直接獲取表上SQL select內的過濾數據就好了。

這將是 SQL 語句,無需任何修改即可獲取最新數據。

  SELECT * FROM ckmlcr INTO TABLE @DATA(ckmlcr_single)
    WHERE kalnr = @<ckmlcr_line>-kalnr
    AND bdatj = @bdatj.

對我有用的是:

SELECT * FROM ckmlcr INTO TABLE @DATA(ckmlcr_single)
  WHERE kalnr = @<ckmlcr_line>-kalnr
  AND bdatj = @bdaj
  AND poper = ( SELECT MAX( poper ) from ckmlcr
  WHERE kalnr = @kalnr
  AND bdatj = 2022 ).

此解決方案僅適用於單個kalnr ,而不適用於上面對整個表的要求。

這意味着我的程序目前看起來像這樣:

" get single kalnr
SELECT DISTINCT kalnr FROM ckmlcr INTO TABLE @DATA(data_ckmlcr)
    WHERE bdatj = @bdatj
    ORDER BY kalnr.

LOOP AT data_ckmlcr ASSIGNING FIELD-SYMBOL(<ckmlcr_line>).

  " get the latest data from this kalnr
  SELECT * FROM ckmlcr INTO TABLE @DATA(ckmlcr_single)
    WHERE kalnr = @<ckmlcr_line>-kalnr
    AND bdatj = @bdatj
    AND poper = ( SELECT MAX( poper ) from ckmlcr
                    WHERE kalnr = @<ckmlcr_line>-kalnr
                    AND bdatj = @bdatj ).
[...]

ENDLOOP.

由於循環中的 select 性能不太好......

了解如何使用子查詢

SELECT kalnr bdatj poper untper curtp peinh vprsv stprs pvprs waers 
  FROM ckmlcr AS cr
  INTO TABLE @DATA(ckmlcr_single)
  WHERE bdatj = @bdatj
  AND poper = ( SELECT MAX( poper ) from ckmlcr AS lr WHERE kalnr = cr~kalnr AND bdatj = cr~bdatj ).

PS讓自己習慣於明確地放置 select 字段而不是星號,它將在未來很好地發揮作用。

暫無
暫無

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

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