Título: Estadísticas

Autor: Leonardo Alberto Celis

Tecnologías: ASP/SQL Server

Introducción

El presente artículo explica como crear un módulo de estadísticas. El módulo permite capturar todos los movimientos que se están realizando en su sitio web y programar los reportes según sus necesidades. La lógica del módulo puede ser portada a cualquier otro lenguaje.

El artículo está dividido en tres secciones principales:

Modelo de datos

Primero debemos crear dos tablas: la tabla de conceptos, en donde se guardarán las páginas que van a ser monitoreadas, y la tabla de estadísticas en donde se guardarán todos los registros de movimientos.

Statistics (Tabla Estadisticas)

StatisticsConcepts (Tabla Conceptos)

Cargar los datos

Antes de comenzar a utilizar nuestro módulo de estadísticas debemos configurarlo, esto significa cargar los datos correspondientes para que funcione. La tabla de Estadísticas no requiere carga de datos, ya que en ésta tabla se guardarán las acciones de nuestros visitantes.

En la tabla de Conceptos debemos cargar las páginas que deseamos nuestro módulo de estadísticas monitoree.

Desarrollo

A continuación se dividirá el desarrollo de las funciones para el módulo de estadísticas en dos apartados:

Frontend: en donde explicaré las funciones de registro

Backend: en donde explicaré como armar los reportes

Front-end

Acceso a datos

Primero vamos a establecer la conexión que utilizaremos tanto para registrar los acciones de los visitantes como así también para mostrar los reportes:

Set cn = Server.CreateObject("ADODB.Connection")

cn.Open "driver={SQL Server};server=localhost;uid=user;pwd=pass;database=ohstudio"

Por supuesto la cadena de conexión corresponde a donde tengan alojada la base de datos. En éste caso se trata de una base de datos de mssql server. Esta cadena de conexión puede ser puesta al comienzo de la página o en un include.

Función para registrar movimientos

La functión doStatistics grabará todos los movimientos que realizará el visitantes en nuestro sitio web.

La información entre las páginas de cualquier sitio web fluyen por variables POST o variables GET. Esta información es la que capturará la función.

Además la función capturará información del visitante de nuestro sitio web: ip, navegador y módulo operativo (éstos dos últimos valores son traídos desde la misma variable de servidor).

<%

' Función: doStatistics

' Descripción:

'           Registra los movimientos de un usuario

Function doStatistics ()

' Declara las variables

            dim lsUserInfo, lsActionsQS, lsActionsPost

            dim lsVisitedPage, liSearchConcept

            dim lrsStatisticConcept, lrsInsertStatics, lsSQL

            ' Instancia los objetos

            Set lrsInsertStatics = Server.CreateObject("ADODB.Recordset")

            Set lrsStatisticConcept = Server.CreateObject("ADODB.Recordset")

            ' Recupera la pagina visitada para luego buscar su concepto

            lsVisitedPage = trim(Request.ServerVariables("SCRIPT_NAME"))

            ' Recupera las acciones

            lsActionsQS = Request.QueryString

            lsActionsPost = Request.Form

            ' Consulta los conceptos

            lsSQL = "SELECT * FROM StatisticsConcepts"

            Set lrsStatisticConcept = cn.Execute(lsSQL)

            if not lrsStatisticConcept.EOF then

                        do while not lrsStatisticConcept.EOF

                                   ' Busca el concepto para la página visitada

                                   liSearchConcept = InStr(1, lsVisitedPage, trim(lrsStatisticConcept.Fields("Pagina").Value))

                                   ' Si encuentra el concepto registra los datos

                                   if liSearchConcept <> 0 then

                                               lsSQL = "INSERT INTO Statistics (IP, DateLog, Concept, BrowserOS, Querystring, Form)

lsSQL = lsSQL & "VALUES ("

                                               lsSQL = lsSQL & "'" & Request.ServerVariables("Remote_Addr") & "', "

                                               lsSQL = lsSQL & "'" & Now & "', "

                                               lsSQL = lsSQL & lrsStatisticConcept.Fields("Id").Value & ", "

                                               lsSQL = lsSQL & "'" & Request.ServerVariables("HTTP_USER_AGENT") & "', "

                                               lsSQL = lsSQL & "'" & lsActionsQS & "', "

                                               lsSQL = lsSQL & "'" & lsActionsPost & "') "

                                               cn.Execute(lsSQL)

                                   end if

                                   lrsStatisticConcept.MoveNext

                        loop

            end if

            Set lrsInsertStatics = nothing

            Set lrsStatisticConcept = nothing

