lunes, 31 de octubre de 2011

Clase "BaseDatos" y fichero de configuración

Hace algunos días comencé con el acceso a bases de datos desde Java y expliqué, brevemente, los pasos a seguir para implementar el puente JDBC-ODBC. Siguiendo con el tema de bases de datos, os dejo en esta entrada la clase "BaseDatos" y el fichero de configuración para el acceso a las bases de datos.

Cada proyecto nuevo en el que queramos acceder a una base de datos debe llevar tanto esta clase, como su correspondiente fichero de configuración, con los datos correspondientes.

La clase "BaseDatos" nos permitirá realizar todas las gestiones necesarias para acceder a una base de datos:
  • Registrar el driver.
  • Conectar a la base de datos.
  • Cerrar la conexión con la base de datos.
Al implementar esta clase, haremos que sólo se cree una conexión, que se utilizará para todos los accesos que se realicen a la base de datos en cada conexión. De esta manera no se tendrá que abrir y cerrar la conexión cada vez que se quiera acceder a la base de datos. Para conseguirlo el constructor de la clase es privado (no se podrá instanciar) y la conexión propiamente dicha será un atributo estático.

CLASE "BASEDATOS"

public class BaseDatos {
 
 private static Connection conexion = null;
 // Para utilizar el fichero de propiedades:
 private static ResourceBundle bundle = ResourceBundle.getBundle("dir.efemerides.config");
 
 // De esta manera no podemos instanciar BaseDatos
 private BaseDatos() {
 }
 
 public static Connection getConnection() throws SQLException {
  if (conexion == null || conexion.isClosed()) {
   conexion = conectar();
  }
  return conexion;
 }

 private static Connection conectar() {
  registrarDriver();
  Connection conexion = null;
  try {
   String url = bundle.getString("db.url");
   String username = bundle.getString("db.username");
   String password = bundle.getString("db.password");
   conexion = DriverManager.getConnection(url, username, password);
  } catch (SQLException e) {
   System.err.println("No fue posible establecer la conexión.");
   e.printStackTrace();
  }
  
  return conexion;
 }
 
 public static void desconectar() {
  try {
   if (conexion != null && !conexion.isClosed()) {
    conexion.close();
    conexion = null;
   }
  } catch (SQLException e) {
   System.err.println("No fue posible cerrar la conexión.");
   e.printStackTrace();
  }
 }
 
 private static void registrarDriver() {
  try {
   Class.forName(bundle.getString("db.driver"));
  } catch (ClassNotFoundException e) {
   System.err.println("Error al cargar el driver JDBC");
   e.printStackTrace();
  }
 }
}

El fichero de configuración tendrá los datos necesarios para acceder a la base de datos. Estos datos serán los que hayamos especificado al implementar el puente JDBC-ODBC.

La URL de conexión corresponde al nombre que le hayamos dado al origen de datos.

FICHERO DE CONFIGURACIÓN

# Driver de la base de datos:
db.driver=sun.jdbc.odbc.JdbcOdbcDriver

# Url de conexión:
db.url=jdbc:odbc:Efemerides

# Usuario y contraseña:
db.username=admin
db.password=1234

miércoles, 19 de octubre de 2011

Acceso a bases de datos Access - Puente JDBC-ODBC

Este curso hemos seguido con Java. El primer tema que hemos estado trabajando es el acceso a bases de datos utilizando este lenguaje. Inicialmente trabajaremos con MS Access, por lo que tenemos que implementar el puente JDBC-ODBC antes de empezar a trabajar con Java.

A continuación explico brevemente los pasos a seguir:

**Una vez creada la base de datos en MS Access, vamos al Panel de control.

**Elegimos "Herramientas administrativas".


**Doble clic en "Orígenes de datos ODBC".


**El origen de datos lo podemos crear en las pestañas "DSN de usuario" o "DSN de sistema", si queremos que esté disponible sólo para nosotros o para cualquier usuario del equipo.
**Hacemos clic en "Agregar...".


**Elegimos el driver. En este caso el de Microsoft Access y hacemos clic en "Finalizar".


**Se abre un cuadro como el siguiente. Indicamos el nombre que queremos dar al origen de datos y, si queremos, una pequeña descripción.


**Hacemos clic en "Seleccionar", para elegir la base de datos.


