Documentos de Académico
Documentos de Profesional
Documentos de Cultura
* Declaraci�n de tablas
* Declaracion de estructuras
TYPES BEGIN OF str_detail. "Estructura para los detalles de tiempos
TYPES: lstar TYPE lstar,
rprznr TYPE eprznr,
rkstr TYPE ekstr,
rkostl TYPE ekostl,
raufnr TYPE eaufnr,
rnplnr TYPE nw_aufnr,
vornr TYPE vornr,
empct TYPE empct.
TYPES END OF str_detail.
* Declaraci�n de infotipos
INFOTYPES: 0001, "Infotipo de Asignaci�n organizativa
0007. "Infotipo de Horario de trabajo te�rico
* Declaracion de Constantes
CONSTANTS: all VALUE '4', "para consultar infotipos
first VALUE '1', "para consultar infotipos
nop(3) VALUE 'NOP'. "para consultar infotipos
DATA BEGIN OF ti_pers OCCURS 0. "Tabla interna para los datos de las
personas
INCLUDE STRUCTURE zco_tacpers.
DATA END OF ti_pers.
DATA BEGIN OF ti_ceco OCCURS 0. "Tabla interna para los datos de los
centros de coste
INCLUDE STRUCTURE zco_tacceco.
DATA END OF ti_ceco.
DATA: ti_log TYPE TABLE OF str_log. "Tabla interna para los datos del log
*Declaracion de rangos.
RANGES r_pernr FOR prel-pernr.
AT SELECTION-SCREEN ON p_perfil.
p_perfil = 'AUTO_DIA'.
*----------------------------------------------------------------------*
* Programa principal. *
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM main.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form MAIN
*&---------------------------------------------------------------------*
FORM main.
PERFORM read_data.
PERFORM upload_data.
PERFORM report_data.
ENDFORM. " MAIN.
*&---------------------------------------------------------------------*
*& Form READ_DATA
*&---------------------------------------------------------------------*
FORM read_data.
CLEAR pernrtab.
REFRESH pernrtab.
* IF p_varian IS INITIAL.
* SUBMIT rplfst01 VIA SELECTION-SCREEN AND RETURN.
* ELSE.
SUBMIT rplfst01 USING SELECTION-SET p_varian AND RETURN.
* ENDIF.
IMPORT pernrtab FROM MEMORY ID 'PERNRTAB'.
ENDFORM. " READ_DATA.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
FORM upload_data.
CLEAR: t,
wa_log,
ti_log.
REFRESH: t,
ti_log.
* Realiza un recorrido a la lista de empleados
LOOP AT pernrtab.
vd_date = p_fecini.
* Realiza el registro de tiempos dia por dia para la persona indicada
WHILE vd_date <= p_fecfin.
CLEAR wa_0001.
begda = vd_date.
endda = vd_date.
* Consulta infotipo 0001 del empleado
PERFORM read_infotype(sapfp50p) USING pernrtab-pernr '0001'
space space all begda endda first nop wa_0001.
IF sy-subrc = 0.
CLEAR ti_pers.
REFRESH ti_pers.
* Consulta si la persona tiene Registro sugerido "Estandarizado" por persona
para la fecha.
SELECT *
FROM zco_tacpers
INTO CORRESPONDING FIELDS OF TABLE ti_pers
WHERE bukrs = wa_0001-bukrs
AND pernr = pernrtab-pernr
AND ( begda <= vd_date AND endda >= vd_date )
ORDER BY zidreg DESCENDING.
IF sy-subrc = 0.
* Indica que la tabla a usar para el registro de tiempos en CATS es TI_PERS
vc_table = 'PERS'.
PERFORM reg_timecats USING vc_table.
ELSE.
CLEAR ti_ceco.
REFRESH ti_ceco.
* Consulta si existe Registro sugerido "Estandarizado" para el centro de
coste de la persona para la fecha.
SELECT *
FROM zco_tacceco
INTO CORRESPONDING FIELDS OF TABLE ti_ceco
WHERE bukrs = wa_0001-bukrs
AND kostl = wa_0001-kostl
AND ( begda <= vd_date AND endda >= vd_date )
ORDER BY zidreg DESCENDING.
IF sy-subrc = 0.
CLEAR vn_con.
* Consulta si la persona est� incluida en la tabla de personas excluidas
SELECT COUNT( * )
FROM zco_tacpexc
INTO vn_con
WHERE bukrs = wa_0001-bukrs
AND pernr = pernrtab-pernr.
IF vn_con > 0.
* Se registra en el log que la persona esta excluida del ceco
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
CONCATENATE 'La persona se encuentra excluida del Centro de Coste'
wa_0001-kostl INTO wa_log-text SEPARATED BY space.
APPEND wa_log TO ti_log.
ELSE.
vc_table = 'CECO'.
PERFORM reg_timecats USING vc_table.
ENDIF.
ELSE.
* Se registra en el log el CeCo al que pertenece la persona no tiene
registro sugerido para la fecha
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
CONCATENATE 'El Centro de Coste' wa_0001-kostl 'no tiene registro
sugerido para la fecha' INTO wa_log-text SEPARATED BY space.
APPEND wa_log TO ti_log.
ENDIF.
ENDIF.
ELSE.
* Se Registra en log que la persona no tiene informacion en el infotipo 1
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
wa_log-text = 'La persona no posee informacion en el infotipo 1'.
APPEND wa_log TO ti_log.
ENDIF.
vd_date = vd_date + 1.
ENDWHILE.
* move-corresponding input_tbl to linea.
ENDLOOP.
ENDFORM. "upload_data
*&---------------------------------------------------------------------*
*& Form REPORT_DATA
*&---------------------------------------------------------------------*
FORM report_data.
DATA: vc_fecha(10) TYPE c.
SKIP.
WRITE: /1 'Fecha',
13 'C�digo',
23 'LOG',
28 'Descripci�n'.
ULINE.
LOOP AT ti_log INTO wa_log.
WRITE wa_log-fecha TO vc_fecha.
WRITE: /1 vc_fecha,
13 wa_log-pernr,
23 wa_log-status,
28 wa_log-text.
ENDLOOP.
ENDFORM. " REPORT_DATA.
*&---------------------------------------------------------------------*
*& Form LLEVAR_REG_REPORTE
*&---------------------------------------------------------------------*
FORM registro_log.
SET BLANK LINES ON.
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = errtext(3).
wa_log-text = errtext(100).
APPEND wa_log TO ti_log.
ENDFORM. " REGISTRO_LOG
*&---------------------------------------------------------------------*
*& Form REG_TIMECATS
*&---------------------------------------------------------------------*
* Rutina que realiza el registro de tiempos en CAT2
*----------------------------------------------------------------------*
* -->P_TABLE - Indica que tabla se usa (TI_PERS o TI_CECO
*----------------------------------------------------------------------*
FORM reg_timecats USING p_table LIKE vc_table.
CLEAR: r_pernr,
ti_timecats,
wa_timecats,
ti_targethrs,
wa_targethrs.
REFRESH: r_pernr,
ti_timecats,
ti_targethrs.
r_pernr-sign = 'I'.
r_pernr-option = 'BT'.
r_pernr-low = pernrtab-pernr.
r_pernr-high = pernrtab-pernr.
APPEND r_pernr.
IF sy-subrc = 0.
* Verifica la consulta de tiempos obtuvo registros.
IF ti_timecats IS INITIAL.
* Registra en el log que la persona no tiene informacion de tiempo para
registrar
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
wa_log-text = 'La persona no tiene informaci�n de tiempo para registrar'.
APPEND wa_log TO ti_log.
ELSE.
* Obtiene la cantidad de horas teoricas a registrar
CALL FUNCTION 'CATS_GET_TARGET_HOURS'
EXPORTING
pernr = pernrtab-pernr
begda = vd_date
endda = vd_date
timetype = ' '
subhrtimes = 'X'
addovertime = 'X'
IMPORTING
subrc = subrc
TABLES
target_hours = ti_targethrs
EXCEPTIONS
pernr_not_found = 1
too_many_days = 2
OTHERS = 3.
IF sy-subrc = 0.
READ TABLE ti_targethrs INTO wa_targethrs INDEX 1.
ENDIF.
*&---------------------------------------------------------------------*
*& Form REG_HEADER
*&---------------------------------------------------------------------*
* Rutina que realiza el comienzo del batch input
*----------------------------------------------------------------------*
* -->P_FECHA - Fecha a registrar
* -->P_PERNR - Codigo del empleado
*----------------------------------------------------------------------*
FORM reg_header USING p_fecha TYPE d
p_pernr LIKE prel-pernr.
*&---------------------------------------------------------------------*
*& Form REG_DETAIL
*&---------------------------------------------------------------------*
* Rutina que registra los detalles de los tiempos en el batch input
*----------------------------------------------------------------------*
* -->P_DETAIL - �rea de trabajo con los detalles del tiempo
* -->P_STDAZ - Cantidad de horas que se deben registrar
* -->P_FIRST - Cantidad de horas que se deben registrar
*----------------------------------------------------------------------*
FORM reg_detail USING p_detail TYPE str_detail
p_stdaz TYPE pthours
p_first TYPE c.
IF p_first IS INITIAL.
PERFORM batch_insdata(zmiscl) TABLES t USING :
'X' 'SAPLCATS' '2030',
' ' 'BDC_CURSOR' 'CATSD-LSTAR(03)',
' ' 'BDC_OKCODE' 'INSE'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form REG_SAVE
*&---------------------------------------------------------------------*
* Rutina que ejecuta la funcion guardar en el batch input
*----------------------------------------------------------------------*
FORM reg_save .
CLEAR vn_con.
DESCRIBE TABLE t LINES vn_con.
IF vn_con > 0.
* Ejecutar transacci�n
CALL TRANSACTION 'CAT2' USING t MODE p_mode UPDATE 'S'.
PERFORM batch_geterror(zmiscl) USING errtext.
PERFORM registro_log.
CLEAR t.
REFRESH t.
ELSE.
* Se registra en el log que no se realizo ninguna operaci�n para la fecha
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
wa_log-text = 'No se realizo ninguna operaci�n para esta fecha'.
APPEND wa_log TO ti_log.
ENDIF.