Archivo

Posts Tagged ‘SE37’

GOS – Crear Anexo/URL en MIR7/MIRO

Caso: Se desea grabar una URL en documentos factura de la MIR7 o MIRO, utilizando la función del botón GOS (Generic Object Services).

Solución: obtenido del blog que indico abajo, definimos una función que contiene la lógica.

1. Ingresar a la SE37 y crear la función:

FUNCTION zbc_gos_create_url.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     REFERENCE(I_OBJECTTYPE) LIKE  BORIDENT-OBJTYPE
*"     REFERENCE(I_OBJECTKEY) LIKE  BORIDENT-OBJKEY
*"     REFERENCE(I_URL) LIKE  SOLI-LINE
*"     REFERENCE(I_URLDES) LIKE  SOOD1-OBJDES
*"     REFERENCE(I_NOCOMMIT) TYPE  XFELD
*"  TABLES
*"      OT_RETURN STRUCTURE  BAPIRET2
*"----------------------------------------------------------------------
*
*local data definitions.
  DATA: l_owner         LIKE      soud-usrnam,
        l_folderid      LIKE      soodk,
        l_obj_id        LIKE      soodk,
        l_objdata       LIKE      sood1,
        lt_objcont      TYPE TABLE OF soli WITH HEADER LINE,
        lt_objhead      TYPE TABLE OF soli WITH HEADER LINE,
        l_object        LIKE     borident,
        l_reldoc        LIKE     borident,
        l_syst          LIKE     syst.
*-----------------------------------------------------------------------
*
*1.GET folder id.
  l_owner = sy-uname.
  CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
    EXPORTING
      owner                 = l_owner
      region                = 'B'
    IMPORTING
      folder_id             = l_folderid
    EXCEPTIONS
      communication_failure = 1
      owner_not_exist       = 2
      system_failure        = 3
      x_error               = 4
      OTHERS                = 5.
  IF sy-subrc <> 0.
    l_syst = syst.
    PERFORM collect_message USING ot_return l_syst '1.FolderRoot'.
    APPEND ot_return.
    EXIT.
  ENDIF.
 
*2. INSERT object
 
  l_objdata-objla     = sy-langu.
  l_objdata-objdes    = i_urldes.
  l_objdata-objsns    = 'O'.
 
  CONCATENATE '&KEY&' i_url INTO lt_objcont.
  APPEND lt_objcont.
 
  CALL FUNCTION 'SO_OBJECT_INSERT'
    EXPORTING
      folder_id                  = l_folderid
      object_type                = 'URL'
      object_hd_change           = l_objdata
      owner                      = l_owner
    IMPORTING
      object_id                  = l_obj_id
    TABLES
      objcont                    = lt_objcont
      objhead                    = lt_objhead
    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.
    l_syst = syst.
    PERFORM collect_message USING ot_return l_syst '2.ObjectInsert'.
    APPEND ot_return.
    EXIT.
  ENDIF.
 
*3. CREATE binary relation
  l_object-objkey  = i_objectkey.
  l_object-objtype = i_objecttype.
 
  CONCATENATE l_folderid l_obj_id INTO l_reldoc-objkey.
  l_reldoc-objtype = 'MESSAGE'.
 
  CALL FUNCTION 'BINARY_RELATION_CREATE'
    EXPORTING
      obj_rolea      = l_object
      obj_roleb      = l_reldoc
      relationtype   = 'URL'
    EXCEPTIONS
      no_model       = 1
      internal_error = 2
      unknown        = 3
      OTHERS         = 4.
  IF sy-subrc <> 0.
    l_syst = syst.
    PERFORM collect_message USING ot_return l_syst
    '3.BinaryRelationCreate'.
    APPEND ot_return.
    EXIT.
  ENDIF.
 
*4. commit luw
*   all successful, sent success message.
 
  CLEAR: l_syst-msgid, l_syst-msgno.
  l_syst-msgty = 'S'.
  l_syst-msgv1 = 'Like creado OK'.
 
  PERFORM collect_message USING ot_return l_syst '4. URLLinkCreated'.
  APPEND ot_return.
  IF i_nocommit IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
  ENDIF.
 
ENDFUNCTION.
  1. Creamos un include en el grupo de funciones donde creamos la función y agregamos la visualización del mensaje:
