viernes, 9 de noviembre de 2012

Crear, Visualizar y Borrar anexos con CL_GOS_DOCUMENT_SERVICE

Seguimos con los anexos. Esta vez vamos a hablar de la clase CL_GOS_DOCUMENT_SERVICE.

En la transacción SE24 podemos visualizar sus métodos y atributos:

CL_GOS_DOCUMENT_SERVICE

Esta clase tiene muchos métodos para crear, modificar, borrar y visualizar documentos anexos a un objeto de negocio.

Para los ejemplos con esta clase, seguiremos utilizando el anexo de archivos a documentos contables en SAP pero recordemos que es posible anexar archivos a un gran numero de objetos de negocio en SAP ( materiales, facuras, pedidos de compra, etc... ).


CREAR ANEXO

Seleccionado el documento contable, se abre una ventana del explorador de archivos, seleccionamos el archivo a anexar, y en la FB03 comprobamos que se ha anexado correctamente

Crear Anexo

VISUALIZAR  ANEXOS

Primero recuperamos los anexos del documento contable en la tabla SRGBTBREL, pero aquí solo esta el enlace interno al anexo, para recuperar el  nombre del anexo utilizar  la bapi SO_OBJECT_GET_CONTENT

Visualizar Anexo

BORRAR ANEXOS

Primero recuperamos los anexos del documento contable en la tabla SRGBTBREL, pero aquí solo esta el enlace interno al anexo, para recuperar el  nombre del anexo utilizar  la bapi SO_OBJECT_GET_CONTENT selecionamos el anexo y comprobamos que se ha borrado en al FB03

Borra Anexo

CODIGO ABAP

Y llegamos  lo importante, aqui esta el codigo ABAP que permite crear, visualizar y borrar anexos.

Teneis también el código ABAP disponible en el repositorio github del blog



REPORT ZZ_PRUEBA_ANEXOS_GOS.

*&---------------------------------------------------------------------*
*& TYPE-POOLS
*&---------------------------------------------------------------------*
TYPE-POOLS: slis. 
*&---------------------------------------------------------------------*
*& Tablas
*&---------------------------------------------------------------------*
TABLES: BSEG.

*&---------------------------------------------------------------------*
*& Variables Glovales
*&---------------------------------------------------------------------*
DATA: obj_gos        TYPE REF TO cl_gos_document_service.
DATA: wa_borident TYPE                borident.
DATA: wa_objkey   TYPE                borident-objkey.

*&---------------------------------------------------------------------*
*& Parámetros de Selección
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLOCK01 WITH FRAME TITLE TEXT-S01.
PARAMETERS: P_BUKRS TYPE BUKRS OBLIGATORY,
                           P_BELNR TYPE BELNR_D OBLIGATORY,
                           P_GJAHR TYPE GJAHR OBLIGATORY.
SELECTION-SCREEN END OF BLOCK BLOCK01.

SELECTION-SCREEN BEGIN OF BLOCK BLOCK02 WITH FRAME TITLE TEXT-S01.
PARAMETERS: P_crear  type c RADIOBUTTON GROUP GR1,
                           P_visua  type c RADIOBUTTON GROUP GR1,
                           P_borra type c RADIOBUTTON GROUP GR1.
SELECTION-SCREEN END OF BLOCK BLOCK02.

*&---------------------------------------------------------------------*
*& Validaciones de Pantalla
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.

*&---------------------------------------------------------------------*
*& INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.

*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

SELECT SINGLE *
      FROM BSEG
      WHERE BUKRS EQ P_BUKRS
           AND BELNR EQ P_BELNR
           AND GJAHR EQ P_GJAHR.

IF ( SY-SUBRC <> 0 ).
     MESSAGE 'No existe el documento' TYPE 'S' DISPLAY LIKE 'E'. 
ELSE.

CREATE OBJECT obj_gos.

CONCATENATE P_BUKRS P_BELNR P_GJAHR INTO wa_borident-objkey.
wa_borident-objtype = 'BKPF'.

IF P_crear IS NOT INITIAL.

CALL METHOD obj_gos->create_attachment
     EXPORTING        
        is_object = wa_borident
     IMPORTING
        ep_attachment = wa_borident-objkey.

COMMIT WORK.

ELSEIF p_visua IS NOT INITIAL.

    PERFORM SELECT_ATTA USING  wa_borident CHANGING  wa_objkey.


    IF  ( wa_objkey IS NOT INITIAL ).
       CALL METHOD obj_gos->display_attachment
               EXPORTING
                    ip_attachment = wa_objkey.
    ENDIF.

  ELSEIF P_Borra IS NOT INITIAL.

    PERFORM SELECT_ATTA USING wa_borident CHANGING wa_objkey.

    IF  ( wa_objkey IS NOT INITIAL ).
        CALL METHOD obj_gos->delete_attachment
               EXPORTING
                   ip_attachment = wa_objkey.

        COMMIT WORK. 
   ENDIF.

  ENDIF.

