none
Como usar parametros para agrupar ? RRS feed

  • Pergunta

  • Boa tarde !

    Em em relatório que consulta uma tabela com essa estrutura:
    CREATE TABLE gerencia.dbo.historicoServidoresMes (
      idHistoricoServidoresMes INTEGER  NOT NULL   IDENTITY ,
      tEnte INTEGER    ,
      sexo CHAR(1)    ,
      ano CHAR(4) ,
      mes CHAR(2) ,
      entrada INTEGER    ,
      saida INTEGER    ,
      saldo INTEGER    ,
      numAtivos INTEGER      ,
    PRIMARY KEY(idHistoricoServidoresMes));
    
    deixa eu explicar isso:
    tEnte é o local físico onde se trabalha.
    Entrada é qtas pessoas entraram para trabalhar;
    saida é as que sairam do trabalho;
    numAtivos é o número de pessoas que estão trabalhando.

    Observe que tem o campo sexo.
    entao para mim fazer um relatorio por sexo é facil:
    SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', hsm.sexo AS 'Sexo', hsm.entrada AS 'Entrada', hsm.saida AS 'Saida',
    hsm.numAtivos AS 'numAtivos'
    FROM gerencia.dbo.historicoServidoresMes AS hsm
    ORDER BY hsm.tEnte, hsm.ano, hsm.mes, hsm.sexo ASC
    Porem, quando quero sumarizar, ou seja, não importa o sexo, devo agrupar:
    SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', SUM(hsm.entrada) AS 'Entrada', SUM(hsm.saida) AS 'Saida',
    SUM(hsm.numAtivos) AS 'numAtivos'
    FROM gerencia.dbo.historicoServidoresMes AS hsm
    GROUP BY hsm.tEnte, hsm.ano, hsm.mes
    ORDER BY hsm.tEnte, hsm.ano, hsm.mes ASC
    
    Como fazer isso usando o parametros no Report Services ?
    Ou seja, escolhendo os 2 sexos, a consulta seria agrupada, somente um sexo, a consulta nao seria agrupada ?
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    domingo, 14 de junho de 2009 17:46

Respostas

  • aNetao,

    Para mim a expressão funciona como postei, a unica coisa que vejo de errado na sua consulta são as quebras de linha, se a expressão estiver inteira em uma linha ou se voce fechar as strings a cada quebra deveria funcionar. Recomendo testar colocar as suas consultas em uma linha e ver se isso funciona.

    Att
    Boreki


    http://www.boreki.eng.br
    • Marcado como Resposta Richard Juhasz quarta-feira, 27 de fevereiro de 2013 17:40
    sábado, 27 de junho de 2009 00:40