*----------------------------------------------------------------------*
***INCLUDE LZMM_FACT_PROVEEDORESF01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  COLLECT_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
 FORM collect_message USING o_return LIKE bapiret2
                            i_syst LIKE syst
                            i_callpoint LIKE bapiret2-parameter.
*
   CLEAR o_return.
   o_return-type   = i_syst-msgty.
   IF i_syst-msgty IS INITIAL.
     o_return-type = 'E'.
     i_syst-msgty      = 'E'.
   ENDIF.
   o_return-id     = i_syst-msgid.
   o_return-number = i_syst-msgno.
   o_return-message_v1    = i_syst-msgv1.
   o_return-message_v2    = i_syst-msgv2.
   o_return-message_v3    = i_syst-msgv3.
   o_return-message_v4    = i_syst-msgv4.
 
   o_return-parameter = i_callpoint.
 
   MESSAGE ID i_syst-msgid TYPE i_syst-msgty NUMBER i_syst-msgno INTO
   o_return-message.
*
 ENDFORM.                    " collect_message
  1. Finalmente la llamada es:

 

*&---------------------------------------------------------------------*
*&      Form  CREAR_URL_ADJUNTA
*&---------------------------------------------------------------------*
*       Crea la URL para cada uno de los registros procesados
*----------------------------------------------------------------------*
FORM crear_url_adjunta.
 
  DATA: lv_objecttype   LIKE borident-objtype,
        lv_objectkey    LIKE borident-objkey,
        lv_url          LIKE soli-line,
        lv_urldes       LIKE sood1-objdes,
        lv_nocommit     TYPE xfeld,
        lt_return       LIKE bapiret2 OCCURS 0,
        l_url           TYPE smen_buffi-url.
 
