cancel
Showing results for 
Search instead for 
Did you mean: 

Attachments to Notifications - using "Services for Object"

Former Member
0 Kudos

Hi All,

I have sucessfully created a VC application (7.0 sp13) to create a General Notification in R/3

using the BAPI - IQS4_CREATE_NOTIFICATION

Our users in R/3 4.7 use the button in the Top Left Hand corner of the Screen "Services for Object"

to attach MS Word documents to Notifcations. Using the Create Attachment option from the Services for Object toolbar that pops up when the button is clicked.

Has anyone else tried this or have any advice on how this can be done in VC - if you can recommend a BAPI that I can try or will this be a custom ABAP BAPI.

Thanks in advance for any advice you can offer.

- Robert

Accepted Solutions (0)

Answers (2)

Answers (2)

Former Member
0 Kudos
 

FUNCTION z_pm_attachment_and_url.
*"----------------------------------------------------------------------
*"*"Interface local:
*"  IMPORTING
*"     VALUE(I_QMNUM) TYPE  QMNUM OPTIONAL
*"     VALUE(I_AUFNR) TYPE  AUFNR OPTIONAL
*"     VALUE(I_URL) TYPE  SO_URL OPTIONAL
*"     VALUE(I_FILE) TYPE  ZPMCT002 OPTIONAL
*"     VALUE(I_FILENAME) TYPE  STRING OPTIONAL
*"  TABLES
*"      T_RETURN STRUCTURE  BAPIRET2
*"----------------------------------------------------------------------

* Objetos locais
  DATA:
    vl_url         TYPE so_url,
    vl_path        TYPE string,                             "#EC NEEDED
    vl_loopc       TYPE sy-loopc,
    vl_lines       TYPE sy-loopc,
    vl_filename    TYPE string,
    vl_filelength  TYPE i,
    it_url         TYPE STANDARD TABLE OF sood-objdes,
    it_obj_cont    TYPE STANDARD TABLE OF solix,
    wa_obj         TYPE borident,
    wa_obj_cont    TYPE soli,
    wa_obj_data    TYPE sood1,
    wa_folder_id   TYPE soodk,
    wa_document_id TYPE sofmk.

  DEFINE valida_retorno.
    loop at t_return into t_return.
      if t_return-type eq zgtpm_e.
        exit.
      endif.
    endloop.
    if t_return-type eq zgtpm_e.
      exit.
    endif.
  END-OF-DEFINITION.

* === Valida parâmetros de entrada
  IF i_qmnum IS INITIAL AND i_aufnr IS INITIAL.
*   Nenhum objeto informado: Informe Nota ou Ordem de Manutenção
    PERFORM mensagem_retorno_tab
    USING
      'ZPM_PORTAL' zgtpm_e '055' '' '' '' ''
    CHANGING
      t_return[].
    EXIT.
  ELSEIF NOT i_qmnum IS INITIAL AND NOT i_aufnr IS INITIAL.
*   Informe apenas um objeto: Nota ou Ordem de Manutenção
    PERFORM mensagem_retorno_tab
    USING
      'ZPM_PORTAL' zgtpm_e '054' '' '' '' ''
    CHANGING
      t_return[].
    EXIT.
  ENDIF.

  IF  i_url IS INITIAL
  AND i_filename IS INITIAL.
*   Informe Anexo e/ou URL
    PERFORM mensagem_retorno_tab
    USING
      'ZPM_PORTAL' zgtpm_e '060' '' '' '' ''
    CHANGING
      t_return[].
    EXIT.
  ENDIF.

* === Define Categoria de objeto
  IF NOT i_qmnum IS INITIAL.
    wa_obj-objkey  = i_qmnum.
    wa_obj-objtype = 'BUS2038'. " Nota PM
  ENDIF.

  IF NOT i_aufnr IS INITIAL.
    wa_obj-objkey  = i_aufnr.
    wa_obj-objtype = 'BUS2007'. " Ordem de manutenção
  ENDIF.

* === Anexo
  IF NOT i_filename IS INITIAL.

