Thursday, October 28, 2010

sap abap XML file to word document through SAP

Is there any way to convert XML file to word document through SAP?

The requirement is to import a XML file, convert it to word document and download it back to the same location.

The below program import an XML file to an internal table.

Also, take a look a this XML example: XML file example.

Moises Moreno

*----------------------------------------------------------------------*

* PROGRAMA : ZHR02597 Batch Input Datos Reloj Checador *

* leyendo un archivo XML *

* AUTOR : Moises Moreno De Leon (GALVAK) *

* FECHA : Junio 23, 2004 *

*----------------------------------------------------------------------*

REPORT ZHR02597 MESSAGE-ID ZG LINE-SIZE 80 LINE-COUNT 65

NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*

* Tablas *

TABLES:

PA0000, "HR Master Record: Infotype 0000 (Events)

PA0001, "HR Master Record: Infotype 0001 (Org. Assignment

PA0007, "HR Master Record: Infotype 0007 (Work Schedule)

PA0008, "HR Master Record: Infotype 0008 (Basic Pay)

PA2003, "HR Time Record: Infotype 2003 (Substitutions)

T508A, "Work Schedule Rules

T552A, "Monthly Work Schedules

T550A, "Daily Work Schedules

ZCATEGORIA. "Pay Scale Groups - Categorias

* Fin de Tablas *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Estructura *

DATA: BEGIN OF BDC_TABLE OCCURS 100. "Tabla para BIS

INCLUDE STRUCTURE BDCDATA.

DATA: END OF BDC_TABLE.

DATA BEGIN OF TH_MESSTAB OCCURS 10.

INCLUDE STRUCTURE BDCMSGCOLL.

DATA END OF TH_MESSTAB.

DATA: BEGIN OF TH_ARCHIVO OCCURS 100,

NUMERO(8), "P2011-PERNR Numero del empleado

FECHA LIKE SY-DATUM, "P2011-LDATE Logical date

AUSENTISMO(4), "

HORA(4), "P2011-LTIME Logical time

TERMINAL(3), "P2011-TERID Terminal ID

RAZON(4), "P2011-ABWGR Att/absence reason

TURNO(2), "PA2003-TPROG Daily work schedule

DEPARTAMENTO(4), "KOSTL Cost center

EMPLEADO2(8), "PA2003-VPERN Personnel no.to be

COORDINADOR_AUTORIZA(8),

IN_OUT(2) TYPE N,

END OF TH_ARCHIVO.

DATA: BEGIN OF TH_ERROR OCCURS 100,

NUMERO(5), "P2011-PERNR Numero del empleado

FECHA LIKE SY-DATUM, "P2011-LDATE Logical date

AUSENTISMO(4),

HORA(4), "P2011-LTIME Logical time

TERMINAL(3), "P2011-TERID Terminal ID

RAZON(4), "P2011-ABWGR Att/absence reason

TURNO(2), "PA2003-TPROG Daily work schedule

DEPARTAMENTO(4), "KOSTL Cost center

EMPLEADO2(5), "PA2003-VPERN Personnel no.to be

END OF TH_ERROR.



TYPES: BEGIN OF REG,

CAMBIO_TURNO,

DIA(10),

AUSENTISMO(4),

TURNO(2),

HORA(5),

TIPO,

INCIDENCIA(3),

CCOSTOS(4),

SOCIO_REEMPLAZA(8),

END OF REG.

DATA: REGISTRO TYPE REG OCCURS 0 WITH HEADER LINE.

TYPES: BEGIN OF EMPLEADO,

NUMERO(8),

REGISTRO LIKE REGISTRO OCCURS 0,

END OF EMPLEADO.

DATA: BEGIN OF CIERRE OCCURS 0,

EMPLEADO TYPE EMPLEADO,

END OF CIERRE.

DATA: CHECADAS TYPE REG OCCURS 0 WITH HEADER LINE.

* Fin de estrucutras *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Variables *

DATA: SW_ERROR, "Swich existencia de empleado

SW_I2002(1) TYPE C VALUE 'F',

WC_FECHA(10), "Fecha con formato dd.mm.aaaa

WC_DIA(2), "Filtra el día de la fecha

WC_MES(2), "Filtra el mes de la fecha

WC_YEAR(4), "Filtra el año de la fecha

WC_TIPO(2), "Tipo de Substitución

WC_TPR00(4), "Turno del empleado

WC_TURNO(4), "Turno del empleado GK(Turno)

WC_TURNO_SUST(4), "Turno Sustitucion

WC_TURNO_R(4), "Turno del RELOJ GK(Turno)

WC_TURNO_S(4), "Turno del SAP GK(Turno)

WC_CATEGORIA(8), "Categoria del empleado

WN_IN_OUT(2) TYPE N, "Tipo de evento IN/OUT

WN_PERNR LIKE PA2003-PERNR,

WI_BETRG1 LIKE ZCATEGORIA-BETRG, "Cantidad por turno Emple. 1

WI_BETRG2 LIKE ZCATEGORIA-BETRG, "Cantidad por turno Emple. 2

WT_TIEMPO LIKE P2011-LTIME, "Hora de chacada

WT_INICIO(4) TYPE N, "Hora de chacada I2002

WT_FINAL(4) TYPE N, "Hora de chacada I2002

WT_HORA LIKE P2011-LTIME VALUE '120000', "Sumar Doce horas

ARCH1(40) TYPE C VALUE '/users/interf/datos/hr/errores.txt',

WC_ARCHIVO(40) TYPE C, "Nombre del archivo

WI_LC TYPE I VALUE 0, "Contador lineas

WD_FECHA_DESC LIKE SY-DATUM, "Fecha de Descanso

WD_FECHA LIKE SY-DATUM,

