Anexos en masa en "Servicios para objeto"

Hola a todos:

Como soy nuevo y he pedido cosas pues voy a dar algo porque puede que a algún otro sufridor le pueda interesar.

El “manual” va de ¿como subir ficheros anexos en masa a los servicios para objeto?
PDF’s, fotos, word, excel, etc lo que soporta el servicio de objetos.

Bueno pues en mi caso particular se trataba de subir fotografías anexas al maestro de materiales.
Por ejemplo material 1 foto 1.jpg, material 2 foto 2.jpg

Lo que hice fué inspirarme (digase buscar por la red) y encontré en un foro un Indú muy listo que ya lo había hecho pero para otra clase de objeto.
No tengo el enlace para darle el mérito que se merece, lo siento.
Así que hice una adaptación de su código a mis fines.

Requerimientos:
1º Los ficheros que se van a anexar los hay que subir por FTP (o como sea) al servidor, a un directorio donde el programa ABAP pueda leerlos. No vale el equipo del usuario (C:).
2º Los ficheros tienen que tener el nombre del objeto como nombre del fichero. En mi caso como eran materiales por ejemplo un fichero sería 6000000.jpg que se anexará en el maestro de materiales al material 6000000.
3º No cargen 50.000 ficheros de una vez, mejor poco a poco.Yo he llegado a cargar del 2000 en 2000 sin problemas.

A continuación pego el código.
Perdón por lo chapuza, pero FUNCIONA.

Notas:
1º El parámetro p_type está cargado con el objeto necesario para anexar al maestro de materiales, otros objetos metidos ahí subiran los anexos a por ejemplo pedidos, solicitudes, clientes etc.
2º El parámetro p_file marcha el directorio donde se han dejado los ficheros *.jpg que voy a anexar.

Lo que hace el programa es subir y convertir los anexos en la tabla de SAP reservada a tal fin indexándolo en el maestro del material.

Espero que sirva de ayuda a otro usuario del foro.

Un saludo.


report ZMM03_ANEXOS
       no standard page heading line-size 255.

TABLES:
  MARA.

PARAMETERS:
p_type TYPE swo_objtyp OBLIGATORY DEFAULT 'BUS1001006',
p_file LIKE rlgrap-filename OBLIGATORY DEFAULT '/interfaces/entrada/pruebas/'.

DATA: ls_fol_id TYPE soodk,
ls_obj_id TYPE soodk,
ls_obj_data TYPE sood1,
ls_folmem_k TYPE sofmk,
ls_note TYPE borident,
ls_object TYPE borident,
lv_ep_note TYPE borident-objkey,
lv_offset TYPE i.

DATA: it_objhead TYPE STANDARD TABLE OF soli,
it_content LIKE STANDARD TABLE OF soli,
wa_content LIKE soli.

DATA: lv_desc type swo_typeid.

DATA: lv_t1(12), lv_t2(4).

*-----------------------------------------------------------------
data dirserv type salfile-longname.
data: ifile type table of salfldir with header line.

*dirserv = '/interfaces/entrada/pruebas/'.
dirserv = p_file.
call function 'RZL_READ_DIR_LOCAL'
  exporting
  name = dirserv
  tables
    file_tbl = ifile
  exceptions
    argument_error = 1
    not_found = 2
    others = 3.

*---------------------------------------------------------------------
LOOP AT ifile.
  CHECK ifile-name <> '.'.
  CHECK ifile-name <> '..'.
  WRITE: /  'Cargando: ', ifile-name.

lv_desc = ifile-name.
split ifile-name AT '.' INTO lv_t1 lv_t2.
CONCATENATE '0000000000' lv_t1(8) INTO ls_object-objkey.
ls_object-objtype = p_type.
CONCATENATE dirserv ifile-name INTO p_file.

TRY.
  OPEN DATASET p_file FOR INPUT IN BINARY MODE.
  WHILE sy-subrc = 0.
    READ DATASET p_file INTO wa_content.
    APPEND wa_content TO it_content.
  ENDWHILE.
  CLOSE DATASET p_file.
  CATCH cx_sy_file_access_error.
  MESSAGE 'Error reading file' TYPE 'E'.
ENDTRY.

CALL FUNCTION 'SO_CONVERT_CONTENTS_BIN'
  EXPORTING
    it_contents_bin = it_content[]
  IMPORTING
    et_contents_bin = it_content[].

CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
  EXPORTING
    region = 'B'
  IMPORTING
    folder_id = ls_fol_id
  EXCEPTIONS
  OTHERS = 1
*    OWNER_NOT_EXIST = 2         "               Specified owner does not exist
*    X_ERROR = 4                 "               Internal error
    .  "  SO_FOLDER_ROOT_ID_GET

ls_obj_data-objsns = 'O'.
ls_obj_data-objla = sy-langu.
ls_obj_data-objdes = lv_desc.
lv_offset = STRLEN( p_file ) - 3.
ls_obj_data-file_ext = p_file+lv_offset(3).
ls_obj_data-objlen = LINES( it_content ) * 255.

CALL FUNCTION 'SO_OBJECT_INSERT'
  EXPORTING
    folder_id = ls_fol_id
    object_type = 'EXT'
    object_hd_change = ls_obj_data
  IMPORTING
    object_id = ls_obj_id
  TABLES
    objhead = it_objhead
    objcont = it_content
  EXCEPTIONS
    active_user_not_exist = 35
    folder_not_exist = 6
    object_type_not_exist = 17
    owner_not_exist = 22
    parameter_error = 23
  OTHERS = 1000.

IF sy-subrc = 0 AND ls_object-objkey IS NOT INITIAL.
  ls_folmem_k-foltp = ls_fol_id-objtp.
  ls_folmem_k-folyr = ls_fol_id-objyr.
  ls_folmem_k-folno = ls_fol_id-objno.
  ls_folmem_k-doctp = ls_obj_id-objtp.
  ls_folmem_k-docyr = ls_obj_id-objyr.
  ls_folmem_k-docno = ls_obj_id-objno.
  lv_ep_note = ls_folmem_k.
  ls_note-objtype = 'MESSAGE'.
  ls_note-objkey = lv_ep_note.
  CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
    EXPORTING
      obj_rolea = ls_object
      obj_roleb = ls_note
      relationtype = 'ATTA'
    EXCEPTIONS
    OTHERS = 1.
ELSE.
   WRITE 'Error al subir la imagen'.
*  MESSAGE 'Not OK' TYPE 'I'.
  RETURN.
ENDIF.

IF sy-subrc = 0.
*    MESSAGE 'OK' TYPE 'I'.
   WRITE 'OK, imagen subida'.
ELSE.
*    MESSAGE 'Not OK' TYPE 'I'.
   WRITE 'Error al subir la imagen'.
ENDIF.

REFRESH it_content.
CLEAR   it_content.
CLEAR   ls_obj_data.
CLEAR   ls_fol_id.
REFRESH it_objhead.
CLEAR   it_objhead.
REFRESH it_content.
CLEAR   it_content.
CLEAR   ls_folmem_k.
CLEAR   ls_note.
CLEAR   ls_object.


ENDLOOP.

*------------------------------------------------------------------------

3 Me gusta

Mmira lo subi para probarlo y ver como funciona, pero el p_file es una ruta en el servidor, y solo tengo rutas locales, de todos modos buscare la manera de hacerlo correr para ver que tal.
Gracias por el aporte sumamente interesante.

1 me gusta