06Nov Conectar Flash con Access a traves de Mdm Zinc
Ya vimos hace un tiempo como conectar Flash con Mysql a través de Zinc, pero esto nos obliga a tener conexión de internet para conectarnos al servidor o montarnos nuestro servidor en local.
A lo mejor, a la hora de hacer nuestra aplicación nos basta con tener una base de datos en access y en local, con lo que nos serviría que el cliente no tuviera conexión a internet para utilizarla.
Para este ejemplo vamos a realizar la gestión de una agenda.
Primero de todo crearemos en access una estructura como esta con id, Nombre, Apellidos y Teléfono:
A esta tabla la llameremos "ejemplo_agenda" y a la base de datos le pondremos el mismo nombre "ejemplo_agenda.mdb". Antes de guardar todo, insertaremos unos datos en la tabla para el ejemplo.
En nuestra aplicación en flash insertaremos un DataGrid, 3 botones y 3 textinput. Al DataGrid le llamaremos "theDataGrid". Los botones "bot_editar","bot_borrar" y "bot_insertar". Y finalmente los textinput "nombre_txt","apellidos_txt" y "tlf_txt".En el escenario nos quedará una cosa como esta:
Ahora ya insertaremos una nueva capa y ahí pondremos nuestro código actionscript. Iré poniendo bloque a bloque de código para ir explicandolo.
-
var databaseFile:String = "ejemplo_agenda.mdb";
-
var databasePassword:String = "";
-
var path:String = mdm.Application.path+databaseFile;
-
mdm.Database.MSAccess.connect(databaseFile,databasePassword);
-
var success = mdm.Database.MSAccess.success();
-
if (success == false) {
-
var msg:String = "No se puede conectar a la bbdd";
-
mdm.Dialogs.prompt(msg);
-
return;
-
}
Con ese trozo de código lo que hemos hecho es hacer la conexión con nuestra base de datos y comprobar que la conexión se ha hecho correctamente.
-
//FUNCION PARA HACER LA CONSULTA A LA BBDD
-
function consulta(){
-
theDataGrid.removeAll();
-
var sqlString:String = "SELECT id,nombre,apellidos,telefono FROM ejemplo_agenda order by id asc";
-
// Ejecutamos la consulta sql
-
mdm.Database.MSAccess.select(sqlString);
-
// Comprobamos los errores
-
var error:Boolean = (mdm.Database.MSAccess.error() == "true");
-
if (error) {
-
var msg:String = "Ha ocurrido un error en la consulta!";
-
mdm.Dialogs.prompt(msg);
-
return;
-
}
-
//Obtenemos los datos de la consulta
-
var dataSet:Array = mdm.Database.MSAccess.getData();
-
-
var datos:Object;
-
var newItemsArray:Array = new Array();
-
for (var i = 0; i<dataset.length;>
-
datos = {};
-
datos.ID = parseInt(dataSet[i][0]);
-
datos.Nombre = dataSet[i][1];
-
datos.Apellidos = dataSet[i][2];
-
datos.Telefono = dataSet[i][3];
-
newItemsArray.push(datos);
-
}
-
theDataGrid.dataProvider = newItemsArray;
-
}
La función consulta lo que hace es una consulta a la tabla de access y vuelca su contenido en el datagrid.
-
//FUNCION PARA MONTAR EL DATAGRID
-
function layoutGUI():Void {
-
// Montamos el encabezado del datagrid
-
theDataGrid.setStyle("fontSize",10);
-
theDataGrid.columnNames = ["ID", "Nombre", "Apellidos", "Telefono"];
-
theDataGrid.vScrollPolicy = "auto";
-
-
var gridWidth:Number = theDataGrid.width;
-
-
theDataGrid.getColumnAt(0).width = 0.05*gridWidth;
-
theDataGrid.getColumnAt(0).headerText = "ID:";
-
-
theDataGrid.getColumnAt(1).width = 0.35*gridWidth;
-
theDataGrid.getColumnAt(1).headerText = "Nombre:";
-
-
theDataGrid.getColumnAt(2).width = 0.45*gridWidth;
-
theDataGrid.getColumnAt(2).headerText = "Apellidos:";
-
-
theDataGrid.getColumnAt(3).width = 0.15*gridWidth;
-
theDataGrid.getColumnAt(3).headerText = "Telefono:";
-
-
theDataGrid.setStyle("alternatingRowColors", [0xFFFFFF, 0xF9FCFD]);
-
}
La función layoutGUI monta la estructura del datagrid ( encabezado, ancho, alto, color de fondo, etc ).
Ahora ya simplemente nos quedan las funciones de los respectivos botones:
-
//Funcion para insertar un dato
-
bot_insertar.onRelease=function(){
-
if(nombre_txt.text==""){
-
nombre_txt.text="Este campo no puede estar vacio";
-
}else{
-
mdm.Database.MSAccess.runQuery("INSERT INTO ejemplo_agenda (nombre,apellidos,telefono) VALUES ('"+nombre_txt.text+"','"+apellidos_txt.text+"',"+telf_txt.text+")");
-
consulta();
-
nombre_txt.text="";
-
apellidos_txt.text="";
-
telf_txt.text="";
-
}
-
}
Antes de insertar un dato, comprobamos que el campo nombre no esté vacio. Después de insertar los datos, llamaremos a la funcion consulta para actualizar el datagrid y limpiaremos los textinput.
-
//Borrado de datos
-
bot_borrar.onRelease=function(){
-
LineaGrid = theDataGrid.selectedIndex;
-
if(LineaGrid!=undefined){
-
var sqlString:String = "DELETE FROM ejemplo_agenda where id="+theDataGrid.getItemAt(LineaGrid).ID;
-
mdm.Database.MSAccess.runQuery(sqlString);
-
consulta();
-
}
-
}
En este trozo de código no hay mucho que explicar, simplemente hacemos el borrado si se ha elegido un dato en el datagrid.
-
//Edicion de datos
-
theDataGrid.addEventListener("change", editar);
-
-
function editar(Obj) {
-
bot_editar.enabled=true;
-
//Obtiene los datos de la linea seleccionada
-
DatosGrid = Obj.target.selectedItem;
-
//Asigna valores de los campos de texto
-
nombre_txt.text = DatosGrid.Nombre;
-
apellidos_txt.text = DatosGrid.Apellidos;
-
telf_txt.text = DatosGrid.Telefono;
-
}
-
-
bot_editar.onRelease=function(){
-
LineaGrid = theDataGrid.selectedIndex;
-
var sqlString:String = "UPDATE ejemplo_agenda set nombre='"+nombre_txt.text+"', apellidos='"+apellidos_txt.text+"', telefono="+telf_txt.text+" where id="+theDataGrid.getItemAt(LineaGrid).ID;
-
mdm.Database.MSAccess.runQuery(sqlString);
-
consulta();
-
bot_editar.enabled=false;
-
nombre_txt.text = "";
-
apellidos_txt.text = "";
-
telf_txt.text = "";
-
}
Para editar los datos lo que hemos hecho es ponerle un listener al datagrid para que cuando se seleccione un elemento, nos lo muestre en los textinput.
El último trozo de código que nos quedaría por poner es el siguiente:
-
bot_editar.enabled = false;
-
layoutGUI();
-
consulta(); //Obtenemos los datos de la bbdd
Esto son las llamadas a la funcion de montar el datagrid y obtener los datos del access.
Al haberlo explicado por trozos puede haber quedado algo lioso, ahora os pondré todo el código seguido que hemos utilizado.
-
var databaseFile:String = "ejemplo_agenda.mdb";
-
var databasePassword:String = "";
-
var path:String = mdm.Application.path+databaseFile;
-
mdm.Database.MSAccess.connect(databaseFile,databasePassword);
-
var success = mdm.Database.MSAccess.success();
-
if (success == false) {
-
var msg:String = "No se puede conectar a la bbdd";
-
mdm.Dialogs.prompt(msg);
-
return;
-
}
-
-
//FUNCION PARA HACER LA CONSULTA A LA BBDD
-
function consulta(){
-
theDataGrid.removeAll();
-
var sqlString:String = "SELECT id,nombre,apellidos,telefono FROM ejemplo_agenda order by id asc";
-
// Ejecutamos la consulta sql
-
mdm.Database.MSAccess.select(sqlString);
-
// Comprobamos los errores
-
var error:Boolean = (mdm.Database.MSAccess.error() == "true");
-
if (error) {
-
var msg:String = "Ha ocurrido un error en la consulta!";
-
mdm.Dialogs.prompt(msg);
-
return;
-
}
-
//Obtenemos los datos de la consulta
-
var dataSet:Array = mdm.Database.MSAccess.getData();
-
-
var datos:Object;
-
var newItemsArray:Array = new Array();
-
for (var i = 0; i<dataset.length;>
-
datos = {};
-
datos.ID = parseInt(dataSet[i][0]);
-
datos.Nombre = dataSet[i][1];
-
datos.Apellidos = dataSet[i][2];
-
datos.Telefono = dataSet[i][3];
-
newItemsArray.push(datos);
-
}
-
theDataGrid.dataProvider = newItemsArray;
-
}</dataset.length;>
-
-
//FUNCION PARA MONTAR EL DATAGRID
-
function layoutGUI():Void {
-
// Montamos el encabezado del datagrid
-
theDataGrid.setStyle("fontSize",10);
-
theDataGrid.columnNames = ["ID", "Nombre", "Apellidos", "Telefono"];
-
theDataGrid.vScrollPolicy = "auto";
-
-
var gridWidth:Number = theDataGrid.width;
-
-
theDataGrid.getColumnAt(0).width = 0.05*gridWidth;
-
theDataGrid.getColumnAt(0).headerText = "ID:";
-
-
theDataGrid.getColumnAt(1).width = 0.35*gridWidth;
-
theDataGrid.getColumnAt(1).headerText = "Nombre:";
-
-
theDataGrid.getColumnAt(2).width = 0.45*gridWidth;
-
theDataGrid.getColumnAt(2).headerText = "Apellidos:";
-
-
theDataGrid.getColumnAt(3).width = 0.15*gridWidth;
-
theDataGrid.getColumnAt(3).headerText = "Telefono:";
-
-
theDataGrid.setStyle("alternatingRowColors", [0xFFFFFF, 0xF9FCFD]);
-
}
-
-
//Funcion para insertar un dato
-
bot_insertar.onRelease=function(){
-
if(nombre_txt.text==""){
-
nombre_txt.text="Este campo no puede estar vacio";
-
}else{
-
mdm.Database.MSAccess.runQuery("INSERT INTO ejemplo_agenda (nombre,apellidos,telefono) VALUES ('"+nombre_txt.text+"','"+apellidos_txt.text+"',"+telf_txt.text+")");
-
consulta();
-
nombre_txt.text="";
-
apellidos_txt.text="";
-
telf_txt.text="";
-
}
-
}
-
//Borrado de datos
-
bot_borrar.onRelease=function(){
-
LineaGrid = theDataGrid.selectedIndex;
-
if(LineaGrid!=undefined){
-
var sqlString:String = "DELETE FROM ejemplo_agenda where id="+theDataGrid.getItemAt(LineaGrid).ID;
-
mdm.Database.MSAccess.runQuery(sqlString);
-
theDataGrid.removeItemAt(LineaGrid);
-
consulta();
-
-
var error:Boolean = (mdm.Database.MSAccess.error() == "true");
-
if (error) {
-
var msg:String = "Ha ocurrido un error ejecutando la consulta";
-
mdm.Dialogs.prompt(msg);
-
return;
-
}
-
}
-
-
}
-
-
//Edicion de datos
-
theDataGrid.addEventListener("change", editar);
-
-
function editar(Obj) {
-
bot_editar.enabled=true;
-
//Obtiene los datos de la linea seleccionada
-
DatosGrid = Obj.target.selectedItem;
-
//Asigna valores de los campos de texto
-
nombre_txt.text = DatosGrid.Nombre;
-
apellidos_txt.text = DatosGrid.Apellidos;
-
telf_txt.text = DatosGrid.Telefono;
-
-
}
-
bot_editar.onRelease=function(){
-
LineaGrid = theDataGrid.selectedIndex;
-
var sqlString:String = "UPDATE ejemplo_agenda set nombre='"+nombre_txt.text+"', apellidos='"+apellidos_txt.text+"', telefono="+telf_txt.text+" where id="+theDataGrid.getItemAt(LineaGrid).ID;
-
mdm.Database.MSAccess.runQuery(sqlString);
-
var error:Boolean = (mdm.Database.MSAccess.error() == "true");
-
if (error) {
-
var msg:String = "Error occured while executing sql query!";
-
mdm.Dialogs.prompt(msg);
-
return;
-
}
-
consulta();
-
bot_editar.enabled=false;
-
nombre_txt.text = "";
-
apellidos_txt.text = "";
-
telf_txt.text = "";
-
}
-
-
bot_editar.enabled=false;
-
layoutGUI();
-
consulta();//Obtenemos los datos de la bbdd
Una vez hecho nuestro swf, solamente deberemos compilarlo con el mdm zinc y obtendremos nuestro ejecutable. Como nota tengo que decir que si hacemos una consulta que nos devuelve muchos registros (sobre los 150-200) puede que no funcione correctamente. En ese caso tendríamos que paginar nuestros resultados.
Este mismo tutorial lo publiqué hace ya algún tiempo en cristalab.






