Conexion SQL SERVER a SAP

Estimados @Abapers,

Como siempre un gusto en saludarlos nuevamente.

En esta oportunidad coloco en el tapete un tema bastante interesante, pero primero los pongo en contexto:

Acaban de asignarme un proyecto bastante retador que tiene que ver con la conexión entre base de datos SQL SERVER y SAP. La idea a grandes rasgos es replicar datos de algunas tablas en SQL a tablas en SAP, en algunos casos se necesitara insertar datos directamente en tablas estándar.

Primero antes que nada me gustaría saber si han tenido experiencia con este tipo de configuración en algún momento.

Como segundo punto me gustaría que me dieran algunas recomendaciones básicas que seguramente necesitare:

  1. Manejo de Funciones RFC
  2. BAPIS
  3. Las que a ustedes les parezcan importante.

En estos momentos estoy tratando de canalizar toda la información necesaria para iniciar, pero me es importante escuchar sus opiniones al respecto.

Saludos…

Ufff, tienes para leer:

  • SAP on SQL Server Community
    h_tp://go.sap.com/community/topic/sql-server.html
  • SAP on SQL Server (Wiki)
    h_tps://wiki.scn.sap.com/wiki/display/SAPSQL/SAP+on+SQL+Server
  • Document archive for SAP on SQL Server
    h_tps://archive.sap.com/documents/space/sqlserver
  • Discussion archive for SAP on SQL Server
    h_tps://archive.sap.com/discussions/space/sqlserver

Qué versión de SQL tienen?

Hola @SidV!!

Observando las propiedades de la Base de Datos veo que es SQL SERVER 2000.

Saludos…

Tal como te has dado cuenta @johnny282, sobre este tema hablo un poco en este post:

Por otra parte ¿tenéis SAP PI o XI?

Si no es así la conexión la podéis hacer como nosotros la hicimos.

1 me gusta

Creo que si tu banco de SAP esta montado en SQL Server, podrias crear un servidor vinculado y de esa forma acceder a las tablas del banco SAP, desde el Gestor.

Estimados @Abapers,

Gracias por su pronta respuesta.

Estoy realizando el levantamiento de información de lo que se quiere y he adelantado algo mas.

El tema es el siguiente:

Necesito crear clientes que a su vez también sean deudores en SAP. Estos clientes se encuentran en una base de datos SQL SERVER 2014 la cual debo consultar para generar una especie de job en el cual cada vez que se agregue un nuevo registro, este sea creado automáticamente en SAP (En el mejor de los casos).

Ahora mis dudas:

*De que manera puedo hacer la integración de estos datos en SQL con SAP???
*Para la creación de deudores en SAP existe alguna BAPI que haga esto???

De verdad estoy algo verde con los temas de integración, por lo que estoy abierto a cualquier recomendación en temas de RFC, BAPIS y lo que ustedes consideren necesario.

Saludos.

A ver, hay muchas posibilidades. Si no tenéis SAP PI ni se pueden crear servicios web en .NET por ejemplo que mediante un trigger cada vez que den de alta una fila en una tabla llame al servicio web y vosotros desarrolléis un proxy a tal efecto, podéis hacer:

Crear un job que sea ejecutado por ejemplo cada hora.
Este job ejecuta un report que se conecte a la BBDD de sql server 2014 tal como indico en el post de más arriba (por la transacción dbco y con código sql incrustado entre sentencias EXEC ENDEXEC).
Te traes los registros a una tabla local y examinas por ejemplo la fecha y hora de creación, para saber si han sido creados la última hora desde que se ejecutó el último job.
Para estos registros puedes por ejemplo usar un batch input para crear el deudor, por ejemplo:

