Pequeña aplicación que permite llevar un registro de las horas trabajadas por usuario y explotar los datos por las personas que lo necesites. ¡¡Muerte a los XLS!!

  1. REPORT Z_XX_PRG_HORAS.
  2.  
  3. INCLUDE Z_XX_I_HORAS_TOP.
  4. INCLUDE Z_XX_I_HORAS_SEL.
  5. INCLUDE Z_XX_I_HORAS_EVE.
  6. INCLUDE Z_XX_I_HORAS_FRM2.
  1. TABLES: t001.
  2.  
  3. FIELD-SYMBOLS  : <gfs_t_pay_data>   TYPE ANY TABLE.
  4. DATA: go_pay_data   TYPE REF TO data,
  5.       gt_fcat       TYPE lvc_t_fcat,
  6.       gt_table      TYPE REF TO data,
  7.       gv_pedidor    TYPE boolean,
  8.  
  9.       g_error       TYPE sy-subrc,
  10.  
  11.       g_okcode      TYPE sy-ucomm,
  12.       g_titulo(255).
  13.  
  14. DATA: t_fcode TYPE TABLE OF sy-ucomm.
  15.  
  16. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  17. *--[ Definiciones ALV
  18. DATA: cc_01      TYPE REF TO cl_gui_custom_container,
  19.       cc_02      TYPE REF TO cl_gui_custom_container,
  20.  
  21.       cm_01      TYPE scrfname VALUE 'CC_ALV_01',
  22.  
  23.       gs_layout  TYPE lvc_s_layo,
  24.       gs_variant TYPE disvariant,
  25.  
  26.       grid_01    TYPE REF TO cl_gui_alv_grid,
  27.  
  28.       t_tab_01   TYPE STANDARD TABLE OF ZXX_ST_HORAS, "ZXX_HORAS,
  29.       t_tab_02   TYPE STANDARD TABLE OF ZXX_ST_HORAS, "ZXX_HORAS,
  30.       l_tab_01   LIKE LINE OF t_tab_01,
  31.  
  32.       t_fcat_01  TYPE lvc_t_fcat,
  33.  
  34.       gt_toolbar TYPE  ui_functions.
  1. tables: ZXX_HORAS.
  2. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
  3. select-OPTIONS: s_fecha for zxx_horas-fecha,
  4.                 s_uname for zxx_horas-uname DEFAULT sy-uname,
  5.                 s_proye for zxx_horas-proyecto,
  6.                 s_modul for zxx_horas-modulo,
  7.                 s_descr for zxx_horas-descr.
  8.  
  9. SELECTION-SCREEN END OF BLOCK b01.
  10.  
  11. module pbo_0100 output.
  12.  perform pbo_0100.
  13.  
  14. ENDMODULE.
  15.  
  16. module pai_0100 input.
  17.   perform pai_0100.
  18.  
  19. ENDMODULE.
  1. at SELECTION-SCREEN OUTPUT.
  2.   perform eve_start_of_selection_o.
  3.  
  4. INITIALIZATION.
  5.   perform eve_initialization.
  6.  
  7. START-OF-SELECTION.
  8.   PERFORM data_load.
  9.  
  10. end-of-SELECTION.
  11.   PERFORM data_list.
  1. FORM data_list.
  2.   CALL SCREEN '0100'.
  3. ENDFORM.
  4.  
  5. FORM eve_start_of_selection_o..
  6.  
  7. ENDFORM.
  8.  
  9. FORM eve_initialization.
  10.  
  11.    s_fecha = 'IBT'.
  12.    data(l_num) = sy-datum mod 7.
  13.    if l_num = 7.
  14.       clear l_num.
  15.    else.
  16.       l_num -= 2.
  17.    endif.
  18.    s_fecha-low = sy-datum - l_num.
  19.    s_fecha-high = s_fecha-low + 6.
  20.    append s_fecha.
  21. ENDFORM.
  22.  
  23. FORM f4_dir CHANGING p_dir.
  24. ENDFORM.
  25.  
  26. FORM data_load.
  27. refresh t_tab_01.
  28. SELECT * FROM zxx_horas INTO CORRESPONDING FIELDS OF table t_tab_01
  29.   WHERE fecha    in s_FECHA
  30.     AND uname    in s_UNAME
  31.     AND proyecto in s_PROYE
  32.     AND modulo   in s_MODUL
  33.     AND descr    in s_DESCR..
  34.   sort t_tab_01 by fecha uname INDICE.
  35.  
  36.       SELECT domvalue_l as valor,
  37.              ddtext     as txt
  38.         FROM dd07t
  39.         into table @data(T_keys)
  40.         WHERE ( domname    = 'ZXX_D_PROYECTO' or
  41.                 domname    = 'ZXX_D_STATUS' or
  42.                 domname    = 'ZXX_D_MODULO' )
  43.           AND ddlanguage = @sy-langu.
  44.  
  45. SELECT f~BNAME, F~bname && ' ' && P~name_first && ' ' && p~name_last as nombre
  46.     INTO table @data(T_lusers)
  47.     FROM usr21 AS F INNER JOIN adrp AS P ON F~PERSNUMBER = P~PERSNUMBER.
  48.  
  49.   loop at t_tab_01 ASSIGNING FIELD-SYMBOL(<f>).
  50.  
  51. *--[ Esto se puede optimizar, luego, ahora tengo prisa
  52.       try.
  53.           <f>-uname_txt = t_lusers[ bname = <f>-uname ]-nombre.
  54.       catch cx_root. clear sy-subrc. endtry.
  55.  
  56.       try.
  57.           <f>-asignado_txt = t_lusers[ bname = <f>-asignado ]-nombre.
  58.       catch cx_root. clear sy-subrc. endtry.
  59.  
  60.       try.
  61.           <f>-modulo_txt = t_keys[ valor = <f>-modulo ]-txt.
  62.       catch cx_root. clear sy-subrc. endtry.
  63.  
  64.       try.
  65.           <f>-proyecto_txt = t_keys[ valor = <f>-proyecto ]-txt.
  66.       catch cx_root. clear sy-subrc. endtry.
  67.  
  68.       try.
  69.           <f>-status_txt = t_keys[ valor = <f>-status ]-txt.
  70.       catch cx_root. clear sy-subrc. endtry.
  71.  
  72.   endloop.
  73.   t_tab_02[] = t_tab_01[]. "<-- BackUp
  74.  
  75. ENDFORM.
  76.  
  77.  
  78.  
  79. FORM pbo_0100.
  80.   IF sy-tcode = 'SE38'.
  81.     REFRESH t_fcode.
  82.   ELSE.
  83.   ENDIF.
  84.   SET PF-STATUS 'MAIN0100' EXCLUDING t_fcode.
  85.   SET TITLEBAR 'TIT01' WITH ''.
  86.  
  87.   IF cc_01 IS INITIAL.
  88.  
  89.     gs_layout-cwidth_opt = 'X'.
  90.     gs_layout-sel_mode = 'A'.
  91.     gs_layout-zebra = abap_true.
  92.     gs_variant-report = sy-repid.
  93.  
  94.     CREATE OBJECT cc_01
  95.       EXPORTING
  96.         container_name              = cm_01
  97.       EXCEPTIONS
  98.         cntl_error                  = 1
  99.         cntl_system_error           = 2
  100.         create_error                = 3
  101.         lifetime_error              = 4
  102.         lifetime_dynpro_dynpro_link = 5.
  103.  
  104.     CREATE OBJECT grid_01 EXPORTING i_parent = cc_01.
  105.  
  106.     CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  107.       EXPORTING
  108.         i_structure_name       = 'ZXX_ST_HORAS'
  109.         i_buffer_active        = abap_false
  110.         i_client_never_display = abap_true
  111.         i_bypassing_buffer     = abap_true
  112.       CHANGING
  113.         ct_fieldcat            = t_fcat_01[]
  114.       EXCEPTIONS
  115.         inconsistent_interface = 1
  116.         program_error          = 2
  117.         OTHERS                 = 3.
  118.     DATA: ls_fcat LIKE LINE OF t_fcat_01.
  119.  
  120. *    CLEAR ls_fcat.
  121. *    ls_fcat-fieldname = 'FECHA'.
  122. **  ls_fcat-ref_table = 'SCARR'.
  123. **  ls_fcat-type = 'DAT'.
  124. *    ls_fcat-col_pos = lines( t_fcat_01 ) + 1.
  125. ** insert new line before CARRID (do not forget MANDT!).
  126. **  insert ls_fcat into p_fieldcat index 1.
  127. *    APPEND ls_fcat TO t_fcat_01.
  128.    data(t_fcat_02) = t_fcat_01.
  129.    refresh t_fcat_02.
  130.    loop at t_fcat_01 ASSIGNING FIELD-SYMBOL(<f>) where fieldname np '*_TXT'.
  131.      append <f> to t_fcat_02.
  132.      data(l_name) = <f>-fieldname && '_TXT'.
  133.      read table t_fcat_01 ASSIGNING FIELD-SYMBOL(<ff>) with key fieldname = l_name.
  134.      check sy-subrc eq 0.
  135.        append <ff> to t_fcat_02.
  136.    endloop.
  137.     t_fcat_01[] = t_fcat_02[].
  138.     LOOP AT t_fcat_01 ASSIGNING <f>.
  139.       <f>-col_pos = sy-tabix.
  140.       <f>-edit = abap_true.
  141.       CASE <f>-fieldname.
  142.         WHEN 'NAME'.
  143.           <f>-scrtext_s =
  144.           <f>-scrtext_m =
  145.           <f>-coltext   = <f>-seltext =
  146.           <f>-scrtext_l = TEXT-c01.
  147.           <f>-outputlen = 100.
  148.        when 'INDICE'.
  149.           <f>-no_out = abap_true.
  150.       ENDCASE.
  151.       if <f>-fieldname cp '*TXT'.
  152.           <f>-scrtext_s =
  153.           <f>-scrtext_m =
  154.           <f>-coltext   = <f>-seltext =
  155.           <f>-scrtext_l = TEXT-c02.
  156.           <f>-edit = abap_false.
  157.       endif.
  158.  
  159.     ENDLOOP.
  160.  
  161.     PERFORM alv_remove_buttons.
  162.     CALL METHOD grid_01->set_table_for_first_display
  163.       EXPORTING
  164. *       i_structure_name     = 'ZAVL_CP_ALV_ALV_ADMIN'
  165. *       i_SAVE               = 'A'
  166.         is_variant           = gs_variant
  167.         is_layout            = gs_layout
  168.         i_save              = 'A'
  169.         it_toolbar_excluding = gt_toolbar
  170.       CHANGING
  171.         it_fieldcatalog      = t_fcat_01 "gt_field
  172.         it_outtab            = t_tab_01.
  173.  
  174.  
  175.         call method grid_01->register_edit_event exporting
  176.                              i_event_id = cl_gui_alv_grid=>mc_evt_modified.
  177.         call method grid_01->register_edit_event exporting
  178.                              i_event_id = cl_gui_alv_grid=>mc_evt_enter.
  179.  
  180.   ENDIF.
  181. ENDFORM.
  182.  
  183. FORM alv_remove_buttons.
  184.   CLEAR gt_toolbar.
  185. *  APPEND cl_gui_alv_grid=>mc_fg_edit TO gt_toolbar.
  186. **  append CL_GUI_ALV_GRID=>MC_FG_SORT to gt_toolbar.
  187. *  APPEND cl_gui_alv_grid=>mc_mb_subtot TO gt_toolbar.
  188. *  APPEND cl_gui_alv_grid=>mc_mb_sum    TO gt_toolbar.
  189. *  APPEND cl_gui_alv_grid=>mc_mb_variant TO gt_toolbar.
  190. *  APPEND cl_gui_alv_grid=>mc_fc_detail TO gt_toolbar.
  191. ENDFORM.
  192.  
  193. FORM pai_0100.
  194.   DATA(l_okcode) = g_okcode.
  195.   CLEAR g_okcode.
  196.   CASE l_okcode.
  197.     WHEN 'SAVE'.      PERFORM boton_save.
  198.     WHEN 'BACK'.      PERFORM boton_exit_program.
  199. *    WHEN 'SAVE'.    PERFORM DaTA_save.
  200.   ENDCASE.
  201. ENDFORM.
  202.  
  203. form boton_save.
  204.    grid_01->CHECK_CHANGED_DATA( ).
  205.  
  206. *--[ Buscamos los borrados
  207.    loop at t_tab_02 into data(l_02).
  208.      data(l_tabix) = sy-tabix.
  209.        try.
  210.         data(l_01) = t_tab_01[ FECHA = l_02-fecha
  211.                                UNAME = l_02-uname
  212.                                INDICE = l_02-indice ].
  213.        catch cx_root.
  214.             DELETE from zxx_horas
  215.               WHERE fecha  = l_02-FECHA
  216.                 AND uname  = l_02-UNAME
  217.                 AND indice = l_02-INDICE.
  218.             delete t_tab_02 index sy-tabix.
  219.        ENDTRY.
  220.  
  221.    endloop.
  222.  
  223. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  224. *--[ Arreglamos índices
  225.    sort t_tab_01 by fecha uname INDICE DESCENDING.
  226.    loop at t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) where INDICE is INITIAL.
  227.       loop at t_tab_01 into data(l_f) where fecha = <f>-fecha and
  228.                                             uname = <f>-uname and
  229.                                              not indice is INITIAL.
  230.         <f>-INDICE = l_f-indice + 1.
  231.          exit.
  232.       endloop.
  233.       if <f>-INDICE is INITIAL.
  234.          <f>-indice = 1.
  235.       endif.
  236.    endloop.
  237. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  238. *--[ Quitamos tabla de textos, para grabar sólo lo que toca...
  239. data: t_tmp type STANDARD TABLE OF ZXX_HORAS,
  240.       l_tmp like LINE OF t_tmp.
  241.    refresh t_tmp.
  242.    loop at t_tab_01 into l_tab_01.
  243.        clear l_tmp.
  244.        MOVE-CORRESPONDING l_tab_01 to l_tmp.
  245.        append l_tmp to t_tmp.
  246.    endloop.
  247.    modify ZXX_HORAS from TABLE t_tmp. "t_tab_01.
  248.    sort t_tab_01 by fecha uname INDICE.
  249.    t_tab_02[] = t_tab_01[]. "<-- BackUp
  250.    grid_01->REFRESH_TABLE_DISPLAY( ).
  251.  
  252. endform.
  253.  
  254. FORM boton_exit_program.
  255. *--[ Destruir controladores y ALVs
  256. *  data:l_resp(1). perform confirmar_salida using l_resp. check l_resp eq abap_true.
  257.   cc_01->free( ).
  258.  
  259.   FREE: cc_01.
  260.   CLEAR: cc_01, grid_01.
  261.   LEAVE TO SCREEN 0.
  262. ENDFORM.