DATA : L_A LIKE V_ANEPK-ANBTR,
L_B LIKE V_ANEPK-ANBTR,
L_BTR11 LIKE V_ANEPK-ANBTR.
LOOP AT ITAB_DATA.
READ TABLE LV_V_ANEPK WITH KEY BUKRS = ITAB_DATA-BUKRS
ANLN1 = ITAB_DATA-ANLN0
ANLN2 = ITAB_DATA-ANLN2.
IF SY-SUBRC = 0.
CLEAR L_BTR11.
CLEAR : L_A, L_B.
IF ITAB_DATA-BTR1 <> 0.
L_A = ITAB_DATA-BTR1.
L_B = LV_V_ANEPK-ANBTR.
L_BTR11 = L_B / L_A.
* L_BTR11 = LV_V_ANEPK-ANBTR / ITAB_DATA-BTR1.
ENDIF.
디버깅을 걸어보면,
디버깅1
L_B = 8600.00
L_A = 17200.00
L_BTR11 = 0.01 원래대로라면 0.5가 들어와야되는데...엄한 값이 들어옵니다.
디버깅2
L_B = 42821.78
L_A = 131759.30
L_BTR11 =0.00 원래대로라면 0.32가 들어와야되는데...엄한 값이 들어옵니다.
이럴 때 의심해볼 만한 것이..
변수의 데이터 타입일텐데... 그래서 맨처음처럼 별도로 다시 선언해줬는데도..
엄한 값이 들어오니..방법이 안떠오르네요.
이럴 땐 어떻게 해야될까요?
댓글 10
-
버미!
2010.07.20 21:33
-
버미!
2010.07.20 21:34
저..소스 도대체 정체가 뭐지..? -
맨날초보
2010.07.20 22:10
버미님...정말 희한하죠?? 제가 이것땜에 환장하겠습니다. 두시간째 이래저래 해보는데도 역시 엄한 값이 들어오니...
-
초코
2010.07.20 22:16
아래처럼 하니 디버깅에 나온다는 값이 나오네요.
L_B = 8600.00
L_A = 1720000
L_B / L_A = 0.01
L_B = 42821.78
L_A = 13175930
L_B / L_A = 0.00
다음처럼 서로 다른 structure 에 있는 값을 할당했는데요.
currency 지정이 되고 안되고의 차이가 아닌가 싶습니다.
L_A = ITAB_DATA-BTR1.
L_B = LV_V_ANEPK-ANBTR.
-
맨날초보
2010.07.20 22:57
초코님 CURR 지정 차이가 어떤 말씀인지??? WEARS는 넣어놨거든요.
변수3개를
BTR1 REPBETRAG CURR 13 2 FI-AA 리포트의 금액 필드 <==== 이 유형으로 바꾸어서 해봤는데도 같은 현상이거든요.
-
홈런
2010.07.20 23:22
혹시,, 프로그램 속성에 고정소숫점 연산이 체크 해제 되있는건 아닐까요?
HR쪽 인포타입같은거는 생성할때 기본적으로 고정소숫점 연산이 체크해제되서 생성되는데,,
이것 때문에 전에 고생한적이 있네요. 비슷한 상황이 아닌가해서 댓글 답니다.
-
초코
2010.07.20 23:37
아래 내용이 진리인지는 모르겠습니다.
디버그 결과가 저렇게 나온다니 추정해 본 겁니다.
se11에서 V_ANEPK(실제테이블 ANEP) 테이블의 ANBTR 필드를 조회해보면 currency 참조로 T093B-WAERS 가 지정되어 있습니다.
이 말은 ANEP-ANBTR 필드값은 외래키로 연결된 T093B-WAERS 필드를 참조로 curr 가 결정된다는 말이겠죠. (KRW인 경우 x100 처리)
여기부터는 소스가 없어서 가정인데요.
LV_V_ANEPK 에는 waers 필드가 없죠? 있더라도 외래키가 걸려있지도 않을거고..
그래서 L_B = 8600.00 는 그냥 8600.00 으로 들어가는 것이고요.
뭔지 모르겠지만 ITAB_DATA 테이블에는 WAERS 가 있고 값이 'KRW'라서 ITAB_DATA-BTR1 필드가 이쪽 curr 를 참조하고 있다는 겁니다.
그래서 결국 L_A = 17200.00 는 1720000 가 되는 것이지요.
currency를 둘다 적용해보거나 빼보는 시도를 할만할 것 같습니다.
L_A L_B 선언을 일반형식으로 type p length 13 decimal 2 식으로 해보거나
write ... currency ... 를 사용해서 문자열로 만든다음 다시 숫자로.. --;;
죄송합니다. 마지막은 안해보고 생각나는대로.. ^^;;;
-
맨날초보
2010.07.20 23:46
우선 홈런님 말씀대로 속성에서 고정소숫점 연산 체크 했더니, 해결되었습니다.
초코님 말씀대로 제가 이래저래 해보면서 데이터 선언 여러 방면으로 해봤을 때도 값은 여전히 엄하더라구요.
여튼 오늘도 여러분의 댓글 도움으로 문제 해결 되었습니다.
모든분께 감사드립니다.
-
초코
2010.07.20 23:52
하하 길게 썼는데 허무하게 해결됐네요. ^^ 고정소숫점 연산이라.. 저도 한 수 배웠습니다. -
양키
2010.07.21 18:59
"고정소숫점연산" one-paper에 나왔던 내용인것 같네요.
Type F는 내부적으로 Binary System으로 전환시 반올림 에러 발생될수있음
높은정확도를 요구한다면 Type P를 사용해야함.
* Type P : 가용사이즈1~16 / 소수 최대 14자리
* 프로그램 속성 Setting시 고정소수점연산을 체크해야함 그렇지않을경우 Type P는 Integer로 표현됨..^^
희한하네..그럼
제대로 나오는데..0.5
DATA : l_a LIKE v_anepk-anbtr,
l_b LIKE v_anepk-anbtr,
l_btr11 LIKE v_anepk-anbtr.
l_b = '8600.00'.
l_a = '17200.00'.
l_btr11 = l_b / l_a.
WRITE:/'Result : ', l_btr11 .
0.5 맞는데..정말 이상하다..