LOOP EM GRID COM BUG.

KIKO.WIZZ 19/09/2009 11:37:42
#323261
Salve!
Estou com um problema com uma grid, que esta duplicando o numero de linhas.
Por exemplo, eu tenho 4 registros no SQL, o loop está criando 8 linhas para a grid ao invés de 4....
Pensei que fosse alguma linha errada, então usei aquele marcador que deixa a linha vermelha(não sei o nome) para verificar o problema em tempo de execução.. Para minha surpresa, isso não acontece quando eu coloco o marcador...
Esté é o evento:
--------------------------------------------------------------------------------------------------------------------------
Private Sub cboCliente_LostFocus()
Dim rsTable As ADODB.Recordset
Set rsTable = New ADODB.Recordset
Dim i As Integer

If cboCliente <> [Ô][Ô] Then
mskData = Format(vData, [Ô]dd/mm/yyyy[Ô])
rsTable.Open [Ô]SELECT * FROM Locado WHERE Cliente =[ô][Ô] & cboCliente & [Ô][ô][Ô], ADOconn, adOpenForwardOnly, adLockReadOnly
If Not rsTable.EOF Then
cboCliente.Clear
cboCliente = rsTable([Ô]Cliente[Ô])
cboAutorizado.Clear
cboAutorizado = rsTable([Ô]Autorizado[Ô])
cboTitulo.Clear
cboTitulo = [Ô][Ô]
mskDevolucao = rsTable([Ô]Devolução[Ô])
mskTotal = Format(rsTable([Ô]Valor[Ô]), [Ô]##,##0.00[Ô])
chkPago.Value = rsTable([Ô]Pago[Ô])
If chkPago.Value = 1 Then
chkPago.Enabled = False
End If
vTempID = rsTable([Ô]Locado ID[Ô])
rsTable.Close

[ô]grid
rsTable.Open [Ô]SELECT * FROM [Locado Dados] WHERE [Locado ID] =[Ô] & vTempID, ADOconn, adOpenForwardOnly, adLockReadOnly
i = 1
Do Until rsTable.EOF
GridTitulos.AddItem (Row)
GridTitulos.TextMatrix(i, 0) = rsTable([Ô]Título[Ô])
GridTitulos.TextMatrix(i, 1) = rsTable([Ô]Valor[Ô])
GridTitulos.TextMatrix(i, 2) = rsTable([Ô]Devolução[Ô])
rsTable.MoveNext
i = i + 1
Loop
rsTable.Close
cboCliente.Enabled = False
cboAutorizado.Enabled = False
cboTitulo.Enabled = False
Else
MsgBox [Ô]Cliente inexistente.[Ô], vbCritical
End If
End If
----------------------------------------------------------------------------------------------------------------------

Alguém já teve este problema?
Alguma idéia?

ASHKATCHUP 19/09/2009 12:23:53
#323265
Resposta escolhida
O nome do marcador vermelho é BREAKPOINT.

E, em caso de erros que não acontecem quando você coloca um breakpoint, sugiro colocar um doevents no código.


Private Sub cboCliente_LostFocus()
Dim rsTable As ADODB.Recordset
Set rsTable = New ADODB.Recordset
Dim i As Integer

If cboCliente <> [Ô][Ô] Then
mskData = Format(vData, [Ô]dd/mm/yyyy[Ô])
rsTable.Open [Ô]SELECT * FROM Locado WHERE Cliente =[ô][Ô] & cboCliente & [Ô][ô][Ô], ADOconn, adOpenForwardOnly, adLockReadOnly
If Not rsTable.EOF Then
cboCliente.Clear
cboCliente = rsTable([Ô]Cliente[Ô])
cboAutorizado.Clear
cboAutorizado = rsTable([Ô]Autorizado[Ô])
cboTitulo.Clear
cboTitulo = [Ô][Ô]
mskDevolucao = rsTable([Ô]Devolução[Ô])
mskTotal = Format(rsTable([Ô]Valor[Ô]), [Ô]##,##0.00[Ô])
chkPago.Value = rsTable([Ô]Pago[Ô])
If chkPago.Value = 1 Then
chkPago.Enabled = False
End If
vTempID = rsTable([Ô]Locado ID[Ô])
rsTable.Close

[ô]grid
rsTable.Open [Ô]SELECT * FROM [Locado Dados] WHERE [Locado ID] =[Ô] & vTempID, ADOconn, adOpenForwardOnly, adLockReadOnly
i = 1
Do Until rsTable.EOF
GridTitulos.AddItem (Row)
GridTitulos.TextMatrix(i, 0) = rsTable([Ô]Título[Ô])
GridTitulos.TextMatrix(i, 1) = rsTable([Ô]Valor[Ô])
GridTitulos.TextMatrix(i, 2) = rsTable([Ô]Devolução[Ô])
rsTable.MoveNext
DoEvents
i = i + 1
Loop
rsTable.Close
cboCliente.Enabled = False
cboAutorizado.Enabled = False
cboTitulo.Enabled = False
Else
MsgBox [Ô]Cliente inexistente.[Ô], vbCritical
End If
End If
End Sub

DANIKULL 19/09/2009 13:45:50
#323268
KIKO_WIZZ, boa tarde.

Faça a seguinte alteração abaixo e veja se funciona:
Esta é a parte original da programação:


[ô]grid
rsTable.Open [Ô]SELECT * FROM [Locado Dados] WHERE [Locado ID] =[Ô] & vTempID, ADOconn, adOpenForwardOnly, adLockReadOnly
i = 1
Do Until rsTable.EOF
GridTitulos.AddItem (Row)
GridTitulos.TextMatrix(i, 0) = rsTable([Ô]Título[Ô])
GridTitulos.TextMatrix(i, 1) = rsTable([Ô]Valor[Ô])
GridTitulos.TextMatrix(i, 2) = rsTable([Ô]Devolução[Ô])
rsTable.MoveNext
i = i + 1
Loop
rsTable.Close


Agora mude para esta abaixo:


[ô]grid
rsTable.Open [Ô]SELECT * FROM [Locado Dados] WHERE [Locado ID] =[Ô] & vTempID, ADOconn, adOpenForwardOnly, adLockReadOnly
i = 1
GridTitulos.Rows = rsTable.RecordCount
Do Until rsTable.EOF or (Grid.Row = GridTitulos.Rows -1 [ô]GridTitulos.Rows - 1 supondo que seu grid tenha um linha para cabecalho
GridTitulos.TextMatrix(i, 0) = rsTable([Ô]Título[Ô])
GridTitulos.TextMatrix(i, 1) = rsTable([Ô]Valor[Ô])
GridTitulos.TextMatrix(i, 2) = rsTable([Ô]Devolução[Ô])
rsTable.MoveNext
i = i + 1
Loop
rsTable.Close


Veja se resolve seu problema, do contrario poste novamente, ok???



KIKO.WIZZ 21/09/2009 10:11:42
#323307
Tentei dos 2 modos e não funcionou...
coloquei uma msgbox depois do loop, e notei q as linhas estão certas quando a msgbox abre, mas depois q fecho aparecem + 4 linhas em branco...
Do Until rsTable.EOF
GridTitulos.AddItem (Row)
GridTitulos.TextMatrix(i, 0) = rsTable([Ô]Título[Ô])
GridTitulos.TextMatrix(i, 1) = rsTable([Ô]Valor[Ô])
GridTitulos.TextMatrix(i, 2) = rsTable([Ô]Devolução[Ô])
rsTable.MoveNext
i = i + 1
Loop
msgbox [Ô]Stop[Ô]
rsTable.Close

....não faz sentido...
FGSANTOS 21/09/2009 11:26:50
#323314
Eu não uso a .AddItem (Row), uso assim:

  

[ô]grid
rsTable.Open [Ô]SELECT * FROM Locado Dados WHERE Locado ID =[Ô] & vTempID, ADOconn, adOpenForwardOnly, adLockReadOnly
i = 1
Do Until rsTable.EOF
GridTitulos.Rows = i + 1
GridTitulos.TextMatrix(i, 0) = rsTable!Título
GridTitulos.TextMatrix(i, 1) = rsTable!Valor
GridTitulos.TextMatrix(i, 2) = rsTable!Devolução
rsTable.MoveNext
i = i + 1
Loop
rsTable.Close

TEMPESTADE 21/09/2009 11:49:35
#323315
Tente usar o loop da seguinte maneira

Do While Not rsTable.EOF
[ô]GridTitulos.Rows = i + 1
GridTitulos.AddItem [Ô] [Ô], 1
GridTitulos.TextMatrix(i, 0) = rsTable!Título
GridTitulos.TextMatrix(i, 1) = rsTable!Valor
GridTitulos.TextMatrix(i, 2) = rsTable!Devolução
rsTable.MoveNext
[ô]i = i + 1
Loop
KIKO.WIZZ 21/09/2009 15:20:16
#323342
nenhum dos dois deu certo... acho que o problema não é na grid.... [S94]
KIKO.WIZZ 23/09/2009 09:06:29
#323478
Descobri o que aconteceu...
Eu tenho duas combos com este procedimento no lost focus, e quando estava setando enabled = false na combo cboAutorizado, estava sendo forçado um lost focus também...
Obrigado pela ajuda
Tópico encerrado , respostas não são mais permitidas