* The object type is the same as you are used to in SWO1 (BKPF for FI documents, BUS2081 for incoming invoices (MIROs), BUS2012 for POs and so on.
* The object key is the full key of the object (For FI  documents, it is the document, company code and year)
* The URL is the actual URL that you wish to attach.
* The URL description is the name for the URL you see when you display attachments of the object.
* The last input parameter controls whether you wish to commit( blank) or not(X).
* Messages are returned in tables parameter OT_RETURN.
    lv_objecttype = 'BUS2081'.  
    CONCATENATE lv_belnr lv_gjahr INTO lv_objectkey.
    lv_url          = 'www.sap.com'. " URL
    CONCATENATE 'FACTURA #' lv_belnr lv_gjahr INTO lv_urldes SEPARATED BY space.
 
    lv_nocommit = space.
 
    CALL FUNCTION 'ZBC_GOS_CREATE_URL'
      EXPORTING
        i_objecttype = lv_objecttype
        i_objectkey  = lv_objectkey
        i_url        = lv_url
        i_urldes     = lv_urldes
        i_nocommit   = lv_nocommit
      TABLES
        ot_return    = lt_return.
 
ENDFORM.                    " CREAR_URL_ADJUNTA

4. En la MIR7, podemos ver el resultado del link agregado:

attc1c2c

attc1c2c

 

Fuente: http://subrc0.wordpress.com/2012/11/13/gos-adding-an-external-link-to-an-object/

Encontrar una ampliación a partir del módulo de funciones

Caso: se requiere encontrar una ampliación a partir del módulo de funciones (dato conocido).

Solución:

1. Por la SE16, vamos a la tabla MODSAP y en el campo "MEMBER" indicamos el módulo de funciones

y vamos a la transacción SMOD con la ampliación encontrada:

2. Sino, por la CMOD,

Ahi ir arriba al menú UTILIDADES – Ampliaciones SAP

Ponemos el Nombre del Paquete (ML)

Lista los EXITs

Texto largo en DYNPRO (TEXTEDIT)

Caso: se requiere crear un POPUP en donde pueda agregar un texto largo, similar al texto libre usado en MM (ej: texto de cabecera en Solicitudes de Pedido, ME51n).

Solución: Usando la clase cl_gui_textedit, vamos a crear una DYNPRO como la de la figura siguiente, que contiene un Custom Container, un botón de volver y otro de grabar datos, además de unos botones estándar que contiene un importar/exportar texto y las funciones de copiar, pegar, etc.

1. Creamos la DYNPRO

Creamos en el Screen Painter una DYNPRO con un Control Custom Container llamado TEXTEDITOR1 y con un botón para volver a la pantalla anterior (VOLVER) y otro para grabar los datos (GRABAR).

2. Armamos el código asociado

CLASS cl_gui_cfw DEFINITION LOAD. 
DATA: g_editor TYPE REF TO cl_gui_textedit,
      g_editor_container     TYPE REF TO cl_gui_custom_container,
      g_mytable(line_length) TYPE c OCCURS 0,
      g_mycontainer(30)      TYPE c  VALUE 'TEXTEDITOR1'.
 
 
En la DYNPRO creada (la mía era la 0020):
 
PROCESS BEFORE OUTPUT.
  MODULE pbo_0020.
*
PROCESS AFTER INPUT.
  MODULE user_command_0020.
 
 
*&---------------------------------------------------------------------*
*&      Module  PBO_0020  OUTPUT
*&---------------------------------------------------------------------*
MODULE pbo_0020 OUTPUT.
 
  IF g_editor IS INITIAL.
 
*   Crea el control container
    CREATE OBJECT g_editor_container
      EXPORTING
        container_name              = g_mycontainer
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5.
    IF sy-subrc NE 0.
*      add your handling
    ENDIF.
 
*   TextEdit Control
    CREATE OBJECT g_editor
          EXPORTING
           parent = g_editor_container
           wordwrap_mode =
*             cl_gui_textedit=>wordwrap_off
              cl_gui_textedit=>wordwrap_at_fixed_position
*             cl_gui_textedit=>WORDWRAP_AT_WINDOWBORDER
           wordwrap_position = line_length
           wordwrap_to_linebreak_mode = cl_gui_textedit=>true.
 
    REFRESH g_mytable.  " Para inicializar la tabla 
 
  ENDIF.
 
ENDMODULE.                 " PBO_0020  OUTPUT
 
*&---------------------------------------------------------------------*
*&      Module  PAI_0020  INPUT
*&---------------------------------------------------------------------*
module user_command_0020 input.
 
  g_okcode = sy-ucomm.
  CLEAR sy-ucomm.
  CASE g_okcode.
    WHEN 'BACK' OR 'CANCEL' OR 'EXIT' or 'VOLVER'.
      CLEAR g_okcode.
      LEAVE TO SCREEN 0.
 
    WHEN 'GRABAR'.
*   Obtengo la tabla desde el control
      CALL METHOD g_editor->get_text_as_r3table
              IMPORTING table = g_mytable.
 
 
 
      CALL METHOD cl_gui_cfw=>flush
          EXCEPTIONS
              OTHERS = 1.
      IF sy-subrc NE 0.
*        
      ENDIF.
 
    WHEN 'CARGAR'.
*   Devuelvo la tabla al control
      CALL METHOD g_editor->set_text_as_r3table
              EXPORTING table = g_mytable.
 
  ENDCASE.
 
endmodule.                 " PAI_0020  INPUT
 

3. Grabamos y recuperamos la info a la base de datos.

En el GRABAR, la tabla con los resultados está en g_mytable, que es una tabla interna char de 256 (luego tendría que grabar eso en la base de datos), asimismo en el CARGAR vemos que levanto el texto para visualizarlo en pantalla.

Algunas funciones útiles SE37

Caso/Solución: listado de funciones útiles en SAP.

ALV HR_DISPLAY_BASIC_LIST ALV Básico
REUSE_ALV_LIST_DISPLAY ALV de listado Simple
REUSE_ALV_GRID_DISPLAY ALV Grid moderno
REUSE_ALV_HIERSEQ_LIST_DISPLAY ALV Jerárquico parecido al ALV List pero con posibilidad de manejar dos tablas.
UNIDADES CONVERSION_EXIT_CUNIT_INPUT Convierte unidades de SAP en su formato correcto.
CONVERSION_EXIT_CUNIT_OUTPUT Convierte unidades de SAP en su formato correcto.
MD_CONVERT_MATERIAL_UNIT Convierte un material desde una unidad de medida a otra.
SUBIDAS
Y
BAJADAS
DE
FICHEROS
WS_DOWNLOAD Baja ficheros de SAP a un EXCEL TXT …
WS_UPLOAD Carga de datos de un fichero plano a SAP.
TABLE_EXPORT_TO_MSACCESS Bajar una lista a ACCESS
WS_EXCEL Para bajar una tabla a Excel
ALSM_EXCEL_TO_INTERNAL_TABLE Carga datos de un Excel a una tabla interna de SAP.
GUI_DOWNLOAD Graba en un fichero local el contenido de una tabla interna.
GUI_UPLOAD Carga fichero local a una tabla interna.
GUI_DELETE_FILE Borra fichero local.
EPS_DELETE_FILE Borra fichero del servidor.
EPS_GET_DIRECTORY_LISTING Devuelve una lista de nombres de archivo de un disco local o de red
FECHAS CONVERSION_EXIT_LDATE_OUTPUT Para 20000101, esta devuelve 01.Enero.2000.
ADD_TIME_TO_DATE Le restas / sumas: D = días; M = mes; S= semanas; etc…. A una fecha.
RP_CALC_DATE_IN_INTERVAL Le restas / sumas: D = días; M = mes; etc…. A una fecha.
END_TIME_DETERMINE Suma MINUTOS HORAS SEGUNDOS a una FECHA-HORA
C14B_ADD_TIME Suma tiempo devolviendo día y hora
CALCULATE_DATE Suma número de días a una fecha
COMPUTE_YEARS_BETWEEN_DATES Calcula el nº de años entre dos fechas
CONVERSION_EXIT_PDATE_INPUT Convierte cualquier fecha en fecha con formato SAP
CONVERSION_EXIT_PDATE_OUTPUT Convierte la fecha de aaaammdd —> ddmmaaaa
CONVERSION_EXIT_SDATE_OUTPUT Para 20000101, esta devuelve 01.ENE.2000.
CONVERT_DATE_TO_EXTERNAL Cambia el formato de: aaammdd –> dd.mm.aaaa
CONVERT_DATE_TO_INTERNAL Cambia el formato de: dd.mm.aaaa –> aaammdd
DATE_COMPUTE_DAY Te dice el dia de la semana en número. ’01’ Lunes, ’02’ Martes, etc…
DAY_IN_WEEK Te dice el dia de la semana en número. ’01’ Lunes, ’02’ Martes, etc…
ISH_GET_DAY_OF_WEEK Le pasas una fecha y te devuelve… ’01’ Lunes, ’02’ Martes, etc…
DATE_GET_WEEK Devuelve el nº de semana en que cae una fecha dada
DATE_CONVERT_TO_FACTORYDATE Para obtener el próximo día laborable de una fecha (o el anterior).
DAYS_BETWEEN_TWO_DATES Días entre dos fechas
F4_DATE Visualizar calendario para ayuda F4.
FACTORYDATE_CONVERT_TO_DATE Calendar function: Returns date for a factory calendar date
HR_E_NUM_OF_DAYS_OF_MONTH Le das una fecha y te dice el nº de días de ese mes.
FKK_LAST_DAY_OF_MONTH Le das una fecha y te dice el último día de ese mes.
HR_SGPBS_YRS_MTHS_DAYS Calcula el nº de días, meses, años que hay entre dos fechas
MONTH_NAMES_GET Recupera todos los meses y sus nombres en el idioma seleccionado
MONTH_PLUS_DETERMINE Calcula el mes que resulta de sumar (o restar) un número de meses a una fecha
POPUP_TO_SELECT_MONTH Sale un Popup para seleccionar un mes y año
RH_GET_DATE_DAYNAME Obtiene el nombre del día.
RP_CHECK_DATE Chequea si el formato de fecha es correcto
LAST_DAY_OF_MONTHS Le das una fecha y te dice el último día de ese mes.
SD_DATETIME_DIFFERENCE Devuelve el intervalo que existe entre dos parametros de tipo FECHA y HORA
TV_GO_BACK_N_DAYS Le resta dias a una fecha
WDKAL_DATE_ADD_FKDAYS Suma días laborables.
WEEK_GET_FIRST_DAY Le pasas la Semana: ‘200932’ y te devuelve el lunes de esa semana: ‘03.08.2009’
CONVERSION_EXIT_TSTLC_OUTPUT Convierte fecha/hora de tipo 20.100.113.094.658 a… 13.01.2010 10:46:58
ISP_GET_MONTH_NAME Le pasas una fecha o un mes y te dice el "mes en texto". Enero, Febrero…
POPUP POPUP_TO_CONFIRM Popup que te sugiere si quieres continuar ‘Si’, ‘No’, ‘Cancelar’.
HELP_DOCULINES_SHOW Mega POPUP para escribir textos muy largos del tipo Información
POPUP_DISPLAY_MESSAGE POPUP para mensajes de ERROR
POPUP_GET_VALUES Recoge textos en un POPUP, para insertar en tablas etc…
POPUP_TO_CONFIRM_WITH_MESSAGE Como las anteriores pero te deja escribir mas líneas en el Popup
POPUP_TO_DECIDE_LIST Dentro del popup tiene radiobutons para elegir opciones.
POPUP_TO_DISPLAY_TEXT Popup de recordatorio con boton de ‘Continuar’
POPUP_TO_GET_ONE_VALUE Sale un POPUP en el que puedes Añadir un Texto
GRM_POPUP_TO_GET_ONE_VALUE Sale un POPUP en el que puedes Añadir un Texto. <<<<
POPUP_TO_INFORM Como su propio nombre indica.
POPUP_TO_MODIFY_TEXT Como la anterior pero tb te deja poner un valor
POPUP_WITH_TABLE_DISPLAY Visualiza una tabla interna y da la opción de seleccionar.
TERM_CONTROL_EDIT Mega POPUP que te permite escribir un texto muyyyyy largo….
TH_POPUP Envía un POPUP al usuario que mandes
VARIOS CONVERSION_EXIT_ALPHA_OUTPUT Quita los ceros por delante cuando son nº, si es texto no lo quita
CONVERSION_EXIT_ALPHA_INPUT Rellena con ceros por delante cuando son nº, si es texto no lo rellena
MD_CONVERT_MATERIAL_UNIT Agrupa materiales y pasa de PAL a CS o BOT, según se indique.
CLAF_CLASSIFICATION_OF_OBJECTS Para sacar la clasificacion de los materiales
CLOI_PUT_SIGN_IN_FRONT Coloca el signo negativo ‘-‘ delante del número o texto.
ENQUE_SLEEP Te hace esperar los segundos que le pongas
ENQUEUE_READ Función que mira los objetos que estan bloqueados por usuarios en ese mismo momento
F4_DXFILENAME_TOPRECURSION Para leer ficheros del servidor o del PC
MM_ADDRESS_GET Para mirar valores de campos…
QF05_RANDOM_INTEGER Le pasas un minimo y un máximo y te devuelve un nº aleatorio entre ese rango
ROUND Para hacer REDONDEOS
SAPGUI_PROGRESS_INDICATOR Reloj de SAP para indicar el porcentage
SPELL_AMOUNT Te pasa un numero a texto. Ej: 234 -> DOSCIENTOS TREINTA Y CUATRO
SXPG_COMMAND_EXECUTE Para ejecutar programas
TH_DELETE_USER Borra el modo de un usuario para un cliente.
WS_EXECUTE Para ejecutar programas
WS_FILENAME_GET Buscar fichero
WWW_ITAB_TO_HTML Convierte la tabla interna a otra en formato HTML. Luego hacer un download en formato ‘BIN’.
GET_DOMAENENVALUE Recupera el texto de los Dominios de los Elementos de Datos
RM_DOMAIN_VALUES_GET Recupera texto descriptivo de un dominio
DDIF_FIELDINFO_GET Le das una tabla y te devuelve los campos de esa tabla.
DD_DICTIONARY_TO_NAMETAB Le das una tabla y te devuelve los campos de esa tabla.
CS_BOM_EXPL_MAT_V2 Explosionar Materiales. Si pones el campo MEHRS = ‘X’ lo explosiona a todos los niveles.
CSAP_MAT_BOM_READ Explosionar Materiales
VIEW_MAINTENANCE_CALL Simula la SM30. Para Visualizar / Modoficar tablas.
MESSAGE_TEXT_BUILD Construye mensajes
RKD_WORD_WRAP Corta textos largos como un SPLIT rompiendo por un carácter elegido.
ADS2KIPUPL_GET_FILE_ATTRIBUTES Recupera los atributos de un fichero, fecha, hora, etc…
CONVERT_TO_FRACTION Convierte un número decimal en un Numerador y Denominador
MAINTAIN_IBAN Nos devuelve el código IBAN
FILE_GET_NAME Recupera la ruta el un fichero logico
STRING_REVERSE Da la vuelta a los caracteres: abcde > edcba – 12345 > 54321
FI_PERIOD_CHECK Chequea los periodos si estan abiertos o cerrados
RKE_READ_CUSTOMER_HIERARCHY Jerarquía de clientes
PDF CONVERT_ABAPSPOOLJOB_2_PDF Para convertir formularios a un documento PDF
CONVERT_OTFSPOOLJOB_2_PDF Para convertir formularios a un documento PDF
Field
Exit
DYNP_VALUES_READ Field Exit
DYNP_UPDATE_FIELDS Field Exit
Convertir
MONEDA
CONVERT_TO_LOCAL_CURRENCY Cambio de moneda local dado el importe extranjero
CONVERT_TO_FOREIGN_CURRENCY Conoce el cambio extranjero dando la moneda local (justo la inversa del anterior)
HR HR_READ_INFOTYPE Para leer infotipos HR
HR_READ_INFTY_NOTE Donde se guarda el texto de un infotipo.
IDOC EDI_DOCUMENT_DELETE Borra un IDOC

Link: http://www.abap.es/SE37.htm

Enviar Mail simple con SO_DOCUMENT_SEND_API1

Caso: Se desea enviar un mail en formato HTML.

Solución: se define un form ENVIAR_MAIL, que recibe como parámetros una lista de destinatarios y un texto adicional para incluir en el cuerpo del mensaje.

*&———————————————————————*
*&      Form  ENVIAR_MAIL
*&———————————————————————*
*       Envía un aviso al usuario que ejecutó el reporte indicando que el proceso terminó
*———————————————————————-*
FORM enviar_mail USING p_mails TYPE char100       » Destinatarios
p_texto TYPE char255.      » Texto dinámico para el cuerpo del mail

DATA: lt_docs            TYPE TABLE OF docs,
ls_doc_chng        LIKE sodocchgi1,
ld_tab_lines       LIKE sy-tabix,
lt_objtxt          LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lt_objpack         LIKE sopcklsti1 OCCURS 6 WITH HEADER LINE,
ls_body            TYPE solisti1,
lt_body            TYPE TABLE OF solisti1,
lt_recipients      TYPE TABLE OF somlreci1 WITH HEADER LINE,
ls_recipients      TYPE somlreci1.
DATA ld_subject(50)      TYPE c VALUE ‘Asunto del mail!!!’.
DATA ld_body(255)        TYPE c.
DATA lv_sender           TYPE soextreci1-receiver.
DATA lv_len              TYPE          i.
DATA lv_ofset            TYPE          i.
DATA lv_char(1).

CLEAR: ls_doc_chng, ls_body, lt_recipients, ld_tab_lines, lv_sender.
REFRESH: lt_body, lt_recipients, lt_objpack, lt_objtxt.

*———————————————————————-*
* CONTROL DATA (Datos de cabecera del mail)
*———————————————————————-*
ls_doc_chng-obj_name = ‘URGENT’.
ls_doc_chng-sensitivty = ‘P’.
ls_doc_chng-no_change = ‘X’.
ls_doc_chng-priority = ‘1’.
ls_doc_chng-obj_prio = ‘1’.
ls_doc_chng-obj_langu = sy-langu.
ls_doc_chng-no_change = ‘X’.

*———————————————————————-*
* SUBJECT (Asunto del mail)
*———————————————————————-*
**    Email Subject
ls_doc_chng-obj_descr = ld_subject.     » Ver variable definida con valor constante arriba

*———————————————————————-*
* BODY (Cuerpo del mail, en HTML)
*———————————————————————-*
CLEAR ls_body.
MOVE ‘<html><body>’ TO ls_body-line.
APPEND ls_body TO lt_body.

CLEAR ls_body.
CONCATENATE ‘<p>’ ‘Resultados de la ejecución del reporte</p>’
INTO ls_body-line.
APPEND ls_body TO lt_body.

CLEAR ls_body.
APPEND ls_body TO lt_body.
CLEAR ls_body.
CONCATENATE ‘<p>’ p_texto ‘</p>’
INTO ls_body-line SEPARATED BY space.
APPEND ls_body TO lt_body.

CLEAR ls_body.
APPEND ls_body TO lt_body.
CLEAR ls_body.
CONCATENATE ‘<p>’ ‘Este correo se ha generado en forma automática, por favor no responder</p>’
INTO ls_body-line SEPARATED BY space.
APPEND ls_body TO lt_body.

CLEAR ls_body.
MOVE  ‘</body></html>’ TO ls_body-line.
APPEND ls_body TO lt_body.

* Armo el HTML
lt_objtxt[] = lt_body[].
CLEAR lt_objtxt.
DESCRIBE TABLE lt_objtxt LINES ld_tab_lines.

IF ld_tab_lines GT 0.
READ TABLE lt_objtxt INDEX ld_tab_lines.
ls_doc_chng-doc_size =  ( ld_tab_lines – 1 ) * 255 + STRLEN( lt_objtxt ).
CLEAR lt_objpack-transf_bin.
lt_objpack-head_start = 1.
lt_objpack-head_num = 0.
lt_objpack-body_start = 1.
lt_objpack-body_num = ld_tab_lines.
lt_objpack-doc_type = ‘HTM’.
APPEND lt_objpack.
ENDIF.

*———————————————————————-*
*RECIPIENTS (Destinatarios del mail separados por 😉
*———————————————————————-*
lv_sender = ‘aaaa@aaaaa.com’.       » Indicar el mail origen

CLEAR lt_recipients.
lv_len = STRLEN( p_mails ).          » p_mails tiene direcciones de correo separadas por «;»
DO lv_len TIMES.
lv_ofset = sy-index – 1.
lv_char = p_mails+lv_ofset(1).
CHECK lv_char IS NOT INITIAL.
IF lv_char = ‘;’.
CONDENSE lt_recipients-receiver.
lt_recipients-rec_type    = ‘U’.
lt_recipients-rec_date    = sy-datum.
APPEND lt_recipients.
CLEAR lt_recipients.
CONTINUE.
ENDIF.
CONCATENATE lt_recipients-receiver lv_char INTO lt_recipients-receiver.
IF lv_len = sy-index.
CONDENSE lt_recipients-receiver.
lt_recipients-rec_type    = ‘U’.
lt_recipients-rec_date    = sy-datum.
APPEND lt_recipients.
ENDIF.
ENDDO.

CALL FUNCTION ‘SO_DOCUMENT_SEND_API1’
EXPORTING
document_data              = ls_doc_chng
put_in_outbox              = ‘X’
sender_address             = lv_sender
sender_address_type        = ‘SMTP’
commit_work                = ‘X’
TABLES
packing_list               = lt_objpack
contents_txt               = lt_objtxt
receivers                  = lt_recipients
EXCEPTIONS
too_many_receivers         = 1
document_not_sent          = 2
document_type_not_exist    = 3
operation_no_authorization = 4
parameter_error            = 5
x_error                    = 6
enqueue_error              = 7
OTHERS                     = 8.

IF sy-subrc EQ 0.
FORMAT: COLOR COL_POSITIVE, INTENSIFIED ON.
WRITE: /1 ‘El mail fue enviado con éxito’.
ELSE.
FORMAT: COLOR COL_NEGATIVE, INTENSIFIED ON.
WRITE: /1 ‘No se pudo enviar mail’.
ENDIF.

ENDFORM.                    » ENVIAR_MAIL

[end]

SE16N – Otra forma de Modificar registros en Tablas SAP

Caso: se busca modificar los registros de una tabla estándar o Z en producción.

Previamente vemos que NO FUNCIONA mediante:

§ la utilización de &SAP_EDIT en la SE16N (luego de la aplicación de una nota de seguridad)

§ el post publicado anteriormente para hacerlo debuggueando y modificando las variables gd-sapedit y gd-edit.

Otra forma de hacerlo (y hasta ahora la que uso yo) es la siguiente:

1. Ingresar a la SE37

2. Ejecutar el módulo de funciones SE16N_INTERFACE.

3. Darle valor ‘X’ a las siguientes variables (siempre apretando el lapicito para grabar el cambio):

· I_TAB (nombre de la tabla a modificar)

· I_EDIT (valor = ‘X’)

· I_SAPEDIT (valor = ‘X’)

4. Ejecutar

Categorías: ABAP/4 Etiquetas: , , , ,