cancel
Showing results for 
Search instead for 
Did you mean: 

dynamically checkbox creation

Former Member
0 Kudos

Hello,

i have to create dynamically check box based upon number of fields from database.

i found some some solution in sdn which is not workinf for me.

could anyone help me in this.

thanks

Accepted Solutions (0)

Answers (2)

Answers (2)

Lukas_Weigelt
Active Contributor
0 Kudos

It would have helped if you had stated which sdn-solution didn't work for you in particular... aside from that, above poster provided you with what you need.

Former Member
0 Kudos

Hi Rakshar,

I am not sure what you tried and why it is not working, but below is the code for creating Checkbox at runtime:

cl_wd_checkbox=>new_checkbox( EXPORTING

bind_checked = 'CN_RBTN.CA_BOX'

RECEIVING

control = lo_chk_box ).

cl_wd_flow_data=>new_flow_data( EXPORTING

element = lo_chk_box

RECEIVING

control = lo_flow_data ).

lo_chk_box->set_layout_data( lo_flow_data ).

lo_ele_container->add_child( lo_chk_box ).

Bind_Checked parameter is used for binding the checkbox to a context attribute.

Hope this will help you.

Amit

Former Member
0 Kudos

Hello Amit,

I have wriiten the code as below

**********************************************************************

DATA: LR_CONTAINER TYPE REF TO CL_WD_UIELEMENT_CONTAINER,

LR_CHECKBOX TYPE REF TO CL_WD_CHECKBOX.

  • * get a pointer to the RootUIElementContainer

LR_CONTAINER ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).

LR_CHECKBOX = CL_WD_CHECKBOX=>NEW_CHECKBOX(

TEXT = 'WD_Processor'

BIND_CHECKED = 'CHECK_BOX_NODE.CHECK_BOX_VALUE'

VIEW = VIEW ).

CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( ELEMENT = LR_CHECKBOX ).

LR_CONTAINER->ADD_CHILD( LR_CHECKBOX ).

*****************************************************************************

but i am getting one dump during runtime. Could you please guide me..

The following error occurred in system DT1 : Error in MATRIX_LAYOUT "_02" of view "ZCHK_BOX.MAIN": The first child element in a container with "MatrixLayout" must be of type "MatrixHeadData"

The error occurred on application server rb3dt1a0_DT1_24 and in work process. 8

The termination type was: RABAX_STATE

The ABAP call stack was:

Method: RAISE_FOR of program CX_WDR_ADAPTER_EXCEPTION======CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program /1WDA/C8STANDARD==============CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program /1WDA/C7STANDARD==============CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program CL_WDR_VIEW_ADAPTER===========CP

Method: IF_WDR_NW7_DELTA_RENDERER~CALCULATE_DELTA_BLOCKS of program CL_WDR_VIEW_ADAPTER===========CP

Method: PROCESS_DELTA_BLOCKS of program CL_WDR_WINDOW_CONTENT_ADAPTER2CP

Method: IF_WDR_NW7_DELTA_RENDERER~CALCULATE_DELTA_BLOCKS of program CL_WDR_WINDOW_CONTENT_ADAPTER2CP

Method: SET_CONTENT of program CL_WDR_NW7_INT_WIN_ADAPTER====CP

Method: SET_CONTENT of program CL_WDR_NW7_MAIN_WIN_ADAPTER===CP

Method: IF_WDR_CLIENT~SEND_RESPONSE of program CL_WDR_CLIENT_SSR_LS==========CP

Former Member
0 Kudos

Hi Rakshar,

Remove CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( ELEMENT = LR_CHECKBOX ).

and add below code:

DATA: lo_matrix_data TYPE REF TO cl_wd_matrix_data.

CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( exporting

ELEMENT = LR_CHECKBOX

RECEIVING

control = lo_matrix_data ).

LR_CHECKBOX->set_layout_data( lo_matrix_data ).

Let me know what is the result.

Regards,

Amit

Former Member
0 Kudos

Hello Amit ,

now it is working for me.

But i have few concern on this.

here i have created node and attibute in the context level CHECK_BOX_NODE with 1.1 cardinality and CHECK_BOX_VALUE tyep wdy_boolean.

But i need the dynmicalyy check box based upon my table records.

For ex:- in table if it is 4records in a field(rec1, rec2, rec3,rec4), automatically 4 checkbox should be created in runtime.

so if i will implement this code in my application , will it work...

please suggest.

