domingo, 28 de septiembre de 2008

Plugin de XFire para Eclipse

Plugin de XFire para Eclipse

El plugin de XFire para Eclipse permite generar código cliente de un Web service a partir de un WSDL (Web Services Description Language).

Para instalar el plugin de XFire para Eclipse hay que seguir los pasos siguientes:
  • Ir al menú "Help", seleccionar "Software Updates" y después acceder a "Find and Install...".
  • Seleccionar "Search for new features to install" y hacer clic en "Next".
  • Seleccionar "New Remote Site" e introducir XFire como "Name" y http://dist.codehaus.org/xfire/update/ como URL.
  • Seleccionar "OK".
  • Seleccionar "Finish".
Una vez instalado, hay que ir al menú "File", seleccionar "New" y después "Other". En la ventana de "New" seleccionar la opción "Code generation from WSDL document" que aparece dentro de "XFire".

Plugin de XFire para Eclipse

Después aparecerá una ventana en la que se solicitará la URL del WSDL, el directorio donde se alojarán las clases generadas y en qué paquete.

Plugin de XFire para Eclipse

Al hacer clic sobre "Finish" se generará el código cliente. Suelen generarse unas 7 clases por Web service, de las que únicamente se utilizarán las *Client y *PortType.

El siguiente ejemplo muestra el uso de la clase generada EchoClient, a partir de la cual se obtiene una instancia de la clase generada EchoPortType, que será desde donde se invocarán los métodos del Web service, en este caso el método echo:
public static void main(String[] args) {
EchoClient client = new EchoClient();
EchoPortType service = client.getEchoHttpPort();
String test = service.echo("Hello World!");
System.out.println(test);   
}
No hay que olvidar incluir en el classpath las librerías commons-httpclient-3.0.jar y commons-codec.jar, ya que son necesarias.

Web services con Spring y XFire

Web services con Spring y XFire

XFire es un framework Java para desarrollo y consumo de Web services. Trabajando junto al framework Spring permite exportar los beans de Spring como Web services, es decir, permite publicar como Web service toda la lógica de negocio de una aplicación sin apenas esfuerzo.

