ABAP OO – Tutorial ALV Simple
Este tutorial explica y demuestra mediante un ejemplo el uso de ALV's en desarrollos a medida en el Sistema SAP. En mi caso prefiero los ALV Orientados a Objetos y además añado una capa de Objetos que
representan y permiten la interacción entre la visualización y los datos de la base de datos. Para el tutorial utilizaré el modelo de datos de Test de Vuelos y Aerolíneas (Tablas SFLIGHT, ...) que SAP proporciona de forma estándar como DEMO para las pruebas en desarrollos.
Para rellenar el modelo DEMO de tablas de SAP con datos podemos usar el programa estándar SAPBC_DATA_GENERATOR, detallado en la documentación de SAP que podemor ver en este enlace.
El siguiente diagrama muestra la forma de separar los datos mediante objetos que aplico en mis desarrollos ABAP.

Upload your data disks to Cloudstack
I had these qcow2 volumes from test I did in the past that I wanted to import into Cloudstack. In CS you have the option to import ISO and templates via http download from a provided link, but you cannot do that with volumes. Actually I'd love to see this feature with snapshots, so once you have uploaded a snapshot it can be converted to a disk or to a template, but that's not possible by now.
So, this is what I did to import my existing volumes into Cloudstack
Añadir tus discos de datos a Cloudstack
Tenía por ahí unos cuantos volúmenes en formato qcow2 de unas pruebas que estuve haciendo con Proxmox. Unos corresponden a una VM con Ubuntu y Orchestra server para provisionar servidores vía PXE, y tenía la intención de migrarlas al Cloudstack (CS + KVM) para provar si una VM se puede arrancar por red.
En este caso, añadir el volumen correspondiente al SO es sencillo. Basta con ponerlo en un servidor http y pasarle el link a la opción "Add template" de cloudstack. Él solito lo descargará y lo pondrá a punto. Con ese nuevo template podremos arrancar el servidor. ¿Pero que pasa si el servidor tiene volúmenes de datos adicionales?
Clúster de PostgreSQL en Linux
Basado en hechos reales. El tema es que tuve que montar un clúster activo/pasivo de PostgreSQL con Corosync/Pacemaker y DRBD. Cómo es de esas cosas que me gustan y no hago a menudo, lo apuntaré aquí por si os apetece usarlo. El trabajo está basado en un howto que encontré hace tiempo, pero no puedo encontrar el enlace (si alguien lo reconoce que avise, que lo actualizaré).
En este ejemplo, los sistemas usados son SLES 11 SP1, pero es aplicable a cualquier distribución (sólo tendréis que vigilar con los nombres de los paquetes).
¿Listos? Púes coged un café que es larguito...
Mostrar Errores Estándar en un POPUP
Cada vez que ejecutamos un módulo de funciones estándar es habitual que dicho módulo retorne una tabla de mensajes. Esta tabla de mensajes nos indicará si la ejecución ha ido bien o en caso contrario los errores que se han producido.
En nuestros programas es habitual que tengamos que mostrar un log de errores a los usuarios una vez han ejecutado una funcionalidad. Como no queremos construir una ventana a medida para mostrar los errores, podemos utilizar la siguiente función estándar que hace dicho trabajo por nosotros:
C14ALD_BAPIRET2_SHOW
Si rellenamos la tabla de tipo BAPIRET2, y ejecutamos el módulo de funciones podremos ver el siguiente resultado:
Ayuda Z para un campo en una Screen
Si necesitamos añadir una ayuda para búsqueda sobre un campo que facilite la entrada de datos a los usuarios, pero los datos que necesitamos añadir para la selección los queremos fijar nosotros, podemos usar el siguiente código ABAP:
* Declaraciones de Variables **************************** TYPES: BEGIN OF ty_fields. INCLUDE STRUCTURE help_value. TYPES: END OF ty_fields. TYPES: BEGIN OF ty_helptab, feld(50), END OF ty_helptab. DATA: it_centro TYPE TABLE OF t001w, et_centtro LIKE LINE OF it_centro, it_fields TYPE TABLE OF ty_fields, et_fields LIKE LINE OF it_fields, it_helptab TYPE TABLE OF ty_helptab, et_helptab LIKE LINE OF it_helptab. * Variables para Tablas de Información (F1) de Ayuda de Usuario. DATA: gv_tabla_f1 LIKE help_info-tabname, gv_campo_f1 LIKE help_info-fieldname. * Asociar Ayuda a un Campo de la Pantalla de Selección *************************************************************** * Variable de la Pantalla para la Ayuda AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_werks. PERFORM prepara_ayuda_centro_z. PERFORM ayuda USING 'Centros de 0 a 100' CHANGING p_centro. * Rutina de Carga de Datos de la Ayuda *************************************************************** FORM prepara_ayuda_centro_z. * Campo que se muestra en el F1 gv_campo_f1 = 'WERKS'. gv_tabla_f1 = 'T001W'. FREE it_ihelp_fields. CLEAR: et_fields, it_fields[]. et_fields-tabname = 'T001W'. " Tabla de referencia del campo et_fields-fieldname = 'WERKS'. " Campo para mostrar en la ayuda et_fields-selectflag = 'X'. " Flag de Retorno del Campo APPEND et_fields TO it_fields. * Para mostrar otro campo, en este caso la Descripción et_fields-tabname = 'T001W'. " Tabla de referencia del campo et_fields-fieldname = 'NAME1'. " Descripción et_fields-selectflag = ''. " Sin Retorno APPEND et_fields TO it_fields. CLEAR : it_helptab[], it_centro[]. SELECT werks name1 FROM t001w INTO CORRESPONDING FIELDS OF TABLE it_centro WHERE werks BETWEEN '0' AND '100' ORDER BY werks ASCENDING. * Rellena la Tabla de Valores de uno a uno en orden LOOP AT it_centro INTO et_centro. et_helptab-feld = et_centro-werks. APPEND it_helptab. et_helptab-feld = et_centro-name1. APPEND et_helptab TO it_helptab. ENDLOOP. ENDFORM. * Rutina Lanzador de la Ayuda *************************************************************** FORM ayuda USING p_titulo CHANGING p_return. CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE' EXPORTING TITEL = p_titulo fieldname = gv_campo_f1 tabname = gv_tabla_f1 IMPORTING SELECT_VALUE = p_return TABLES FIELDS = it_fields VALUETAB = it_helptab EXCEPTIONS FIELD_NOT_IN_DDIC = 1 MORE_THEN_ONE_SELECTFIELD = 2 NO_SELECTFIELD = 3 OTHERS = 4. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM.
Convertir Importes de Carácter a Decimal
La conversión de importes en ABAP es un poco liosa y se generan dumps a menudo debido a una mala conversión de importes recibidos en formato carácter o String. En ABAP los importes se guardan en un tipo CURRENCY, es decir, un número decimal.
Si queremos convertir de formato carácter a un formato CURRENCY, como por ejemplo el elemento de datos DMBTR de la tabla estándar de posiciones contables FI de SAP podemos usar el siguiente código para convertir las variables:
" Quito el separador REPLACE ALL OCCURRENCES OF '.' IN string_importe WITH space. " Elimino Posibles Espacios CONDENSE string_importe NO-GAPS. " Convierto a DMBTR que es una variable ABAP de tipo decimal " para importes, concretamente de posiciones de documentos FI PACK string_importe TO dmbtr.
Mirror de repositorios con apt-mirror
Respecto a lo que os comentaba el otro dia, el provisionamiento de servidores con Cobbler, me di cuenta de una cosita.
Al instalar un CentOS, la instalación era realmente muy rápida (un sistema base). Pero, al instalar Ubuntu, los tiempos de descarga se notaban. No es que sea un problema exasperante, pero si que era notablemente superior.
Para solucionar este tema, he visto un par de opciones que me he decidido a probar. Una de ellas es apt-mirror. Básicamente lo que hace es crear un mirror local de los repositorios Debian / Ubuntu que le configuremos. De ese modo, podemos usar tal mirror para las instalaciones de manera que la descarga de contenidos sea a velocidades de LAN.
Provisionamiento de servidores Linux
Una de las últimas cosas que me miré en UPCnet y que intenté entender fué el uso de cobbler para el aprovisionamiento de servidores. El caso es que en el servidor que uso en casa a modo de laboratorio he instalado Proxmox para usar VM's con KVM y no tengo directamente disponible la opción de clonar imágenes de disco para clonar plantillas de servidores. Bueno, la opción está, pero vía comandos y sin "personalización" en tiempo de deploy.
Así pués, retomé el tema de cobbler en casa. Supongo que para ninguno es nuevo el tema del arranque de servidores vía PXE para instalar SO, etc. Cobbler se ocupa de generar los ficheros de arranque PXE para poder hacer el provisionamiento de servidores mucho más dinámico. En mi caso, uso para el DNS y el DHCP el programa dnsmasq, que es más que suficiente para un entorno pequeño, pero cobbler es capaz de gestionar él mismo un servidor DHCP ISC o un servidor Bind para el DNS.
A grandes rasgos, lo que haremos con cobbler es importar una série de distros que luego podrán ser servidas por red para instalar en servidores nuevos. Estas instalaciones se pueden parametrizar a su vez vía kickstart o preseed, de manera que teniendo algunas plantillas podemos simplemente crear nuevas VM que arranquen por red y esperar a que finalice la instalación.
Probé cobbler sobre un CentOS 6, pero encontré un problema a la hora de importar la distro de ubuntu (creo que se ha abandonado el soporte para Debian/Ubuntu en cobbler, ¿puede ser?). Así pués, he cambiado el servidor donde tenía el cobbler por un Ubuntu Server 11.10 donde he instalado Orchestra, que a grandes rasgos es un conjunto de paquetes para el provisionamiento de servidores Ubuntu. Orchestra está basado en cobbler, pero como está distribuido por Ubuntu, si que podemos importar la ISO (faltaría mas).
Lo iremos probando.
Puppet + Ruby + Foreman + Passenger “all in one” “superfast”
Mira tu!
Un tutorial para instalar Puppet, ruby, passenger y Foreman en un RHEL (o basado en). Es muy express sin dar muchos detalles, pero una buena guía de instalación.
http://miao5.blogspot.com/2010/01/setup-puppetmaster-foreman.html
Saludos!
“5 bad checksums” dhclient en Ubuntu
Últimamente me he estado peleando con ciertas plataformas de virtualización... bueno básicamente 2, XenServer y KVM.
Uno por motivos profesionales, haciendo el deploy de un cloud usando Cloudstack + XenServer en UPC y el otro en casa, haciendo pruebas.
El caso es que con ambos me he encontrado un problema con las máquinas virtuales Ubuntu confiugradas para adquirir una IP via DHCP. Después de unos cuantos intentos nos aparece un mensaje. Algo como...
"5 bad checksums in last 5 udp responses" (edito cuando tenga el mensaje literal).
En su día encontré esto identificado como un "known issue" en XenServer (aqui). El caso es que la versión del ISC DHCP client que usan en ubuntu carece de un parche que soluciona este problema (y que si que se incorpora en distros basadas en RHEL (RHEL, CentOS, Fedora...)). Hay dos opciones. Una es usar el paquete del cliente DHCP de una de estas distros en Ubuntu (ya os aviso que el rpm tal cual no anda, por dependencias y rutas de archivos incorrectas), o, en el servidor DHCP ejecutar:
ethtool -K etho tx off
De este modo, se deshabilita el checksumming de UDP en la interfaz eth0 (asumiendo que servis el DHCP por esa interfaz, si no, usad la interfaz que os convenga). El cambio es immediato y veremos que las MV con Ubuntu ya cogen IP.
En el caso de KVM lo estoy probando con una VM que he creado, por lo que he añadido esta línea directamente en el archivo /etc/rc.local para que se ejecute en cada reinicio.
En el caso de cloudstack, ya que los routers virtuales que sirven DHCP se crean automáticamente a partir de una plantilla base + scripts de configuración, lo que hice fué seguir éste procedimiento para modificar la ISO que contiene los scripts de inicio de las MV de sistema, y añadir en el correspondiente /etc/rc.local el comando que os pongo arriba.
Saludos!
Proxmox VE beta 2.0
Hola!
Buff cuanto tiempo sin escribir... Me da hasta pereza... Bueno a lo que venía.
Hace ya un tiempo os hablé de Proxmox VE, y por lo que veo, era la versión 1.6. El otro día me acordé de él haciendo más pruebas para el mini laboratorio que tengo en casa y me encontré con que hay una beta de la versión 2.0. Por cierto el laboratorio ya no es ESXi desde hacía algun tiempo (cambié a XenServer 5.6 y después a un intento fallido de OpenStack)
A parte de nuevas versiones de paquetes y que está basado en Debian 6, lo que más llama la atención de Proxmox VE 2 es el rediseño de la interfaz. No se a cuantos os pasaba como a mi, pero la verdad es que la interfaz de la serie 1.X es bastante horrenda. Funcional, muy funcional, pero fea hasta con avaricia.
Por el resto de cosas, no veo muchos cambios a nivel funcional respecto a la serie 1.x (no probé mucho aquella y llevo poco con ésta) aunque es muy posible que la implementación interna sea distinta.
Usar qemu-img para convertir las imagenes de XenCenter (VHD) a imagenes raw o qcow2 para KVM también fué un plisplas.
En definitiva. Si tenéis poco presupuesto para virtualización y no requerís de muchas florituras, Proxmox es muy buena opción (no uséis la 2.0 en producción ya que aún está un poco verde, pero con la 1.9 podréis hacer, a grandes rasgos, lo mismo).
Ah, si usáis Ubuntu 11.10 con Firefox y no os funciona la consola web en la beta 2.0, echadle un ojo a ésta página.
Acceso a la pila de Memoria de Ejecución ABAP o Hachazo
El sistema SAP está basado en un código de programación estático que puede ser personalizado y adaptado en puntos especificos del proceso de ejecución. Esto es que SAP nos permite escribir código ABAP en ciertos puntos de ejecución del proceso estándar para adaptarlo a las necesidades del cliente.
En muchas ocasiones, cuando estamos programando una Exit, dentro de la exit no tenemos acceso a todos los datos necesarios para llevar a cabo la tarea o decisión que tiene como objetivo la exit en cuestión.
Para solucionar este problema de datos, mediante debugging de la exit, podemos acceder a la pila de memoria ABAP de ejecución del programa estándar que estamos adaptando, y en este punto rastrear los datos que necesitamos a lo largo de las diferentes llamadas de programa que sean realizado durante el proceso estándar.



