Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com If Not...Else


Gabriel Cabral

Pergunta

Bom dia pessoal....

Cá estou com um prolema em que tenho um If Not...Else...End If...

O If Not é falso, mas ele não pula pro Else...ele continua na proxima linha...aí dá erro de Tipo de dados.....justamente porque não era pra continuar.....

Bem...vou colocar o código aqui e explicar melhor...

Eu faço um SELECT em que eu preciso selecionar, além de todos os campos da tabela FinanWin_Contas, a soma dos campos Con_ValorPgtoCP e Con_ValorPgtoCR ONDE nenhum desses campos pode ser nulo e que a data de pagamento [campo Con_DataPgto] esteja ENTRE a data inicial e a data final determinadas....

o que acontece é que quando eu informo um período em que não há registros nessas condições [if Not rs_relatorio.EOF Then], ao invés de ir pro Else e mostrar a MsgBox, o If Not que deveria ser falso, é tratado como verdadeiro e não vai pro Else....Então dá um erro de tipo de dados...o que já é esperado...

Dim Conex As New ADODB.Connection
Conex.Open StringDeConexao

With cmd_relatorio
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = "SELECT Con_Venc, Con_NumDoc, Con_ContParc, Con_ValorCP, Con_ValorCR, Con_DataEmissao, Con_Boleto, Con_NomeFantasia, Con_Tipo, Con_DataPgto, FinanWin_Contas.Con_ValorPgtoCR, FinanWin_Contas.Con_ValorPgtoCP, (Select Sum(Con_ValorPgtoCR) as totalCR From FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCR) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCR, (select sum(Con_ValorPgtoCP) as totalCP from FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCP) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCP FROM FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCP) OR Not isNull(Con_ValorPgtoCR) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "# ORDER BY Con_Tipo, Con_DataPgto, Con_Venc"
Set rs_relatorio = .Execute

If Not rs_relatorio.EOF Then
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption = rs_relatorio!totalCR
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption = rs_relatorio!totalCP
    
    Dim somaCR As Currency
    Dim somaCP As Currency
    Dim dif As Currency
    
    somaCR = rs_relatorio!totalCR
    somaCP = rs_relatorio!totalCP
    dif = somaCR - somaCP
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblDif").Caption = dif

    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption = Format(rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption, "##0.00")
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption = Format(rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption, "##0.00")
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblDif").Caption = Format(rptBalConPPagasConRReceb.Sections("Section5").Controls("lblDif").Caption, "##0.00")
    
    If dif < 0 Then
    rptBalConPPagasConRReceb.Sections("Section5").Controls("RS_Dif").ForeColor = vbRed
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblDif").ForeColor = vbRed
    Else
    rptBalConPPagasConRReceb.Sections("Section5").Controls("RS_Dif").ForeColor = vbBlue
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblDif").ForeColor = vbBlue
    End If
    
With rptBalConPPagasConRReceb
    Set .DataSource = rs_relatorio
    .DataMember = ""
    .Orientation = rptOrientLandscape
    .Refresh
    .Show
End With

Else
    MsgBox "Não há registros neste período.", vbExclamation
    txtDataInicial.SetFocus
End If

End With

End Sub

alguém conseguiria me ajudar??

Obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0

Os campos de Valor do Pagamento [Con_ValorPgtoCP e Con_ValorPgtoCR] NUNCA serão não-nulos no mesmo registro....

Ou o registro terá os dois como nulos...

Ou terá apenas o Con_ValorPgtoCP...

Ou terá apenas o Con_ValorPgtoCR...

o que eu percebi é que....quando eu coloco um período em que só há registros com um dos campos sendo nulo, dá erro na linha

rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption = rs_relatorio!totalCR
Ou na linha
rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption = rs_relatorio!totalCP

Dependendo do caso....

Isso ocorre porque, se um campo é nulo, não tem como mostrar seu valor no DataReport....

Mas é isso q eu não estou conseguindo fazer.....se CP for nulo e CR não, teria q colocar algo pra que a linha de comando acima que mostra o CP no relatorio fosse 'pulada'...

alguém conseguiu entender minha dúvida???

No aguardo por ajuda

Obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

Tente assim:

If Not rs_relatorio.EOF Then
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption = Iif(rs_relatorio!totalCR Is Null, 0, rs_relatorio!totalCR)
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption = Iif(rs_relatorio!totalCP Is Null, 0, rs_relatorio!totalCP)
    
    Dim somaCR As Currency
    Dim somaCP As Currency
    Dim dif As Currency
    
    somaCR = Iif(rs_relatorio!totalCR Is Null, 0, rs_relatorio!totalCR)
    somaCP = Iif(rs_relatorio!totalCP Is Null, 0, rs_relatorio!totalCP)
    dif = somaCR - somaCP

Editado por webdeveloper
Link para o comentário
Compartilhar em outros sites

  • 0

webdeveloper....eu experimentei da forma que você indicou, mas deu o seguinte:

