Está en la página 1de 11

REPORT zcobactcat.

* 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.

TYPES BEGIN OF str_log. "Estructura para el registro de Logs


TYPES: fecha TYPE d,
pernr TYPE persno,
status(03) TYPE c,
text(100) TYPE c.
TYPES END OF str_log.

* 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

* Declaraci�n de tablas internas


DATA: BEGIN OF pernrtab OCCURS 20, "Tabla que contiene los numeros de
empleados
pernr LIKE prel-pernr,
ename LIKE p0001-ename,
END OF pernrtab.

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_timecats LIKE TABLE OF cats_timeleveling. "Tabla para traer el tiempo de


cats

DATA: ti_targethrs LIKE TABLE OF cats_hours_per_day. "Tabla para traer el tiempo


teorico
DATA: BEGIN OF t OCCURS 10000. "Tabla para el batch input
INCLUDE STRUCTURE bdcdata.
DATA: END OF t.

DATA: ti_log TYPE TABLE OF str_log. "Tabla interna para los datos del log

DATA: BEGIN OF rep_tbl OCCURS 10, "Tabla para el reporte


status(3) TYPE c, " Status.
txterr(80) TYPE c, " Mensaje de Error.
documento(10) TYPE c, " Documento creado
END OF rep_tbl.

* Declaraci�n de �reas de trabajo


DATA: wa_pers LIKE LINE OF ti_pers, "�rea de trabajo para ti_pers
wa_ceco LIKE LINE OF ti_ceco, "�rea de trabajo para ti_ceco
wa_detail TYPE str_detail, "�rea de trabajo para el detalle de
tiempos
wa_timecats LIKE LINE OF ti_timecats, "�rea de trabajo para el tiempo de
cats
wa_log LIKE LINE OF ti_log, "�rea de trabajo para el log
wa_targethrs LIKE LINE OF ti_targethrs. "�rea de trabajo para el tiempo
teorico

DATA: BEGIN OF wa_0001. "Area de trabajo para infotipo 0001


INCLUDE STRUCTURE p0001.
DATA: END OF wa_0001.

*Declaracion de rangos.
RANGES r_pernr FOR prel-pernr.

* Declaraci�n de variables globales


DATA: vd_date TYPE d, "Variable para fechas
vn_con TYPE i, "Variable para contador de registros
errtext(200) TYPE c, "Variable para obtener texto de error
vcerror(30) TYPE c, "Variable para obtener texto de error
begda TYPE d, "Variable para fecha de inicio
endda TYPE d, "Variable para fecha de fin
vn_timedisp TYPE catssumtarget, "Variable para el tiempo disponible
vc_timedisp TYPE pthours, "Variable para el tiempo disponible en
caracteres
vc_table(4) TYPE c, "Variable para indicar que tabla se usa
para el registro de cats (ti_ceco o ti_pers)
vc_first TYPE c, "Variable para indicar si ya existen
tiempos registrados para la fecha
subrc LIKE sy-subrc. "Variable para indicar si la consulta del
tiempo teorico finalizo correctamente

* Declaraci�n de par�metros de entrada


SELECTION-SCREEN BEGIN OF BLOCK b001 WITH FRAME TITLE text-b01.
PARAMETERS: p_mode TYPE c DEFAULT 'N' OBLIGATORY, "CO_2_001. NMM.
INCGB0004341466 05/06/2013
p_varian TYPE raldb_vari MATCHCODE OBJECT zco_varspcat OBLIGATORY,
p_perfil TYPE catsvarian MATCHCODE OBJECT h_tcats DEFAULT 'AUTO_DIA'
OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b001.

SELECTION-SCREEN BEGIN OF BLOCK b002 WITH FRAME TITLE text-b02.


PARAMETERS: p_fecini TYPE sy-datum OBLIGATORY,
p_fecfin TYPE sy-datum OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b002.

* Inicializaci�n de par�metros de entrada


