none
Condicional IF utilizando duas condições RRS feed

  • Pergunta

  • Olá, será que alguém pode me ajudar por favor...! query no (Sql Server 2008-R2)

    A situação é a seguinte:

    eu preciso buscar a "Conta Contábil" dos Títulos. Se a nota for de entrada busco a conta contábil da tabela de "Contas a Pagar" se for de saída  busco do "Contas a Receber", se não existir título preciso buscar da tabela de clientes também com condição, sendo nota de entrada busco do campo = ContaContabilFor sendo nota de saída busco do campo = ContaContabilCli.

    montei da forma abaixo, mas esta dando erro de sintaxe. Agradeço desde já..!

    ============================

     IF (NotaFiscal.TipoNota = 0)
    BEGIN
    ContasPagar.ContaContabil
    END 
           ELSE 
    BEGIN
    ContasReceber.ContaContabil
    END 
    ELSE IF (NotaFiscal.TipoNota = 0) AND (ContasReceber.ContaContabil) OR (ContasPagar.ContaContabil) IS NULL
    BEGIN

    Cliente.ContaContabilfor
    END
    ELSE
    ELSE
    Cliente.ContaContabilcli
    END

    quinta-feira, 6 de fevereiro de 2014 20:52

Respostas

  • Gilguitar,

    Agora vendo sua consulta e sabendo que você utiliza o SQL 2008 R2, com certeza você deve utilizar o CASE, como eu havia afirmado no post anterior. 

    Eu apenas mudei à ordem das condições e criei mais uma para executar às condições que você espera. Talvez seja necessário fazer um ajuste, mas sem ter dados para simular fica um pouco mais difícil. Segue uma sugestão para seu script de consulta. 

    Para evitar lentidão eu sugiro que você verifique às condições dos seus JOINs, principalmente em grandes volumes de dados.

    SELECT
     CASE
      WHEN (nf.TipoNota = 0) AND (cb.Ccontabil IS NULL OR cpc.Ccontabil IS NULL) THEN cli.CcontabilCliente
      WHEN (nf.TipoNota = 0) THEN cpc.Ccontabil
      ELSE (CASE
    		WHEN nf.TipoNota > 0 THEN cb.Ccontabil
    		ELSE cli.CcontabiFornecedor 
    		END )
      END AS SEU_IF
    
    FROM         
    ------NFiscal AS nf  --///TABELA DE NOTA FISCAL
    LEFT OUTER JOIN
    ------Clientes AS cli
    --------ON cli.Cgc = (CASE WHEN TipoNota = 0 THEN nf.Cgcemissor ELSE nf.CGC END) 
    LEFT OUTER JOIN
    ------Cobranca AS cb --(CONTAS A RECEBER)
    --------ON nf.Empresa = cb.Empresa AND nf.Filial = cb.Filial AND nf.NumNF = cb.NumNF AND nf.Series = cb.Serie AND nf.CGC = cb.Cliente 
    LEFT OUTER JOIN
    ------Cpcobranca AS cpc --(CONTAS A PAGAR)
    --------ON nf.Empresa = cpc.Empresa AND nf.Filial = cpc.Filial AND nf.Cgcemissor = cpc.Cliente AND nf.Series = cpc.Serie AND nf.NumNF = cpc.Numnf 
    LEFT OUTER JOIN
    ------PlanoContas pc
    --------ON pc.Empresa = (CASE WHEN NF.TipoNota = 0 THEN cpc.Empresa ELSE cb.Empresa END) and pc.Ccontabil = (CASE WHEN NF.TipoNota = 0 THEN cpc.Ccontabil ELSE cb.Ccontabil END)

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 10 de fevereiro de 2014 17:05
    Moderador

