ABAPZXXHORAS
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!!

- REPORT Z_XX_PRG_HORAS.
- CONSTANTS c_vers TYPE string VALUE 'GHAS - v01.11.20250210'.
- *--[ 01.00.00 - Creacion del programa
- *--[ 01.01.00 - Programa customizado para proyecto
- *--[ 01.02.00 20241213 + Grupo de SuperUsers
- *--[ + DES/Visar registros solo SuperUsers
- *--[ + Anyaadido Vacaciones / Enfermedad / Planning General
- *--[ 01.02.01 20250110 + Colocados campos automaticos en la creación
- *--[ + Anyaadido botón Fast Track
- *--[ + Corregido BUG del INDICE
- *--[ + Optimizada rutina de grabacion
- *--[ + Inclusion de bloqueos de registros
- *--[ + Optimizaciones generales
- *--[ 01.03.00 + Anyadido fichero de configuracion
- *--[ 01.04 20250113 + Correcciones varias y anyadido LAYOUT
- *--[ 01.05 20250114 + Anyadido nueva columna Tipo_Tarea
- *--[ + Mejor gestion de bloqueos
- *--[ 01.06 20250116 + Mejoras + Copia Local + Lock Claves
- *--[ 01.07 20250123 + Pequenyas optimizaciones y correción de errores
- *--[ 01.08 20250130 + Anyadido boton copia hasta fecha final + weekday
- *--[ 01.09 20250205 + Opcion de visualizacion
- *--[ 01.10 20250206 + Anyadido en tabla BEGTIME y ENDTIME
- *--[ 01.11 20250210 + Anyadido llamada a JIRA
- INCLUDE zgva_xx_i_zini_config_files.
- INCLUDE Z_XX_I_HORAS_TOP.
- INCLUDE Z_XX_I_HORAS_CLS.
- INCLUDE Z_XX_I_HORAS_SEL.
- INCLUDE Z_XX_I_HORAS_EVE.
- INCLUDE Z_XX_I_HORAS_FRM.
Include: Z_XX_I_HORAS_TOP
- TABLES: t001.
- TABLES: sscrfields. "<-- Para los botones en el PF-STATUS
- FIELD-SYMBOLS : <gfs_t_pay_data> TYPE ANY TABLE.
- *--[ Si, ya, se puede hacer dinámico, pero a veces es más rápido lo estático que
- *--[ la lógica de procesamiento...
- TYPES: begin of ty_has,
- proyecto(90),
- COL_01 type p LENGTH 6 DECIMALS 2,
- COL_02 type p LENGTH 6 DECIMALS 2,
- COL_03 type p LENGTH 6 DECIMALS 2,
- COL_04 type p LENGTH 6 DECIMALS 2,
- COL_05 type p LENGTH 6 DECIMALS 2,
- COL_06 type p LENGTH 6 DECIMALS 2,
- COL_07 type p LENGTH 6 DECIMALS 2,
- end of ty_has,
- BEGIN OF ty_plan,
- gjahr TYPE gjahr,
- mes TYPE char20,
- uname TYPE xubname,
- uname_txt TYPE text50,
- dia_01 TYPE char6,
- dia_02 TYPE char6,
- dia_03 TYPE char6,
- dia_04 TYPE char6,
- dia_05 TYPE char6,
- dia_06 TYPE char6,
- dia_07 TYPE char6,
- dia_08 TYPE char6,
- dia_09 TYPE char6,
- dia_10 TYPE char6,
- dia_11 TYPE char6,
- dia_12 TYPE char6,
- dia_13 TYPE char6,
- dia_14 TYPE char6,
- dia_15 TYPE char6,
- dia_16 TYPE char6,
- dia_17 TYPE char6,
- dia_18 TYPE char6,
- dia_19 TYPE char6,
- dia_20 TYPE char6,
- dia_21 TYPE char6,
- dia_22 TYPE char6,
- dia_23 TYPE char6,
- dia_24 TYPE char6,
- dia_25 TYPE char6,
- dia_26 TYPE char6,
- dia_27 TYPE char6,
- dia_28 TYPE char6,
- dia_29 TYPE char6,
- dia_30 TYPE char6,
- dia_31 TYPE char6,
- total TYPE p LENGTH 10 DECIMALS 2,
- cellcolor TYPE lvc_t_scol,
- END OF ty_plan,
- begin of ty_zxx_st_horas.
- include STRUCTURE ZXX_HORAS.
- types: UNAME_TXT Type TEXT50,
- PROYECTO_TXT Type TEXT50,
- TIPO_TXT Type TEXT50,
- MODULO_TXT Type TEXT50,
- ASIGNADO_TXT Type TEXT50,
- STATUS_TXT Type TEXT50,
- CELLTAB Type LVC_T_STYL,
- FECHA_TXT type TEXT50,
- end of ty_zxx_st_horas.
- DATA: g_error TYPE sy-subrc,
- g_okcode TYPE sy-ucomm,
- g_titulo(255),
- t_fcode TYPE TABLE OF sy-ucomm,
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Definiciones ALV
- cc_01 type ref to cl_gui_custom_container,
- cc_03 type ref to cl_gui_custom_container,
- gs_layout TYPE lvc_s_layo,
- gs_variant TYPE disvariant,
- gs_layout_02 TYPE lvc_s_layo,
- gs_variant_02 TYPE disvariant,
- grid_01 TYPE REF TO cl_gui_alv_grid,
- grid_02 TYPE REF TO cl_gui_alv_grid,
- grid_03 TYPE REF TO cl_gui_alv_grid,
- t_tab_03 TYPE STANDARD TABLE OF ty_plan,
- t_tab_has TYPE STANDARD TABLE OF ty_has,
- t_tab_01 TYPE STANDARD TABLE OF ty_zxx_st_horas,
- t_tab_del TYPE STANDARD TABLE OF ty_zxx_st_horas,
- t_tab_upd TYPE STANDARD TABLE OF ty_zxx_st_horas,
- l_tab_01 LIKE LINE OF t_tab_01,
- t_fcat_01 TYPE lvc_t_fcat,
- t_fcat_02 TYPE lvc_t_fcat,
- t_fcat_03 TYPE lvc_t_fcat,
- t_sort TYPE lvc_t_sort,
- t_sort_02 TYPE lvc_t_sort,
- gt_toolbar TYPE ui_functions,
- gt_toolbar_has TYPE ui_functions,
- g_today type sydatum,
- g_save TYPE xfeld,
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[
- end_of_Data(1).
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ CONFIG Section
- types: begin of ty_config_estat,
- CODIGO(20),
- ICONO TYPE ICON_D,
- color type c LENGTH 1,
- Texto TYPE GUI_TEXT,
- end of ty_config_estat,
- begin of ty_default,
- field(40),
- valor(120),
- end of ty_default,
- Begin of ty_config,
- ALV type i,
- SU type RANGE OF XUBNAME,
- URL type c LENGTH 1023,
- jira_URL type c LENGTH 1023,
- Days_Before type i,
- ESTAT type STANDARD TABLE OF ty_config_estat with NON-UNIQUE DEFAULT KEY,
- OBJ type REF TO zini_cl_config_files,
- DATE_BEFORE type sy-datum,
- DEF type STANDARD TABLE OF ty_default with NON-UNIQUE DEFAULT KEY,
- T_FEST type range of numc4,
- T_FESTfull type range of numc08,
- visu type xfeld,
- end of ty_config.
- data: data_config type ty_config.
Include Z_XX_I_HORAS_CLS
- CLASS lcl_event_handler DEFINITION FINAL.
- PUBLIC SECTION .
- DATA: my_config TYPE ty_config.
- METHODS:
- handle_data_changed
- FOR EVENT data_changed OF cl_gui_alv_grid
- IMPORTING er_data_changed E_ONF4 E_ONF4_BEFORE E_ONF4_AFTER E_UCOMM,
- handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
- IMPORTING e_object, " e_interactive,
- handle_hotspot for event HOTSPOT_CLICK of cl_gui_alv_grid
- IMPORTING E_ROW_ID E_COLUMN_ID ES_ROW_NO,
- handle_menu_button
- FOR EVENT menu_button OF cl_gui_alv_grid
- IMPORTING e_object e_ucomm,
- handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
- IMPORTING e_ucomm .
- ENDCLASS.
- DATA: G_event_01 TYPE REF TO lcl_event_handler,
- G_event_has TYPE REF TO lcl_event_handler.
- CLASS lcl_event_handler IMPLEMENTATION .
- method handle_hotspot.
- *--[ E_ROW_ID Type LVC_S_ROW
- *--[ E_COLUMN_ID Type LVC_S_COL
- *--[ ES_ROW_NO Type LVC_S_ROID
- case E_COLUMN_ID.
- when 'CODIGO'.
- try.
- data(l_Valor) = to_upper( t_tab_01[ ES_ROW_NO-ROW_ID ]-CODIGO ).
- if l_Valor cp 'GESTIC-*'.
- data(my_url) = CONV string( |{ my_config-jira_url }{ l_Valor }| ).
- cl_gui_frontend_services=>execute( document = my_url ).
- endif.
- CATCH cx_root.
- endtry.
- when OTHERS.
- clear sy-subrc.
- endcase.
- ENDMETHOD.
- METHOD handle_menu_button.
- case my_config-ALV.
- when 1.
- CASE e_ucomm.
- *--[ Valores estadisticos
- WHEN 'P020'.
- LOOP AT my_config-estat INTO DATA(l_data).
- e_object->add_function( fcode = |ES{ sy-tabix }| icon = l_data-icono text = l_data-texto ).
- * e_object->add_function( fcode = 'BOT03' icon = icon_sickness text = 'Enfermedad' ).
- ENDLOOP.
- *--[ Parametrización
- WHEN 'P010'.
- e_object->add_function( fcode = 'P011' icon = icon_package_standard text = 'Proyecto' ).
- e_object->add_function( fcode = 'P012' icon = icon_package_standard text = 'Módulo' ).
- e_object->add_function( fcode = 'P016' icon = icon_package_standard text = 'Tipo Tarea' ).
- e_object->add_function( fcode = 'P013' icon = icon_package_standard text = 'Estado' ).
- * e_object->add_function( fcode = 'P014' icon = icon_user_breakpoint text = 'Super Usuarios' ).
- e_object->add_function( fcode = 'P015' icon = icon_user_breakpoint text = 'Editar Config' ).
- ENDCASE.
- when 3.
- endcase.
- ENDMETHOD.
- METHOD handle_data_changed.
- LOOP AT er_data_changed->MT_deleted_rows INTO DATA(l_row).
- READ TABLE t_tab_01 INDEX l_row-row_id INTO DATA(ax).
- CHECK ax-indice NE 0.
- APPEND ax TO t_tab_del.
- CLEAR ax.
- AT LAST.
- g_save = abap_true.
- ENDAT.
- ENDLOOP.
- data: l_celltab type LVC_T_STYL.
- LOOP AT er_data_changed->mt_inserted_rows INTO DATA(l_ins).
- * assign ('L_TAB_01-INDICE') TO FIELD-SYMBOL(<AX>).
- * CALL METHOD er_data_changed->get_cell_value(
- * EXPORTING
- * i_row_id = l_ins-row_id
- * i_fieldname = CONV lvc_fname( 'INDICE' )
- * IMPORTING
- * e_value = <ax> ). "<- Esto dará problemas...
- *--[ Campos por defecto
- LOOP AT my_config-def INTO DATA(l_def).
- data(l_field) = |L_TAB_01-{ l_def-field }|.
- assign (l_field) to FIELD-SYMBOL(<f_field>).
- CALL METHOD er_data_changed->get_cell_value(
- EXPORTING
- i_row_id = l_ins-row_id
- i_fieldname = CONV lvc_fname( l_def-field )
- IMPORTING
- e_value = <f_field> ). "<- Esto dará problemas...
- CHECK <f_field> IS INITIAL.
- <f_field> = l_def-valor.
- CALL METHOD er_data_changed->modify_cell
- EXPORTING
- i_row_id = l_ins-row_id
- i_fieldname = CONV lvc_fname( l_def-field )
- i_value = <f_field>.
- ENDLOOP.
- ENDLOOP.
- LOOP AT er_data_changed->mt_good_cells INTO DATA(ls_good).
- CLEAR ax.
- READ TABLE t_tab_01 INDEX ls_good-row_id INTO ax.
- IF ax-indice NE 0.
- APPEND ax TO t_tab_upd.
- ENDIF.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Hay que hacer más verificaciones, pero dejo esta como ejemplo
- CASE ls_good-fieldname.
- WHEN 'UNAME'.
- IF ls_good-value IS INITIAL.
- CALL METHOD er_data_changed->modify_cell
- EXPORTING
- i_row_id = ls_good-row_id
- i_fieldname = ls_good-fieldname
- i_value = sy-uname.
- ENDIF.
- WHEN 'FECHA'.
- IF sy-uname IN data_config-su.
- ELSE.
- DATA(l_datum) = CONV sydatum( ( CONV sydatum( ls_good-value ) ) + my_config-days_before ).
- IF l_datum < sy-datum.
- er_data_changed->add_protocol_entry( i_msgid = '00'
- i_msgty = 'E'
- i_msgno = '398'
- i_msgv1 = 'Fecha'
- i_msgv2 = |{ ls_good-value }|
- i_msgv3 = 'no permitida'
- i_fieldname = ls_good-fieldname ).
- ENDIF.
- ENDIF.
- *--[ Inicializamos la fecha
- IF ls_good-value+0(8) CO '0'.
- CALL METHOD er_data_changed->modify_cell
- EXPORTING
- i_row_id = ls_good-row_id
- i_fieldname = ls_good-fieldname
- i_value = sy-datum.
- ENDIF.
- ENDCASE.
- g_save = abap_true.
- * CALL METHOD er_data_changed->modify_cell
- * EXPORTING
- * i_row_id = ls_good-row_id
- * i_fieldname = CONV #( l_campo )
- * i_value = sy-uname.
- *
- ENDLOOP.
- ENDMETHOD.
- METHOD handle_toolbar.
- case my_config-alv.
- when 1.
- IF sy-uname IN data_config-su.
- DATA(l_modo) = abap_false.
- ELSE.
- l_modo = abap_true.
- ENDIF.
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 0
- function = 'COPY'
- icon = ICON_SYSTEM_COPY
- text = ''
- quickinfo = 'Copiar Seleccionados'
- disabled = data_config-visu )
- ).
- read table e_object->mt_toolbar index lines( e_object->mt_toolbar ) into data(ax).
- delete e_object->mt_toolbar index lines( e_object->mt_toolbar ).
- insert ax into e_object->mt_toolbar index 7.
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 0
- function = 'COPYP'
- icon = ICON_SYSTEM_COPY
- text = 'hasta fecha'
- quickinfo = 'Copiar con modelo hasta fecha fin'
- disabled = data_config-visu )
- ).
- * Please, disperse, nothing to see here...
- read table e_object->mt_toolbar index lines( e_object->mt_toolbar ) into ax.
- delete e_object->mt_toolbar index lines( e_object->mt_toolbar ).
- insert ax into e_object->mt_toolbar index 8.
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 2
- function = 'P010'
- icon = icon_configuration
- text = 'Parametriziación'
- quickinfo = 'Parametrización'
- disabled = l_modo ) ).
- IF lines( my_config-estat ) > 0.
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 2
- function = 'P020'
- icon = icon_configuration
- text = 'Estadistico'
- quickinfo = 'Valor Estadístico'
- disabled = abap_false ) ).
- ENDIF.
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 0
- function = 'BOT01'
- icon = icon_select_all
- text = 'Visar'
- quickinfo = 'Visar todos'
- disabled = COND #( WHEN DATA_config-visu = abap_true THEN abap_true else l_modo ) )
- ( butn_type = 0
- function = 'BOT02'
- icon = icon_deselect_all
- text = 'Des-Visar'
- quickinfo = 'Des-Visar todos'
- disabled = COND #( WHEN DATA_config-visu = abap_true THEN abap_true else l_modo ) )
- ( butn_type = 0
- function = 'BOT99'
- icon = icon_schedule_line
- text = 'Plannig'
- quickinfo = 'Vista Global'
- disabled = abap_false )
- ).
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 0
- function = 'PHAS'
- icon = icon_time
- text = 'Imputar HAS'
- quickinfo = 'Imputar HAS'
- disabled = abap_false ) ).
- when 3.
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 0
- function = 'LEFT'
- icon = ICON_COLUMN_LEFT
- text = 'Anterior'
- quickinfo = 'Semana Anterior'
- disabled = abap_false ) ).
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 0
- function = 'RIGHT'
- icon = ICON_COLUMN_RIGHT
- text = 'Posterior'
- quickinfo = 'Semana Posterior'
- disabled = abap_false ) ).
- endcase.
- ENDMETHOD.
- METHOD handle_user_command.
- CASE e_ucomm.
- WHEN 'BOT01'. " VISAR TODO
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) WHERE visadas IS INITIAL.
- <f>-visadas = g_save = abap_true.
- ENDLOOP.
- WHEN 'BOT02'. " DES-VISAR TODO
- LOOP AT t_tab_01 ASSIGNING <f> WHERE visadas IS NOT INITIAL.
- g_save = abap_true.
- <f>-visadas = abap_false.
- ENDLOOP.
- WHEN 'BOT99'.
- PERFORM bot_vista_global.
- WHEN 'COPY'. perform bot_copy.
- WHEN 'COPYP'. perform bot_copy_modelo.
- WHEN 'P011'. PERFORM bot_crea_param USING 'P'.
- WHEN 'P012'. PERFORM bot_crea_param USING 'M'.
- WHEN 'P013'. PERFORM bot_crea_param USING 'E'.
- * WHEN 'P014'. PERFORM bot_crea_param USING 'S'.
- WHEN 'P016'. PERFORM bot_crea_param USING 'T'.
- WHEN 'P015'. my_config-obj->edit( ).
- when 'PHAS'. perform bot_has.
- when 'LEFT'. perform bot_week using '<'.
- when 'RIGHT'. perform bot_week using '>'.
- WHEN OTHERS.
- IF e_ucomm CP 'ES*'.
- PERFORM bot_crear_estat USING e_ucomm+2(2).
- ENDIF.
- ENDCASE.
- grid_01->refresh_table_display( ).
- ENDMETHOD.
- ENDCLASS.
Include: Z_XX_I_HORAS_SEL
- TABLES: zxx_horas.
- SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
- SELECT-OPTIONS: s_fecha FOR zxx_horas-fecha,
- s_uname FOR zxx_horas-uname DEFAULT sy-uname,
- s_proye FOR zxx_horas-proyecto,
- s_codigo FOR zxx_horas-codigo,
- s_modul FOR zxx_horas-modulo.
- SELECTION-SCREEN END OF BLOCK b01.
- SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME.
- SELECT-OPTIONS: s_asign for zxx_horas-ASIGNADO,
- s_avance for zxx_horas-AVANCE,
- s_descr FOR zxx_horas-descr,
- s_status FOR zxx_horas-status,
- s_visa for zxx_horas-visadas no INTERVALS no-EXTENSION.
- SELECTION-SCREEN END OF BLOCK b02.
- PARAMETERS: p_visu as CHECKBOX DEFAULT ' '.
- PARAMETERS: p_vari type ZXX_HORAS_LTDX-VARIANT MATCHCODE OBJECT ZXX_HORAS_F4_LTDX DEFAULT '/DEFAULT'.
- SELECTION-SCREEN SKIP 1.
- SELECTION-SCREEN COMMENT /01(40) g_vers.
- SELECTION-SCREEN FUNCTION KEY 1.
- SELECTION-SCREEN FUNCTION KEY 2.
- SELECTION-SCREEN FUNCTION KEY 3.
- SELECTION-SCREEN FUNCTION KEY 4.
- SELECTION-SCREEN FUNCTION KEY 5.
- MODULE pbo_XXXX OUTPUT.
- case sy-dynnr.
- when '0100'. PERFORM pbo_0100.
- when '0200'. PERFORM pbo_0200.
- when '0300'. PERFORM pbo_0300.
- endcase.
- ENDMODULE.
- MODULE pai_XXXX INPUT.
- case sy-dynnr.
- when '0100'. PERFORM pai_0100.
- when '0200'. PERFORM pai_0200.
- when '0300'. PERFORM pai_0300.
- endcase.
- ENDMODULE.
Include: Z_XX_I_HORAS_EVE
- AT SELECTION-SCREEN.
- PERFORM eve_start_of_selection.
- INITIALIZATION.
- perform eve_initialization.
- START-OF-SELECTION.
- perform data_ini.
- PERFORM data_load.
- end-of-SELECTION.
- PERFORM data_list.
Include: Z_XX_I_HORAS_FRM
- FORM data_list.
- CALL SCREEN '0100'.
- ENDFORM.
- FORM data_load_config.
- DATA: l_valor(120).
- * TRY. DATA(l_datum) = CONV datum( t_tab[ var_u = 'DATUM' ]-val ). CATCH cx_root. CLEAR sy-subrc. ENDTRY.
- data_config-obj = NEW zini_cl_config_files( p_ini_name = 'ZXX_HORAS.CONFIG' ).
- DATA(t_tab) = CONV zini_cl_config_files=>TY_valores( data_config-obj->get_data_all( ) ).
- LOOP AT t_tab INTO DATA(l_data).
- CASE l_data-var_u.
- WHEN 'SUPERUSER'.
- data_config-su = VALUE #( BASE data_config-su ( sign = if_fsbp_const_range=>sign_include
- option = if_fsbp_const_range=>option_equal
- low = l_data-val ) ) .
- WHEN 'ESTAT'.
- SPLIT l_data-val AT ';' INTO DATA(l_001) DATA(l_002) DATA(l_003) DATA(l_044).
- data_config-estat = VALUE #( BASE data_config-estat ( codigo = l_001 icono = l_002 color = l_003 texto = l_044 ) ).
- WHEN 'FESTIVOS_MMDD'.
- SPLIT l_data-val AT ';' INTO TABLE DATA(T_ax).
- LOOP AT t_ax INTO DATA(ax).
- CHECK ax IS NOT INITIAL.
- data_config-t_fest = VALUE #( BASE data_config-t_Fest ( sign = if_fsbp_const_range=>sign_include
- option = if_fsbp_const_range=>option_equal
- low = ax ) ).
- ENDLOOP.
- WHEN 'FESTIVOS_AAAAMMDD'.
- SPLIT l_data-val AT ';' INTO TABLE DATA(T_bx).
- LOOP AT t_bx INTO DATA(bx).
- CHECK bx IS NOT INITIAL.
- data_config-t_festfull = VALUE #( BASE data_config-t_Festfull ( sign = if_fsbp_const_range=>sign_include
- option = if_fsbp_const_range=>option_equal
- low = bx ) ).
- ENDLOOP.
- WHEN 'DEFAULT'.
- SPLIT l_data-val AT ' ' INTO DATA(l_004) l_valor.
- l_valor = to_upper( val = l_valor ).
- IF l_valor CP 'SYST-*' OR l_valor CP 'SY-*'.
- ASSIGN (l_valor) TO FIELD-SYMBOL(<ff>).
- IF sy-subrc EQ 0.
- l_valor = <ff>.
- ENDIF.
- ENDIF.
- data_config-def = VALUE #( BASE data_config-def ( field = l_004 valor = l_valor ) ).
- ENDCASE.
- ENDLOOP.
- TRY. data_config-Days_Before = CONV #( t_tab[ var_u = 'DAYS_BEFORE' ]-val ). CATCH cx_root. CLEAR sy-subrc. ENDTRY.
- TRY. data_config-url = CONV #( t_tab[ var_u = 'HAS_URL' ]-val ). CATCH cx_root. CLEAR sy-subrc. ENDTRY.
- TRY. data_config-jira_url = CONV #( t_tab[ var_u = 'JIRA_URL' ]-val ). CATCH cx_root. CLEAR sy-subrc. ENDTRY.
- data_config-date_before = sy-datum - data_config-Days_Before.
- ENDFORM.
- FORM eve_initialization.
- PERFORM data_load_config.
- DATA: l_num TYPE p.
- sscrfields-functxt_01 = |@7Q@ Fast Track|.
- g_vers = c_vers.
- s_fecha = 'IBT'.
- l_num = sy-datum MOD 7. "sy-datum MOD 7.
- IF l_num > 1.
- l_num -= 1.
- ELSE.
- l_num += 6.
- ENDIF.
- l_num -= 1.
- s_fecha-low = sy-datum - l_num.
- s_fecha-high = s_fecha-low + 6.
- APPEND s_fecha.
- ENDFORM.
- FORM eve_start_of_selection.
- CASE sscrfields-ucomm.
- WHEN 'FC01'. PERFORM bot_fast_track.
- ENDCASE.
- ENDFORM.
- FORM bot_fast_track.
- DATA: t_fields TYPE STANDARD TABLE OF sval,
- l_ans TYPE c LENGTH 1.
- t_fields = VALUE #(
- ( tabname = 'ZXX_HORAS' fieldname = 'FECHA' field_obl = abap_true value = sy-datum )
- ( tabname = 'ZXX_HORAS' fieldname = 'UNAME' field_obl = abap_true value = sy-uname field_attr = '03' )
- ( tabname = 'ZXX_HORAS' fieldname = 'HORAS' field_obl = abap_true )
- ( tabname = 'ZXX_HORAS' fieldname = 'PROYECTO' field_obl = abap_true )
- ( tabname = 'ZXX_HORAS' fieldname = 'TIPO' field_obl = abap_true )
- ( tabname = 'ZXX_HORAS' fieldname = 'MODULO' field_obl = abap_true )
- ( tabname = 'ZXX_HORAS' fieldname = 'CODIGO' field_obl = abap_true )
- ( tabname = 'ZXX_HORAS' fieldname = 'DESC_CODIGO' field_obl = abap_false )
- ( tabname = 'ZXX_HORAS' fieldname = 'ASIGNADO' field_obl = abap_false )
- ( tabname = 'ZXX_HORAS' fieldname = 'ASIGNADO_L' field_obl = abap_false )
- * ( tabname = 'ZXX_HORAS' fieldname = 'BEGDATE' field_obl = abap_false )
- * ( tabname = 'ZXX_HORAS' fieldname = 'ENDDATE' field_obl = abap_false )
- ( tabname = 'ZXX_HORAS' fieldname = 'CALLME' field_obl = abap_false )
- * ( tabname = 'ZXX_HORAS' fieldname = 'STATUS' field_obl = abap_true )
- * ( tabname = 'ZXX_HORAS' fieldname = 'AVANCE' field_obl = abap_true )
- ( tabname = 'ZXX_HORAS' fieldname = 'DESCR' field_obl = abap_false )
- ).
- *--[ Cargamos los datos por defecto...
- LOOP AT data_config-def INTO DATA(l_def).
- TRY.
- t_fields[ fieldname = l_def-field ]-value = l_def-valor.
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- ENDLOOP.
- CALL FUNCTION 'POPUP_GET_VALUES'
- EXPORTING
- * NO_VALUE_CHECK = ' '
- popup_title = 'Fast Track'
- start_column = '50'
- start_row = '5'
- IMPORTING
- returncode = l_ans
- TABLES
- fields = t_fields
- EXCEPTIONS
- error_in_fields = 1
- OTHERS = 2.
- IF sy-subrc EQ 0 AND l_ans IS INITIAL.
- DATA(l_fecha) = CONV datum( t_fields[ fieldname = 'FECHA' ]-value ).
- SELECT MAX( indice ) FROM zxx_horas INTO @DATA(l_max)
- WHERE fecha = @l_fecha AND uname = @sy-uname.
- ADD 1 TO l_max.
- DATA(to_save) = VALUE zxx_horas(
- fecha = l_fecha
- uname = sy-uname
- indice = l_max
- proyecto = t_fields[ fieldname = 'PROYECTO' ]-value
- modulo = t_fields[ fieldname = 'MODULO' ]-value
- tipo = t_fields[ fieldname = 'TIPO' ]-value
- codigo = t_fields[ fieldname = 'CODIGO' ]-value
- desc_codigo = t_fields[ fieldname = 'DESC_CODIGO' ]-value
- asignado = t_fields[ fieldname = 'ASIGNADO' ]-value
- asignado_l = t_fields[ fieldname = 'ASIGNADO_L' ]-value
- callme = t_fields[ fieldname = 'CALLME' ]-value
- BEGTIME = sy-uzeit - ( CONV zxx_de_horas( t_fields[ fieldname = 'HORAS' ]-value ) * 3600 )
- endtime = sy-uzeit
- begdate = l_fecha
- enddate = l_fecha
- horas = CONV zxx_de_horas( t_fields[ fieldname = 'HORAS' ]-value )
- status = '40' "En pruebas
- avance = '90'
- * status = t_fields[ fieldname = 'STATUS' ]-value
- * avance = t_fields[ fieldname = 'AVANCE' ]-value
- descr = t_fields[ fieldname = 'DESCR' ]-value
- ).
- IF sy-uname IN data_config-su.
- ELSE.
- IF l_fecha < data_config-date_before.
- MESSAGE s398(00) WITH 'Fecha no permitida'.
- EXIT.
- ENDIF.
- ENDIF.
- INSERT zxx_horas FROM to_save.
- MESSAGE s398(00) WITH 'Datos almacenados correctamente'.
- ENDIF.
- ENDFORM.
- FORM data_ini.
- data_config-visu = p_visu.
- ENDFORM.
- FORM data_load.
- REFRESH t_tab_01.
- SELECT * FROM zxx_horas INTO CORRESPONDING FIELDS OF TABLE t_tab_01
- WHERE fecha IN s_FECHA
- AND uname IN s_UNAME
- AND visadas IN s_visa
- AND proyecto IN s_PROYE
- AND modulo IN s_MODUL
- and ASIGNADO in s_asign
- AND descr IN s_DESCR
- AND codigo IN s_codigo
- AND status IN s_status
- AND avance IN s_avance.
- SORT t_tab_01 BY fecha uname indice.
- *--[ Creamos el FCAT de la tabla
- *--[ Esto iría en el PBO, pero lo necesito antes
- cl_salv_table=>factory( IMPORTING r_salv_table = DATA(l_alv) CHANGING t_table = t_tab_01 ).
- t_fcat_01 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
- r_columns = l_alv->get_columns( )
- r_aggregations = l_alv->get_aggregations( ) ).
- SELECT domvalue_l AS valor,
- ddtext AS txt
- FROM dd07t
- INTO TABLE @DATA(T_keys)
- WHERE ( domname = 'ZXX_D_PROYECTO' OR
- domname = 'ZXX_D_STATUS' OR
- domname = 'ZXX_D_TIPO' OR
- domname = 'ZXX_D_MODULO' )
- AND ddlanguage = @sy-langu AND
- as4local = 'A' AND
- as4vers = '0000'
- ORDER BY domname, valpos.
- SELECT f~bname, p~name_first && ' ' && p~name_last AS nombre
- INTO TABLE @DATA(T_lusers)
- FROM usr21 AS f INNER JOIN adrp AS p ON f~persnumber = p~persnumber
- WHERE f~bname = @sy-uname.
- * DATA(l_datum) = CONV sydatum( sy-datum - c_proteccion ).
- DATA: t_rw TYPE lvc_t_styl,
- t_r TYPE lvc_t_styl.
- PERFORM data_fill_edit USING cl_gui_alv_grid=>mc_style_disabled CHANGING t_r.
- PERFORM data_fill_edit USING cl_gui_alv_grid=>mc_style_enabled CHANGING t_rw.
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<f>).
- AT FIRST.
- *--[ Protegemos los textos
- * DATA: t_cell_read TYPE lvc_t_styl.
- * REFRESH t_cell_REad.
- * sort t_fcat_01 by FIELDNAME ASCENDING.
- * LOOP AT t_fcat_01 INTO DATA(l_f) WHERE fieldname CP '*_TXT' .
- * t_cell_read = VALUE #( BASE t_cell_read ( fieldname = l_f-fieldname style = cl_gui_alv_grid=>mc_style_disabled ) ).
- * ENDLOOP.
- * SORT t_fcat_01.
- SELECT wotnr, langt FROM t246 INTO TABLE @DATA(t246) WHERE sprsl = @sy-langu ORDER BY wotnr.
- ENDAT.
- DATA(l_tabix) = sy-tabix.
- *--[ Esto se puede optimizar, luego, ahora tengo prisa
- TRY.
- <f>-uname_txt = t_lusers[ bname = <f>-uname ]-nombre.
- CATCH cx_root.
- SELECT f~bname, p~name_first && ' ' && p~name_last AS nombre
- APPENDING CORRESPONDING FIELDS OF TABLE @T_lusers
- FROM usr21 AS f INNER JOIN adrp AS p ON f~persnumber = p~persnumber
- WHERE f~bname = @<f>-uname.
- IF sy-subrc EQ 0.
- <f>-uname_txt = t_lusers[ bname = <f>-uname ]-nombre.
- ENDIF.
- ENDTRY.
- IF <f>-asignado IS NOT INITIAL.
- TRY.
- <f>-asignado_txt = t_lusers[ bname = <f>-asignado ]-nombre.
- CATCH cx_root.
- SELECT f~bname, p~name_first && ' ' && p~name_last AS nombre
- APPENDING CORRESPONDING FIELDS OF TABLE @T_lusers
- FROM usr21 AS f INNER JOIN adrp AS p ON f~persnumber = p~persnumber
- WHERE f~bname = @<f>-asignado.
- IF sy-subrc EQ 0.
- <f>-asignado_txt = t_lusers[ bname = <f>-asignado ]-nombre.
- ENDIF.
- ENDTRY.
- ENDIF.
- IF <f>-modulo IS NOT INITIAL.
- TRY.
- <f>-modulo_txt = t_keys[ valor = <f>-modulo ]-txt.
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- ENDIF.
- IF <f>-fecha IS NOT INITIAL.
- DATA: l_dia TYPE scal-indicator.
- CALL FUNCTION 'DATE_COMPUTE_DAY'
- EXPORTING
- date = <f>-fecha
- IMPORTING
- day = l_dia.
- TRY.
- <f>-fecha_txt = t246[ l_dia ]-langt.
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- ENDIF.
- * IF <f>-tipo IS NOT INITIAL.
- TRY.
- <f>-tipo_txt = t_keys[ valor = <f>-tipo ]-txt.
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- * ENDIF.
- IF <f>-proyecto IS NOT INITIAL.
- TRY.
- <f>-proyecto_txt = t_keys[ valor = <f>-proyecto ]-txt.
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- ENDIF.
- IF <f>-status IS NOT INITIAL.
- TRY.
- <f>-status_txt = t_keys[ valor = <f>-status ]-txt.
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- ENDIF.
- IF sy-uname IN data_config-su.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'VISADAS' style = cl_gui_alv_grid=>mc_style_enabled ) ).CATCH cx_root. ENDTRY.
- ELSE.
- TRY. <f>-celltab = COND #( WHEN <f>-fecha < data_config-date_before THEN t_r ELSE t_rw ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = COND #( WHEN sy-uname NE <f>-uname THEN t_r ELSE <f>-celltab ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'VISADAS' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- ENDIF.
- *--[ Bloqueamos los registros *_TXT
- *--[ Protegemos los textos
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'FECHA' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'UNAME' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'UNAME_TXT' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'PROYECTO_TXT' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'ASIGNADO_TXT' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'STATUS_TXT' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- TRY. <f>-celltab = VALUE #( BASE <f>-celltab ( fieldname = 'MODULO_TXT' style = cl_gui_alv_grid=>mc_style_disabled ) ). CATCH cx_root. ENDTRY.
- ENDLOOP.
- PERFORM data_load_lock.
- ENDFORM.
- FORM data_load_lock.
- DATA: t_rw TYPE lvc_t_styl,
- t_r TYPE lvc_t_styl.
- *--[ Todo Bloqueado
- LOOP AT t_fcat_01 ASSIGNING FIELD-SYMBOL(<ff>).
- t_r = VALUE #( BASE t_r ( fieldname = <ff>-fieldname style = cl_gui_alv_grid=>mc_style_disabled ) ).
- ENDLOOP.
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<f>).
- IF p_visu = abap_true.
- TRY. <f>-celltab[] = t_R[]. CATCH cx_root. ENDTRY.
- CONTINUE. "<-- No bloqueamos
- ENDIF.
- CALL FUNCTION 'ENQUEUE_EZXX_HORAS'
- EXPORTING
- mode_zxx_horas = 'E'
- mandt = sy-mandt
- fecha = <f>-fecha
- uname = <f>-uname
- indice = <f>-indice
- * X_FECHA = ' '
- * X_UNAME = ' '
- * X_INDICE = ' '
- * _SCOPE = '2'
- * _WAIT = ' '
- * _COLLECT = ' '
- EXCEPTIONS
- foreign_lock = 1
- system_failure = 2
- OTHERS = 3.
- IF sy-subrc <> 0.
- TRY. <f>-celltab[] = t_R[]. CATCH cx_root. ENDTRY.
- MESSAGE s398(00) WITH 'Existen registros bloqueados por ' sy-msgv1 '' ''.
- ENDIF.
- ENDLOOP.
- ENDFORM.
- FORM data_fill_edit USING p_modo CHANGING t_tab TYPE lvc_t_styl.
- TRY.
- t_tab = VALUE #( ( fieldname = 'FECHA' style = p_modo )
- ( fieldname = 'UNAME' style = p_modo )
- ( fieldname = 'INDICE' style = p_modo )
- ( fieldname = 'PROYECTO' style = p_modo )
- ( fieldname = 'MODULO' style = p_modo )
- ( fieldname = 'TIPO' style = p_modo )
- ( fieldname = 'CODIGO' style = p_modo )
- ( fieldname = 'DESC_CODIGO' style = p_modo )
- ( fieldname = 'ASIGNADO' style = p_modo )
- ( fieldname = 'ASIGNADO_L' style = p_modo )
- ( fieldname = 'BEGDATE' style = p_modo )
- ( fieldname = 'ENDDATE' style = p_modo )
- ( fieldname = 'CALLME' style = p_modo )
- ( fieldname = 'HORAS' style = p_modo )
- ( fieldname = 'STATUS' style = p_modo )
- ( fieldname = 'AVANCE' style = p_modo )
- ( fieldname = 'DESCR' style = p_modo )
- ).
- CATCH cx_root.
- ENDTRY.
- ENDFORM.
- FORM pbo_0300.
- SET PF-STATUS 'MAIN0100' EXCLUDING t_fcode.
- SET TITLEBAR 'TIT01' WITH 'Imputar Horas'.
- CHECK cc_03 IS INITIAL.
- cc_03 = NEW cl_gui_custom_container( container_name = 'CC_ALV_03' ).
- DATA(G_SPlIT) = NEW cl_gui_splitter_container( parent = cc_03
- rows = 2
- columns = 1 ).
- grid_03 = NEW cl_gui_alv_grid( i_parent = G_SPlIT->get_container( row = 1 column = 1 ) ).
- g_split->set_row_height( id = 1 height = 30 ).
- DATA(g_html_control) = NEW cl_gui_html_viewer( parent = G_SPlIT->get_container( row = 2 column = 1 ) ).
- g_html_control->show_data( EXPORTING url = data_config-url ).
- cl_salv_table=>factory( IMPORTING r_salv_table = DATA(l_alv) CHANGING t_table = t_tab_has ).
- t_fcat_03 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
- r_columns = l_alv->get_columns( )
- r_aggregations = l_alv->get_aggregations( ) ).
- SELECT wotnr, langt FROM t246 INTO TABLE @DATA(t246) WHERE sprsl = @sy-langu ORDER BY wotnr.
- LOOP AT t_fcat_03 ASSIGNING FIELD-SYMBOL(<dx>).
- CASE <dx>-fieldname.
- WHEN 'PROYECTO'.
- <dx>-scrtext_s = <dx>-scrtext_m = <dx>-coltext = <dx>-seltext = <dx>-scrtext_l = 'Proyecto / Estadistico'.
- ENDCASE.
- IF <dx>-fieldname CP 'COL_*'.
- <dx>-scrtext_s = <dx>-scrtext_m = <dx>-coltext = <dx>-seltext = <dx>-scrtext_l = t246[ wotnr = <dx>-fieldname+5(1) ]-langt.
- <dx>-do_sum = abap_true.
- ENDIF.
- ENDLOOP.
- G_event_has = NEW lcl_event_handler( ).
- G_event_has->my_config = data_config.
- G_event_has->my_config-alv = 3.
- SET HANDLER G_event_has->handle_toolbar FOR grid_03.
- SET HANDLER G_event_has->handle_user_command FOR grid_03.
- SET HANDLER G_event_01->handle_data_changed FOR grid_03.
- SET HANDLER G_event_01->handle_menu_button FOR grid_03.
- grid_03->set_toolbar_interactive( ).
- grid_03->set_table_for_first_display(
- EXPORTING
- is_variant = gs_variant_02
- is_layout = gs_layout_02
- i_save = 'A'
- it_toolbar_excluding = gt_toolbar_has
- CHANGING
- it_fieldcatalog = t_fcat_03 "gt_field
- it_outtab = t_tab_has ).
- ENDFORM.
- FORM pbo_0200.
- SET PF-STATUS 'POPUP0200' EXCLUDING t_fcode.
- SET TITLEBAR 'TIT01' WITH ''.
- CHECK grid_02 IS INITIAL.
- gs_layout_02-cwidth_opt = 'X'.
- * gs_layout-sel_mode = 'A'.
- gs_layout_02-zebra = abap_true.
- * gs_layout-stylefname = 'CELLTAB'.
- gs_layout_02-ctab_fname = 'CELLCOLOR'.
- * gs_variant-report = sy-repid.
- * cc_02 = NEW cl_gui_custom_container( cm_02 ).
- grid_02 = NEW cl_gui_alv_grid( cl_gui_container=>default_screen ).
- *--[ Creamos el FCAT de la tabla interna
- cl_salv_table=>factory( IMPORTING r_salv_table = DATA(l_alv) CHANGING t_table = t_tab_03 ).
- t_fcat_02 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
- r_columns = l_alv->get_columns( )
- r_aggregations = l_alv->get_aggregations( ) ).
- LOOP AT t_fcat_02 ASSIGNING FIELD-SYMBOL(<f>).
- <f>-col_pos = sy-tabix.
- CASE <f>-fieldname.
- WHEN 'MES'.
- * <f>-do_sum = abap_true.
- <f>-FIX_COLUMn = abap_true.
- <f>-scrtext_s =
- <f>-scrtext_m =
- <f>-coltext = <f>-seltext =
- <f>-scrtext_l = TEXT-c05.
- WHEN 'UNAME'.
- * <f>-do_sum = abap_true.
- <f>-FIX_COLUMn = abap_true.
- <f>-scrtext_s =
- <f>-scrtext_m =
- <f>-coltext = <f>-seltext =
- <f>-scrtext_l = TEXT-c06.
- WHEN 'GJAHR'.
- * <f>-do_sum = abap_true.
- <f>-FIX_COLUMn = abap_true.
- <f>-scrtext_s =
- <f>-scrtext_m =
- <f>-coltext = <f>-seltext =
- <f>-scrtext_l = TEXT-c07.
- WHEN 'TOTAL'.
- * <f>-do_sum = abap_true.
- <f>-FIX_COLUMn = abap_true.
- <f>-scrtext_s =
- <f>-scrtext_m =
- <f>-coltext = <f>-seltext =
- <f>-scrtext_l = TEXT-c08.
- ENDCASE.
- IF <f>-fieldname CP 'DIA_*'.
- <f>-scrtext_s =
- <f>-scrtext_m =
- <f>-coltext = <f>-seltext =
- <f>-scrtext_l = <f>-fieldname+4(2).
- <f>-icon = abap_true.
- ENDIF.
- ENDLOOP.
- t_sort_02 = VALUE #( ( fieldname = 'GJAHR' up = abap_true subtot = abap_true )
- ( fieldname = 'MES' up = abap_true subtot = abap_true )
- ( fieldname = 'UNAME' up = abap_true subtot = abap_true ) ).
- * PERFORM alv_remove_buttons.
- grid_02->set_table_for_first_display(
- EXPORTING
- is_variant = gs_variant_02
- is_layout = gs_layout_02
- i_save = 'A'
- it_toolbar_excluding = gt_toolbar
- CHANGING
- it_fieldcatalog = t_fcat_02 "gt_field
- it_sort = t_sort_02
- it_outtab = t_tab_03 ).
- ENDFORM.
- FORM pbo_0100.
- IF sy-tcode = 'SE38'.
- REFRESH t_fcode.
- ELSE.
- ENDIF.
- IF p_visu = abap_true. APPEND 'SAVE' TO t_fcode. ENDIF.
- SET PF-STATUS 'MAIN0100' EXCLUDING t_fcode.
- SET TITLEBAR 'TIT01' WITH ''.
- CHECK grid_01 IS INITIAL.
- gs_layout-cwidth_opt = 'X'.
- gs_layout-sel_mode = 'A'.
- gs_layout-zebra = abap_true.
- gs_layout-stylefname = 'CELLTAB'.
- gs_variant-report = sy-repid.
- gs_variant-variant = p_vari.
- cc_01 = NEW cl_gui_custom_container( 'CC_ALV_01' ).
- grid_01 = NEW cl_gui_alv_grid( cc_01 ). "cl_gui_container=>default_screen ).
- DATA(t_fcat_02) = t_fcat_01.
- REFRESH t_fcat_02.
- LOOP AT t_fcat_01 ASSIGNING FIELD-SYMBOL(<f>) WHERE fieldname NP '*_TXT'.
- APPEND <f> TO t_fcat_02.
- READ TABLE t_fcat_01 ASSIGNING FIELD-SYMBOL(<ff>) WITH KEY fieldname = |{ <f>-fieldname }_TXT|. "l_name.
- CHECK sy-subrc EQ 0.
- APPEND <ff> TO t_fcat_02.
- ENDLOOP.
- t_fcat_01[] = t_fcat_02[].
- LOOP AT t_fcat_01 ASSIGNING <f>.
- <f>-col_pos = sy-tabix.
- <f>-edit = abap_true.
- IF <f>-fieldname CP '*TXT'.
- <f>-scrtext_s =
- <f>-scrtext_m =
- <f>-coltext = <f>-seltext =
- <f>-scrtext_l = TEXT-c02.
- <f>-edit = abap_false.
- ENDIF.
- CASE <f>-fieldname.
- WHEN 'FECHA' OR 'UNAME'.
- <f>-fix_column = abap_True.
- WHEN 'NAME'.
- <f>-scrtext_s =
- <f>-scrtext_m =
- <f>-coltext = <f>-seltext =
- <f>-scrtext_l = TEXT-c01.
- <f>-outputlen = 100.
- WHEN 'INDICE'.
- <f>-no_out = abap_true.
- WHEN 'CALLME' OR 'VISADAS'.
- <f>-checkbox = abap_true.
- when 'CODIGO'.
- <f>-hotspot = abap_true.
- WHEN 'HORAS'.
- <f>-do_sum = abap_true.
- WHEN 'MANDT'. <f>-no_out = <f>-tech = abap_true.
- WHEN 'FECHA_TXT'.
- <f>-fix_column = abap_True.
- <f>-coltext = <f>-seltext = <f>-scrtext_l = TEXT-c09.
- ENDCASE.
- ENDLOOP.
- t_sort = VALUE #( ( SPOS = 1 fieldname = 'FECHA' up = abap_true subtot = abap_true )
- ( SPOS = 2 fieldname = 'UNAME' up = abap_true subtot = abap_true )
- ( SPOS = 3 fieldname = 'BEGTI' up = abap_true )
- ( SPOS = 4 fieldname = 'INDICE' up = abap_true )
- ( SPOS = 5 fieldname = 'PROYECTO' up = abap_true ) ).
- PERFORM alv_remove_buttons.
- grid_01->set_table_for_first_display(
- EXPORTING
- is_variant = gs_variant
- is_layout = gs_layout
- i_save = 'A'
- it_toolbar_excluding = gt_toolbar
- CHANGING
- it_fieldcatalog = t_fcat_01 "gt_field
- it_sort = t_sort
- it_outtab = t_tab_01 ).
- G_event_01 = NEW lcl_event_handler( ).
- G_event_01->my_config = data_config.
- G_event_01->my_config-alv = 1.
- SET HANDLER G_event_01->handle_toolbar FOR grid_01.
- SET HANDLER G_event_01->handle_user_command FOR grid_01.
- SET HANDLER G_event_01->handle_data_changed FOR grid_01.
- SET HANDLER G_event_01->handle_menu_button FOR grid_01.
- SET HANDLER G_event_01->handle_hotspot FOR grid_01.
- grid_01->set_toolbar_interactive( ).
- grid_01->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
- grid_01->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter ).
- ENDFORM.
- FORM alv_remove_buttons.
- CLEAR gt_toolbar.
- gt_toolbar = VALUE #( BASE gt_toolbar ( cl_gui_alv_grid=>mc_fc_detail )
- ( cl_gui_alv_grid=>mc_fc_loc_copy )
- ( cl_gui_alv_grid=>mc_fc_loc_paste )
- ( cl_gui_alv_grid=>mc_fc_loc_copy_row )
- ( cl_gui_alv_grid=>mc_fc_loc_paste_new_row )
- ( cl_gui_alv_grid=>mc_fc_loc_cut )
- ( cl_gui_alv_grid=>mc_fc_loc_undo )
- ( cl_gui_alv_grid=>mc_fc_check )
- ( cl_gui_alv_grid=>mc_fc_refresh )
- ( cl_gui_alv_grid=>mc_fc_info )
- ( cl_gui_alv_grid=>mc_fc_html )
- ( cl_gui_alv_grid=>mc_fc_help )
- ).
- IF p_visu = abap_true.
- gt_toolbar = VALUE #( BASE gt_toolbar ( cl_gui_alv_grid=>mc_fc_loc_delete_row )
- ( cl_gui_alv_grid=>mc_fc_loc_insert_row )
- ( cl_gui_alv_grid=>mc_fc_loc_append_row )
- ).
- ENDIF.
- gt_toolbar_has = VALUE #( BASE gt_toolbar ( cl_gui_alv_grid=>mc_fc_detail )
- ( cl_gui_alv_grid=>mc_fc_loc_copy )
- ( cl_gui_alv_grid=>mc_fc_loc_paste )
- ( cl_gui_alv_grid=>mc_fc_loc_paste_new_row )
- ( cl_gui_alv_grid=>mc_fc_loc_cut )
- ( cl_gui_alv_grid=>mc_fc_loc_undo )
- ( cl_gui_alv_grid=>mc_fc_check )
- ( cl_gui_alv_grid=>mc_fc_refresh )
- ( cl_gui_alv_grid=>mc_fc_info )
- ( cl_gui_alv_grid=>mc_fc_html )
- ( cl_gui_alv_grid=>mc_fc_help )
- ).
- ENDFORM.
- FORM pai_0200.
- DATA(l_okcode) = g_okcode.
- CLEAR g_okcode.
- CASE l_okcode.
- WHEN 'BACK'.
- grid_02->Free( ).
- CLEAR: grid_02.
- LEAVE TO SCREEN 0.
- ENDCASE.
- ENDFORM.
- FORM pai_0300.
- DATA(l_okcode) = g_okcode.
- CLEAR g_okcode.
- CASE l_okcode.
- WHEN 'BACK'.
- cc_03->free( ).
- CLEAR: cc_03, grid_03.
- LEAVE TO SCREEN 0.
- ENDCASE.
- ENDFORM.
- FORM pai_0100.
- DATA(l_okcode) = g_okcode.
- CLEAR g_okcode.
- CASE l_okcode.
- WHEN 'SAVE'. PERFORM boton_save.
- WHEN 'BACK'. PERFORM boton_exit_program.
- ENDCASE.
- ENDFORM.
- FORM boton_save_delete.
- * DATA(l_datum) = CONV sydatum( sy-datum - c_proteccion ).
- *--[ Buscamos los borrados
- LOOP AT t_tab_del INTO DATA(l_02).
- IF sy-uname IN data_config-su.
- ELSE.
- IF l_02-fecha < data_config-date_before OR
- sy-uname NE l_02-uname.
- APPEND l_02 TO t_tab_01. "<-- Restauramos
- CONTINUE. " No se puede borrar
- ENDIF.
- ENDIF.
- *--[ Eliminamos el registro de BD
- DELETE FROM zxx_horas
- WHERE fecha = l_02-fecha
- AND uname = l_02-uname
- AND indice = l_02-indice.
- *--[ Eliminamos las posibles actualizaciones del registro
- DELETE t_tab_upd WHERE fecha = l_02-fecha
- AND uname = l_02-uname
- AND indice = l_02-indice.
- ENDLOOP.
- REFRESH t_tab_del. "<-- Reinicializamos el contador
- ENDFORM.
- FORM boton_save_update.
- DATA: l_tab TYPE zxx_horas.
- * DATA(l_datum) = CONV sydatum( sy-datum - c_proteccion ).
- LOOP AT t_tab_upd INTO DATA(ax).
- *--[ Localizamos el registro con los cambios
- READ TABLE t_tab_01 INTO DATA(bx) WITH KEY fecha = ax-fecha
- uname = ax-uname
- indice = ax-indice.
- CHECK sy-subrc EQ 0.
- IF sy-uname IN data_config-su.
- ELSE.
- IF bx-fecha < data_config-date_before OR
- sy-uname NE bx-uname.
- CONTINUE. " No se puede borrar
- ENDIF.
- ENDIF.
- *--[ Grabamos en BD
- CLEAR l_tab.
- MOVE-CORRESPONDING bx TO l_tab.
- MODIFY zxx_horas FROM l_tab.
- *--[ Borramos los posibles repetidos
- DELETE t_tab_upd WHERE fecha = ax-fecha AND
- uname = ax-uname AND
- indice = ax-indice.
- ENDLOOP.
- REFRESH t_tab_upd.
- ENDFORM.
- FORM boton_save_insert.
- TYPES: BEGIN OF ty_tmp,
- fecha TYPE datum,
- uname TYPE xubname,
- indice TYPE sytabix,
- END OF ty_tmp.
- DATA: t_tmp TYPE STANDARD TABLE OF ty_tmp,
- l_tab TYPE zxx_horas.
- * DATA(l_datum) = CONV sydatum( sy-datum - c_proteccion ).
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<ax>) WHERE indice IS INITIAL.
- IF sy-uname IN data_config-su.
- ELSE.
- IF <ax>-fecha < data_config-date_before OR
- sy-uname NE <ax>-uname.
- CONTINUE. " No se puede insertar
- ENDIF.
- ENDIF.
- READ TABLE t_tmp ASSIGNING FIELD-SYMBOL(<bx>) WITH KEY fecha = <ax>-fecha
- uname = <ax>-uname.
- IF sy-subrc EQ 0.
- ADD 1 TO <bx>-indice.
- ELSE.
- APPEND INITIAL LINE TO t_tmp ASSIGNING <bx>.
- <bx>-fecha = <ax>-fecha.
- <bx>-uname = <ax>-uname.
- SELECT MAX( indice ) INTO @DATA(l_indice) FROM zxx_horas WHERE fecha = @<ax>-fecha AND
- uname = @<ax>-uname.
- IF sy-subrc EQ 0.
- <bx>-indice = l_indice + 1.
- ELSE.
- <bx>-indice = 1. "
- ENDIF.
- ENDIF.
- <ax>-indice = <bx>-indice.
- CLEAR l_tab.
- MOVE-CORRESPONDING <ax> TO l_tab.
- MODIFY zxx_horas FROM l_tab.
- ENDLOOP.
- ENDFORM.
- FORM boton_save.
- grid_01->check_changed_data( ).
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Verificamos los campos obligatorios.
- DATA(l_save) = abap_true.
- LOOP AT t_tab_01 INTO DATA(l_tab) WHERE fecha >= '20241201' AND
- codigo IS INITIAL.
- CLEAR l_save.
- MESSAGE s398(00) WITH TEXT-e02.
- EXIT.
- ENDLOOP.
- CHECK l_save = abap_true.
- CHECK g_save = abap_true.
- PERFORM boton_save_delete.
- PERFORM boton_save_update.
- PERFORM boton_save_insert.
- *--[ Recargamos para que se actualicen TODOS los registros de BD
- *--[ Obviamente los ajenos
- PERFORM data_load.
- grid_01->refresh_table_display( ).
- CLEAR g_save.
- MESSAGE s398(00) WITH 'Datos grabados correctamente' '' '' ''.
- *** exit.
- **** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ****--[ Arreglamos índices: Triple LOOP dinámica :D :D :D
- ****--[ A alguien le va a explotar la cabeza
- *** SORT t_tab_01 BY fecha uname indice DESCENDING.
- *** LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) WHERE indice IS INITIAL.
- ***
- *** LOOP AT t_tab_01 INTO DATA(l_f) WHERE fecha = <f>-fecha AND
- *** uname = <f>-uname AND
- *** NOT indice IS INITIAL.
- *** data(l_num) = l_f-indice .
- *** LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<ff>) WHERE fecha = <f>-fecha AND
- *** uname = <f>-uname AND
- *** indice IS INITIAL.
- *** <ff>-indice = l_num = l_num + 1.
- *** endloop.
- ***
- *** EXIT.
- *** ENDLOOP.
- *** IF <f>-indice IS INITIAL.
- *** <f>-indice = 1.
- *** ENDIF.
- *** ENDLOOP.
- **** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ****--[ Quitamos tabla de textos, para grabar sólo lo que toca...
- *** DATA: t_tmp TYPE STANDARD TABLE OF zxx_horas,
- *** l_tmp LIKE LINE OF t_tmp.
- *** REFRESH t_tmp.
- *** LOOP AT t_tab_01 INTO l_tab_01.
- ***
- *** IF sy-uname IN gr_su.
- *** ELSE.
- *** CHECK l_tab_01-uname = sy-uname. " Sólo usuarios propios
- *** ENDIF.
- ***
- *** CLEAR l_tmp.
- *** MOVE-CORRESPONDING l_tab_01 TO l_tmp.
- *** APPEND l_tmp TO t_tmp.
- *** ENDLOOP.
- *** MODIFY zxx_horas FROM TABLE t_tmp. "t_tab_01.
- *** SORT t_tab_01 BY fecha uname indice.
- *** t_tab_02[] = t_tab_01[]. "<-- BackUp
- *** grid_01->refresh_table_display( ).
- *** CLEAR g_save.
- ENDFORM.
- FORM boton_exit_program.
- *--[ Destruir controladores y ALVs
- IF g_save IS NOT INITIAL.
- PERFORM popup_to_save CHANGING sy-subrc.
- CHECK sy-subrc EQ 0.
- CLEAR g_save.
- ENDIF.
- CLEAR: grid_01.
- LEAVE TO SCREEN 0.
- ENDFORM.
- FORM popup_to_save CHANGING p_subrc TYPE sysubrc.
- DATA: l_ans(1).
- CALL FUNCTION 'POPUP_TO_CONFIRM'
- EXPORTING
- titlebar = TEXT-t07
- text_question = TEXT-q01
- text_button_1 = TEXT-q02
- text_button_2 = TEXT-q03
- default_button = '2'
- display_cancel_button = abap_false
- start_column = 50
- iv_quickinfo_button_1 = TEXT-q04
- iv_quickinfo_button_2 = TEXT-q05
- IMPORTING
- answer = l_ans
- EXCEPTIONS
- text_not_found = 1
- OTHERS = 2.
- IF l_ans = '1'.
- *--[ Bye Bye Bye
- g_save = abap_false.
- CLEAR sy-subrc.
- ELSE.
- p_subrc = 69.
- * EXIT. "-> Back to the future
- ENDIF.
- ENDFORM.
- FORM bot_crear_estat USING l_code.
- DATA(l_num) = CONV NUMc2( l_code ).
- DATA(l_stat) = data_config-estat[ l_num ].
- PERFORM data_add_begda_endda USING l_stat-codigo l_stat-icono l_stat-texto.
- ENDFORM.
- FORM bot_has.
- CLEAR grid_02.
- DATA: l_num TYPE p.
- l_num = sy-datum MOD 7. "sy-datum MOD 7.
- IF l_num > 1.
- l_num -= 1.
- ELSE.
- l_num += 6.
- ENDIF.
- l_num -= 1.
- g_today = sy-datum - l_num.
- PERFORM bot_has_calc USING g_today.
- CALL SCREEN '0300'.
- ENDFORM.
- FORM bot_has_calc USING p_date TYPE sydatum.
- DATA: l_has TYPE ty_has.
- REFRESH t_tab_has.
- DATA(l_low) = CONV datum( p_date ).
- DATA(l_high) = CONV datum( p_date + 6 ).
- SELECT fecha, proyecto, codigo, SUM( horas ) AS horas FROM zxx_horas INTO TABLE @DATA(t_tab)
- WHERE fecha >= @p_date
- AND fecha <= @l_high
- AND uname = @sy-uname
- GROUP BY fecha, proyecto, codigo
- ORDER BY fecha ASCENDING, proyecto ASCENDING.
- DATA(l_num) = CONV numc2( '00' ).
- LOOP AT t_tab ASSIGNING FIELD-SYMBOL(<ax>).
- TRY.
- DATA(l_estat) = data_config-estat[ codigo = <ax>-codigo ]-codigo.
- <ax>-proyecto = <ax>-codigo.
- CATCH cx_root.
- ENDTRY.
- CLEAR <ax>-codigo.
- ENDLOOP.
- DO 6 TIMES.
- l_num = sy-index + 1.
- CLEAR l_has.
- ASSIGN COMPONENT l_num OF STRUCTURE l_has TO FIELD-SYMBOL(<f>).
- LOOP AT t_tab INTO DATA(l_tab) WHERE fecha = l_low.
- <f> = l_tab-horas.
- l_has-proyecto = l_tab-proyecto.
- COLLECT l_has INTO t_tab_has.
- ENDLOOP.
- ADD 1 TO l_low.
- ENDDO.
- CLEAR l_has.
- DATA: l_001(10), l_002(10).
- WRITE p_date TO l_001.
- WRITE l_high TO l_002.
- l_has-proyecto = |Semana del { l_001 } al { l_002 }|.
- INSERT l_has INTO t_tab_has INDEX 1.
- ENDFORM.
- FORM bot_week USING p_one_direction.
- CASE p_one_direction.
- WHEN '>'. ADD 7 TO g_today.
- WHEN '<'. SUBTRACT 7 FROM g_today.
- ENDCASE.
- PERFORM bot_has_calc USING g_today.
- grid_03->refresh_table_display( ).
- ENDFORM.
- FORM bot_copy.
- DATA: index_rows TYPE lvc_t_row.
- grid_01->get_selected_rows( IMPORTING et_index_rows = index_rows ).
- LOOP AT index_rows INTO DATA(l_row) WHERE rowtype IS INITIAL.
- READ TABLE t_tab_01 INDEX l_row-index INTO DATA(ax).
- CLEAR ax-indice.
- DELETE ax-celltab WHERE fieldname = 'FECHA' OR fieldname = 'UNAME'.
- APPEND ax TO t_tab_01.
- ENDLOOP.
- grid_01->refresh_table_display( ).
- ENDFORM.
- FORM bot_copy_modelo.
- DATA: index_rows TYPE lvc_t_row.
- grid_01->get_selected_rows( IMPORTING et_index_rows = index_rows ).
- DELETE index_rows WHERE rowtype IS NOT INITIAL.
- IF lines( index_rows ) EQ 1.
- DATA: t_fields TYPE STANDARD TABLE OF sval,
- l_ans TYPE c LENGTH 1.
- t_fields = VALUE #(
- ( tabname = 'ZXX_HORAS' fieldname = 'FECHA' field_obl = abap_true value = sy-datum fieldtext = 'Fecha final' )
- ).
- CALL FUNCTION 'POPUP_GET_VALUES'
- EXPORTING
- * NO_VALUE_CHECK = ' '
- popup_title = 'Fecha final'
- start_column = '50'
- start_row = '5'
- IMPORTING
- returncode = l_ans
- TABLES
- fields = t_fields
- EXCEPTIONS
- error_in_fields = 1
- OTHERS = 2.
- IF l_ans IS INITIAL AND sy-subrc IS INITIAL.
- DATA(l_dest) = CONV sydatum( t_fields[ 1 ]-value ).
- DATA(l_max) = CONV sydatum( sy-datum + 365 ). "<.. Protección
- IF l_dest <= sy-datum OR l_dest > l_max.
- MESSAGE s398(00) WITH 'La fecha es errónea' '' '' '' DISPLAY LIKE 'E'.
- ENDIF.
- DATA t_SPOPLI TYPE STANDARD TABLE OF spopli.
- SELECT 'X' AS selflag,
- langt AS varoption
- FROM t246 INTO CORRESPONDING FIELDS OF TABLE @t_spopli WHERE sprsl = @sy-langu ORDER BY wotnr.
- t_spopli[ 7 ]-inactive = abap_true. t_spopli[ 7 ]-selflag = abap_false.
- t_spopli[ 6 ]-inactive = abap_true. t_spopli[ 6 ]-selflag = abap_false.
- CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
- EXPORTING
- * CURSORLINE = 1
- mark_flag = abap_true
- mark_max = 6
- start_col = 50
- start_row = 5
- textline1 = 'Maque los días a repetir la tarea'
- titel = 'Días de repetición'
- * DISPLAY_ONLY = ' '
- IMPORTING
- answer = l_ans
- TABLES
- t_spopli = t_SPOPLI
- EXCEPTIONS
- not_enough_answers = 1
- too_much_answers = 2
- too_much_marks = 3
- OTHERS = 4.
- IF sy-subrc <> 0 OR l_ans IS NOT INITIAL.
- EXIT.
- ENDIF.
- TRY.
- DATA(l_val) = t_spopli[ selflag = abap_true ].
- CATCH cx_root.
- MESSAGE s398(00) WITH 'Debe marcar algunos días' '' '' '' DISPLAY LIKE 'E'.
- EXIT.
- ENDTRY.
- DATA: al TYPE cind.
- LOOP AT index_rows INTO DATA(l_row) WHERE rowtype IS INITIAL.
- READ TABLE t_tab_01 INDEX l_row-index INTO DATA(ax).
- CLEAR ax-indice.
- DELETE ax-celltab WHERE fieldname = 'FECHA' OR fieldname = 'UNAME'.
- DO.
- ax-fecha = ax-fecha + 1.
- CALL FUNCTION 'DATE_COMPUTE_DAY'
- EXPORTING
- date = ax-fecha
- IMPORTING
- day = al.
- CHECK al NA '67'.
- CHECK t_spopli[ al ]-selflag = abap_true.
- APPEND ax TO t_tab_01.
- g_save = abap_true.
- IF ax-fecha >= l_Dest.
- EXIT.
- ENDIF.
- ENDDO.
- ENDLOOP.
- grid_01->refresh_table_display( ).
- ENDIF.
- ELSE.
- MESSAGE s398(00) WITH 'Sólo puede seleccionar un registro' '' '' '' DISPLAY LIKE 'E'.
- ENDIF.
- ENDFORM.
- FORM bot_crea_param USING p_mod.
- DATA(t_val) = VALUE ty_sval( tabname = 'ZXX_HORAS' field_obl = abap_true
- ( fieldname = 'ASIGNADO_L'
- fieldtext = SWITCH #( p_mod
- WHEN 'P' THEN 'Proyecto'
- WHEN 'M' THEN 'Módulo'
- WHEN 'T' THEN 'Tipo Tarea'
- WHEN 'E' THEN 'Estado' ) )
- ( FIELdname = 'DESCR' fieldtext = 'Descripción' )
- ).
- DATA(lv_return) = abap_false.
- DATA(l_titulo) = |{ TEXT-t02 } { t_val[ 1 ]-fieldtext }|.
- CALL FUNCTION 'POPUP_GET_VALUES'
- EXPORTING
- popup_title = l_titulo
- IMPORTING
- returncode = lv_return
- TABLES
- fields = t_val
- EXCEPTIONS
- error_in_fields = 1
- OTHERS = 2.
- CHECK sy-subrc EQ 0 AND lv_return IS INITIAL.
- DATA(l_dom) = SWITCH #( p_mod
- WHEN 'P' THEN 'ZXX_D_PROYECTO'
- WHEN 'M' THEN 'ZXX_D_MODULO'
- WHEN 'T' THEN 'ZXX_D_TIPO'
- WHEN 'E' THEN 'ZXX_D_STATUS' ).
- SELECT MAX( valpos ) INTO @DATA(l_max) FROM dd07l WHERE domname = @l_dom.
- l_max = l_max + 1.
- DATA(l_dd07l) = VALUE dd07l( domname = l_dom
- as4local = 'A'
- valpos = l_max
- as4vers = '0000'
- domvalue_l = to_upper( t_val[ 1 ]-value ) ).
- DATA(l_dd07T) = VALUE dd07t( domname = l_dom
- ddlanguage = sy-langu
- as4local = 'A'
- valpos = l_max
- as4vers = '0000'
- ddtext = t_val[ 2 ]-value
- domvalue_l = to_upper( t_val[ 1 ]-value ) ).
- SELECT SINGLE * FROM dd07l INTO @DATA(l_kk) "<-- Sí, lo sé, no es profesional
- WHERE domname = @l_dom AND
- domvalue_l = @l_dd07l-domvalue_l.
- CHECK sy-subrc NE 0.
- MODIFY dd07l FROM l_dd07l.
- MODIFY dd07t FROM l_dd07t.
- ENDFORM.
- FORM data_add_begda_endda USING p_texto p_icono p_descr.
- DATA(t_val) = VALUE ty_sval( tabname = 'ZXX_HORAS'
- field_obl = abap_true
- ( fieldname = 'BEGDATE' fieldtext = 'Fecha Desde' )
- ( fieldname = 'ENDDATE' fieldtext = 'Fecha hasta' )
- ).
- DATA(lv_return) = abap_false.
- DATA(l_titulo) = |{ TEXT-t02 } { p_descr }|.
- CALL FUNCTION 'POPUP_GET_VALUES'
- EXPORTING
- popup_title = l_titulo
- IMPORTING
- returncode = lv_return
- TABLES
- fields = t_val
- EXCEPTIONS
- error_in_fields = 1
- OTHERS = 2.
- IF sy-subrc EQ 0 AND lv_return IS INITIAL.
- DATA(l_begda) = CONV sydatum( t_val[ 1 ]-value ).
- DATA(l_endda) = CONV sydatum( t_Val[ 2 ]-value ).
- IF l_begda > l_endda.
- MESSAGE s398(00) WITH TEXT-e03.
- EXIT.
- ENDIF.
- DATA(l_rest) = l_endda - l_begda.
- IF l_rest > data_config-days_before.
- MESSAGE s398(00) WITH TEXT-e04.
- EXIT.
- ENDIF.
- DO.
- t_tab_01 = VALUE #( BASE t_tab_01
- ( fecha = l_begda
- uname = sy-uname
- proyecto = ''
- modulo = ''
- codigo = to_upper( p_texto )
- desc_codigo = to_upper( p_descr )
- asignado_l = sy-uname
- asignado = sy-uname
- begdate = l_BEGDA
- enddate = l_begda
- horas = 8
- status = 99
- avance = 100
- descr = |{ to_lower( p_texto ) } solicitado el { sy-datum }|
- )
- ).
- ADD 1 TO l_begda.
- CHECK l_begda > l_endda.
- g_save = abap_true.
- EXIT.
- ENDDO.
- ENDIF.
- ENDFORM.
- FORM bot_vista_global.
- *--[ Creamos tabla de Planning
- DATA(m_tab) = t_tab_01.
- SORT m_tab BY fecha ASCENDING.
- DATA(l_ano_ini) = CONV numc4( m_tab[ 1 ]-fecha+0(4) ).
- SORT m_tab BY fecha DESCENDING.
- DATA(l_ano_fin) = CONV numc4( m_tab[ 1 ]-fecha+0(4) ).
- REFRESH t_tab_03.
- DO.
- DO 12 TIMES.
- DATA(l_mes) = CONV numc2( sy-index ).
- LOOP AT t_tab_01 INTO DATA(l_data) GROUP BY l_data-uname.
- t_tab_03 = VALUE #( BASE t_tab_03 ( gjahr = l_ano_ini
- mes = l_mes
- uname = l_data-uname
- uname_txt = l_data-uname_txt ) ).
- ENDLOOP.
- ENDDO.
- l_ano_ini += 1.
- CHECK l_ano_ini > l_ano_fin.
- EXIT.
- ENDDO.
- *--[ Rellenamos tabla de planning
- LOOP AT t_tab_01 INTO l_data.
- READ TABLE T_tAB_03 ASSIGNING FIELD-SYMBOL(<f>) WITH KEY gjahr = l_data-fecha+0(4)
- mes = l_data-fecha+4(2)
- uname = l_data-uname.
- DATA(l_Reg) = |<f>-DIA_{ l_data-fecha+6(2) }|.
- ASSIGN (l_reg) TO FIELD-SYMBOL(<Ff>).
- CHECK sy-subrc EQ 0.
- TRY.
- DATA(ax) = data_config-estat[ codigo = l_data-codigo ].
- <ff> = ax-icono.
- <f>-cellcolor = VALUE #( BASE <f>-cellcolor ( fname = l_Reg+4 color-col = ax-color color-int = 1 color-inv = 0 ) ).
- CATCH cx_root.
- <ff> = icon_working_plan.
- ENDTRY.
- <f>-total += l_data-horas.
- AT LAST.
- DELETE t_tab_03 WHERE total IS INITIAL.
- ENDAT.
- ENDLOOP.
- LOOP AT t_tab_03 INTO DATA(l_data_ano) GROUP BY l_data_ano-gjahr.
- DO 12 TIMES.
- l_mes = CONV numc2( sy-index ).
- READ TABLE t_tab_03 TRANSPORTING NO FIELDS WITH KEY gjahr = l_Data_ano-gjahr
- mes = l_mes.
- CHECK sy-subrc EQ 0.
- DO 31 TIMES.
- DATA(l_dia) = CONV numc2( sy-index ).
- TRY.
- DATA(l_fecha) = CONV sydatum( |{ l_data_ano-gjahr }{ l_mes }{ l_dia }| ).
- CATCH cx_root.
- CONTINUE.
- ENDTRY.
- *--[ Sí, lo sé, se puede optimizar sumando 7 días, si lo estás leyendo, hazlo tú :D
- DATA: l_tipo TYPE p.
- CALL FUNCTION 'DAY_IN_WEEK'
- EXPORTING
- datum = l_fecha
- IMPORTING
- wotnr = l_tipo.
- .
- CHECK l_tipo > 5 OR
- ( l_fecha+4(4) IN data_config-t_fest AND lines( data_config-t_fest ) > 0 ) OR
- ( l_fecha IN data_config-t_festfull AND lines( data_config-t_festfull ) > 0 ).
- DATA(l_dia_txt) = |DIA_{ l_dia }|.
- LOOP AT t_tab_03 ASSIGNING FIELD-SYMBOL(<ax>) WHERE gjahr = l_data_ano-gjahr AND
- mes = l_mes.
- <ax>-cellcolor = VALUE #( BASE <ax>-cellcolor ( fname = l_dia_txt color-col = 7 color-int = 1 color-inv = 0 ) ).
- ENDLOOP.
- ENDDO.
- ENDDO.
- ENDLOOP.
- CALL SCREEN '0200' STARTING AT 5 5 ENDING AT 190 25.
- ENDFORM.
- ****# Fichero de configuración para el programa Z_XX_PRG_HORAS
- ****
- ****# Fichero de configuración para el programa Z_XX_PRG_HORAS
- ****
- ****[Seguridad]
- ****# Definimos los SuperUsuarios
- ****SuperUSER ALEX # Alex
- ****
- ****[Constantes]
- ****Days_Before 90
- ****HAS_Url https://
- ****JIRA_Url http://jira.XXX.es/browse/
- ****
- ****#Campos a cargar por defecto, con el siguiente formato
- ****#Default [NOMBRE_DEL_CAMPO] [VALOR_O_VARIABLE_SISTEMA]
- ****Default PROYECTO XXXX
- ****Default MODULO XX
- ****Default STATUS 30
- ****Default AVANCE 10
- ****Default ASIGNADO SY-UNAME
- ****DEfault BEGDATE SY-DATUM
- ****
- ****[Estadisticos]
- ****# Valores Estadisticos posibles
- ****
- ****# Codigo;Icono;Color;Texto
- ****ESTAT VACACIONES;@IQ@;5;Vacaciones
- ****ESTAT ENFERMEDAD;@IP@;6;Enfermedad
- ****ESTAT OTROS;@3P@;3;Otros Valores
- ****
- ****[Calendario]
- ****Festivos_MMDD 0101;0106;0501;0815;1012
- ****Festivos_MMDD 1101;1206;1208;1224;1225;1231
- ****
- ****Festivos_AAAAMMDD 20250319;20250418;20250421
- ****Festivos_AAAAMMDD 20251009
- ****