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.
*------------------------------------------------------------------------