Una vez que XFire (xfire-all-1.2.6.jar) y sus dependencias ya están en el classpath se han de seguir los siguientes pasos:
  • Configurar en el archivo web.xml un DispatcherServlet de Spring para manejar las peticiones HTTP entrantes:
    <servlet>
    <servlet-name>xfire</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
    <servlet-name>xfire</servlet-name>
    <url-pattern>/*</url-pattern>
    </servlet-mapping>
  • Indicar en el archivo web.xml la ubicación del archivo de definición de los beans de Spring:
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    El contenido del archivo applicationContext.xml podría ser el siguiente:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="echoBean" class="example.EchoImpl"/>
    </beans>
  • Configurar en el archivo xfire-servlet.xml un bean XFireExporter para exportar un bean de Spring como Web service:
    <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
    <property name="serviceFactory">
    <ref bean="xfire.serviceFactory"/>
    </property>
    <property name="xfire">
    <ref bean="xfire"/>
    </property>
    <property name="serviceBean">
    <ref bean="echoBean"/>
    </property>
    <property name="serviceClass">
    <value>example.Echo</value>
    </property>
    </bean>
    Las dos primeras propiedades serán fijas en todos los Web services; la propiedad serviceBean contendrá la referencia al bean de Spring (definido en el archivo applicationContext.xml); y en la propiedad serviceClass se indicará el nombre de la interface del servicio.
  • Incluir en el archivo xfire-servlet.xml el siguiente import de Spring:
    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
  • Configurar un HandlerMapping de Spring para dirigir las peticiones que llegan al DispatcherServlet hacia los Web services exportados con el XFireExporter:
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="urlMap">
    <map>
    <entry key="/EchoService"><ref bean="echo"/></entry>
    </map>
    </property>
    </bean>
De esta forma, accediendo a una URL del tipo http://server:port/application/EchoService?WSDL se puede obtener el WSDL (Web Services Description Language) correspondiente al Web service exportado.

sábado, 20 de septiembre de 2008

Cenotes

La península del Yucatán (México), a pesar de ser una región seca y caliza con escasos ríos en la superficie, debido a la porosidad del suelo, el agua de la lluvia se filtra hasta alcanzar el manto freático, originando un sistema de ríos subterráneos que corren a una profundidad media de 20 metros.

Los cenotes, dzonot en lengua maya, son grandes cavidades con acceso a estos acuíferos. Son pozos naturales que se han formado o siguen formándose por las filtraciones del agua de la lluvia que terminan rompiendo la capa calcárea. Su morfología suele ser típicamente subcircular, y con las paredes abruptas.


Cenote Sagrado de Chichén Itzá

Además de depósitos de agua para uso doméstico, los antiguos mayas utilizaron los cenotes con fines religiosos. Los consideraban la puerta de entrada al inframundo, el lugar adonde iban temporalmente los muertos. Mediante el sacrificio de mujeres vírgenes y niños, a los que arrojaban vivos a las aguas oscuras, enviaban mensajes y rogativas a las deidades que lo habitaban y a Chac, el dios de la lluvia.


Cenote Ik-Kil, próximo a Chichén Itzá

Existen varios tipos de cenotes: a cielo abierto, semiabiertos y subterráneos o en gruta. Esta clasificación está directamente relacionada con la edad del cenote, siendo los cenotes maduros aquellos que se encuentran completamente abiertos y los más jóvenes los que todavía conservan su cúpula intacta.

Es frecuente que el agua del mar penetre en estos sistemas fluviales subterráneos, produciendo una haloclina, una capa de la columna de agua en la que la salinidad del agua cambia rápidamente con la profundidad.


Gran Cenote, próximo a Tulum y Cobá

Numerosas agencias en la Riviera Maya han incluido muchas de estas cavidades entre sus atractivos turísticos.

viernes, 19 de septiembre de 2008

Arrecife Mesoamericano

Frente a las costas del mar Caribe se extiende una parte del gran Arrecife Mesoamericano, la segunda barrera de coral más importante del mundo, después de la Gran Barrera de Coral en Australia, y uno de los tesoros naturales más bellos que esconde el mar. También conocido como Sistema Arrecifal Mesoamericano (SAM), se extiende aproximadamente unos 1.000 kilómetros, a lo largo de la costa caribeña de México, Belice, Guatemala y Honduras, concretamente desde la isla Contoy en la punta de la península de Yucatán hasta las Islas de la Bahía en la costa norte de Honduras.


A lo lejos, choque de las olas contra la barrera coralina

En este ecosistema conviven una gran variedad de plantas, peces, corales, esponjas y animales invertebrados. A veces, el arrecife se aproxima tanto a la costa que llega hasta la orilla, como ocurre en el parque Garrafón (isla Mujeres). Lo dio a conocer el comandante Jacques-Yves Cousteau, que anduvo por las costas de Cozumel en los años 60. Buzos, fotógrafos submarinistas y científicos de todo el mundo acuden desde entonces, atraídos por la visibilidad -hasta 60 metros de profundidad en condiciones atmosféricas óptimas- y la agradable temperatura de sus aguas (entre 26 y 28 ºC). Sin embargo, la zona ha sufrido demasiado debido al impacto del turismo, por los huracanes y por la acción del ser humano, que ha llegado a poner en peligro de extinción al coral negro -una especie que se encuentra entre 50 y 100 metros de profundidad-, utilizado para elaborar joyas. Para protegerla se ha creado el Parque Nacional de Arrecifes de Cozumel

La vida de los corales es uno de los procesos más complejos y fantásticos que transcurren bajo las aguas. A primera vista, los arrecifes parecen rocas, sin embargo, son esqueletos calcáreos elaborados por diminutos seres llamados pólipos de coral. A veces, forman intrincadas montañas que en realidad son enormes colonias donde conviven más de 3.000 especies. Una riqueza biológica de la que sacan beneficio los pescadores y la industria farmacéutica, así como el turismo. Los corales frenan la erosión costera, amortiguan el impacto de las olas y son los responsables de esa especie de arena fina y blanca que cubre las playas de la Riviera Maya y que, al estar formadas por partículas de calcio, no queman. Pero el contacto con el ser humano los daña. 

Los corales han sido bautizados atendiendo a su forma. En la costa del Caribe mexicano son comunes los abanicos, los laminados y los candelabros.

domingo, 14 de septiembre de 2008

Juego de Pelota

El Juego de Pelota, en lengua maya pokyab o pok-ta-pok, fue un juego ritual muy extendido por todo Mesoamérica (región del continente americano que comprende la mitad meridional de México; los territorios de Guatemala, El Salvador y Belice; así como el occidente de Honduras, Nicaragua y Costa Rica).

Se practicaba con el fin de conocer el designio de los dioses, para recrear el viaje del sol en el universo, o para simbolizar la lucha entre los opuestos cósmicos. Los jugadores utilizaban un cinturón de cuero de venado con prolongaciones para proteger las caderas, musleras, rodilleras y un guante en la mano izquierda. La pelota era de hule, extraído del látex de varias especies vegetales, pesaba alrededor de 3 kilogramos y tenía un diámetro de 10 a 12 centímetros.


Campo de juego de pelota en Chichén Itzá, el más grande de Mesoamérica


Campo de juego de pelota en Cobá, muy bien conservado

El juego consistía en que la pelota estuviera en constante movimiento, sin rebasar ciertas marcas. La única manera de conseguir el triunfo definitivo era introduciéndola por un anillo de piedra. Algunas prácticas del juego de pelota se recogen en el Popol Vuh, libro sagrado de los mayas.


Anillo de piedra en campo de juego de pelota de Chichén Itzá


Anillo de piedra en campo de juego de pelota de Cobá

Los campos se construían en el interior de las áreas ceremoniales y a veces incluían un altar para el sacrificio, donde en ocasiones se sacrificaba al ganador o se decapitaba a un esclavo como ofrenda a los dioses en memoria de la decapitación de Hun Hunapú, padre de Hunahpú e Ixbalanque, según relata el Popol Vuh. El espacio de juego tenía forma de "I" o de doble "T", incluía muros verticales o tipo talud, con un anillo vertical en cada uno de ellos para hacer pasar la pelota, o un altar que servía de marcador.


Grabado de decapitación en campo de juego de pelota en Chichén Itzá

En el período posclásico (última etapa del desarrollo independiente de la civilización mesoamericana) el juego se había convertido en una actividad profana, y estaba permitido a los asistentes realizar apuestas. No obstante, seguía formando parte de las obligaciones rituales de los gobernantes. Durante la dominación española el juego fue prohibido por el inquisidor Tomás de Torquemada, aunque sin desaparecer del todo.

Actualmente este juego se practica con finalidades turísticas en ciertos lugares de Yucatán (México), como el parque de Xcaret y Cancún.

Agave azul


El Agave azul o agave tequilana es una planta de apariencia similar a los cactus, de color verde grisáceo, en forma de roseta, con hojas rígidas pero carnosas, y con espinas marginales. Se utiliza como única materia prima básica para la elaboración del Tequila, la popular bebida alcohólica mexicana.

Las plantas del género Agave son originarias del continente americano, con la mayor concentración de especies nativas de México en donde se les conoce con los nombres comunes de "magueyes" o "mezcales".

martes, 9 de septiembre de 2008

La ley innata

La ley innata

"Est enim, iudices, haec non scripta, sed nata lex, quam non didicimus, accepimus, legimus, verum ex natura ipsa arripuimus, hausimus, expressimus, ad quam non docti, sed facti, non instituti, sed imbuti sumus."
Marco Tulio CICERÓN
Político, filósofo, escritor y orador romano

Este es el texto que aparece sobre la imagen del Hombre de Vitrubio de Leonardo da Vinci en la portada del nuevo álbum del grupo español de rock Extremoduro que lleva por título "La ley innata". El texto, en latín, es una cita de Marco Tulio Cicerón, en la que habla de la legítima defensa afirmando que es una ley innata, no escrita, que recibimos de la naturaleza:

"En efecto existe, jueces, una ley no escrita, sino innata, la cual no hemos aprendido, heredado, leído sino que de la naturaleza hemos tomado, extraído, exprimido, para la que no hemos sido educados, sino hechos, y para la que no hemos sido instruidos, sino impregnados."

domingo, 7 de septiembre de 2008

Valladolid

Valladolid es una ciudad ubicada en el estado mexicano de Yucatán. Esta ciudad de tinte colonial, corte provinciano y ambiente maya se está convirtiendo en un destino clave para los viajeros independientes que recorren Yucatán. En los alrededores se pueden visitar cenotes, cuevas y sitios arqueológicos como Chichén Itzá (50 kilómetros) o Cobá (30 kilómetros).


Catedral de San Servacio o San Gervasio

Poco a poco, el trabajo de restauración está devolviendo al casco histórico de Valladolid la imagen colonial que tuvo en otro tiempo. La mayoría de las casas, de una sola altura, luce tonos pastel en las fachadas, en las que se abren los típicos ventanales protegidos por enrejados. Pero más que la arquitectura civil, lo que resalta en Valladolid son sus edificios religiosos.


Catedral de San Servacio o San Gervasio

La Catedral de San Servacio o San Gervasio, la más famosa e importante, fue construida en el siglo XVI, pero tuvo que ser levantada de nuevo en el siglo XIX. Durante la mal llamada guerra de las Castas, que se inició precisamente en esta ciudad en 1849, fue saqueada. A ese levantamiento indígena -duró hasta el año 1910- le rinden homenaje los murales del vecino Palacio Municipal, que también recuerdan otros episodios de la historia de México.


Palacio Municipal

Cobá

Cobá fue una ciudad del imperio maya localizada en el actual estado mexicano de Quintana Roo. Es uno de los sitios arqueológicos más importantes de la región, donde se encuentra la pirámide más alta de la Península de Yucatán, Nohoch Mul, de 42 metros de altura y 120 escalones.

Cobá

Rodeada por la selva y situada en medio de una zona lacustre, Cobá ejerció un dominio económico, político y comercial sobre gran parte del territorio actual de Quintana Roo y parte de Yucatán, lo que la hizo rivalizar con Chichén Itzá.

Estuvo poblada por casi 50.000 habitantes y llegó a tener una extensión de 80 kilómetros cuadrados de los que sólo se han explorado 6. El resto se anuncia por la multitud de montículos coronados por árboles y plantas de la selva, dispersos en los alrededores. Si no se ha seguido excavando es por el desastre ecológico que supondría talar la selva asentada sobre la antigua ciudad.



Desde Cobá parten 45 sacbés ("camino blanco"), que son caminos elevados cubiertos por estuco blanco o cal de entre 4 y 20 metros de ancho y hasta 300 kilómetros de largo que la comunicaban con otras ciudades. El que la unía con Yaxuná, de 101 kilómetros, fue durante mucho tiempo considerado el más largo del mundo maya.

Cobá

Después de un largo período de disputas con Chichén Itzá, en la que ésta última salió vencedora, Cobá se mantuvo en segundo plano.

Chichén Itzá

Chichén Itzá (Yucatán, México), cuyo nombre significa "la ciudad al borde del pozo de los Itzaes", es uno de los principales sitios arqueológicos de la cultura maya, una de las más importantes civilizaciones prehispánicas, aunque al pertenecer a la época de declive de la misma no se puede considerar como uno de sus máximos exponentes, puesto que no se encuentran muestras de escritura maya y la arquitectura es más propia del valle de México que de la cultura maya.

Chichén Itzá

La construcción más emblemática de Chichén Itzá es el Castillo o Templo de Kukulcán, una pirámide de base cuadrada de nueve niveles. Debido a la orientación que tiene el edificio y a los diversos elementos que lo integran, se le ha relacionado con un enorme calendario. A esta conclusión se llega después de un cálculo matemático: por cada una de las cuatro caras asciende una escalera de 91 peldaños; sumados darían un total de 364; pero añadiendo el templete superior al que conducen, se alcanza la cifra de 365, los días del año solar. Esto puede parecer una coincidencia, a no ser por otros detalles que señalan la llegada de los equinoccios. En esas fechas, los rayos del sol, al incidir sobre una de las aristas, proyectan una serie de triángulos de sombra sobre la escalinata iluminada correspondiente. Ese juego de luces y sombras parece el cuerpo de una serpiente que acaba justo sobre la cabeza de la misma, construida al pie de la escalinata. Este fenómeno, bautizado como “el descenso de Kukulcán” o “de la serpiente emplumada”, marca el cambio de estaciones, período importantísimo para la agricultura en Yucatán, ya que indica la llegada de las lluvias.

En el año 2006 una mujer norteamericana falleció al caerse por la escalinata de la pirámide, lo que provocó que se prohibiese la subida al Castillo.

Chichén Itzá

Otros puntos de interés en Chichén Itzá son el Templo de los Guerreros, el Grupo de las Mil Columnas, el Observatorio El Caracol, el Cenote Sagrado y el Juego de Pelota.

Chichén Itzá fue declarada Patrimonio de la Humanidad por la UNESCO en 1988 y el 7 de Julio de 2007 fue reconocida como una de la Siete maravillas del mundo moderno, por una iniciativa privada sin el apoyo de la UNESCO, pero con el reconocimiento de millones de votantes alrededor del mundo.

Lorem Ipsum

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nunc urna elit, convallis eu, vulputate sed, faucibus in, dolor. Morbi quis odio ac quam consectetuer ultrices. Curabitur augue. Mauris egestas erat sed elit molestie congue. Duis nisi mauris, consequat ac, rhoncus hendrerit, facilisis sed, nulla. Etiam dui tellus, mollis vel, consectetuer vitae, cursus eget, lacus. Quisque feugiat risus fermentum leo. Fusce vel ante ut libero pharetra ultricies. Curabitur nec ipsum. Morbi accumsan, nunc commodo condimentum pharetra, turpis enim vehicula mi, sed luctus erat mi non pede. Donec nec ipsum. Aliquam urna elit, lobortis vel, tempus eget, lobortis vitae, lorem. Aliquam erat volutpat.

Nulla mattis. Morbi consectetuer justo sagittis metus. Integer eget purus et mi congue porta. Sed lobortis rutrum tortor. Morbi placerat. Quisque varius purus in lectus. Phasellus blandit porta elit. Sed ut leo id erat convallis dapibus. Donec varius pretium leo. Integer mollis, dui non aliquam feugiat, nulla leo pellentesque magna, a dapibus turpis mi sed felis. Vestibulum sed arcu. Suspendisse auctor magna et enim. Sed faucibus pellentesque turpis. Morbi pharetra placerat mi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla facilisi. Aenean scelerisque elit ac justo. Aliquam tristique ante nec risus. Quisque pulvinar congue turpis. Phasellus arcu arcu.

Lorem Ipsum ha sido el texto de relleno estándar utilizado por las industrias en imprentas y archivos de texto desde el año 1500, cuando un impresor desconocido usó una galería de textos y los mezcló de tal manera que logró hacer un libro de textos espécimen. No sólo ha sobrevivido 500 años, sino que también ha sido utilizado como texto de relleno en documentos electrónicos, quedando esencialmente igual al original. Fue popularizado en los años 60 con la creación de las hojas "Letraset", y más recientemente con software de autoedición, como por ejemplo Aldus PageMaker.

El texto de Lorem Ipsum no es texto aleatorio. Tiene sus raíces en una pieza clásica de la literatura del latín, que data del año 45 antes de Cristo, haciendo que éste adquiera más de 2000 años de antigüedad.

Es un hecho establecido que el lector se distrae con el contenido del texto de un sitio mientras que mira su diseño. El punto de usar Lorem Ipsum es que tiene una distribución más o menos normal de las letras, al contrario de usar textos como por ejemplo "Contenido aquí, contenido aquí".

SAP Java Connector

SAP Java Connector

SAP Java Connector (SAP JCo) es un componente middleware que permite el desarrollo en Java de componentes y aplicaciones compatibles con SAP. SAP JCo soporta la comunicación con un servidor SAP en ambas direcciones: llamadas de entrada, en las que un cliente Java externo se comunica con la BAPI (Business Application Programming Interface) o con los RFM (Remote Function Modules) de SAP; y llamadas de salida, donde desde ABAP (Advanced Business Application Programming) se establece una comunicación con un servidor Java externo.

Cuando desde una aplicación Java se invoca un método de la JCo Java API (Application Programming Interface), éste accede a la librería CPI-C siendo convertido en una RFC (Remote Function Call) utilizando JNI (Java Native Interface) y enviado al sistema SAP. CPI-C (Common Programming Interface for Communications) es una interfase estandarizada de comunicación entre programas creada por IBM que consiste en un conjunto de llamadas con las que dos programas pueden comunicarse mutuamente.

SAP Java Connector

Para iniciar el desarrollo con JCo, desde service.sap.com/connectors se puede descargar un archivo .zip que contiene los archivos de instalación de JCo. Se solicita usuario y contraseña registrados en SAP Service Marketplace.

Una vez descargado, el contenido del archivo .zip debe extraerse dentro de un directorio (por ejemplo C:\SAPJCo). El contenido del archivo .zip son los archivos sapjco3.jar y sapjco3.dll (en Linux libsapjco3.so), los javadocs de SAP JCo y algunos ejemplos de uso. El archivo sapjco3.jar debe estar incluido en el classpath de todos los proyectos que deseen utilizar SAP JCo.

Ejemplo de aplicación que accede al listado de materiales de SAP:
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
import com.sap.conn.jco.AbapException;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoTable;
import com.sap.conn.jco.ext.DestinationDataProvider;

public class ServiceOneSap {
static String ABAP_AS = "ABAP_AS_WITHOUT_POOL";
static String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";

static {
Properties connectProperties = new Properties();

connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxx.xxx.xxx.xxx");
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx");
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx");
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "xxxxxxxx");
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxxxxx");
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "xx");
createDataFile(ABAP_AS, "jcoDestination", connectProperties);

connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");
createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
}

static void createDataFile(String name, String suffix, Properties properties) {
File cfg = new File(name + "." + suffix);
if (!cfg.exists()) {
try {
FileOutputStream fos = new FileOutputStream(cfg, false);
properties.store(fos, "for tests only !");
fos.close();
} catch (Exception e) {
throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
}
}
}

public static void MaterialList() throws JCoException {
JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);

JCoFunction function = destination.getRepository().getFunction("BAPI_MATERIAL_GETLIST");
if (function == null) {
throw new RuntimeException("BAPI_MATERIAL_GETLIST not found in SAP.");
}
try {
function.execute(destination);
} catch (AbapException e) {
System.out.println(e.toString());
return;
}

JCoTable selectionTable = function.getTableParameterList().getTable("MATNRSELECTION");

selectionTable.appendRow();
selectionTable.setValue("SIGN", "I");
selectionTable.setValue("OPTION", "CP");
selectionTable.setValue("MATNR_LOW", "*"); 

function.execute(destination);

JCoTable dataTable = function.getTableParameterList().getTable("MATNRLIST");

for (int loop = 0; loop < dataTable.getNumRows(); loop++){
System.out.println(dataTable.getValue("MATERIAL") + "\t" + dataTable.getValue("MATL_DESC"));
dataTable.nextRow();
}
}

public static void main(String[] args) throws JCoException {
MaterialList();
}
}
En el ejemplo, la configuración de acceso al servidor SAP se almacena en un archivo que es utilizado por el programa. Por razones de seguridad, es recomendable evitar esta práctica. Se configuran dos accesos o destinos, uno directo (ABAP_AS) y otro con pool (ABAP_AS_POOLED).
static String ABAP_AS = "ABAP_AS_WITHOUT_POOL";
static String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";

static {
Properties connectProperties = new Properties();

connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxx.xxx.xxx.xxx");
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx");
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx");
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "xxxxxxxx");
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxxxxx");
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "xx");
createDataFile(ABAP_AS, "jcoDestination", connectProperties);

connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");
createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
}

static void createDataFile(String name, String suffix, Properties properties) {
File cfg = new File(name + "." + suffix);
if (!cfg.exists()) {
try {
FileOutputStream fos = new FileOutputStream(cfg, false);
properties.store(fos, "for tests only !");
fos.close();
} catch (Exception e) {
throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
}
}
}
Lo primero que hay que hacer, obviamente, es conectar con SAP. En el ejemplo se utiliza la conexión con pool.
JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
A continuación, hay que ejecutar una función de la BAPI, en este caso BAPI_MATERIAL_GETLIST.
JCoFunction function = destination.getRepository().getFunction("BAPI_MATERIAL_GETLIST");
if (function == null) {
throw new RuntimeException("BAPI_MATERIAL_GETLIST not found in SAP.");
}
try {
function.execute(destination);
} catch (AbapException e) {
System.out.println(e.toString());
return;
}
Una vez llamada la función de la BAPI, hay que acceder a las tablas correspondientes para obtener la información deseada. En este caso, primero hay que acceder a la tabla de selección (MATNRSELECTION) y después a la tabla de datos (MATNRLIST).
JCoTable selectionTable = function.getTableParameterList().getTable("MATNRSELECTION");

selectionTable.appendRow();
selectionTable.setValue("SIGN", "I");
selectionTable.setValue("OPTION", "CP");
selectionTable.setValue("MATNR_LOW", "*");   

function.execute(destination);

JCoTable dataTable = function.getTableParameterList().getTable("MATNRLIST");
Para acceder a la tabla de selección se deben configurar una serie de parámetros y volver a ejecutar la función de la BAPI. Los parámetros de selección son los siguientes:
  • SIGN. Criterios de inclusión / exclusión para tablas: I (Inclusión), E (Exclusión).
  • OPTION. Operador de selección: EQ (Equal), NE (Not Equal), BT (BeTween), NB (Not Between), LT (Less Than), LE (Less Equal), GT (Greater Than), GE (Greater Equal), CP (Contains Pattern), NP (Not contains Pattern).
  • LOW: Límite menor del rango de datos.
  • HIGH: Límite mayor del rango de datos.
En el ejemplo se consultan todos los materiales, puesto que se utiliza la opción de Inclusión con el operador de selección CP (Contiene patrón) y se está indicando el patrón "*". Se podría también hacer una consulta de un rango de materiales (entre el 1000 y el 2000, por ejemplo) utilizando el operador de selección BT e indicando los rangos inferior y superior.
selectionTable.setValue("SIGN", "I");
selectionTable.setValue("OPTION", "BT");
selectionTable.setValue("MATNR_LOW", "1000"); 
selectionTable.setValue("MATNR_HIGH", "2000");

 

RSS RSS