ENDIF. 

*&---------------------------------------------------------------------*
*& Form SELECT_ATTA
*&---------------------------------------------------------------------*
* Muestra un Popu para que el cliente seleccione el adjunto
*----------------------------------------------------------------------*
FORM  SELECT_ATTA USING    pi_borident TYPE borident
                  CHANGING po_objkey   TYPE borident-objkey.

    TYPES: BEGIN OF type_anexos,
      box(1)   TYPE C,
      instid_b TYPE srgbtbrel-instid_b,
      name(15) TYPE C,
    END OF type_anexos.

    DATA: tl_anexos TYPE STANDARD TABLE OF type_anexos, 
          tl_head TYPE STANDARD TABLE OF SOLI,
          tl_cond TYPE STANDARD TABLE OF SOLI,
          i_fieldcat TYPE  SLIS_T_FIELDCAT_ALV,
          l_program  TYPE sY-REPID.

    DATA: Wl_SOODK TYPE SOODK,
          w_fieldcat TYPE slis_fieldcat_alv.

    FIELD-SYMBOLS: <fanexos> TYPE type_anexos,
                   <fsoli>   TYPE SOLI.

    CLEAR: po_objkey.
    REFRESH: TL_anexos.

    SELECT instid_b INTO CORRESPONDING FIELDS OF TABLE TL_anexos
          FROM srgbtbrel
            where   instid_a = pi_borident-objkey
              and   typeid_a = pi_borident-objtype
              and   reltype  = 'ATTA'.

    LOOP AT TL_anexos ASSIGNING <fanexos>.

        CLEAR Wl_SOODK.

        Wl_SOODK-OBJTP = <fanexos>-instid_b+17(3).
        Wl_SOODK-OBJYR = <fanexos>-instid_b+20(2).
        Wl_SOODK-OBJNO = <fanexos>-instid_b+22.

        CALL FUNCTION 'SO_OBJECT_GET_CONTENT'
          EXPORTING
            object_id              = Wl_SOODK
          tables
            OBJHEAD                = tl_head
            objcont                = tl_cond
          EXCEPTIONS
           ARCHIVE_ERROR          = 1
           OBJECT_NOT_EXIST       = 2
           OTHERS                 = 3
                  .
        IF sy-subrc EQ 0.

          READ TABLE tl_head INDEX 1 ASSIGNING <FSOLI>.
          IF ( SY-SUBRC EQ 0 ).
            <fanexos>-NAME = <FSOLI>-LINE+13.
          ENDIF.

        ENDIF.

    ENDLOOP.

    l_program = sy-repid.

    w_fieldcat-fieldname = 'NAME'.
    w_fieldcat-tabname   = 'TL_ANEXOS'.
    w_fieldcat-seltext_m = 'Anexo'.
    APPEND w_fieldcat TO i_fieldcat.

    call function 'REUSE_ALV_POPUP_TO_SELECT'
      exporting
        i_title     = TEXT-T01
        i_tabname   = 'TL_ANEXOS'
        i_selection = 'X'
        i_zebra = 'X'
        i_checkbox_fieldname = 'BOX'
        it_fieldcat          = i_fieldcat
        i_callback_program   = l_program
      tables
        t_outtab = TL_ANEXOS
      exceptions
        program_error = 1
        others = 2.

    IF ( Sy-SUBRC EQ 0 ).
      READ TABLE TL_ANEXOS WITH KEY BOX = 'X' ASSIGNING <fanexos>.
      IF ( SY-SUBRC EQ 0 ).
        po_objkey = <fanexos>-instid_b.
      ENDIF.
    ENDIF.

endform.                    " SELECT_ATTA 


Entradas Siguientes:
Carga masiva de anexos en SAP

Entradas Anteriores:

