viernes, 4 de noviembre de 2016

SAVE_TEXT

  data:
   ltd_tlines  like tline occurs with header line,
   lwa_header  type thead.

*{ +@RMA6369
  datals_id type thead-tdid,
        ls_name type thead-tdname,
        ls_objeto type thead-tdobject,
        ls_lines type standard table of tline,
        ls_header type thead,
        ls_tabla type standard table of thead.
*} +@RMA6369

  lwa_header-tdobject 'EKKO'.
  lwa_header-tdname   ip_ebeln.
  lwa_header-tdid     'F02'.
  lwa_header-tdspras  'S'.

  ltd_tlines-tdformat '*'.
  ltd_tlines-tdline   ip_mblnr5.
  append ltd_tlines.

  call function 'SAVE_TEXT'
    exporting
      client          sy-mandt
      header          lwa_header
      savemode_direct 'X'
    tables
      lines           ltd_tlines
    exceptions
      id              1
      language        2
      name            3
      object          4
      others          5.

  if sy-subrc <> 0.
*  ----------ERROR.
  else.
*  ----------EXITO.
  endif.

*{ +@RMA6369
  ls_objeto 'EKPO'.
  concatenate ip_ebeln '00010' into ls_name.
  ls_id     'F01'.

  call function 'SELECT_TEXT'
    exporting
      id         ls_id
      language   sy-langu
      name       ls_name
      object     ls_objeto
    importing
      entries    sy-tfill
    tables
      selections ls_tabla.

  if sy-tfill 0.
    call function 'INIT_TEXT'
      exporting
        id       ls_id
        language sy-langu
        name     ls_name
        object   ls_objeto
      importing
        header   ls_header
      tables
        lines    ls_lines
      exceptions
        id       1
        language 2
        name     3
        object   4.

  else.
    call function 'READ_TEXT'
      exporting
        id              ls_id
        language        sy-langu
        name            ls_name
        object          ls_objeto
      importing
        header          ls_header
      tables
        lines           ls_lines
      exceptions
        id              1
        language        2
        name            3
        not_found       4
        object          5
        reference_check 6.

  endif.
  call function 'EDIT_TEXT'
    exporting
      header ls_header
      save   'X'
    tables
      lines  ls_lines.

  call function 'SAVE_TEXT'
    exporting
      header          ls_header
      savemode_direct 'X'
    tables
      lines           ls_lines.
*} +@RMA6369

martes, 18 de octubre de 2016

ABAP a SQL Server

En este turorial se enseñará cómo eliminar e insertar datos de ABAP a tablas de SQL server:

Se crea una clase SE24

ZCL_BC_EXTRACTOR_QV


METHOD INSERT_QV.
  DATALO_CONNECT   TYPE REF TO CL_SQL_CONNECTION,
        LO_SQL_ERROR TYPE REF TO CX_SY_OPEN_SQL_ERROR,
        LS_TEXTO     TYPE STRING.

* Lógica para insertar los datos a Qlikview
  TRY.

*     Verificar tabla
      IF DATA IS NOT INITIAL.