Thanks a lot again for your solution.

Former Member
0 Kudos

Hi Rakshar,

Yes, put this code in the loop and it will work.

Previous code will not give the proper layout. Try this one, it will generate 4 checkboxes in different row.

DATA: lo_matrix_data TYPE REF TO CL_WD_MATRIX_HEAD_DATA.

CL_WD_MATRIX_HEAD_DATA=>new_matrix_head_data( exporting

ELEMENT = LR_CHECKBOX

RECEIVING

control = lo_matrix_data ).

LR_CHECKBOX->set_layout_data( lo_matrix_data ).

Former Member
0 Kudos

Hello AMit,

Now i will put the whole logic in my original application and i il let you know soon about the result .

and thanks a lot once again for your nice cop...

Former Member
0 Kudos

Hello Amit,

the code given by you is working fine for me.

Thanks a lot...

Edited by: Rakshar on Jan 20, 2012 5:44 PM

Former Member
0 Kudos

Hello Amit,

I am facing one more issue in dynamic check box creation.

Issue is :- I have four checkbox creating dynamically based upon the field records.

But while i am clicking on 1st check box and clicking on btn1 rest of the checkbox is getting selected automatically , which i dont want. could you please tell me what could be the reason.

so that one check box will be checked while i will click on btn1

Thanks

Former Member
0 Kudos

Hi Rakshar,

I also tried it and it is happening in my case also, it is because all the checkboxes are binded to same attribute.

I will check, how can we create dynamic binding. Will let you know, if found something.

One thing, how is your context designed. Is attribute binded to Checkbox is under a node and cardinality of the node in 0..n??

If yes, then we can try one thing, create a table with one column, and that column will have checkbox. This should work, below is the code:

DATA: lo_table TYPE REF TO cl_wd_table,

lo_column_name TYPE REF TO cl_wd_table_column.

lo_table = cl_wd_table=>new_table(

id ='TBL_TABLE'

bind_data_source ='CN_RBTN'

design = cl_wd_table=>e_design-alternating

visible_row_count = 4

).

cl_wd_flow_data=>new_flow_data( EXPORTING

element = lo_table

RECEIVING

control = lo_flow_data ).

lo_ele_container->add_child( EXPORTING

the_child = lo_table ).

lo_column_name = cl_wd_table_column=>new_table_column(

id = 'TBL_EXAMPLE_NAME'

).

  • Add columns to the Table.

lo_table->add_column( the_column = lo_column_name ).

  • Create Checkbox

cl_wd_checkbox=>new_checkbox( EXPORTING

bind_checked = 'CN_RBTN.CA_BOX'

RECEIVING

control = lo_chk_box ).

cl_wd_flow_data=>new_flow_data( EXPORTING

element = lo_chk_box

RECEIVING

control = lo_flow_data ).

  • Set Checkbox as Table Cell Editor.

lo_column_name->set_table_cell_editor( the_table_cell_editor = lo_chk_box

).

Hope this helps,

Amit

Former Member
0 Kudos

Hi Rakshar,

Put this code in the loop to bind the checkbox to attributes dynamically:

lo_nd_cn_rbtn = wd_context->get_child_node( name = 'CN_RBTN' ).

lo_el_cn_rbtn = lo_nd_cn_rbtn->get_element( index = sy-index ).

IF lo_el_cn_rbtn is NOT INITIAL.

lo_el_cn_rbtn->get_path( EXPORTING WITHOUTCONTROLLER = 'X'

RECEIVING path = lv_path ).

ENDIF.

CONCATENATE lv_path '.CA_BOX' INTO lv_path.

cl_wd_checkbox=>new_checkbox( EXPORTING

bind_checked = lv_path "'CN_RBTN.CA_BOX'

RECEIVING

control = lo_chk_box ).

This will solve your issue.

Amit

Former Member
0 Kudos

Hello Amit,

Could you pleae put the code one sequence

Because i am still getting the error while using you code.

Thanks

Former Member
0 Kudos

Hello Amit,

As of now i am using this code in modifyview

LOOP AT IT_FIELDS_CNTRL1 INTO WA_FIELDS_CNTRL1 .

AT END OF FIELDGROUP_R.

MOVE WA_FIELDS_CNTRL1-FIELDGROUP_R TO IV_TEXT.

LR_CONTAINER ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).

