sábado, 5 de mayo de 2007

Sobrepasando límite de caracteres de una consulta SQL

Bueno casi todos estos últimos días he estado trabajando con procedimientos almacenados que guardan la consulta como texto en un varchar, cuyo tamaño máximo es de 8000 :O

Yo pensé que era muchooooo y que nunca podría sobrepasarlo. Sólo pensé esto hasta ayer. Tenía 5 uniones de consultas que debía ajustar, porque se cortaba la consulta. Sin embargo despues tuve que agregar más uniones a la consulta y ahí colapse xD.

Pero si había una solucion: Vistas. Cada consulta la agrupe en una vista. Despues simplemente uní todas las vistas y la consulta quedó muy pequeña :).

Sólo algunas consideraciones a tener al momento de generar las vistas:

  • Como son uniones claramente cada vista debe retornar el mismo número de columnas.
  • En mi caso debía pasar al procedimiento almacenado un parámetro @WHERE el cual es el encargado de filtrar los datos. Este parámetro se une a un WHERE para cada vista. Este WHERE se encuentra fuera de la vista. Para poder filtrar por algún parámetro en especial se debe tener en cuenta que este parámetro especial debe estar seleccionado en la vista, de lo contrario la consulta genera un error.
Finalmente me queda sólo decir que siempre pense que las vistas eran inútiles y que no se usaban para nada xD. Me lleve una agradable sorpresa.

Eso por ahora!

viernes, 13 de abril de 2007

Esconder Info de una Tabla con Reporting Service

Con esto se puede borrar toda la info de una tabla, lo cual genera un reporte diferente.

Por ejemplo si necesitamos un Informe Detalle y uno Resumen podemos aplicar esto. En el detalle necesitaremos desplegar toda la info de las tablas y en el Resumen ocultarla.

Para realizar esto solo agregue un parametro más al Reporte: "Resumen". Este parámetro es el encargado de ocultar o no la info de las tablas.

En mi caso lo más simple (sí! siempre busco lo más simple xD) fue dejar este parámetro como Entero (Int). En caso de ser 0 se muestran las tablas, lo cual indica un Informe de Detalle. En caso de ser 1 oculta las tablas, lo cual indica un Informe Resumen.

Bueno pero para poder hacer todo esto simplemente se selecciona la fila Detail de la tabla, la cual contiene toda la información. Le hacemos click con el derecho y elegimos la opción Edit Group. Luego vamos al campo Visibility el campo tiene chequeado Visible. Aquí elegimos Expression y escribimos lo siguiente:

=Iif(Parameters!Resumen.Value = 1, true, false)

Y listo! Ya podemos ocultar info de las tablas.

Eso seria. Espero poder hacerlo con imágenes en los posteriores post.

lunes, 9 de abril de 2007

Topic Inauguracion

Bueno cree este blog principalmente por dos razones:

  • Ayudar a personas que anden buscando tips por internet.
  • Un motivo personal: Ayuda memoria :)
Trataré de ser lo más claro a la hora de explicar como se realizan las cosas.

Como estoy en el trabajo ahora, y casi siempre postearé desde aquí, comenzaré de inmediato:

"Consultas en Procedimientos Almacenados"

Tenía el siguiente problema:

Una tabla llamada _LineaProceso tenia referencia a dos tablas diferentes: _RecepcionGranel y _ProcesoFruta. Ambas tablas contenían información diferente pero relacionada, es decir, al ProcesoFruta llegaba Fruta proveniente desde la RecepcionGranel.

Entonces con el fin de poder separar esta informacion en la consutla SQL cree diferentes alias para la tabla _LineaProceso, cada uno de los cuales los ocupaba para sacar información relacionada con tablas diferentes.

A continuación dejo la consulta SQL final:

SELECT

PR.Nombre Productor
, RG.Guia
, RG.FechaLlegada FechaGuia
, sum(LPI.Neto) KilosRec
, sum(EP.Neto) KilosPro
, LPOE.Neto KilosExportacion
, LPOC.Neto KilosComercial

FROM _RecepcionGranel RG

LEFT OUTER JOIN _SocioNegocio PR on PR.IDSocioNegocio = RG.IDProductor
LEFT OUTER JOIN _LineaProceso LPI on LPI.IDRecepcionGranel = RG.IDRecepcionGranel
LEFT OUTER JOIN _EntradaProceso EP on EP.IDLineaOrigen = LPI.IDLineaProceso
LEFT OUTER JOIN _ProcesoFruta PF on PF.IDProcesoFruta = LPI.IDProcesoFruta
LEFT OUTER JOIN _LineaProceso LPOE on LPOE.IDProcesoFruta = EP.IDProcesoFruta
LEFT OUTER JOIN _LineaProceso LPOC on LPOC.IDProcesoFruta = EP.IDProcesoFruta

WHERE EP.IDProcesoFruta = 1 AND LPOE.IDTipoSalida = 1 AND LPOC.IDTipoSalida = 2

GROUP BY

PR.Nombre
, RG.Guia
, RG.FechaLlegada
, LPOE.Neto
, LPOC.Neto