Skip to content

ConsultaSQL

huchim edited this page May 31, 2017 · 7 revisions

Para establecer el origen de datos de un reporte, es necesario elaborar una consulta SQL. Sin embargo, esta consulta SQL no se almacena en el código de la aplicación, si no en cambio, se almacena en un archivo externo donde se especifica lo siguiente:

  • Consulta SQL base
  • Lista de argumentos que requiere la consulta base.
  • Fragmentos que se agregarán dinámicamente en la consulta base (opcional)

Consulta SQL

La consulta SQL se encuentra limitada sólo por el gestor de base de datos que use (RDBMS), sin embargo la consulta debe devolver un conjunto de datos.

Trabajemos en una consulta SQL como la siguiente, en este punto aún no estamos ejecutando la consulta.

SELECT Id, Nombre, Apellido FROM Alumnos

Esa consulta se ejecutará posteriormente en la base de datos, tanto Id, Nombre y Apellido son los campos que luego pueden ser usados en la capa de presentación para diseñar el reporte.

Dicha consulta debe definirse de la siguiente manera:

"sql" : [
    {
        "name": "alumnos",
        "script": "SELECT Id, Nombre, Apellido FROM Alumnos"
    }
]

Multiples consultas SQL

Es posible que su reporte requiera más de una consulta (origen de datos), para ello se debe agregar a la colección sql de la siguiente manera:

"sql": [
    {
        "name": "alumnos",
        "script": "SELECT Id, Nombre, Apellido FROM Alumnos"
    },
    {
        "name": "colegio",
        "script": "SELECT Nombre, Direccion FROM Colegio WHERE ColegioId = 1"
    }
]

Cada consulta ahora tiene un identificador único (alumnos y colegio) para luego poder usarlos en las plantillas SQL.

Consultas demasiado largas

Cuando la consulta sea demasiado larga o simplemente quiera ponerla en otro archivo puede usar la clave file en vez de la clave script.

"sql": [
    {
        "name": "alumnos",
        "file": "script.sql"
    }
]

Considere que dicho archivo es relativo al directorio donde se encuentra el archivo JSON de donde tomamos la configuración.

No existe una restricción en cuanto al archivo a usar, simplemente que pueda ser leído como texto.

Argumentos

Los argumentos son útiles para cuando se desea filtrar los resultados o insertar valores a la consulta base SQL, sin precuparse mucho por la seguirdad (Inyección SQL).

En el siguiente ejemplo modificamos un poco la consulta para agregarle una claúsula WHERE.

SELECT Id, Nombre, Apellido FROM Alumnos WHERE MaestroId = @maestroId

De esa forma, la consulta al ejecutarse debe incluír el parámetro @maestroId y ese puede tener cualquier valor.

Para que el generador de reportes pueda incluirla en la consulta final que se ejecutará sobra la base de datos, se debe definir la información de la variable de la siguiente manera.

"args": [
    {
        "description": "Identificador del maestro",
        "label": "Maestro",
        "name": "MaestroId",
        "type": "number"
	}
]

Todas las variables sin importar de qué consulta sean se deben declarar en esta parte.

Propiedad Descripción
name Define el nombre de la propiedad y debe coincidir con el que se usará en la consulta base SQL. No debe incluir el prefijo '@'
type Define la manera cómo será tratado el argumento. Las opciones son text, number (incluye valores flotantes) y date.
value Es una cadena de texto que define el valor predeterminado del argumento. Puede usar variables como %miVariable% para definir un valor predeterminado cuando estás no hayan sido proporcionadas.

Las propiedades label, hidden, description y sourcepodrían ser utilizadas por una interfaz gráfica (no incluída) para generar un formulario.

Agregar argumento a la consulta base SQL

Una consulta base puede requerir argumentos, para ello debe incluir la clave required en cada consulta, para obligar al generador de reportes que la inserte en la consulta final.

"sql": [
    {
        "name": "alumnos",
        "script": "SELECT Id, Nombre, Apellido FROM Alumnos WHERE Maestro = @maestroId",
        "required": [ "maestroId" ]
    }
]

De esa manera, la variable siempre se agregará a la consulta, inclusive si no es pasada explicitamente ya que se pueden usar Variables para los valores predeterminados.

Fragmentos SQL

Es posible cambiar la consulta base de acuerdo a si existe o no las variables en el reporte. Se puede usar para casos donde se requiera agregar un filtro a la consulta.

Supongamos que el reporte se ejecuta con la consulta que hemos hecho, pero ahora queremos que si el reporte recibe el parámetro @claseId se lo agreguemos a la consulta, entonces quedaría así:

SELECT Id, Nombre, Apellido 
FROM Alumnos 
WHERE Maestro = @maestroId AND ClaseId = @claseId

¿Qué pasa cuando no tenemos esa variable?, es ahí donde podemos quitarla o agregarla si se requiere de la siguiente manera usando la clave replaces.

"sql": [
    {
        "name": "data",
        "script": "SELECT Id, Nombre, Apellido FROM Alumnos WHERE Maestro = @maestroId %FiltrarPorClase%",
        "required": [ "maestroId" ],
        "replaces": [
            {
                "token": "FiltrarPorClase",
                "when": "claseId",
                "script": "AND ClaseId = @claseId"
            }
        ]
    }
]

De tal manera que ahora en nuestra consulta base, podemos agregar %FiltrarPorClase% (encerrados entre signos de porcentaje), así, cuando (when) exista la variable claseId asignada en el reporte, se sustituirá %FiltrarPorClase% por el valor de script quedando de la siguiente manera:

SELECT Id, Nombre, Apellido
FROM Alumnos 
WHERE Maestro = @maestroId AND ClaseId = @claseId

Eso se hará justo antes de ejecutar la consulta.

Puede usar la clave description para especificar cuándo o porqué está la variable.

Clone this wiki locally