[CODE]
FORM CREA_DEUDOR .
DATA: L_BANKN TYPE BANKN,
L_BANKL TYPE BANKK,
L_BANKS TYPE BANKS,
L_BKONT TYPE BKONT,
L_NAME1 TYPE NAME1_GP,
L_NAME2 TYPE NAME2_GP,
L_MSGTX(280) TYPE C.
MOVE: GE_BSEC-BANKN TO L_BANKN,
GE_BSEC-BANKL TO L_BANKL,
GE_BSEC-BANKS TO L_BANKS,
GE_BSEC-BKONT TO L_BKONT.
MOVE: ZRCBOS_COBROS_9100-SGTXT(35) TO L_NAME1,
ZRCBOS_COBROS_9100-SGTXT+35(15) TO L_NAME2.
CLEAR: GT_MESSTAB, GT_BDCDATA.
REFRESH: GT_BDCDATA, GT_MESSTAB.
PERFORM F_BDC_DYNPRO USING: ‘SAPMF02D’ ‘0105’.
PERFORM F_BDC_FIELD USING: ‘BDC_OKCODE’ ‘/00’,
‘RF02D-KTOKD’ ‘DCR2’,
‘RF02D-BUKRS’ C_BUKRS.

  • Pantalla 0110, introducimos nombre y promoción
    PERFORM F_BDC_DYNPRO USING: ‘SAPMF02D’ ‘0110’.
    PERFORM F_BDC_FIELD USING: ‘BDC_OKCODE’ ‘/00’,
    ‘KNA1-NAME1’ L_NAME1,
    ‘KNA1-NAME2’ L_NAME2,
    ‘KNA1-SORTL’ ZRCBOS_COBROS_9100-PROMO,
    ‘KNA1-LAND1’ ‘ES’,
    ‘KNA1-SPRAS’ ‘ES’.
  • Pantalla 0120, introducimos NIF
    PERFORM F_BDC_DYNPRO USING: ‘SAPMF02D’ ‘0120’.
    PERFORM F_BDC_FIELD USING: ‘BDC_OKCODE’ ‘=VW’,
    ‘KNA1-STCD1’ ZRCBOS_COBROS_9100-STCD1.
  • Pantalla de datos bancarios
    PERFORM F_BDC_DYNPRO USING: ‘SAPMF02D’ ‘0130’.
    PERFORM F_BDC_FIELD USING: ‘BDC_OKCODE’ ‘=VW’.
    IF L_BKONT IS NOT INITIAL.
    PERFORM F_BDC_FIELD USING: ‘KNBK-BANKS(01)’ L_BANKS,
    ‘KNBK-BANKL(01)’ L_BANKL,
    ‘KNBK-BANKN(01)’ L_BANKN,
    ‘KNBK-BKONT(01)’ L_BKONT.
    ENDIF.
    *Pantalla 0210, cuenta contable
    PERFORM F_BDC_DYNPRO USING: ‘SAPMF02D’ ‘0210’.
    PERFORM F_BDC_FIELD USING: ‘BDC_OKCODE’ ‘=VW’,
    ‘KNB1-AKONT’ ‘436005’.
    *Pantalla 0215, condiciones de pago
    PERFORM F_BDC_DYNPRO USING: ‘SAPMF02D’ ‘0215’.
    PERFORM F_BDC_FIELD USING: ‘BDC_OKCODE’ ‘=VW’,
    ‘KNB1-ZTERM’ ‘Z000’,
    ‘KNB1-ZWELS’ ‘T’.
    *Pantalla 0610, Actualizacion de los datos
    PERFORM F_BDC_DYNPRO USING ‘SAPMF02D’ ‘0610’.
    PERFORM F_BDC_FIELD USING: ‘BDC_OKCODE’ ‘=UPDA’.
    *Obtenemos el numero de deudor creado
    MOVE P_MODOS TO GV_LMODO.
    CALL TRANSACTION ‘FD01’ USING GT_BDCDATA MODE GV_LMODO UPDATE 'S’
    MESSAGES INTO GT_MESSTAB.
    IF SY-SUBRC <> 0.
    CLEAR GV_KUNNR.
    MOVE ‘ERROR AL CREAR EL DEUDOR’ TO L_MSGTX.
    MOVE L_MSGTX TO GT_LOG-MSTXT.
    MOVE ‘E’ TO GT_LOG-TIPOE.
    APPEND GT_LOG.
    ELSE.
    READ TABLE GT_MESSTAB INDEX 1.
    GV_KUNNR = GT_MESSTAB-MSGV1.
    CONCATENATE ‘SE HA CREADO EL DEUDOR:’ GV_KUNNR
    INTO L_MSGTX SEPARATED BY SPACE.
    MOVE L_MSGTX TO GT_LOG-MSTXT.
    MOVE ‘S’ TO GT_LOG-TIPOE.
    APPEND GT_LOG.
    CALL FUNCTION 'POPUP_TO_INFORM’
    EXPORTING
    TITEL = 'DEUDORES’
    TXT1 = 'Ha sido creado el deudor con código:'
    TXT2 = GV_KUNNR.
    ENDIF.

ENDFORM. " CREA_DEUDOR
[/CODE]

1 me gusta

@Salco, estoy en una empresa donde tienen PI, pero también tienen webservices .NET, ellos usan RMS. Tengo algunas dudas que me gustaría consultarte, no se si te puedo escribir a algún medio.
Gracias de antemano.