**La seleccionamos y hacemos clic en "Aceptar".


**Hacemos clic en "Avanzadas...".


**Especificamos el nombre de inicio de sesión y la contraseña.


**En el panel "Opciones", elegimos "Driver" y le damos como valor el mismo que hemos puesto como nombre del origen de datos. Hacemos clic en "Aceptar".


**Ya hemos creado el origen de datos para la base de datos creada previamente. Lo comprobamos en el listado.


Hay que tener en cuenta que se debe crear un origen de datos por cada base de datos que creemos. Si movemos esta base de datos a otro ordenador, también debemos crear de nuevo el origen de datos en ese equipo.
Espero que se entienda y sea útil.

miércoles, 5 de octubre de 2011

Multiplicación de matrices con JavaScript

Pues el título lo dice todo. Consiste en realizar un programa en JavaScript que multiplique dos matrices introducidas por el usuario. Para ello, en primer lugar, se piden las dimensiones de dichas matrices, se comprueba que son correctas [(m x n) * (n x p)] y si es así, se crean estas matrices, para que el usuario las rellene y posteriormente calcular su producto, que será otra matriz de dimensiones (m x p).

CÓDIGO HTML: pide las dimensiones de las matrices y ejecuta el código JavaScript

<html>
	<head>
		<script src="js/multiplicar_matrices4.js" language="javascript" type="text/javascript">
		</script>
	</head>
	<body>
		<div id="main" style="width:100%; height:350px">
			<div id="dimens" align="center" style="width:100%; background-color:FFA500">
				<div id="A" align="center" style="float:left; width:50%">
					<div>Dimensiones matriz A</div>
					<form name="dimA">
						Filas
						<input type="text" size="4" id="text">
						Columnas
						<input type="text" size="4" id="text">
					</form>
				</div>
				<div id="B" align="center" style="float:right; width:50%">
					<div>Dimensiones matriz B</div>
					<form name="dimB">
						Filas
						<input type="text" size="4" id="text">
						Columnas
						<input type="text" size="4" id="text">
					</form>
				</div>
				<input type="button" value="CREAR MATRICES" onclick="Comprobar ()" name="crear">
			</div>
	</body>
</html>

CÓDIGO JAVASCRIPT

var matriz1;
var matriz2;
var matrizRes;
var filaA;
var colA;
var filaB;
var colB;
var contador = 0;
//contador cuenta las veces que se accede, para que si no es la primera, se borren las capas creadas previamente.

//FUNCIONCES QUE DEBEMOS DEFINIR PARA CREAR LAS MATRICES
function CreaMatriz(n, m) {
	//DEFINIMOS EL TAMAÑO DE LA MATRIZ
	this.length = n;
	for (var i=0; i<n; i++) {
		this[i] = new Array(m);
	}
	return this;
}

function Multiplicar () {
	Inicializar ()
	for (i=0; i < filaA; i++){
		for (j=0; j < colB; j++){
			for (k=0; k < colA; k++){
				matrizRes[i][j] = matrizRes[i][j] + (matriz1[i][k] * matriz2[k][j]);
			}
		}
	}
}

function Mostrar () {
	Cargar ()
	
	var q = 0;
	
	for (i=0; i < matrizRes.length; i++){
		for (j=0; j < matrizRes.length; j++){
			document.matrizR.elements[q].value = matrizRes[i][j];
			matrizRes[i][j] = 0;
			q++;
		}
	}
}

//Esta función recoge los datos del formulario y los guarda en las matrices
function Cargar () {
	var q = 0;

	for (i=0; i<filaA; i++) {
		for (j=0; j<colA; j++) {
			matriz1[i][j] = parseInt(document.matrizA.elements[q].value);
			q++;
		}
	}
	
	q=0;
	for (i=0; i<filaB; i++) {
		for (j=0; j<colB; j++) {
			matriz2[i][j] = parseInt(document.matrizB.elements[q].value);
			q++;
		}
	}
	
	Multiplicar ()
}

