Archivo
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
SHD0 – Grisar campos INVFO-ZFBDT e INVFO-ZTERM en MIR7
Caso: Se desea grisar los campos INVFO-ZFBDT e INVFO-ZTERM en la MIR7.
Solución: crear variante de imagen, por la SHD0
1. Se desean grisar los campos siguientes en la MIR7:
2. Ingresamos a la SHD0 (también podemos hacerlo por la OLMRLIST, es similar):
- image005
- image022
3. Seleccionamos la imagen y presionamos el botón de copiar
La copiamos con un nombre que comience con Z, va a pedir Orden de Transporte.
4. Tomamos la variante copiada y presionamos “Modificar con procesamiento”
5. Nos llama a la MIR7, pasamos los campos obligatorios de la primera pantalla y vamos a la pestaña “Pago” en donde están nuestros campos
6. Nos aparecerán los campos normales. Grabamos y nos aparecerá una pantalla en donde marcamos los campos que queremos grisar. Presionamos Grabar y finalizar.
7. Ahora debemos crear una variante de transacción, para ello en la misma SHD0, vamos a la pestaña del medio, indicamos un nombre y presionamos modificar.
8. Al presionar modificar se desgrisan los campos de agregar, borrar y grabar. Agregamos la variante de imagen creada:
Grabamos al finalizar.
9. Nos queda el último paso, vamos a la primera pestaña de la SHD0, seleccionamos la variante de transacción y presionamos activar
Le damos OK al mensaje
10. Ingresamos a la MIR7 para probar el cambio en la pestaña de pago…¡los campos aparecen grisados!
Links:
315586 – MIRO: Creating and changing display variants
372776 – MIRO, MIR6: Display variants are not created or incorrect
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:
- attc1c1a
- attc1c1b
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.
- 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
- 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:
Fuente: http://subrc0.wordpress.com/2012/11/13/gos-adding-an-external-link-to-an-object/
BAPI_INCOMINGINVOICE_PARK – BAPI para la MIR7
Caso: se requiere encontrar una BAPI para crear un documento factura y grabarlo en la MIR7.
Solución: El siguiente programa es un ejemplo de como utilizar la BAPI_INCOMINGINVOICE_PARK; se debe tener en cuenta que difiere la forma de utilizarla, según si el pedido es de materiales o de servicios (está relacionado con el uso de los campos sheet_no y sheet_item):
REPORT zprueba_bapi_mir7. DATA: x_in_header LIKE bapi_incinv_create_header, i_in_item LIKE bapi_incinv_create_item OCCURS 0 WITH HEADER LINE, lc_belnr LIKE bapi_incinv_fld-inv_doc_no, lc_gjahr LIKE bapi_incinv_fld-fisc_year, lw_ekko TYPE ekko, d_msg(110), lw_ekpo TYPE ekpo, i_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE. SELECT SINGLE * FROM ekko INTO lw_ekko WHERE ebeln = '0060000120'. CHECK sy-subrc EQ 0. x_in_header-invoice_ind = 'X'. x_in_header-doc_type = 'K1'. " Tipo de documento x_in_header-pstng_date = '20141028'. " Fecha contabilización x_in_header-doc_date = '20141025'. " Fecha documento x_in_header-ref_doc_no = '60000120'. " Referencia x_in_header-comp_code = '1000'. " Sociedad x_in_header-currency = lw_ekko-waers. " Moneda x_in_header-gross_amount = '787500'. " Monto x_in_header-calc_tax_ind = 'X'. " Calcular impuestos x_in_header-bus_area = 'VAP'. " División x_in_header-pmnttrms = lw_ekko-zterm. " Cond. de pago x_in_header-diff_inv = lw_ekko-lifnr. " Proveedor i_in_item-invoice_doc_item = '000001'. " #Ítem i_in_item-po_number = '0060000120'. " Nro. Pedido SAP i_in_item-po_item = '00010'. " Pos. Pedido SAP i_in_item-sheet_no = '1000000606'. " Recepción i_in_item-sheet_item = '0000000010'. " Posición i_in_item-TAX_CODE = 'C1'. " Ind. Impuestos APPEND i_in_item. CLEAR i_in_item. CALL FUNCTION 'BAPI_INCOMINGINVOICE_PARK' EXPORTING headerdata = x_in_header IMPORTING invoicedocnumber = lc_belnr fiscalyear = lc_gjahr TABLES itemdata = i_in_item return = i_return. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. LOOP AT i_return. PERFORM f_message_prepare USING sy-langu i_return-id i_return-number i_return-message_v1 i_return-message_v2 i_return-message_v3 i_return-message_v4 CHANGING d_msg. WRITE: / d_msg. ENDLOOP. IF NOT lc_belnr IS INITIAL. WRITE: / 'Doc :', lc_belnr. WRITE: / 'Año :', lc_gjahr. ENDIF. *&---------------------------------------------------------------------* *& Form F_MESSAGE_PREPARE *&-------------------------------------------------------------------- FORM f_message_prepare USING p_langu p_msgid p_msgno p_msgv1 p_msgv2 p_msgv3 p_msgv4 CHANGING p_msg. DATA: lc_char(3). WRITE p_msgno TO lc_char. CLEAR p_msg. CALL FUNCTION 'MESSAGE_PREPARE' EXPORTING language = p_langu msg_id = p_msgid msg_no = lc_char msg_var1 = p_msgv1(50) msg_var2 = p_msgv2(50) msg_var3 = p_msgv3(50) msg_var4 = p_msgv4(50) IMPORTING msg_text = p_msg EXCEPTIONS function_not_completed = 1 message_not_found = 2 OTHERS = 3. ENDFORM. " F_MESSAGE_PREPARE
MIR7-MIRO – INVFO-GSBER/División – valor por defecto
Caso: se busca que al crear un documento por la MIRO o MIR7, que traiga por defecto un valor para el campo DIVISIÓN (INVFO-GSBER).
Solución:
1. Para crear valores por defecto en los datos de cabecera, deberíamos implementar la BADI MRM_HEADER_DEFAULT, ingresando por la SE18, podemos ver de que se trata:
2. Por la SE19, la implementamos:
3. Usaremos el único método, el HEADER_DEFAULT_SET. En nuestro caso, como el campo DIVISIÓN no está en los parámetros de salida, debo actualizarlo mediante un FIELD-SYMBOL. Hacemos doble-click en el método:
4. Agregamos el código
FIELD-SYMBOLS: <fs_rbkpv> TYPE mrm_rbkpv. DATA: c_rbkpv(15) TYPE c VALUE '(SAPLMR1M)RBKPV'. CASE sy-tcode. WHEN 'MIR7' OR 'MIRO'. CHECK i_rbkpv-gsber IS INITIAL. ASSIGN (c_rbkpv) TO <fs_rbkpv>. <fs_rbkpv>-gsber = 'DIVISIÓN'. ENDCASE.