필드심볼 타입이 인터널테이블인데..
경우에 따라서 참조하는 인터널 테이블의 구조가 다릅니다.
if A.
FIELD-SYMBOLS: <lt_head> LIKE gt_headA[],
else.
FIELD-SYMBOLS: <lt_head> LIKE gt_headB[],
endif.
이런 식으로 하고 싶은데...
이렇게 하면 이미 선언된 변수라고 선언이 안되고...
그냥 standard table로 선언하면...
<lt_head>-field
를 쓸수가 없고...
어떻게 좋은 방법이 없을까요?
댓글 6
-
msap
2010.03.02 21:40
-
은미짱
2010.03.02 23:05
DATA :
ls_head like LINE OF gt_head1.
FIELD-SYMBOLS:
<ls_head> TYPE table,
.
CASE tab
WHEN '1'.
ASSIGN gt_head1[] to <lt_head>
.
ASSIGN ls_head to <ls_head>.
WHEN '2'.
ENDCASE.
이렇게 쓰고
<ls_head>-vbeln 을 사용을 하면
에는 vbeln이라는 component가 없다고 에러가 뜨는데..
제가 잘못 사용하고 있는 부분이 있나요?
type any를 사용해도 마찬가지입니다.
-
msap
2010.03.02 23:09
필드심볼을 선언할때 특정 스트럭쳐나 테이블을 지정하여 선언하지 않으면 필드 제어를 할수가 없습니다.
동적으로 선언되는 것이기 때문에 assign이 되기전엔 해당 필드심볼에 어떤 필드가 있는지 알수가 없으니까요.
다른 방법이 있는지는 모르겠지만 제가 사용하는 방법은,
만약 vbeln이라는 필드가 ls_head라는 구조에 mandt(3) vbeln(10) ... 이런 위치에 있다면
ls_head+3(10)과 ls_head-vbeln는 같다고 볼 수 있습니다.
스트럭쳐도 하나의 연속적인 변수이기 때문이죠
때문에 위와 같이 선언한 상태에선
<ls_head>+3(10) = 값.
append <ls_head> to <lt_head>.
이런식으로 구현하면 되겠습니다.
-
쭌수야~!
2010.03.03 01:26
msap 님 설명대로...
은미짱님과 같은 상황에서는 assign 된 필드심볼의 필드로 바로 접근하실수가 없습니다.
필드명을 알고 있는 상황이니 아래와 같은 방법으로 한번 해보시겠어요?
DATA : ls_head like LINE OF gt_head1.
FIELD-SYMBOLS: <ls_head> TYPE table,
.
CASE tab
WHEN '1'.
ASSIGN gt_head1[] to <lt_head>.
ASSIGN ls_head to <ls_head>.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE ls_head TO <fs_lbeln>.
WHEN '2'.
ENDCASE.
<fs_lbeln> = ~.
-
은미짱
2010.03.03 03:01
답변 감사합니다..
하지만 쓰는 필드가 너~무 많아서
일일히 다 필드심볼로 선언했다가는 더 지저분해 질것 같아서 그냥 perform을 두개로 나누려구요.
감사합니다^^
-
요요
2010.03.03 03:15
위와 같은 경우 저는 이런식으로 합니다.
동적구조이기 때문에 동적 컨트롤이 가능해야 할 것 같네요.
도움이 되시길...
DATA : BEGIN OF gs_head,
vbeln TYPE vbeln,
END OF gs_head,
gt_heada LIKE TABLE OF gs_head WITH HEADER LINE,
gt_headb LIKE TABLE OF gs_head WITH HEADER LINE.
DATA ldref TYPE REF TO data.
FIELD-SYMBOLS : <fs_table> TYPE table,
<fs_struc> TYPE ANY,
<fs_field> TYPE ANY.
DO 10 TIMES.
APPEND gs_head TO : gt_heada, gt_headb.
ENDDO.
IF 1 = 1.
GET REFERENCE OF gt_heada[] INTO ldref.
ELSE.
GET REFERENCE OF gt_headb[] INTO ldref.
ENDIF.
ASSIGN ldref->* TO <fs_table>.
LOOP AT <fs_table> ASSIGNING <fs_struc>.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE <fs_struc> TO <fs_field>.
IF <fs_field> IS ASSIGNED.
UNASSIGN <fs_field>.
ENDIF.
ENDLOOP.
DATA : GT_ZSFIP006 LIKE TABLE OF ZSFIP006,
GS_ZSFIP006 LIKE ZSFIP006,
GT_ZSFIP007 LIKE TABLE OF ZSFIP007,
GS_ZSFIP007 LIKE ZSFIP007.
FIELD-SYMBOLS: <FS_S>,
<FS_T> TYPE TABLE.
CASE 'X'.
WHEN R_S01.
ASSIGN GS_ZSFIP006 TO <FS_S>.
ASSIGN GT_ZSFIP006 TO <FS_T>.
WHEN R_S02.
ASSIGN GS_ZSFIP007 TO <FS_S>.
ASSIGN GT_ZSFIP007 TO <FS_T>.
ENDCASE.
위의 소스를 참고하시면 될 듯합니다 ^^