1. 첫번째
SELECT belnr INTO CORRESPONDING FIELDS OF TABLE itab_belnr
FROM bkpf
WHERE bukrs EQ pbukrs
AND gjahr EQ pgjahr
AND monat IN pmonat
AND stblg EQ space. -> 회계전표번호만 가지고 옵니다.
LOOP AT itab_belnr.
belnr_r_t-sign = 'I'.
belnr_r_t-option = 'EQ'.
belnr_r_t-low = itab_belnr-belnr.
belnr_r_t-high = ''.
APPEND belnr_r_t. -> 레인지 변수안에 회계전표를 넣습니다.
ENDLOOP.
SELECT single belnr shkzg dmbtr hkont buzei INTO CORRESPONDING FIELDS OF wa1
FROM bseg
WHERE bukrs EQ pbukrs
AND gjahr EQ pgjahr
AND belnr IN belnr_r_t
AND hkont IN psaknr. -> 회계변수와 맞는 회계번호와 차대지시자 금액 계정 항순을 가지고 옵니다.
위와 같이 프로그램을 짲더니 마지막 부분에 AND belnr IN belnr_r_t 부분의 조건(범위)이 너무 많아서
DB와 연결이 끊어 집니다. belnr_r_t의 값이 보통 10만건을 넘는것이라서 'DBIF_RSQL_INVALID_RSQL'이라는 덤프가 발생합니다.
원래는 아래과 같이 짲는데요 시간이 너무 걸리는게 만약 belnr이 10만건 이상이면 db접속이 10만이상이라는거자나요
그래서 속도가 정말 안 나오더군요.
2.번째
SELECT belnr INTO CORRESPONDING FIELDS OF TABLE itab_belnr
FROM bkpf
WHERE bukrs EQ pbukrs
AND gjahr EQ pgjahr
AND monat IN pmonat
AND stblg EQ space.
LOOP AT itab_belnr.
SELECT belnr shkzg dmbtr hkont INTO CORRESPONDING FIELDS OF TABLE itab_bseg
FROM bseg
WHERE bukrs EQ pbukrs
AND gjahr EQ pgjahr
AND hkont IN psaknr
AND belnr EQ itab_belnr-belnr.
ENDLOOP.
그래서 생각하는게 서브커리 아니면 조인을 해야 할듯 합니다.
어느것을 사용하는게 속도를 더 올릴수 있는지 시간 되시면 커리도 쫌 만들어 주시면 감사하겠습니다.
서브 커리로 하면 왠지
SELECT belnr shkzg dmbtr hkont APPENDING CORRESPONDING FIELDS OF TABLE itab_bseg_1
FROM bseg
WHERE bukrs EQ pbukrs
AND gjahr EQ pgjahr
AND hkont IN psaknr
AND belnr IN ( SELECT belnr
FROM bkpf
WHERE bukrs EQ pbukrs
AND gjahr EQ pgjahr
AND monat IN pmonat
AND stblg EQ space ).
이런 삘일것 같은데 첫번째
테스트하는데 1시간 이상 걸려요.. 너무 느려요
아무리 생각해도 2번째와 비슷하게도 in안에 조건이 너무 많아서 db접속이 끊길것 같네요.
bkpf에서는 그냥 회계 전표번호(조건이 됨)만 가져옵니다. bseg에 있기 때문에 조인을 할필요는 없는것 같은데요
쫌 도와 주십시요
참고로 세번째와 같이 서브 커리를 작성시에는
Sub-queries are only valid for transparent tables: "BSEG".
라는 에러가 발생합니다.
댓글 10
-
정군
2009.04.28 00:34
-
정군
2009.04.28 00:41
-
無念군
2009.04.28 00:43
in 조건이 아마 5천 건인가 에 걸려서 안들어 갈거에요 -_-; ( 그랬던 것으로 기억을..)
-
정군
2009.04.28 01:18
답 달아두고도 join 하시라는 멍청한 소릴 했네요.
일단 보내드린 것 참조해보세요.
-
아밥고지를 찾아서
2009.04.28 01:19
select
b~belnr
b~shkzg
b~dmbtr
b~hkont
b~buzei
from bkpf as a
inner join bseg as b
on a~belnr eq b~belnr
into CORRESPONDING FIELDS OF TABLE itab_bseg
where a~bukrs eq pbukrs
and a~gjahr eq pgjahr
and a~monat in pmonat
AND a~stblg EQ space
and b~burks eq pbukrs
and b~gjahr eq pgjahr
AND b~hkont IN psaknr.
이렇게 짲는데
위의 분들이 말씀 하신것 처럼 조인을 할려고 해도 bseg가 클러스터테이블 입니다. 우짜죠?
select from table using for all entries in <itab>을 이용하라 책에 나와 있는데 저위의 조인에 어떻게 적용을 해야하는거죠?
-
정군
2009.04.28 01:33
REPORT z_bseg2 .
DATA: BEGIN OF itab_bkpf OCCURS 0,
bukrs LIKE bkpf-bukrs,
gjahr LIKE bkpf-gjahr,
belnr LIKE bkpf-belnr,
END OF itab_bkpf.
DATA: BEGIN OF itab_bseg OCCURS 0,
bukrs LIKE bkpf-bukrs,
gjahr LIKE bkpf-gjahr,
belnr LIKE bkpf-belnr,
END OF itab_bseg.
START-OF-SELECTION.
break-point.
SELECT bukrs gjahr belnr
INTO CORRESPONDING FIELDS OF TABLE itab_bkpf
FROM bkpf
UP TO 100 ROWS
WHERE bukrs = 'K100'
AND gjahr = '2008'.
SELECT belnr" shkzg dmbtr hkont
INTO CORRESPONDING FIELDS OF TABLE itab_bseg
FROM bseg
FOR ALL ENTRIES IN itab_bkpf
WHERE bukrs = itab_bkpf-bukrs
AND gjahr = itab_bkpf-gjahr
* AND hkont IN psaknr
AND belnr = itab_bkpf-belnr.
BREAK-POINT.
라고 하니 RFBLG~0 인덱스를 타면서 잘 되네요.
up to 100 rows라고 하긴 했지만 실행하면 0.1 초도 안걸리는 듯...
참고해 보세요.
제가 올린 문서에는 더 다양한 답이 있습니다.
-
보나
2009.04.28 01:39
클러스트테이블, 뷰 등은 join 이 불가합니다.
loop~
select
endloop.
위와 같은 로직 대신 for all entires 로직이 권장사항입니다만,
bkpf 자체에 데이터 건수가 너무 많아 속도가 얼마나 향상 될지는 모르겠습니다.
SELECT bukrs gjahr belnr INTO CORRESPONDING FIELDS OF TABLE itab
FROM bkpf
WHERE bukrs EQ pbukrs
AND gjahr EQ pgjahr
AND monat IN pmonat
AND stblg EQ space. -> bukrs, gjahr, belnr 가져옴
SELECT bukrs gjahr belnr buzei shkzg dmbtr hkont
FROM bseg
INTO CORRESPONDING FIELDS OF TABLE stab
FOR ALL ENTIRES IN itab
WHERE bukrs = itab-bukrs
AND gjahr = itab-gjahr
AND belnr = itab-belnr
AND hkont IN psaknr. -
보나
2009.04.28 02:09
로직을 다시 살펴보니, 정확히 구현하고자 하시는 내용을 말씀해 주시는 게 어떨까요?
1번의 경우엔 BKPF 에서 대량의 전표번호를 읽어와 BSEG 에서는 single 로 셀렉트를 하게 되어 있고,
2번의 경우엔 BKPF 에서 가져와 loop 돌면서 APPENDING CORRESPONDING 이 아닌 INTO CORRESPONDING 으로 하면 제일 마지막
BKPF 데이터에 대한 부분만 저장됩니다.
특정기간동안 "역분개가 진행되지 않은" 계정/금액/대차 금액의 '상세' 레포트를 구현하시는건가요?
BSEG 에서 선택된 데이터를 재가공하신다면 원하시는 프로그램의 목적에 따라 정군님께서 올려주신 SDN 문서나 혹은 기타 다른방법
들을 이용할 수 있을 것 같습니다.
(balance 를 구하시는 경우라면 다른 테이블을 사용하시는 방법도 있습니다.)
-
보나
2009.04.28 02:19
FOR ALL ENTRIES 에 대한 e-abap.net 게시판 내 자료링크입니다.
http://e-abap.servebbs.net/zb/bbs/zboard.php?id=ONEPAPER&no=168
http://e-abap.servebbs.net/zb/bbs/zboard.php?id=ABAPQnA&no=47
http://e-abap.servebbs.net/zb/bbs/zboard.php?id=ABAPQnA&no=1758
-
아밥고지를 찾아서
2009.04.29 01:49
500만건 이상이라서 아무리 효율적으로 짜도 느리네요.ㅋㅋ 여러분의 답변들 너무 많은 공부가 되었습니다.
정말 정말 감사합니다.
1. BSEG는 transparent table이 아닙니다.
2. IN 조건에는 들어갈 수 있는 건수가 한계가 있습니다. 몇 천건 정도로 기억합니다.(이 에러지 싶어서 에러 올려달라고 했었습니다.)