WI_INDICE LIKE SY-TABIX, "Indice de la tabla interna

SW_DELETE(1) TYPE C VALUE 'F',

WC_REGISTRO1(35) TYPE C, "Registro de la tabla interna

WC_REGISTRO2(35) TYPE C. "Registro de la tabla interna

DATA: QID LIKE APQI-QID,

B-NAME LIKE RFPDO-ALLGBINA,

EXCEPT TYPE I.

DATA: ME TYPE REF TO CL_XML_DOCUMENT.

DATA: SUBRC LIKE SY-SUBRC.

DATA: GVK_MODE.

* Fin de variables *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Parámetros de Selección *

SELECTION-SCREEN BEGIN OF BLOCK BL_01 WITH FRAME TITLE TEXT-001.

PARAMETERS: ARCHIVO TYPE RLGRAP-FILENAME.

SELECTION-SCREEN END OF BLOCK BL_01.

* Fin de parametros de sleccion *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* AT SELECTION SCREEN *

AT SELECTION-SCREEN ON VALUE-REQUEST FOR ARCHIVO.

PERFORM ESPECIFICA_RUTA USING '0'.

* AT SELECTION SCREEN *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Start of selection *

START-OF-SELECTION.

CLEAR GVK_MODE.

GVK_MODE = 'N'.

IF SY-UNAME+0(6) NE 'GKRHUM' AND SY-UNAME+0(6) NE 'GK_961' AND

SY-UNAME+0(6) NE 'GKSIST' AND SY-UNAME NE 'EXUANL_MML'.

WRITE:/ 'Usuario no pertenece a GALVAK, S.A. de C.V.'.

LEAVE PROGRAM.

ENDIF.

PERFORM LEE_ARCHIVO_XML.

PERFORM LLENA_TH_ARCHIVO.

SORT TH_ARCHIVO BY NUMERO FECHA HORA.

PERFORM ELIMINA_DUPLICADOS.

LOOP AT TH_ARCHIVO.

PERFORM VALIDA_INFO.

MOVE ' ' TO : WC_DIA, WC_MES, WC_YEAR, WC_FECHA,

WC_TIPO, WC_TPR00, WC_TURNO, WC_CATEGORIA,

WT_TIEMPO, WN_PERNR, WN_IN_OUT, WT_INICIO,

WT_FINAL.

MOVE 0 TO: WI_LC.

IF SW_ERROR EQ '0'.

SELECT *

FROM PA0001

WHERE PERNR = TH_ARCHIVO-NUMERO.

ENDSELECT.

IF SY-SUBRC EQ 0.

IF TH_ARCHIVO-DEPARTAMENTO = PA0001-KOSTL+6(4).

TH_ARCHIVO-DEPARTAMENTO = ' '.

ENDIF.

ENDIF.

PERFORM FORMATO_FECHA.

MOVE TH_ARCHIVO-HORA TO WT_TIEMPO.

IF TH_ARCHIVO-EMPLEADO2 NE ' '.

WN_PERNR = TH_ARCHIVO-EMPLEADO2.

ELSE.

WN_PERNR = TH_ARCHIVO-NUMERO.

ENDIF.

IF TH_ARCHIVO-AUSENTISMO = 'DESC'.

CONCATENATE WD_FECHA+6(2) '.' WD_FECHA+4(2) '.' WD_FECHA(4)

INTO WC_FECHA.

PERFORM DATOS_DESC. "Actualiza 2003

ELSE.

PERFORM EVENTO_IN_OUT.

CONCATENATE WD_FECHA+6(2) '.' WD_FECHA+4(2) '.' WD_FECHA(4)

INTO WC_FECHA.

PERFORM TRANS_PA61.

CALL TRANSACTION 'PA61' USING BDC_TABLE MODE GVK_MODE

UPDATE 'S' MESSAGES INTO TH_MESSTAB.

IF SY-SUBRC EQ 0.

IF WC_TURNO <> WC_TPR00 OR

WC_TURNO <> WC_TURNO_SUST OR

WC_TURNO = 'DESC' OR

WC_TURNO = 'FREE'.

IF TH_ARCHIVO-IN_OUT = '01'.

PERFORM OTROS_DATOS. "Actualiza 2003

ENDIF.

ELSE.

ENDIF.

ELSE.

MOVE-CORRESPONDING TH_ARCHIVO TO TH_ERROR.

APPEND TH_ERROR.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

DESCRIBE TABLE TH_ERROR LINES WI_LC.

* Fin de start of selection *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* End of selection *

END-OF-SELECTION.

IF WI_LC NE 0.

PERFORM ARCHIVO_ERROR.

ENDIF.

PERFORM BDC_CLOSE USING EXCEPT.

MESSAGE I100.

* DELETE DATASET ARCHIVO. "moises 02.06.1999

* Fin de end of slection *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion valida_info *

FORM VALIDA_INFO.

MOVE '0' TO SW_ERROR.

SELECT DISTINCT *

FROM PA0000

WHERE PERNR EQ TH_ARCHIVO-NUMERO.

EXIT.

ENDSELECT.

IF SY-SUBRC NE 0.

FORMAT INTENSIFIED OFF.

WRITE:/ 'El empleado ', TH_ARCHIVO-NUMERO,

' no esta dado de alta'.

FORMAT INTENSIFIED ON.

MOVE '1' TO SW_ERROR.

ENDIF.

ENDFORM.

* Fin de funcion valida_info *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion formato_fecha *

FORM FORMATO_FECHA.

WC_DIA = TH_ARCHIVO-FECHA(2).

WC_MES = TH_ARCHIVO-FECHA+2(2).

WC_YEAR = TH_ARCHIVO-FECHA+4(4).