End Function

%>

Lo más recomendable es que ésta función se guarde en un include y luego este include se incorpore a las páginas donde deseamos registrar movimientos.

Una vez disponible ésta función, hay que llamarla. La llamada puede ser dentro de una condición, donde comienza la página, donde termina la página, depende de en qué momento deseamos que comience a registrar los movimientos.

Es importante cargar en la tabla de Conceptos (StatisticsConcepts) todas las páginas asp que deseamos monitorear y luego agregar la siguiente llamada en las mismas:

<%Call doStatistics()%>

Listo!!! Nuestro sitio ya comenzó a registrar cada movimiento que realizan los visitantes. Ahora pasemos a analizar dichos movimientos…

Back-end

Reportes

Nuestro sitio ya ha comenzado a acumular información sobre los navegantes y sus movimientos. Es tiempo de idear una manera de mostrar dicha información. Los reportes nos ayudarán a enfocarnos en los puntos en donde nuestro sitio es más fuerte, para luego darles prioridad a la hora de actualizar el sitio web.

Funciones para generar reportes

Para generar reportes utilizaremos dos funciones: buildReport y getValue4QS.

La función buildReport es la que nos permitirá construir las consultas a la tabla de estadísticas. La función getValue4QS es la que nos permitirá filtrar por un valor que deseemos buscar en un conjunto de variables de post o get, que como ya sabemos se guardarán gracias a la función doStatistics en nuestra tabla de estadísticas.

<%

' Función: buildReport

' Descripción:

'           Genera reportes

' Parámetros:

'           concept: id de concepto de estadísticas

'           variables: array de variables que se quiere discriminar para una estadística en particular, ej. moneda

'           values: array de valores para las variables declaradas arriba

'           form: true si se tiene que buscar en las acciones del request.form - false en la de request.querystring

'           start_date: fecha de comienzo para el filtro

'           end_date: fecha de fin para el filtro

'           count: true devuelve la cantidad de registros - false devuelve recordset con los registros

function buildReport(concept, variables(), values(), form, start_date, end_date, count)

            dim lsSQL, lrsRecordset, lsActionSel      

            dim i, liCounter

            Set lrsRecordset = Server.CreateObject("ADODB.Recordset")

' Comienza a armar la consulta:

' Devuelve la cantidad o todos los registros

            if count then     

                        lsSQL = "SELECT COUNT(*) as total FROM Statistics WHERE Id <> 0 "

            else

                        lsSQL = "SELECT * FROM Statistics WHERE Id <> 0 "

            end if

            ' Si no viene el concepto filtrar por todos

            if concept <> "" then

                        lsSQL = lsSQL & "AND concept = " & concept

            end if

            ' Discrimina acciones de querystring o post

            if form then

                        lsActionSel = "Form"

            else

                        lsActionSel = "Querystring"

            end if

            ' Agrega todos los criterios de búsqueda

            for i = 0 to ubound(variables)

                        lsSQL = lsSQL & "AND " & lsActionSel & " LIKE '%" & variables(i) & "=" & values(i) & "%' "

            next

            ' Filtra por rango de fechas

            if start_date <> "" and end_date <> "" then

                        lsSQL = lsSQL & "AND cast(floor(cast(Fecha as float)) as datetime) between "

lsSQL = lsSQL & " CONVERT(datetime, '" & start_date & "', 101) and CONVERT(datetime, '" & end_date & "', 101) "

            else

                        if start_date <> "" then

                                   lsSQL = lsSQL & "AND cast(floor(cast(Fecha as float)) as datetime) between "

lsSQL = lsSQL & "CONVERT(datetime, '" & start_date & "', 101) and CONVERT(datetime, GETDATE(), 101) "

                        end if

                        if end_date <> "" then

                                   lsSQL = lsSQL & "AND cast(floor(cast(Fecha as float)) as datetime) between "