19 comentarios:

  1. Hey muchas gracias David, varios dias retrasado, y este código me fue de mucha utilidad

    ResponderEliminar
  2. Gran programa y mejor persona! De gran utilidad crack.

    ResponderEliminar
  3. No elimina y no tengo idea de porque

    ResponderEliminar
  4. ya vi porque faltaba esta exportacion is_object = wa_borident

    ResponderEliminar
    Respuestas
    1. También corregido en el post, disculpa cuando pego el código, aunque lo reviso, el editor "corrige" su formato.

      Eliminar
  5. Muchas gracias, me sirvió mucho

    ResponderEliminar
  6. Muchas gracias, sabras alguna forma de ver en el sistema quien o que borro los anexos de los documentos FI y MM.

    ResponderEliminar
  7. Buenas tardes , usted tiene algunos ejemplos de cómo funciona en BSP

    ResponderEliminar
  8. Hola David muchas gracias por compartir tu conocimiento. Llegué aquí gracias a que este tema de adjuntar archivos se hace mediante GOS. He copilado tu código y si me sube y visualiza el documento adjuntado, pero al ir a la FB03 y consultar por el mismo número de documento no me aparece en la lista de archivos adjuntos. ¿Que me podría estar faltando?

    ResponderEliminar
  9. Hola de nuevo ya logré identificar el error y hacer que me muestre en la FB03, era porque en en la FB03 apunta a la dirección ....muchas gracias por el aporte. A diferencia de tu programa el cual elige un archivo existente yo tengo que generar un documento .XML y guardarlo en la FB03

    ResponderEliminar
  10. Hola David Rueda, en mi caso estoy adjutando un XML. Todo bien con la creación del archivo en la FB03 pero al momento de descargar el archivo y visualizarlo trae caracteres como es el NULL. ¿Cómo puedo solucionar este problema ya que se trata de data binaria? He estado probando con el REPLACE pero no funciona. Encontré este link https://blogs.sap.com/2013/08/26/to-remove-spacesnulls-from-binary-data-of-an-internal-tablevariable-using-abap/comment-page-1/#comment-396366 el cual trata el problema pero no me funcionó. Espero que me puedas responder. Gracias.

    ResponderEliminar
    Respuestas
    1. Prueba la instruccion TRANSLATE Y REPLACE
      Mira el codigo de la bapi SF_SPECIALCHAR_DELETE

      Eliminar
  11. Hola, estoy intentando hacer un script en el cual ademas de crear una solicitud de pago (transaccion YSOLPA04), en esa solicitud de pago hay q crear un anexo. El pro lema que tengo es que potr estar grabando el script se desactiva el explorador al crear el anexo. Aunque si me da opcion a escribir la ruta y el nombre del fichero, siempre tengo un error de archivo no encontrado. Por favor, me podeis ayudar?. Gracias.

    ResponderEliminar
  12. Tengo la transacción FB03 para consultar documentos financieros (para este caso son obligaciones CXP), estos documentos tienen archivos PDF asociados los cuales se pueden ver por lista de anexo (GOS), la situación es que siendo la FB03 una transacción de consulta permite adicionar, modificar o borrar documentos anexo a la obligación y la idea es que solo los pueda visualizar ¿ como puedo hacer para que en esta transacción los botones de crear, modificar y borrar lista de anexo queden inactivos?

    Estuve probando con la creación de un rol solo con la transacción FB03 y un usuario que solo tiene este rol, trate de restringir la operación por el objeto S_GOS_ATT (que tiene como actividades modificar y borrar) pero no controla nada. También leí que el servicio GOS tiene relación con permisos de SAPOFFICE, incluso la nota 1293080 mencionan que tiene relación con este control pero no encontré nada

    Si alguien ha trabajo el tema, le agradezco la colaboración

    ResponderEliminar
  13. Buenas, al tratar de crear el anexo, selecciono el documento (pdf) pero me sale una ventana tipo de seguridad, preguntandome sí deseo o no permitir el acceso, al darle en permitir me dice que no puede crear el anexo ¿Cómo se podría solucionar?

    ResponderEliminar
    Respuestas
    1. El popup se cambia en la configuración del SAPGUI.
      En la ventana del SAPGUI, pulsa en la esquina superior izquierda -> Opciones
      Vas al menú SEGURIDAD -> Abrir configuración de seguridad -> Cambias de preguntar a permitir.

      La segunda parte, el error al crear el anexo, tendrás que analizar el error que te de.

      Un saludo

      Eliminar
  14. Hola David !! Muchas Gracias !!!
    Necesito adjuntar como anexo una imagen (fotografía que se toma en campo) a una Orden de Lectura de ISU, y después poder visualizarla desde la misma.
    Hay forma de adjuntar a ese objeto ? (Orden de Lectura Periodica)
    Muchas Gracias

    ResponderEliminar
  15. Hola! hay algun reporte que pueda ejecutar para ver los anexos por documento? creo que no, pero por si conoces alguno... ando buscandolo...

    muchas gracias!

    ResponderEliminar
  16. Muchas gracias David, tengo que realizar la carga de adjuntos a los documentos en un report, el método CREATE_ATTACHMENT y CREATE, ejecutan el popup, ¿ Sabes como ejecutarlo de manera que solo incluya la ruta del fichero que quiero adjuntar? Muchas gracias de nuevo.

    ResponderEliminar