우선 간단하게 허접한 소스를 보여드릴께요^^;;;
tables : zaddressbc13. "제가 만든 테이블입니다. 이름, 나이, 주소로 되어있어요.
data : gs_address type zaddressbc13,
gt_address like table of gs_address,
gv_age like zaddressbc13-age.
selection-screen : begin of block a1 with frame title text-t01.
select-options : s_age for gv_age.
selection-screen : end of block a1.
initialization.
refresh gt_address.
clear gs_address.
* 1. s_age를 스트럭쳐로 들어옴.
* 2. gv_age는 value 값
start-of-selection. "'ZBC13_ADDRESS' 모튤을 가져왔습니다.
CALL FUNCTION 'ZBC13_ADDRESS'
EXPORTING
gv_age = s_age
tables
gt_address = gt_address
EXCEPTIONS
NO_INPUT = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
sort gt_address by age.
end-of-selection.
loop at gt_address into gs_address. "인쇄하려구요
write:/(20) gs_address-name,
sy-vline,(5) gs_address-age right-justified,
sy-vline,(100) gs_address-address,
sy-vline.
endloop.
*모듈쪽 소스코드입니다.
function zbc13_address.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(GV_AGE) LIKE ZADDRESSBC13-AGE
*" TABLES
*" GT_ADDRESS STRUCTURE ZADDRESSBC13
*" EXCEPTIONS
*" NO_INPUT
*"----------------------------------------------------------------------
if gv_age is initial.
message w000(zbc13_00) with 'Insert Age!' raising no_input.
return.
endif.
select * from zaddressbc13 into table gt_address
where age = gv_age.
endfunction.
import 에는 gv_age를 like로 zaddressbc13-age (int1 형태)
가져왔습니다.
당연히 덤프가 떨어집니다.
이유는 select options에서 받는 값(나이를 범위값으로 받아서 출력하려고 했습니다.)
s_age는 structure 로 들어오게 되더군요.
하지만 제가 모듈쪽에서 비교하는 gv_age는 int1 값으로 들어오게 되니
덤프가 땅~ 하고 떨어집니다.
해결방법은 gv_age를 스트럭쳐로 만들어 비교?
혹은 s_age를 int1 값으로 변환? 해야 하는데......
이것들이 가능한 것인지..
안되는것을 붙잡고 있는건지..^^;;;
고수분들 답변 부탁드려요^-^
댓글 7
-
남군
2010.03.17 22:01
-
Abap consultant
2010.03.17 22:30
ㄴ 남군님 답변 감사드립니다^^
한가지 문제는
CALL FUNCTION 'ZBC13_ADDRESS'
EXPORTING
gv_age = s_age <= s_age-low "이대로 쓰면 에러가 나구요^^
tables
gt_address = gt_address
EXCEPTIONS
NO_INPUT = 1
OTHERS = 2
s_age 대신에 s_age-low를 넣으면 돌아가긴 하는데
low값에 걸린 범위만 나옵니다^^;;
가령 15 - 30 으로 age 값을 주면
15살에 걸린 사람만 나와서 parameters 와 유사하더군요^^;;
그래도 제가 모르던 s_age-low 를 알려주셔서 넘넘 감사드립니다! ^^
-
정호아빠
2010.03.17 22:36
두 가지 해결책이 있네요..
하나. -> age를 싱글로 처리시..
select-options : s_age for gv_age 를 PARAMETERS로 변경.
parameters: p_age like addressbc13-age. like
CALL FUNCTION 'ZBC13_ADDRESS'
EXPORTING
gv_age = p_age
tables
gt_address = gt_address
EXCEPTIONS
NO_INPUT = 1
OTHERS = 2
.
둘. -> age를 멀티로 처리시..
function만 바꾸어 주세요.
CALL FUNCTION 'ZBC13_ADDRESS'
tables
t_age = s_age
gt_address = gt_address
EXCEPTIONS
NO_INPUT = 1
OTHERS = 2
.
function zbc13_address.
*"----------------------------------------------------------------------
*"*"Local interface:
*" TABLES
*" T_AGE
*" GT_ADDRESS STRUCTURE ZADDRESSBC13
*" EXCEPTIONS
*" NO_INPUT
*"----------------------------------------------------------------------
&==> 요기서 변수 하나 선언하시고
ranges: lr_age for addressbc13-age.
lr_age[] = t_age[].
if lr_age[] is initial.
message w000(zbc13_00) with 'Insert Age!' raising no_input.
return.
endif.
select * from zaddressbc13 into table gt_address
where age in lr_age. -
Abap consultant
2010.03.17 22:53
정호아빠님의 친절한 답변 너무 감사드려요^^ 제가 1번을 하고 나서 2번이 하고 싶어서
저렇게 만들고 있었던 거였거든요^^;;
그런데 제가 진행 못하고 있는 점이..
아래 모듈쪽에 변수하나 선언하라고 하셨는데
t_age[] 제 생각으로는 이것에 대한 변수 선언을 해야될 것 같습니다.
그런데 어떻게 선언을 해야 할 지 모르겠어요.^^;
초보인 저를 구원해주셔요~~^^ 부탁드리겠습니다..ㅠ_ㅜ
-
정호아빠
2010.03.17 23:02
변수 선언을 하지 않으면 길이 정보만 가진 table로 생성됩니다.
그래서 lr_age라는 레인지 변수를 선언합니다.
만약 s_age라는 곳에서 15를 입력하였다면
s_age-sign = 'I'
S_AGE-OPTION = 'EQ'
S_AGE-LOW = 15 가 들어갑니다.
그럼 T_AGE에는 'IEQ15' 라는 값이 들어가지요.
lr_age[] = t_age[] 하는 것입니다. 그럼 자리수 만큼 잘려서 들어갑니다..
정~변수 선언하고 싶으면 RSDSSELOPT 라는 구조가 있습니다...동적 옵션구조입니다....
-
Abap consultant
2010.03.17 23:19
아.. 지금 t_age[]에서 syntax error가 떠서요^^;
t_age[] 를 선언하지 않으면 안된다고 나와서 뭔가 선언을 해야하는걸로 알고 있었습니다.
제경우는 gt_age[]로 해놨거든요.^^
이 에러를 어찌 처리할지 몰라서 난감합니다^^;
the field "gt_age" is unknown......... 이라고 뜹니다.
FUNCTION ZBC13_ADDRESS.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(GV_AGE) LIKE ZADDRESSBC13-AGE
*" TABLES
*" GT_ADDRESS STRUCTURE ZADDRESSBC13
*" EXCEPTIONS
*" NO_INPUT
*"----------------------------------------------------------------------
ranges: gp_age for zaddressbc13-age.
gp_age[] = gt_age[].
if gp_age[] is initial.
message w000(zbc13_00) with 'Insert Age!' raising no_input.
return.
endif.
select * from zaddressbc13 into table gt_address
where age in gp_age[].
ENDFUNCTION.
-
Abap consultant
2010.03.19 03:42
ㄴ 해결방법 입니다. 정호 아빠님께서 딱 두가지를 안가르쳐 주셨었습니다..^^;
모듈쪽에서 보면 탭 tables 에 테이블을 하나 생성해 주어야 합니다.
위에 gt_age[] 가 에러나는 이유는 gt_age 라는 테이블을 탭tables 에서 생성 안해주었기 때문이죠^^;
하나더~ 원래 프로그램으로 돌아와서 exporting에 값을 주지 마시고 테이블로 생성이기 때문에
모듈쪽 tables에 gp_age= s_age[] 로 만들면
돌아갑니다.
2번째 방법도
탭tables에서 it_age 생성 후 (위 소스와 똑같습니다. 달라지는건 gt_age냐 it_age냐 차이죠;;)
다른 소스 필요 없이
if it_age[] is initial.
message w000(zbc13_00) with 'Insert Age!' raising no_input.
return.
endif.
select * from zaddressbc13 into table gt_address
where age in it_age[].
해주고 난 후~
프로그램쪽으로 돌아와서
펑션쪽을 이렇게 바꿔주어야 합니다.
exporting 값 이 사라진 것을 볼 수 있습니다^^;
테이블로 받았기 때문이지요.
s_age 옆에 [] 이걸 해준 이유는 select-options에서 값을 받으면
헤더라인을 가진 파라미터로 들어오므로 테이블 내의 값만을 적요시키려고
s_age[] 한것입니다..^^;
CALL FUNCTION 'ZBC13_ADDRESS'
TABLES
it_age = s_age[]
gt_address = gt_address
EXCEPTIONS
no_input = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFUNCTION.
혹시나 공부하실분은 도움되시길 바랍니다^^
EXPORTING
gv_age = s_age <= s_age-low 로 넘겨 보세요~
tables
gt_address = gt_address
EXCEPTIONS
NO_INPUT = 1
OTHERS = 2