CONCATENATE WC_YEAR WC_MES WC_DIA INTO WD_FECHA.

ENDFORM.

* Fin de funicon formato_fecha *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion evento_in_out *

FORM EVENTO_IN_OUT.

SELECT *

FROM PA0007

WHERE PERNR EQ WN_PERNR

AND BEGDA <= WD_FECHA AND ENDDA >= WD_FECHA.

ENDSELECT.

IF SY-SUBRC EQ 0 AND PA0007-SCHKZ NE ' '.

SELECT *

FROM T508A

WHERE MOFID EQ 'GK'

AND SCHKZ = PA0007-SCHKZ.

ENDSELECT.

SELECT *

FROM T552A

WHERE SCHKZ EQ PA0007-SCHKZ

AND KJAHR EQ WC_YEAR

AND MONAT EQ WC_MES.

ENDSELECT.

IF SY-SUBRC EQ 0.

PERFORM BUSCA_DIA.

WC_TURNO = WC_TPR00.

PERFORM VERIFICA_P2003.

IF WC_TURNO_SUST IS INITIAL.

WC_TURNO_SUST = WC_TURNO.

ENDIF.

IF WC_TURNO EQ 'FREE' OR WC_TURNO EQ 'DESC'.

WC_TIPO = '02'.

IF TH_ARCHIVO-RAZON NE 'ETI ' AND

TH_ARCHIVO-RAZON NE 'EPM ' AND

TH_ARCHIVO-RAZON NE 'ERP ' AND

TH_ARCHIVO-RAZON NE 'STI ' AND

TH_ARCHIVO-RAZON NE 'SPM ' AND

TH_ARCHIVO-RAZON NE 'SRP '.

PERFORM VALIDA_SIGUIENTE_DIA.

IF WC_TPR00 = 'GM11' OR WC_TPR00 = 'GK01'.

WC_TURNO = WC_TPR00.

ENDIF.

ENDIF.

ELSEIF WC_TPR00 = 'DESC' OR WC_TPR00 = 'FREE'.

WC_TIPO = '02'.

ELSE.

WC_TIPO = '01'.

ENDIF.

ENDIF.

PERFORM TIEMPOS_EXTRA.

WC_TURNO_S = WC_TURNO.

IF TH_ARCHIVO-TURNO NE ' '.

IF TH_ARCHIVO-TURNO = 'S1' OR TH_ARCHIVO-TURNO = 'S2' OR

TH_ARCHIVO-TURNO = 'S3'.

CONCATENATE 'DE' TH_ARCHIVO-TURNO INTO WC_TURNO_R.

WC_TURNO = WC_TURNO_R.

ELSEIF TH_ARCHIVO-TURNO = 'T1' OR TH_ARCHIVO-TURNO = 'T2'.

CONCATENATE 'GK' TH_ARCHIVO-TURNO INTO WC_TURNO_R.

WC_TURNO = WC_TURNO_R.

ELSE.

IF TH_ARCHIVO-TURNO <> 10.

CONCATENATE 'GM' TH_ARCHIVO-TURNO INTO WC_TURNO_R.

ENDIF.

IF WC_TURNO NE WC_TURNO_R. " and th_archivo-razon = ' '. moises

WC_TURNO = WC_TURNO_R.

ENDIF.

ENDIF.

ENDIF.

* IF WC_TURNO EQ 'GM11' OR WC_TURNO = 'GK01'.

* WT_TIEMPO = WT_TIEMPO + WT_HORA.

* ENDIF.

SELECT *

FROM T550A

WHERE MOTPR EQ T508A-MOTPR

AND TPROG EQ WC_TURNO.

IF ( T550A-BTBEG <= WT_TIEMPO AND T550A-BTEND >= WT_TIEMPO ) OR

( TH_ARCHIVO-RAZON = 'IJ ' OR TH_ARCHIVO-RAZON = 'II ' OR

TH_ARCHIVO-RAZON = 'ESU ' OR TH_ARCHIVO-RAZON = 'EPM ' OR

TH_ARCHIVO-RAZON = 'ERP ' OR TH_ARCHIVO-RAZON = 'ETI ' ).

WN_IN_OUT = '01'.

IF WC_TURNO EQ 'GM11' OR WC_TURNO = 'GK01'.

* WD_FECHA = WD_FECHA + 1.

ENDIF.

ELSEIF ( T550A-ETBEG <= WT_TIEMPO AND T550A-ETEND >= WT_TIEMPO ) OR

( TH_ARCHIVO-RAZON = 'FJ ' OR

TH_ARCHIVO-RAZON = 'FI ' OR

TH_ARCHIVO-RAZON = 'SSU ' OR

TH_ARCHIVO-RAZON = 'SPM ' OR

TH_ARCHIVO-RAZON = 'SRP ' OR

TH_ARCHIVO-RAZON = 'STI ' ).

WN_IN_OUT = '02'.

ELSE.

WN_IN_OUT = '02'.

ENDIF.

IF TH_ARCHIVO-RAZON = 'ETI ' AND

( T550A-BTBEG <= WT_TIEMPO AND T550A-BTEND >= WT_TIEMPO ).

WT_INICIO = WT_TIEMPO(4).

WT_FINAL = T550A-SOBEG(4).

SW_I2002 = 'T'.

ELSEIF TH_ARCHIVO-RAZON = 'STI ' AND

( T550A-ETBEG <= WT_TIEMPO AND T550A-ETEND >= WT_TIEMPO ).

WT_INICIO = T550A-SOEND(4).

WT_FINAL = WT_TIEMPO(4).

SW_I2002 = 'T'.

ENDIF.

ENDSELECT.

IF SW_I2002 = 'T'.

SW_I2002 = 'F'.

