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

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

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

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.

Error RW022 en BAPI_ACC_DOCUMENT_POST o BAPI_ACC_DOCUMENT_CHECK

Caso: Al ejecutar la BAPI BAPI_ACC_DOCUMENT_CHECK o la BAPI_ACC_DOCUMENT_POST se genera el error RW022 “Interfase RW: Saldo en moneda de transacción” y el monto de diferencia es de un monto mínimo (ejemplo, 1 o 2 pesos chilenos –CLP-). También aparece como cabecera el error RW609: Error en el documento: BKPFF ….


Solución:
Luego de dar varias vueltas al tema y dado que estaba trabajando con una moneda distinta a la moneda de la sociedad, el problema era al traspasar los valores al campo AMT_DOCCUR. Utilicé entonces la BAPI_CURRENCY_CONV_TO_EXTERNAL y funcionó OK.

CALL FUNCTION ‘BAPI_CURRENCY_CONV_TO_EXTERNAL’
EXPORTING
currency = wa_currencyamount-currency
amount_internal = wa_datos-monto_prov
IMPORTING
amount_external = wa_currencyamount-amt_doccur.

Va el código:

DATA: wa_documentheader TYPE bapiache09,
      it_accountgl      TYPE STANDARD TABLE OF bapiacgl09,
      wa_accountgl      TYPE bapiacgl09,
      it_currencyamount TYPE STANDARD TABLE OF bapiaccr09,
      wa_currencyamount TYPE bapiaccr09,
      it_return         TYPE STANDARD TABLE OF bapiret2,
      wa_return         TYPE bapiret2,
      lw_error          TYPE ty_error,
      lv_posnr_acc      TYPE posnr_acc,
      wa_datos          TYPE ty_datos,
      lv_gl_account     TYPE hkont,
      lv_importe        TYPE bapidoccur.
 
* Clear de tablas internas
REFRESH: it_accountgl,
         it_currencyamount,
         it_return.
 
* Cabecera del documento
CLEAR: wa_documentheader.
MOVE sy-uname                TO wa_documentheader-username.   " Usuario
MOVE p_bukrs                 TO wa_documentheader-comp_code.  " Sociedad
MOVE pa_stida                TO wa_documentheader-doc_date.   " Fecha del documento
MOVE p_fecha_doc             TO wa_documentheader-pstng_date. " Fecha de contabilización
MOVE 'AB'                    TO wa_documentheader-doc_type.   " Tipo de documento
MOVE p_texto_periodo         TO wa_documentheader-header_txt. " Texto cabecera documento
MOVE 'RFBU'                  TO wa_documentheader-bus_act.    " Operación empresarial
 
lv_posnr_acc = '0000000000'.                                  " Inicializo la Posición
* GL Account 001
CLEAR: lv_importe.
LOOP AT pt_datos INTO wa_datos.
 
  CLEAR : wa_accountgl, wa_currencyamount.
  ADD 1 TO lv_posnr_acc.
  MOVE lv_posnr_acc              TO wa_accountgl-itemno_acc.  " Line Item No
 
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = pa_gast          " Cuenta de gasto
    IMPORTING
      output = lv_gl_account.
 
  MOVE lv_gl_account             TO wa_accountgl-gl_account.  " Cuenta contable - G/L Account
  MOVE p_texto_periodo           TO wa_accountgl-item_text.   " Texto del ítem
  MOVE p_bukrs                   TO wa_accountgl-comp_code.   " Sociedad
  MOVE wa_datos-gsber            TO wa_accountgl-bus_area.    " División
  MOVE wa_datos-kostl            TO wa_accountgl-costcenter.  " Centro de costo = CeBe
  wa_accountgl-acct_type = 'S'.
  APPEND wa_accountgl TO it_accountgl.
 
* Fill Currency Line item
  MOVE lv_posnr_acc              TO wa_currencyamount-itemno_acc.  " Line Item No
* curr_type ==>  00  Moneda del documento /// curr_type ==>  10  Moneda de sociedad
  MOVE '00'                      TO wa_currencyamount-curr_type.  " Currency Type
  MOVE p_moneda                  TO wa_currencyamount-currency .  " Moneda
 