Todas as Respostas

  • Você tem um ELSE a mais no final do código, denteando fica mais fácil de perdeber:

    IF (NotaFiscal.TipoNota = 0)
    BEGIN
    ContasPagar.ContaContabil
    END 
    ELSE 
    BEGIN
    ContasReceber.ContaContabil
    END 
    ELSE IF (NotaFiscal.TipoNota = 0) AND (ContasReceber.ContaContabil) OR (ContasPagar.ContaContabil) IS NULL
    BEGIN
    Cliente.ContaContabilfor
    END
    ELSE
    ELSE
    Cliente.ContaContabilcli
    END 

    quinta-feira, 6 de fevereiro de 2014 21:26
  • Você tem um ELSE a mais no final do código, denteando fica mais fácil de perdeber:

    IF (NotaFiscal.TipoNota = 0)
    BEGIN
    ContasPagar.ContaContabil
    END 
    ELSE 
    BEGIN
    ContasReceber.ContaContabil
    END 
    ELSE IF (NotaFiscal.TipoNota = 0) AND (ContasReceber.ContaContabil) OR (ContasPagar.ContaContabil) IS NULL
    BEGIN
    Cliente.ContaContabilfor
    END
    ELSE
    ELSE
    Cliente.ContaContabilcli
    END 

    formulários web são terríveis, segue denteamento com hifén:

    IF (NotaFiscal.TipoNota = 0)
    ----BEGIN
    --------ContasPagar.ContaContabil
    ----END 
    ELSE 
    ----BEGIN
    --------ContasReceber.ContaContabil
    ----END 
    ELSE IF (NotaFiscal.TipoNota = 0) AND (ContasReceber.ContaContabil) OR (ContasPagar.ContaContabil) IS NULL
    ----BEGIN
    --------Cliente.ContaContabilfor
    ----END
    ELSE
    ELSE
    ----Cliente.ContaContabilcli
    END 


    quinta-feira, 6 de fevereiro de 2014 21:29
  • Gilguitar,

    Como você não especificou se estas condições serão relacionadas diretamente em uma consulta, mas a forma que você declara estes IF´s indica que estes campos estão relacionados às tabelas NotaFiscal, Cliente, ContasReceber e ContasPagar.

    Segue abaixo um modelo para você adaptar à sua situação, utilizando CASE:

    SELECT CASE
      WHEN NotaFiscal.TipoNota = 0 THEN ContasPagar.ContaContabil
      WHEN (NotaFiscal.TipoNota = 0) AND (ContasPagar.ContaContabil IS NULL) THEN Cliente.ContaContabilfor
      ELSE Cliente.ContaContabilcli
    END
    FROM NotaFiscal, ContasPagar, Cliente WHERE ... 

    Para maiores informações sobre o uso de CASE veja o link abaixo:

    http://msdn.microsoft.com/pt-br/library/ms181765.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 10 de fevereiro de 2014 11:08
    Moderador
  • Durval Ramos,

    Obrigado pela resposta, o relacionamento esta ok, mas é preciso verificar duas condições a primeira é:

    ==========================================

    1° --- se houver títulos

    --- Nota = 'entrada'

    pega valor conta contábil da Tabela "Contas a Pagar"

    --- Nota = 'saída'

    pega valor conta contábil da Tabela "Contas a Receber"

    2° --- se não houver títilos(o valor da conta contábil vai ser nula na VIEW), então:

    --- Nota = 'entrada'

    pega valor conta contábil no campo "Contas a Pagar" da Tabela de "Clientes"

    --- Nota = 'saída'

    pega valor conta contábil no campo "Contas a Receber" da Tabela de "Clientes"

    ==========================================

    Não sei como montar a estrutura do (IF) para esses duas condições. Fiz como mostra abaixo mas esta dando erro de sintaxe:

    ===========================================

    IF (nf.TipoNota = 0)
    ----BEGIN
    --------ContasPagar.ContaContabil
    ----END 

    --ELSE 
    ----BEGIN
    --------ContasReceber.ContaContabil
    ----END
    --END
     
    -ELSE IF (nf.TipoNota = 0) AND (ContasReceber.ContaContabil) OR (ContasPagar.ContaContabil) IS NULL
    ----BEGIN
    --------cliente.CcontabilFornecedor
    ----END

    --ELSE
    ----BEGIN
    --------cliente.CcontabilCliente
    ----END
    --END
    -END 
    END

    ===========================================

           
    segunda-feira, 10 de fevereiro de 2014 15:29
  • Durval Ramos,

    Obrigado pela resposta, o relacionamento esta ok, mas é preciso verificar duas condições a primeira é:

    ==========================================

    1° --- se houver títulos

    --- Nota = 'entrada'

    pega valor conta contábil da Tabela "Contas a Pagar"

    --- Nota = 'saída'

    pega valor conta contábil da Tabela "Contas a Receber"

    2° --- se não houver títilos(o valor da conta contábil vai ser nula na VIEW), então:

    --- Nota = 'entrada'

    pega valor conta contábil no campo "Contas a Pagar" da Tabela de "Clientes"

    --- Nota = 'saída'

    pega valor conta contábil no campo "Contas a Receber" da Tabela de "Clientes"

    ==========================================

    Não sei como montar a estrutura do (IF) para esses duas condições. Fiz como mostra abaixo mas esta dando erro de sintaxe:

    ===========================================

    IF (nf.TipoNota = 0)
    ----BEGIN
    --------ContasPagar.ContaContabil
    ----END 

    --ELSE 
    ----BEGIN
    --------ContasReceber.ContaContabil
    ----END
    --END
     
    -ELSE IF (nf.TipoNota = 0) AND (ContasReceber.ContaContabil) OR (ContasPagar.ContaContabil) IS NULL
    ----BEGIN
    --------cliente.CcontabilFornecedor
    ----END

    --ELSE
    ----BEGIN
    --------cliente.CcontabilCliente
    ----END
    --END
    -END 
    END

    ===========================================

           

    Gilguitar,

    Você pode mostrar sua consulta e o erro que está sendo exibido para você ? Assim podemos ajudar mais.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 10 de fevereiro de 2014 15:50
    Moderador
  • DURVAL RAMOS,

    SEGUE MEU SCRIPT ABAIXO:

    ==========================================================

    SELECT   

    --------IF nf.TipoNota = 0 --///FALA QUE A SINTAXE ESTA INCORRETA PROXIMA DO "IF"
    ----------------BEGIN
    -------------------cpc.Ccontabil
    ----------------END 

    ------------ELSE --///FALA QUE ESTA ESPERANDO (TRY) OU (CONVERSATION)
    ----------------BEGIN
    -------------------cb.Ccontabil
    ----------------END
    ------------END --///FALA QUE ESTA ESPERANDO (TRY) OU (CONVERSATION)


    ------------ELSE IF (nf.TipoNota = 0) AND (cb.Ccontabil IS NULL) OR (cpc.Ccontabil IS NULL)
    --///FALA QUE ESTA ESPERANDO (TRY) OU (CONVERSATION)
    ----------------BEGIN
    -------------------cli.CcontabilCliente
    ----------------END
    ------------ELSE --///FALA QUE ESTA ESPERANDO (TRY) OU (CONVERSATION)
    ----------------BEGIN
    -------------------cli.CcontabiFornecedor
    ----------------END
    --------END -- ///FALA QUE ESTA ESPERANDO (TRY) OU (CONVERSATION)

    FROM         
    ------NFiscal AS nf  --///TABELA DE NOTA FISCAL
    LEFT OUTER JOIN
    ------Clientes AS cli
    --------ON cli.Cgc = (CASE WHEN TipoNota = 0 THEN nf.Cgcemissor ELSE nf.CGC END) 
    LEFT OUTER JOIN
    ------Cobranca AS cb --(CONTAS A RECEBER)
    --------ON nf.Empresa = cb.Empresa AND nf.Filial = cb.Filial AND nf.NumNF = cb.NumNF AND nf.Series = cb.Serie AND nf.CGC = cb.Cliente 
    LEFT OUTER JOIN
    ------Cpcobranca AS cpc --(CONTAS A PAGAR)
    --------ON nf.Empresa = cpc.Empresa AND nf.Filial = cpc.Filial AND nf.Cgcemissor = cpc.Cliente AND nf.Series = cpc.Serie AND nf.NumNF = cpc.Numnf 
    LEFT OUTER JOIN
    ------PlanoContas pc
    --------ON pc.Empresa = (CASE WHEN NF.TipoNota = 0 THEN cpc.Empresa ELSE cb.Empresa END) and pc.Ccontabil = (CASE WHEN NF.TipoNota = 0 THEN cpc.Ccontabil ELSE cb.Ccontabil END)

    ==========================================================

       
    segunda-feira, 10 de fevereiro de 2014 16:31
  • Gilguitar,

    Agora vendo sua consulta e sabendo que você utiliza o SQL 2008 R2, com certeza você deve utilizar o CASE, como eu havia afirmado no post anterior. 

    Eu apenas mudei à ordem das condições e criei mais uma para executar às condições que você espera. Talvez seja necessário fazer um ajuste, mas sem ter dados para simular fica um pouco mais difícil. Segue uma sugestão para seu script de consulta. 

    Para evitar lentidão eu sugiro que você verifique às condições dos seus JOINs, principalmente em grandes volumes de dados.

    SELECT
     CASE
      WHEN (nf.TipoNota = 0) AND (cb.Ccontabil IS NULL OR cpc.Ccontabil IS NULL) THEN cli.CcontabilCliente
      WHEN (nf.TipoNota = 0) THEN cpc.Ccontabil
      ELSE (CASE
    		WHEN nf.TipoNota > 0 THEN cb.Ccontabil
    		ELSE cli.CcontabiFornecedor 
    		END )
      END AS SEU_IF
    
    FROM         
    ------NFiscal AS nf  --///TABELA DE NOTA FISCAL
    LEFT OUTER JOIN
    ------Clientes AS cli
    --------ON cli.Cgc = (CASE WHEN TipoNota = 0 THEN nf.Cgcemissor ELSE nf.CGC END) 
    LEFT OUTER JOIN
    ------Cobranca AS cb --(CONTAS A RECEBER)
    --------ON nf.Empresa = cb.Empresa AND nf.Filial = cb.Filial AND nf.NumNF = cb.NumNF AND nf.Series = cb.Serie AND nf.CGC = cb.Cliente 
    LEFT OUTER JOIN
    ------Cpcobranca AS cpc --(CONTAS A PAGAR)
    --------ON nf.Empresa = cpc.Empresa AND nf.Filial = cpc.Filial AND nf.Cgcemissor = cpc.Cliente AND nf.Series = cpc.Serie AND nf.NumNF = cpc.Numnf 
    LEFT OUTER JOIN
    ------PlanoContas pc
    --------ON pc.Empresa = (CASE WHEN NF.TipoNota = 0 THEN cpc.Empresa ELSE cb.Empresa END) and pc.Ccontabil = (CASE WHEN NF.TipoNota = 0 THEN cpc.Ccontabil ELSE cb.Ccontabil END)

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 10 de fevereiro de 2014 17:05
    Moderador