none
Dúvida na clausula IIF RRS feed

  • Pergunta

  • Boa tarde a todos,

    Estou desenvolvendo um relatório com o report builder e em um certo campo, preciso fazer um calculo percentual. Para isso, coloquei um IIF, para que não fosse feito nenhuma divisão com valor 0.
    A fórmula que criei não aparenta ter nenhum erro, pois o relatório funciona normalmente. O calculo percentual também funciona, o unico problema é que quando os valores da divisão sao 0 (os dois valores, ou apenas o dividendo), o campo fica com #ERRO ao invés de aparecer o valor 0, sendo que na fórmula está especificado para trazer 0.

    =IIf((Fields!CAPACIDADE_VESPERTINO.Value+Fields!CAPACIDADE_DIURNO.Value+Fields!CAPACIDADE_NOTURNO.Value)=0, 0, ((Fields!USO_VESPERTINO.Value+Fields!USO_DIURNO.Value+Fields!USO_NOTURNO.Value)/(Fields!CAPACIDADE_VESPERTINO.Value+Fields!CAPACIDADE_DIURNO.Value+Fields!CAPACIDADE_NOTURNO.Value))*100)

    Se eu troco o sinal ( / ) da fórmula como teste, e substituo por ( * ou + ou - ), ela funciona normalmente, o 0 aparece em seu devido lugar rsrs, e não mais o #ERRO. Realmente não entendi o que estava acontecendo, este erro só aparece quando o sinal é ( / ), se alguem souber de algo, agradeco.
    quarta-feira, 27 de janeiro de 2010 19:41

Respostas

  • Voce pode colocar um segundo iif na parte que esta sendo dividida, que quando for zero ele retorna um, dessa forma a divisao eh valida. O que eu normalmente fa'co 'e criar um custom code DivideOrZero que faz o if regular, como abaixo:

    mais ou menos assim:

    Function DivideOrZero(a, b)

    IF b = 0 Then
        return 0
    else
        return a /b
    end if

    end function
    http://www.boreki.eng.br
    • Sugerido como Resposta Diogo A. Di Pietro terça-feira, 13 de abril de 2010 01:13
    • Marcado como Resposta Richard Juhasz quinta-feira, 28 de fevereiro de 2013 12:50
    quinta-feira, 28 de janeiro de 2010 23:48

Todas as Respostas

  • ihitz,

    Não tenho certeza se o Reporting Builder possui a função IsNull. Verifique se esta função existe, acredito que ela poderá ser a solução.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 27 de janeiro de 2010 23:47
  • A funcao iif processa o lado verdadeiro e o lado falso da expressao independente do que sera retornato, o que quer dizer que mesmo verificando que o somatorio vai ser zero, ainda tera um erro de divisao por zero na segunda parte da divisao e a expressao reporta #erro. por essa razao que outras operacoes como + ou * nao dao erro.

    http://www.boreki.eng.br
    quinta-feira, 28 de janeiro de 2010 00:17
  • Entendi...

    E você sabe se existe outra maneira para resolver essa questão?

    quinta-feira, 28 de janeiro de 2010 12:18
  • Voce pode colocar um segundo iif na parte que esta sendo dividida, que quando for zero ele retorna um, dessa forma a divisao eh valida. O que eu normalmente fa'co 'e criar um custom code DivideOrZero que faz o if regular, como abaixo:

    mais ou menos assim:

    Function DivideOrZero(a, b)

    IF b = 0 Then
        return 0
    else
        return a /b
    end if

    end function
    http://www.boreki.eng.br
    • Sugerido como Resposta Diogo A. Di Pietro terça-feira, 13 de abril de 2010 01:13
    • Marcado como Resposta Richard Juhasz quinta-feira, 28 de fevereiro de 2013 12:50
    quinta-feira, 28 de janeiro de 2010 23:48
  • Boreki,

    Eu não conhecia este tipo de possibilidade no RS, alias pensei que não fosse possível.

    Este recurso você especificando em qual propriedade do objeto?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sexta-feira, 29 de janeiro de 2010 00:04
  • Junior,

    Propriedades do relatorio, Custom Code. Voce pode criar uma funcao usando codigo Visual Basic. Para chamar a funcao na expressao eh so usar =Code.NomeDaFuncao()

    Att
    Boreki
    http://www.boreki.eng.br
    sexta-feira, 29 de janeiro de 2010 19:03
  • Boreki,

    Certo, então podemos utilizar funções escritas em VB, legal, como não atuo mais como desenvolvedor, vamos perdendo um pouco da imaginação para este tipo de situação.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sábado, 30 de janeiro de 2010 15:52