Enero 24th, 2008 at 3:04
¡Hola Juan!
He visto tu tutorial y me parece excelente. Sin embargo, en ocasiones se hace atractivo editar los campos directamente en el datagrid y de ahi guardarlos en la base de datos. ¿es factible hacer esto? ¿tendrá por ahí algún ejemplo que me puedas facilitar?.
De antemano, muchas gracias
Saludos
ALT
Enero 24th, 2008 at 9:52
Claro que se puede, me lo anoto para hacer un ejemplo y publicarlo en cuanto pueda en la web.
Marzo 19th, 2008 at 23:17
oye pero si la base de datos no esta en el mismo directorio como cambio el path y donde lo hago……
Septiembre 19th, 2008 at 8:21
hola, mi pregunta es, en donde pones los codigos para dar alta, editar y borrar? es dentro de los botones?
grax
atte coda25
Septiembre 19th, 2008 at 8:56
No, es en la linea principal de tiempo.
Septiembre 19th, 2008 at 9:35
podrias mandarme el ejemplo ya hecho? con codigo fuente a mi mail:
shadow_x20@hotmail.com
grax
atte
coda25
Septiembre 28th, 2008 at 19:28
buenas, les cuento mi problema.. un cliente necesitaba hacer un cd interactivo para publicidad y me paso una base acces de donde sacar los datos. a mi se me habia ocurrido hacerlo con flash que es mas atractivo visualmente. el problema surgio cuando lo quice conectar…. bueno, encontre esta forma pero tube 2 problemas: la base de datos y la tabla… tienen que tener el mismo nombre??? porque yo intente y nunca me mostro dato alguno.. y el otro problema que veo es que al ejecutar el .exe generado por el MDMZink se crea o se actualiza un archivo con el mismo nombre que la base, esto podia traer problemas ya que es para un cd (solo lectura)… alguien conoce otra forma???? o como resolver esto?? Muchas gracias!!!!
Septiembre 28th, 2008 at 23:30
Hola, te respondo:
-El nombre de la tabla y el de la base de datos no tienen que tener el mismo nombre, yo los puse igual para simplificar el ejemplo pero no es necesario
-Si vas a acceder a un cd debes hacerlo en solo lectura por lo que debes especificarlo con la funcion “mdm.Database.MSAccess.connectReadOnly” si no, no podrás. Si accedes de otra manera te genera un archivo temporal y si es en un cd no vas a poder.
Octubre 1st, 2008 at 1:20
muchas gracias Juan!! voy a ver si lo logro hacer andar!!!
despues te cuento como me fue!
Octubre 1st, 2008 at 1:48
buenisimo che, conecto perfectamente.
una consulta mas… (y esto de curiosidad)… intente ponerle un skin a la aplicacion esta, y no me conecta a la base, se necesita algo mas para usar skin? o le estoy errando en algo?
Octubre 1st, 2008 at 9:00
Pues no debería porque no funcionarte al ponerle el skin. Yo he hecho aplicaciones con skin y conectandose a bases de datos (mysql) y me han funcionado perfectamente.
Mira a ver si has puesto algún código sin darte cuenta.
Un saludo