CONCATENATE WD_FECHA+6(2) '.' WD_FECHA+4(2) '.' WD_FECHA(4)

INTO WC_FECHA.

PERFORM ALTA_I2002.

ENDIF.

ENDIF.

ENDFORM.

* Fin de funcion evento_in_out *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion busca_dia *

FORM BUSCA_DIA.

CASE WC_DIA.

WHEN 01.

MOVE T552A-TPR01 TO WC_TPR00.

WHEN 02.

MOVE T552A-TPR02 TO WC_TPR00.

WHEN 03.

MOVE T552A-TPR03 TO WC_TPR00.

WHEN 04.

MOVE T552A-TPR04 TO WC_TPR00.

WHEN 05.

MOVE T552A-TPR05 TO WC_TPR00.

WHEN 06.

MOVE T552A-TPR06 TO WC_TPR00.

WHEN 07.

MOVE T552A-TPR07 TO WC_TPR00.

WHEN 08.

MOVE T552A-TPR08 TO WC_TPR00.

WHEN 09.

MOVE T552A-TPR09 TO WC_TPR00.

WHEN 10.

MOVE T552A-TPR10 TO WC_TPR00.

WHEN 11.

MOVE T552A-TPR11 TO WC_TPR00.

WHEN 12.

MOVE T552A-TPR12 TO WC_TPR00.

WHEN 13.

MOVE T552A-TPR13 TO WC_TPR00.

WHEN 14.

MOVE T552A-TPR14 TO WC_TPR00.

WHEN 15.

MOVE T552A-TPR15 TO WC_TPR00.

WHEN 16.

MOVE T552A-TPR16 TO WC_TPR00.

WHEN 17.

MOVE T552A-TPR17 TO WC_TPR00.

WHEN 18.

MOVE T552A-TPR18 TO WC_TPR00.

WHEN 19.

MOVE T552A-TPR19 TO WC_TPR00.

WHEN 20.

MOVE T552A-TPR20 TO WC_TPR00.

WHEN 21.

MOVE T552A-TPR21 TO WC_TPR00.

WHEN 22.

MOVE T552A-TPR22 TO WC_TPR00.

WHEN 23.

MOVE T552A-TPR23 TO WC_TPR00.

WHEN 24.

MOVE T552A-TPR24 TO WC_TPR00.

WHEN 25.

MOVE T552A-TPR25 TO WC_TPR00.

WHEN 26.

MOVE T552A-TPR26 TO WC_TPR00.

WHEN 27.

MOVE T552A-TPR27 TO WC_TPR00.

WHEN 28.

MOVE T552A-TPR28 TO WC_TPR00.

WHEN 29.

MOVE T552A-TPR29 TO WC_TPR00.

WHEN 30.

MOVE T552A-TPR30 TO WC_TPR00.

WHEN 31.

MOVE T552A-TPR31 TO WC_TPR00.

ENDCASE.

ENDFORM.

* Fin de funcion busca_dia *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion verifica_p2003 *

FORM VERIFICA_P2003.

DATA: WFECHA LIKE SY-DATUM.

CONCATENATE TH_ARCHIVO-FECHA+4(4) TH_ARCHIVO-FECHA+2(2)

TH_ARCHIVO-FECHA(2) INTO WFECHA.



CLEAR WC_TURNO_SUST.



SELECT SINGLE *

FROM PA2003

WHERE PERNR = WN_PERNR

AND BEGDA <= WFECHA AND ENDDA >= WFECHA.

CHECK SY-SUBRC EQ 0.

IF PA2003-TPROG NE ' ' AND PA2003-TPROG NE WC_TURNO.

MOVE PA2003-TPROG TO: WC_TURNO, WC_TURNO_SUST.

ELSEIF PA2003-SCHKZ NE ' '.

SELECT *

FROM T552A

WHERE SCHKZ EQ PA2003-SCHKZ

AND KJAHR EQ WC_YEAR

AND MONAT EQ WC_MES.

ENDSELECT.

IF SY-SUBRC EQ 0.

PERFORM BUSCA_DIA.

IF WC_TPR00 NE WC_TURNO.

WC_TURNO = WC_TPR00.

ENDIF.

ENDIF.

ENDIF.

ENDFORM. " VERIFICA_P2003

* Fin de funcion verifica_p2003 *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funion valida_siguiente_dia *

FORM VALIDA_SIGUIENTE_DIA.

WD_FECHA_DESC = WD_FECHA + 1.

WC_DIA = WD_FECHA_DESC+6(2).

SELECT *

FROM T552A

WHERE SCHKZ EQ PA0007-SCHKZ

AND KJAHR EQ WC_YEAR

AND MONAT EQ WC_MES.

ENDSELECT.

IF SY-SUBRC EQ 0.

PERFORM BUSCA_DIA.

ENDIF.

ENDFORM. " VALIDA_SIGUIENTE_DIA

* Fin de funcion valida_siguiente_dia *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion alta_i2002 *

FORM ALTA_I2002.

IF TH_ARCHIVO-TURNO = 'S1' OR TH_ARCHIVO-TURNO = 'S2' OR

TH_ARCHIVO-TURNO = 'S3'.

ELSE.

REFRESH BDC_TABLE.

PERFORM DYNPRO_START USING 'SAPMP50A' '1000'.

PERFORM DYNPRO_FIELD USING 'RP50G-PERNR' TH_ARCHIVO-NUMERO.

PERFORM DYNPRO_FIELD USING 'RP50G-CHOIC' '2002'.

PERFORM DYNPRO_FIELD USING 'RP50G-SUBTY' '0020'.

PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=INS'. "MML QA&C 08.02.00

PERFORM DYNPRO_START USING 'MP200000' '2050'.

