Friday, November 23, 2007

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 'GK' TH_ARCHIVO-TURNO INTO WC_TURNO_R.
ELSEIF 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_BETRG2. "Cambia categoria del Empleado 1
PERFORM BUSCA_CATEGORIA.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'DIFP'.
PERFORM DYNPRO_START USING 'MP200000' '2221'.
PERFORM DYNPRO_FIELD USING 'P2APL-TRFGR' WC_CATEGORIA.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/8'.
PERFORM DYNPRO_START USING 'MP200000' '2100'.
ENDIF.
IF TH_ARCHIVO-DEPARTAMENTO NE ' '.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'PRIM'.
PERFORM DYNPRO_START USING 'SAPLHRTV' '0300'.
PERFORM DYNPRO_FIELD USING 'COBL-KOSTL' TH_ARCHIVO-DEPARTAMENTO.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/8'.
PERFORM DYNPRO_START USING 'MP200000' '2100'.
ENDIF.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPD'. "MML QA&C 08.02.00
ENDFORM. " GENERATE_BDC_DATA_1
* Fin de funcion generate_bdc_data_1 *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Funcion busca_categoria *
FORM BUSCA_CATEGORIA.
SELECT *
FROM PA0008
WHERE PERNR EQ TH_ARCHIVO-NUMERO. "Empleado 1
IF SY-SUBRC EQ 0.
SELECT *
FROM ZCATEGORIA
WHERE TRFGR EQ PA0008-TRFGR.
WI_BETRG1 = ZCATEGORIA-BETRG.
ENDSELECT.
ENDIF.
ENDSELECT.
SELECT *
FROM PA0008
WHERE PERNR EQ TH_ARCHIVO-EMPLEADO2. "Empleado 2
IF SY-SUBRC EQ 0.
SELECT *
FROM ZCATEGORIA
WHERE TRFGR EQ PA0008-TRFGR.
WI_BETRG2 = ZCATEGORIA-BETRG.
WC_CATEGORIA = ZCATEGORIA-TRFGR.
ENDSELECT.
ENDIF.
ENDSELECT.
ENDFORM.
* Fin de funcin busca_categoria *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Fucion archivo_error *
FORM ARCHIVO_ERROR.
OPEN DATASET ARCH1 FOR OUTPUT IN TEXT MODE.
IF SY-SUBRC NE 0.
STOP. EXIT.
ENDIF.
LOOP AT TH_ERROR.
TRANSFER TH_ERROR TO ARCH1.
ENDLOOP.
CLOSE DATASET ARCH1.
ENDFORM.
* Fin de archivo_error *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Funcion bdc_close *
FORM BDC_CLOSE USING EXCEPT.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
EXCEPT = SY-SUBRC.
ENDFORM.
* Fin de funicon bdc_close *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Funcion dynpro_start *
FORM DYNPRO_START USING PROGRAM DYNPRO.
CLEAR BDC_TABLE.
BDC_TABLE-PROGRAM = PROGRAM.
BDC_TABLE-DYNPRO = DYNPRO.
BDC_TABLE-DYNBEGIN = 'X'.
APPEND BDC_TABLE.
ENDFORM. " DYNPRO_START
* Fin de funcion dynpro_start *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Funion dynpro_field *
FORM DYNPRO_FIELD USING FIELD VALUE.
CLEAR BDC_TABLE.
BDC_TABLE-FNAM = FIELD.
BDC_TABLE-FVAL = VALUE.
APPEND BDC_TABLE.
ENDFORM. " DYNPRO_FIELD
* Fin de funcion dypro_field *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Fucnion tiempos_extra *
FORM TIEMPOS_EXTRA.
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-RAZON = 'ETI ' OR TH_ARCHIVO-RAZON = 'EPM ' OR
TH_ARCHIVO-RAZON = 'ERP ' ) AND TH_ARCHIVO-TURNO NE ' '.
IF TH_ARCHIVO-TURNO < 10.
CONCATENATE 'GK' TH_ARCHIVO-TURNO INTO WC_TURNO_R.
ELSEIF 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 = '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 'GK' TH_ARCHIVO-TURNO INTO WC_TURNO_R.
ELSEIF 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 < WI_BETRG2. "Cambia categoria del Empleado 1
PERFORM BUSCA_CATEGORIA.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'DIFP'.
PERFORM DYNPRO_START USING 'MP200000' '2221'.
PERFORM DYNPRO_FIELD USING 'P2APL-TRFGR' WC_CATEGORIA.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/8'.
PERFORM DYNPRO_START USING 'MP200000' '2100'.
ENDIF.
IF TH_ARCHIVO-DEPARTAMENTO NE ' '.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'PRIM'.
PERFORM DYNPRO_START USING 'SAPLHRTV' '0300'.
PERFORM DYNPRO_FIELD USING 'COBL-KOSTL' TH_ARCHIVO-DEPARTAMENTO.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/8'.
PERFORM DYNPRO_START USING 'MP200000' '2100'.
ENDIF.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPD'. "MML QA&C 08.02.00
ENDFORM.

*----------------------------------------------------------------------*
* Form GENERATE_BDC_DATA_2 *
FORM GENERATE_BDC_DATA_2.
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.
PERFORM DYNPRO_FIELD USING 'P2003-TPROG' WC_TURNO.
IF WI_BETRG1 < WI_BETRG2. "Cambia categoria del Empleado 1
PERFORM BUSCA_CATEGORIA.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'DIFP'.
PERFORM DYNPRO_START USING 'MP200000' '2221'.
PERFORM DYNPRO_FIELD USING 'P2APL-TRFGR' WC_CATEGORIA.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/8'.
PERFORM DYNPRO_START USING 'MP200000' '2100'.
ENDIF.
IF TH_ARCHIVO-DEPARTAMENTO NE ' '.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'PRIM'.
PERFORM DYNPRO_START USING 'SAPLHRTV' '0300'.
PERFORM DYNPRO_FIELD USING 'COBL-KOSTL' TH_ARCHIVO-DEPARTAMENTO.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/8'.
PERFORM DYNPRO_START USING 'MP200000' '2100'.
ENDIF.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPD'. "MML QA&C 08.02.00
ENDFORM.
* Form GENERATE_BDC_DATA_2 *
*----------------------------------------------------------------------

*----------------------------------------------------------------------*
* Form ELIMINA_SUSTITUCION *
FORM ELIMINA_SUSTITUCION.
REFRESH BDC_TABLE.
PERFORM DYNPRO_START USING 'SAPMP50A' '1000'.
PERFORM DYNPRO_FIELD USING 'RP50G-PERNR' TH_ARCHIVO-NUMERO.
PERFORM DYNPRO_FIELD USING 'RP50G-BEGDA' WC_FECHA.
PERFORM DYNPRO_FIELD USING 'RP50G-ENDDA' WC_FECHA.
PERFORM DYNPRO_FIELD USING 'RP50G-CHOIC' '2003'.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=DEL'.
PERFORM DYNPRO_START USING 'MP200000' '2100'.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '=UPDL'.
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. " ELIMINA_SUSTITUCION
* Form ELIMINA_SUSTITUCION *
*----------------------------------------------------------------

No comments:

Blog Archive