@johnny282 Con respecto al tema que comentas que quieres conectar una base de datos SQL con la Base de datos de SAP en Mi caso tengo la experriencia de haberlo hecho de dos formas distintas una es atraves de como comento el compañero @Salco a atraves de la bajar una libreria de SAP se llama lib_dbsl que se instala en el server aplicativo de SAP y mediante la trx. DBCO estableces una conexion con la DB SQL o con cualquier otra DB de acuerdo al DLL que bajes. Eso no esta dispobible en todos los sistemas operativos donde este instalados el SAP pero esta en la mayoria. Con esta opcion desde programas de abap puedes leer y grabar tablas de SQL.
Otra forma en la que me he conectado tambien muy facil es atraves de bajar el SAP NET Conector es un componente que provee SAP para conectarse desde visual net a SAP ( hay de 32 o 64 Bytes) dependiendo el windows que tengas, aca la conexion se hace desde Visual Net a SAP pero igual puedes leer, grabar o borrar informacion de tablas de SAP asi como ejecutar RFC o Bapis que existen enSAP. Si optas por alguna de estas opciones y tienes dudas yo te podria apoyar con informacion al respecto.

Gracias a todos por sus comentarios!!

Bueno les comento lo que hice:
Establecí la conexión por DBCO:

Luego Probé la misma con el programa ADBC_DEMO y la misma funciono correctamente

Ahora bien intente hacer algo bastante sencillo, hacer un query desde la base de datos de SQLSERVER y llenar una tabla interna. Por favor me corrijen si tengo algún error en la sentencia.

REPORT Z_SQLCONNECT.

TABLES: kna1.

DATA: BEGIN OF ti_cliente OCCURS 0,

  id_persona(12) TYPE c,
  apellido_paterno(50) TYPE c,
  apellido_materno(50) TYPE c,

  END OF ti_cliente.

*Conexion.

  DATA: exc_ref    TYPE REF TO cx_sy_native_sql_error,
        error_text TYPE string,
        c_error TYPE string.
  TRY.
        EXEC SQL.
          CONNECT TO 'SSIS_CORE01_DES2' AS 'V2'
        ENDEXEC.
      EXEC SQL.
        SET CONNECTION 'V2'
      ENDEXEC.
    CATCH cx_sy_native_sql_error INTO exc_ref.
      error_text = exc_ref->get_text( ).
  ENDTRY.

*Query
TRY.
EXEC SQL performing loop_output.

      SELECT comunes.tpersona.id_persona,
             comunes.tpersona.apellido_paterno,
             comunes.tpersona.apellido_materno

        INTO :ti_cliente


        from comunes.tpersona

        where id_persona =: '755191'


      ENDEXEC.




    CATCH cx_sy_native_sql_error INTO exc_ref.
      error_text = exc_ref->get_text( ).
  •      RAISE system_failure.
    

ENDTRY.

FORM loop_output.
WRITE: / ti_cliente-id_persona,ti_cliente-apellido_paterno,ti_cliente-apellido_materno.
ENDFORM.

En este caso no esta haciendo la consulta y esta cayendo directamente en el CATCH.

Me pueden comentar que puedo estar haciendo mal??

Saludos…

Oye @shdezbor no percate de esto que comentas. Como puedo comprobar si esta librería se encuentra instalada???

@johnny282 en mi caso la instalacion de esa libreria la hizo personal de Basis, se que debe estar en el server del aplicativo de sap busca ahi, yo creo que ya la tienes si te hizo la prueba que mencionas y no marco error. En el caso que esta marcando el error debe ser porque estas poniendo en el EXEC SQL la sentencia porforming en abap es directamente perform y no va ahi debe ejecutarse fuera de la sentencia EXEC. Te voy a pasar un ejemplo simple que tengo funcionando en productivo que hace una lectura a una tabla en SQL y muestra los registros en ABAP. espero te ayude.

REPORT ZSHB_PRUEBA no standard page heading line-size 232.

DATA: BEGIN OF it_compras OCCURS 0,
       contrato(12)    type  c,
       proveedor(10)       type n,
       material(10)         type n,
       centro(4)           type c,
       almacen(4)          type c,
       lote(10)            type c,
       cantidad            type f,
       umedida(3)          type c,
       precio              type f,
       moneda(3)           type c,
       diferencial         type f,
       valormercado        type f,
       fecha(10)           type c,
      END OF it_compras.

DATA: BEGIN OF it_ventas OCCURS 0,
       contrato(12)        type  c,
       cliente(10)         type n,
       material(10)        type n,
       centro(4)           type c,
       almacen(4)          type c,
       lote(10)            type c,
       cantidad            type f,
       umedida(3)         type c,
       precio              type f,
       moneda(3)           type c,
*       orgventas(4)        type c,
       canal(2)            type c,
       sector(2)           type c,
       fecha(10)           type c,
       texto(500)              type c,
*       texto(500)      type c,
      END OF it_ventas.
data: begin of it_err occurs 0,
      error(80)   type c,
      end of it_err.

