Cl_abap_matcher

Dear Abapes,
Im trying to undustand reguler expression, so my problem is i'll tack some samples in the net there call <b>cl_abap_matcher</b> class, In the SE80 I couldnt get from that.
any body can help me brows this or any reguler exprission samples.. please hep me

http://help.sap.com/saphelp_nw2004s/helpdata/en/42/9d6ceabb211d73e10000000a1553f6/frameset.htm

Similar Messages

  • Validation on data and time format

    Hi
    In a flat file a date and time fill in but user.  And the data and time format should always be fill in with the format <DDMMYYYY> <HHMMSS>
    is there a FM which check whether user has put the wrong date format such as <YYYYMMDD> or <MMDDYYYY> instead for the the one mention above. 
    Please advise whether there is a FM which check on the format on the time stamp also.
    Note: the input of the data and time is done by the user.
    Thank

    Hi,
           use the new OOPs concept,
    PARAMETERS dateTYPE c LENGTH 10.
    DATA matcher TYPE REF TO cl_abap_matcher.
    * For date
    matcher = cl_abap_matcher=>create( pattern = `[0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}`
                                       ignore_case = 'X'
                                       text = date ).
    IF matcher->match( ) IS INITIAL.
      MESSAGE 'Wrong Format' TYPE 'I'.
    ELSE.
      MESSAGE 'Format OK' TYPE 'I'.
    ENDIF.
    like dis pattern for time : 
    [0-9]{1,2}:[0-9]{2}
    pattern for timestamp:
    [0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4} [0-9]{1,2}:[0-9]{2}
    Code Formatted by: Alvaro Tejada Galindo on Jan 7, 2009 4:35 PM

  • Creating MIME for XML

    I am reading XML tags from the Spool and converting that into a XML file and displaying in the screen.  But it is not displaying
    I am using the following code for that.,
        p_regex = '.[^.]+$'.
        condense p_regex.
        create object regex
          exporting
            pattern     = p_regex
            ignore_case = ''.
    * For REGEX match
        matcher = cl_abap_matcher=>create(
                       pattern     = p_regex
                       ignore_case = ' '
                       table       = i_files ).
        lt_result = matcher->find_all( ).
        find first occurrence of regex '.[^.]+$' in lt_result match offset v_offset.
        add 1 to v_offset.
        v_extension = v_filename+v_offset.
        call function 'SDOK_MIMETYPE_GET'
          exporting
            extension = v_extension
          importing
            mimetype  = v_mimetype.
        v_mime_string = v_mimetype.
        call method cl_wd_runtime_services=>attach_file_to_response
          exporting
            i_filename      = v_filename
            i_content       = v_xstring
            i_mime_type     = v_mime_string
            i_in_new_window = abap_true
            i_inplace       = abap_true.

    hi check this 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-UNAME0(6) NE 'GKRHUM' AND SY-UNAME0(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_FECHA6(2) '.' WD_FECHA4(2) '.' WD_FECHA(4)
                       INTO WC_FECHA.
                PERFORM DATOS_DESC.           "Actualiza 2003
             ELSE.
                PERFORM EVENTO_IN_OUT.
                CONCATENATE WD_FECHA6(2) '.' WD_FECHA4(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_FECHA6(2) '.' WD_FECHA4(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-FECHA4(4) TH_ARCHIVO-FECHA2(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-DIA6(4) CHECADAS-DIA3(2)
                                  CHECADAS-DIA(2)
                             INTO GVK_FECHA.
                      GVK_FECHA = GVK_FECHA + 1.
                      CONCATENATE GVK_FECHA6(2) GVK_FECHA4(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-DIA6(4) CHECADAS-DIA3(2)
                                    CHECADAS-DIA(2)
                               INTO GVK_FECHA.
                        GVK_FECHA = GVK_FECHA + 1.
                        CONCATENATE GVK_FECHA6(2) GVK_FECHA4(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-DIA6(4) CHECADAS-DIA3(2)
                                  CHECADAS-DIA(2)
                             INTO GVK_FECHA.
                      GVK_FECHA = GVK_FECHA + 1.
                      CONCATENATE GVK_FECHA6(2) GVK_FECHA4(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-DIA6(4) CHECADAS-DIA3(2)
                                    CHECADAS-DIA(2)
                               INTO GVK_FECHA.
                        GVK_FECHA = GVK_FECHA + 1.
                        CONCATENATE GVK_FECHA6(2) GVK_FECHA4(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.

  • Regular Expressions - Questions to SME

    Ralph Benzinger presented an online meetup on the topic of Regular Expressions.  The presentation (slides only) can be found <a href="http://www.sdn.sap.comhttp://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/866072ca-0b01-0010-54b1-9c02a45ba8aa">here</a>
    Unfortunately the recording is not going to be available, but Ralph has been generous enough to agree to answer questions posted to this sticky thread.
    cheers,
    Marilyn

    Hello Peter,
    You're welcome!
    Alas, I was unable to locate the regex documentation on help.sap.com either.  In fact, I'm not even sure it has already been updated for 2004s.  I recommend that you use the online documentation within the system, e.g., from transactions SE38 or SE80.  Do an index search for "regex", and you'll be directed to REGEX, FIND and REGEX, REPLACE, both of which have extensive subsections on regexes.
    The class cx_sy_regex is an exception class that is thrown by FIND, REPLACE and cl_abap_regex in case of an invalid regex, such as ".\1" (there is no capture group that back reference \1 can refer to).  If the pattern is known statically, the syntax check will report this error, but for statements like "FIND REGEX pat IN text.", the actual pattern is only known at runtime.
    The cx_sy_matcher class (and its subclasses) similarly indicate some invalid states, for example trying to call "cl_abap_matcher->replace_found( )" when the matcher has no current match to replace (e.g., replace_found( ) called twice in a row).
    Please let me know if I can provide some additional information.
    Regards
    Ralph

  • Funtion module or code to validate email id on the form

    Hi gurus,
    User enters email id in the form, i need to validate email id in order to void in correct date.
    Any FM or code will be really hepful.
    Thanks
    Chris.

    Check this RegEx
    data matcher type ref to cl_abap_matcher.
    matcher = cl_abap_matcher=>create(
                 pattern = `w+(.w+)*@(w+.)+(w{2,4})`
                 ignore_case = 'X'
                 text = email ).   " Give your email say like ars @ ars....com and check
    if matcher->match( ) is initial.
      message 'Invalid email Format' type 'I'.
    else.
      message 'Valid email format' type 'I'.
    endif.

  • RegEx like in SQL WHERE

    Hello!
    I want to search in internal tables lines like I do this in where expression of sql, but thought the instrumentality of RegEx.
    For example, internal table have 2 lines:
    Implementations and running times
    implementation language
    I want to find like in SQL such string 'implrun*'
    How can I do that in RegEx?

    Try this way
    data: p_regex(80)  TYPE c VALUE 'impl(.+)run(.+)'.
    data: regex         type ref to cl_abap_regex,
          matcher       type ref to cl_abap_matcher,
          ls_result     type match_result,
          lt_result     type match_result_tab.
    condense p_regex.
        create object regex
          exporting
            pattern     = p_regex
            ignore_case = ''.
    * For REGEX match
        matcher = cl_abap_matcher=>create(
                       pattern     = p_regex
                       ignore_case = ' '
                       table       = i_temp ). " i_temp is your internal table contains records
    lt_result = matcher->find_all( ).

  • How to use regular expression to find string

    hi,
    who know how to get all digits from the string "Alerts 4520 ( 227550 )  (  98 Available  )" by regular expression, thanks
    br, Andrew

    Liu,
    You can use RegEx as   
    d+
    Whether you are using CL_ABAP_REGEX class then
    report  zars.
    data: regex   type ref to cl_abap_regex,
          matcher type ref to cl_abap_matcher,
          match   type c length 1.
    create object regex exporting pattern = 'd+'
                                  ignore_case = ''.
    matcher = regex->create_matcher( text = 'Test123tes456' ).
    match = matcher->match( ).
    write match
    You can find more details regarding REGEX and POSIX examples here
    http://www.regular-expressions.info/tutorial.html

  • Regular Expression: Different results when using FIND or regex classes

    Hi,
    has anybody an idea why the FIND REGEX statement and the regex class delivers different results when searching for
    ^\*
    in
    I try to find every place with an asterisk as first sign of the line.
    The FIND statement
    DATA gv_string        TYPE        string.
    DATA gv_pattern       TYPE        string.
    DATA gt_match_result  TYPE        match_result_tab.
    gv_string = '****'.
    gv_pattern = '^\*'.
    FIND ALL OCCURRENCES OF REGEX gv_pattern
                               IN gv_string
                          RESULTS gt_match_result.
    returns one hit as expected. But the class cl_abap_regex and cl_abap_matcher returns four hits in this example:
    DATA gv_string        TYPE        string.
    DATA gv_pattern       TYPE        string.
    DATA gt_match_result2 TYPE        match_result_tab.
    DATA gx_regex         TYPE REF TO cl_abap_regex.
    DATA gx_matcher       TYPE REF TO cl_abap_matcher.
    gv_string = '****'.
    gv_pattern = '^\*'.
    TRY.
        CREATE OBJECT gx_regex
          EXPORTING
            pattern = gv_pattern.
      CATCH cx_sy_regex .
        BREAK-POINT.
        EXIT.
    ENDTRY.
    TRY.
        CREATE OBJECT gx_matcher
          EXPORTING
            regex = gx_regex
            text  = gv_string.
      CATCH cx_sy_matcher .
        BREAK-POINT.
        EXIT.
    ENDTRY.
    gt_match_result2 = gx_matcher->find_all( ).
    BREAK-POINT.
    Looks like the class doesn't consider the start of line symbol (^). Is there an error in my implementation?
    Any help is appreciated.
    Matthias

    Hi Jim,
    thank you for your reply. But to negate a value set of single characters you have to use
    [^  ]
    I used just the character
    ^
    This is defined as anchor character for the start of a line (See the documentation link you posted -> chapter 'Special characters for search strings') .
    As I understand it, should the FIND REGEX statement does the same as the CL_ABAP_REGEX and CL_ABAP_MATCHER classes. Therefore, I do not understand, why both implementations deliver another result.
    And I didn't find an answer for that. Does anyone else?
    Matthias

  • Verify SSN in the string

    Hi ,
    I have a requirement while reading the input file.
    Input file is mixed up with several header records and data records
    Every data record has SSN starting at fixed position.
    So we need to identify the SSN in the data record and store that entire record and skip other records.
    SSN format is xxx-xx-xxxx . All are numbers .
    I think there might be easier to way to compare and identify this format.
    Could anyone suggest the best way to do these.(May be comparing patterns,some string operation etc).Also i need to check all the 'X' are numbers.
    Thanks for the help.
    Regards

    Try this code by cut & paste into a test program and try
    report zars
      no standard page heading line-size 255.
    parameters : ssn(15) type c.
    data matcher type ref to cl_abap_matcher.
    matcher = cl_abap_matcher=>create(
                 pattern = `^d{3}-d{2}-d{4}$`
                 ignore_case = 'X'
                 text = ssn ).
    if matcher->match( ) is initial.
      message 'Invalid ssn Format' type 'I'.
    else.
      message 'Valid ssn format' type 'I'.
    endif.

  • Explanation for regex needed

    Hi intellectuals,
    the new regex functionality is really amazing - but not easy to understand.
    Let me try to start a small competition:
    Pleas explain in detail the following expression:
    DATA:
      whatever TYPE string,
      matcher TYPE REF TO cl_abap_matcher.
    matcher = cl_abap_matcher=>create(
                pattern = `w+(.w+)*@(w+.)+(w{2,4})`
                text    = whatever ).
    I'd like to know the evaluation check procedure matcher->match( ). Just imagine what could I put into string whatever to match or not match the expression pattern.
    TIA,
    Regards,
    Clemens

    Hi,
    I also played with regular expressions in ABAP and other tools. And every tool worked a little bit different. According to the SAP documentation is ABAP using the [Boost Regex Library|http://www.boost.org/].
    Cause it is not very easy to implement REGEX machines I am not wondering why there are such differents in behaviour. But why ABAP behaves different when using FIND REGEX and the regex classes that is still a not answered question -> Re: Regular Expression: Different results when using FIND or regex classes and Re: Regex: Different results when using FIND or regex classes.
    Regards Rudi

Maybe you are looking for

  • PC iCloud Mail and 'Parent Approval' on child purchases.

    Hi, I'm running Windows 7 Premium, I've installed iCloud and I can see all the various iCloud applications in my 'Applications' window.  I attempt to login to iCloud mail, and the login page appears, I enter my login information (that works on my iPa

  • How to improve custom protocol speed?

    Hi I used RMI to get an array of shorts from server. Then I thought that using RMI for transferring arrays of primitives is not a good idea, that is why I decided to create my own protocol for transferring data. The other goal to implement my own pro

  • Mac air screen not displaying correctly

    I have a Mac Air 13' screen. Recently I was using it and someone put a lemon head on the keyboard and slammed the screen down on it for no reason. The screen is now displaying a grey screen with a white vertical line down the middle. When I turn the

  • How to query data from Oracle, MySQL, and MSSQL?

    For an environment consisting of Oracle 11g/12c enterprise edition, MySQL 5.7 community edition, and MSSQL 2008/2012 stanard/enterprise edition, is there any major issue using DG4ODBC to query data from all 3 platforms? Is there other free alternativ

  • Tnsping failed from client

    platform: Oracle 10.2.0.1.0 on RHEL5. Issue: tnsping failed from client (successful from the server itself) Brief: I can tnsping and sqlplus to the test1 db from the RHEL5 db server itself, no issue. But when I tried to tnsping from a client, I get t