SMW0–Como editar un template HTML de forma sencilla

Cuando queremos mandar un mail o un adjunto en formato HTML podemos utilizar la Transacción SMW0 junto con la función WWW_HTML_MERGER.

Esto nos permitirá reemplazar textos predefinidos en el HTML de forma sencilla y de esta forma evitar andar concatenando strings en el código fuente.

1- Debemos armar nuestro HTML template y a los textos que queremos reemplazar definirlos con una “variable” por ejemplo:

<HTML>
    <BODY>
    Fecha del día: !DATE!
    Usuario: !USER!
    </BODY>
< /HTML>

Yo personalmente elegí escribirlos en mayúsculas y entre signos de exclamación pero como reemplazaremos dichas cadenas, pueden estar definidas o también podemos reemplazar masívamente cualquier cadena de textos.

2- Lo subimos al servidor por medio de la transacción SMW0

image

Acá podemos crear nuevos templates o editar, actualizar, subir, bajar ya existentes. Lo importante es el nombre que definamos, ya que luego será usado.

image

3- Código Fuente

" Data Declarations
DATA: lt_merge_table  TYPE  swww_t_merge_table.
DATA: lt_html_table   TYPE  swww_t_html_table.
DATA: ls_merge_table  LIKE LINE OF lt_merge_table.
DATA: ls_html_table   LIKE LINE OF lt_html_table.
DATA: lv_html_string  TYPE string.

    REFRESH lt_html_table.

    " Remplace !DATE!  with value
    CLEAR ls_merge_table.
    ls_merge_table-name    = ‘!DATE!’.
    ls_merge_table-command = ‘R’.      "Replace
    lv_string              = sy-datum.
    APPEND lv_string TO ls_merge_table-html[].
    APPEND ls_merge_table TO lt_merge_table.
       
    " Remplace !USER!  with value
    CLEAR ls_merge_table.
    ls_merge_table-name    = ‘!USER!’.
    ls_merge_table-command = ‘R’.      "Replace
    lv_string              = sy-uname.
    APPEND lv_string TO ls_merge_table-html[].
    APPEND ls_merge_table TO lt_merge_table.

    " Call the HTML MERGE function
    CALL FUNCTION ‘WWW_HTML_MERGER’
      EXPORTING
         template    = ‘ZTEMPLATE_MAIL’ "Valor definido en transacción SMW0
      IMPORTING
        html_table  = lt_html_table[]
      CHANGING
        merge_table = lt_merge_table[].

    LOOP AT lt_html_table INTO ls_html_table.
      lv_html_string = lv_html_string && ls_html_table-line.
    ENDLOOP.

Tendremos como resultado el código html subido al servidor en string con los valores que nosotros definidos reemplazados.

Advertisements

STF4_GET_DOMAIN_VALUE_TEXT–Descripción de un valor de Dominio

Con la Función DDIF_DOMA_GET podemos ver los valores fijos posibles que puede tener un dominio, pero si queremos saber la descripción de un valor directamente sin tener que traer todos los valores podemos usar la función ‘STF4_GET_DOMAIN_VALUE_TEXT’

Recibe como parámetros el Dominio del que deseamos saber la descripción junto con el valor

CALL FUNCTION ‘STF4_GET_DOMAIN_VALUE_TEXT’
EXPORTING
  iv_domname      = ‘ZADTEL00007M’  " The name of the domain with fixed values
  iv_value        = ls_tarea-zzdr_tipo     " Value of Domain 
IMPORTING
  ev_value_text   = lv_value                " Resulting short text for fixed value
EXCEPTIONS
   value_not_found = 1
   others          = 2.

SMUM_XML_PARSE – XML a Tabla Interna

Mientras tengamos el archivo XML en formato string o xstring podremos convertirlo a una tabla interna.

En el caso que lo tengamos en formato string previamente deberemos convertirlo a xstring.

DATA : wa_xmldata       TYPE string,
wa_xmldata_bin TYPE xstring.

DATA: result_xml    TYPE STANDARD TABLE OF smum_xmltb .
DATA: return          TYPE STANDARD TABLE OF bapiret2.

* Convert string to Xstring format
CALL FUNCTION ‘SCMS_STRING_TO_XSTRING’
EXPORTING
text   = wa_xmldata          ” variable type string
IMPORTING
buffer = wa_xmldata_bin.  ” variable type xstring

* Convert Xstring XML to Internal Table
CALL FUNCTION ‘SMUM_XML_PARSE’
EXPORTING
xml_input = wa_xmldata_bin
TABLES
xml_table = result_xml
return      = return.

El resultado es una tabla interna con este formato

image

Donde:

  • HIER: Nivel en el árbol
  • TYPE: Tipo de nodo ( vacío = solo tag, V = que tiene un valor, etc)
  • CNAME: Nombre del nodo
  • CVALUE: Valor que contiene el nodo.

BAPI_ALM_NOTIF_CREATE / BAPI_ALM_NOTIF_DATA_MODIFY– Actualizar campo Duración de Parada (Breakdown duration)

