[50611] in SAPr3-news
=?ISO-8859-1?Q?ABAP_Toolprogramme_/_=C4ndern_vo?=
daemon@ATHENA.MIT.EDU (volker Korrmann)
Tue Jul 13 07:05:14 2004
To: sapr3-news@mit.edu
Date: 13 Jul 2004 04:05:08 -0700
From: volker_korrmann@web.de (volker Korrmann)
Message-ID: <cdd58c09.0407130305.67ed184@posting.google.com>
PROGRAM bcalv_edit_01.
* (C)2004 by Volker Korrmann
* BENUTZUNG AUF EIGENE GEFAHR!
* Hallo Leute,
* anbei ein nettes kleines Programm, mit dem man
* beliebige Dateien vom SAP Server, vom PC, oder
* auch beliebige SAP Tabellen anzeigen und ändern
* kann. Zumindest ab SAP 4.6c.
* Die Anzeige und Änderung erfolgt mit dem SAP ALV
* auf einer beliebigen SAP Struktur.
* Zur Bearbeitung einer Datei, muß jeweils ein
* Quell- und Zielname angegeben werden.
* Quelle und Ziel dürfen auch identisch sein.
* Zur Bearbeitung von Tabellen ist der Tabellenname,
* evtl. eine WHERE Bedingung und eine maximale Anzahl
* Datensätze anzugeben.
* Sollen die Tabelleninhalte auch zurückgespeichert werden
* können, so muß die betreffende Option ebenfalls mit
* ausgewählt werden.
* Bei der Eingabe werden keinerlei Prüfungen durchgeführt.
* Bei mehreren Einträgen mit gleichem Primärschlüssel, wird
* das letzte Modify die vorhergehenden überschreiben.
* ALSO VORSICHT. MAN KANN MIT DEM DING SELBST AUF EINEM
* PRODUKTIVSYSTEM BELIEBIG VIEL SCHADEN ANRICHTEN !!!!
* (Diesen Satz bitte nicht als Aufforderung verstehen!!!)
* Die Daten werden dann mit Hilfe der unten angegebenen
* Struktur im SAP ALV angezeigt. Per Default die die Struktur
* DOCS vorgegeben, die nur aus einem 1024 Zeichen breiten Feld
* besteht.
* Installation des Reports:
*
* Bitte den Report bcalv_edit_01 mit allem
* was dazu gehört (auch Dynpors) nach
* Zbcalv_edit_01 kopieren.
* Den PF-STATUS bitte beim SICHERN Button um
* "SICH" erweitern!!!
* Selektionstexte:
* Bitte diese Selektionstexte einpflegen!
*PFILEOUT PC Datei Output
*PFILE_IN PC Datei Input
*P_ANZ Anzahl Datensätze
*P_CHANGE Tabelleninhalte Ändern
*P_TAB3 Strukturname zur Anzeige
*P_TABLE Lesen aus folgender Tabelle
*P_WHERE WHERE Bedingung
*SFILEOUT Server Datei OUT
*SFILE_IN Server Datei IN
* und dann den neuen Report mit diesem Sourcecode +
* meinen Anmerkungen kopieren!!!
* FERTIG !!!!
TABLES: dd03l.
DATA: ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm,
g_container TYPE scrfname VALUE 'BCALV_GRID_DEMO_0100_CONT1',
g_grid TYPE REF TO cl_gui_alv_grid,
g_custom_container TYPE REF TO cl_gui_custom_container,
gs_layout TYPE lvc_s_layo,
g_max TYPE i VALUE 100.
DATA: gt_outtab TYPE TABLE OF docs.
DATA: dname LIKE d020s-prog,
dnum LIKE d020s-dnum,
dfields TYPE STANDARD TABLE OF dynpread WITH HEADER LINE.
DATA: rc.
DATA: BEGIN OF g_bed OCCURS 0,
bed(255) TYPE c,
END OF g_bed.
DATA: l_tab_dfies TYPE STANDARD TABLE OF dfies.
FIELD-SYMBOLS: <l_wrk_dfies> TYPE dfies.
DATA: pc_datei TYPE string.
PARAMETERS: sfile_in(200) TYPE c.
PARAMETERS: sfileout(200) TYPE c.
SELECTION-SCREEN SKIP.
PARAMETERS: pfile_in(200) TYPE c.
PARAMETERS: pfileout(200) TYPE c.
SELECTION-SCREEN SKIP.
PARAMETERS: p_table LIKE dd03l-tabname.
PARAMETERS: p_where(255) TYPE c.
PARAMETERS: p_anz TYPE i DEFAULT 200.
PARAMETERS: p_change AS CHECKBOX.
SELECTION-SCREEN SKIP.
PARAMETERS: p_tab3 LIKE dd03l-tabname DEFAULT 'DOCS'.
PARAMETERS: p_tab TYPE ddobjname NO-DISPLAY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pfile_in.
CALL FUNCTION '/SAPDMC/LSM_F4_FRONTEND_FILE'
* EXPORTING
* PATHNAME =
CHANGING
pathfile = pfile_in
EXCEPTIONS
canceled_by_user = 1
system_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
*
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR sfile_in.
dname = sy-cprog.
dnum = '1000'.
REFRESH dfields. CLEAR dfields.
dfields-fieldname = 'P_FILE'.
APPEND dfields.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = dname
dynumb = dnum
* TRANSLATE_TO_UPPER = ' '
* REQUEST = ' '
* PERFORM_CONVERSION_EXITS = ' '
* PERFORM_INPUT_CONVERSION = ' '
* DETERMINE_LOOP_INDEX = ' '
TABLES
dynpfields = dfields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT dfields.
sfile_in = dfields-fieldvalue.
ENDLOOP.
IF sfile_in = ''. sfile_in = '.\'. ENDIF.
CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE'
EXPORTING
* directory = '/usr/sap/BE1/DVEBMGS35/work'
directory = sfile_in
filemask = '*.*'
IMPORTING
serverfile = sfile_in
EXCEPTIONS
canceled_by_user = 1
OTHERS = 2.
IF sy-subrc <> 0.
*
ENDIF.
START-OF-SELECTION.
p_tab = p_tab3.
*---------------------------------------------------------------------*
* MAIN *
*---------------------------------------------------------------------*
CALL SCREEN 100.
*---------------------------------------------------------------------*
* MODULE PBO OUTPUT *
*---------------------------------------------------------------------*
MODULE pbo OUTPUT.
SET PF-STATUS 'MAIN100'.
SET TITLEBAR 'MAIN100'.
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.
*§1.Set status of all cells to editable using the layout structure.
gs_layout-edit = 'X'.
*
* Füllen der Dummytabelle mit gewünschter Struktur:
*
IF p_table <> ''. p_tab = p_table. ENDIF.
DATA: it_dfies TYPE TABLE OF dfies,
wa_dfies TYPE dfies.
DATA: d_ref TYPE REF TO data,
lt_alv_cat TYPE TABLE OF lvc_s_fcat,
ls_alv_cat LIKE LINE OF lt_alv_cat.
FIELD-SYMBOLS : <t_result> TYPE table.
FIELD-SYMBOLS : <t_result2> TYPE table.
FIELD-SYMBOLS : <fs_wa> TYPE ANY.
DATA: dref TYPE REF TO data.
CREATE DATA dref TYPE (p_tab).
ASSIGN dref->* TO <fs_wa>.
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
tabname = p_tab
TABLES
dfies_tab = it_dfies
EXCEPTIONS
not_found = 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.
* über den Feldkatalog kann eine beliebige Struktur angelegt werden
LOOP AT it_dfies INTO wa_dfies.
ls_alv_cat-fieldname = wa_dfies-fieldname .
ls_alv_cat-ref_table = p_tab.
ls_alv_cat-ref_field = wa_dfies-fieldname .
APPEND ls_alv_cat TO lt_alv_cat.
ENDLOOP.
* internal table build
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING it_fieldcatalog = lt_alv_cat
IMPORTING ep_table = d_ref .
ASSIGN d_ref->* TO <t_result>.
* Der doppelte Aufruf ist wichtig, sonst hat man nur zwei Zeiger auf
* eine Tabelle, und nicht zwei Tabellen!!!
* internal table build
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING it_fieldcatalog = lt_alv_cat
IMPORTING ep_table = d_ref .
ASSIGN d_ref->* TO <t_result2>.
IF p_table <> ''.
g_bed = p_where. APPEND g_bed.
TRANSLATE g_bed USING '*%?_'.
SELECT * FROM (p_table) INTO TABLE <t_result>
UP TO p_anz ROWS
WHERE (g_bed).
IF p_change = 'X'.
INSERT LINES OF <t_result> INTO TABLE <t_result2>.
ENDIF.
ELSEIF sfile_in <> ''.
OPEN DATASET sfile_in IN TEXT MODE.
CLEAR <t_result>.
IF sy-subrc = 0.
DO.
READ DATASET sfile_in INTO <fs_wa>.
IF sy-subrc <> 0.
EXIT.
ELSE.
INSERT <fs_wa> INTO TABLE <t_result>.
ENDIF.
ENDDO.
ENDIF.
CLOSE DATASET sfile_in.
ELSEIF pfile_in <> ''.
pc_datei = pfile_in.
CLEAR <t_result>.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = pc_datei
TABLES
data_tab = <t_result>
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
CALL METHOD g_grid->set_table_for_first_display
EXPORTING i_structure_name = p_tab
is_layout = gs_layout
CHANGING it_outtab = <t_result>.
*§2.Use SET_READY_FOR_INPUT to deactivate the edit feature initially.
* (state "editable deactivated").
CALL METHOD g_grid->set_ready_for_input
EXPORTING i_ready_for_input = 0.
ENDIF.
ENDMODULE.
*---------------------------------------------------------------------*
* MODULE PAI INPUT *
*---------------------------------------------------------------------*
MODULE pai INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'SICH'.
CALL METHOD g_grid->check_changed_data
* IMPORTING
* E_VALID =
* CHANGING
* C_REFRESH = 'X'
.
IF p_table <> ''.
IF p_change = 'X'.
DELETE (p_table) FROM TABLE <t_result2>.
MODIFY (p_table) FROM TABLE <t_result>.
ENDIF.
ELSEIF sfile_in <> ''.
IF sfileout <> ''.
OPEN DATASET sfileout FOR OUTPUT IN TEXT MODE.
IF sy-subrc = 0.
LOOP AT <t_result> ASSIGNING <fs_wa>.
TRANSFER <fs_wa> TO sfileout.
ENDLOOP.
ENDIF.
CLOSE DATASET sfileout.
ENDIF.
ELSEIF pfile_in <> ''.
IF pfileout <> ''.
pc_datei = pfileout.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
filename = pc_datei
* FILETYPE = 'ASC'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* IMPORTING
* FILELENGTH =
TABLES
data_tab = <t_result>
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDIF.
WHEN 'EXIT'.
PERFORM exit_program.
WHEN 'SWITCH'.
PERFORM switch_edit_mode.
WHEN OTHERS.
* do nothing
ENDCASE.
ENDMODULE.
*---------------------------------------------------------------------*
* FORM EXIT_PROGRAM *
*---------------------------------------------------------------------*
FORM exit_program.
* LEAVE PROGRAM.
LEAVE TO SCREEN 0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SWITCH_EDIT_MODE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM switch_edit_mode.
*§3.Use IS_READY_FOR_INPUT to fetch current substate of editable cells.
IF g_grid->is_ready_for_input( ) EQ 0.
*§4.Use SET_READY_FOR_INPUT to switch between the substates.
CALL METHOD g_grid->set_ready_for_input
EXPORTING i_ready_for_input = 1.
ELSE.
CALL METHOD g_grid->set_ready_for_input
EXPORTING i_ready_for_input = 0.
ENDIF.
ENDFORM. " SWITCH_EDIT_MODE