jueves, 29 de noviembre de 2007

Error W8706 en transaccion SWEC - SAP - PRCTR - BUS0015

Si quisieramos crear un worflow que se active cuando se crea, modifica o borra un centro de beneficio (transacciones KE51, KE52, KCH5N, KE54).

En la transaccion SWEC al intentar relacionar el documento de modificacion estandar PRCTR (doc. modificacion Centro de Beneficio) con el objeto BUS0015 (Centro de Beneficio) el sistema informa una advertencia :

N° Mensaje : W8706

Claves obj.doc.modificación PRCTR y tipo business obj.BUS0015 incompatibles
(Key for change doc. object PRCTR and business object type BUS0015 are incompatible)

La ayuda nos indica :

Claves obj.doc.modificación PRCTR y tipo business obj.BUS0015 incompatibles

Nº mensaje: W8706


Diagnóstico

Se ha verificado la consistencia de la estructura de clave entre el documento de modificación y el tipo de business object. En esta verificación se ha detectado que la clave con la que se ha creado el objeto de documento de modificación PRCTR no se adecúa a la clave del tipo de business object BUS0015.

Actividades en el sistema

El sistema lanza un mensaje de advertencia.

Procedimiento

Verifique las entradas.

A pesar de este mensaje de advertencia es posible utilizar el tipo de objeto que se ha introducido si en la correspondiente tabla de sistema (actualizable mediante Transacción SWED) existe un módulo de funciones que "convierta" la clave del documento de modificación en la clave del objeto.




Lo que significa que el documento de modificación genera el objeto con una clave distinta al objeto BUS0015.

El registro se debe dar de alta igual ya que solo es una advertencia.


Si hicieramos un workflow cuyo evento inicializador sea el BUS0015.CREATED (nota: el BUS0015 no tiene eventos, es necesario crearle un subtipo con transaccion SWO1, creando un objeto ZBUS0015 con los eventos y luego delegarlo con la transaccion SWO6).

Luego el workflow se disparara pero si se usa algun valor del objeto BUS0015 terminara en error, hasta que se cree una función que mapee la clave correctamente.

Para averiguar la diferencia entre las claves se puede ir al objeto BUS0015 usando la transacción SWO1 y revisando los campos claves :



En este caso son :

ProfitCenter.ProfitCenter - Centro de beneficio - CEPC-PRCTR
ProfitCenter.ControllingArea - Sociedad CO - CEPC-KOKRS

Para saber la clave con que se genera el documento de modificacion debemos dar de alta los eventos respectivos en la transaccion SWEC y podemos usar la transacción de alta/modificacion/baja del centro de beneficio (KE51, KE52, KE54) y luego entrar a la tabla CDPOS filtrando con OBJECTCLAS = PRCTR . Ahí vemos el campo TABKEY y deberiamos tener un valor asi :

"100AR01YPRUEBAWF29999123120070101"
Que significa :

MANDT char 3 Mandante (CEPC->MANDT)
KOKRS char 4 Sociedad CO (CEPC->KOKRS)
PRCTR char 10 Centro beneficio (CEPC->PRCTR)
DATBI fecha 8 Fecha fin validez (CEPC->DATBI)
DATAB fecha 8 Fecha inicio validez (CEPC->DATAB)
(el mandante no llegara a la funcion de mapeo que creeemos)


Como vemos las claves son distintas, por eso tenemos que crear la función de remapeo.

Para crear dicha función vamos a la transacción SE37 y copiamos la función FI_SACH_BUS3006_KEY_SET la llamamos por ejemplo Z_MAP_KEY_BUS0015.

El import debe tener :
CHANGEDOCUMENT_HEADER LIKE CDHDR
OBJECTTYPE LIKE SWOTOBJID-OBJTYPE
OBJECTKEY LIKE SWOTOBJID-OBJKEY

En el export :
OBJECTTYPE LIKE SWOTOBJID-OBJTYPE

En Tablas :
CHANGEDOCUMENT_POSITION LIKE CDPOS


El código fuente debe ser :

FUNCTION Z_MAP_KEY_BUS0015.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" VALUE(CHANGEDOCUMENT_HEADER) LIKE CDHDR STRUCTURE CDHDR
*" VALUE(OBJECTTYPE) LIKE SWOTOBJID-OBJTYPE
*" VALUE(OBJECTKEY) LIKE SWOTOBJID-OBJKEY
*" EXPORTING
*" VALUE(OBJECTKEY) LIKE SWOTOBJID-OBJKEY
*" TABLES
*" CHANGEDOCUMENT_POSITION STRUCTURE CDPOS
*"----------------------------------------------------------------------
* function that computes for a given business object
* key (in OBJECTKEY)and a given business object type (in OBJECTTYPE)
* the correct business object key.
* (CHANGEDOCUMENT_HEADER and CHANGEDOCUMENT_POSITION may contain
* additional data concerning the changes, however, are not used here
* for simplicity reasons)
*"----------------------------------------------------------------------
* Structures for keys
DATA:
BEGIN OF CD_KEY,
KOKRS LIKE CEPC-KOKRS,
PRCTR LIKE CEPC-PRCTR,
DATBI LIKE CEPC-DATBI,
DATAB LIKE CEPC-DATAB,
END OF CD_KEY,

BEGIN OF BUS0015_KEY,
PRCTR LIKE CEPC-PRCTR, "ProfitCenter
KOKRS LIKE CEPC-KOKRS, "ControllingArea
END OF BUS0015_KEY.

* Only for Profit Center
CHECK OBJECTTYPE = 'BUS0015'.

* Change key
CD_KEY = OBJECTKEY.
MOVE-CORRESPONDING CD_KEY TO BUS0015_KEY.
OBJECTKEY = BUS0015_KEY.

ENDFUNCTION.


Ahora la activamos y tenemos que agregarla en la transacción SWED para que haga el mapeo.

Ir a la transacción SWED buscar la linea PRTCR y modificarla agregandole en la columna "modulo funciones" la funcion creada (Z_MAP_KEY_BUS0015).

Si no estuviera la linea PRCTR darla de alta con los valores : PRCTR , CEPCB, CEPCB y tildar al crear, modificar, borrar y en modulo de funciones Z_MAP_KEY_BUS0015.



Luego podemos usar las transacciones KE51, KE52, KCH5N, KE54 y el workflow debe funcionar correctamente.

Una forma de validar la función de mapeo de claves es en el workflow crear una variable de container del tipo estrutura : SWCONT campo : VALUE y la llamamos ObjKey, luego en el evento inicializador del workflow mapeamos el OBJECT_KEY a esa variable. Y la podemos enviar por email asi sabremos si el mapeo es correcto.



Otra forma es monitorear con la transacción SWI3 y ver en la parte que indica "Objetos info referidos hasta la fecha" ahí aparece la clave pasada al workflow.

1 comentario:

Ruben dijo...

Gracias, un artículo muy interesante y creo que me va ha ser util.