테이블 이름이 때에 따라 바뀌고 하는 일은 같습니다.
FIELD-SYMBOLS: <gt_head> type standard table,
<ls_head> LIKE LINE OF gt_head1.
CASE gv_tab.
WHEN '1'.
ASSIGN gt_head1 TO <gt_head>.
WHEN '2'.
ASSIGN gt_head2 TO <gt_head>.
WHEN '3'.
ASSIGN gt_head3 TO <gt_head>.
ENDCASE.
READ TABLE <gt_head> INDEX ls_rows ASSIGNING <ls_head>.
SELECT SINGLE pstyv INTO l_pstyv
FROM vbap
WHERE vbeln = <ls_head>-vbeln.
위와 같이 짜 봤는데
GT_HEAD1 and <GT_HEAD> are type-incompatible
이라고 syntax 오류가 납니다.
어디가 틀린 것인지요???
* e-abap님에 의해서 게시물 복사되었습니다 (2010-01-09 13:44)
* e-abap님에 의해서 게시물 이동되었습니다 (2010-01-09 13:55)
댓글 4
-
im 해성
2010.01.04 18:32
-
요요
2010.01.04 19:13
몇가지 확인 사항이 있는데요. 일단 gt_head1, gt_head2, gt_head3 의 구조가 동일해야 할 것 같구요.
그래야 assigning <ls_head> 가 되겠네요 다음으로는 gt_head1, 2, 3 이 header line 이 없는 internal table 이어야하겠네요
그래야 assign gt_headX to <gt_head> 가 될 거구요. header line 이 있다면 assign gt_headX[] to <gt_head>.
로 assign 문장을 수정하셔야 할 거예요. read ~ assigning 한 후에는 assgign 여부를 체크하시는 것이 좋습니다.
assign 이 되지 않은 경우에는 해당 필드심볼을 사용할 수 없어 덤프에러가 날 수 있습니다.
data gt_head1 type table of gs_head.
data gt_head2 like gt_head1.
data gt_head3 like gt_head1.
data l_tabname type tabname.
field-symbols : <gt_head> type table,
<ls_head> type any. ( or like gs_head, or like line of gt_head1, and so on...)
case gv_tab.
when '1'. l_tabname = 'GT_HEAD1'.
when '2'. l_tabname = 'GT_HEAD2'.
when '3'. l_tabname = 'GT_HEAD3'.
endcase.
assign (l_tabname) to <gt_head>.
unassign <ls_head>.
read table <gt_head> index ls_rows assigning <ls_head>.
check sy-subrc is initial. ( or <ls_head> is assigned ).
select~~~~
대충 이정도 될 것 같네요. 수고하세요.
-
웁~쓰
2010.01.04 23:36
일단 <ls_head> 는 TYPE ANY 가 되어야겠죠?
왜냐하면 테이블 명이 달라진다고 하셧는데 위처럼 like line of gt_head1로 하면 gt_head2와 gt_head3이 gt_head1과 타입이 같지 않는한 read table 하면 에러가 나겟죠.
그리고 read table 한 후 한 필드를 사용 하셧는데 요기서 문제되는 부분으로 3개의 테이블에 vbeln 필드가 공통으로 있어야한다는 가정하에 말씀 드리겠습니다.
<ls_head> 가 ANY 타입이므료 특정 필드를 바로 사용할 수가 없겠죠. 따라서 read table 후에
DATA: lv_vbeln_field TYPE string.
FIELD-SYMBOLS: <comp> TYPE ANY.
lv_vbeln_field = '<LS_HEAD>-VBLEN'.
ASSIGN (lv_vblen_field) TO <comp>.
IF <comp> IS ASSIGNED.
SELECT SINGLE pstyv FROM vbap NTO l_pstyv.
WHERE vbeln = <comp>.
ELSE.
Error ??
ENDIF.
이런씩으로 바껴야 하지 않을까 싶네요.
-
금은돌
2010.01.05 03:13
*해더 1,2,3 형태가 모두 다를때 입니다.
FIELD-SYMBOLS: <GT_HEAD> TYPE STANDARD TABLE,
*타입을 선언하지 않으면 아래처럼 새부 컴퍼넌트를 부를수 없어서 이렇게 선언하셨는데
*해더타입에 형태가 모두 다르다면 ANY로 하고.
<LS_HEAD> TYPE ANY.
CASE GV_TAB.
WHEN '1'.
ASSIGN GT_HEAD1 TO <GT_HEAD>.
WHEN '2'.
ASSIGN GT_HEAD2 TO <GT_HEAD>.
WHEN '3'.
ASSIGN GT_HEAD3 TO <GT_HEAD>.
ENDCASE.
READ TABLE <GT_HEAD> INDEX LS_ROWS ASSIGNING <LS_HEAD>.
CHECK SY-SUBRC = 0 .
CASE GV_TAB. "여기서 각기 해더와 같은 형태의 스트럭쳐에 담아주고 동적 WHERE조건 주면됩니다.
WHEN '1'.
GS_HEAD1 = <LS_HEAD>.
LV_COND = 'VBELN = GS_HEAD1-VBELN'.
APPEND LV_COND TO LT_COND.CLEAR LV_COND.
WHEN '2'.
GS_HEAD2 = <LS_HEAD>.
LV_COND = 'VBELN = GS_HEAD2-VBELN'.
APPEND LV_COND TO LT_COND.CLEAR LV_COND.
WHEN '3'.
GS_HEAD3 = <LS_HEAD>.
LV_COND = 'VBELN = GS_HEAD3-VBELN'.
APPEND LV_COND TO LT_COND.CLEAR LV_COND.
ENDCASE.
SELECT SINGLE PSTYV
INTO L_PSTYV
FROM VBAP
WHERE (LT_COND).
두 타입이 맞이 않단 얘긴거 같은데...
모든 소스 보여주시면 어떨런지...