LR_CHECKBOX = CL_WD_CHECKBOX=>NEW_CHECKBOX(

TEXT = IV_TEXT " 'WD_Processor'

BIND_CHECKED = 'CHECK_BOX_NODE.CHECK_BOX_VALUE'

VIEW = VIEW ).

*CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( ELEMENT = LR_CHECKBOX ).

CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( EXPORTING

ELEMENT = LR_CHECKBOX

RECEIVING

CONTROL = LO_MATRIX_DATA ).

LR_CHECKBOX->SET_LAYOUT_DATA( LO_MATRIX_DATA ).

LR_CONTAINER->ADD_CHILD( LR_CHECKBOX ).

*******************end original code

ENDLOOP.

Former Member
0 Kudos

Hello Amit,

As of now i am using this code in modifyview

LOOP AT IT_FIELDS_CNTRL1 INTO WA_FIELDS_CNTRL1 .

AT END OF FIELDGROUP_R.

MOVE WA_FIELDS_CNTRL1-FIELDGROUP_R TO IV_TEXT.

LR_CONTAINER ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).

LR_CHECKBOX = CL_WD_CHECKBOX=>NEW_CHECKBOX(

TEXT = IV_TEXT " 'WD_Processor'

BIND_CHECKED = 'CHECK_BOX_NODE.CHECK_BOX_VALUE'

VIEW = VIEW ).

*CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( ELEMENT = LR_CHECKBOX ).

CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( EXPORTING

ELEMENT = LR_CHECKBOX

RECEIVING

CONTROL = LO_MATRIX_DATA ).

LR_CHECKBOX->SET_LAYOUT_DATA( LO_MATRIX_DATA ).

LR_CONTAINER->ADD_CHILD( LR_CHECKBOX ).

*******************end original code

ENDLOOP.

Former Member
0 Kudos

Hi Rakshar,

I am assuming that CHECK_BOX_NODE has cardinality 0..n and it already has some elements created in WDDOINIT or WDDOMODIFYVIEW method:

DATA: lv_path type string,

lo_nd_cn_cbox type ref to if_wd_context_node,

lo_el_cn_cbox type ref to if_wd_context_element.

LOOP AT IT_FIELDS_CNTRL1 INTO WA_FIELDS_CNTRL1 .

AT END OF FIELDGROUP_R.

MOVE WA_FIELDS_CNTRL1-FIELDGROUP_R TO IV_TEXT.

lo_nd_cn_cbox = wd_context->get_child_node( name = 'CHECK_BOX_NODE' ).

lo_el_cn_cbox = lo_nd_cn_cbox->get_element( index = sy-index ).

IF lo_el_cn_rbtn is NOT INITIAL.

lo_el_cn_cbox->get_path( EXPORTING WITHOUTCONTROLLER = 'X'

RECEIVING path = lv_path ).

ENDIF.

CONCATENATE lv_path '.CHECK_BOX_VALUE' INTO lv_path.

LR_CONTAINER ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).

LR_CHECKBOX = CL_WD_CHECKBOX=>NEW_CHECKBOX(

TEXT = IV_TEXT " 'WD_Processor'

BIND_CHECKED = lv_path "'CHECK_BOX_NODE.CHECK_BOX_VALUE'

VIEW = VIEW ).

*CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( ELEMENT = LR_CHECKBOX ).

CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( EXPORTING

ELEMENT = LR_CHECKBOX

RECEIVING

CONTROL = LO_MATRIX_DATA ).

LR_CHECKBOX->SET_LAYOUT_DATA( LO_MATRIX_DATA ).

LR_CONTAINER->ADD_CHILD( LR_CHECKBOX ).

Hope this code will solve your issue, let me know the error you are getting.

Regards,

Amit

Former Member
0 Kudos

Hello Amit,

After the put the code suggested you i put in modifyview.

DATA: lv_path type string,

lo_nd_cn_cbox type ref to if_wd_context_node,

lo_el_cn_cbox type ref to if_wd_context_element.

LOOP AT IT_FIELDS_CNTRL1 INTO WA_FIELDS_CNTRL1 .

MOVE WA_FIELDS_CNTRL1-FIELDGROUP_R TO IV_TEXT.

lo_nd_cn_cbox = wd_context->get_child_node( name = 'CHECK_BOX_NODE' ).

lo_el_cn_cbox = lo_nd_cn_cbox->get_element( index = sy-index ).

IF lo_el_cn_rbtn is NOT INITIAL.

lo_el_cn_cbox->get_path( EXPORTING WITHOUTCONTROLLER = 'X'

RECEIVING path = lv_path ).

