3 trucos ABAP para programar menos
Caso: Se enumeran algunos trucos para reducir el tiempo que se tarda programando.
Solución:
Truco 1: Armar estructuras utilizando el botón “MODELO”.
Casi siempre usamos estructuras para nuestros reportes y se pierde mucho tiempo en agregar los campos tipeándolos, veamos este trick usando el “MODELO”, también se pueden ver otras opciones ahí mismo.
- image001
- image002
- image003
Y el resultado final:
2. Copy+Paste de datos en columna
Si nos gusta crear una estructura desde el diccionario y luego completar con el texto TYPE manualmente, aquí un truco:
Seleccionamos los campos para pegarlos en nuestro programa:
- image005
- image006
He aquí el truco! Usamos ALT+drag and drop del mouse para seleccionar la info y trabajar con ella.
Por ejemplo me traigo los TYPES del punto anterior….o selecciono los tipos de datos y los elimino todos de una vez!
Para eliminar igual, con CTRL+X (cortar) o Suprimir (delete).
3. Uso del TAB para proponer texto personalizado.
Ya sabemos que el TAB nos ayuda a proponernos instrucciones, pero podemos agregar código nuestro? Si, veamos donde: el editor ABAP, en la esquina inferior derecha hay un ícono, lo presionamos.
Ahí en Modelos de códigos podemos ver los actuales y crearnos nuevos, por ejemplo:
- image010
- image011
Ahora, ya en el código:
Nos aparece el código ingresado
Agregar nueva fuente TrueType para Sapscript/Smartforms
Caso: Se desea agregar una nueva fuente Truetype a SAP para utilizarlo en Sapscripts o Smartforms.
Solución: Por la SE73 ingresamos a la opción “Instalar font TrueType”
En la pantalla siguiente, definimos un nombre para la fuente (tomaremos de ejemplo el caso de la fuente Arial)
Las fuentes podemos rescatarlas de C:WindowsFonts o de Internet y en Arial por ejemplo existen 4 formas:
· arial.ttf (normal),
· arialbd.ttf (negrita o bold),
· ariali.ttf (cursiva o italic)
· arialbi.ttf (negrita cursiva o italic).
Esto quiere decir que tendremos que subir cada uno de los archivos cambiando los tildes de los atributos de la pantalla en cada caso.
Agregando la fuente normal, nos abre un popup donde indicamos el fichero Font si no lo indicamos
Nos va a pedir una OT de Workbench:
Y luego un texto
Finalmente nos da un informe:
Hacemos lo mismo con las otras variantes de la fuente Arial, por ejemplo para negrita o bold:
Nos preguntará si instalamos el nuevo Font y le ponemos que si:
Y así con el resto de las variantes de la fuente Arial. Luego en el smartstyles vemos como seleccionar la nueva fuente:
Modificar texto de elemento de datos estándar
Caso: se modificar el texto o descripción de un elemento de datos estándar.
Solución: entrando a la transacción CMOD, elegimos del menú la opción “Pasar a” y elegimos: Ampliaciones Globales >Palabras Clave > Modificar. Seleccionamos el elemento de datos:
- image001
- image002
Luego de realizar los cambios, grabamos y nos pedirá OT.
Evitar la ejecución de JOBs en paralelo
Caso: se desea programar un job, pero que no se ejecute otra instancia del mismo si éste se encuentra ya en ejecución.
Por ejemplo si tengo un job que se ejecuta cada 1 minuto pero hay veces que su ejecución tarda más que 1 minuto, entonces queremos evitar que se ejecute la próxima instancia del job antes que termine el job actual.
Solución: utilizamos el report RSBTONEJOB2 como “puente” para ejecutar como JOB nuestro programa:
1. Ante todo tenemos que tener definido el programa y la variante que vamos a ejecutar en el JOB.
En nuestro caso es el programa ZPRUEBA_ABAP y la variante es SOC_1000.
2. Ingresamos a la SE38 y ejecutamos el report RSBTONEJOB2. Allí debemos indicar:
– JOBNAME: el nombre del job que crearemos (puede ser igual al nombre del report)
– REPORT: Nombre del programa que vamos a ejecutar en el JOB (ver paso 1)
– VARIANT: variante del programa a ejecutar en el JOB (ver paso 1)
3. Ahora bien, con estos datos debemos crear en el programa RSBTONEJOB2 una variante que tenga el mismo nombre que la variante del REPORT del paso 1. Es importante este punto.
- image0031
- image004
4. Vamos a la SM36 y programamos el JOB. Para el caso debemos respetar los nombres utilizados: El nombre del JOB y la variante
Definimos el paso, en este caso ponemos el nombre del programa RSBTONEJOB2, que funcionará como un “puente” al programa que queremos ejecutar en el JOB y la variante.
Definimos la condición de inicio (nosotros probaremos cada 1 minuto para forzar a que cancele la ejecución)
Grabamos el JOB para que se libere automáticamente (ya que nuestra condición de inicio fue “Inmediato”).
5. Vamos a ver su comportamiento en la SM37.
Vemos que se encuentra un JOB activo y al minuto intentó ejecutarse nuevamente y terminó, viendo el log del job terminado tenemos que:
Podemos ver los distintos mensajes que se generarán en el programa RSBTONEJOB2:
DEBUG de Smartforms
Caso: se desea debugguear un smartforms.
Solución: una forma práctica es la siguiente:
1. Ingresar a la transacción SMARTFORMS, indicar el nombre del formulario y presionar el botón “Verificar”
2. Aparecerá el módulo de funciones, presionamos “Visualizar”:
3. Buscamos el texto “PERFORM %GLOBAL_INIT.” Y hacemos doble click en el form
- image003
- image004
4. Finalmente allí buscar la sección de código donde queremos poner el break point.
MRM_INVOICE_DOCUMENT_DELETE – Eliminar documento factura preliminar (MIR7)
Caso: se desea eliminar un documento factura registrado en forma preliminar.
Solución: manualmente se puede hacer mediante la MIR4 (presionando F7) o la MIR7, utilizando la opción Documento de factura-borrar.
Pero queremos verlo por código, para ello usamos la MRM_INVOICE_DOCUMENT_DELETE, del grupo de funciones MRME:
REPORT zprueba_abap.
DATA: wa_rbkp TYPE mrm_rbkpv,
lv_belnr TYPE re_belnr,
lv_gjahr TYPE gjahr.
lv_belnr = ‘5105691484’.
lv_gjahr = ‘2016’.
CLEAR wa_rbkp.
wa_rbkp-belnr = lv_belnr.
wa_rbkp-gjahr = lv_gjahr.
CALL FUNCTION ‘MRM_INVOICE_DOCUMENT_DELETE’
EXPORTING
i_rbkpv = wa_rbkp
* I_LOCK = ‘ ‘
* TABLES
* T_DRSEG =
* CHANGING
* CT_ERRPROT =
EXCEPTIONS
invoice_locked = 1
invoice_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
Link: http://www.se80.co.uk/sapfms/m/mrm_/mrm_invoice_document_delete.htm
Usar parámetros de usuario – SU3
Caso: se requiere crear un parámetro Z de usuario y utilizarlo en un programa.
Solución: queremos usar un nuevo parámetro, de los que están en la SU3 cuando consultamos un usuario.
Para ello creamos el parámetro por la SM30, ingresando a la tabla TPARA
- image002
- image003
- image004
Actualizamos el valor en el usuario, ingresando por la SU3 o por la SU01:
Para recuperar los valores, hacemos un select a la tabla USR05:
DATA: lv_parva TYPE usr05-parva.
CLEAR lv_parva.
SELECT SINGLE parva
INTO lv_parva
FROM usr05
WHERE bname = p_uname
AND parid = ‘ZLOGIN_FN’.
Adjuntar y enviar archivo Excel (XLS) por Mail
Caso: se desea adjuntar un archivo Excel y enviarlo por E-Mail.
Solución:
REPORT zmail_con_excel. DATA: it_message TYPE STANDARD TABLE OF solisti1 INITIAL SIZE 0 WITH HEADER LINE. DATA: it_attach TYPE STANDARD TABLE OF solisti1 INITIAL SIZE 0 WITH HEADER LINE. DATA: gv_email TYPE somlreci1-receiver VALUE 'eduardo@eduardo.com'. DATA: t_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE, t_contents LIKE solisti1 OCCURS 0 WITH HEADER LINE, t_receivers LIKE somlreci1 OCCURS 0 WITH HEADER LINE, t_attachment LIKE solisti1 OCCURS 0 WITH HEADER LINE, t_object_header LIKE solisti1 OCCURS 0 WITH HEADER LINE, w_cnt TYPE i, w_sent_all(1) TYPE c, w_doc_data LIKE sodocchgi1, gd_error TYPE sy-subrc, gd_reciever TYPE sy-subrc. TYPES: BEGIN OF tty_salida, sociedad TYPE bukrs, " Sociedad documento TYPE belnr_d, " Nro. documento ejercicio TYPE gjahr, " Ejercicio periodo TYPE monat, " Período fecha_doc TYPE bldat, " Fecha doc. fecha_contable TYPE budat, " Fecha cont. clase_doc TYPE blart, " Clase doc. importe_ml TYPE dmbtr, " Importe ML usuario TYPE sy-uname. " Usuario TYPES: END OF tty_salida. DATA: gt_salida TYPE STANDARD TABLE OF tty_salida, gs_salida TYPE tty_salida. START-OF-SELECTION. * Registro de prueba gs_salida-sociedad = '1000'. gs_salida-documento = '1600000393'. gs_salida-ejercicio = '2014'. gs_salida-periodo = '10'. gs_salida-fecha_doc = '20141022'. gs_salida-fecha_contable = '20141022'. gs_salida-clase_doc = 'AB'. gs_salida-importe_ml = '150000'. gs_salida-usuario = sy-uname. APPEND gs_salida TO gt_salida. END-OF-SELECTION. PERFORM armar_mail. *&---------------------------------------------------------------------* *& Form ARMAR_MAIL – Rutina Principal *&---------------------------------------------------------------------* FORM armar_mail . * Populate table with details to be entered into .xls file PERFORM build_xls_data_table. * Populate message body text PERFORM populate_email_message_body. * Send file by email as .xls speadsheet PERFORM send_file_as_email_attachment TABLES it_message it_attach USING gv_email 'Asunto del mail!' 'XLS' 'Reporte' 'Reporte' ' ' ' ' CHANGING gd_error gd_reciever. * Instructs mail send program for SAPCONNECT to send email(rsconn01) PERFORM initiate_mail_execute_program. ENDFORM. " ARMAR_MAIL *&---------------------------------------------------------------------* *& Form BUILD_XLS_DATA_TABLE * Las etiquetas no pueden superar los 255 caracteres en una línea, esa es * una limitante pero al parecer hay formas de solucionarlo. Además todos * los tipos de datos deben ser caracteres. *&---------------------------------------------------------------------* FORM build_xls_data_table . DATA: lv_importe_ml_char TYPE char15, lv_importe_md_char TYPE char15, lv_tc_cab_char TYPE char11, lv_tc_pos_char TYPE char11, lv_dif_tc_reg_char TYPE char13, lv_dif_porcentaje_char TYPE char11, lv_tc_obs_char TYPE char11, lv_dif_tc_reg_b_char TYPE char13, lv_dif_porcentaje_b_char TYPE char11. CONSTANTS: con_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab, con_cret TYPE c VALUE cl_abap_char_utilities=>cr_lf. CONCATENATE 'Sociedad' 'Nro Documento' 'Ejer.' 'Periodo' 'Fecha Doc.' 'Fecha Cont.' 'Clase Doc.' 'Importe ML' 'User' INTO it_attach SEPARATED BY con_tab. CONCATENATE con_cret it_attach INTO it_attach. APPEND it_attach. LOOP AT gt_salida INTO gs_salida. MOVE gs_salida-importe_ml TO lv_importe_ml_char. CONDENSE lv_importe_ml_char NO-GAPS. CONCATENATE gs_salida-sociedad gs_salida-documento gs_salida-ejercicio gs_salida-periodo gs_salida-fecha_doc gs_salida-fecha_contable gs_salida-clase_doc lv_importe_ml_char gs_salida-usuario INTO it_attach SEPARATED BY con_tab. CONCATENATE con_cret it_attach INTO it_attach. APPEND it_attach. ENDLOOP. ENDFORM. " BUILD_XLS_DATA_TABLE *&---------------------------------------------------------------------* *& Form POPULATE_EMAIL_MESSAGE_BODY *&---------------------------------------------------------------------* FORM populate_email_message_body . REFRESH it_message. it_message = 'Cuerpo del mensaje (body)!'. APPEND it_message. ENDFORM. " POPULATE_EMAIL_MESSAGE_BODY *&---------------------------------------------------------------------* *& Form SEND_FILE_AS_EMAIL_ATTACHMENT *&---------------------------------------------------------------------* FORM send_file_as_email_attachment TABLES pit_message pit_attach USING gv_email p_mtitle p_format p_filename p_attdescription p_sender_address p_sender_addres_type CHANGING p_error p_reciever. DATA: ld_error TYPE sy-subrc, ld_reciever TYPE sy-subrc, ld_mtitle LIKE sodocchgi1-obj_descr, ld_email LIKE somlreci1-receiver, ld_format TYPE so_obj_tp , ld_attdescription TYPE so_obj_nam , ld_attfilename TYPE so_obj_des , ld_sender_address LIKE soextreci1-receiver, ld_sender_address_type LIKE soextreci1-adr_typ, ld_receiver LIKE sy-subrc. ld_email = gv_email. ld_mtitle = p_mtitle. ld_format = p_format. ld_attdescription = p_attdescription. ld_attfilename = p_filename. ld_sender_address = p_sender_address. ld_sender_address_type = p_sender_addres_type. * Fill the document data. w_doc_data-doc_size = 1. * Populate the subject/generic message attributes w_doc_data-obj_langu = sy-langu. w_doc_data-obj_name = 'SAPRPT'. w_doc_data-obj_descr = ld_mtitle . w_doc_data-sensitivty = 'F'. * Fill the document data and get size of attachment CLEAR w_doc_data. READ TABLE it_attach INDEX w_cnt. w_doc_data-doc_size = ( w_cnt - 1 ) * 255 + STRLEN( it_attach ). w_doc_data-obj_langu = sy-langu. w_doc_data-obj_name = 'SAPRPT'. w_doc_data-obj_descr = ld_mtitle. w_doc_data-sensitivty = 'F'. CLEAR t_attachment. REFRESH t_attachment. t_attachment[] = pit_attach[]. * Describe the body of the message CLEAR t_packing_list. REFRESH t_packing_list. t_packing_list-transf_bin = space. t_packing_list-head_start = 1. t_packing_list-head_num = 0. t_packing_list-body_start = 1. DESCRIBE TABLE it_message LINES t_packing_list-body_num. t_packing_list-doc_type = 'RAW'. APPEND t_packing_list. * Create attachment notification t_packing_list-transf_bin = 'X'. t_packing_list-head_start = 1. t_packing_list-head_num = 1. t_packing_list-body_start = 1. DESCRIBE TABLE t_attachment LINES t_packing_list-body_num. t_packing_list-doc_type = ld_format. t_packing_list-obj_descr = ld_attdescription. t_packing_list-obj_name = ld_attfilename. t_packing_list-doc_size = t_packing_list-body_num * 255. APPEND t_packing_list. * Add the recipients email address CLEAR t_receivers. REFRESH t_receivers. t_receivers-receiver = ld_email. t_receivers-rec_type = 'U'. t_receivers-com_type = 'INT'. t_receivers-notif_del = 'X'. t_receivers-notif_ndel = 'X'. APPEND t_receivers. CALL FUNCTION 'SO_DOCUMENT_SEND_API1' EXPORTING document_data = w_doc_data put_in_outbox = 'X' sender_address = ld_sender_address sender_address_type = ld_sender_address_type commit_work = 'X' IMPORTING sent_to_all = w_sent_all TABLES packing_list = t_packing_list contents_bin = t_attachment contents_txt = it_message receivers = t_receivers 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. * Populate zerror return code ld_error = sy-subrc. * Populate zreceiver return code LOOP AT t_receivers. ld_receiver = t_receivers-retrn_code. ENDLOOP. ENDFORM. " SEND_FILE_AS_EMAIL_ATTACHMENT *&---------------------------------------------------------------------* *& Form INITIATE_MAIL_EXECUTE_PROGRAM *&---------------------------------------------------------------------* FORM initiate_mail_execute_program . WAIT UP TO 3 SECONDS. SUBMIT rsconn01 WITH mode = 'INT' WITH output = 'X' AND RETURN. ENDFORM. " INITIATE_MAIL_EXECUTE_PROGRAM
RSWUWFML2 – Cambiar texto mail Workitem
Caso: se requiere cambiar los textos del correo electrónico que le llega al usuario cuando tiene que, por ejemplo liberar una orden de compra
Solución:
Por ejemplo, por defecto aparece este texto en el correo electrónico:
Asunto: Work item nuevo en sistema SAP DEV
Cuerpo del mensaje:
En la entrada del workflow del sistema SAP DEV existen work items nuevos. Abra el anexo de acceso directo SAP para pasar a la entrada del workflow, y trate los work items.
Si se le presenta algún problema a la hora de acceder, póngase en contacto con el responsable del sistema.
—-
Esto podemos configurarlo, en el programa RSWUWFML2:
– El primer texto es un mensaje de la clase SWU_NOTIF, que podemos ver por la SE91
- image0021
- image003
– La descripción se guarda en las tablas DOKHL y DOKTL.
SCU0 – Comparar tablas o customizing entre ambientes
Caso: se requiere verificar si en ambiente productivo están las entradas de una tabla de parámetros, comparando con el ambiente de desarrollo.
Solución:
Vemos que aparte de tablas, pueden compararse otras opciones del customizing, pero haremos el caso de las tablas:
1. Ingresamos a la transacción SCU0, indicamos “Selección manual” y presionamos el botón de Crear.
2. Definimos la tabla y en el otro campo lo dejamos en vacío (opción tabla)
3. Definimos la conexión RFC para el ambiente de PRD, indicamos una descripción y presionamos “Comparación completa” (o en fondo si la tabla es muy grande)
4. Tildamos la tabla y presionamos Comparación.
- image004
- image005
5. Podemos ver las diferencias en la tabla, viendo el significado de cada registro en la leyenda. Cada registro puede, por ejemplo indicar el valor que existe en el mandante trabajo o comparación, si la entrada es igual, diferencias, etc.