Conectar Flash con Access a traves de Mdm Zinc 33
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.






¡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
Claro que se puede, me lo anoto para hacer un ejemplo y publicarlo en cuanto pueda en la web.
[...] conexión a Access Escrito por Juan - 26 Ene 2008 a las 12:08:25 | Hace un tiempo ya hice un tutorial sobre como conectar Flash con Access a través de mdm Zinc. Y en los comentarios me preguntaron si [...]
oye pero si la base de datos no esta en el mismo directorio como cambio el path y donde lo hago……
hola, mi pregunta es, en donde pones los codigos para dar alta, editar y borrar? es dentro de los botones?
grax
atte coda25
No, es en la linea principal de tiempo.
podrias mandarme el ejemplo ya hecho? con codigo fuente a mi mail:
shadow_x20@hotmail.com
grax
atte
coda25
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!!!!
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.
muchas gracias Juan!! voy a ver si lo logro hacer andar!!!
despues te cuento como me fue!
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?
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
Hola a todos, sobre todo muy buen trabajo Juan, mi duda tras estar mirando el programa es si es posible el compilar un swf que a su vez tenga mas swf unidos al principal, por ejemplo que el swf principal tenga menus que carguen mas swf, por ahora solo conseguí que compile uno solo, sin poder hacer la llamada a los demas swf. Por ahora los swf los estoy poniendo como MC pero me gustaría saber si es posible lo que comento.
Muchas gracias por todo.
Saludos
Jose
Hola Jose, lo que tu comentas si que se puede mediante los mdm.Forms. En cada Form cargas un swf distinto y puedes comunicarte entre ellos, llamando a funciones de otros, minimizarlos, etc
Muchas gracias juan, mirare esa opcion de los Forms, la verdad que estuve viendo algo de eso pero claro, solo añadia otro swf sin buen resultado, intentare profundizar en eso.
muchas gracias y un saludo
Jose
gracias por compartir
oie estoy haciendo una aplicacion, ya casi termino,
solo me falta recuperar los datos lugar de un datagrid en un “input text” individual cada dato ¿crees que se pueda?
si puedes ayudarme te lo agradecere mucho
Claro que se puede, en vez de meter los datos en el datagrid en el bucle (lineas 30-37) debes ponerlas en el input que quieras. Por ejemplo si tu input se llama nombre_txt:
nombre_txt.text=dataSet[0][1];
Asi pondrias el primer nombre de los registros que obtengas en ese campo de texto.
gracias juan voy a probar ….
al intentar copilarlo con mdm v.3 aparece este error:
couldn´t locate runtime module: mdm.Database.MSAccess
(el Mismo Archivo que baje, sin mofificarlo)
creo es por la version del mdm
a que se debera juan, de antemano gracias.
no le hagas caso a lo anterior , ya intente con otra version 3.0 y si lo copilo…
nombre_txt.text=dataSet[0][1];
recuerdas esto , funciona, pero solamente me permite ver el primer registro .
creo que me faltaria el codigo para que dos botones “” anterior y siguiente “” para poder ver todos los registros 1 por 1
o de alguna manera ingresar el “id” en un inputtext para hacer una consulta y me muestre los datos de dicho registro.
gracias por tu ayuda, segun yo con esto ya termino el proyecto.
muchas gracias Juan
Como te dije, eso te sirve para ver el primer registro del nombre.
dataSet[i][j]
i es el numero de fila y j el numero de columna. En el datagrid los ves todos porque en un bucle vas recorriendo las filas y leyendo todos los registros. Luego los muestras en el datagrid.
Como lo quieres meter en un input text debes hacer algo como lo que dices, un boton de anterior o siguiente o algo asi.
Hola Juan, a mi me pasa lo siguiente:
Cuando copilo con mdm v.3 aparece este error varias veces:
couldn´t locate runtime module: mdm.Database.MSAccess
Que puede ser, he visto que arriba esta el mismo comment pero yo tengo la version 3 y sigue pasandome.
GRacias.
Edgar, ¿compilas la libreria mdm.Database junto con el proyecto?
Por defecto el mdm zinc no te compila ninguna libreria y debes añadirlas tu a la hora de compilar.
Si, la compilo, es posible que sea porque tengo windows vista? y si es asi compilandolo en XP luego funcionaria en Vista?
Edgar.
Hola juan.
te queria preguntar si a esa Datagrid se le puede añadir filtro, por ejemplo colocal un input para filtrar nombres y un combobox para filtrar telefonos. gracias
Si que podrías pero deberás poner un listener en el input o en el combo para que cada vez que se cambie se actualice tu consulta sql.
Gracias juan
perdona mi ignorancia pero eso como se hace es k no soy muy experto.
te lo agradeceria bastante
Bueno al final lo hize en visual basic pk no lo pude hacer en flash (PRO TIEMPO NADA MAS) es que tenia que entregarlo rapido pero… esta buenisima esta herramienta de flash. voy a meterme mas en el asunto.
gracias…
hola, lo que quiero es saber si se puede conectar una miltimedia desarrollada en flash con un gestor de base de datos y de ser posible que e digancomo por favor que estoy medio enrredaooo, porque es para la tesis de grado mia chaoooooo deser posible me responden a mi e-mail yoandy.dominguez@reduc.edu.cu gracias
Hola Juan es posible que me envies tu ejemplo?…te dejo mi mail alejandro_a25@hotmail.com te lo agradeceria inmensamente amigo. Adios
El ejemplo lo puedes hacer facilmente, aún así lo puedes descargar de cristalab.com, el enlace está en este mismo post.
hola Juan, el mismo problema con los anteriores: el error del runtime(couldn´t locate runtime module: mdm.Database.MSAccess)y depaso estoy en un proyecto de cd interactivo pero son swishmax, sorry pero no tengo idea de que liberias debo añadir, porfis si me pueden ayudar ya que es mi 1era ves en esto, muchas gracias.