ENDIF.

CONCATENATE lv_path '.CHECK_BOX_VALUE' INTO lv_path.

LR_CONTAINER ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).

LR_CHECKBOX = CL_WD_CHECKBOX=>NEW_CHECKBOX(

TEXT = IV_TEXT " 'WD_Processor'

BIND_CHECKED = lv_path "'CHECK_BOX_NODE.CHECK_BOX_VALUE'

VIEW = VIEW ).

*CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( ELEMENT = LR_CHECKBOX ).

CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( EXPORTING

ELEMENT = LR_CHECKBOX

RECEIVING

CONTROL = LO_MATRIX_DATA ).

LR_CHECKBOX->SET_LAYOUT_DATA( LO_MATRIX_DATA ).

LR_CONTAINER->ADD_CHILD( LR_CHECKBOX ).

also in the above code i cud not undersatnd whr the lo_el_cn_rbtn is coming so i chaged it to " lo_el_cn_cbox"

IF lo_el_cn_rbtn is NOT INITIAL.

lo_el_cn_cbox->get_path( EXPORTING WITHOUTCONTROLLER = 'X'

RECEIVING path = lv_path ).

ENDIF.

but i got an dump,

Note

The following error occurred in system DT1 : Could not find attribute .CHECK_BOX_VALUE

The error occurred on application server rb3dt1a0_DT1_24 and in work process. 7

The termination type was: RABAX_STATE

The ABAP call stack was:

Method: IF_WD_CONTEXT_NODE_INFO~GET_ATTRIBUTE of program CL_WDR_CONTEXT_NODE_INFO======CP

Method: IF_WD_CONTEXT_ELEMENT~GET_ATTRIBUTE of program CL_WDR_CONTEXT_ELEMENT========CP

Method: GET_ATTRIBUTE_INTERNAL of program CL_NW7_VIEW_ELEMENT_ADAPTER===CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program /1WDA/C0STANDARD==============CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program /1WDA/C8STANDARD==============CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program /1WDA/C8STANDARD==============CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program /1WDA/C8STANDARD==============CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program /1WDA/C7STANDARD==============CP

Method: IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT of program CL_WDR_VIEW_ADAPTER===========CP

Method: IF_WDR_NW7_DELTA_RENDERER~CALCULATE_DELTA_BLOCKS of program CL_WDR_VIEW_ADAPTER===========CP

Former Member
0 Kudos

Can you debug the application and let me know the value coming in LV_PATH variable.

And CHECK_BOX_VALUE attribute is under CHECK_BOX_NODE?

Former Member
0 Kudos

Hello Amit,

i am using the cardinality as 1:n,

during breakpoint it is not also going to till iv_path.

-


but with caridinality 1:n

the below code i am using where checkbox is not selected properly

LOOP AT IT_FIELDS_CNTRL1 INTO WA_FIELDS_CNTRL1 .

MOVE WA_FIELDS_CNTRL1-FIELDGROUP_R TO IV_TEXT.

LR_CONTAINER ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).

LR_CHECKBOX = CL_WD_CHECKBOX=>NEW_CHECKBOX(

TEXT = IV_TEXT " 'WD_Processor'

BIND_CHECKED = 'CHECK_BOX_NODE.CHECK_BOX_VALUE'

VIEW = VIEW ).

CL_WD_MATRIX_DATA=>NEW_MATRIX_DATA( EXPORTING

ELEMENT = LR_CHECKBOX

RECEIVING

CONTROL = LO_MATRIX_DATA ).

LR_CHECKBOX->SET_LAYOUT_DATA( LO_MATRIX_DATA ).

LR_CONTAINER->ADD_CHILD( LR_CHECKBOX ).

and the new code you provided thr in break point is not coming till iv_path also

Thanks

Rakshar

Former Member
0 Kudos

Hi Rakshar,

Are you creating instance of the node CHECK_BOX_NODE in your code, you will have to create elements for this node and bind it. Write the code for this within the loop.

then get the path and bind it to the check box.

Hope this will work,

Amit

Former Member
0 Kudos

Hello Amit,

i will tru to make it poosible.

i am one more issue , my check boxes are coming extremely right side of the scree,

i want to take it in to extreme left,

could you please tell the solution for this.

Thanks

Former Member
0 Kudos

hELLO AMAI,

AS YOU SUGESTED I PUT THIS CODE

