He tenido el requerimiento de anexar un documento a un pedido en MM, pero me he topado con que el método CREATE_ATTACHMENT selecciona en dialogo el archivo a anexar; pero parte del requerimiento que tenía es que el usuario indique la ruta completa donde se encuentra el archivo en lugar de seleccionarlo en dialogo.
Después de realizar un exhaustivo debug al metodo CREATE_ATTACHMENT de la clase CL_GOS_DOCUMENT_SERVICE, he logrado crear un programa funcional que utiliza las funciones SO_FOLDER_ROOT_ID_GET, SO_DOCUMENT_REPOSITORY_MANAGER y BINARY_RELATION_CREATE para lograr anexar un documento o archivo a un pedido en MM, sin que el usuario tenga que seleccionar el archivo (en dialogo), sino que utilizando la ruta que el usuario indique.
El código fuente es el siguiente:
*&———————————————————————*
*& Report ZTESTMCA4
*&
*&———————————————————————*
*&
*&
*&———————————————————————*
REPORT ztestmca4.
DATA attachment TYPE borident.
DATA documents TYPE STANDARD TABLE OF sood4.
DATA document TYPE sood4.
DATA folder_id TYPE sofdk.
DATA: is_object TYPE borident.
DATA: ep_attachment TYPE swo_typeid.
DATA: it_objcont TYPE TABLE OF soli,
it_objhead TYPE TABLE OF soli,
it_objpara TYPE TABLE OF selc,
it_objparb TYPE TABLE OF soop1,
it_recipients TYPE TABLE OF soos1,
it_attachments TYPE TABLE OF sood5,
it_references TYPE TABLE OF soxrl,
it_files TYPE TABLE OF so_url,
wa_files TYPE so_url.
DATA: l_method TYPE syucomm,
l_authority TYPE so_aut_fol,
wa_ref_doc TYPE sood4,
wa_new_parent TYPE soodk,
wa_document TYPE sood4,
wa_header_data TYPE sood2,
wa_folmem_data TYPE sofm2,
wa_receive_data TYPE soos6.
DATA: l_filename TYPE string,
l_objdes TYPE so_obj_des,
l_objtp TYPE so_obj_tp.
* Obtener el Folio y ID
CALL FUNCTION ‘SO_FOLDER_ROOT_ID_GET’
EXPORTING
region = ‘B’
IMPORTING
folder_id = folder_id
EXCEPTIONS
OTHERS = 0.
document-foltp = folder_id-foltp.
document-folyr = folder_id-folyr.
document-folno = folder_id-folno.
APPEND document TO documents.
* Inicialización de las variables
FREE: wa_ref_doc, wa_new_parent, l_authority.
FREE: it_objcont, it_objhead, it_objpara, it_objparb,
it_recipients, it_attachments, it_references,
it_files.
* Llenar información del documento que se va a anexar
l_method = ‘IMPORTFROMPC’.
* Esta parte es muy importante, ya que con esto no se abre la ventana de dialogo de seleccion del archivo
* Si no se llena esta tabla interna, la función abre la ventana de dialogo de seleccion del archivo
wa_files = ‘C:\Users\mcolliake\Documents\Proyecto Actual\An Easy Reference for OLE Automation.pdf’.
l_filename = ‘C:\Users\mcolliake\Documents\Proyecto Actual\An Easy Reference for OLE Automation.pdf’.
APPEND wa_files TO it_files.
MOVE-CORRESPONDING document TO wa_document.
MOVE ‘B’ TO wa_document-folrg.
MOVE ‘5’ TO wa_header_data-objpri.
* Obtener la descripcion del Archivo
PERFORM so_split_file_and_extension(saplso30)
USING l_filename
l_objdes
l_objtp.
* Mover la descripción del archivo
MOVE l_objdes TO wa_document-objdes.
MOVE l_objdes TO wa_header_data-objdes. “<– Es necesario, porque de lo contrario, la descripción queda en blanco
* Obtener el archivo a incluir al documento MM
CALL FUNCTION ‘SO_DOCUMENT_REPOSITORY_MANAGER’
EXPORTING
method = l_method
office_user = sy-uname
ref_document = wa_ref_doc
new_parent = wa_new_parent
IMPORTING
authority = l_authority
TABLES
objcont = it_objcont
objhead = it_objhead
objpara = it_objpara
objparb = it_objparb
recipients = it_recipients
attachments = it_attachments
references = it_references
files = it_files
CHANGING
document = wa_document
header_data = wa_header_data
folmem_data = wa_folmem_data
receive_data = wa_receive_data.
MOVE-CORRESPONDING wa_document TO document.
* Ligar el documento obtenido con el numero de documento de MM
*READ TABLE documents INDEX 1 INTO document.
MOVE ‘4800000403’ TO is_object-objkey.
MOVE ‘BUS2012’ TO is_object-objtype.
IF NOT is_object-objkey IS INITIAL.
IF document-okcode = ‘CREA’ OR document-okcode = ‘CHNG’.
attachment-objtype = ‘MESSAGE’.
attachment-objkey = document(34).
CALL FUNCTION ‘BINARY_RELATION_CREATE’
EXPORTING
obj_rolea = is_object
obj_roleb = attachment
relationtype = ‘ATTA’
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
ep_attachment = document(34).
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait = ‘X’
* IMPORTING
* RETURN =
.
ENDIF.
ENDIF.
ELSE.
IF document-okcode = ‘CREA’ OR document-okcode = ‘CHNG’.
ep_attachment = document(34).
ENDIF.
ENDIF.
Espero les sea de utilidad.
Saludos!
Atentamente
Moisés Collí Aké
¡¡ Orgullosamente Yucateco !!