PERFORM DYNPRO_FIELD USING 'P2002-BEGDA' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'P2002-ENDDA' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'P2002-BEGUZ' WT_INICIO.

PERFORM DYNPRO_FIELD USING 'P2002-ENDUZ' WT_FINAL.

PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPD'. "MML QA&C 08.02.00

CALL TRANSACTION 'PA61' USING BDC_TABLE MODE GVK_MODE UPDATE 'S'

MESSAGES INTO TH_MESSTAB.

IF SY-SUBRC NE 0.

MOVE-CORRESPONDING TH_ARCHIVO TO TH_ERROR.

APPEND TH_ERROR.

ENDIF.

ENDIF.

ENDFORM. " ALTA_I2002

* Fin de funcion alta_i2002 *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion trnas_pa61 *

FORM TRANS_PA61.

REFRESH BDC_TABLE.

IF TH_ARCHIVO-AUSENTISMO IS INITIAL.

PERFORM DYNPRO_START USING 'SAPMP50A' '1000'.

PERFORM DYNPRO_FIELD USING 'RP50G-PERNR' TH_ARCHIVO-NUMERO.

PERFORM DYNPRO_FIELD USING 'RP50G-CHOIC' '2011'.

PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=INS'. "MML QA&C 20.08.00

PERFORM DYNPRO_START USING 'MP200000' '2500'.

PERFORM DYNPRO_FIELD USING 'P2011-LDATE' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'P2011-LTIME' WT_TIEMPO.

* PERFORM DYNPRO_FIELD USING 'P2011-SATZA' WN_IN_OUT.

PERFORM DYNPRO_FIELD USING 'P2011-SATZA' TH_ARCHIVO-IN_OUT.

IF TH_ARCHIVO-RAZON <> 'ARR'.

PERFORM DYNPRO_FIELD USING 'P2011-ABWGR' TH_ARCHIVO-RAZON.

ENDIF.

PERFORM DYNPRO_FIELD USING 'P2011-TERID' TH_ARCHIVO-TERMINAL.

PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPD'. "MML QA&C 08.02.00

ELSE.

PERFORM DYNPRO_START USING 'SAPMP50A' '1000'.

PERFORM DYNPRO_FIELD USING 'RP50G-PERNR' TH_ARCHIVO-NUMERO.

PERFORM DYNPRO_FIELD USING 'RP50G-ENDDA' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'RP50G-CHOIC' '2001'.

PERFORM DYNPRO_FIELD USING 'RP50G-SUBTY' TH_ARCHIVO-AUSENTISMO..

PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=INS'. "MML QA&C 20.08.00

PERFORM DYNPRO_START USING 'MP200000' '2001'.

PERFORM DYNPRO_FIELD USING 'P2001-BEGDA' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'P2001-ENDDA' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPD'. "MML QA&C 08.02.00

ENDIF.

ENDFORM. " TRANS_PA61

* Fin de funcion trans_pa61 *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion otros_datos *

FORM OTROS_DATOS.

IF WC_TURNO_SUST = 'DESC' OR WC_TURNO_SUST = 'FREE'.

PERFORM ELIMINA_SUSTITUCION.

ENDIF.



IF TH_ARCHIVO-TURNO = 'S1' OR TH_ARCHIVO-TURNO = 'S2' OR

TH_ARCHIVO-TURNO = 'S3'.

PERFORM GENERA_SUSTITUCION_S.

CALL TRANSACTION 'PA61' USING BDC_TABLE MODE GVK_MODE

UPDATE 'S' MESSAGES INTO TH_MESSTAB.

IF SY-SUBRC NE 0.

MOVE-CORRESPONDING TH_ARCHIVO TO TH_ERROR.

APPEND TH_ERROR.

ENDIF.

ELSE.

IF WN_IN_OUT = '01'. "or wn_in_out = '02'.

PERFORM GENERATE_BDC_DATA_1. "Actualiza 2003

CALL TRANSACTION 'PA61' USING BDC_TABLE MODE GVK_MODE

UPDATE 'S' MESSAGES INTO TH_MESSTAB.

IF SY-SUBRC NE 0.

MOVE-CORRESPONDING TH_ARCHIVO TO TH_ERROR.

APPEND TH_ERROR.

ENDIF.

ENDIF.

IF WN_IN_OUT = '02'.

IF TH_ARCHIVO-RAZON = 'SSU'.

PERFORM GENERATE_BDC_DATA_1.

CALL TRANSACTION 'PA61' USING BDC_TABLE MODE GVK_MODE

UPDATE 'S' MESSAGES INTO TH_MESSTAB.

IF SY-SUBRC NE 0.

MOVE-CORRESPONDING TH_ARCHIVO TO TH_ERROR.

APPEND TH_ERROR.

ENDIF.

ELSE.

PERFORM GENERATE_BDC_DATA_1.

CALL TRANSACTION 'PA61' USING BDC_TABLE MODE GVK_MODE

UPDATE 'S' MESSAGES INTO TH_MESSTAB.

IF SY-SUBRC NE 0.

MOVE-CORRESPONDING TH_ARCHIVO TO TH_ERROR.

APPEND TH_ERROR.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDFORM. " OTROS_DATOS

* Fin de funicion ortors_datos *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion generate_bdc_data_1 *

FORM GENERATE_BDC_DATA_1.

REFRESH BDC_TABLE.

PERFORM DYNPRO_START USING 'SAPMP50A' '1000'.

PERFORM DYNPRO_FIELD USING 'RP50G-PERNR' TH_ARCHIVO-NUMERO.

PERFORM DYNPRO_FIELD USING 'RP50G-CHOIC' '2003'.

PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=INS'. "MML QA&C 08.02.00

