Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Dynamic Open SQL - how to copy columns into one string field.

Former Member
0 Likes
1,049

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

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
864

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.

5 REPLIES 5
Read only

Former Member
0 Likes
864

Can u be clear what u mean to do?

can u copy and paste the code?

Read only

Former Member
0 Likes
865

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.

Read only

0 Likes
864

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.

Read only

0 Likes
864

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.

Read only

0 Likes
864

Thank you everyone. With your help, this problem has been solved.

Regards,

Pradeep