Si necesitamos crear un aviso con la BAPI BAPI_ALM_NOTIF_CREATE o modificarlo vía BAPI_ALM_NOTIF_DATA_MODIFY.

Y debemos actualizar el campo “duración de parada” (Breakdown Duration) deberemos seguir las intrucciones de la nota 

1619709 – Notification breakdown duration not populated by BAPI call

Es una nota informativa, explicando que la funcionalidad no está en dichas BAPIs, por lo cual deberemos implementar la BADI NOTIF_EVENT_SAVE.

method IF_EX_NOTIF_EVENT_SAVE~CHANGE_DATA_AT_SAVE.
IF CS_VIQMEL-AUSZT is initial.
*   Only execute if breakdown time is not already set
     IF ( CS_VIQMEL-MSAUS = 'X' ) AND ( CS_VIQMEL-AUSVN <> 0 ) AND ( CS_VIQMEL-AUSBS >= CS_VIQMEL-AUSVN ).
*       Only if breakdown indicator is set, valid start date, end date not less than start date
        CS_VIQMEL-AUSZT = ( CS_VIQMEL-AUSBS - CS_VIQMEL-AUSVN ) * 24 * 60 * 60.
        CS_VIQMEL-AUSZT = CS_VIQMEL-AUSZT
                  + ( CS_VIQMEL-AUZTB - CS_VIQMEL-AUZTV ).
    ENDIF.
ENDIF.

endmethod.

image

Modificar descripción de Textos – Cabecera y Posición

Necesitabamos modificar la descripción del texto de cabecera de la solped (ME51N) y descubrimos que por customizing si bien se pueden en los pedidos (purchase order) no se puede en las solped, no existe, únicamente tiene de posición. Pero lo que si se puede es modificar las vista de textos en general, ingresando su objeto de texto.

Si ingresamos via SM30 a la vista V_TTXID_N, nos pedirá ingresar el objeto de texto deseado, EBANH es cabecera de solped y EBAN de posiciones por ejemplo.

image

Entonces ahí le puedo cambiar la descripción. Por default tenia texto de cabecera.

Esto nos generará una OT, si deseamos cambiar varios idiomas debemos loguearnos en el deseado y seguir los mismos pasos.

Las dos tablas que contienen todos los ID de textos y sus descripciones son las:

  • TTXID: IDs y Objeto texto
  • TTXIT: Textos

Tablas y funciones Workflow – Reporting

Estas son algunas tablas y funciones útiles para realizar reportes de WF. En WF ya sea el WF o todos los Workitems poseen un ID, ese ID es que se usa en la mayoría de las tablas de WF.

Tablas:

  • SWWWIHEAD:  Cabecera de Workitem
  • SWPSTEPLOG:  Pasos del WF (workitems que se fueron disparando)
  • SWW_CONT:     Datos del Container de un Workitem
  • SWWUSERWI:   Work Items que posee un user en inbox
  • SWW_WI2OBJ:  Link entre el objeto del WF y el WF

Funciones:

  • SAP_WAPI_READ_CONTAINER:  Datos Container
  • SWN_UWL_GET_WORKLIST:  Work items pendientes de un user
  • SAP_WAPI* :   Varias funciones de WF

Leer y modificar un Infotipo – Infotipo texto 0128.

Si deseamos leer un infotipo podemos utilizar la función HR_READ_INFOTYPE.

Para realizar operaciones sobre dicho infotipo se utiliza la función HR_INFOTYPE_OPERATION donde en el parámetro OPERATION se define la acción.

  • INS = Insert
  • DEL = Delete
  • MOD = Change
  • EDQ = Approve
  • COP = Create Succesor
  • CHK = Check Record

Al utilizar estas funciones si o si debemos primero bloquear dicho legajo con HR_EMPLOYEE_ENQUEUE y desbloquearlo luego con HR_EMPLOYEE_DEQUEUE.

Hay infotipos que poseen “textos” (por ejemplo 0128) que no pueden ser actualizados por medio de HR_INFOTYPE_OPERATION, nos devolverá un error que faltan completar campos, esto se debe a que el titulo del texto que es obligatorio no existe en el infotipo de tipo P0128 sino que es del tipo Q0128.

Para poder modificar este infotipo debemos usar directamente la función HR_MAINTAIN_MASTERDATA (dicha función es llamada internamente en la HR_INFOTYPE_OPERATION) Entonces a la HR_MAINTAIN_MASTERDATA le completamos todos los campos P0128 del infotipo (que posee el idioma, objeto, nombre, ID, etc) le agregamos a la tabla proposed_values los valores:

proposed_values-infty = ‘0128’.
proposed_values-fname = ‘Q0128′-TDTITLE’.
proposed_values-fval = ‘Titulo ejemplo’.
append proposed_values.

En el caso que estemos creando un infotipo que fue borrado anteriormente, nos generará el texto usado anteriormente, sin importar el titulo que le pongamos.