*   Conteúdo do arquivo
    IF NOT i_file[] IS INITIAL.

      it_obj_cont[] = i_file[].

      DESCRIBE TABLE it_obj_cont LINES vl_lines.
      READ TABLE it_obj_cont INTO wa_obj_cont INDEX vl_lines.
      vl_filelength =
        ( 255 * ( vl_lines - 1 ) ) + STRLEN( wa_obj_cont ).

    ELSE.

      CALL FUNCTION 'GUI_UPLOAD'
           EXPORTING
                filename                = i_filename
                filetype                = 'BIN'
           IMPORTING
                filelength              = vl_filelength
           TABLES
                data_tab                = it_obj_cont
           EXCEPTIONS
                file_open_error         = 1
                file_read_error         = 2
                no_batch                = 3
                gui_refuse_filetransfer = 4
                invalid_type            = 5
                no_authority            = 6
                unknown_error           = 7
                bad_data_format         = 8
                header_not_allowed      = 9
                separator_not_allowed   = 10
                header_too_long         = 11
                unknown_dp_error        = 12
                access_denied           = 13
                dp_out_of_memory        = 14
                disk_full               = 15
                dp_timeout              = 16
                OTHERS                  = 17.

      IF sy-subrc <> 0.
        PERFORM mensagem_retorno_tab
        USING
         sy-msgid sy-msgty sy-msgno sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
        CHANGING
          t_return[].
        EXIT.
      ENDIF.

    ENDIF.

*   Pasta de Destino
    PERFORM get_folder CHANGING wa_folder_id t_return[].
    valida_retorno.

*   SAPoffice: definição do objeto, modificar atributos
    wa_obj_data-objla  = sy-langu.      " Idioma
    wa_obj_data-objsns = 'O'.           " Objeto confidencial
    wa_obj_data-objlen = vl_filelength. " Tamanho conteúdo documento
    wa_obj_data-ownnam = sy-uname.      " Nome proprietário

    CALL METHOD cl_report_viewer=>split_path_filename
    EXPORTING
      i_filename = i_filename
    IMPORTING
      e_path     = vl_path
      e_filename = vl_filename.

    SPLIT vl_filename AT '.' INTO
      wa_obj_data-objdes    " Descrição breve do conteúdo
      wa_obj_data-file_ext. " Extensão de file de uma aplicação PC
    CONDENSE wa_obj_data-file_ext NO-GAPS.

*   Insere Objeto (Anexo)
    PERFORM object_insert
    USING
      'EXT' " Anexo
      wa_obj_data
      wa_folder_id
      it_obj_cont
    CHANGING
      wa_document_id
      t_return[].
    valida_retorno.

*   Relacionamento Objeto PM x Anexo
    PERFORM relation_create
    USING
      'ATTA'
      wa_obj
      wa_document_id
    CHANGING
      t_return[].
    valida_retorno.

  ENDIF.

* === URL
  IF NOT i_url IS INITIAL.

*   Inicializa estruturas comuns a Anexo e URL
    CLEAR:
      it_obj_cont,
      wa_obj_cont,
      wa_obj_data,
      wa_folder_id,
      wa_document_id.

*   Conteúdo da URL
    MOVE i_url TO vl_url.

    WHILE NOT vl_url IS INITIAL.
      CONCATENATE '&KEY&' vl_url(250) INTO wa_obj_cont.
      APPEND wa_obj_cont TO it_obj_cont.
      SHIFT vl_url LEFT BY 250 PLACES.
    ENDWHILE.

*   Pasta de Destino
    PERFORM get_folder CHANGING wa_folder_id t_return[].
    valida_retorno.

*   SAPoffice: definição do objeto, modificar atributos
    wa_obj_data-objla  = sy-langu. " Idioma
    wa_obj_data-objsns = 'O'.      " Objeto confidencial
    wa_obj_data-ownnam = sy-uname. " Nome proprietário

    SPLIT i_url AT '/' INTO TABLE it_url.
    DESCRIBE TABLE it_url LINES vl_loopc.
    READ TABLE it_url INDEX vl_loopc
    INTO wa_obj_data-objdes. " Descrição breve do conteúdo

