2006 Sep 26 8:11 AM
Hi,
My ABAP code uses a SELECT statement using dynamic open SQL. The user specifies a comma separated list of columns she is interested in (SELECT clause). The user also specifies a comma separate list of tables she is interested in (FROM clause). I need to copy each resulting row into a comma seperated string.
data: row type string.
select (selectList) into row from (fromList)
write: row
endselect.
I am struggling with how I can achieve this and would appreciate any pointers.
I guess I may have to first create a dynamic structure using "create data" and then concatenate the values into row. Does this sound right?
Thank you in advance for your help.
Pradeep
2006 Sep 26 8:29 AM
You have to do something like this :
REPORT ztab .
DATA: a_table_line TYPE REF TO data.
DATA: table_lines TYPE STANDARD TABLE OF REF TO data.
DATA: c TYPE cursor.
FIELD-SYMBOLS: <line> TYPE ANY.
FIELD-SYMBOLS: <field> TYPE ANY.
PARAMETERS: p_tab TYPE dd02l-tabname.
START-OF-SELECTION.
OPEN CURSOR c FOR SELECT * FROM (p_tab)
ORDER BY PRIMARY KEY.
DO.
CREATE DATA a_table_line TYPE (p_tab).
ASSIGN a_table_line->* TO <line>.
FETCH NEXT CURSOR c INTO <line>.
IF sy-subrc NE 0.
CLOSE CURSOR c.
EXIT.
ENDIF.
APPEND a_table_line TO table_lines.
ENDDO.
LOOP AT table_lines INTO a_table_line.
ASSIGN a_table_line->* TO <line>.
NEW-LINE.
DO 6 TIMES.
CHECK sy-index > 1.
ASSIGN COMPONENT sy-index OF
STRUCTURE <line> TO <field>.
IF sy-subrc NE 0.
EXIT.
ENDIF.
WRITE: <field>.
ENDDO.
ENDLOOP.
You have to do something like this :
REPORT ztab .
DATA: a_table_line TYPE REF TO data.
DATA: table_lines TYPE STANDARD TABLE OF REF TO data.
DATA: c TYPE cursor.
FIELD-SYMBOLS: <line> TYPE ANY.
FIELD-SYMBOLS: <field> TYPE ANY.
PARAMETERS: p_tab TYPE dd02l-tabname.
START-OF-SELECTION.
OPEN CURSOR c FOR SELECT * FROM (p_tab)
ORDER BY PRIMARY KEY.
DO.
CREATE DATA a_table_line TYPE (p_tab).
ASSIGN a_table_line->* TO <line>.
FETCH NEXT CURSOR c INTO <line>.
IF sy-subrc NE 0.
CLOSE CURSOR c.
EXIT.
ENDIF.
APPEND a_table_line TO table_lines.
ENDDO.
LOOP AT table_lines INTO a_table_line.
ASSIGN a_table_line->* TO <line>.
NEW-LINE.
DO 6 TIMES.
CHECK sy-index > 1.
ASSIGN COMPONENT sy-index OF
STRUCTURE <line> TO <field>.
IF sy-subrc NE 0.
EXIT.
ENDIF.
WRITE: <field>.
ENDDO.
ENDLOOP.
2006 Sep 26 8:21 AM
Can u be clear what u mean to do?
can u copy and paste the code?
2006 Sep 26 8:29 AM
You have to do something like this :
REPORT ztab .
DATA: a_table_line TYPE REF TO data.
DATA: table_lines TYPE STANDARD TABLE OF REF TO data.
DATA: c TYPE cursor.
FIELD-SYMBOLS: <line> TYPE ANY.
FIELD-SYMBOLS: <field> TYPE ANY.
PARAMETERS: p_tab TYPE dd02l-tabname.
START-OF-SELECTION.
OPEN CURSOR c FOR SELECT * FROM (p_tab)
ORDER BY PRIMARY KEY.
DO.
CREATE DATA a_table_line TYPE (p_tab).
ASSIGN a_table_line->* TO <line>.
FETCH NEXT CURSOR c INTO <line>.
IF sy-subrc NE 0.
CLOSE CURSOR c.
EXIT.
ENDIF.
APPEND a_table_line TO table_lines.
ENDDO.
LOOP AT table_lines INTO a_table_line.
ASSIGN a_table_line->* TO <line>.
NEW-LINE.
DO 6 TIMES.
CHECK sy-index > 1.
ASSIGN COMPONENT sy-index OF
STRUCTURE <line> TO <field>.
IF sy-subrc NE 0.
EXIT.
ENDIF.
WRITE: <field>.
ENDDO.
ENDLOOP.
2006 Sep 26 11:30 PM
Thanks to Ravi's sample code, I have managed to put together my test code. However, I get an exception on "create data" statement. I would appreciate it if someone can tell me how to fix this. The code follows.
Thank you in advance for your help.
Pradeep
-
REPORT ZMYTEST1.
The first three variables are input parameters
data: colCount type i value 3.
data: mySelectCols type string value 'MARAMATNR MARAMSTAE MAKT~MAKTX'.
data: myTables type string value
'MARA JOIN MAKT ON MARAMATNR = MAKTMATNR'.
data: tableLine type ref to data.
data: c type cursor.
FIELD-SYMBOLS: <line> TYPE ANY.
FIELD-SYMBOLS: <field> TYPE ANY.
create data tableLine type (mySelectCols).
assign tableLine->* TO <line>.
START-OF-SELECTION.
OPEN CURSOR c FOR SELECT (mySelectCols) FROM (myTables).
DO.
FETCH NEXT CURSOR c INTO <line>.
IF sy-subrc NE 0.
CLOSE CURSOR c.
EXIT.
ENDIF.
do colCount times.
assign component sy-index of structure <line> to <field>.
write: <field>.
enddo.
ENDDO.
2006 Sep 27 12:18 AM
the create data is expecting a data type, ie in this case 'MARA'. There's a few things wrong with your attempt. I think you need to define a dynamic table using method CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE. Do a search on that and you will find many threads to help you.
2006 Oct 01 3:27 AM
Thank you everyone. With your help, this problem has been solved.
Regards,
Pradeep
| User | Count |
|---|---|
| 3 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |