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: en donde se explica las tablas necesarias para el módulo.
  • Desarrollo: en donde se explica la programación.
  • Generar reportes: en donde se explica como utilizar el modulo.

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)

stat1

StatisticsConcepts (Tabla Conceptos)

stat2

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.

stat3

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:

  • Tenemos un sitio web de catálogo de productos de limpieza.
  • Dentro de nuestro sitio web tenemos un buscador de productos.
  • El buscador consta de un campo de texto llamado “SearchString”.
  • Cuando un visitante realiza una búsqueda se envia por post los datos del campo “SearchString” a la páginas “search.asp”.

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…

  • ABM de Conceptos
  • Tabla de Excepciones
  • Clases de php, o componente del COM+

Implementado en:

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

Agradecimientos:

Este artículo fue publicado originalmente en  ohstudio.com.ar por Alberto Celis.