CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = LT_FCAT
IMPORTING
EP_TABLE = D_TAB.
이후 .
Field-symbols : <TEMP> TYPE TABLE.
Assign D_TAB->* TO <TEMP>.
이후
원래 작성되어진 Itab 을 통해 <TEMP>에 collect 를 하려고 합니다.
<TEMP>의 경우 헤더라인이 없어서 wa를 작성해주어야 해서
CREATE DATA NEW_LINE LIKE LINE OF <TEMP>. <- 이걸 쓰면 wa가 생성되나 했습니다. ㅠ
그러나 역시 접근이 안되네요..
<temp>의 경우 일부 필드명은 정해져 있으나 , 일부 필드명은 동적임니다
ex) 정적 필드 TEST , NAME ,
동적 필드 갯수가 3개 일경우 Field1 , Field2, Field3 ..
동적 필드 갯수가 4개 일경우 Field1 , Field2, Field3 , Field4..
Loop at itab.
<temp_wa>-test = itab-test.
<temp_wa>-name = itab-name.
concatenate 'Field' itab-month into Field_Text.
Assing (Field_Text) to <dField>.
<temp_wa>-<dField> = itab-cnt.
Append <temp_wa> to <temp>.
endloop.
이렇게!! 되었음 하는데 ㅠㅠㅠㅠ
안되네요....
하아..
어떻게 저런식으로 될 방법이 없을까요..
endloop.
댓글 7
-
버미!
2010.10.07 17:21
-
MadMax
2010.10.07 18:27
위 Source 약간 수정해 봤습니다. 참고하세요.
Field-symbols : <TEMP> TYPE TABLE,
<WS_TEMP> TYPE ANY,
<FS_TEMP> TYPE ANY.
DATA: FIELD_NAME(100).
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = LT_FCAT
IMPORTING
EP_TABLE = D_TAB.
Assign D_TAB->* TO <TEMP>.
CREATE DATA NEW_LINE LIKE LINE OF <TEMP>.
ASSIGN NEW_LINE->* TO <WS_TEMP>.
LOOP AT ITAB.
CONCATENATE `<WS_TEMP>-` `FIELD1` INTO FIELD_NAME.
ASSIGN (FIELD_NAME) TO <FS_TEMP>.
<FS_TEMP> = ITAB-CNT.
APPEND <WS_TEMP> TO <TEMP>.
ENDLOOP. -
맑은하늘
2010.10.07 21:41
<temp> 에 대한 스트럭쳐 <temp_wa>는 다음과 같이 만드시면 됩니다.
DATA D_STR TYPE REF TO DATA.
CREATE DATA D_STR LIKE LINE OF <TEMP>.
ASSIGN D_STR->* TO <TEMP_WA>.
그다음 <temp_wa> 로 itab 의 레코드를 복사하여 <temp> 로 collect 는 다음과 같이 하시면 됩니다.
LOOP AT ITAB.
CLEAR <TEMP_WA>.
"" <TEMP_WA> 에 COLLECT 할 필드로 ITAB 의 필드값을 복사
LOOP AT LT_FCAT.
CHECK LT_FCAT-FIELDNAME = 'collect 할 대상필드나열'( 또는 LOOP 의 조건으로 설정).
ASSIGN COMPONENT LT_FCAT-FIELDNAME OF STRUCTURE
: <TEMP_WA> TO <FS_FT>, "" target : <temp_wa> 의 대상 assign
ITAB TO <FS_FS>. "" source : itab 의 대상 assign
"" target 으로 source 복사
<FS_FT> = <FS_FS>.
ENDLOOP.
COLLECT <TEMP_WA> INTO <TEMP>.
ENDLOOP.
도움 되시길... -
맑은하늘
2010.10.07 21:46
참고로 CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE 은 한 프로그램 실행시
26회를 넘게 실행이 되면 덤프납니다. generate subroutine 생성 제한이 26회일 겁니다.
너무 자주 수행되지 않도록 프로그램하시기 바랍니다.
-
세인
2010.10.08 06:41
답변들 감사합니다.. 저의 경우 4.6c라서.. 더 헤맸던거 같습니다.. ecc가 아니라서 <FSymbol>-Field = Value 가 가능하지가 않아서
여러 삽질 끝에 .. ASSIGN COMPONENT 로 하여야 하더군요 ㅠ 답변 정말 감사해요
-
테라스
2010.10.08 18:54
<FSymbol>-Field = Value가 ecc 버전이 아니라서 불가능한게 아닙니다.
아래 소스를 참고하시면 <fs1>, <fs3>은 <FSymbol>-Field = Value 방식에서 에러가 나지만 <fs2>에서는 에러가 나지 않는것을 확인하실수 있으실 겁니다.
data: ls_bkpf type bkpf.
field-symbols: <fs1>,
<fs2> type bkpf,
<fs3> type any.
select single *
from bkpf
into ls_bkpf.
assign ls_bkpf to <fs1>.
assign ls_bkpf to <fs2>.
assign ls_bkpf to <fs3>.
<fs1>-bukrs = '1000'.
<fs2>-bukrs = '1000'.
<fs3>-bukrs = '1000'. -
맑은하늘
2010.10.08 23:50
4.6c라고 해서 <temp_wa>-field = value 가 안되는 것이 아닙니다. 테라스님 말처럼요.
이유는 <temp_wa>의 선언자체가 field 를 가지고 있는 구조를 참조하지 않았기 때문에
field 를 인식할 수 없었던 거예요.
field-symbols <temp_wa> type any. => 참조가 any 이기 때문에 field 를 알 수 없어서 그렇습니다.
<temp_wa>-field 를 쓸수 없습니다. 이럴경우 component 를 사용하거나 fname = '<TEMP_WA>-FIELD'.
assign (fname) to <fs> 등으로 assign 하여 사용하여야 합니다. field 가 있을 경우에요.
field-symbols <temp_wa> type bkpf => 참조를 bkpf 로 했기 때문에 bkpf 의 field 를 인식합니다.
<temp_wa>-bukrs 를 사용할 수 있습니다. assign <temp_wa>-bukrs to <fs_bukrs> 로 사용할 수 있습니다.
어려우시더라도 잘만 사용하면 편리할 수 있습니다. 수고하세요.
^^
FIELD-SYMBOLS : <fs_wa>.
* ALV Line type.
ASSIGN LOCAL COPY OF INITIAL LINE OF <temp> TO <fs_wa> .
Loop at itab.
MOVE-CORRESPONDING itab TO <fs_wa>.
APPEND <fs_wa> TO <temp>.
endloop.