//Comprueba que las dimensiones de las matrices son correctas para poder multiplicarlas
function Comprobar () {
	filaA = parseInt(document.dimA.elements[0].value);
	colA = parseInt(document.dimA.elements[1].value);
	filaB = parseInt(document.dimB.elements[0].value);
	colB = parseInt(document.dimB.elements[1].value);
		
	if (isNaN(filaA) || isNaN(colA) || isNaN(filaB) || isNaN(colB)) {
		alert("Valores no v\u00e1lidos.");
	}
	else if (colA != filaB) {
		alert("Dimensiones de las matrices no v\u00e1lidas.\nEl n\u00famero de columnas de A debe ser\nigual al n\u00famero de filas de B.");
	}
	else {
		if (contador > 0) {
			Borrar ()
		}
		matriz1 = new CreaMatriz(filaA, colA);
		matriz2 = new CreaMatriz(filaB, colB);
		CrearFormularios (filaA, colA, filaB, colB)
		matrizRes = new CreaMatriz(filaA, colB);
		CrearFormRes (filaA, colB)
		contador++
	}
}

function CrearFormularios (filA, colA, filB, colB) {
	var d = document.createElement("DIV");
	var fA = document.createElement("FORM");
	var fB = document.createElement("FORM");
	var A = document.createTextNode("Matriz A");
	var B = document.createTextNode("Matriz B");
	d.setAttribute("id", "matrices");
	d.setAttribute("align", "center");
	d.setAttribute("style", "width: 50%; height: 100%; float: left; background-color: 66FF66");
	fA.setAttribute("name", "matrizA");
	fB.setAttribute("name", "matrizB");
	
	var boton = document.createElement("INPUT");
	boton.setAttribute("type", "button");
	boton.setAttribute("value", "CALCULAR");
	boton.setAttribute("name", "button");
	boton.onclick=function(){Mostrar();}
	
	for (i=0; i<filA; i++) {
		var salto = document.createElement("BR");
		for (j=0; j<colA; j++) {
			var casilla = document.createElement("INPUT");
			casilla.setAttribute("type","text");
			casilla.setAttribute("size","4");
			casilla.setAttribute("name","text");
			fA.appendChild(casilla);
		}
		fA.appendChild(salto);
	}
	for (i=0; i<filB; i++) {
		var salto = document.createElement("BR");
		for (j=0; j<colB; j++) {
			var casilla = document.createElement("INPUT");
			casilla.setAttribute("type","text");
			casilla.setAttribute("size","4");
			casilla.setAttribute("name","text");
			fB.appendChild(casilla);
		}
		fB.appendChild(salto);
	}
	var salto = document.createElement("BR");
	d.appendChild(salto);
	d.appendChild(A);
	d.appendChild(fA);
	d.appendChild(B);
	d.appendChild(fB);
	var salto = document.createElement("BR");
	d.appendChild(salto);
	d.appendChild(boton);
	
	var otro = document.getElementById("main");
	otro.appendChild(d);
}

function CrearFormRes (filaA, colB) {
	var capa = document.createElement("DIV");
	var fRes = document.createElement("FORM");
	var res = document.createTextNode("Matriz Resultante");
	capa.setAttribute("id", "resultado");
	capa.setAttribute("align", "center");
	capa.setAttribute("style", "width: 50%; height: 100%; float:right; background-color: 20B2AA");
	fRes.setAttribute("name", "matrizR");
	
	for (i=0; i<filaA; i++) {
		var salto = document.createElement("BR");
		for (j=0; j<colB; j++) {
			var casilla = document.createElement("INPUT");
			casilla.setAttribute("type","text");
			casilla.setAttribute("size","4");
			casilla.setAttribute("name","text");
			casilla.readOnly ="true";
			fRes.appendChild(casilla);
		}
		fRes.appendChild(salto);
	}
	
	var salto = document.createElement("BR");
	capa.appendChild(salto);
	capa.appendChild(res);
	capa.appendChild(fRes);
	
	var otro = document.getElementById("main");
	otro.appendChild(capa);
}

function Inicializar () {
	for (i=0; i < matrizRes.length; i++){
		for (j=0; j < matrizRes.length; j++){
			matrizRes[i][j] = 0;
		}
	}
}

function Borrar () {
	var capa1 = document.getElementById("matrices");
	var capa2 = document.getElementById("resultado");
	var padre1 = capa1.parentNode;
	var padre2 = capa2.parentNode;
	padre1.removeChild(capa1);
	padre2.removeChild(capa2);
}