PROBLEMA COM CONSULTA NO FLEXGRID
Olá pessoal, estou com um problema: Tenho uma rotina de cálculo de vendas que lê os dados em um flexgrid e faz o cálculo de vários tipos de venda diferente. O que esta acontecendo é que o resultado que estou obtendo das vendas, esta errado. Estou achando que pode ser o tipo de formatação nas variáveis que estou usando mas já tentei várias coisas e nada. Agradeço se alguém tiver alguma idéia.
Segue o código:
Segue o código:
Public Sub CalculaVenda()
Dim iLinhas, i As Integer
Dim dVendaPrazo, dVendaVista, dVendaRestricao, dValor, dVendaTotal As Double
[ô] iLinhas = MSFlexGrid.Rows
For i = 1 To MSFlexGrid.Rows - 1
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = [Ô]1[Ô] Then [ô]Venda a Prazo
dVendaPrazo = Val(dVendaPrazo) + Val(MSFlexGrid.TextMatrix(i, 6))
End If
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = [Ô]2[Ô] Then [ô]Venda a Vista
dVendaVista = Val(dVendaVista) + Val(MSFlexGrid.TextMatrix(i, 6))
End If
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = [Ô]9[Ô] Then [ô]Venda a prazo com Restrição
dVendaRestricao = Val(dVendaRestricao) + Val(MSFlexGrid.TextMatrix(i, 6))
End If
dValor = (MSFlexGrid.TextMatrix(i, 6))
dVendaTotal = Val(dVendaTotal) + Val(dValor)
Next i
If dVendaPrazo = [Ô][Ô] Then
lblVendaPrazo.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaPrazo = Format$(dVendaPrazo, [Ô]currency[Ô])
End If
If dVendaRestricao = [Ô][Ô] Then
lblVendaRestricao.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaRestricao = Format$(dVendaRestricao, [Ô]currency[Ô])
End If
If dVendaVista = [Ô][Ô] Then
lblVendaVista.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaVista = Format$(dVendaVista, [Ô]currency[Ô])
End If
lblVendaTotal = Format$(dVendaTotal, [Ô]currency[Ô])
End Sub
troque os VAL por CDbl, e funcionará
Obrigado pela atenção Marcelo ! Troquei o val pelo CDbl como você sugeriu, mas agora depois do CDbl os valores são formatados sem as casas decimais. Falta mais alguma coisa na formatação?
For i = 1 To MSFlexGrid.Rows - 1
If (MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) <> [Ô][Ô]) And (MSFlexGrid.TextMatrix(i, 6) <> [Ô][Ô]) Then
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = 1 Then [ô]Venda a Prazo
dVendaPrazo = CDbl(lblVendaPrazo) + CDbl(MSFlexGrid.TextMatrix(i, 6))
End If
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = 2 Then [ô]Venda a Vista
dVendaVista = CDbl(dVendaVista) + CDbl(MSFlexGrid.TextMatrix(i, 6))
End If
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = 9 Then [ô]Venda a prazo com Restrição
dVendaRestricao = CDbl(dVendaRestricao) + CDbl(MSFlexGrid.TextMatrix(i, 6))
End If
dVendaTotal = CDbl(dVendaTotal) + CDbl(MSFlexGrid.TextMatrix(i, 6))
End If
Next i
ola boa tarde, cara tenta usar ao inves de cdbl(variavel) usa ccur(variavel) outra coisa, nao tem muita ligação com o que estava perguntando mas observei que vc cria as
variaveis seguido de (,) -->
Dim dVendaPrazo, dVendaVista, dVendaRestricao, dValor, dVendaTotal As Double
nesse caso apenas a ultima que esta assumindo o tipo double as outras assumem o tipo variant, que acaba reduzindo a performance do sistema, crie elas assim:
Dim dVendaPrazo as double, dVendaVista as double, dVendaRestricao as double, dValor as double, dVendaTotal As Double
ai fica melhor pra trabalhar...
abs...
variaveis seguido de (,) -->
Dim dVendaPrazo, dVendaVista, dVendaRestricao, dValor, dVendaTotal As Double
nesse caso apenas a ultima que esta assumindo o tipo double as outras assumem o tipo variant, que acaba reduzindo a performance do sistema, crie elas assim:
Dim dVendaPrazo as double, dVendaVista as double, dVendaRestricao as double, dValor as double, dVendaTotal As Double
ai fica melhor pra trabalhar...
abs...
Utilize assim:
dVendaTotal = CCur(dVendaTotal) + CCur(MSFlexGrid.TextMatrix(i, 6))
lblVendaTotal.Caption = FormatNumber(dVendaTotal, 2)
dVendaTotal = CCur(dVendaTotal) + CCur(MSFlexGrid.TextMatrix(i, 6))
lblVendaTotal.Caption = FormatNumber(dVendaTotal, 2)
não acredito que seja o CDbl o problema pois o mesmo não exclui as virgulas.
ex:
o que pode estar acontecendo é isto que o colega ANDPAG comentou, suas variaveis não declaradas devem estar assumindo um valor inteiro.
mude as declarações para
ex:
Private Sub Command1_Click()
Dim ValorA As String, valorB As String
ValorA = [Ô]1,37[Ô]
valorB = [Ô]3,8[Ô]
MsgBox CDbl(ValorA) + CDbl(valorB)
End Sub
o que pode estar acontecendo é isto que o colega ANDPAG comentou, suas variaveis não declaradas devem estar assumindo um valor inteiro.
mude as declarações para
Dim dVendaPrazo As Double, dVendaVista As Double, dVendaRestricao As Double, dValor As Double, dVendaTotal As Double
Pessoal segui as dicas dos colegas ANDPAG e MSMJUDAS. Depois das mudanças ficou assim:
Em um teste que fiz, estou obtendo 1200,00 e deveria ser 12,00. Acho que agora é só mexer nas casas decimais.
Public Sub CalculaVenda()
Dim iLinhas, i As Integer
Dim dVendaPrazo As Double, dVendaVista As Double, dVendaRestricao As Double, dValor As Double, dVendaTotal As Double
iLinhas = MSFlexGrid.Rows
lblVendaPrazo = 0
For i = 1 To MSFlexGrid.Rows - 1
If (MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) <> [Ô][Ô]) And (MSFlexGrid.TextMatrix(i, 6) <> [Ô][Ô]) Then
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = 1 Then [ô]Venda a Prazo
dVendaPrazo = CCur(dVendaPrazo) + CCur(MSFlexGrid.TextMatrix(i, 6))
End If
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = 2 Then [ô]Venda a Vista
dVendaVista = CCur(dVendaVista) + CCur(MSFlexGrid.TextMatrix(i, 6))
End If
If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = 9 Then [ô]Venda a prazo com Restrição
dVendaRestricao = CCur(dVendaRestricao) + CCur(MSFlexGrid.TextMatrix(i, 6))
End If
End If
Next i
If dVendaPrazo = 0 Then
lblVendaPrazo.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaPrazo.Caption = Format(dVendaPrazo, [Ô]currency[Ô])
End If
If dVendaRestricao = 0 Then
lblVendaRestricao.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaRestricao.Caption = Format(dVendaRestricao, [Ô]currency[Ô])
End If
If dVendaVista = 0 Then
lblVendaVista.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaVista.Caption = Format(dVendaVista, [Ô]currency[Ô])
End If
dVendaTotal = CCur(dVendaPrazo) + CCur(dVendaRestricao) + CCur(dVendaVista)
lblVendaTotal.Caption = Format(dVendaTotal, [Ô]currency[Ô])
End Sub
Em um teste que fiz, estou obtendo 1200,00 e deveria ser 12,00. Acho que agora é só mexer nas casas decimais.
faz o seguinte poste os valores de algumas células do flexgrid
ah detalhe, veja bem
toda vez que o conteúdo da coluna 8 for igual 1 será efetuado a soma a dVendaPrazo
ou seja
supondo que dVendaPrazo iniciar em zero e existirem os seguinte campos no flexgrid
coluna 1 | coluna 2 ...Coluna 6 | coluna 7 | Coluna 8
[txt-color=#e80000]3,4 | | 1[/txt-color]
5,7 | | 2
[txt-color=#e80000]8,6 | | 1[/txt-color]
[txt-color=#e80000]15,3 | | 1[/txt-color]
ou seja será efetuado a seguinte soma: dVendaPrazo = 3,4 + 8,6 + 15,3
dvendapraz = 27,3
veja se é isso mesmo que deseja
toda vez que o conteúdo da coluna 8 for igual 1 será efetuado a soma a dVendaPrazo
Citação:If MSFlexGrid.TextMatrix(MSFlexGrid.Rows - i, 8) = 1 Then [ô]Venda a Prazo
dVendaPrazo = CCur(dVendaPrazo) + CCur(MSFlexGrid.TextMatrix(i, 6))
End If
ou seja
supondo que dVendaPrazo iniciar em zero e existirem os seguinte campos no flexgrid
coluna 1 | coluna 2 ...Coluna 6 | coluna 7 | Coluna 8
[txt-color=#e80000]3,4 | | 1[/txt-color]
5,7 | | 2
[txt-color=#e80000]8,6 | | 1[/txt-color]
[txt-color=#e80000]15,3 | | 1[/txt-color]
ou seja será efetuado a seguinte soma: dVendaPrazo = 3,4 + 8,6 + 15,3
dvendapraz = 27,3
veja se é isso mesmo que deseja
é isso mesmo Marcelo. Na verdade o que acontece é o seguinte:
- Eu busco em uma tabela [Ô]VENDAS[Ô] registros que são filtrados dependendo do critério escolhido pelo usuário;
- Através de um SELECT os dados são listados no Grid;
- Depois faço uma nova consulta dentro do Grid para saber as totalizações;
- O tipo de venda é identificada por: Venda Vista (1), Venda a Prazo (2) e Venda a Prazo com Restrição (9);
- No final somo todas as vendas para saber o total das vendas;
Os problemas:
- O que estava acontecendo, é que o cálculo estava errado;
- Depois das mudanças feitas, esta certo, mas não esta dividindo as casas decimais. Exemplo (O que deveria ser 12,00 esta aparecendo 12000);
- Uma coisa que ainda não comentei para não complicar, é que não estou conseguindo ler a primeira linha do grid:
Segue uma tela do grid para exemplificar melhor:
- Eu busco em uma tabela [Ô]VENDAS[Ô] registros que são filtrados dependendo do critério escolhido pelo usuário;
- Através de um SELECT os dados são listados no Grid;
- Depois faço uma nova consulta dentro do Grid para saber as totalizações;
- O tipo de venda é identificada por: Venda Vista (1), Venda a Prazo (2) e Venda a Prazo com Restrição (9);
- No final somo todas as vendas para saber o total das vendas;
Os problemas:
- O que estava acontecendo, é que o cálculo estava errado;
- Depois das mudanças feitas, esta certo, mas não esta dividindo as casas decimais. Exemplo (O que deveria ser 12,00 esta aparecendo 12000);
- Uma coisa que ainda não comentei para não complicar, é que não estou conseguindo ler a primeira linha do grid:
Segue uma tela do grid para exemplificar melhor:
Tenta esta modificação
Public Sub CalculaVenda()
Dim dVendaPrazo As Double, dVendaVista As Double, dVendaRestricao As Double, dValor As Double, dVendaTotal As Double
lblVendaPrazo = 0
With MSFlexgrid
For i = 1 To .Rows - 1
If (.TextMatrix(i, 8) <> [Ô][Ô]) And (.TextMatrix(i, 6) <> [Ô][Ô]) Then
If .TextMatrix(i, 8) = [Ô]1[Ô] Then [ô]Venda a Prazo
dVendaPrazo = dVendaPrazo + CDbl(.TextMatrix(i, 6))
End If
If .TextMatrix(i, 8) = [Ô]2[Ô] Then [ô]Venda a Vista
dVendaVista = dVendaVista + CDbl(.TextMatrix(i, 6))
End If
If .TextMatrix(i, 8) = [Ô]9[Ô] Then [ô]Venda a prazo com Restrição
dVendaRestricao = dVendaRestricao + CDbl(.TextMatrix(i, 6))
End If
End If
Next i
End With
If dVendaPrazo = 0 Then
lblVendaPrazo.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaPrazo.Caption = Format(dVendaPrazo, [Ô]currency[Ô])
End If
If dVendaRestricao = 0 Then
lblVendaRestricao.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaRestricao.Caption = Format(dVendaRestricao, [Ô]currency[Ô])
End If
If dVendaVista = 0 Then
lblVendaVista.Caption = [Ô]R$ 0,00[Ô]
Else
lblVendaVista.Caption = Format(dVendaVista, [Ô]currency[Ô])
End If
dVendaTotal = dVendaPrazo + dVendaRestricao + dVendaVista
lblVendaTotal.Caption = Format(dVendaTotal, [Ô]currency[Ô])
End Sub
Tópico encerrado , respostas não são mais permitidas