[50611] in SAPr3-news

home help back first fref pref prev next nref lref last post

=?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

home help back first fref pref prev next nref lref last post