W Pub: ABAP Prog Propios MIG Tab 2

  1. REPORT ZDINAMIC_TAB_UP_DOWN.
  2.  
  3. SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE text-001.
  4. PARAMETERS: p_table LIKE dd02l-tabname.
  5. PARAMETER: filez TYPE string LOWER CASE.
  6.  
  7. SELECTION-SCREEN BEGIN OF BLOCK b03 WITH FRAME TITLE text-002.
  8. PARAMETERS: p_down RADIOBUTTON GROUP mod DEFAULT 'X', "<-- Download
  9.             p_up   RADIOBUTTON GROUP mod.             "<-- Upload
  10. SELECTION-SCREEN END OF BLOCK b03.
  11.  
  12. SELECTION-SCREEN BEGIN OF BLOCK b04 WITH FRAME TITLE text-003.
  13. PARAMETERS: p_pc   RADIOBUTTON GROUP lcl DEFAULT 'X', "<-- A/Desde PC
  14.             p_srv  RADIOBUTTON GROUP lcl.             "<-- A/Desde Servidor
  15. SELECTION-SCREEN END OF BLOCK b04.
  16.  
  17. SELECTION-SCREEN END OF BLOCK b02.
  18.  
  19. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-004.
  20. *[@~@INI - Dynamic Generation - KEEP HANDS OFF]
  21.  
  22. TABLES: T001 .
  23. CONSTANTS: c_name(30) VALUE 'T001'.
  24. SELECT-OPTIONS: s_BUKRS for T001-BUKRS.
  25.  
  26. *[@~@FIN - Dynamic Generation - KEEP HANDS OFF]
  27. SELECTION-SCREEN END OF BLOCK b01.
  28.  
  29. CLASS z_cl_filez DEFINITION.
  30.  
  31.   PUBLIC SECTION.
  32.     DATA: to_from_pc   TYPE xfeld,
  33.           to_from_host TYPE xfeld,
  34.           my_tab       TYPE STANDARD TABLE OF string,
  35.           filename     TYPE string,
  36.           filesize     TYPE i,
  37.           filetype     TYPE char10.
  38.  
  39.     METHODS: load CHANGING p_table TYPE table,
  40.              save CHANGING p_table TYPE table,
  41.              constructor IMPORTING i_filez TYPE string.
  42.  
  43.   PRIVATE SECTION.
  44.     METHODS: load_from_pc CHANGING p_table TYPE table,
  45.              load_from_host CHANGING p_table TYPE table,
  46.              save_to_pc CHANGING p_table TYPE table,
  47.              save_to_host CHANGING p_table TYPE table,
  48.              open_dialog.
  49. ENDCLASS.
  50.  
  51. CLASS z_cl_filez IMPLEMENTATION.
  52.  
  53.   METHOD constructor.
  54.     IF NOT i_filez IS INITIAL.
  55.       me->filename = i_filez.
  56.     ENDIF.
  57.     me->filetype = 'ASC'. "<- Por defecto siempre en ASCII
  58.     me->to_from_pc = 'X'. "<- Por Defecto en local
  59.   ENDMETHOD.
  60.  
  61.   METHOD load.
  62.     CASE 'X'.
  63.       WHEN me->to_from_pc.   me->load_from_pc( CHANGING p_table = p_table ).
  64.       WHEN me->to_from_host. me->load_from_host( CHANGING p_table = p_table ).
  65.     ENDCASE.
  66.   ENDMETHOD.
  67.  
  68.   METHOD save.
  69.     CASE 'X'.
  70.       WHEN me->to_from_pc.   me->save_to_pc( CHANGING p_table = p_table ).
  71.       WHEN me->to_from_host. me->save_to_host( CHANGING p_table = p_table ).
  72.     ENDCASE.
  73.   ENDMETHOD.
  74.  
  75.  
  76.   METHOD open_dialog.
  77.     DATA: lv_file_table TYPE filetable,
  78.           lv_rc TYPE i.
  79.     IF me->filename IS INITIAL.
  80.       CALL METHOD cl_gui_frontend_services=>file_open_dialog
  81. *         EXPORTING
  82. *           WINDOW_TITLE            =
  83. *           DEFAULT_EXTENSION       =
  84. *           DEFAULT_FILENAME        =
  85. *           FILE_FILTER             =
  86. *           WITH_ENCODING           =
  87. *           INITIAL_DIRECTORY       =
  88. *           MULTISELECTION          =
  89.         CHANGING
  90.           file_table              = lv_file_table
  91.           rc                      = lv_rc
  92.         EXCEPTIONS
  93.           file_open_dialog_failed = 1
  94.           cntl_error              = 2
  95.           error_no_gui            = 3
  96.           not_supported_by_gui    = 4
  97.           OTHERS                  = 5.
  98.       READ TABLE lv_file_table INTO me->filename INDEX 1.
  99.  
  100.     ENDIF.
  101.   ENDMETHOD.
  102.  
  103.   METHOD: load_from_pc.
  104.     me->open_dialog( ).
  105.     CHECK sy-subrc EQ 0.
  106.     CALL METHOD cl_gui_frontend_services=>gui_upload
  107.       EXPORTING
  108.         filename                = me->filename
  109.         filetype                = me->filetype
  110.       IMPORTING
  111.         filelength              = me->filesize
  112. *       HEADER                  =
  113.       CHANGING
  114.         data_tab                = p_table
  115.       EXCEPTIONS
  116.         file_open_error         = 1
  117.         file_read_error         = 2
  118.         no_batch                = 3
  119.         gui_refuse_filetransfer = 4
  120.         invalid_type            = 5
  121.         no_authority            = 6
  122.         unknown_error           = 7
  123.         bad_data_format         = 8
  124.         header_not_allowed      = 9
  125.         separator_not_allowed   = 10
  126.         header_too_long         = 11
  127.         unknown_dp_error        = 12
  128.         access_denied           = 13
  129.         dp_out_of_memory        = 14
  130.         disk_full               = 15
  131.         dp_timeout              = 16
  132.         not_supported_by_gui    = 17
  133.         error_no_gui            = 18
  134.         OTHERS                  = 19.
  135.   ENDMETHOD.
  136.  
  137.   METHOD: save_to_pc.
  138.     me->open_dialog( ).
  139.     CHECK sy-subrc EQ 0.
  140.     IF me->filetype NE 'BIN'.
  141.       CLEAR me->filesize.
  142.     ENDIF.
  143.     CALL METHOD cl_gui_frontend_services=>gui_download
  144.       EXPORTING
  145.         bin_filesize            = me->filesize
  146.         filename                = me->filename
  147.         filetype                = me->filetype
  148.       IMPORTING
  149.         filelength              = me->filesize
  150.       CHANGING
  151.         data_tab                = p_table
  152.       EXCEPTIONS
  153.         file_write_error        = 1
  154.         no_batch                = 2
  155.         gui_refuse_filetransfer = 3
  156.         invalid_type            = 4
  157.         no_authority            = 5
  158.         unknown_error           = 6
  159.         header_not_allowed      = 7
  160.         separator_not_allowed   = 8
  161.         filesize_not_allowed    = 9
  162.         header_too_long         = 10
  163.         dp_error_create         = 11
  164.         dp_error_send           = 12
  165.         dp_error_write          = 13
  166.         unknown_dp_error        = 14
  167.         access_denied           = 15
  168.         dp_out_of_memory        = 16
  169.         disk_full               = 17
  170.         dp_timeout              = 18
  171.         file_not_found          = 19
  172.         dataprovider_exception  = 20
  173.         control_flush_error     = 21
  174.         not_supported_by_gui    = 22
  175.         error_no_gui            = 23
  176.         OTHERS                  = 24.
  177.   ENDMETHOD.
  178.  
  179.  
  180.   METHOD load_from_host.
  181.     DATA: lv_s TYPE REF TO data.
  182.     FIELD-SYMBOLS: <lv_s> TYPE any.
  183.  
  184.     CREATE DATA lv_s LIKE LINE OF p_table.
  185.     ASSIGN lv_s->* TO <lv_s>.
  186.  
  187.     CHECK NOT me->filename IS INITIAL.
  188.     IF me->filetype = 'BIN'.
  189.       OPEN DATASET me->filename FOR INPUT IN BINARY MODE.
  190.     ELSE.
  191.       OPEN DATASET me->filename FOR INPUT IN TEXT MODE ENCODING DEFAULT.
  192.     ENDIF.
  193.     CHECK sy-subrc EQ 0.
  194.     DO.
  195.       READ DATASET me->filename INTO <lv_s>.
  196.       IF sy-subrc NE 0. EXIT. ENDIF.
  197.       APPEND <lv_s> TO p_table.
  198.     ENDDO.
  199.     CLOSE DATASET me->filename.
  200.   ENDMETHOD.
  201.  
  202.   METHOD save_to_host.
  203.     DATA: lv_s TYPE REF TO data.
  204.     FIELD-SYMBOLS: <lv_s> TYPE any.
  205.     CREATE DATA lv_s LIKE LINE OF p_table.
  206.     ASSIGN lv_s->* TO <lv_s>.
  207.  
  208.     CHECK NOT me->filename IS INITIAL.
  209.     IF me->filetype = 'BIN'.
  210.       OPEN DATASET me->filename FOR OUTPUT IN BINARY MODE.
  211.     ELSE.
  212.       OPEN DATASET me->filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  213.     ENDIF.
  214.     LOOP AT p_table INTO <lv_s>.
  215.       TRANSFER <lv_s> TO me->filename.
  216.     ENDLOOP.
  217.     CLOSE DATASET me->filename.
  218.   ENDMETHOD.
  219.  
  220. ENDCLASS.
  221.  
  222.  
  223.  
  224. DATA: l_filez TYPE REF TO z_cl_filez.
  225.  
  226. DATA: t_tab TYPE REF TO data,
  227.       l_tab TYPE REF TO data,
  228.       s_where TYPE string.
  229. FIELD-SYMBOLS: <fs_t_tab> TYPE ANY TABLE,
  230.                <fs_l_tab> TYPE any.
  231.  
  232.  
  233. AT SELECTION-SCREEN ON VALUE-REQUEST FOR filez.
  234.   PERFORM help_me CHANGING filez.
  235.  
  236. INITIALIZATION.
  237.   p_table = c_name.
  238.  
  239. END-OF-SELECTION.
  240.   PERFORM regenerate.
  241.   PERFORM load_data.
  242.   CASE 'X'.
  243.     WHEN p_down.
  244.       l_filez->save( CHANGING p_table = <fs_t_tab> ).
  245.     WHEN p_up.
  246.       l_filez->load( CHANGING p_table = <fs_t_tab> ).
  247.   ENDCASE.
  248.   PERFORM save_data.
  249.  
  250. FORM save_data.
  251.   CHECK NOT p_up IS INITIAL.
  252.   MODIFY (c_name) FROM TABLE <fs_t_tab>.
  253. ENDFORM.
  254.  
  255. FORM load_data.
  256.  
  257.   CREATE OBJECT l_filez
  258.     EXPORTING
  259.       i_filez = filez.
  260.   l_filez->to_from_pc = p_pc.
  261.   l_filez->to_from_host = p_srv.
  262.   l_filez->filetype = 'BIN'.
  263.  
  264.   CREATE DATA t_tab TYPE TABLE OF (c_name).
  265.   CREATE DATA l_tab TYPE (c_name).
  266.   ASSIGN t_tab->* TO <fs_t_tab>.
  267.   ASSIGN l_tab->* TO <fs_l_tab>.
  268.   CHECK p_down = 'X'.
  269.   SELECT * FROM (c_name) INTO TABLE <fs_t_tab>.
  270. ENDFORM.
  271.  
  272. FORM regenerate.
  273.  
  274.   DEFINE add_line.
  275.     condense l_src.
  276.     append l_src to t_src.
  277.   END-OF-DEFINITION.
  278.  
  279.   DEFINE add_param.
  280.     delete t_texttab where id = 'S' and key = &1.
  281.     c_texttab-id = 'S'.
  282.     c_texttab-key = &1.
  283.     concatenate '!!!!!!!!' &2 into c_texttab-entry. "Blancos necesarios al principio
  284.     translate c_texttab-entry using '! '.
  285.     c_texttab-length = strlen( c_texttab-entry ).
  286.     append c_texttab to t_texttab.
  287.   END-OF-DEFINITION.
  288.  
  289.   DATA: t_src TYPE STANDARD TABLE OF string,
  290.         x_src TYPE STANDARD TABLE OF string,
  291.         l_src TYPE string,
  292.         l_dd03l TYPE dd03l,
  293.         s_where TYPE string,
  294.         s_num(3) TYPE n.
  295.  
  296.   DATA: t_texttab TYPE STANDARD TABLE OF textpool,
  297.         c_texttab TYPE textpool.
  298.  
  299.   CHECK NOT p_table IS INITIAL.
  300.   CHECK p_table NE c_name.
  301.   READ REPORT sy-repid INTO t_src.
  302.   CLEAR sy-curow.
  303.   LOOP AT t_src INTO l_src.
  304.     IF l_src CP '+[@~@*'.
  305.       IF sy-curow IS INITIAL.
  306.         sy-cucol = sy-tabix + 1. "<- Posicionamiento
  307.         APPEND l_src TO x_src.
  308.         ADD 1 TO sy-curow.
  309.       ELSE.
  310.         CLEAR sy-curow.
  311.       ENDIF.
  312.     ENDIF.
  313.     CHECK sy-curow IS INITIAL.
  314.     APPEND l_src TO x_src.
  315.   ENDLOOP.
  316.   REFRESH t_src.
  317.  
  318. *--[ A&ntilde;adimos nueva tabla
  319.   CLEAR l_src. add_line. "<- Blank line
  320.   CONCATENATE 'TABLES: ' p_table '.' INTO l_src RESPECTING BLANKS.
  321.   add_line.
  322.   CONCATENATE 'CONSTANTS: c_name(30) VALUE ''' p_table '''.' INTO l_src.
  323.   add_line.
  324.   CLEAR s_where.
  325.   READ TEXTPOOL sy-repid INTO t_texttab LANGUAGE sy-langu.
  326.   SELECT        * FROM  dd03l INTO l_dd03l
  327.          WHERE  tabname   = p_table
  328.          AND    fieldname NE 'MANDT'
  329.          AND    keyflag   = 'X'
  330.     ORDER BY position.
  331.     CONCATENATE 'S_' l_dd03l-fieldname+0(6) INTO sy-msgv1.
  332.     CONCATENATE 'SELECT-OPTIONS:~s_' l_dd03l-fieldname+0(6) '~for~' p_table '-' l_dd03l-fieldname '.' INTO l_src.
  333.     CONDENSE l_src NO-GAPS.
  334.     TRANSLATE l_src USING '~ '.
  335.     add_line.
  336.     SELECT SINGLE ddtext INTO sy-msgv2 FROM  dd04t
  337.            WHERE  rollname    = l_dd03l-rollname
  338.            AND    ddlanguage  = sy-langu.
  339.     add_param sy-msgv1 sy-msgv2.
  340.     CONCATENATE s_where 'AND~' l_dd03l-fieldname 'IN~s_' l_dd03l-fieldname+0(6) INTO s_where.
  341.   ENDSELECT.
  342.  
  343.   DELETE t_texttab WHERE entry = 'FILE' OR
  344.                          entry CP 'P_*' OR
  345.                          id    = 'R' OR "<- Título
  346.                          id    = 'I'. "<- Textos
  347.   add_param 'P_TABLE' 'Tabla'.
  348.   add_param 'FILEZ' 'Fichero'.
  349.   add_param 'P_DOWN' 'Descargar a fichero'.
  350.   add_param 'P_UP' 'Cargar a tabla'.
  351.   add_param 'P_PC' 'A/Desde PC Local'.
  352.   add_param 'P_SRV' 'A/Desde Servidor'.
  353.  
  354. *--[ Título
  355.   c_texttab-id = 'S'.
  356.   c_texttab-entry = 'Cargar/Descargar tabla a/desde fichero'.
  357.   c_texttab-length = strlen( c_texttab-entry ).
  358.   APPEND c_texttab TO t_texttab.
  359.  
  360. *--[ Elementos de texto
  361.   c_texttab-id = 'I'.
  362.   c_texttab-entry = 'Datos de proceso'.
  363.   c_texttab-length = strlen( c_texttab-entry ).
  364.   c_texttab-key = '001'.
  365.   APPEND c_texttab TO t_texttab.
  366.  
  367.   c_texttab-entry = 'Tipo de ejecución'.
  368.   c_texttab-key = '002'.
  369.   c_texttab-length = strlen( c_texttab-entry ).
  370.   APPEND c_texttab TO t_texttab.
  371.  
  372.   c_texttab-entry = 'Destino/Origen de datos'.
  373.   c_texttab-key = '003'.
  374.   c_texttab-length = strlen( c_texttab-entry ).
  375.   APPEND c_texttab TO t_texttab.
  376.  
  377.   c_texttab-entry = 'Campos para selección'.
  378.   c_texttab-key = '004'.
  379.   c_texttab-length = strlen( c_texttab-entry ).
  380.   APPEND c_texttab TO t_texttab.
  381.  
  382.   INSERT TEXTPOOL sy-repid FROM t_texttab LANGUAGE sy-langu STATE 'A'.
  383.   CONDENSE s_where NO-GAPS.
  384.   TRANSLATE s_where  USING '~ '.
  385.   SHIFT s_where LEFT BY 4 PLACES.
  386.   s_num = strlen( s_where ).
  387.   CONCATENATE 'CONSTANTS: c_where(' s_num ') VALUE ''' s_where+0(s_num) '''.' INTO l_src.
  388.   CLEAR l_src. add_line. "<- Blank line
  389.   INSERT LINES OF t_src INTO x_src INDEX sy-cucol.
  390.   INSERT REPORT sy-repid FROM x_src.
  391.   LEAVE PROGRAM.
  392. ENDFORM.
  393.  
  394. FORM help_me CHANGING p_filez TYPE string.
  395.   DATA: lv_file  LIKE rlgrap-filename.
  396.   lv_file = p_filez.
  397.   CALL FUNCTION 'WS_FILENAME_GET'
  398.     EXPORTING
  399.       def_filename     = lv_file
  400.       mask             = ',all files,*.*,data files,*.dat,text files,*.txt.'
  401.       mode             = 'o'
  402.       title            = 'Selecciona un fichero...'
  403.     IMPORTING
  404.       filename         = lv_file
  405.     EXCEPTIONS
  406.       inv_winsys       = 04
  407.       no_batch         = 04
  408.       selection_cancel = 04
  409.       selection_error  = 04.
  410.   p_filez = lv_file.
  411. ENDFORM.