lunes, 30 de junio de 2008

Como fusionar datos de varias tablas : INNER JOIN

La sentencia JOIN en SQL permite combinar registros de dos o más tablas en una base de datos relacional. En el Lenguaje de Consultas Estructurado (SQL), hay tres tipo de JOIN: interno, externo, y cruzado.

En casos especiales una tabla puede unirse a sí misma, produciendo una auto-combinación, SELF-JOIN.

Matemáticamente, JOIN es composición relacional, la operación fundamental en el álgebra relacional,y generalizando es una función de composición

Combinación interna (INNER JOIN) Con esta operación es calculado el producto cruzado de todos los registros; así cada registro en la tabla A es combinado con cada registro de la tabla B; pero sólo permanecen aquellos registros en la tabla combinada que satisfacen las condiciones que se especifiquen. Este es el tipo de JOIN más utilizado por lo que es considerado el tipo de combinación predeterminado.

SQL:2003 especifica dos formas diferentes para expresar estas combinaciones. La primera, conocida como explícita usa la palabra JOIN, mientras que la segunda es implícita y usa ',' para separar las tablas a combinar en la sentencia FROM de la declaración SELECT. Entonces siempre se genera el producto cruzado del cual se seleccionan las combinaciones que cumplan lo que indica la sentencia WHERE.

Es necesario tener especial cuidado cuando se combinan columnas con valores nulos NULL ya que el valor nulo no se combina con otro valor o con otro nulo, excepto cuando se le agregan predicados tales como IS NULL o IS NOT NULL.

Como ejemplo, la siguiente consulta toma todos los registros de la tabla Empleado y encuentra todas las combinaciones en la tabla Departamento. La sentencia JOIN compara los valores en la columna IDDepartamento en ambas tablas. Cuando no existe esta correspondencia entre algunas combinaciones, éstas no se muestran; es decir que si el número de departamento de un empleado no coincide con los números de departamento de la tabla Departamento, no se mostrará el empleado con su respectivo departamento en la tabla resultante.



Regresa una consulta combinando los datos de 2 tablas

A. INNER JOIN EXPLICITA


select [campo1,campo2]
from tabla1
inner join tabla2
on (tabla1.campo=tabla2.campo)
where tabla1.campox=dato1
and tabla1.campox=dato2


selecciona [campo1,campo2]
desde tabla1
ir dentro tabla2
en (tabla1.campo=tabla2.campo)
donde tabla1.campox=dato1
y tabla1.campox=dato2


B. INNER JOIN IMPLICITA

select tipo_trans, T010001a.codigo,T010001.cuenta
from T010001
inner join T010001a
on(T010001.codigo=T010001a.codigo)
where T010001.nremesa=72505
and T010001.nmensajeria=10
and T010001.cuenta='070123100125070001413'


A. Ejemplo de la sentencia INNER JOIN explícita:

SELECT *
FROM base
INNER JOIN bodega
ON base.IDbodega = bodega.IDbase
B. Ejemplo de la sentencia INNER JOIN implícita:

SELECT *
FROM empleado, departamento
WHERE empleado.IDdepartamento = departamento.IDDepartamento

Resultados:


El empleado Gaspar y el departamento de Marketing no son presentados en los resultados ya que ninguno de éstos tiene registros correspondientes en la otra tabla. No existe un departamento con número 36 ni existe un empleado con número de identificación 35


Enlaces:
http://es.wikipedia.org/wiki/JOIN#Combinaci.C3.B3n_interna_.28INNER_JOIN.29

martes, 17 de junio de 2008

Clase generica de Conexion a Bases de datos

Una clase Generica de conexion a bases de datos

Una clase generica que realiza una conexion a bases de datos mysql, la cual esta declarada dentro del paquete conexion, recibe cuatro parametros:
String ip, String bd, String usr, String pass, los cuales se pueden enviar desde otra clase en donde se mande llamar... ejemplo

GenericaDb qpn = new GenericaDb("192.168.54.2","listadb","admin","4dm1n1str");

despues se puede acceder a los elementos de la clase de la siguiente forma:

//Para obtener la conexion
Connexion conexion = qpn.getConexion();




package conexion;

/****************************************
* *
* @author Marco A. Trejo Lemus *
* 17/06/2008 09:47:01 AM *
****************************************/

import java.sql.*;