*      wa_currencyamount-amt_doccur = wa_datos-monto_prov.           " Aquí estaba el error, para CLP no funcionaba
  CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
    EXPORTING
      currency        = wa_currencyamount-currency
      amount_internal = wa_datos-monto_prov
    IMPORTING
      amount_external = wa_currencyamount-amt_doccur.
 
  ADD wa_currencyamount-amt_doccur TO lv_importe.                " MOD Q_EPURICELLI - 21.04.2016 -
  APPEND wa_currencyamount TO it_currencyamount.
ENDLOOP.
 
* GL Account 002
CLEAR : wa_accountgl, wa_currencyamount.
 
ADD 1 TO lv_posnr_acc.
MOVE lv_posnr_acc              TO wa_accountgl-itemno_acc.  " Line Item No
 
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = pa_prov          " Cuenta de provisión
  IMPORTING
    output = lv_gl_account.
 
MOVE lv_gl_account             TO wa_accountgl-gl_account.  " Cuenta contable - G/L Account
MOVE p_bukrs                   TO wa_accountgl-comp_code.   " Sociedad
MOVE 'Prov.incobrables'        TO wa_accountgl-item_text.   " Texto del ítem
wa_accountgl-acct_type = 'S'.
APPEND wa_accountgl TO it_accountgl.
 
* Fill Currency Line item
MOVE lv_posnr_acc              TO wa_currencyamount-itemno_acc.  " Line Item No
* curr_type ==>  00  Moneda del documento // curr_type ==>  10  Moneda de sociedad
MOVE '00'                      TO wa_currencyamount-curr_type.   " Currency Type
MOVE p_moneda                  TO wa_currencyamount-currency .   " Moneda
lv_importe = lv_importe * -1.
MOVE  lv_importe               TO wa_currencyamount-amt_doccur. " Monto
APPEND wa_currencyamount TO it_currencyamount.
 
* Llamado a la BAPI MODO TEST
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
  EXPORTING
    documentheader = wa_documentheader
  TABLES
    accountgl      = it_accountgl
    currencyamount = it_currencyamount
    return         = it_return.
 
LOOP AT it_return INTO wa_return WHERE type = 'E'.
  p_error = 'X'.
  CONCATENATE 'E' wa_return-id wa_return-number INTO lw_error-error.
  lw_error-mensaje = wa_return-message.
  APPEND lw_error TO pt_error.
ENDLOOP.

Mostrar u ocultar campos en pantalla de selección

Caso: se desea crear una pantalla de selección con radiobuttons que al ser presionados, modifique la visualización de otros campos en pantalla.

Solución: para el ejemplo utilizaremos radiobuttons que al ser presionados grisen u oculten otros campos de selección.

REPORT zprueba_abap.
TABLES: bsid,
vbrk.
 
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
PARAMETERS: r_new RADIOBUTTON GROUP r1 USER-COMMAND rbut DEFAULT 'X',
r_pen RADIOBUTTON GROUP r1,
r_pro RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF BLOCK b1.
 
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
PARAMETERS: p_bukrs TYPE bsid-bukrs.
SELECT-OPTIONS: s_kunnr FOR bsid-kunnr MODIF ID zz1,
s_belnr FOR bsid-belnr MODIF ID zz1.
 
PARAMETERS: p_gjahr TYPE vbrk-gjahr MODIF ID im1.
SELECT-OPTIONS: s_bldat FOR bsid-bldat,
s_zuonr FOR vbrk-zuonr MODIF ID im2.
SELECTION-SCREEN END OF BLOCK b2.
 
AT SELECTION-SCREEN OUTPUT.
PERFORM ocultar_campos.
 
FORM ocultar_campos.
 
IF r_new EQ 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'IM2'.
screen-input = 0. " Campo editable
screen-invisible = 1. " Campo invisible
MODIFY SCREEN.
ENDIF.
ENDLOOP.
 
ELSEIF r_pen EQ 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'ZZ1'.
screen-input = 0. " Campo no editable/grisado
screen-invisible = 0. " Campo invisible
MODIFY SCREEN.
ENDIF.
 
ENDLOOP.
ELSEIF r_pro EQ 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'IM1'.
screen-input = 0. " Campo no editable/grisado
screen-invisible = 1. " Campo invisible
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " OCULTAR_CAMPOS
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 36 seguidores