PERFORM DYNPRO_START USING 'MP200000' '2100'.

PERFORM DYNPRO_FIELD USING 'P2003-BEGDA' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'P2003-ENDDA' WC_FECHA.

PERFORM DYNPRO_FIELD USING 'P2003-VTART' WC_TIPO.

IF TH_ARCHIVO-EMPLEADO2 NE ' ' AND

TH_ARCHIVO-EMPLEADO2 NE TH_ARCHIVO-NUMERO.

PERFORM BUSCA_CATEGORIA.

ENDIF.

IF WC_TURNO <> WC_TURNO_SUST.

PERFORM DYNPRO_FIELD USING 'P2003-TPROG' WC_TURNO.

ELSE.

IF TH_ARCHIVO-TURNO NE ' ' AND TH_ARCHIVO-TURNO NE WC_TURNO_S.

PERFORM DYNPRO_FIELD USING 'P2003-TPROG' WC_TURNO.

ENDIF.

IF WC_TURNO <> WC_TPR00.

PERFORM DYNPRO_FIELD USING 'P2003-TPROG' WC_TURNO.

ENDIF.

ENDIF.

IF WI_BETRG1 < wi_betrg1 =" ZCATEGORIA-BETRG." wi_betrg2 =" ZCATEGORIA-BETRG." wc_categoria =" ZCATEGORIA-TRFGR." not_open =" 1" queue_error =" 2" others =" 3." except =" SY-SUBRC." program =" PROGRAM." dynpro =" DYNPRO." dynbegin =" 'X'." fnam =" FIELD." fval =" VALUE." turno =" 'S1'" turno =" 'S2'" turno =" 'S3'." wc_turno =" WC_TURNO_R." turno =" 'T1'" turno =" 'T2'." wc_turno =" WC_TURNO_R." razon =" 'ETI" razon =" 'EPM" razon =" 'ERP"> 10.

CONCATENATE 'GM' TH_ARCHIVO-TURNO INTO WC_TURNO_R.

ENDIF.

IF ( WC_TURNO = 'FREE' OR WC_TURNO = 'DESC' ).

IF WC_TURNO_R = 'GM13' OR WC_TURNO_R = 'GK03'.

PERFORM VALIDA_SIGUIENTE_DIA.

IF WC_TPR00 = 'GM11' OR WC_TPR00 = 'GK01'.

IF WC_TPR00 = 'GK01'.

WC_TURNO = 'GK01'.

ELSEIF WC_TPR00 = 'GM11'.

WC_TURNO = 'GM11'.

ENDIF.

ELSE.

WC_TURNO = WC_TURNO_R.

ENDIF.

ELSE.

WC_TURNO = WC_TURNO_R.

ENDIF.

ENDIF.

IF ( WC_TURNO NE 'FREE' OR WC_TURNO NE 'DESC' ).

IF WC_TURNO_R = 'GK02' AND WC_TURNO = 'GK03'.

WC_TURNO = 'GK03'.

ENDIF.

IF WC_TURNO_R = 'GK03' AND WC_TURNO = 'GK01'.

WC_TURNO = 'GK01'.

ENDIF.

IF WC_TURNO_R = 'GK01' AND WC_TURNO = 'GK02'.

WC_TURNO = 'GK02'.

ENDIF.

ENDIF.

ENDIF.

IF ( TH_ARCHIVO-RAZON = 'STI ' OR TH_ARCHIVO-RAZON = 'SPM ' OR

TH_ARCHIVO-RAZON = 'SRP ' ) AND TH_ARCHIVO-TURNO NE ' '.

IF TH_ARCHIVO-TURNO <> 10.

CONCATENATE 'GM' TH_ARCHIVO-TURNO INTO WC_TURNO_R.

ENDIF.

IF ( WC_TURNO = 'FREE' OR WC_TURNO = 'DESC' ).

IF WC_TURNO_R = 'GM11' OR WC_TURNO_R = 'GK01'.

WD_FECHA_DESC = WD_FECHA - 2.

PERFORM VALIDA_SIGUIENTE_DIA. "En realidad DIA ANTERIOR

IF WC_TPR00 = 'GM13' OR WC_TPR00 = 'GK03'.

IF WC_TPR00 = 'GK03'.

WC_TURNO = 'GK03'.

ELSEIF WC_TPR00 = 'GM13'.

WC_TURNO = 'GM13'.

ENDIF.

ELSE.

WC_TURNO = WC_TURNO_R.

ENDIF.

ELSE.

WC_TURNO = WC_TURNO_R.

ENDIF.

ENDIF.

IF ( WC_TURNO NE 'FREE' OR WC_TURNO NE 'DESC' ).

IF WC_TURNO_R = 'GK03' AND WC_TURNO = 'GK02'.

WC_TURNO = 'GK02'.

ENDIF.

IF WC_TURNO_R = 'GK01' AND WC_TURNO = 'GK03'.

WC_TURNO = 'GK03'.

ENDIF.

IF WC_TURNO_R = 'GK02' AND WC_TURNO = 'GK01'.

WC_TURNO = 'GK01'.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDFORM.

* Fin de funicon tiempos_extra *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* Funcion elimina_duplicados *

FORM ELIMINA_DUPLICADOS.

DELETE ADJACENT DUPLICATES FROM TH_ARCHIVO.

ENDFORM.

* Fin de funcion elimina_duplicados *

*----------------------------------------------------------------------



*----------------------------------------------------------------------*

* Form LEE_ARCHIVO_XML *

FORM LEE_ARCHIVO_XML.

CREATE OBJECT ME.

REFRESH CIERRE.

CALL METHOD ME->CREATE_WITH_FILE

EXPORTING