lsSQL = lsSQL & "CONVERT(datetime, '" & end_date & "', 101) and CONVERT(datetime, GETDATE(), 101) "

                        end if

            end if

            Set lrsRecordset = cn.Execute(lsSQL)

            ' Devuelve la cantidad de registros o los registros mismos

            if count then

                        liCounter = cint(lrsRecordset.Fields("total").value)

                        buildArrowReport = liCounter

            else

                        set buildArrowReport = lrsRecordset

            end if

            set lrsRecordset = nothing

end function

' Función: getValue4QS

' Descripción:

'           Recupera el valor de una variable en una cadena de formato querystring

' Parámetros:

'           value: cadena de formato querystring

'           variable: variable a buscar dentro de la cadena de formato querystring

function getValue4QS(value, variable)

            Dim arrActions, arrTemp, i, j

            if Trim(value) <> "" then

                        arrActions = split(value, "&")

                        for i = 0 to ubound(arrActions)

                                   arrTemp = split(arrActions(i), "=")

                                   for j = 0 to ubound(arrTemp)

                                               if arrTemp (0) = variable then

                                                           returnValue4QS = arrTemp (1)

                                               end if

                                   next

                        next

            else

                        getValue4QS = ""

            end if

end function

%>

Generar reportes

Esponja

Revisemos el siguiente escenario:

Primero debemos cargar la página search.asp en nuestra tabla de conceptos de estadísticas StatisticsConcepts. Supongamos que el código de este nuevo registro es 2.

Deseamos saber cuantas búsquedas se realizaron con la palabra “Esponja” y quienes la realizaron. Para ello debemos hacer simplemente una llamada a la función buildReport y mostrar los resultados…

Llamamos a la función:

Como la función nos devolverá un conjunto de registros hacemos un set a una variable que previamente seteamos como tipo recordset. También es posible que la función sólo devuelve la cantidad, para ello en el último parámetro debemos indicarle que sea false y sacar la instrucción set, ya que no se seteará ningún objeto, solamente devolverá un entero.

<%

Dim rs

Set rs = Server.CreateObject("ADODB.Recordset")

Set rs = buildReport(2, array("buscar"), array(""), true, f_i, f_f, false)

%>

Para mostrar los registros simplemente nos queda recorrer el recordset.

<table>

<%

if not rs.EOF then

%>

<tr>

                        <td>Fecha</td>

<td>Búsqueda realizada</td>

            </tr>

<%      

do while not rstotal.EOF 

%>

            <tr>

                        <td><%=(rs.Fields("DateLog").value)%></td>

                        <td><%=getValue4QS(rs.Fields("Form").value, "buscar")%></td>

            </tr>

<%

                        rstotal.MoveNext()

            loop

end if

set rs = nothing

%>

</table>

Google

Supongamos ahora que deseamos saber la cantidad de veces que accedió el robot de Google a nuestro sitio. En este caso no necesitamos utilizar la función buildReport(), solamente debemos consultar a la tabla de estadísticas. La consulta tendría que ser de la siguiente manera:

<%

Dim lsSQL

lsSQL = "SELECT COUNT(*) as Total FROM Statistics WHERE BrowserOS like '%google%'"

Set lrsRecordset = cn.Execute(lsSQL)

%>

Sólo nos resta mostrar el valor del campo Total y tendremos la cantidad de veces que accedió el robot de Google a nuestro sitio web.

Conclusión

En este artículo hemos visto una manera de monitorear los accesos y movimientos de sus visitantes. Además como tratar dicha información recolectada. A fin de conocer el comportamiento de sus visitantes es importante realizar un análisis de los lugares que acceden y que acciones realizan. De ésta manera usted podrá mejorar constantemente su sitio web a fin de que sea mucho más útil  podrá presentar el crecimiento que ha tenido para capturar más audiencia.

Por hacer:

Estas son algunas de las tareas que se podrían realizar para expandir el funcionamiento del módulo…

Implementado en:

Estos son los sitios en los que fue implementado el servicio de estadística.

Agradecimientos:

--

Leonardo Alberto Celis

Oh!STUDIO

http://www.ohstudio.com.ar

e-mail celisla@hotmail.com

msn leonardo@ohstudio.com.ar

skype leonardo.celis