Run-time error '424':

Object Required

e marcou a linha indicada abaixo..

If Not rs_relatorio.EOF Then
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption = Iif(rs_relatorio!totalCR Is Null, 0, rs_relatorio!totalCR) ' MARCOU ESTA LINHA COM O ERRO
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption = Iif(rs_relatorio!totalCP Is Null, 0, rs_relatorio!totalCP)
    
    Dim somaCR As Currency
    Dim somaCP As Currency
    Dim dif As Currency
    
    somaCR = Iif(rs_relatorio!totalCR Is Null, 0, rs_relatorio!totalCR)
    somaCP = Iif(rs_relatorio!totalCP Is Null, 0, rs_relatorio!totalCP)
    dif = somaCR - somaCP

Mas todos os objetos existem no relatorio....não sei porque deu esse erro....

Macêdo, kuroi, Graymalkin.....tentei te todos os jeitos que voces me indicaram....mas nenhum deu certo.....não sei porque....

Há registros mas o If Not rs_relatorio.BOF AND rs_relatorio.EOF está dando False....dizendo que não há registros...

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

Tente assim:

If Not rs_relatorio.EOF Then
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption = Iif(IsNull(rs_relatorio!totalCR), 0, rs_relatorio!totalCR) ' MARCOU ESTA LINHA COM O ERRO
    rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption = Iif(IsNull(rs_relatorio!totalCP), 0, rs_relatorio!totalCP)
    
    Dim somaCR As Currency
    Dim somaCP As Currency
    Dim dif As Currency
    
    somaCR = Iif(IsNull(rs_relatorio!totalCR), 0, rs_relatorio!totalCR)
    somaCP = Iif(IsNull(rs_relatorio!totalCP), 0, rs_relatorio!totalCP)
    dif = somaCR - somaCP

Link para o comentário
Compartilhar em outros sites

  • 0
Macêdo, kuroi, Graymalkin.....tentei te todos os jeitos que voces me indicaram....mas nenhum deu certo.....não sei porque....

Há registros mas o If Not rs_relatorio.BOF AND rs_relatorio.EOF está dando False....dizendo que não há registros...

Desse jeito o Not só está sendo aplicado ao primeiro valor. Acho que deveria ser:

If Not (rs_relatorio.BOF AND rs_relatorio.EOF) Then
    ...

Note os parênteses.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Isso mesmo, Graymalkin...exatamente.

Os parênteses eram necessários para o Not ser aplicado aos dois valores....

Muito obrigado.

_________________________________________

webdeveloper, experimentei esta ultima forma que voce indicou, deu certinho

Muitíssimo obrigado a todos vocês...kuroi, Macêdo, webdeveloper e Graymalkin.

Obrigado mesmo.

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

OBS.: Não sei se devo abrir outro tópico ou continuar neste mesmo....

Qualquer coisa me avisem que eu abro outro...

Estou terminando um outro relatorio....agora é o balancete de contas pagas e recebidas....E surgiu um outro problema...

Considerando que as contas pagas são as contas recebidas com o campo Con_DataPgto sendo não-nulo, observem este código:

Dim Conex As New ADODB.Connection
Conex.Open StringDeConexao

With cmd_relatorio
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = "SELECT Con_Venc, Con_NumDoc, Con_ContParc, Con_ValorCP, Con_ValorCR, Con_DataEmissao, Con_Boleto, Con_NomeFantasia, Con_Tipo, Con_DataPgto, FinanWin_Contas.Con_ValorPgtoCR, FinanWin_Contas.Con_ValorPgtoCP, (Select Sum(Con_ValorPgtoCR) as totalCR From FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCR) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCR, (select sum(Con_ValorPgtoCP) as totalCP from FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCP) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCP FROM FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCP) OR Not isNull(Con_ValorPgtoCR) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "# ORDER BY Con_Tipo, Con_DataPgto, Con_Venc"
Set rs_relatorio = .Execute

If Not (rs_relatorio.BOF And rs_relatorio.EOF) Then
rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCR").Caption = IIf(IsNull(rs_relatorio!totalCR), 0, rs_relatorio!totalCR)
rptBalConPPagasConRReceb.Sections("Section5").Controls("lblSomaCP").Caption = IIf(IsNull(rs_relatorio!totalCP), 0, rs_relatorio!totalCP)

Dim somaCR As Currency
Dim somaCP As Currency
Dim dif As Currency

somaCR = IIf(IsNull(rs_relatorio!totalCR), 0, rs_relatorio!totalCR)
somaCP = IIf(IsNull(rs_relatorio!totalCP), 0, rs_relatorio!totalCP)

dif = somaCR - somaCP
rptBalConPPagasConRReceb.Sections("Section5").Controls("lblDif").Caption = dif

Else
    MsgBox "Não há registros neste período.", vbExclamation
    txtDataInicial.SetFocus
End If

