안녕하세요~~~
화면에 출력이... 여러개의 item이 나옵니다..
근데. 문제는 가장 마지막에 나오는 아이템에 있는 w_rate라는 필드의 값이... 다른 아이템에까지 영향을 줘서...
같은 값이 출력이 되고 있습니다...
제 생각에는 제일 item을 읽으면서 제일 마지막에 받아지는 w_rate값을 모두 적용 시키는거 같은데요...
w_rate값은 table에서
가져오는 값이 아니라 펑션에서 해당날짜와 커런시로 검색된 값입니다.
제일 마지막단에 나오는 item값에 display되는것을 막으려고 하는데욤,,,
이럴때 사용하는 구문이 뭐가 있을까욤.....
조언좀 부탁드립니다...
댓글 11
-
쭈니
2009.06.04 19:08
-
정군
2009.06.04 21:00
소스좀 올려주시겠습니까.
-
andy
2009.06.04 22:39
itab에서 값을 가져와서 뿌려주는게 아니라, 로컬변수를 뿌려줘서 그런게 아닐까요?
펑션 콜 후 값을 itab에 넣어주고, 마지막에 함께 출력시키면 될거 같은데요..
지극히 상상 답변(??) 입니다.
정군님 말데로 소스를 주셔야 알거 같아요 ^^*
-
쭈니
2009.06.04 23:10
안녕하세요~ 제가 소스를 올려드립니다.
FORM GET-KRW-EXCHANGE-RATE USING Z_BUKRS.
DATA : TEMP_EXCH_RATE LIKE ZFEMSSLIP_BK-ZZNDFEXRATE,
MSG_TEXT(80) TYPE C.
CLEAR : W_RATE. " w_result_date.
SELECT SINGLE * FROM ZFEMSMAINCURR
WHERE BUKRS = Z_BUKRS.
IF ZLC <> W_CURR.
CALL FUNCTION 'ZFEMS_GET_EXCHANGE_RATE_RFC'
DESTINATION ZFEMSMAINCURR-ZDEST
EXPORTING
CONV_CURR = ZLC
TYPE1 = ZFEMSMAINCURR-ZZEXCHTYPE
FROM_CURR = W_CURR
TO_CURR = ZLC
DATE = W_DATE
INVERT = ' '
ZZMANDT = ZFEMSMAINCURR-ZZMANDT
IMPORTING
EXCHANGE_RATE = TEMP_EXCH_RATE
EXCEPTIONS
REQUIRED_ENTRY_NOT_MADE = 1
CURRENCY_INVALID = 2
DATE_INVALID = 3
OPT_INVALID = 4
NOT_FOUND = 5
COMMUNICATION_FAILURE = 9 MESSAGE MSG_TEXT
SYSTEM_FAILURE = 8 MESSAGE MSG_TEXT.
IF SY-SUBRC NE 0.
CASE SY-SUBRC.
WHEN 1. MESSAGE I105 WITH 'required_entry_not_made'.
WHEN 2. MESSAGE I105 WITH 'currency_invalid' W_CURR ZLC.
WHEN 3. MESSAGE I105 WITH 'date_invalid' W_DATE.
WHEN 4. MESSAGE I105 WITH 'opt_invalid'.
WHEN 5.
CONCATENATE ZFEMSMAINCURR-BUKRS W_DATE
W_CURR ZLC INTO MSG_TEXT SEPARATED BY SPACE.
MESSAGE I105 WITH 'Not Found Exchange Rate(M Type) =>'
MSG_TEXT.
WHEN 8. MESSAGE I105 WITH 'system_failure'.
WHEN 9. MESSAGE I105 WITH 'communication_failure'.
ENDCASE.
EXIT.
ENDIF.
* IF ZFEMSMAINCURR-BUKRS = 'C5B1' AND W_CURR = 'JPY'.
* W_RATE = TEMP_EXCH_RATE / 100.
* ELSE.
W_RATE = TEMP_EXCH_RATE.
* ENDIF.
ELSE.
W_RATE = 1.
ENDIF.
ENDFORM. " GET-KRW-EXCHANGE-RATE ==> 이 안에서 rfc펑션에서는 rate의 값을 계산합니다.
rfc 펑션에 들어가서는
TABLES : TCURR,TCURF.
DATA : INVERTED_DATE LIKE TCURR-GDATU,
TEMP_DATE(10),
RC LIKE SY-SUBRC,
IMSI_CURR LIKE TCURR-FCURR.
* IMPORT PARAMETER check
IF CONV_CURR IS INITIAL.
RAISE REQUIRED_ENTRY_NOT_MADE.
ENDIF.
IF TYPE1 IS INITIAL
OR FROM_CURR IS INITIAL
OR TO_CURR IS INITIAL
OR DATE IS INITIAL.
RAISE REQUIRED_ENTRY_NOT_MADE.
ENDIF.
WRITE DATE TO DATE.
CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT'
EXPORTING
INPUT = DATE
IMPORTING
OUTPUT = TCURR-GDATU.
WRITE DATE TO TEMP_DATE.
SELECT * FROM TCURR CLIENT SPECIFIED
WHERE MANDT = ZZMANDT
AND KURST = TYPE1
AND FCURR = FROM_CURR
AND TCURR = TO_CURR
AND GDATU >= TCURR-GDATU
ORDER BY GDATU.
EXIT.
ENDSELECT.
IF SY-SUBRC = 0.
SELECT * FROM TCURF
WHERE KURST = TYPE1 AND
FCURR = FROM_CURR AND
TCURR = TO_CURR AND
GDATU >= TCURR-GDATU
ORDER BY PRIMARY KEY.
ENDSELECT.
EXCHANGE_RATE = TCURR-UKURS * TCURF-TFACT / TCURF-FFACT.
ELSE.
SY-SUBRC = 0.
SELECT * FROM TCURR CLIENT SPECIFIED
WHERE MANDT = ZZMANDT
AND KURST = TYPE1
AND FCURR = TO_CURR
AND TCURR = FROM_CURR
AND GDATU >= TCURR-GDATU
ORDER BY GDATU.
EXIT.
ENDSELECT.
IF SY-SUBRC = 0.
SELECT * FROM TCURF
WHERE KURST = TYPE1 AND
FCURR = FROM_CURR AND
TCURR = TO_CURR AND
GDATU >= TCURR-GDATU
ORDER BY PRIMARY KEY.
ENDSELECT.
EXCHANGE_RATE = 1 / TCURR-UKURS * TCURF-TFACT / TCURF-FFACT.
ELSE.
RAISE NOT_FOUND.
ENDIF.
ENDIF.
ENDFUNCTION.
여기 펑션 안에서 또 하나의 펑션이 있는데 그곳에서는 제가 디버깅을 해본 결과 date날짜를 계산하는 펑션이었습니다.
-
SD2
2009.06.05 01:40
우와~정리좀 하셔서 올리시면 더 좋으실거 같은데요~ -
쭈니
2009.06.05 02:03
정리 다시 해서 올려 드리겠습니다~
FORM GET-KRW-EXCHANGE-RATE USING Z_BUKRS.
DATA : TEMP_EXCH_RATE LIKE ZFEMSSLIP_BK-ZZNDFEXRATE,
MSG_TEXT(80) TYPE C.
CLEAR : W_RATE. " w_result_date. ==>> RATE값을 초기화
SELECT SINGLE * FROM ZFEMSMAINCURR
WHERE BUKRS = Z_BUKRS.
IF ZLC <> W_CURR. ==> 통화키를 나타냅니다.( 미국, 유럽, 아시아.. 등등)
CALL FUNCTION 'ZFEMS_GET_EXCHANGE_RATE_RFC' ===> RFC펑션을 통해 다른 법인의 DATA를 가져오겠죠?
DESTINATION ZFEMSMAINCURR-ZDEST ===> 이 펑션안에 있는건 하단에 다시 설명하겠습니다~
EXPORTING
CONV_CURR = ZLC
TYPE1 = ZFEMSMAINCURR-ZZEXCHTYPE
FROM_CURR = W_CURR
TO_CURR = ZLC
DATE = W_DATE
INVERT = ' '
ZZMANDT = ZFEMSMAINCURR-ZZMANDT
IMPORTING
EXCHANGE_RATE = TEMP_EXCH_RATE
EXCEPTIONS
REQUIRED_ENTRY_NOT_MADE = 1
CURRENCY_INVALID = 2
DATE_INVALID = 3
OPT_INVALID = 4
NOT_FOUND = 5
COMMUNICATION_FAILURE = 9 MESSAGE MSG_TEXT
SYSTEM_FAILURE = 8 MESSAGE MSG_TEXT.
IF SY-SUBRC NE 0. ===> RFC펑션을 빠져나와서 SY-SUBRC값에 따라 메세지가 나오더군요...
CASE SY-SUBRC.
WHEN 1. MESSAGE I105 WITH 'required_entry_not_made'.
WHEN 2. MESSAGE I105 WITH 'currency_invalid' W_CURR ZLC.
WHEN 3. MESSAGE I105 WITH 'date_invalid' W_DATE.
WHEN 4. MESSAGE I105 WITH 'opt_invalid'.
WHEN 5.
CONCATENATE ZFEMSMAINCURR-BUKRS W_DATE
W_CURR ZLC INTO MSG_TEXT SEPARATED BY SPACE.
MESSAGE I105 WITH 'Not Found Exchange Rate(M Type) =>'
MSG_TEXT.
WHEN 8. MESSAGE I105 WITH 'system_failure'.
WHEN 9. MESSAGE I105 WITH 'communication_failure'.
ENDCASE.
EXIT.
ENDIF.
W_RATE = TEMP_EXCH_RATE. ===> 이부분 참.. 애매합니다.. 펑션을 빠져나와서 저 W_RATE값에 펑션안에서 얻은 값이 나오더라구요. 근데... 문제는 제일 하단에 있는 것부터 찍혀요... 만약에 DATE가 08.01.01 ~ 08.01.31.까지의 DATA를 조회하는거라면 저기의 값은
08.01.31.에 해당하는 DATA의 RATE값이 나오는거죠..
ELSE.
W_RATE = 1.
ENDIF.
ENDFORM.
이제 RFC 펑션안을 들여다 보겠습니다.
TABLES : TCURR,TCURF.
DATA : INVERTED_DATE LIKE TCURR-GDATU,
TEMP_DATE(10), ===> 이넘이 디버깅 해보았더니.. VALUEDATE에서 제일 마지막 08.01.31을 담고 있더라구요
RC LIKE SY-SUBRC,
IMSI_CURR LIKE TCURR-FCURR.
* IMPORT PARAMETER check
IF CONV_CURR IS INITIAL.
RAISE REQUIRED_ENTRY_NOT_MADE.
ENDIF.
IF TYPE1 IS INITIAL
OR FROM_CURR IS INITIAL
OR TO_CURR IS INITIAL
OR DATE IS INITIAL.
RAISE REQUIRED_ENTRY_NOT_MADE.
ENDIF.
WRITE DATE TO DATE. ===>> DATE에 해당하는건 다 08.01.31.날짜입니다. 왜그런지...ㄷㄷㄷ 앞에있는 DATA를 그냥 무시하는건가요
CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT' =>> 이 펑션 밑에서 보여드릴께요
EXPORTING
INPUT = DATE
IMPORTING
OUTPUT = TCURR-GDATU.
WRITE DATE TO TEMP_DATE. ==>> 이것도 위에 WRITE DATE하고 같습니다.
SELECT * FROM TCURR CLIENT SPECIFIED
WHERE MANDT = ZZMANDT
AND KURST = TYPE1
AND FCURR = FROM_CURR
AND TCURR = TO_CURR
AND GDATU >= TCURR-GDATU
ORDER BY GDATU.
EXIT.
ENDSELECT.
IF SY-SUBRC = 0.
SELECT * FROM TCURF
WHERE KURST = TYPE1 AND
FCURR = FROM_CURR AND
TCURR = TO_CURR AND
GDATU >= TCURR-GDATU
ORDER BY PRIMARY KEY.
ENDSELECT.
EXCHANGE_RATE = TCURR-UKURS * TCURF-TFACT / TCURF-FFACT. ==> 요값 디버깅 하다보면 볼수가 없어서.. 많이 애를 먹고 있습니다... 첨엔 보려고.. 디버깅으로 돌리다보니.. ENDSELECT를 600번을 더 만나서 계속 뭔가를 찾고있는거 같더라구요...왜 이렇게 해놓은건지.. 이해를 못하겠습니다. 알려주시면 너무 감사드리겠습니다.
ELSE.
SY-SUBRC = 0.
SELECT * FROM TCURR CLIENT SPECIFIED
WHERE MANDT = ZZMANDT
AND KURST = TYPE1
AND FCURR = TO_CURR
AND TCURR = FROM_CURR
AND GDATU >= TCURR-GDATU
ORDER BY GDATU.
EXIT.
ENDSELECT.
IF SY-SUBRC = 0.
SELECT * FROM TCURF
WHERE KURST = TYPE1 AND
FCURR = FROM_CURR AND
TCURR = TO_CURR AND
GDATU >= TCURR-GDATU
ORDER BY PRIMARY KEY.
ENDSELECT.
EXCHANGE_RATE = 1 / TCURR-UKURS * TCURF-TFACT / TCURF-FFACT.
ELSE.
RAISE NOT_FOUND.
ENDIF.
ENDIF.
ENDFUNCTION. ==> 여기서 나가게 됩니다.. EXCHANGE_RATE값은 여기서는보지도 몬하고 위에 로직에서 W_RATE를 통해서만 값을 보았습니다.
IF INPUT <> SPACE.
CALL FUNCTION 'CONVERT_DATE_INPUT'
EXPORTING INPUT = INPUT
IMPORTING OUTPUT = DATUM
EXCEPTIONS PLAUSIBILITY_CHECK_FAILED = 1
WRONG_FORMAT_IN_INPUT = 2.
IF SY-SUBRC <> 0.
MESSAGE E102.
ENDIF.
MOVE DATUM TO CHDAT.
HOUTPUT = '99999999' - CHDAT.
OUTPUT = HOUTPUT.
ELSE.
OUTPUT = SPACE.
ENDIF.
ENDFUNCTION. ===> 이펑션에서 날짜를 구하는거 같습니다...
W_RATE라는 변수는 글로벌 변수로 정의가 되어있습니다.
해당값은.. 1. 1.111
2. 2.111
3. 3.111
이렇게 되어있어야 하는게 정상입 출력 화면입니다.
근데 3. 3.111이넘이 2번과 1번에도 나오는겁니다...
DATA가 많으면 더 문제가 되겠지요...
그러나 출력화면에서 DATA 하나하나 DISPLAY 정보를 눌러보면 각자 가지고 있는 값이 그대로 있습니다...
이거 도대체 뭐가 잘못된건지 잘 몰라서 질문좀 드렸습니다...
-
테라스
2009.06.05 02:51
일단 RFC 펑션을 호출할때 날짜를 넘겨주는 W_DATE 의 값이
해당item의 날짜가 아닌 맨 마지막 아이템의 날짜이거나
조회조건의 맨 마지막 날짜가 아닌지 확인해보시는게 좋을거 같습니다.
-
쭈니
2009.06.05 16:47
테라스님 말처럼.. 조회조건의 맨 마지막 날짜가 맞습니다.
그럼 지금 rfc 펑션에서 날짜 넘겨줄때 w_date의 값 조건이 잘못 되어진건가요?
그렇게 되면 w_date를 wa로 담아서 해결을 해야 하는건가요...
어떻게 해야 하는것이 맞는건지 잘 몰라서요...
답변좀 부탁드립니다.
-
테라스
2009.06.05 18:48
아이템이 들어있는 인터널 테이블을 루프로 돌리면서
rfc 펑션을 호출하는 FORM (FORM GET-KRW-EXCHANGE-RATE USING Z_BUKRS.)
을 호출하는 경우라면 w_date 값을 아이템에 해당하는 날짜로 바꿔주시면 될것 같습니다
예를들어
loop itab.
w_date = itab-날짜필드.
perform GET-KRW-EXCHANGE-RATE USING Z_BUKRS.
endloop.
이런식으로요.
-
조상준
2009.06.10 19:29
테라스님 너무 감사합니다~~
잘 해결이 되었습니다.
-
조상준
2009.06.10 19:32
테라스님 너무 감사합니다~~
잘 해결이 되었습니다.
제가 잘못 이해하는 부분이 있었나 봅니다..
테라스님이 말씀하신것처럼 그 구문은 찾아보니까 있는데도 왜 안되는가 했더니...
필드를 정의 할때 잘못된점이 있었던거같습니다.
화면을 출력해야 할 ITAB_SPTFWD라는 필드에서 그 값을 받아주는곳이 없는데...
출력하는 WRITE문과 ITAB_SPTFWD라는 인터널 테이블 정의가 잘못되어서.. 생긴 문제였습니다..
제 질문에 답변을 달아주시고. 도움을 주신 모든분께 감사합니다.
예를들어서..
rate값이 1번은 4.8847
2번은 2.8844
3번은 3.3347
원래는 이렇게 나와야 하는건데... 모든 item의 값이 3.3347로 나오고 있어요...
이게 왜이렇게 되는건지.. 원인도 잘 못찾아서... 질문좀 드렸습니다.. 조언좀 부탁합니다.