*   Insere Objeto (URL)
    PERFORM object_insert
    USING
      'URL'  " Link Inter/Intranet
      wa_obj_data
      wa_folder_id
      it_obj_cont
    CHANGING
      wa_document_id
      t_return[].
    valida_retorno.

*   Relacionamento Objeto PM x URL
    PERFORM relation_create
    USING
      'URL'
      wa_obj
      wa_document_id
    CHANGING
      t_return[].
    valida_retorno.

  ENDIF.

* === Libera objetos locais
  FREE:
    vl_url,
    vl_path,
    vl_loopc,
    vl_lines,
    vl_filename,
    vl_filelength,
    it_url,
    it_obj_cont,
    wa_obj,
    wa_obj_cont,
    wa_obj_data,
    wa_folder_id,
    wa_document_id.

ENDFUNCTION.

*----------------------------------------------------------------------*
***INCLUDE LZGPM0010F01 .
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  mensagem_retorno_tab
*&---------------------------------------------------------------------*
  FORM mensagem_retorno_tab
  USING
    p_msgid TYPE symsgid
    p_msgty TYPE symsgty
    p_msgno TYPE symsgno
    p_msgv1 TYPE any
    p_msgv2 TYPE any
    p_msgv3 TYPE any
    p_msgv4 TYPE any
  CHANGING
    t_return TYPE ty_return.

    DATA:
      vl_msgty  TYPE symsgty,
      wa_return LIKE LINE OF t_return.

    IF p_msgty IS INITIAL.
      MOVE zgtpm_e TO vl_msgty.
    ELSE.
      MOVE p_msgty TO vl_msgty.
    ENDIF.

    IF p_msgno IS INITIAL.
      EXIT.
    ENDIF.

    MOVE p_msgid  TO wa_return-id.
    MOVE vl_msgty TO wa_return-type.
    MOVE p_msgno  TO wa_return-number.
    MOVE p_msgv1  TO wa_return-message_v1.
    MOVE p_msgv2  TO wa_return-message_v2.
    MOVE p_msgv3  TO wa_return-message_v3.
    MOVE p_msgv4  TO wa_return-message_v4.

    MESSAGE ID p_msgid TYPE vl_msgty NUMBER p_msgno
    WITH p_msgv1 p_msgv2 p_msgv3 p_msgv4
    INTO wa_return-message.

    APPEND wa_return TO t_return.

    FREE: vl_msgty, wa_return.

  ENDFORM.                    " mensagem_retorno_tab

*&---------------------------------------------------------------------*
*&      Form  get_folder
*&---------------------------------------------------------------------*
  FORM get_folder
  CHANGING
    w_folder_id TYPE soodk
    t_return TYPE ty_return.

    CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
         EXPORTING
              region    = 'B'  " ?
         IMPORTING
              folder_id = w_folder_id
         EXCEPTIONS
              OTHERS    = 1.

    IF sy-subrc <> 0.
      PERFORM mensagem_retorno_tab
      USING
       sy-msgid sy-msgty sy-msgno sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      CHANGING
        t_return[].
    ENDIF.

  ENDFORM.                    " get_folder

*&---------------------------------------------------------------------*
*&      Form  object_insert
*&---------------------------------------------------------------------*
  FORM object_insert USING
    p_objtp     TYPE so_obj_tp
    w_obj_data  TYPE sood1
    w_folder_id TYPE soodk
    t_obj_cont  TYPE zpmct002
  CHANGING
    w_document_id TYPE sofmk
    t_return      TYPE ty_return.

*   Objetos locais
    DATA:
      it_objcont  TYPE STANDARD TABLE OF soli,
      it_obj_head TYPE STANDARD TABLE OF soli,
      wa_obj_id   TYPE soodk,
      wa_obj_cont LIKE LINE OF t_obj_cont.

*   RAW to CHAR
    LOOP AT t_obj_cont INTO wa_obj_cont.
      APPEND wa_obj_cont TO it_objcont.
      CLEAR wa_obj_cont.
    ENDLOOP.