*       Insertar los  datos en la tabla de Qlikview
        INSERT (TABNAMECONNECTION (CON_NAMEFROM TABLE DATA.
        IF SY-SUBRC IS INITIAL.
          COMMIT WORK.
        ELSE.
          ROLLBACK WORK.
        ENDIF.

      ENDIF.
    CATCH CX_SY_OPEN_SQL_ERROR INTO LO_SQL_ERROR.
      LS_TEXTO LO_SQL_ERROR->GET_LONGTEXT).
      MESSAGE S001(ZTASAWITH LS_TEXTO.
  ENDTRY.
ENDMETHOD.



METHOD FORMAT_DATE.
  CONSTANTSLC_SPACE TYPE CHAR15 VALUE '               ',
             LC_SEP   TYPE CHAR01 VALUE '-'.

  IF DATE IS NOT INITIAL OR DATE NE '00000000'.
*   Formatea la fecha  en formato SAP al formato en SQL
    CONCATENATE DATE+0(4LC_SEP DATE+4(2LC_SEP DATE+6(2LC_SPACE
    INTO DATE_CHAR RESPECTING BLANKS.
  ENDIF.
ENDMETHOD.




METHOD DELETE_QV.
  DATALO_CONNECT   TYPE REF TO CL_SQL_CONNECTION,
        LO_SQL_ERROR TYPE REF TO CX_SY_NATIVE_SQL_ERROR,
        LS_TEXTO     TYPE STRING.

* Lógica para borrar los datos a Qlikview
  TRY.
*       Borrar los  datos en la tabla de Qlikview
      DELETE FROM (TABNAMECONNECTION (CON_NAMEWHERE (CONDICION).
      IF SY-SUBRC IS INITIAL.
        COMMIT WORK.
      ELSE.
        ROLLBACK WORK.
      ENDIF.

    CATCH CX_SY_NATIVE_SQL_ERROR INTO LO_SQL_ERROR.
    LS_TEXTO LO_SQL_ERROR->GET_LONGTEXT).
    MESSAGE S001(ZTASAWITH LS_TEXTO.
  ENDTRY.


ENDMETHOD.




METHOD DELETE_ALL_QV.
  DATALO_CONNECT   TYPE REF TO CL_SQL_CONNECTION,
        LO_SQL_ERROR TYPE REF TO CX_SY_NATIVE_SQL_ERROR.

* Lógica para borrar los datos a Qlikview
  TRY.
*       Borrar los  datos en la tabla de Qlikview
      DELETE FROM (TABNAMECONNECTION (CON_NAME).
      IF SY-SUBRC IS INITIAL.
        COMMIT WORK.
      ELSE.
        ROLLBACK WORK.
      ENDIF.

    CATCH CX_SY_NATIVE_SQL_ERROR INTO LO_SQL_ERROR.

  ENDTRY.


ENDMETHOD.




Se crea un programa un programa ABAP, una tabla en R3 y una tabla en SQL con la misma estructura y nombre.

Nombre será el nombre de la tabla creada y PO_TABLA es el nombre de la tabla interna


* Clase conexión a base de datos QV
  DATA LO_EXTRACTOR TYPE REF TO ZCL_BC_EXTRACTOR_QV,
         LS_FILTRO TYPE STRING,
         LS_INICIO TYPE CHAR50,
         LS_FIN TYPE CHAR50.
  FIELD-SYMBOLS<LS_FECHA> LIKE LINE OF GR_FECHA.


* Inicializar clase de conexión
*   Creo el objeto
    CREATE OBJECT LO_EXTRACTOR.

    READ TABLE GR_FECHA ASSIGNING <LS_FECHA> INDEX 1.
    IF SY-SUBRC 0.
      IF <LS_FECHA>-OPTION 'BT'.
        LS_INICIO <LS_FECHA>-LOW.
        LS_FIN <LS_FECHA>-HIGH.
        CONCATENATE 'FECHA BETWEEN ''' LS_INICIO ''' AND  '''
        LS_FIN '''' INTO LS_FILTRO RESPECTING BLANKS.
      ELSEIF <LS_FECHA>-OPTION 'EQ'.
        LS_INICIO <LS_FECHA>-LOW.
        CONCATENATE 'FECHA = ''' LS_INICIO INTO LS_FILTRO RESPECTING BLANKS.
      ENDIF.

*   Borramos los registros
      CALL METHOD LO_EXTRACTOR->DELETE_QV
        EXPORTING
          CON_NAME  = ''BD_QLIKVIEW''
          TABNAME   NOMBRE
          CONDICION LS_FILTRO.
    ENDIF.

*   Insertamos los registros
    CALL METHOD LO_EXTRACTOR->INSERT_QV
      EXPORTING
        CON_NAME = 'BD_QLIKVIEW'
        TABNAME  NOMBRE
        DATA     PO_TABLA.

lunes, 19 de septiembre de 2016

User Exit XK01 / MK01

Cuando se crea o modifica un proveedor y se ingresa un NIF ya existente SAP te da un mensaje de advertencia que el NIF ya existe, en este caso se hará la validación que no se deba ingresar un NIF ya existente por cada sociedad existente


Se usará el siguiente include ZXF05U01 y se pondrá lo siguiente :

IF sy-tcode EQ 'MK01' OR sy-tcode EQ 'MK02'.

*I_LFB1-BUKRS

*Primero se valida que el grupo de cuenta inicie con 'P'
  IF i_lfa1-ktokk+0(1'P'.

    CLEAR ls_stcd1.

    SELECT SINGLE a~stcd1 INTO ls_stcd1
    FROM lfa1 AS a INNER JOIN lfb1 AS ON
      a~lifnr b~lifnr
    WHERE a~stcd1 i_lfa1-stcd1 AND
          b~bukrs i_lfb1-bukrs.
*Si se crea acreedor
    IF sy-subrc EQ AND sy-tcode EQ 'MK01'.
      MESSAGE 'Nº ident.fis.1 ya existe' TYPE 'E'.
    ENDIF.

*Si se modifica acreedor
    IF  sy-tcode EQ 'MK02'.

      SELECT SINGLE a~lifnr INTO ls_lifnr FROM lfa1 AS a INNER JOIN lfb1 AS ON
        a~lifnr b~lifnr
        WHERE a~stcd1 i_lfa1-stcd1
          AND a~lifnr i_lfa1-lifnr
          AND b~bukrs i_lfb1-bukrs.

      IF sy-subrc EQ 0.
      ELSE.
        SELECT SINGLE FROM lfa1 WHERE stcd1 i_lfa1-stcd1.
        IF sy-subrc 0.
          MESSAGE 'Nº ident.fis.1 ya existe' TYPE 'E'.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
ENDIF.

jueves, 18 de febrero de 2016

Infotipos


PC_PAYRESULT  -> Todos los tipos de nomina

Infotipo 008 -> Nominas 6T20 Valor día, 6T21 Valor día asignación familiar

FTTP

ZBC_RFC_UTIL_BASE64_A_FTP

* Autor      : Roberto Mejia Andrade                                   *
* Consultora : Xternal                                                 *
* Módulo     : SF                                                      *
* Fecha      : 15.02.2016                                              *
* Req        : R3_001                                                  *
* Descripción: Guardar archivo en base 64 a FTP                        *
*----------------------------------------------------------------------*

  DATAls_handle TYPE i,
        ls_long TYPE i,
        ls_valida TYPE flag,
        ls_aux TYPE LENGTH 255,
        ls_aux1 TYPE string,
        ls_aux2 TYPE string,
        ls_user TYPE LENGTH 300,
        ls_clave TYPE c  LENGTH 300,
        ls_host TYPE LENGTH 300,
        ls_xst  TYPE xstring,
        ls_mensaje TYPE string,
        ls_ruta TYPE LENGTH 300,
        ls_ruta1 TYPE LENGTH 300,
        ls_data TYPE LENGTH 26200,
        ls_dato TYPE string,
        ltd_data LIKE STANDARD TABLE OF ls_data,
        ltd_data1 LIKE STANDARD TABLE OF ls_data,
        ltd_data2 LIKE STANDARD TABLE OF ls_data.

  FIELD-SYMBOLS<ls_arb64> TYPE zwut_arb64,
                 <ls_mensaje> TYPE zflmin..

* Si los parámetros IP_SVFTP o IP_USUAR no existen se obtendrán estos valores
* de la tabla ZTBC_DATA donde CODIG = 'X5

  IF ip_svftp IS INITIAL.

    SELECT SINGLE descr INTO ip_svftp FROM ztbc_data
      WHERE codig 'X5' AND
            argum 'SERVERFTP'.
  ENDIF.

  IF ip_usuar IS INITIAL.

    SELECT SINGLE descr INTO ip_usuar FROM ztbc_data
      WHERE codig 'X5' AND
            argum 'USUARIOFTP'.

    SELECT SINGLE descr INTO ip_clave FROM ztbc_data
      WHERE codig 'X5' AND
            argum 'PASSFTP'.

  ENDIF.

* Usar IP_RFCDS igual a 'SAPFTPA' para cuando la función se ejecuta como
* proceso en fondo, sino IP_RFCDS = 'SAPFTP'

  IF sy-batch 'X'.
    ip_rfcds 'SAPFTPA'.
  ELSE.
    ip_rfcds 'SAPFTP'.
  ENDIF.

  ls_user ip_usuar.
  ls_clave ip_clave.
  ls_host ip_svftp.

  LOOP AT it_arb64 ASSIGNING <ls_arb64>.

* Estos datos servirán para la conexión con el FTP mediante la función FTP_CONNECT

    CALL FUNCTION 'FTP_CONNECT'
      EXPORTING
        user            ls_user
        password        ls_clave
        host            ls_host
        rfc_destination ip_rfcds
      IMPORTING
        handle          ls_handle
      EXCEPTIONS
        not_connected   1
        OTHERS          2.

    IF sy-subrc 0.

      CLEARltd_data[]ls_ruta1ls_valida.

      ls_aux <ls_arb64>-rtarc.

      IF ls_aux IS NOT INITIAL.

        IF ls_aux+0(1'/'.
          CLEAR ls_aux+0(1).
        ENDIF.

        CONDENSE ls_aux NO-GAPS.
        ls_long strlenls_aux ).
        ls_long ls_long 1.
        IF ls_aux+ls_long(1'/'.
          CLEAR ls_aux+ls_long(1).
        ENDIF.

      ENDIF.

      CLEAR ls_long.

      CONCATENATE <ls_arb64>-rtarc <ls_arb64>-nmarc INTO ls_ruta
        SEPARATED BY '/'.

      REPLACE ALL OCCURRENCES OF '//' IN ls_ruta WITH '/'.

      CHECK ls_valida IS INITIAL.

      CLEAR ltd_data[].

      IF <ls_arb64>-tpope 'B'.

* Elimina el archivo existente
        APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
        CLEAR ls_ruta1.
        ls_ruta1 ls_ruta.
        CONCATENATE 'del' ls_ruta INTO ls_ruta SEPARATED BY space.

        CALL FUNCTION 'FTP_COMMAND'
          EXPORTING
            handle        ls_handle
            command       ls_ruta
          TABLES
            data          ltd_data
          EXCEPTIONS
            command_error 1
            tcpip_error   2.

        IF sy-subrc 0.
          <ls_mensaje>-cmin 'S'.
          CONCATENATE ls_ruta1 ': Archivo eliminado'
           INTO <ls_mensaje>-dsmin.
        ELSE.
          <ls_mensaje>-cmin 'E'.
          CONCATENATE ls_ruta1 ': Archivo no eliminado'
           INTO <ls_mensaje>-dsmin.
        ENDIF.

      ELSEIF <ls_arb64>-tpope 'C'.

        SPLIT ls_aux AT '/' INTO ls_aux ls_aux1.

        IF ls_aux1 IS INITIAL.

* Verificamos si existe la ruta
          CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.

          CALL FUNCTION 'FTP_COMMAND'
            EXPORTING
              handle        ls_handle
              command       ls_ruta1
            TABLES
              data          ltd_data
            EXCEPTIONS
              command_error 1
              tcpip_error   2.

          IF sy-subrc NE 0.
* Procedemos a crear el directorio
            CLEAR ls_ruta1.
            CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.

            CALL FUNCTION 'FTP_COMMAND'
              EXPORTING
                handle        ls_handle
                command       ls_ruta1
              TABLES
                data          ltd_data
              EXCEPTIONS
                command_error 1
                tcpip_error   2.

          ENDIF.
        ELSE.

          WHILE ls_aux1 IS NOT INITIAL.

* Verificamos si existe la ruta
            CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.

            CALL FUNCTION 'FTP_COMMAND'
              EXPORTING
                handle        ls_handle
                command       ls_ruta1
              TABLES
                data          ltd_data
              EXCEPTIONS
                command_error 1
                tcpip_error   2.

            IF sy-subrc NE 0.
* Procedemos a crear el directorio
              CLEAR ls_ruta1.
              CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.

              CALL FUNCTION 'FTP_COMMAND'
                EXPORTING
                  handle        ls_handle
                  command       ls_ruta1
                TABLES
                  data          ltd_data
                EXCEPTIONS
                  command_error 1
                  tcpip_error   2.

            ENDIF.

            SPLIT ls_aux1 AT '/' INTO ls_aux2 ls_aux1.
            CONCATENATE ls_aux ls_aux2 INTO ls_aux SEPARATED BY '/'.

            IF ls_aux1 IS INITIAL.
* Verificamos si existe la ruta
              CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.

              CALL FUNCTION 'FTP_COMMAND'
                EXPORTING
                  handle        ls_handle
                  command       ls_ruta1
                TABLES
                  data          ltd_data
                EXCEPTIONS
                  command_error 1
                  tcpip_error   2.

              IF sy-subrc NE 0.
* Procedemos a crear el directorio
                CLEAR ls_ruta1.
                CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.

                CALL FUNCTION 'FTP_COMMAND'
                  EXPORTING
                    handle        ls_handle
                    command       ls_ruta1
                  TABLES
                    data          ltd_data
                  EXCEPTIONS
                    command_error 1
                    tcpip_error   2.

              ENDIF.

            ENDIF.

          ENDWHILE.

        ENDIF.

* Crear los archivos

        IF <ls_arb64>-bas64 IS NOT INITIAL.

* Pasamos de base 64 a xstring
          CALL FUNCTION 'SSFC_BASE64_DECODE'
            EXPORTING
              b64data                  <ls_arb64>-bas64
            IMPORTING
              bindata                  ls_xst
            EXCEPTIONS
              ssf_krn_error            1
              ssf_krn_noop             2
              ssf_krn_nomemory         3
              ssf_krn_opinv            4
              ssf_krn_input_data_error 5
              ssf_krn_invalid_par      6
              ssf_krn_invalid_parlen   7
              OTHERS                   8.

* Pasamos de xstring a binario
          CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
            EXPORTING
              buffer        ls_xst
            IMPORTING
              output_length ls_long
            TABLES
              binary_tab    ltd_data2.

* Función para cargar archivo al servidor FTTP
          CALL FUNCTION 'FTP_R3_TO_SERVER'
            EXPORTING
              handle         ls_handle
              fname          ls_ruta
              blob_length    ls_long
*             character_mode = 'X'
            TABLES
              blob           ltd_data2
            EXCEPTIONS
              tcpip_error    1
              command_error  2
              data_error     3
              OTHERS         4.

          IF sy-subrc 0.
            APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
            <ls_mensaje>-cmin 'S'.
            CONCATENATE <ls_arb64>-nmarc ': Archivo cargado correctamente'
             INTO <ls_mensaje>-dsmin.
          ELSE.

            APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
            <ls_mensaje>-cmin 'E'.
            CONCATENATE <ls_arb64>-nmarc ': Archivo con errores / Atchivo no cargado'
             INTO <ls_mensaje>-dsmin.
          ENDIF.

        ENDIF.

      ENDIF.

      CALL FUNCTION 'FTP_DISCONNECT'
        EXPORTING
          handle ls_handle.

    ELSE.

      APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
      <ls_mensaje>-cmin 'E'.
      CONCATENATE ls_host ': No se pudo conectar al servidor FTTP'
       INTO <ls_mensaje>-dsmin.
      EXIT.

    ENDIF.

  ENDLOOP.

martes, 26 de enero de 2016

Field exit va01

Objetivo: validar que el cliente tenga área de control de créditos

1. VA01 -> Se busca el elemento de datos del campo a validar, en este caso solicitante


2.Vamos al programa RSMODPRF, ejecutamos, creamos la función FIELD_EXIT_KUNAG:


3. Ponemos el siguiente código

  DATAls_ctrl   TYPE LENGTH 1,
        ls_kunnr  TYPE kuagv-kunnr.

  IF input IS NOT INITIAL AND sy-ucomm 'SICH'.

    CLEAR ls_ctrl.
* Leer flag desde tabla constantes para iniciar control
    SELECT SINGLE low INTO ls_ctrl
      FROM ztb_constantes
       WHERE aplicacion  'SD'
         AND programa  'MV45AFZZ'
           AND campo 'CTRL'.
* Si flag es igual a X ejecutar el control de existencia de la linea de credito del cliente
    IF sy-subrc AND ls_ctrl 'X' OR ls_ctrl 'x' ).
      SELECT SINGLE kunnr INTO ls_kunnr
        FROM knkk
          WHERE kunnr input.
      IF sy-subrc <> 0" Si no tiene Área de control de crédito
        MESSAGE 'El Cliente NO tiene Área de Control de Crédito asignada. Coordinar con el área de Ctas. X Cobrar'
          TYPE 'E'.
      ENDIF.
    ENDIF.


3. Vamos al programa RSMODPRF, ejecutamos sin ponen ningún parámetro


4. Buscamos nuestro elemento de datos y click en asignar Prog


Finalmente activamos y listo