Todas as Respostas

  • Nao entendi a sua pergunta.

    A principio, parametros nao irao afetar o agrupamento. Se voce precisa de duas consultas diferentes no dataset baseado em um parametro, voce pode usar o seu dataset baseado em expressao
    =iif(Parameters!parametro.value="masc","SQL 1" ,"SQL 2")
    onde SQL 1 e SQL 2 sao as consultas que voce quer usar.

    Att
    Boreki
    http://www.boreki.eng.br
    segunda-feira, 15 de junho de 2009 17:02
  • Boreki,

    deixei como esta abaixo.
    nao, funcionou não !
    IFF( Parameters!rpSexo.Value ="All",
    
    "SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', hsm.entrada AS 'Entrada', hsm.saida AS 'Saida',
    hsm.numAtivos AS 'numAtivos'
    FROM gerencia.dbo.historicoServidoresMes AS hsm
    GROUP BY hsm.tEnte, hsm.ano, hsm.mes
    ORDER BY hsm.tEnte, hsm.ano, hsm.mes ASC"
    
    ,
    
    "SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes'/*, hsm.sexo AS 'Sexo', */hsm.entrada AS 'Entrada', hsm.saida AS 'Saida',
    hsm.numAtivos AS 'numAtivos'
    FROM gerencia.dbo.historicoServidoresMes AS hsm
    ORDER BY hsm.tEnte, hsm.ano, hsm.mes/*, hsm.sexo*/ ASC"
    
    )
    
    Apresentou:

    TITLE: Microsoft Report Designer
    ------------------------------

    Could not generate a list of fields for the query.
    Check the query syntax, or click Refresh Fields on the query toolbar.


    ------------------------------
    ADDITIONAL INFORMATION:

    Incorrect syntax near 'IFF'.
    The identifier that starts with 'SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', hsm.entrada AS 'Entrada', hsm.saida AS 'Saida',
    hsm.numAtivos A' is too long. Maximum length is 128.
    The identifier that starts with 'SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes'/*, hsm.sexo AS 'Sexo', */hsm.entrada AS 'Entrada', hsm.saida AS '' is too long. Maximum length is 128. (Microsoft SQL Server, Error: 102)

    For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.1399&EvtSrc=MSSQLServer&EvtID=102&LinkId=20476

    ------------------------------
    BUTTONS:

    OK
    ------------------------------

    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    segunda-feira, 15 de junho de 2009 17:29
  • aNetão,

    Mas o que você esta querendo fazer, eu particularmente não consegui entender!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 15 de junho de 2009 17:37
  • Junior,


    entao, segundo a tabela acima, temos ano, mes, sexo, entrada, saida. Certo!
    ano    mes    sexo    entrada    saida
    2009    01    F    4    2
    2009    01    M    7    3
    2009    02    F    14    0
    2009    02    M    10    1

    No parametro qdo for consultar todos os sexos, nao quero visualizar a tabela os valores acima, e sim, eles sumarizados por ano, mes:
    2009    01    4+7    2+3
    2009    02    14+10    0+1

    E qdo escolher o sexo, verei os registros do sexo selecionado. Ex.: F
    2009    01    F    4    2
    2009    02    F    14    0

    -
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    segunda-feira, 15 de junho de 2009 17:49
  • Não é IFF, é IIF, e você precisa colocar = na frente para indicar que é uma expressão
    =iif(...

    Alem disso, o RS não vai criar a lista de campos, você deve primeiro criar a lista de campos com uma SQL que não é expressão, depois altera o dataset e coloca a expressão.

    Mas se você puder colocar de uma maneira mais simples a sua dúvida talvez nós possamos dar uma sugestão melhor.

    Att
    Boreki
    http://www.boreki.eng.br
    segunda-feira, 15 de junho de 2009 17:50
  • Boreki,

    Agora no Preview:
    The CommandText expression for the query `dsGer´ contains an error: [BC30451] Name 'IFF' is not declared
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    segunda-feira, 15 de junho de 2009 18:23
  • Não é IFF, é IIF, e você precisa colocar = na frente para indicar que é uma expressão
    =iif(...

    http://www.boreki.eng.br
    segunda-feira, 15 de junho de 2009 20:24
  • Boreki,

    desculpe acima, foi um descuido/vacilo, contudo veja a consulta abaixo:
    =IIF ( Parameters!rpSexo.Value = "F,M"
    ,
    "SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', SUM(hsm.entrada) AS 'Entrada', SUM(hsm.saida) AS 'Saida',
    SUM(hsm.numAtivos) AS 'numAtivos'
    FROM gerencia.dbo.historicoServidoresMes AS hsm
    GROUP BY hsm.tEnte, hsm.ano, hsm.mes
    ORDER BY hsm.tEnte, hsm.ano, hsm.mes ASC
    " , "SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', hsm.entrada AS 'Entrada', hsm.saida AS 'Saida', hsm.numAtivos AS 'numAtivos' FROM gerencia.dbo.historicoServidoresMes AS hsm ORDER BY hsm.tEnte, hsm.ano, hsm.mes ASC" )
    Agora, consigo fazer a seleção, porem ao clicar em View Report !

    An error occurred during local report processing.
    An error has occurred during report processing.
    Cannot set the command text for data set 'dsGer'.
    Error during processing of the CommandText expression of dataset `dsGer´.


    -
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    terça-feira, 16 de junho de 2009 01:08
  • Acho que a expressão está incorreta. Ali na sua string tem algumas tags </br> que não sei se o Forum colocou por engano ou se estão na sua query. Mas as quebras de linha na string devem ser tratadas. Você deve concatenar a sua expressão para que ela fique em uma linha só.

    Aqui tem um exemplo de SQL dinamicas no Dataset:
    http://msdn.microsoft.com/en-us/library/aa237477(SQL.80).aspx

    Att
    Boreki
    http://www.boreki.eng.br
    quarta-feira, 17 de junho de 2009 05:25
  • Boreki,

    eu refez a query, poderia me ajudar no que está errado ?
    O parametro utilizado é multivalorado (Multi-value), para sexo possuindo F e M como valores.
    = " SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', "
    & IIF( Parameters!rpSexo.Value = "F,M", "", " hsm.sexo AS 'sexo' ")
    & IIF( Parameters!rpSexo.Value = "F,M", " SUM(hsm.entrada) ", " hsm.entrada ") & " AS 'Entrada', "
    & IIF( Parameters!rpSexo.Value = "F,M", " SUM(hsm.saida) ", " hsm.saida ") & " AS 'Saida', "
    & IFF( Parameters!rpSexo.Value = "F,M", " SUM(hsm.numAtivos) ", " hsm.numAtivos ") & " AS 'numAtivos' "
    & " FROM gerencia.dbo.historicoServidoresMes AS hsm "
    & IIF( Parameters!rpSexo.Value = "F,M", " GROUP BY hsm.tEnte, hsm.ano, hsm.mes ", "")
    -

    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    quarta-feira, 17 de junho de 2009 12:42
  • Ressalto:
    Essas tags de pulo (<br/>) de linha, é gerada pelo próprio Forum.

    -
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    quarta-feira, 17 de junho de 2009 15:09
  • Por favor.
    Espero que me ajude nessa questão !

    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    sexta-feira, 19 de junho de 2009 19:04
  • Para concatenar parametros multivalor voce precisa usar a funçào Join.

    Entao ficaria:
    =IIF( Join(Parameters!rpSexo.Value,",") = "F,M", "SQL 1", "SQL 2")

    Att
    Boreki
    http://www.boreki.eng.br
    sexta-feira, 19 de junho de 2009 21:52
  • =IIF( Join(Parameters!rpSexo.Value,",") = "F,M",
    "SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', SUM(hsm.entrada) AS 'Entrada', SUM(hsm.saida) AS 'Saida',
    SUM(hsm.numAtivos) AS 'numAtivos'
    FROM gerencia.dbo.historicoServidoresMes AS hsm
    GROUP BY hsm.tEnte, hsm.ano, hsm.mes
    ORDER BY hsm.tEnte, hsm.ano, hsm.mes ASC"
    ,
    "SELECT hsm.tEnte AS 'Ente', hsm.ano AS 'Ano', hsm.mes AS 'Mes', hsm.sexo AS 'Sexo', hsm.entrada AS 'Entrada', hsm.saida AS 'Saida',
    hsm.numAtivos AS 'numAtivos'
    FROM gerencia.dbo.historicoServidoresMes AS hsm
    ORDER BY hsm.tEnte, hsm.ano, hsm.mes, hsm.sexo ASC")
    Então, fez conforme vc me pediu. ...
    Testei as consultas no SSMS funcionam, está legal !
    Porem, ao testar o código acima, no Preview Report, apareceu e não sei o seria:

    An error occurred during local report processing.
    An error has occurred during report processing.
    Query execution failed for data set 'dsGer'.
    Incorrect syntax near the keyword 'BY'.
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    sábado, 20 de junho de 2009 17:28
  • Estou com isso pendente, alguém pode me ajudar a resolver isso?
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    quarta-feira, 24 de junho de 2009 00:39
  • aNetao,

    Para mim a expressão funciona como postei, a unica coisa que vejo de errado na sua consulta são as quebras de linha, se a expressão estiver inteira em uma linha ou se voce fechar as strings a cada quebra deveria funcionar. Recomendo testar colocar as suas consultas em uma linha e ver se isso funciona.

    Att
    Boreki


    http://www.boreki.eng.br
    • Marcado como Resposta Richard Juhasz quarta-feira, 27 de fevereiro de 2013 17:40
    sábado, 27 de junho de 2009 00:40