End With
Eu preciso selecionar [além de todos os campos da tabela FinanWin_Contas] a soma do campo Con_ValorPgtoCP e a soma do campo Con_ValorPgtoCR em que o campo Con_DataPgto não seja nulo e esteja entre duas datas determinadas pelo usuário. Considerando que na tabela eu tenha apenas um registro....seu campo Con_DataPgto = 17/03/08, logo não é nulo... Se, no form que gera o relatorio, eu coloco um periodo de 01/03/08 até 31/03/08, o relatorio é gerado normalmente, com os campos desse registro e as somas e diferença. Mas se coloco um período que não condiz com nenhum registro [de 01/01/01 até 01/02/01, por exemplo], o relatorio é gerado tambem com os campos desse unico registro da tabela....e as somas aparecem zeradas [R$0,00......o que está certo, já que não há registros nesse periodo]. Eu acho que o erro está no
If Not (rs_relatorio.BOF And rs_relatorio.EOF) Then

porque era pra 'pular' pro else, exibir a MsgBox e nem gerar o relatorio...

Ou pode ser erro no SELECT também....

alguém conseguiria me ajudar??

Obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0
Ou pode ser erro no SELECT também....

Com certeza, use o Debug.Print para 'printar' a Query, e cole ela no Banco de Dados, execute e veja o resultado.

Me desculpe, mas é que nunca fiz esse tipo de teste...não sei como proceder.

Como eu faço pra fazer isso??

Estou usando Access

Link para o comentário
Compartilhar em outros sites

  • 0

Altere este trecho:

Dim Conex As New ADODB.Connection
Conex.Open StringDeConexao

With cmd_relatorio
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = "SELECT Con_Venc, Con_NumDoc, Con_ContParc, Con_ValorCP, Con_ValorCR, Con_DataEmissao, Con_Boleto, Con_NomeFantasia, Con_Tipo, Con_DataPgto, FinanWin_Contas.Con_ValorPgtoCR, FinanWin_Contas.Con_ValorPgtoCP, (Select Sum(Con_ValorPgtoCR) as totalCR From FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCR) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCR, (select sum(Con_ValorPgtoCP) as totalCP from FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCP) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCP FROM FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCP) OR Not isNull(Con_ValorPgtoCR) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "# ORDER BY Con_Tipo, Con_DataPgto, Con_Venc"

Debug.Print .CommandText 'Veja se não dá erro

'Set rs_relatorio = .Execute

Depois você habilita a janela Immediate Window no menu View, execute o código, invoque este evento, volte ao VB note que na janela Immediate Window estará sua Query, copie ela, abra o Access, vá em Consultas, crie uma nova consulta, altere a visualização de Design para SQL, cole a Query que copiou do VB e tente executar.

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz isso....executei e deu o que está dando no VB.

Estou com três registros na tabela....

1-- Con_Tipo=CP; Con_DataPgto=17/03/08; Con_ValorPgto=100

2-- Con_Tipo=CP; Con_DataPgto=18/03/08; Con_ValorPgto=80

3-- Con_Tipo=CR; Con_DataPgto=17/03/08; Con_ValorPgto=70

Quando eu quero gerar um relatorio no periodo de 01/03/08 a 17/03/08, o relatorio teria que exibir os registros 1 e 3, a soma de CP teria que ser 100 e a de CR teria que ser 70...sendo a diferença -30 (CR-CP).

O relatorio está fazendo as somas e diferenças corretamente [fazendo as contas dos registros que estão no periodo indicado], mas está exibindo os tres registros.

Se eu escolho um periodo em que não há registros, o relatorio exibe os registro 1 e 2 [os que são Con_Tipo=CP]...e as somas e diferenças são R$0,00 [feitas corretamente]

Ainda não entendi o que está havendo =(

Link para o comentário
Compartilhar em outros sites

  • 0

Tente assim:

Dim Conex As New ADODB.Connection
Conex.Open StringDeConexao

With cmd_relatorio
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = "SELECT Con_Venc, Con_NumDoc, Con_ContParc, Con_ValorCP, Con_ValorCR, Con_DataEmissao, Con_Boleto, Con_NomeFantasia, Con_Tipo, Con_DataPgto, Con_ValorPgtoCR, Con_ValorPgtoCP, (Select Sum(Con_ValorPgtoCR) as totalCR From FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCR) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCR, (select sum(Con_ValorPgtoCP) as totalCP from FinanWin_Contas WHERE Not isNull(Con_ValorPgtoCP) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "#) as totalCP FROM FinanWin_Contas WHERE (Not isNull(Con_ValorPgtoCP) OR Not isNull(Con_ValorPgtoCR)) AND Con_DataPgto BETWEEN #" & Format(txtDataInicial, "yyyy/mm/dd") & "# AND #" & Format(txtDataFinal, "yyyy/mm/dd") & "# ORDER BY Con_Tipo, Con_DataPgto, Con_Venc"

Set rs_relatorio = .Execute

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...