viernes, 30 de noviembre de 2007

Error 181 en SMARTFORMS - FORMATTING_ERROR - SSFCOMPOSER

En un listado smartform al ejecutarlo me daba el error :

-------------------------------------------------------------------------------
Excepcion : FORMATTING_ERROR
ID Mensaje : SSFCOMPOSER Numero mensaje : 181
Mensaje :
No existen mas columnas (ver texto explicativo)
-------------------------------------------------------------------------------

En ingles :

Exception FORMATTING_ERROR
Message ID: SSFCOMPOSER Message number: 181
Message :
No other column available (see long text!).
-------------------------------------------------------------------------------



En mi caso el problema era debido a una incongruencia entre la cantidad de celdas (o columnas) dentro de una linea y la definicion de esa linea dentro de la tabla.

Ejemplo :



Se puede ver que para la linea "ITEMS" aparecen 3 celdas (NRO_LINEA, %CELL1, NRO_ITEM)

Pero si vamos a la tabla "DETALLE EKPO" y elegimos la solapa "Tabla" y luego "Details" vemos la definicion de 3 lineas (TITULO, ITEMS, y PIE) en la linea "ITEMS" vemos que solo hay definido dos columnas, una de 5cm y otra de 11cm.
Hay una columna que no esta.



La solucion es borrar la celda de mas o agregarla en la definicion de la tabla.

El error puede reproducirse si se copian las celdas usando el CTRL-C y luego pegandola con CTRL-V, eso agregara una celda nueva como "%CELL1" pero no la agrega a la defincion de la tabla.

Para agregar nuevas columnas se debe ir a la definicion de la tabla y definir una nueva columna completando su tamaño, eso solo generara la linea de celda.

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.

sábado, 10 de noviembre de 2007

Ubuntu : Una palabra africana que significa "Tu particion Solaris sera destruida!!!"



Si!!! Nuevamente mi instalacion Solaris ha sido destruida!!!

La notebook tiene un solo disco rigido con :
1 - Windows XP Home (vino instalado)
2 - Slackware 12
3 - PC BSD 1.3.2
4 - Solaris 10

Como se puede ver a continuacion :
ubuntu@aton:~$ sudo fdisk -l /dev/sda

Disk /dev/sda: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0dbc0dbb

Device Boot Start End Blocks Id System
/dev/sda1 1 3215 25817368+ 7 HPFS/NTFS
/dev/sda2 4278 4788 4095096+ 83 Linux
/dev/sda3 3215 3749 4294080 a5 FreeBSD
/dev/sda4 * 3749 4278 4248720 bf Solaris

El gestor de arranque GRUB del Solaris.

Grabe el nuevo Ubuntu 7.10 live cd, lo inserte en la lectora y reinicie la notebook.
Arranco sin problemas y luego de usarlo durante una hora aproximadamente reinicie desde mi disco rigido. Pero solo obtuve una pantalla negra que decia :
GRUB

Asi que reinicie desde un floppy de 3 1/2" y ejecute el Norton Disk Editor 3.0 y compare la tabla de particion de mi disco rigido contra una copia que tenia guardada en un archivo en ese diskette. Ni un solo byte habia cambiado, asi que el problema era dentro de la particion Solaris.

Reinicie de nuevo desde el LiveCd de Ubuntu 7.10 y detecte que la particion Solaris entera estaba siendo usada como swap por el ubuntu.
En la pantalla que adjunto se puede ver que hay 4 gigas de swap usadas desde la particion 4 (Solaris).





Por que el ubuntu automaticamente sin pedir ningun tipo de confirmacion uso una particion con ID "bf" (nueva particion Solaris) como SWAP?
Quizas porque "Ubuntu" es una palabra africana que significa "Tu particion Solaris sera destruida!!!"

No quiero reinstalar y configurar Solaris 10 nuevamente. Me rindo.

Adios Java Desktop Environment!!! :-(

Technorati Profile