DATA: IV_PATH type string.

DATA LO_ND_CHECK_BOX_NODE TYPE REF TO IF_WD_CONTEXT_NODE.

DATA LO_EL_CHECK_BOX_NODE TYPE REF TO IF_WD_CONTEXT_ELEMENT.

DATA LS_CHECK_BOX_NODE TYPE WD_THIS->ELEMENT_CHECK_BOX_NODE.

  • navigate from <CONTEXT> to <CHECK_BOX_NODE> via lead selection

LO_ND_CHECK_BOX_NODE = WD_CONTEXT->GET_CHILD_NODE( NAME = WD_THIS->WDCTX_CHECK_BOX_NODE ).

  • @TODO handle non existant child

  • IF lo_nd_check_box_node IS INITIAL.

  • ENDIF.

  • get element via lead selection

LO_EL_CHECK_BOX_NODE = LO_ND_CHECK_BOX_NODE->GET_ELEMENT( ).

  • alternative access via index

  • lo_el_check_box_node = lo_nd_check_box_node->get_element( index = 1 ).

  • @TODO handle not set lead selection

IF LO_EL_CHECK_BOX_NODE IS INITIAL.

ENDIF.

  • get all declared attributes

LO_EL_CHECK_BOX_NODE->GET_STATIC_ATTRIBUTES(

IMPORTING

STATIC_ATTRIBUTES = LS_CHECK_BOX_NODE ).

IF LO_EL_CHECK_BOX_NODE is NOT INITIAL.

LO_EL_CHECK_BOX_NODE->get_path( EXPORTING WITHOUTCONTROLLER = 'X'

RECEIVING path = Iv_path ).

ENDIF.

CONCATENATE Iv_path '.CHECK_BOX_VALUE' INTO Iv_path.

          • RS END

  • * LR_CONTAINER ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).

LR_CONTAINER ?= VIEW->GET_ELEMENT( 'TP2' ).

LR_CHECKBOX = CL_WD_CHECKBOX=>NEW_CHECKBOX(

TEXT = IV_TEXT " 'WD_Processor'

BIND_CHECKED = IV_PATH "'CHECK_BOX_NODE.CHECK_BOX_VALUE' "'CHECK_OPTION.BASIC'

VIEW = VIEW ).

  • cl_wd_matrix_data=>new_matrix_data( EXPORTING

  • element = lr_checkbox

  • RECEIVING

  • control = lo_matrix_data ).

CL_WD_MATRIX_HEAD_DATA=>NEW_MATRIX_HEAD_DATA( EXPORTING

ELEMENT = LR_CHECKBOX

RECEIVING

CONTROL = LO_MATRIX_DATA1 ).

  • lr_checkbox->set_layout_data( lo_matrix_data ).

LR_CHECKBOX->SET_LAYOUT_DATA( LO_MATRIX_DATA1 ).

LR_CONTAINER->ADD_CHILD( LR_CHECKBOX ).

AND

BEFORE CONCATENATE

IV_PATH = 1.CHECK_BOX_NODE.1

AFTER CONCATENATE

1.CHECK_BOX_NODE.1.CHECK_BOX_VALUE

IT IS COMING FOR ALL CHECK BOX

AND THE VALUE IS COMING, AND AL THE CHECKBOX GETTING SELECTED AGAIN

Former Member
0 Kudos

Rakhar,

You are not creating elements of CHECK_BOX_NODE, thats why all the checkbox are binded to first element.

You have to create and bind elements for node CHECK_BOX_NODE. Then only your problem will get solved.

lo_nd_node = wd_context->get_child_node( name = 'CHECK_BOX_NODE' ).

lo_el_node = lo_nd_node->create_element( ).

lo_nd_node->bind_element( lo_el_node ).

Put this code inside the loop.

Regards,

Amit

Former Member
0 Kudos

Hello Amit,

i have a small doubt in webdynpro.

isuue:- i have two input filed one is for " MATNR" and second input filed " Material Description"

I have to chhose the MATNR by pressing f4 (it is standard search help), it will come from MARA table.

Once it is filled the second inputfiled shoul filled automaticaly base upon the MATNR with readonly mode.

can you please any sample code for the same if you have any...

Thanks in adv!!!

thomas_jung
Developer Advocate
Developer Advocate
0 Kudos

You seem to have entered a brand new, unrelated question in this existing thread. This is not allowed according the SCN rules of forum usage. For a new question you should create a new thread.