public class GenericaDb
{
public String driver,url,ip,bd,usr,pass;
public Connection conexion;


public GenericaDb(String ip, String bd, String usr, String pass)
{ driver="com.mysql.jdbc.Driver";
this.bd = bd;
this.usr = usr;
this.pass = pass;
url = new String("jdbc:mysql://"+ip+"/"+bd);
try
{ Class.forName(driver).newInstance();
conexion=DriverManager.getConnection(url,usr,pass);
System.out.println("Conexion a Base de Datos "+bd+" Ok");
}

catch (Exception exc)
{ System.out.println("Error al tratar de abrir la base de Datos"+bd+" : "+exc);
}
}

public Connection getConexion()
{ return conexion;
}

public Connection CerrarConexion() throws SQLException
{ conexion.close(); conexion = null;
return conexion;
}

} //fin de la clase

martes, 10 de junio de 2008

Analisis de la creacion de un web service ...continuacion...

Definir el problema:
Que?
1.- Conexion con clases a bases de datos de manera local
2.- Que se publique un metodo para acceso a bases de datos en un webservice que pida
parametros de entrada y regrese un objeto Resultado
3.- Que se conecte desde un cliente al metodo del webservice
4.- Que el metodo del cliente se llame desde jsps y consulte la base de datos en el servidor, y obtenga el resultado


Actualmente estoy desarrollando con tecnologia netbeans 6.1 - jax-ws 2.0 - metro -grassfish V2 un web service para la empresa donde laboro, despues de una ardua investigacion y muchos ejercicios he logrado publicar mi webservice con un metodo que me pedian, dejenme comentarles que en este web service tengo las clases divididas en 3 paquetes

1.-Conexion
2.-Servidor
3.-Tipos de datos

En el 1er paquete tengo clases para acceder a 2 bases de datos hechas en mysql donde tambien tengo las consultas que envian los resultados de tipo entero o string al webmethod del webservice

En el 2o paquete tengo el Metodo del Web Service

En el 3er paquete tengo clases que definen el tipo de dato que sera devuelto al usuario

La cuestion que se me presento es que me era necesario regresar un tipo de dato al cliente en donde vaya un entero y un string, lo he implementado mediante una clase llamada Resultado y me ha funcionado bien, acerca de como podra acceder el cliente es sencilla mediante su codigo fuente

String strdescripcion = Resultado.getString(strcadena);

En este caso, teniendo en cuenta que, dado que estamos en un ambiente de Arquitectura Orientada a Servicios, mi Servicio proporciona en la parte cliente las clases propias (desde la que accedas al port,hasta las clases que permiten usar los tipos de datos de vuelta

Al devolver un tipo compuesto por un String y un entero, bien. Se crea una clase, Resultado añadiendole campos de esos tipos y se trata como objeto en mi webservice a todos los efectos, el cliente al hacer uso de estas clases mediante el webservice de jax-ws puede hacer utilizarlo en su código fuente

*********

En la actualidad el proceso del webservice esta de la siguiente manera:
*****

@Webmethod
int intNremesa
int intNMensajeria
EscanelInicial lstEscaneoInicial
String strUsuario
String strClave

En donde lstEscaneoInicial es un arreglo de tipo objeto que recibire de parte del cliente con un string dentro este parametro es parte de una clase EscaneoInicial tipo Serializable, la clase la tengo declarada en mi Servidor
*****

El servidor:
Procesa parametros
y realiza consultas,
updates,inserts
*****

Responde con un objeto
de tipo Resultado:
*****
Resultado result;

result tiene:

int intNstatus
String strDescripcion
Cuentas lstCuentas(array)

el arreglo lstCuentas es un arreglo de tipo objeto que pertenece a la clase Cuentas la cual esta declarada de la siguiente forma:

Cuentas: strCuenta intNstatusCta

Entonces lstCuentas contendria: lstCuentas={1,.,.,.,.n}

es decir:
lstCuentas[1]: strCuenta intNstatusCta
lstCuentas[2]: strCuenta intNstatusCta
lstCuentas[3]: strCuenta intNstatusCta
lstCuentas[n]: strCuenta intNstatusCta
***

Como veran se esta utilizando Arreglos de tipo objeto en los cuales npaso el arreglo de tipo objeto de Clase Resultado result enviandole el arreglo al metodo de acceso de Resultado,


Marco Antonio Trejo Lemus


Mas informacion:
http://www.netbeans.org/kb/61/websvc/intro-ws.html
http://www.netbeans.org/kb/60/websvc/jax-ws.html
Continuara...