reporting-services - reporte - parametros dinamicos reporting services
Conjuntos de datos mĂșltiples de procedimientos almacenados en SSRS (4)
Desafortunadamente, como la documentación explica aquí :
Si se recuperan múltiples conjuntos de resultados a través de una sola consulta, solo se procesa el primer conjunto de resultados, y todos los demás conjuntos de resultados se ignoran.
(Encontrado a través de esta pregunta .)
Por lo tanto, sugiero usar una de dos posibilidades:
(1) Divida el procedimiento en dos procedimientos separados, uno que devuelve datos de EMP y otro de DEPT, y acceda a los nuevos procedimientos como dos conjuntos de datos separados.
(2) Sujete las dos consultas separadas (con una columna adicional para indicar qué consulta produjo cada fila) y filtre o formatee su informe de manera apropiada. La consulta unida podría ser algo como esto:
SELECT EMPID ID, ENAME NAME, JOB JOB_LOC, SAL, DEPTID, ''EMP'' SOURCE
FROM EMP
UNION ALL
SELECT DEPTID ID, DNAME NAME, LOC JOB_LOC, NULL SAL, DEPTID DEPTID, ''DEPT'' SOURCE
FROM DEPT
Tengo un procedimiento almacenado que devuelve múltiples conjuntos de resultados como se muestra a continuación
Create StoredProcedure sp_MultipleDataSets
as
begin
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
end
En BIDS, al crear un nuevo informe, configuré el procedimiento almacenado para el conjunto de datos. Crea el conjunto de datos SOLAMENTE con las columnas devueltas del primer conjunto de resultados. No identifica el segundo conjunto de resultados.
¿Cómo puedo crear conjuntos de datos para los conjuntos de resultados de un procedimiento almacenado como el anterior?
Es un truco para esto. Esto sigue a la idea de "Unir todos" todos los resultados para una tabla y trabaja con ssrs repost con tabla
Para cada consulta por separado, agregue una columna donde se muestre el propósito de la consulta Por ejemplo, "nombre" o "dirección", esta información se repite para cada línea de consulta.
Luego unir todas las consultas buscadas.
En los informes de Visual studio / ssrs: agregue el conjunto de datos que contiene el procedimiento almacenado. Luego, desde las herramientas, seleccione el tablix y arrastre los datos deseados a las columnas del tablix. Luego vaya a las propiedades de fila de Tablix -> Visibilidad de fila. para que la cláusula de clasificación con función IFF muestre solo filas con una columna adicional previamente definida en las consultas, por ejemplo, "Nombre" Luego haga la segunda tabla y siga las mismas, ahora use la función IIF con "Dirección", luego continúe Se necesitan diferentes mesas.
Intenta algo como eso:
Create StoredProcedure sp_MultipleDataSets(@Param nvarchar(10))
as
begin
if(@Param == "first")
begin
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
end
if(@Param == "second")
begin
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
end
end
Uso un parámetro en el SP para extraer múltiples conjuntos de resultados en SSRS todo el tiempo. Debe separarlos por sentencias de IF en el SP y también tiene que HACER TIPO A LAS FIELDS en la configuración del conjunto de datos SSRS.
Parece raro, pero funciona ...
Aquí hay un ejemplo.
El procedimiento almacenado (SP) tiene 2 parámetros definidos @OfficerID @DatasetFlag
El @OfficerID es el número de empleado que tiene que ser pasado o ENTERED IN (formulario de entrada de datos SSRS) El DatasetFlag es la forma en que controlo qué instrucción IF se ejecuta en el SP.
Así que aquí está el SP:
CREATE PROCEDURE [dbo].[StoredProcedureNameHere]
@OfficerID VARCHAR(7),
@DatasetFlag VARCHAR(60)
WITH RECOMPILE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON;
BEGIN TRY
IF @DatasetFlag = ''EmployeeName''
Begin
SELECT [EmployeeName]
FROM [DatabaseName].[scema].[Employee]
where EmployeeBNumber = @OfficerID
END
ELSE
IF @DatasetFlag = ''Expect''
Begin
SELECT
[TerritoryName]
,[TestNumber]
,[RuleNumber]
,[Expectation]
,[TestCount]
,[PercentToGoal]
FROM [Database].[scema].[Table2]
WHERE OfficerID = @OfficerID
ORDER BY TerritoryID
,TestNumber
,RuleNumber
END
RETURN
GO
El INFORME tiene 2 conjuntos de datos, uno que creo y que incorporará los parámetros, y EmployeeName el otro que creo y que asigna EmployeeName, ya que SSRS solo puede usar 1 Resultado SET ~! PERO .... lo engaño ....
pero simplemente CREO los CAMPOS DEMALOCIENDO EL EMPLEO y luego AGREGUE el resto (Consulta) Así que edite los CAMPOS en las PROPIEDADES del DATASET y coloque en Seleccionar Nombres de Columna.
Luego, utilice el menú PARÁMETROS (Propiedades del conjunto de datos) para poner en una EXPRESIÓN de = "Nombre de empleado" para el primer Conjunto de datos y = "Esperar" para el segundo. También coincido con @OfficeID en esa pantalla.
luego, cuando ejecuto esto ... pregunta por OfficerID (RS crea el formulario de entrada) y cuando pongo la ID y presiono VER INFORME. O podemos todos los RDL con OfficerID, al igual que el formulario SSRS, pero en una página ASPX.
AMBAS TARJETAS DE DATOS se devuelven (lo llama dos veces es mi suposición)
Entonces NO HAY FILTRADO alocado en un conjunto de datos de UNION u otros trucos con los que tengo que lidiar en SSRS, lo cual no es divertido ... (¿en serio, IIF?)
He visto un procedimiento almacenado donde tenemos como 20 parámetros, por lo que puede filtrar la SALIDA del informe en el nivel de SQL, en lugar de un tirón y filtro monstruo en el informe.
No, simplemente puede crear 20 procedimientos almacenados, BIEN SÍ, pero de esta manera, todo el código está en UNA ubicación y, por supuesto, puede usar las selecciones en las tablas TEMP para combinar toneladas de cosas, y al final simplemente PULLAR una tabla que sea el conjunto de resultados ...
Como programador, encuentro SSRS un poco chiflado, pero hasta ahora me estoy divirtiendo, tratando de encontrar la manera de obtener lo que quiero, no lo que ofrece ...