Estadísticas en ASP

  • ASP
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: 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)


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:

  • 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.