INITIALIZATION.
p_fecini = sy-datum.
p_fecfin = sy-datum + 7.
* Se configura el par�metro de entrada de perfil para que s�lo sea de visualizaci�n
LOOP AT SCREEN.
IF screen-name = 'P_PERFIL'.
screen-input = 0.
ENDIF.
MODIFY SCREEN.
ENDLOOP.

* Se verifica que la fecha de fin no sea menor que la fecha de inicio


AT SELECTION-SCREEN ON BLOCK b002.
IF p_fecfin < p_fecini.
MESSAGE e059(zco).
ENDIF.

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.

* Consulta la cantidad de tiempo que la persona debe registrar en la fecha


CALL FUNCTION 'CATS_GET_LEVELING_DATA'
EXPORTING
begda = vd_date "begda
endda = vd_date "endda
ch_accnt = ' ' "ch_accnt
rd_sel = '3' "rd_sel
dolim = '0.00' "dolim
uplim = '0.00' "uplim
ch_few = 'X' "ch_few
ch_many = ' ' "ch_many
rd_day = 'X' "rd_day
pertyp = '1' "pertyp
period = '01' "period
firstd = '0' "firstd
rd_target = ' ' "rd_targt
ttype = ' ' "ttype
ch_subhr = ' ' "ch_subhr
ch_over = ' ' "ch_over
undertar = '000' "undertar
overtar = '000' "overtar
ch_all = 'X' "ch_all
TABLES
sel_pernr_tab = r_pernr "p_pernr_tab
cats_data_tab = ti_timecats
EXCEPTIONS
no_abs_hour_limit = 1
no_few_many = 2
OTHERS = 3. "system error

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.

READ TABLE ti_timecats INTO wa_timecats INDEX 1.


* Verifica si el dia no es laborable y tiene tiempo registrado
IF wa_targethrs-stdaz IS INITIAL AND wa_targethrs-sobeg IS INITIAL AND
wa_targethrs-soend IS INITIAL.
IF wa_timecats-recorded is initial.
* Registra en el log que la fecha no es laborable
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
wa_log-text = 'La fecha no es laborable'.
APPEND wa_log TO ti_log.
ELSE.
* Registra en el log que la fecha no es laborable y posee tiempo registrado
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
wa_log-text = 'La fecha no es laborable y posee tiempo registrado'.
APPEND wa_log TO ti_log.
ENDIF.
ELSE.
vn_timedisp = wa_targethrs-stdaz.
vn_timedisp = vn_timedisp - wa_timecats-recorded.
IF vn_timedisp > 0.
vc_timedisp = vn_timedisp.
* Consulta si es el primer regitro de tiempos para la fecha
IF wa_timecats-recorded IS INITIAL.
vc_first = 'X'.
ELSE.
CLEAR vc_first.
ENDIF.
* Inicia el proceso de batch con la fecha y el c�digo de la persona.
PERFORM reg_header USING vd_date pernrtab-pernr.
* Define si el proceso es por persona o por centro de coste
CASE p_table.
WHEN 'PERS'.
* Registra el detalle de tiempos en CATS seg�n el registro sugerido de
la persona
LOOP AT ti_pers INTO wa_pers.
MOVE-CORRESPONDING wa_pers TO wa_detail.
PERFORM reg_detail USING wa_detail vc_timedisp vc_first.
CLEAR vc_first.
ENDLOOP.
WHEN 'CECO'.
* Registra el detalle de tiempos en CATS seg�n el registro sugerido del
centro de coste
LOOP AT ti_ceco INTO wa_ceco.
MOVE-CORRESPONDING wa_ceco TO wa_detail.
PERFORM reg_detail USING wa_detail vc_timedisp vc_first.
CLEAR vc_first.
ENDLOOP.
ENDCASE.
* Termina el proceso de batch guardando el registro y generando el log
correspondiente
PERFORM reg_save.
ELSEIF vn_timedisp IS INITIAL.
* Registra en el log que la fecha tiene su totalidad de tiempo registrado
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
wa_log-text = 'La fecha tiene la totalidad de tiempo registrado'.
APPEND wa_log TO ti_log.
ELSE.
* Registra en el log que la fecha tiene exceso de tiempo registrado
wa_log-fecha = vd_date.
wa_log-pernr = pernrtab-pernr.
wa_log-status = 'ER.'.
wa_log-text = 'La fecha tiene exceso de tiempo registrado'.
APPEND wa_log TO ti_log.
ENDIF.
ENDIF.
ENDIF.
ELSE.
* 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.
ENDIF.