*-> Variables
DATA:
   v_fecha        TYPE sy-datum,
   v_lineas       type i,
   sw_exit        type c,
   line_size      type i value 80,
   no_proc(1)     type c,
   v_sesion       like bdcld-grpn.

selection-screen begin of block B2 with frame title text-002.
parameters:
      p_sel1    radiobutton group Sel1,
      p_sel2    radiobutton group Sel1,

selection-screen end of block B2.

*-> Start-of-selection
START-OF-SELECTION.
     sw_exit = space.
     perform conecta_eximware.
     check sw_exit = space.
     Case 'X'.
       When p_sel1.
            perform Lee_compras.
       When p_sel2.
            perform Lee_ventas.
      endcase.
end-of-selection.
     perform desconecta_conex.

Form Conecta.

 EXEC SQL.
   CONNECT TO 'CONEX'
 ENDEXEC.
 If sy-subrc <> 0.
   write:/ 'error de red'.
   sw_exit = 'X'.
   exit.
 endif.
 EXEC SQL.
   SET CONNECTION 'CONEX'
 ENDEXEC.
 ENDFORM.

Form lee_compras.

data: wa_compras like it_compras.

DATA: C1 TYPE CURSOR.

Refresh: it_compras.

 EXEC SQL.
 OPEN C1 FOR
 SELECT Contrato, Proveedor, Material,
        Centro, Almacen, lote, Cantidad, umedida,
        precio, moneda, diferencial, valormercado, fecha
        FROM compras
 ENDEXEC.
 DO.
 EXEC SQL.
  FETCH NEXT C1 INTO :wa_compras
 ENDEXEC.
 IF SY-SUBRC <> 0.
   exit.
 else.
 MOVE-CORRESPONDING wa_compras TO it_compras.
 APPEND it_compras.
 endif.
 ENDDO.
 EXEC SQL.
  CLOSE C1
 ENDEXEC.

 loop at it_compras.
   write:/ it_compras-contrato, it_compras-proveedor,
           it_compras-material, it_compras-centro,
           it_compras-almacen, it_compras-lote,
           it_compras-cantidad, it_compras-umedida,
           it_compras-precio, it_compras-moneda,
           it_compras-diferencial, it_compras-valormercado,
           it_compras-fecha.
 endloop.
endform.

Form lee_ventas.

data: wa_ventas like it_ventas.


DATA: C1 TYPE CURSOR.

Refresh: it_ventas.

 EXEC SQL.
 OPEN C1 FOR
 SELECT Contrato, cliente, Material,
        Centro, Almacen, lote, Cantidad, umedida,
        precio, moneda, canal, sector,
        fecha, texto
        FROM ventas
 ENDEXEC.
 DO.
 EXEC SQL.
  FETCH NEXT C1 INTO :wa_ventas
 ENDEXEC.
 IF SY-SUBRC <> 0.
   exit.
 else.
 MOVE-CORRESPONDING wa_ventas TO it_ventas.
 APPEND it_ventas.
 endif.
 ENDDO.
 EXEC SQL.
  CLOSE C1
 ENDEXEC.

 loop at it_ventas.
   write:/ it_ventas-contrato, it_ventas-cliente,
           it_ventas-material, it_ventas-centro,
           it_ventas-almacen, it_ventas-lote,
           it_ventas-Cantidad, it_ventas-umedida,
           it_ventas-precio, it_ventas-moneda,
           it_ventas-canal, it_ventas-sector,
           it_ventas-fecha, it_ventas-texto.
 endloop.
endform.


Form desconecta_conex.
 EXEC SQL.
   DISCONNECT 'CONEX'
 ENDEXEC.
Endform.
3 Me gusta

@johnny282 el ejemplo de query hecha por @shdezbor está de lujo, porque lo hace con un cursor, no directamente el select, sino con un “open cursor for” y luego el “fetch”. Nosotros también lo teníamos así.

Por cierto @shdezbor el sap net conector ¿es gratis? y otra pregunta ¿ la conexión es sólo hacía SAP o también desde SAP? Es decir, NET->SAP seguro y ahora de ¿SAP->NET?

@shdezbor!!!

Te agradezco muchísimo, con este ejemplo me queda super claro el manejo del Native SQL. Esto me va ha servir muchísimo.

A+++++++++

Saludos…

1 me gusta

@Salco el SAP Net conector es gratis lo bajas de sap y ahi bajas tambien ejemplos de ayuda esta para 32 o 64 bytes, pero es es desde visual net a SAP, no al reves y desde visual tienes que leer y grabar la informacion en SAP, se que tambien tienen contector para java por si te interesa pero en mi caso solo manejo visual net.

1 me gusta

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.