2008 Nov 06 4:38 AM
Hi All,
I have developed a ALV grid report where my first feild is checkbox.My requirement is that when user select some records using check box in output then a BDC should call to update each selected records and should display seelcted in secondary ALV report.
But my requirement is that when user click on Back button then first list should display now only unselected records,means those were not checked.
Please sugest how to do that.
Thanks
Mohit Khandelwal
Hi All,
I have developed a ALV grid report where my first feild is checkbox.My requirement is that when user select some records using check box in output then a BDC should call to update each selected records and should display seelcted in secondary ALV report.
But my requirement is that when user click on Back button then first list should display now only unselected records,means those were not checked.
Please sugest how to do that.
Thanks
Mohit Khandelwal
2008 Nov 06 4:45 AM
Hi ...
Ur requirment seems bit tricky
but once i developed a code with checkbox which sends mail to ppl whose record mark using check-box...
the code is not in good shape performance wise but will surely help u want..its a HR Report
REPORT ZHR_REPT_EMP_NOT_PBOOKED.
TYPE-POOLS slis.
*-----------tables
TABLES: pernr,
pa0001,
hrp1001,
hrp1000,
zodtab,
zcstab,
zsbutab.
*-----------Infotypes
INFOTYPES :0001, "org assignment,
1001,
1000,
0105.
TYPES : BEGIN OF i_conf,
checkbox ,
pernr TYPE pa0001-pernr, "personnel Number.
ename TYPE pa0001-ename, "Name of Employee.
zzbtc TYPE pa0001-zzbtc, "Band.
btrtl TYPE pa0001-btrtl, "Grade
Location type string,
persk type string,
ptext type string,
werks TYPE p0001-werks,
zzod_txt type string, "OD name
zzod type pa0001-zzod,
zzcs type string, "cluster/sector
vertical type string,
sbu LIKE pa0001-zzsbu, "SBU
sbutxt LIKE zsbutab-zsbutxt, "SBUTXT
orgeh LIKE pa0001-orgeh, "Vertical
org_text type string,
zzbloc LIKE pa0001-zzbloc, "base location
dept_loc type string, "dept loc
ename_s LIKE pa0001-ename, "Department
zztc LIKE pa0001-zztc,
endda type p0001-endda,
celltab type lvc_t_styl,
END OF i_conf.
DATA : it_conf TYPE STANDARD TABLE OF i_conf WITH HEADER LINE,
wa_conf TYPE i_conf.
*data: begin of gs_outtab.
*data: checkbox type c. "field for checkbox
** §B1.Extend your output table by a field to dis- or enable
** cells for input.
*data: celltab type lvc_t_styl. "field to switch editability
* include structure i_conf.
*data: end of gs_outtab.
*
*data: gt_outtab type gs_outtab occurs 0 with header line.
*&---------------------------------------------------------------------*
*& DATA DECLARATION FOR EMAIL
*&---------------------------------------------------------------------*
DATA: docdata TYPE sodocchgi1,
objpack TYPE STANDARD TABLE OF sopcklsti1 WITH HEADER LINE,
objhead TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE,
objtxt TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE,
objbin TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE,
reclist TYPE STANDARD TABLE OF somlreci1 WITH HEADER LINE.
DATA: tab_lines TYPE sy-tabix.
************************************************************************
DATA : p_1001 TYPE TABLE OF p1001 WITH HEADER LINE.
DATA : p_0001 TYPE TABLE OF p0001 WITH HEADER LINE.
DATA : p_0105 TYPE TABLE OF p0105 WITH HEADER LINE.
DATA : od TYPE p0001-zzod.
DATA : new_pernr type p0001-pernr.
DATA : pernr_s type p0001-pernr.
DATA : email_s type p0105-USRID_LONG.
DATA : email type p0105-USRID_LONG.
DATA : tc_name type string.
DATA : tc_num type string.
DATA : emails type string.
DATA : sel_all type string.
DATA: REF_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA : flag type i.
DATA : title TYPE string.
DATA : pernr_temp tYPE p0001-pernr.
DATA : rel type string.
DATA : stat type string.
DATA : count type i.
DATA : v_dynnr type sy-dynnr.
DATA : g_grid type ref to cl_gui_alv_grid.
DATA : g_custom_container type ref to cl_gui_custom_container,
g_container type scrfname value 'CC'.
*************field cat********************************
DATA: fieldcat TYPE lvc_t_fcat,
wa_fieldcat LIKE LINE OF fieldcat.
DATA: gd_layout TYPE lvc_s_layo,
gd_repid TYPE sy-repid.
DATA:gt_events TYPE slis_t_event,
gt_list_top_of_page TYPE slis_t_listheader.
DATA rec_fetched TYPE sy-tabix.
CONSTANTS g_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE'.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_zzod FOR zsbutab-zod NO INTERVALS ,
s_btrtl FOR pa0001-btrtl NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b1.
start-of-selection.
if pn-begda is initial.
pn-begda = '18000101'.
endif.
if pn-endda is initial.
pn-begda = '99991230'.
endif.
clear : it_conf,it_conf[].
get pernr.
clear new_pernr.
move pernr-pernr to new_pernr.
**************checking whether employee has booked or prebooked for any event****************
clear: p_1001,p_1001[].
perform read_info tables p_1001 using new_pernr '1' 'B027' .
IF SY-SUBRC <> 0.
clear: p_1001,p_1001[].
perform read_info tables p_1001 using new_pernr '1' 'B023' .
IF SY-SUBRC <> 0.
clear: p_1001,p_1001[].
perform read_info tables p_1001 using new_pernr '2' 'B027' .
IF SY-SUBRC <> 0.
clear: p_1001,p_1001[].
perform read_info tables p_1001 using new_pernr '2' 'B023' .
IF SY-SUBRC <> 0.
clear : p_0001,p_0001[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = new_pernr
infty = '0001'
BEGDA = pn-begda
ENDDA = pn-endda
TABLES
infty_tab = p_0001
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
sort p_0001 descending by begda.
read table p_0001 index 1.
move p_0001-pernr to wa_conf-pernr.
move p_0001-ename to wa_conf-ename.
move p_0001-zzbtc to wa_conf-zzbtc.
move p_0001-btrtl to wa_conf-btrtl.
move p_0001-werks to wa_conf-werks.
move p_0001-zzsbu to wa_conf-sbu.
move p_0001-orgeh to wa_conf-orgeh.
move p_0001-zzbloc to wa_conf-zzbloc.
move p_0001-zztc to wa_conf-zztc.
move p_0001-zzod to wa_conf-zzod.
move p_0001-endda to wa_conf-endda.
move p_0001-btrtl to wa_conf-btrtl.
***************clustor txt**********************
select single zcstxt into wa_conf-zzcs from zcstab
where zcs = p_0001-zzcs
and zod = p_0001-zzod.
***********operating division*******************************
select single ZODLTXT into wa_conf-zzod_txt from zodtab
where zod = wa_conf-zzod.
***********sbu txt***************************************************************
select single zsbutxt into wa_conf-sbutxt from zsbutab
where zsbu = wa_conf-sbu.
***********location**************************************
select single btext into wa_conf-location from t001p
where btrtl = wa_conf-btrtl
and werks = wa_conf-werks.
***********Dept*********************************************
select single orgtx into wa_conf-org_text from t527x
where sprsl = 'EN'
and orgeh = wa_conf-orgeh
and begda <= p_0001-begda
and endda >= p_0001-begda.
***************grade******************************************
SELECT SINGLE ptext FROM t503t INTO wa_conf-persk
WHERE sprsl = 'EN'
AND persk = p_0001-persk .
********************vertical*****************************
select single zverttxt into wa_conf-vertical from zvtab
where zvert = p_0001-zzvert.
********deputation location******************
if p_0001-ZZDEPFLG = 'X'.
select single zdltxt into wa_conf-dept_loc from zdltab where zdl = p_0001-zzdploc.
endif.
***get imm superior
CALL FUNCTION 'ZHR_GET_IMMMED_SUPERIOR'
EXPORTING
pernr = new_pernr
* begda = '18000101'
* endda = '99991231'
IMPORTING
v_pernr = pernr_s
EXCEPTIONS
not_found = 1
OTHERS = 2.
if sy-subrc = 0.
** find the email of the immed. superiors personal number..
clear : p_0001,p_0001[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = pernr_s
infty = '0001'
BEGDA = pn-begda
ENDDA = pn-endda
TABLES
infty_tab = p_0001
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
read table p_0001 index 1.
move p_0001-ename to wa_conf-ename_s.
endif.
if wa_conf-btrtl in s_btrtl and wa_conf-zzod in s_zzod .
append wa_conf to it_conf.
endif.
endif.
endif.
endif.
endif.
clear wa_conf.
end-of-selection.
if it_conf[] is initial.
MESSAGE i501(zmod).
exit.
endif.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'USER'.
* SET TITLEBAR 'xxx'.
if g_custom_container is initial.
data: lt_exclude type ui_functions.
create object g_custom_container
EXPORTING
container_name = g_container.
create object g_grid
EXPORTING
i_parent = g_custom_container.
perform fieldcat_build .
* Exclude all edit functions in this example since we do not need them:
perform exclude_tb_functions changing lt_exclude.
* perform build_data.
*§ B3.Use the layout structure to aquaint additional field to ALV.
gd_layout-stylefname = 'CELLTAB'.
PERFORM build_layout.
if it_conf[] is initial.
* MESSAGE i501(zmod). "No data exists
else.
call method g_grid->set_table_for_first_display
EXPORTING
is_layout = gd_layout
it_toolbar_excluding = lt_exclude
CHANGING
it_fieldcatalog = fieldcat
it_outtab = it_conf[].
* create object g_event_receiver.
* set handler g_event_receiver->catch_doubleclick for g_grid.
*
* Set editable cells to ready for input initially
call method g_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
endif.
endif.
ENDMODULE. " STATUS_0100 OUTPUT
*call screen 100.
******************************************************************
*&---------------------------------------------------------------------*
*& Form build_layout
*&---------------------------------------------------------------------*
FORM build_layout.
CLEAR gd_layout.
v_dynnr = 100.
gd_layout-cwidth_opt = 'X'.
* gd_layout-zebra = 'X'.
* gd_layout-grid_title = text-002.
ENDFORM. "build_layout
*&---------------------------------------------------------------------*
*& Form exclude_tb_functions
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PT_EXCLUDE text
*----------------------------------------------------------------------*
form exclude_tb_functions changing pt_exclude type ui_functions.
data ls_exclude type ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
append ls_exclude to pt_exclude.
endform. "exclude_tb_functions
*&---------------------------------------------------------------------*
*& Form field_cat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fieldcat_build .
wa_fieldcat-fieldname = 'CHECKBOX'.
wa_fieldcat-tabname = 'IT_CONF'.
wa_fieldcat-checkbox = 'X'.
wa_fieldcat-edit = 'X'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'PERNR'.
wa_fieldcat-coltext = 'P.S. No'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'ENAME'.
wa_fieldcat-coltext = 'Employee Name'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'ZZBTC'.
wa_fieldcat-coltext = 'Band'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'PERSK'.
wa_fieldcat-coltext = 'Grade'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'ZZOD'.
wa_fieldcat-coltext = 'OD Name'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'ZZCS'.
wa_fieldcat-coltext = 'Cluster / Sector '.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'VERTICAL'.
wa_fieldcat-coltext = 'Vertical'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'SBUTXT'.
wa_fieldcat-coltext = 'SBU'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'ORG_TEXT'.
wa_fieldcat-coltext = 'Dept.'.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'LOCATION'.
wa_fieldcat-coltext = 'Empl. Base Location '.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'DEPT_LOC'.
wa_fieldcat-coltext = 'Empl. Deputation Location '.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
wa_fieldcat-fieldname = 'ENAME_S'.
wa_fieldcat-coltext = 'IS Name '.
wa_fieldcat-tabname = 'IT_CONF'.
APPEND wa_fieldcat TO fieldcat.
clear wa_fieldcat.
endform. "field_cat
*&---------------------------------------------------------------------*
*& Form check_lock
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PS_OUTTAB text
* -->P_LOCKED text
*----------------------------------------------------------------------*
form check_lock using ps_outtab type i_conf
changing p_locked.
data ls_celltab type lvc_s_styl.
loop at ps_outtab-celltab into ls_celltab.
if ls_celltab-fieldname = 'CHECKBOX'.
if ls_celltab-style eq cl_gui_alv_grid=>mc_style_disabled.
p_locked = 'X'.
else.
p_locked = space.
endif.
endif.
endloop.
endform. "check_lock
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
IF sy-ucomm = 'EMAIL'.
clear it_conf.
* CALL METHOD g_grid->refresh_table_display.
data: ls_outtab type i_conf.
data: l_valid type c,
l_locked type c.
*§A4ad. Before you (a)set, reset or (d)evaluate checkboxes,
* you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.
call method g_grid->check_changed_data
IMPORTING
e_valid = l_valid.
if l_valid eq 'X'.
loop at it_conf into ls_outtab.
if not ls_outtab-checkbox is initial
and not ls_outtab-checkbox eq '-'.
***************************sending mail to employee and his/her superior************************************
select single sachn telnr into (tc_name , tc_num) from t526
where SACHX = it_conf-zztc
and werks = it_conf-werks .
* ******find the emil of employee.
clear : p_0105,p_0105[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = ls_outtab-pernr
infty = '0105'
BEGDA = pn-begda
ENDDA = pn-endda
TABLES
infty_tab = p_0105
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
if sy-subrc = 0.
read table p_0105 with key subty = '0010'.
move p_0105-USRID_LONG to email.
endif.
** find immediate superior by Z FM.
clear pernr_s.
CALL FUNCTION 'ZHR_GET_IMMMED_SUPERIOR'
EXPORTING
pernr = ls_outtab-pernr
IMPORTING
v_pernr = pernr_s
EXCEPTIONS
not_found = 1
OTHERS = 2.
if sy-subrc = 0.
** find the email of the immed. superiors personal number..
clear : p_0105,p_0105[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = pernr_s
infty = '0105'
BEGDA = pn-begda
ENDDA = pn-endda
TABLES
infty_tab = p_0105
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
read table p_0105 with key subty = '0010'.
move p_0105-USRID_LONG to email_s.
endif.
if email <> ' '.
count = 1.
perform send_mail using ls_outtab-ename email email_s tc_name tc_num count .
endif.
if email_s <> ' '.
count = 2.
perform send_mail using ls_outtab-ename email email_s tc_name tc_num count.
endif.
call method g_grid->refresh_table_display.
modify it_conf from ls_outtab.
endif.
endloop.
call method g_grid->refresh_table_display.
endif.
set screen 100.
endif.
***************************end of sending mail*****************************************************
IF sy-ucomm = 'SELECT'.
* CALL METHOD g_grid->refresh_table_display.
*§A4ad. Before you (a)set, reset or (d)evaluate checkboxes,
* you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.
call method g_grid->check_changed_data
IMPORTING
e_valid = l_valid.
if l_valid eq 'X'.
loop at it_conf into ls_outtab.
perform check_lock using ls_outtab
changing l_locked.
if l_locked is initial
and not ls_outtab-checkbox eq '-'.
ls_outtab-checkbox = 'X'.
endif.
modify it_conf from ls_outtab.
endloop.
call method g_grid->refresh_table_display.
endif.
set screen 100.
endif.
IF sy-ucomm = 'BCK' and v_dynnr = 100.
clear v_dynnr.
set screen 1000.
leave screen. " 0."1000.
**call selection-screen 1000.
*call screen 1000.
endif.
IF sy-ucomm = 'EXIT' and v_dynnr = 100.
clear v_dynnr.
leave program.
endif.
IF sy-ucomm = 'CANC' and v_dynnr = 100.
clear v_dynnr.
leave program.
endif.
ENDMODULE. " USER_COMMAND_0100 INPUT
****************************************************************************************************************************
*&---------------------------------------------------------------------*
*& Form send_mail
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->EMAIL_S text
* -->EMAIL text
* -->TC_NAME text
* -->TC_NUM text
*----------------------------------------------------------------------*
form send_mail using ename email email_s tc_name tc_num count.
* *Body of mail
CLEAR objtxt.
CLEAR objtxt[].
objtxt = text-005.
concatenate objtxt ename into objtxt separated by space.
append objtxt.
clear objtxt.
objtxt = text-006.
concatenate objtxt email_s into objtxt separated by space.
append objtxt.
clear objtxt.
append objtxt.
objtxt = text-002.
append objtxt.
clear objtxt.
objtxt = text-003.
append objtxt.
clear objtxt.
append objtxt.
objtxt = text-004.
concatenate objtxt tc_name 'at' tc_num into objtxt separated by space.
append objtxt.
clear objtxt.
DESCRIBE TABLE objtxt LINES tab_lines.
READ TABLE objtxt INDEX tab_lines.
*Mail description
CLEAR docdata.
docdata-doc_size = ( tab_lines - 1 ) * 255 + STRLEN( objtxt ).
docdata-obj_name = 'Reminder'.
docdata-obj_descr = 'REMINDER TO DO PRE-BOOKING'.
docdata-obj_langu = sy-langu.
*Packing list for main document
CLEAR objpack.
CLEAR objpack[].
objpack-head_start = 1.
objpack-head_num = 0.
objpack-body_start = 1.
objpack-body_num = tab_lines.
objpack-doc_type = 'RAW'.
APPEND objpack.
*Email receiver's list
CLEAR reclist.
CLEAR reclist[].
*
if count = 1.
* reclist-receiver = '*email-id*'.
reclist-receiver = email.
else.
reclist-receiver = email_s.
endif.
reclist-rec_type = 'U'.
APPEND reclist.
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
EXPORTING
document_data = docdata
document_type = 'RAW'
put_in_outbox = 'X'
commit_work = 'X'
TABLES
object_content = objtxt
receivers = reclist
EXCEPTIONS
TOO_MANY_RECEIVERS = 1
DOCUMENT_NOT_SENT = 2
DOCUMENT_TYPE_NOT_EXIST = 3
OPERATION_NO_AUTHORIZATION = 4
PARAMETER_ERROR = 5
X_ERROR = 6
ENQUEUE_ERROR = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
endform. "send_mail
*&---------------------------------------------------------------------*
*& Form eventtab_build
*&---------------------------------------------------------------------*
FORM eventtab_build USING rt_events TYPE slis_t_event.
*Registration of events to happen during list display
DATA: ls_event TYPE slis_alv_event.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = rt_events.
READ TABLE rt_events WITH KEY name = slis_ev_top_of_page INTO ls_event.
IF sy-subrc = 0.
MOVE g_top_of_page TO ls_event-form.
APPEND ls_event TO rt_events.
ENDIF.
ENDFORM. "eventtab_build
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
FORM top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = gt_list_top_of_page.
ENDFORM. "top_of_page
*&---------------------------------------------------------------------*
*& Form COMMENT_BUILD
*&---------------------------------------------------------------------*
FORM comment_build USING lt_top_of_page TYPE slis_t_listheader.
DATA: ls_line TYPE slis_listheader,
rp_date TYPE string. "report date
* LIST HEADING LINE: TYPE H
CLEAR ls_line.
ls_line-typ = 'H'.
ls_line-info = text-007.
APPEND ls_line TO lt_top_of_page.
CONCATENATE sy-datum+6(2) sy-datum+4(2) sy-datum(4) INTO rp_date SEPARATED BY '.'.
* STATUS LINE: TYPE S
CLEAR ls_line.
ls_line-typ = 'S'.
ls_line-key = text-008.
ls_line-info = rp_date.
APPEND ls_line TO lt_top_of_page.
ENDFORM. "comment_build
*&---------------------------------------------------------------------*
*& Form read_info
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_1001 text
* -->PERNR text
* -->STAT text
* -->REL text
*----------------------------------------------------------------------*
form read_info tables p_1001 using pernr stat rel.
CALL FUNCTION 'RH_READ_INFTY_1001'
EXPORTING
AUTHORITY = 'DISP'
WITH_STRU_AUTH = 'X'
PLVAR = '01'
OTYPE = 'P'
OBJID = pernr
ISTAT = stat
SUBTY = rel
BEGDA = pn-begda
ENDDA = pn-endda
TABLES
I1001 = p_1001
EXCEPTIONS
NOTHING_FOUND = 1
WRONG_CONDITION = 2
WRONG_PARAMETERS = 3
OTHERS = 4.
endform. "read_info
*&---------------------------------------------------------------------*
*& Module BACK INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE BACK INPUT.
IF SY-UCOMM = 'E'.
leave program.
endif.
IF SY-UCOMM = 'ENDE'.
leave program.
endif.
IF SY-UCOMM = 'ECAN'.
leave program.
endif.
ENDMODULE. " BACK INPUT
regards
vivek
2008 Nov 06 8:47 AM
Hi Mohit,
in the code after completing the BDC
you will move the selected records to new ALV I guess you are are moving to new internal Table
then in the previous internal table
delete the record from the table
and make use of the REFRESH field in the slis_selfield
JUST MOVE X TO SLIS_SELFIELD REFRESH FIELD
Look at the example code
DELETE it_mara WHERE matnr = r_selfield-value. " Deleting the record
MOVE 'X' TO r_selfield-refresh . " Refreshing AlV List
I too had a similar one look at the code below. I did the same select the record and update through BDC call transaction.
the code is as below have look
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->U_COMM User command
* -->R_SELFIELD Details of selected line
*----------------------------------------------------------------------*
FORM user_command USING ucomm TYPE sy-ucomm
r_selfield TYPE slis_selfield.
CASE ucomm.
* when 'LEAVE'.
* SUBMIT ZP_ALV_EXAMPLE VIA SELECTION-SCREEN AND RETURN.
* Leave to screen 0.
WHEN 'UPDATE'. " UPDATE TO DATA BASE
READ TABLE it_mara INTO wa_mara WITH KEY matnr = r_selfield-value.
REFRESH it_bdcdata.
REFRESH it_message.
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RMMG1-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'RMMG1-MATNR'
wa_mara-matnr.
PERFORM bdc_field USING 'RMMG1-MBRSH'
wa_mara-mbrsh.
PERFORM bdc_field USING 'RMMG1-MTART'
wa_mara-mtart.
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field USING 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
PERFORM bdc_field USING 'MSICHTAUSW-KZSEL(01)'
'X'.
PERFORM bdc_field USING 'MSICHTAUSW-KZSEL(02)'
'X'.
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'MAKT-MAKTX'
wa_mara-maktx.
PERFORM bdc_field USING 'BDC_CURSOR'
'MARA-MEINS'.
PERFORM bdc_field USING 'MARA-MEINS'
wa_mara-meins.
PERFORM bdc_field USING 'MARA-MTPOS_MARA'
'VOLL'.
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'BDC_CURSOR'
'MAKT-MAKTX'.
PERFORM bdc_field USING 'MAKT-MAKTX'
wa_mara-maktx.
PERFORM bdc_dynpro USING 'SAPLSPO1' '0300'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=YES'.
CALL TRANSACTION 'MM01' USING it_bdcdata " Update using call transaction method in Back ground mode and asynchronous update
MODE 'N'
UPDATE 'S'
MESSAGES INTO it_message.
DELETE it_mara WHERE matnr = r_selfield-value. " Deleting the record
MOVE 'X' TO r_selfield-refresh . " Refreshing AlV List <----- HERE
ENDIF.
ENDCASE.
ENDFORM. "USER_COMMAND
regards
Prasanth
2008 Nov 06 9:24 AM
Hi,
Please find the code for a simlar requirement, in this initial screen will be an ALV report with check boxes, upon selcting it and selecting DELIVER button, process of delivery via VL01 transaction(BDC method will be performed.
*&---------------------------------------------------------------------*
*& Report ZATL_DELIVERY
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zatl_delivery.
INCLUDE zatl_delivery_declarations.
SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vbeln FOR vbak-vbeln OBLIGATORY.
SELECTION-SCREEN END OF BLOCK a.
INITIALIZATION.
AT SELECTION-SCREEN.
START-OF-SELECTION .
* get the sales order numbers thru given
* selection-screen parameters
SELECT vbeln FROM vbak INTO TABLE it_data
WHERE vbeln IN s_vbeln.
* AND ERDAT = P_DATE.
IF NOT it_data[] IS INITIAL.
SELECT vbeln vstel FROM vbap INTO TABLE it_vstel
FOR ALL ENTRIES IN it_data
WHERE vbeln = it_data-vbeln.
ENDIF.
LOOP AT it_data INTO wa_data.
CALL FUNCTION 'ZBAPI_GET_MATERIAL_PLANT_DTL'
EXPORTING
v_vbeln = wa_data-vbeln
TABLES
it_bapi = it_result.
LOOP AT it_result INTO wa_result.
READ TABLE it_vstel INTO wa_vstel WITH KEY
vbeln = wa_result-vbeln.
wa_final-vbeln = wa_result-vbeln. " SALES ORDER NO
wa_final-matnr = wa_result-matnr.
wa_final-vstel = wa_vstel-vstel.
wa_final-werks = wa_result-werks.
wa_final-labst = wa_result-kwmeng.
APPEND wa_final TO it_final.
CLEAR wa_result.
ENDLOOP.
REFRESH it_result.
CLEAR wa_data.
ENDLOOP.
PERFORM build_fldcat.
PERFORM disp_output.
*SET PF-STATUS 'ABC'.
*&---------------------------------------------------------------------*
*& Form ABC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->EXTAB text
*----------------------------------------------------------------------*
FORM abc USING extab TYPE slis_t_extab.
SET PF-STATUS 'ABC'. " excluding extab.
ENDFORM. "ABC
* read
*&---------------------------------------------------------------------*
*& Form build_fldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_fldcat .
wa_fldcat-col_pos = '1'.
wa_fldcat-fieldname = 'MARK'.
wa_fldcat-checkbox = 'X'.
wa_fldcat-edit = 'X'.
wa_fldcat-seltext_m = 'MARK'.
APPEND wa_fldcat TO i_fldcat.
CLEAR wa_fldcat.
wa_fldcat-col_pos = '2'.
wa_fldcat-fieldname = 'VBELN'.
wa_fldcat-tabname = 'IT_FINAL'.
wa_fldcat-seltext_m = 'SALES ORD NO'.
APPEND wa_fldcat TO i_fldcat.
wa_fldcat-col_pos = '3'.
wa_fldcat-fieldname = 'MATNR'.
wa_fldcat-tabname = 'IT_FINAL'.
wa_fldcat-seltext_m = 'MAT NO'.
APPEND wa_fldcat TO i_fldcat.
wa_fldcat-col_pos = '4'.
wa_fldcat-fieldname = 'WERKS'.
wa_fldcat-tabname = 'IT_FINAL'.
wa_fldcat-seltext_m = 'PLANT'.
APPEND wa_fldcat TO i_fldcat.
wa_fldcat-col_pos = '5'.
wa_fldcat-fieldname = 'LABST'.
wa_fldcat-tabname = 'IT_FINAL'.
wa_fldcat-seltext_m = 'QNTY'.
APPEND wa_fldcat TO i_fldcat.
ENDFORM. " build_fldcat
*&---------------------------------------------------------------------*
*& Form disp_output
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM disp_output .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'ABC'
it_fieldcat = i_fldcat
i_callback_user_command = 'CHECKED'
TABLES
t_outtab = it_final
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " disp_output
*&---------------------------------------------------------------------*
*& Form CHECKED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM checked USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: gd_repid LIKE sy-repid, "Exists
ref_grid TYPE REF TO cl_gui_alv_grid.
IF ref_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid.
ENDIF.
IF NOT ref_grid IS INITIAL.
CALL METHOD ref_grid->check_changed_data .
ENDIF.
CASE r_ucomm.
WHEN 'DELIVERY'.
IF rs_selfield-fieldname = 'MARK'.
DATA : date_external(10) TYPE c.
DATA: temp_date TYPE sy-datum.
temp_date = sy-datum.
temp_date = temp_date + 1.
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
date_internal = sy-datum
IMPORTING
date_external = date_external
EXCEPTIONS
date_internal_is_invalid = 1
OTHERS = 2.
LOOP AT it_final INTO wa_final WHERE mark EQ 'X'.
PERFORM bdc_dynpro USING 'SAPMV50A' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'LV50C-VBELN'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'LIKP-VSTEL'
wa_final-vstel. " 'HLL'.
PERFORM bdc_field USING 'LV50C-DATBI'
date_external. "
PERFORM bdc_field USING 'LV50C-VBELN'
wa_final-vbeln. " '34'.
PERFORM bdc_dynpro USING 'SAPMV50A' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'LIPS-MATNR(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SICH'.
PERFORM bdc_field USING 'LIKP-BLDAT'
date_external. " '19.09.2008'.
CLEAR date_external.
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
date_internal = temp_date
IMPORTING
date_external = date_external
EXCEPTIONS
date_internal_is_invalid = 1
OTHERS = 2.
PERFORM bdc_field USING 'LIKP-WADAT'
date_external ." '19.09.2008'.
CLEAR date_external.
PERFORM bdc_field USING 'LIKP-BTGEW'
wa_final-labst. " -'12'.
PERFORM bdc_field USING 'LIKP-GEWEI'
'wa_likp-GEWEI'.
PERFORM bdc_transaction USING 'VL01'.
PERFORM msg_get TABLES it_msg.
CLEAR wa_final.
REFRESH it_msg.
ENDLOOP.
PERFORM disp_msg.
ENDIF.
ENDCASE.
ENDFORM. "CHECKED
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0443 text
* -->P_0444 text
*----------------------------------------------------------------------*
FORM bdc_dynpro USING value(p_0443)
value(p_0444).
wa_bdc-program = p_0443.
wa_bdc-dynpro = p_0444.
wa_bdc-dynbegin = 'X'.
APPEND wa_bdc TO it_bdc.
CLEAR wa_bdc.
ENDFORM. " BDC_DYNPRO
*&---------------------------------------------------------------------*
*& Form BDC_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0448 text
* -->P_0449 text
*----------------------------------------------------------------------*
FORM bdc_field USING value(p_0448)
value(p_0449).
wa_bdc-fnam = p_0448.
wa_bdc-fval = p_0449.
APPEND wa_bdc TO it_bdc.
CLEAR wa_bdc.
ENDFORM. " BDC_FIELD
*&---------------------------------------------------------------------*
*& Form BDC_TRANSACTION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0508 text
*----------------------------------------------------------------------*
FORM bdc_transaction USING value(p_0508).
CALL TRANSACTION p_0508 USING it_bdc
MODE 'N'
UPDATE 'S'
MESSAGES INTO it_msg.
ENDFORM. " BDC_TRANSACTION
*&---------------------------------------------------------------------*
*& Form msg_get
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_MSG text
*----------------------------------------------------------------------*
FORM msg_get TABLES p_it_msg STRUCTURE bdcmsgcoll.
LOOP AT p_it_msg INTO wa_msg.
v_msgid = wa_msg-msgid.
v_msgnr = wa_msg-msgnr.
v_msgv1 = wa_msg-msgv1.
v_msgv2 = wa_msg-msgv2.
v_msgv3 = wa_msg-msgv3.
v_msgv4 = wa_msg-msgv4.
IF wa_msg-msgtyp = 'E' OR
wa_msg-msgtyp = 'A' OR
wa_msg-msgtyp = 'X'.
PERFORM build_msg USING v_msgid
v_msgnr
v_msgv1
v_msgv2
v_msgv3
v_msgv4
CHANGING msg_text_e.
* Build the text for successful records getting created
ELSEIF wa_msg-msgtyp = 'S' OR
wa_msg-msgtyp = 'W' OR
wa_msg-msgtyp = 'I'.
PERFORM build_msg USING v_msgid
v_msgnr
v_msgv1
v_msgv2
v_msgv3
v_msgv4
CHANGING msg_text_s.
ENDIF.
ENDLOOP.
ENDFORM. " msg_get
*&---------------------------------------------------------------------*
*& Form build_msg
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_V_MSGID text
* -->P_V_MSGNR text
* -->P_V_MSGV1 text
* -->P_V_MSGV2 text
* -->P_V_MSGV3 text
* -->P_V_MSGV4 text
* <--P_MSG_TEXT_E text
*----------------------------------------------------------------------*
FORM build_msg USING p_v_msgid
p_v_msgnr
p_v_msgv1
p_v_msgv2
p_v_msgv3
p_v_msgv4
CHANGING p_msg_text_s.
CALL FUNCTION 'TB_MESSAGE_BUILD_TEXT'
EXPORTING
langu = sy-langu
msgid = p_v_msgid
msgno = p_v_msgnr " wa_msgcoll-msgnr
msgv1 = p_v_msgv1
msgv2 = p_v_msgv2
msgv3 = p_v_msgv3
msgv4 = p_v_msgv4
IMPORTING
text = p_msg_text_s.
wa_mess-v_msg = p_msg_text_s .
APPEND wa_mess TO i_mess.
CLEAR wa_mess.
ENDFORM. " build_msg
*&---------------------------------------------------------------------*
*& Form disp_msg
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM disp_msg .
PERFORM build_fieldcat_secandary.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'BCD'
it_fieldcat = i_fldcat1
i_callback_user_command = 'SECANDARY'
TABLES
t_outtab = i_mess
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " disp_msg
*&---------------------------------------------------------------------*
*& Form build_fieldcat_secandary
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_fieldcat_secandary .
wa_fldcat1-col_pos = '1'.
wa_fldcat1-fieldname = 'V_MSG'.
wa_fldcat1-tabname = 'I_MESS'.
wa_fldcat1-seltext_m = 'MESSAGE'.
APPEND wa_fldcat1 TO i_fldcat1.
ENDFORM. " build_fieldcat_secandary
*&---------------------------------------------------------------------*
*& Form SECANDARY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
*----------------------------------------------------------------------*
FORM secandary USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN 'BCK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDFORM. "SECANDARY
*&---------------------------------------------------------------------*
*& Form ABC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->EXTAB text
*----------------------------------------------------------------------*
FORM bcd USING extab TYPE slis_t_extab.
SET PF-STATUS 'BCD'. " excluding extab.
ENDFORM.Code in the include zatl_delivery_declarations is below.
*&---------------------------------------------------------------------*
*& Include ZATL_DELIVERY_DECLARATIONS
*&---------------------------------------------------------------------*
TABLES:vbak,likp, sscrfields.
TYPE-POOLS: slis.
DATA : it_result LIKE TABLE OF zbapi_get_dlt,
wa_result TYPE zbapi_get_dlt,
it_return LIKE TABLE OF bapiret2.
DATA : BEGIN OF it_data OCCURS 0,
vbeln TYPE vbak-vbeln,
* ERDAT TYPE VBAK-ERDAT,
* KUNNR TYPE VBAK-KUNNR,
END OF it_data.
DATA : v_vstel TYPE vbap-vstel.
DATA : wa_data LIKE it_data.
DATA : v_check TYPE c.
DATA : v_date TYPE vbep-bmeng.
DATA: i_fldcat TYPE slis_t_fieldcat_alv ,
wa_fldcat TYPE slis_fieldcat_alv.
DATA: i_fldcat1 TYPE slis_t_fieldcat_alv ,
wa_fldcat1 TYPE slis_fieldcat_alv.
TYPES: BEGIN OF wa_final,
mark TYPE flag,
vbeln TYPE vbap-vbeln,
matnr TYPE vbap-matnr,
vstel TYPE vbap-vstel,
werks TYPE vbap-werks,
labst TYPE mard-labst,
END OF wa_final.
DATA : it_final TYPE TABLE OF wa_final,
wa_final LIKE LINE OF it_final.
DATA: BEGIN OF it_vstel OCCURS 0,
vbeln TYPE vbap-vbeln,
vstel TYPE vbap-vstel,
END OF it_vstel,
wa_vstel LIKE it_vstel.
DATA : it_bdc TYPE TABLE OF bdcdata,
wa_bdc LIKE LINE OF it_bdc.
DATA : it_msg TYPE TABLE OF bdcmsgcoll,
wa_msg LIKE LINE OF it_msg.
TYPES: BEGIN OF ty_likp,
* bldat TYPE bldat,
wadat TYPE wadak,
gewei TYPE gewei,
END OF ty_likp.
DATA: wa_likp TYPE ty_likp.
DATA : v_msgnr LIKE sy-msgno,
v_msgv1 LIKE sy-msgv1,
v_msgv2 LIKE sy-msgv2,
v_msgv3 LIKE sy-msgv3,
v_msgv4 LIKE sy-msgv4.
DATA v_msgid LIKE sy-msgid.
DATA : msg_text_s(128),
msg_text_e(128).
DATA : BEGIN OF i_mess OCCURS 0,
v_msg(200),
END OF i_mess.
DATA : wa_mess LIKE i_mess.And the code used to create the custom function module in the main code is given below.
FUNCTION ZBAPI_GET_MATERIAL_PLANT_DTL.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(V_VBELN) TYPE ZBAPI_STRU-VBELN
*" TABLES
*" IT_BAPI STRUCTURE ZBAPI_GET_DLT
*" IT_RETURN STRUCTURE BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
DATA : WA_BAPI TYPE ZBAPI_GET_DLT,
V_IND TYPE I.
* TO GET SALES ORDER NUMBER NUMBER OF ITEMS AND PLANT DETAILS*.
SELECT VBELN MATNR WERKS KWMENG
FROM VBAP
INTO TABLE IT_BAPI
WHERE VBELN = V_VBELN.
IF SY-SUBRC = 0.
ENDIF.
ENDFUNCTION.The structure of ZBAPI_STRU is given below.
VBELN TYPE VBELN_VA
MATNR TYPE MATNR
WERKS TYPE WERKS_EXT
LABST TYPE LABST
Hope this helps you,
Murthy.
2008 Nov 06 12:15 PM
Hi,
Use Submit and call one more program for BDC and Error log display. after executing BDC display the log in submitted report itself. when u press back come back to first program selection screen.
to send the BDC table values use EXPORT and IMPORT memory .
If you need further help. please update me.
Regards,
Nandha
| User | Count |
|---|---|
| 4 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |