Sorun Cevaplayalım

İşinizle ilgili öngörüler edinin, gerçek zamanlı bilgilere göre karar alın.

SAP Eğitim ve Sertifika Dönemleri

Uzmanlığınızı ve deneyiminizi SAP çözümleri kullanarak tasdik edin.

Çözüm Ekibi Başvurusu

Kullanıcılara hızlı ve pratik çözümler üreterek görev almak isteyenler.

SAP BLOG R/3 Take a step back into time – ALV Interactive Cut / Paste

SAP Blog

Kayıtlı Üye
Katılım
22 Ara 2017
Mesajlar
985
Tepki puanı
6
Please feel free to comment on a better / different way to do this. I am working with an “older” system. But it makes everything a bit more of a challenge. And I do love a challenge!

Requirement:


Upload data from a spreadsheet into sales order conditions and a custom table.

The solution:


Use copy / paste from a clipboard into a program. Create an ALV The ALV will allow for some of the fields to be changed.

So here is the selection screen:

alv1.jpg


Before they execute they must have the excel copied in the Clipboard:

Here’s the result

ALV2-1.jpg


The program validates the data and only allows updates to the valid data – Load can be updated. Because I had trouble just filling in the load. I allowed a double click and a box to change it.

ALV3.jpg


Then save from the ALV will save the information.

It’s a simple application. The the end user loves because of the ease of use.

So here is some of the code:

Get the clipboard information:

CALL METHOD cl_gui_frontend_services=>clipboard_import(
IMPORTING
data = gt_clipdata
length = gv_clip_len
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
OTHERS = 4 ).
IF sy-subrc NE 0.
MESSAGE i000(z3)
WITH 'Error while importing data from clipboard'.
EXIT.
ENDIF.



Update table:

LOOP AT gt_clipdata INTO gs_clipdata.
zlog-cnt = zlog-cnt + 1.
CLEAR zlog-data.
zlog-data = gs_clipdata.
zlog-leng = 500.
INSERT zcs1_log FROM zlog.
SPLIT gs_clipdata AT gc_hex_tab
INTO TABLE gt_record.
APPEND INITIAL LINE TO gt_data.
READ TABLE gt_data ASSIGNING <fs_data> INDEX sy-tabix.

LOOP AT gt_record INTO gs_record.
ASSIGN COMPONENT sy-tabix
OF STRUCTURE <fs_data> TO <fs_field>.
IF sy-subrc EQ 0.
<fs_field> = gs_record-zdata.
ENDIF.
ENDLOOP.
ENDLOOP.
COMMIT WORK.

Of course, some more processing validate the data, put into an output table. Finally display the ALV:

IF g_custom_container IS INITIAL.
CREATE OBJECT g_custom_container
EXPORTING container_name = g_container.

CREATE OBJECT g_grid
EXPORTING i_parent = g_custom_container.

CREATE OBJECT event_rec.
SET HANDLER event_rec->handle_double_click FOR g_grid.
SET HANDLER event_rec->handle_top_of_page FOR g_grid.
gs_layout-info_fname = 'ROWCOLOR'.

gs_layout-sel_mode = 'A'.
gs_variant-report = sy-repid.
gs_variant-username = sy-uname.
PERFORM build_fieldcat.
CALL METHOD g_grid->set_table_for_first_display
EXPORTING i_structure_name = 'ZSTR_TRUCK_UPLOAD'
is_layout = gs_layout
is_print = gs_print
is_variant = gs_variant
i_save = 'A'
CHANGING it_outtab = gt_out
it_fieldcatalog = gt_field_cat.

* Register the EDIT Event
CALL METHOD g_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified
EXCEPTIONS
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.

* Sets up a handler for any data changed to detail
CREATE OBJECT g_event_receiver.
SET HANDLER g_event_receiver->handle_data_changed FOR g_grid.
ENDIF.



And then the update

METHOD handle_data_changed.
DATA: ls_good TYPE lvc_s_modi,
ls_diff TYPE lvc_s_modi.
LOOP AT er_data_changed->mt_mod_cells INTO ls_good.
CASE ls_good-fieldname.
WHEN 'TOTAL' OR 'LOAD'.
CALL METHOD update_change
EXPORTING
ps_total = ls_good
pr_data_change = er_data_changed.

ENDCASE.
ENDLOOP.
ENDMETHOD.
*---------------------------------------------------------------------*
* Updates the ALV difference field in the master data
*---------------------------------------------------------------------*
METHOD update_change.
DATA: lv_vbeln(10),
lv_posnr(10).
* DATA: lv_total TYPE zeco_master-total.

READ TABLE gt_out INTO gs_out INDEX ps_total-row_id.
IF p_disp <> 'X'.
CALL METHOD pr_data_change->modify_cell
EXPORTING i_row_id = ps_total-row_id
i_fieldname = 'PRICE'
i_value = gs_out-price.

CALL METHOD pr_data_change->modify_cell
EXPORTING i_row_id = ps_total-row_id
i_fieldname = 'BILL_CUST'
i_value = gs_out-bill_cust.
ELSE.
CALL METHOD pr_data_change->modify_cell
EXPORTING i_row_id = ps_total-row_id
i_fieldname = 'LOAD'
i_value = ps_total-value.

SPLIT ps_total-value AT '-' INTO lv_vbeln lv_posnr.
PERFORM alpha_conver USING lv_vbeln
gs_out-vbeln.

PERFORM alpha_conver USING lv_posnr
gs_out-posnr.

CALL METHOD pr_data_change->modify_cell
EXPORTING i_row_id = ps_total-row_id
i_fieldname = 'VBELN'
i_value = gs_out-vbeln.

CALL METHOD pr_data_change->modify_cell
EXPORTING i_row_id = ps_total-row_id
i_fieldname = 'POSNR'
i_value = gs_out-posnr.
ENDIF.
ENDMETHO



Yes, there is a lot more code. Perhaps too much. But there you have it – most of it. my quick and easy way to create an ALV with update capabilities and pull the data from the clipboard. And yes, you can find – probably all of this floating around somewhere. However, here is the complete project.

Happy coding!

Okumaya devam et...
 
Üst