Archivo
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.
Crear sustituciones – GGB1
Caso: se busca crear una sustitución para el campo BKPF-XBLNR (campo referencia) en la MIRO para que si el valor ingresado es numérico, se quiten los ceros a la izquierda de éste.
1. Ingresamos a la transacción GGB1.
Allí vamos a «Contabilidad financiera» – «Cabecera documento» (ya que allí está el campo a sustituir) y presionamos el botón «Nueva Sustitución».
Aquí se crea como una carpeta agrupadora de sustituciones.
Luego de esto, nos posicionamos en la carpeta recién grabada y presionamos el botón «Nuevo Paso». Allí nos va a pedir el/los campos a sustituir. Seleccionamos el nuestro:
Nos va a pedir que sustitución realizaremos. En nuestro caso como vamos a generar algo de código, usaremos un EXIT. En caso de querer reeemplazarlo por una constante usar «Valor constante» y si se desea reemplazarlo por el valor de otro campo, la opción «Asignación campo-campo»
Definimos una descripción para el paso recién creado y nos posicionamos en el filtro de condiciones. Allí indicamos la/s transacciones en las cuales deseamos que se ejecute la sustitución y en nuestro caso que el campo no debe estar vacío.
Para agregar campos y operadores se recomienda usar las opciones de ayuda. Finalmente presionar el botón de verificar () y el Status debe quedar en verde.
Ahora vamos a indicar el EXIT. Nos posicionamos en «Sustitución» y allí vemos que hay que indicar un EXIT (yo ya lo tengo creado como U300).
2. El EXIT se debe crear haciendo una copia Z del programa estándar RGGBS000, por ejemplo como ZRGGBS000.
Ingresar a la transacción GCX2 y reemplazar el programa estándar RGGBS000 por el nuevo Z.
Allí se puede utilizar uno de los UXXX que están comentados que están puestos como ejemplo o crearnos uno nuevo. Lo importante es tener lo siguiente:
* Sustitución campo referencia (XBLNR) sin ceros a la izquierda
exits-name = ‘U300’. » Sustitución campo
referencia (XBLNR) sin ceros a la izquierda
exits-param = c_exit_param_field.
exits-title = text-300.
APPEND exits.
*———————————————————————* FORM U300*
*———————————————————————* Sustitución Campo Referencia de Factura. Si posee ceros a la izquierda se quitan
*———————————————————————FORM u300 USING bkpf-xblnr.
DATA: lv_xblnr TYPE xblnr,
lv_tipo TYPE dd01v-datatype.
CALL FUNCTION ‘NUMERIC_CHECK’
EXPORTING
string_in = bkpf-xblnr
IMPORTING
string_out = lv_xblnr
htype = lv_tipo.
IF lv_tipo NE ‘CHAR’.
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_OUTPUT’
EXPORTING
input = bkpf-xblnr
IMPORTING
output = bkpf-xblnr.
ENDIF.
ENDFORM. «u0300
*———————————————————————
3. Luego de crear todo el código, debo grabar todo en la GGB1 y finalmente crear una entrada en la transacción OBBH para activar la carpeta de sustituciones creada.
En grado de activación, se debe indicar «1» para activar.
Finalmente se debe ejecutar el programa RGUGBR00 para ajustar los cambios realizados, según el post:
https://abapers.wordpress.com/2013/07/22/regenerar-ggb0-ggb1-validacionessustituciones/
Nota: Tener en cuenta que tanto las sustituciones como las validaciones se ejecutan cuando hablamos de contabilizaciones, en este caso por ejemplo en la MIR7 (documento preliminar prerregistrado) no va a correr la sustitución ya que no se genera documento contable.
Link útil:
http://saptricks.wordpress.com/2012/10/21/truco-29-sustituciones-en-controllingco-usando-exits-ii/