miércoles, 1 de junio de 2011

Convertir caracteres extraños en ABAP

La entrada de hoy no tiene nada que ver con CRM. Se trata de reemplazar caracteres extraños. En ocasiones al importar o exportar archivos o incluso en la comunicación entre módulos o sistemas (para quien no hay lo sepa el módulo de CO-PA es un poco "especial") se transportan caracteres que no son representables.
Realmente es muy frustrante ver como un caracter extraño puede deshacer todo un desarrollo. Estos caracteres no se puede atacar mediante un REPLACE ya que no pueden ser entrados por teclado y el cambio a hexadecimal no suele dar muy buenos resultados.
En el ejemplo que os pongo cambiremos esos caracteres por el caracter '/' con lo que ya lo podeis tratar como un texto normal. Yo lo que haré despues es sutiruirlo por espacio y condensar:

 Definimos un integer con el valor hexadecimal de la barra:

DATA lv_int TYPE i VALUE 47.

Llamo a la función:

CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
  EXPORTING
    intext      = "Texto_a_tratar"
    replacement = lv_int
   IMPORTING
    outtext     ="texto_salida"
      .

REPLACE ALL OCCURRENCES OF '/' IN "texto_salida" WITH space.
CONDENSE "texto_salida" NO-GAPS.

viernes, 6 de mayo de 2011

Campo por defecto en componente

Siguiendo el post anterior de ampliación de un componente del WebUI voy a contar como poner un campo por defecto en una página de CRM.
Obviamente debemos conocer el componente y la vista que queremos ampliar. Una vez que lo conozcamos ampliamos el componente y la vista y se redefine el método DO_VALIDATE_INPUT. Con este método vamos a poner un filtro por defecto y no va a ser modificable. Utilizando otros métodos es posible poner filtros que sean modificables por los usuarios.
Primero se obtiene el nodo de contexto:
lv_cnode = get_dquery_cnode( ).

El query del nodo:
lr_qs ?= lv_cnode->collection_wrapper->get_first( ).

Y los parámetros del filtro:
lr_col_params = lr_qs->get_selection_params( ).

Recorro los filtros hasta encontrar el que me interesa. Si el filtro tiene valores indicados y no son los que nos interesan los borro. Podríamos borrar directamente, pero así queda como más elegante ;-) :
lv_selection_parameter = lr_col_params->get_first( ).

WHILE lv_selection_parameter IS NOT INITIAL.
  lv_name ?= lv_selection_parameter->get_property( 'ATTR_NAME' ).
  IF lv_name->* = 'NOMBRE_DEL_ATRIBUTO'.
    CALL METHOD lv_selection_parameter->get_properties
      IMPORTING
        ES_ATTRIBUTES = atributes.
    IF control de valores.
      lr_col_params->remove( lv_selection_parameter ).
      lv_selection_parameter = lr_col_params->get_current( ).
      lv_control = 'X'.
    ELSE.
      lv_selection_parameter = lr_col_params->get_next( ).
    ENDIF.
  ELSE.
    lv_selection_parameter = lr_col_params->get_next( ).
  ENDIF.
ENDWHILE.

Ahora ponemos el valor que nos interesa.
IF lv_control = 'X'.
      new_selection_parameter =
          lr_qs->insert_selection_param( iv_attr_name = 'NOMBRE_DEL_ATRIBUTO'
          iv_sign = 'I'
          iv_option = 'EQ'
          iv_low = 'VALOR'
          iv_index = lv_index ).
ENDIF.

Por este método pasa siempre que presionemos al botón buscar por lo que cambie lo que se cambie en el filtro siempre pondrá los datos por defecto.

Por cierto, a partir de estas dos definiciones deberíais tener suficiente para sacar el resto y que el código compile:
DATA lv_cnode TYPE REF TO cl_bsp_wd_context_node_asp.
DATA atributes TYPE genilt_selection_parameter.

Y recordad de llamad al método superior para que todo funcione correctamente.

martes, 26 de abril de 2011

Ampliar componente WebUI

Muchas veces las pantallas estándar no nos ofrecen todo lo que la empresa necesita. La interfaz web de CRM tiene la ventaja de poder ampliarse casi de cualquier manera, sin necesidad de solicitar código de desarrollador a SAP ya que son ampliaciones que no modifican el código estándar. A continuación detallo como identificar y ampliar una página o componente del interfaz web.

El primer paso es conocer el componente y vista que queremos actualizar. Es importante tener en cuenta que una pantalla que puede parecer idéntica puede estar en el mismo componente pero en diferentes vistas. Para conocer el componente y la vista que queremos ampliar nos situamos en la pantalla que queremos ampliar, situamos el foco en cualquier campo y presionamos F2.

El componente a ampliar está en el bloque "Campo:Información técnica - Componente de IU" y la vista en el campo "Vista". Hay casos en los que el botón F2 no funciona. En esos casos no queda otra opción que debugar la vista anterior hasta encontrar la que queremos ampliar.

Con estos datos vamos a la transacción BSP_WD_CMPWB - Workbench del componente BSP WD. Se pone el componente a ampliar y el set de ampliación a utilizar.

Si no existe set de ampliación o se quiere utilizar otro en este punto se puede crear con el botón de creación (La hoja en blanco)

Pinchamos al botón actualizar y llegamos a la pantalla donde nos muestra todo el componente con las páginas y las vistas que tiene.

Aquí pinchamos en el botón "Ampliar el componente" para poder modificarlo. Ponemos nombre a la aplicación y aceptamos los mensajes siguientes. En el pop-up donde nos pide una página mantenemos la página por defecto y añadimos los cambios a una orden de transporte.

Ahora el componente es ampliable. Podemos modificar las vistas las páginas, crear nuevos eventos, campos....

Lo más complicado de este proceso es encontrar en qué punto necesitamos ampliar y que métodos podemos utilizar, habrá que ir haciendo pruebas con break-points. Para ampliar cualquier componente pinchamos con el botón derecho en la vista y seleccionamos "ampliar", incluimos la ampliación en una orden de transporte.

La clase de la vista se ha transformado en una clase Z. En este punto es posible que para que se reflejen los cambios haya que salir de la transacción y volver a entrar. Tenemos que decidir en que punto vamos a ampliar, TODOS son ampliables.

Para ello presionamos el botón derecho sobre el método a ampliar y seleccionamos "Redefinir".

El indicador cambia a verde indicando que el método está ampliado. Con doble click entramos en el método. Es necesario llamar al método de la clase superior quitando el comentario que nos aparece en el código, ponemos el código que necesitemos y tenemos el componente ampliado.

jueves, 21 de abril de 2011

Primer Post

Bueno, mi primer post en este blog... En realidad mi primer post en cualquier blog, me desvirgo con este. Hace tiempo que visito blogs, leo los comentarios, obtengo información de ellos para mi trabajo. Creo que es el momento de aportar mi pequeño granito de arena y publicar contenido en esto de la world wide web. Así que vamos allá, este blog se va a dedicar a mostrar pequeñas guias para SAP CRM pero también en otras áreas de SAP, y es posible que comentarios personales sobre cosas que no tienen nada que ver ni con el mundo SAP ni con la tecnología.
Espero tener en poco tiempo miles de seguidores y poder jubilarme y dedicarme en exclusiva a este blog ;-) Desde luego se aceptan sugerencias sobre temas así como correcciones y cualquier tipo de comentario. Espero que a alguien le sea útil.

Bienvenidos todos a esta nueva experiencia