FILENAME = ARCHIVO

RECEIVING

RETCODE = SUBRC.

CALL METHOD ME->GET_DATA

IMPORTING

RETCODE = SUBRC

CHANGING

DATAOBJECT = CIERRE[].

ENDFORM.

* Form LEE_ARCHIVO_XML *

*----------------------------------------------------------------------*



*----------------------------------------------------------------------*

* FORM ESPECIFICA_RUTA *

FORM ESPECIFICA_RUTA USING PAR_VALOR.

CASE PAR_VALOR.

WHEN '0'.

CALL FUNCTION 'KD_GET_FILENAME_ON_F4'

EXPORTING

MASK = 'C:\*.xml'

STATIC = 'X'

CHANGING

FILE_NAME = ARCHIVO.

WHEN '1'.

* CALL FUNCTION 'KD_GET_FILENAME_ON_F4'

* EXPORTING

* MASK = 'C:\*.txt'

* STATIC = 'x'

* CHANGING

* FILE_NAME = DESCARGA.

ENDCASE.

ENDFORM.

* FORM ESPECIFICA_RUTA *

*----------------------------------------------------------------------



*----------------------------------------------------------------------*

* Form LLENA_TH_ARCHIVO *

FORM LLENA_TH_ARCHIVO.

CONSTANTS GVK_12HRS LIKE P2011-LTIME VALUE '120000'.

CONSTANTS GVK_1159 LIKE P2011-LTIME VALUE '115900'.

CONSTANTS GVK_0630 LIKE P2011-LTIME VALUE '063000'.

CONSTANTS GVK_0715 LIKE P2011-LTIME VALUE '071500'.

CONSTANTS GVK_1830 LIKE P2011-LTIME VALUE '183000'.

CONSTANTS GVK_1915 LIKE P2011-LTIME VALUE '191500'.

DATA: GVK_HORA LIKE P2011-LTIME.

DATA: GVK_FECHA LIKE SY-DATUM.

CLEAR CIERRE.

REFRESH TH_ARCHIVO.

LOOP AT CIERRE.

CLEAR TH_ARCHIVO.

CHECADAS[] = CIERRE-EMPLEADO-REGISTRO[].

LOOP AT CHECADAS.

CLEAR TH_ARCHIVO.

MOVE: CIERRE-EMPLEADO-NUMERO TO TH_ARCHIVO-NUMERO,

CHECADAS-INCIDENCIA TO TH_ARCHIVO-RAZON,

CHECADAS-CCOSTOS TO TH_ARCHIVO-DEPARTAMENTO,

CHECADAS-SOCIO_REEMPLAZA TO TH_ARCHIVO-EMPLEADO2.

CONCATENATE CHECADAS-DIA(2) CHECADAS-DIA+3(2)

CHECADAS-DIA+6(4) INTO TH_ARCHIVO-FECHA.

CONCATENATE CHECADAS-HORA(2) CHECADAS-HORA+3(2)

INTO TH_ARCHIVO-HORA.

IF CHECADAS-TURNO = 'S1' OR CHECADAS-TURNO = 'S2' OR

CHECADAS-TURNO = 'S3'.

MOVE CHECADAS-TURNO TO TH_ARCHIVO-TURNO.

IF CHECADAS-TIPO = 'E'.

MOVE 'ETI' TO TH_ARCHIVO-RAZON.

ELSEIF CHECADAS-TIPO = 'S'.

MOVE 'STI' TO TH_ARCHIVO-RAZON.

ENDIF.

ELSE.

MOVE CHECADAS-TURNO TO TH_ARCHIVO-TURNO.

ENDIF.



IF CHECADAS-CAMBIO_TURNO = 1.

MOVE CHECADAS-TURNO TO TH_ARCHIVO-TURNO.

ENDIF.

MOVE CHECADAS-AUSENTISMO TO TH_ARCHIVO-AUSENTISMO.

CASE CHECADAS-TURNO.

WHEN '01' OR 'S1'.

IF CHECADAS-TIPO = 'E'.

CLEAR GVK_FECHA.

CONCATENATE CHECADAS-DIA+6(4) CHECADAS-DIA+3(2)

CHECADAS-DIA(2)

INTO GVK_FECHA.

GVK_FECHA = GVK_FECHA + 1.

CONCATENATE GVK_FECHA+6(2) GVK_FECHA+4(2) GVK_FECHA(4)

INTO TH_ARCHIVO-FECHA.

ELSEIF CHECADAS-TIPO = 'S'.

GVK_HORA = TH_ARCHIVO-HORA.

IF GVK_HORA > GVK_1159.

CLEAR GVK_FECHA.

CONCATENATE CHECADAS-DIA+6(4) CHECADAS-DIA+3(2)

CHECADAS-DIA(2)

INTO GVK_FECHA.

GVK_FECHA = GVK_FECHA + 1.

CONCATENATE GVK_FECHA+6(2) GVK_FECHA+4(2)

GVK_FECHA(4)

INTO TH_ARCHIVO-FECHA.

ENDIF.

ENDIF.

CLEAR GVK_HORA.

GVK_HORA = TH_ARCHIVO-HORA.

GVK_HORA = GVK_HORA + GVK_12HRS.

CLEAR TH_ARCHIVO-HORA.

CONCATENATE GVK_HORA(2) GVK_HORA+2(2)

INTO TH_ARCHIVO-HORA.

WHEN 'T1'.

IF CHECADAS-TIPO = 'E'.

CLEAR GVK_FECHA.

CLEAR GVK_HORA.

CONCATENATE CHECADAS-DIA+6(4) CHECADAS-DIA+3(2)

CHECADAS-DIA(2)

INTO GVK_FECHA.

GVK_FECHA = GVK_FECHA + 1.

