Cada vez con más frecuencia los desarrolladores de sitios en Flash necesitan mostrar contenidos dinámicamente, tomando datos de fuentes externas. Existen diversos tipos de fuentes de datos que pueden utilizarse, pero cuando se trata de datos más o menos complejos y con una estructura jerárquica suele recurrirse a bases de datos. Ese tutorial propone la utilización de un archivo de tipo XML como intermediario entre la base y el Flash.
Presentación de la base de datos
El desarrollo del tutorial está realizado utilizando una base Access muy sencilla, pero el ejemplo puede adecuarse a bases más
potentes, como SQL Server, con muy pequeñas modificaciones.
Supongamos que tenemos que tomar datos de una base que utiliza solo 3 tablas, con la estructura que se detalla en la siguiente figura:
El ejemplo se refiere a una compañía que dispone de Representantes en distintos países y se propone mostrar en su web realizada
en Flash los datos de cada uno para que sus clientes contacten al representante más cercano.
Se trata de una estructura jerárquica de datos que nos proponemos respetar cuando consultemos la base
(bd_tutorial.mdb).
Supongamos que la empresa carga los datos a través de un Panel de Cliente realizado en algún lenguaje de programación del lado del
servidor (ASP o PHP). Los datos de muestra son los siguientes:
Trabajando en ASP y XML
Nuestro trabajo consistirá en lograr tres objetivos:
Conectarse a la base bd_tutorial.mdb
Dim Conn, ConnStr
ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
ConnStr = ConnStr & Server.MapPath("data/bd_tutorial.mdb")
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = adModeReadWrite
Conn.ConnectionString = ConnStr
Conn.Open
Realizar la primera consulta SQL
Una vez conectados a la base debemos realizar la primera consulta SQL,
que recuperará la lista de los datos ubicados más alto en la jerarquía,
en nuestro caso las Areas Geográficas. Debemos
armar la consulta de tal modo de obtener únicamente
aquellas áreas que tengan algún país asociado. Si algún área no tuviera
todavía países asociados la consulta lo ignorará, como ocurre con "Asia"
en la base de muestra.
Si algún área posee más de un país asociado, lo que
es lógico que ocurra, aparecerá varias veces (tantas como países tenga)
por lo que utilizamos el predicado DISTINCT
para obtener cada área una sola vez.
El código sería el siguiente:
Dim strSQLAreas
strSQLAreas = "SELECT DISTINCT Areas.* FROM Areas INNER JOIN Paises ON Areas.IdArea =" & _ "Paises.AreaPais"
Set rsAreas = Server.CreateObject("ADODB.Recordset")
rsAreas.Open strSQLAreas, Conn, 1
En ste momento estamos en condiciones de empezar a armar nuestro archivo XML.
La idea es ir armándolo y grabándolo línea a línea en el servidor mediante
el objeto ASP FileSystemObject.
Para poder grabar deberemos disponer
en el servidor de una carpeta que posea permiso de escritura, caso contrario
obtendremos un mensaje de error.
En nuestro ejemplo utilizamos una carpeta
denominada XML y nuestro archivo representantes.xml
tendrá las siguientes características:
<lista>
<area nombre="xx">
<pais nombre="yy">
<representante nombre="zz" apellido="zz" telefono="zz" email="zz">
</representante>
<representante nombre="zz" apellido="zz" telefono="zz" email="zz">
</representante>
</pais>
</area>
</lista>
Volviendo al código ASP, la lógica que seguiremos consiste en analizar
para cada Area (bucle Do While #1) qué Países
hay, para cada País (bucle Do While #2) qué
Representantes hay y para cada Representante (bucle
Do While #3) cuáles son sus datos.
Ya disponemos de las Areas (en
el Recordset rsAreas que obtuvimos más arriba) por lo que podemos armar
los bucles y la escritura del XML de la manera que sigue:
El resto del código
dim fso, archivo
Set fso = createobject("scripting.filesystemobject")
Set archivo = fso.CreateTextFile(Server.MapPath("xml/representantes.xml"), True)
archivo.WriteLine("<?xml version='1.0' encoding='ISO-8859-1'?>")
archivo.WriteLine("<lista>")
If rsAreas.RecordCount = 0 Then
'***no hay Areas con países asociados => xml vacío /***
archivo.WriteLine("</lista>")
Else
rsAreas.MoveFirst
'Bucle Do While #1 - para cada Area
Do While Not rsAreas.EOF
'escribimos el nodo XML
archivo.WriteLine("<area nombre='" & rsAreas("NombreArea") & "'>")
'buscamos los Países del Area que tengan Representantes, sin duplicados: DISTINCT
strSQLPaises = "SELECT DISTINCT Paises.IdPais, Paises.NombrePais FROM Paises " & _
"INNER JOIN Representantes ON Paises.IdPais = Representantes.PaisRepres " & _
" WHERE Paises.AreaPais =" & rsAreas("IdArea")
Set rsPaises = Server.CreateObject("ADODB.Recordset")
rsPaises.Open strSQLPaises, Conn, 1
If rsPaises.RecordCount <> 0 Then
'Bucle Do While #2 - para cada País
Do While Not rsPaises.EOF
'escribimos el nodo XML
archivo.WriteLine("<pais nombre='" & rsPaises("NombrePais") & "'>")
'buscamos los Representantes del País
strSQLRepre = "SELECT * FROM Representantes WHERE " & _
"PaisRepres=" & rsPaises("IdPais")
Set rsRepre = Server.CreateObject("ADODB.Recordset")
rsRepre.Open strSQLRepre, Conn, 1
If rsRepre.RecordCount <> 0 Then
'Bucle Do While #3 - datos de cada Representante
Do While Not rsRepre.EOF
'escribimos el nodo XML
archivo.WriteLine("<representante ciudad='" & rsRepre("CiudadRepres") & "' nombre='" & rsRepre("NombreRepres") &
' apellido='" & rsRepre("ApellidoRepres") & "' telefono='" & rsRepre("TelefonoRepres") & "' email='" & rsRepre("EmailRepres") & "'>")
'cerramos el nodo de cada Representante
archivo.WriteLine("</representante>")
rsRepre.MoveNext
Loop
'cerramos y destruimos el recordset de Representantes
rsRepre.Close
Set rsRepre = Nothing
End If
'cerramos el nodo de cada País
archivo.WriteLine("</pais>")
rsPaises.MoveNext
Loop
'cerramos y destruimos el recordset de Países
rsPaises.Close
Set rsPaises = Nothing
End If
'cerramos el nodo de cada Area
archivo.WriteLine("</area>")
rsAreas.MoveNext
Loop
'cerramos y destruimos el recordset de Areas
rsAreas.Close
Set rsAreas = Nothing
'cerramos el nodo principal
archivo.WriteLine("</lista>")
archivo.Close
End If
En este punto tenemos una página ASP (representantes.asp) que cada vez que se ejecuta toma los datos que existan en la base y los
graba en un archivo con formato XML (representantes.xml).
El archivo XML así generado puede verse en cualquier editor de textos aunque
es mejor utilizar algún editor XML como XML Editor o Notepad
++ (decarga gratuita).
Resultaría conveniente (por no decir indispensable)
hacer que representantes.asp se ejecute cada vez que se realiza algún cambio
en la base a través del panel que utiliza la empresa para actualizar sus
datos. De ese modo garantizaremos que siempre se leerán los datos más recientes
disponibles.
De aquí en más ...
En la parte 2 de este tutorial: "de XML a Flash", desarrollaremos una película Flash con la programación necesaria en ActionScript para leer y mostrar dinámicamente el contenido de nuestro archivo XML, respetando exactamente la estructura de los datos guardados en la base.
Fernando Campaña (Julio de 2006)
Argentina Diseño Web
Palabras Clave: diseño web, Access, ASP, XML
Copyright Rakidwam Diseño Web 2006 - Se permite la reproducción total o parcial del presente artículo manteniendo el enlace del autor.