Anuncio

Colapsar
No hay anuncio todavía.

Job que no puede ejecutar función

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Job que no puede ejecutar función

    Que tal a todos:
    Tengo el siguiente problema y no se si a alguien le haya pasado que pueda orientarme.
    Estoy buscando la manera de enviar información de sap a un tabla en una base de datos en SQL Server.
    Encontre un codigo con el cual se puede realizar a travez de un objeto ole2_object. modifique el codigo de acuerdo a mis necesidades y funciono de manera adecuada, pero cuando pongo a trabajar el programa z en un job no abre la conexion. (esto lo descubri despues de muchas pruebas).
    Lo que se me hace curioso es que si le hago un debug al job si funciona, ya cheque la transacción SU53 para verificar que no fuera algun permiso y no me arroja nada.
    Alguien tiene alguna otra idea de como poder resolver este problema.


    Codigo de la función para abrir la conexion al servidor SQL.

    *******************CODIGO*************************
    REPORT zsdr015a.

    INCLUDE ole2incl.

    CONSTANTS: provider(40) VALUE 'Provider=SQLOLEDB.1',
    security(160) VALUE 'Password=<<password>>;Persist Security Info=True;User ID=<<usuario>>',
    datasource(60) VALUE 'Initial Catalog=<<BDD>>;Data Source=<<Server>>'.

    DATA: o_conn TYPE ole2_object,
    o_recordset TYPE ole2_object,
    o_field TYPE ole2_object.

    DATA: con_str(400) ,sql_str(400).

    DATA: BEGIN OF ty_etcfds OCCURS 0,
    mandt TYPE c LENGTH 3,
    centro TYPE c LENGTH 4,
    documento TYPE c LENGTH 10,
    fecha_pago TYPE c LENGTH 25,
    END OF ty_etcfds.

    DATA: BEGIN OF ty_itcfds OCCURS 0,
    mandt TYPE vbrk-mandt,
    bukrs TYPE vbrk-bukrs,
    vbeln TYPE vbrk-vbeln,
    augdt TYPE bsad-augdt,
    erzet TYPE vbrk-erzet,
    END OF ty_itcfds.


    DATA: etab_cfd LIKE TABLE OF ty_etcfds WITH HEADER LINE.
    DATA: itab_cfd LIKE TABLE OF ty_itcfds WITH HEADER LINE.

    START-OF-SELECTION.

    CALL FUNCTION 'AUTHORITY_CHECK_OLE'
    EXPORTING
    PROGRAM = SY-REPID
    ACTIVITY = 'CALL'
    APPLICATION = '***'
    EXCEPTIONS
    NO_AUTHORITY = 1
    ACTIVITY_UNKNOWN = 2.

    IF SY-SUBRC EQ 0.

    PERFORM oledb_open.

    IF O_CONN-HANDLE GE 0.
    * Aqui continuaria con lo que tiene que hacer el programa
    ELSE.
    WAIT UP TO 2 SECONDS. "Pausa para determinar que se detuvo por no abrir la conexion
    MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
    WITH SY-REPID O_CONN-HANDLE.
    ENDIF.
    ELSE.
    WAIT UP TO 3 SECONDS. "Pausa para determinar que se detuvo por falta de permisos
    MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
    WITH SY-REPID.
    ENDIF

    *&---------------------------------------------------------------------*
    *& Form oledb_open
    *&---------------------------------------------------------------------*
    FORM oledb_open.
    CONCATENATE provider ';' security ';' datasource INTO con_str.
    CREATE OBJECT o_conn 'ADODB.Connection'.
    SET PROPERTY OF o_conn 'Provider' = provider.
    SET PROPERTY OF o_conn 'ConnectionString' = con_str.

    CALL METHOD OF o_conn 'Open'.
    COMMIT WORK.

    IF SY-SUBRC NE 0.
    WRITE SY-MSGLI.
    ENDIF.
    * Verifica si hay errores de conexión

    GET PROPERTY OF o_conn 'ERRORS' = o_field.

    IF SY-SUBRC NE 0.
    WAIT UP TO 4 SECONDS. "Pausa para determinar que ocurrio un error en la conexion.
    MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
    WITH o_field-HANDLE.
    ENDIF.

    ENDFORM. "OLEDB_open
    __________________
    Saludos
    Atte
    Rams

  • #2
    Hola,

    si me equivoco que alguien me corrija.

    El problema es que ese tipo de conexiòn las realiza la máquina local, por lo tanto en background no te funcionarán, lo que puedes hacer es armar una conexión con la BD MSSQL y utilizar las sentencias EXEC para realizar los insert correspondientes en dicha base.

    Comentame si lo has podido solucionar de esta manera.

    Comentario


    • #3
      Originalmente publicado por Irman Ver Mensaje
      Hola,

      si me equivoco que alguien me corrija.

      El problema es que ese tipo de conexiòn las realiza la máquina local, por lo tanto en background no te funcionarán, lo que puedes hacer es armar una conexión con la BD MSSQL y utilizar las sentencias EXEC para realizar los insert correspondientes en dicha base.

      Comentame si lo has podido solucionar de esta manera.
      Si parece ser que ese es el problema, ahorita estoy probando creando la conexion como mencionas en la ST04 y parece que si funciona, estoy buscando como adaptar la función como la tenia ahora con sentencias EXEC en cuanto lo tenga completo informo si funciona como espero.

      Conoces alguna manera de cerrar la conexion una vez que la utilizar y no volverla a abrir hasta que la vuelvas a requerir???
      intente con

      EXEC SQL.
      DISCONNECT 'idConexion'
      ENDEXEC.

      Pero no me guarda los insert realizados...

      Comentario


      • #4
        Solución.

        Originalmente publicado por Irman Ver Mensaje
        Hola,

        si me equivoco que alguien me corrija.

        El problema es que ese tipo de conexiòn las realiza la máquina local, por lo tanto en background no te funcionarán, lo que puedes hacer es armar una conexión con la BD MSSQL y utilizar las sentencias EXEC para realizar los insert correspondientes en dicha base.

        Comentame si lo has podido solucionar de esta manera.
        Que tal Irman. anexo la manera en que corregi el reporte.

        Cree una conexion al servidor SQL en la t-ST04.
        y es la que utilizo en el programa.
        ya lo prove con los jobs y funciona perfectamente.

        Acontinuación parte del codigo.

        *&---------------------------------------------------------------------*
        *& Report ZSDR015B
        *&
        *&---------------------------------------------------------------------*
        *&
        *&
        *&---------------------------------------------------------------------*

        REPORT zsdr015b.

        "Parte de estructura de tabla de sql
        DATA: BEGIN OF ty_etcfds OCCURS 0,
        mandt TYPE c LENGTH 3,
        centro TYPE c LENGTH 4,
        documento TYPE c LENGTH 10,
        fecha_pago TYPE c LENGTH 25,
        visualizar TYPE c LENGTH 1,
        END OF ty_etcfds.

        "Estructura de la tabla interna
        DATA: BEGIN OF ty_itcfds OCCURS 0,
        mandt TYPE vbrk-mandt,
        bukrs TYPE vbrk-bukrs,
        vbeln TYPE vbrk-vbeln,
        augdt TYPE bsad-augdt,
        erzet TYPE vbrk-erzet,
        END OF ty_itcfds.

        "Tabla donde se almacenan las la info desde SQL
        DATA: etab_cfd LIKE TABLE OF ty_etcfds WITH HEADER LINE.

        "Tabla interna que obtiene la información que requerimos.
        DATA: itab_cfd LIKE TABLE OF ty_itcfds WITH HEADER LINE.

        "Inicio de la selección de registros.

        START-OF-SELECTION.

        * SELECCIONAMOS LA INFORMACION NECESARIA DE LAS TABLAS INTERNAS SI ES NECESARIO.

        "Verificamos que haya información en la tabla interna
        CHECK NOT itab_cfd[] IS INITIAL.

        "Iniciamos la conexion con SQL
        PERFORM conectar_sql.

        "Seleccionamos los pagos ya registrados
        PERFORM selecciona_sql.

        *AQUI SE REALIZA TODO LO QUE TENGA QUE HACER EL PROGRAMA

        "Cierra la conexion.
        PERFORM desconectar_sql.

        *&---------------------------------------------------------------------*
        *& Form conectar_sql
        *&---------------------------------------------------------------------*
        * text
        *----------------------------------------------------------------------*
        FORM conectar_sql.
        " Prepara la conexion a SQL a la base de datos CFDs
        EXEC SQL.
        CONNECT TO 'SQLCFDS' AS 'CFDs'
        ENDEXEC.

        "Establece la conexion como la que se va a utilizar.
        EXEC SQL.
        SET CONNECTION 'CFDs'
        ENDEXEC.
        ENDFORM. "conectar_sql

        *&---------------------------------------------------------------------*
        *& Form desconectar_SQL
        *&---------------------------------------------------------------------*
        * text
        *----------------------------------------------------------------------*
        FORM desconectar_sql.

        "Establece la conexion DEFAULT para dejar de utilizar la CFDs
        EXEC SQL.
        SET CONNECTION DEFAULT
        ENDEXEC.

        ENDFORM. "desconectar_SQL

        *&---------------------------------------------------------------------*
        *& Form inserta_sql
        *&---------------------------------------------------------------------*
        * text
        *----------------------------------------------------------------------*
        FORM inserta_cfd_sql USING
        value(zmandt) TYPE c
        value(zcentro) TYPE c
        value(zdocumento) TYPE c
        value(zfecha_pago) TYPE c
        value(zvisible) TYPE c.

        "Inserta lo que recibio en los parametros.
        EXEC SQL.
        INSERT INTO CFDPAGADO_SQL
        VALUES(:zmandt,:zcentro,:zdocumento,:zfecha_pago,g etdate(),:zvisible)
        ENDEXEC.

        ENDFORM. "sql_insert

        *&---------------------------------------------------------------------*
        *& Form selecciona_sql
        *&---------------------------------------------------------------------*
        * text
        *----------------------------------------------------------------------*
        FORM selecciona_sql.
        "Selecciona los registros almacenados en SQL
        EXEC SQL PERFORMING actualiza_etab_cfd.
        select mandt, centro, documento, fecha_pago, visualizar
        into :etab_cfd
        from cfdpagado_sql
        ENDEXEC.
        ENDFORM. "selecciona_sql

        *&---------------------------------------------------------------------*
        *& Form actualiza_etab_cfd
        *&---------------------------------------------------------------------*
        * text
        *----------------------------------------------------------------------*
        FORM actualiza_etab_cfd.
        APPEND etab_cfd.
        ENDFORM. "actualiza_etab_cfd

        *&---------------------------------------------------------------------*
        *& Form actualiza_cfd_sql
        *&---------------------------------------------------------------------*
        * text
        *----------------------------------------------------------------------*
        * -->VALUE(ZMANDT) text
        * -->VALUE(ZCENTRO) text
        * -->VALUE(ZDOCUMENTO) text
        * -->VALUE(ZVISIBLE) text
        *----------------------------------------------------------------------*
        FORM actualiza_cfd_sql USING
        value(zmandt) TYPE c
        value(zcentro) TYPE c
        value(zdocumento) TYPE c
        value(zvisible) TYPE c.

        "Actualiza la tabla SQL para quitarle lo visible al pago registrado
        EXEC SQL.
        update cfdpagado_sql
        set visible= :zvisible,
        set fecha_registro = getdate()
        where documento = :zdocumento and
        mandt = :zmandt and
        centro = :zcentro
        ENDEXEC.

        ENDFORM. "sql_update

        Comentario


        • #5
          Excelente! seguro que a muchos les va a servir tu solución.

          Comentario


          • #6
            Captura de mensajes devueltos por la base

            Irman, Rams.

            Les quería consultar como pueden capturar los mensajes que les pueda dar la base de datos externa a donde están escribiendo. Les cuento, soy dba de DB2 (algo de SAP a nivel de administración se, pero nada de programación) y los abapers me dicen que no confian en salir de SAP para poder escribir en baeses externas porque tienen un caso que mandan a insertar por ejemplo 100 registros a una base DB2, pero en la base sólo se graban menos registros y ellos no tienen ningún mensaje para verificar si lo que mandaron es lo mismo que fue escrito. Puede suceder esto? a mi me parece muy raro, pero como no se no puedo decir nada.
            Estuve viendo los programas este hilo y no veo que hagan un control de lo que insertaron ya que supongo que lo que graban es lo que queda realmente en la base. Si tienen algún ejemplo para que les pueda mostrar o en algún manual o nota me lo podrían pasar.

            Muchas gracias.

            Comentario


            • #7
              Originalmente publicado por db2sap Ver Mensaje
              Irman, Rams.

              Les quería consultar como pueden capturar los mensajes que les pueda dar la base de datos externa a donde están escribiendo. Les cuento, soy dba de DB2 (algo de SAP a nivel de administración se, pero nada de programación) y los abapers me dicen que no confian en salir de SAP para poder escribir en baeses externas porque tienen un caso que mandan a insertar por ejemplo 100 registros a una base DB2, pero en la base sólo se graban menos registros y ellos no tienen ningún mensaje para verificar si lo que mandaron es lo mismo que fue escrito. Puede suceder esto? a mi me parece muy raro, pero como no se no puedo decir nada.
              Estuve viendo los programas este hilo y no veo que hagan un control de lo que insertaron ya que supongo que lo que graban es lo que queda realmente en la base. Si tienen algún ejemplo para que les pueda mostrar o en algún manual o nota me lo podrían pasar.

              Muchas gracias.
              Si hay una exepción que se dispara si tu registro viola la integridad de la llave en tu tabla...
              a demas al igual como insertas puedes consultas para evitar duplicidad...
              Lo que si es que lleva un poco mas de trabajo y sap no recomienda que lo realices de esta manera, te pide que utilices sus herramientas de intercambio de datos entre sistemas SAP y no SAP...
              la otra es que muy pocos abapers se meten con este tipo de programación dadas las dificultades que se presentan... pero si llevas un buen control de lo que quieres hacer y todas las validaciones que tienes que tener en cuenta puedes realizarlo...

              Comentario


              • #8
                Job que no puede ejecutar función

                Rams.

                Muchas gracias por la respuesta. ¿Tenes o sabes donde puedo conseguir algún ejemplo de esto?

                Muchas Gracias.
                Hernán

                Comentario

                Trabajando...
                X