CONCATENATE GVK_FECHA+6(2) GVK_FECHA+4(2) GVK_FECHA(4)

INTO TH_ARCHIVO-FECHA.

GVK_HORA = TH_ARCHIVO-HORA.

GVK_HORA = GVK_HORA + GVK_12HRS.

CLEAR TH_ARCHIVO-HORA.

CONCATENATE GVK_HORA(2) GVK_HORA+2(2)

INTO TH_ARCHIVO-HORA.

ELSEIF CHECADAS-TIPO = 'S'.

MOVE 'STI' TO TH_ARCHIVO-RAZON.

GVK_HORA = TH_ARCHIVO-HORA.

IF GVK_HORA > GVK_1159.

CLEAR GVK_FECHA.

CONCATENATE CHECADAS-DIA+6(4) CHECADAS-DIA+3(2)

CHECADAS-DIA(2)

INTO GVK_FECHA.

GVK_FECHA = GVK_FECHA + 1.

CONCATENATE GVK_FECHA+6(2) GVK_FECHA+4(2)

GVK_FECHA(4)

INTO TH_ARCHIVO-FECHA.

ENDIF.

GVK_HORA = TH_ARCHIVO-HORA.

IF GVK_HORA BETWEEN GVK_0630 AND GVK_0715.

GVK_HORA = GVK_0630.

ENDIF.

GVK_HORA = GVK_HORA + GVK_12HRS.

CLEAR TH_ARCHIVO-HORA.

CONCATENATE GVK_HORA(2) GVK_HORA+2(2)

INTO TH_ARCHIVO-HORA.

ENDIF.

WHEN 'T2'.

IF CHECADAS-TIPO = 'S'.

MOVE 'STI' TO TH_ARCHIVO-RAZON.

CLEAR GVK_HORA.

GVK_HORA = TH_ARCHIVO-HORA.

IF GVK_HORA BETWEEN GVK_1830 AND GVK_1915.

GVK_HORA = GVK_1830.

CONCATENATE GVK_HORA(2) GVK_HORA+2(2)

INTO TH_ARCHIVO-HORA.

ENDIF.

ENDIF.

ENDCASE.

IF CHECADAS-TIPO = 'E'.

TH_ARCHIVO-IN_OUT = '01'.

ELSEIF CHECADAS-TIPO = 'S'.

TH_ARCHIVO-IN_OUT = '02'.

ENDIF.

APPEND TH_ARCHIVO.

ENDLOOP.

ENDLOOP.

ENDFORM.

* Form LLENA_TH_ARCHIVO *

*----------------------------------------------------------------------



*&---------------------------------------------------------------------*

*& Form DATOS_DESC

*&---------------------------------------------------------------------*

* text

*----------------------------------------------------------------------*

* --> p1 text

* <-- p2 text *----------------------------------------------------------------------* FORM DATOS_DESC. REFRESH BDC_TABLE. PERFORM DYNPRO_START USING 'SAPMP50A' '1000'. PERFORM DYNPRO_FIELD USING 'RP50G-PERNR' TH_ARCHIVO-NUMERO. PERFORM DYNPRO_FIELD USING 'RP50G-CHOIC' '2003'. PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=INS'. "MML QA&C 08.02.00 PERFORM DYNPRO_START USING 'MP200000' '2100'. PERFORM DYNPRO_FIELD USING 'P2003-BEGDA' WC_FECHA. PERFORM DYNPRO_FIELD USING 'P2003-ENDDA' WC_FECHA. PERFORM DYNPRO_FIELD USING 'P2003-VTART' '01'. PERFORM DYNPRO_FIELD USING 'P2003-TPROG' 'DESC'. PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPD'. "MML QA&C 08.02.00 CALL TRANSACTION 'PA61' USING BDC_TABLE MODE GVK_MODE UPDATE 'S' MESSAGES INTO TH_MESSTAB. IF SY-SUBRC NE 0. MOVE-CORRESPONDING TH_ARCHIVO TO TH_ERROR. APPEND TH_ERROR. ENDIF. ENDFORM. " DATOS_DESC * *&---------------------------------------------------------------------* *& Form GENERA_SUSTITUCION_S *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text

* <-- p2 text *----------------------------------------------------------------------* FORM GENERA_SUSTITUCION_S. REFRESH BDC_TABLE. PERFORM DYNPRO_START USING 'SAPMP50A' '1000'. PERFORM DYNPRO_FIELD USING 'RP50G-PERNR' TH_ARCHIVO-NUMERO. PERFORM DYNPRO_FIELD USING 'RP50G-CHOIC' '2003'. PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=INS'. "MML QA&C 08.02.00 PERFORM DYNPRO_START USING 'MP200000' '2100'. PERFORM DYNPRO_FIELD USING 'P2003-BEGDA' WC_FECHA. PERFORM DYNPRO_FIELD USING 'P2003-ENDDA' WC_FECHA. PERFORM DYNPRO_FIELD USING 'P2003-VTART' '02'. IF TH_ARCHIVO-EMPLEADO2 NE ' ' AND TH_ARCHIVO-EMPLEADO2 NE TH_ARCHIVO-NUMERO. PERFORM BUSCA_CATEGORIA. ENDIF. IF WC_TURNO <> WC_TURNO_SUST.

PERFORM DYNPRO_FIELD USING 'P2003-TPROG' WC_TURNO.

ELSE.

IF TH_ARCHIVO-TURNO NE ' ' AND TH_ARCHIVO-TURNO NE WC_TURNO_S.

PERFORM DYNPRO_FIELD USING 'P2003-TPROG' WC_TURNO.

ENDIF.

ENDIF.

IF WI_BETRG1 <>

No comments:

Post a Comment