*   Insere objeto
    CALL FUNCTION 'SO_OBJECT_INSERT'
         EXPORTING
              folder_id                  = w_folder_id
              object_type                = p_objtp
              object_hd_change           = w_obj_data
              owner                      = sy-uname
         IMPORTING
              object_id                  = wa_obj_id
         TABLES
              objhead                    = it_obj_head
              objcont                    = it_objcont
         EXCEPTIONS
              active_user_not_exist      = 1
              communication_failure      = 2
              component_not_available    = 3
              dl_name_exist              = 4
              folder_not_exist           = 5
              folder_no_authorization    = 6
              object_type_not_exist      = 7
              operation_no_authorization = 8
              owner_not_exist            = 9
              parameter_error            = 10
              substitute_not_active      = 11
              substitute_not_defined     = 12
              system_failure             = 13
              x_error                    = 14
              OTHERS                     = 15.

    IF sy-subrc = 0.
      w_document_id-foltp = w_folder_id-objtp.
      w_document_id-folyr = w_folder_id-objyr.
      w_document_id-folno = w_folder_id-objno.
      w_document_id-doctp = wa_obj_id-objtp.
      w_document_id-docyr = wa_obj_id-objyr.
      w_document_id-docno = wa_obj_id-objno.
    ELSE.
      PERFORM mensagem_retorno_tab
      USING
       sy-msgid sy-msgty sy-msgno sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      CHANGING
        t_return[].
    ENDIF.

*   Libera objetos locais
    FREE:it_objcont, it_obj_head, wa_obj_id, wa_obj_cont.

  ENDFORM.                    " object_insert
*&---------------------------------------------------------------------*
*&      Form  relation_create
*&---------------------------------------------------------------------*
  FORM relation_create
  USING
    p_relationtype TYPE binreltyp
    w_obj          TYPE borident
    w_document_id  TYPE sofmk
  CHANGING
    t_return TYPE ty_return.

    DATA wa_doc TYPE borident.

    wa_doc-objtype = 'MESSAGE'.

    CASE p_relationtype.
      WHEN 'ATTA'.
        wa_doc-objkey  = w_document_id(34).
      WHEN 'URL'.
        wa_doc-objkey  = w_document_id.
      WHEN OTHERS.
    ENDCASE.

    CALL FUNCTION 'BINARY_RELATION_CREATE'
         EXPORTING
              obj_rolea      = w_obj
              obj_roleb      = wa_doc
              relationtype   = p_relationtype
         EXCEPTIONS
              no_model       = 1
              internal_error = 2
              unknown        = 3
              OTHERS         = 4.

    IF sy-subrc = 0.

      COMMIT WORK AND WAIT.

      CASE p_relationtype.
        WHEN 'ATTA'.
*         O anexo foi criado com êxito
          PERFORM mensagem_retorno_tab
          USING
            'SGOS_MSG' zgtpm_s '043' '' '' '' ''
          CHANGING
            t_return[].
        WHEN 'URL'.
*         A URL foi criada com êxito
          PERFORM mensagem_retorno_tab
          USING
            'ZPM_PORTAL' zgtpm_s '059' '' '' '' ''
          CHANGING
            t_return[].
        WHEN OTHERS.

      ENDCASE.

    ELSE.
      PERFORM mensagem_retorno_tab
      USING
       sy-msgid sy-msgty sy-msgno sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      CHANGING
        t_return[].
    ENDIF.

    FREE wa_doc.

  ENDFORM.                    " relation_create

Edited by: Fabrício Alves Vieira on Apr 8, 2008 3:08 PM

Former Member
0 Kudos

Hi,

I'm also interested in using GOS in the Visual Composer but for a custom object, the code

shown in the previous post seems to specific to the initial request

Has anyone actually created a BAPI to do this?

Regards,

Lesley

.

JUNG
Participant
0 Kudos

Thanks a lot.

I have same need : with Visual Composer, attach a document to a QM notification using GOS (Generic Object Service).

As I'm not very technical, could you kindly explain (quickly) how did you achieve this ?

Rgds

Gilles

Former Member
0 Kudos

Anyone with any updates on using GOS in Visual composer?

Thanks,

Robert