ENDFORM. " REG_TIMECATS

*&---------------------------------------------------------------------*
*& 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.

DATA: vc_fecha(10) TYPE c.

* Conversi�n Formato fecha a DD.MM.YYYY


PERFORM date_convert(ztimdtl) USING :
'YYYYMMDD' p_fecha 'DD.MM.YYYY' vc_fecha sy-datum.

PERFORM batch_insdata(zmiscl) TABLES t USING :


'X' 'SAPLCATS' '1000',
' ' 'TCATST-VARIANT' p_perfil,
' ' 'CATSFIELDS-INPUTDATE' vc_fecha,
' ' 'BDC_OKCODE' '=PERS'.
PERFORM batch_insdata(zmiscl) TABLES t USING :
'X' 'RPLFST01' '1000',
' ' 'PNPPERNR-LOW' p_pernr,
' ' 'BDC_CURSOR' 'PNPPERNR-LOW',
' ' 'BDC_OKCODE' '=ONLI'.
PERFORM batch_insdata(zmiscl) TABLES t USING :
'X' 'SAPLCATS' '1000',
' ' 'BDC_CURSOR' 'PERNR_LIST_STRUCTURE-PERNR(01)',
' ' 'CATSFIELDS-MARK(01)' 'X',
' ' 'BDC_OKCODE' '=TIME'.

ENDFORM. " REG_HEADER

*&---------------------------------------------------------------------*
*& 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.

DATA: vn_horas TYPE pthours,


vc_horas TYPE catscell.

vn_horas = ( p_detail-empct * p_stdaz ) / 100.


WRITE vn_horas TO vc_horas.

IF p_first IS INITIAL.
PERFORM batch_insdata(zmiscl) TABLES t USING :
'X' 'SAPLCATS' '2030',
' ' 'BDC_CURSOR' 'CATSD-LSTAR(03)',
' ' 'BDC_OKCODE' 'INSE'.
ENDIF.

PERFORM batch_insdata(zmiscl) TABLES t USING :


'X' 'SAPLCATS' '2030',
' ' 'CATSD-LSTAR(03)' p_detail-lstar,
' ' 'CATSD-RPRZNR(03)' p_detail-rprznr,
' ' 'CATSD-RKSTR(03)' p_detail-rkstr,
' ' 'CATSD-RKOSTL(03)' p_detail-rkostl,
' ' 'CATSD-RAUFNR(03)' p_detail-raufnr,
' ' 'CATSD-RNPLNR(03)' p_detail-rnplnr,
' ' 'CATSD-VORNR(03)' p_detail-vornr,
' ' 'CATSD-DAY1(03)' vc_horas,
' ' 'BDC_CURSOR' 'CATSD-DAY1(03)',
' ' 'BDC_OKCODE' '/00'.

ENDFORM. " REG_DETAIL

*&---------------------------------------------------------------------*
*& Form REG_SAVE
*&---------------------------------------------------------------------*
* Rutina que ejecuta la funcion guardar en el batch input
*----------------------------------------------------------------------*
FORM reg_save .

PERFORM batch_insdata(zmiscl) TABLES t USING :


'X' 'SAPLCATS' '2030',
' ' 'BDC_OKCODE' '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.

ENDFORM. " REG_SAVE

También podría gustarte