MSFLEXGRID DUVIDA TERRIVEL...
Caros...
Estou com muita dificulde em resolver o seguinte problema com msflexgrid:
Eu tenho está parte do código no meu programa.
i = 1
[ô]Processa linhas com status [Ô]D[Ô] da grade e remove tabela
Do While i <= grdDetalheCotacao.Rows - 1 [ô]Primeira linha da grade não conta pois é o cabeçalho
If grdDetalheCotacao.TextMatrix(i, 7) = [Ô]D[Ô] Then
[ô]Se a coluna [Ô]Status[Ô] = D Deleta registro da tabela e do RecordSet
If clMFind.FindFirst([Ô]idcotacao=[Ô] & iNumCotacao & [Ô] AND [Ô] & [Ô]idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0) & [Ô][Ô]) Then
sSQLCmd = [Ô]DELETE FROM detalhecotacoes WHERE[Ô] _
& [Ô] idcotacao=[Ô] & iNumCotacao _
& [Ô] AND idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0)
MsgBox [Ô]DELETE [Ô] & [Ô]Cotacao: [Ô] & iNumCotacao & [Ô] Produto: [Ô] & Str(i) & sSQLCmd
On Error GoTo UpdateFailed
conexao.Execute sSQLCmd
grdDetalheCotacao.RemoveItem (grdDetalheCotacao.Row)
End If
End If
i = i + 1
Loop
Estou tentando evitar a primeira linha do flex e até ai tudo bem eu sei que a primeira linha é zero, mas a rotina ai de cima nunca apaga a última linha da tabela, é com se ela pulasse.
Alguem pode me dizer o que estou fazendo de errado ?
Grato.
Estou com muita dificulde em resolver o seguinte problema com msflexgrid:
Eu tenho está parte do código no meu programa.
i = 1
[ô]Processa linhas com status [Ô]D[Ô] da grade e remove tabela
Do While i <= grdDetalheCotacao.Rows - 1 [ô]Primeira linha da grade não conta pois é o cabeçalho
If grdDetalheCotacao.TextMatrix(i, 7) = [Ô]D[Ô] Then
[ô]Se a coluna [Ô]Status[Ô] = D Deleta registro da tabela e do RecordSet
If clMFind.FindFirst([Ô]idcotacao=[Ô] & iNumCotacao & [Ô] AND [Ô] & [Ô]idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0) & [Ô][Ô]) Then
sSQLCmd = [Ô]DELETE FROM detalhecotacoes WHERE[Ô] _
& [Ô] idcotacao=[Ô] & iNumCotacao _
& [Ô] AND idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0)
MsgBox [Ô]DELETE [Ô] & [Ô]Cotacao: [Ô] & iNumCotacao & [Ô] Produto: [Ô] & Str(i) & sSQLCmd
On Error GoTo UpdateFailed
conexao.Execute sSQLCmd
grdDetalheCotacao.RemoveItem (grdDetalheCotacao.Row)
End If
End If
i = i + 1
Loop
Estou tentando evitar a primeira linha do flex e até ai tudo bem eu sei que a primeira linha é zero, mas a rotina ai de cima nunca apaga a última linha da tabela, é com se ela pulasse.
Alguem pode me dizer o que estou fazendo de errado ?
Grato.
tenta i=i -1
Citação::
tenta i=i -1
depois do loop ?,
lembrando que já faço rows.1 no while
olha meu exemplo: eu coloco apos o loop
Dim SQL As String
SQL = [Ô]SELECT codigo FROM checklist ORDER BY codigo[Ô]
If tabelas.State = adStateClosed Then tabelas.Open [Ô]checklist[Ô], conectiva, adOpenKeyset, adLockOptimistic
Do Until tabelas.EOF
[ô]mfginiciar.Rows = 3
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 0) = tabelas!codigo
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 1) = tabelas!placa
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 2) = tabelas!vendedor
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 3) = tabelas!mecanico
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 4) = tabelas!pneus
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 5) = tabelas!rodas
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 6) = tabelas!mecanica
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 7) = tabelas!amortecedores
mfginiciar.TextMatrix(mfginiciar.Rows - 1, 8) = tabelas!freios
mfginiciar.Rows = mfginiciar.Rows + 1
tabelas.MoveNext
Loop
[txt-size=2] mfginiciar.Rows = mfginiciar.Rows - 1
[/txt-size][txt-size=5] [/txt-size][txt-size=5] [/txt-size]
Cara o meu raciocÃnio do código em qustão é o seguinte:
Fazer uma comparação na coluna [ô]Status[ô] da grade e se tiver a letra [ô]D[ô] nele processa o registro
Não posso fazer esse teste na primeira linha pois, é o cabeçalho do grid, portanto tenho que pulá-la.
Encontrando o resultado que satisfaça a condição, envio um comando paao bd para apagar tal linha.
somo + 1 ao contador de linha que foram processadas.
é isso ai.
Tudo que eu quero e evitar o processamento da primeira linha da grade.
Fazer uma comparação na coluna [ô]Status[ô] da grade e se tiver a letra [ô]D[ô] nele processa o registro
Não posso fazer esse teste na primeira linha pois, é o cabeçalho do grid, portanto tenho que pulá-la.
Encontrando o resultado que satisfaça a condição, envio um comando paao bd para apagar tal linha.
somo + 1 ao contador de linha que foram processadas.
é isso ai.
Tudo que eu quero e evitar o processamento da primeira linha da grade.
Cara.
Melhor estruturar tem código num For . . . Next
Dim intLinha as Integer
For intLinha = 1 To grdDetalheCotacao.Rows - 1
If <condição> then
<comandos> todos os comandos pra grid e pra tabela
End IF
Next intLinha
Melhor estruturar tem código num For . . . Next
Dim intLinha as Integer
For intLinha = 1 To grdDetalheCotacao.Rows - 1
If <condição> then
<comandos> todos os comandos pra grid e pra tabela
End IF
Next intLinha
Citação::
Cara.
Melhor estruturar tem código num For . . . Next
Dim intLinha as Integer
For intLinha = 1 To grdDetalheCotacao.Rows - 1
If <condição> then
<comandos> todos os comandos pra grid e pra tabela
End IF
Next intLinha
Eu estruturei essa parte do código com for... next como você sugeriu, e o resultado foi o mesmo, quando executo, fica a coluna do cabeçalho + uma linha que teria que ser removida do cadastro e do grid, acomphando o codigo via debugger percebi que o programa nem chea a executar a rotina quando o valor de .rows = 1
Pelo debugger pude constar que:
o valor de .rows é realmente 1, então tem uma linha aqui
fiz um teste assim ? grddetalhecotacao.textmatrix(0,7) e mostra o valor da 7 do cabecalho direitinho, porém quando eu faço o teste ? grddetalhecotacao.textmatrix(i,7) dá subscrit error, o mesmo acontece quando eu tento ? textmatrix(1,7), como pode haver um erro de acesso nessa faixa de intervalos se o comando grddetalhecotacao.rows diz exatamente que exiet uma linha.
Pelo que entendi a linha 0 e o cabecalho da linha e as seguintes são os dados.
O que fazer agora ?
tenta ai
For i = 1 To grdDetalheCotacao.Rows - 1 [ô]Primeira linha da grade não conta pois é o cabeçalho
If grdDetalheCotacao.TextMatrix(i, 7) = [Ô]D[Ô] Then
[ô]Se a coluna [Ô]Status[Ô] = D Deleta registro da tabela e do RecordSet
If clMFind.FindFirst([Ô]idcotacao=[Ô] & iNumCotacao & [Ô] AND [Ô] & [Ô]idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0) & [Ô][Ô]) Then
sSQLCmd = [Ô]DELETE FROM detalhecotacoes WHERE[Ô] _
& [Ô] idcotacao=[Ô] & iNumCotacao _
& [Ô] AND idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0)
MsgBox [Ô]DELETE [Ô] & [Ô]Cotacao: [Ô] & iNumCotacao & [Ô] Produto: [Ô] & Str(i) & sSQLCmd
On Error GoTo UpdateFailed
conexao.Execute sSQLCmd
grdDetalheCotacao.RemoveItem (grdDetalheCotacao.Row)
End If
End If
Next i
Citação::
tenta aiFor i = 1 To grdDetalheCotacao.Rows - 1 [ô]Primeira linha da grade não conta pois é o cabeçalho
If grdDetalheCotacao.TextMatrix(i, 7) = [Ô]D[Ô] Then
[ô]Se a coluna [Ô]Status[Ô] = D Deleta registro da tabela e do RecordSet
If clMFind.FindFirst([Ô]idcotacao=[Ô] & iNumCotacao & [Ô] AND [Ô] & [Ô]idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0) & [Ô][Ô]) Then
sSQLCmd = [Ô]DELETE FROM detalhecotacoes WHERE[Ô] _
& [Ô] idcotacao=[Ô] & iNumCotacao _
& [Ô] AND idproduto=[Ô] & grdDetalheCotacao.TextMatrix(i, 0)
MsgBox [Ô]DELETE [Ô] & [Ô]Cotacao: [Ô] & iNumCotacao & [Ô] Produto: [Ô] & Str(i) & sSQLCmd
On Error GoTo UpdateFailed
conexao.Execute sSQLCmd
grdDetalheCotacao.RemoveItem (grdDetalheCotacao.Row)
End If
End If
Next i
Fiz exatamente dessa forma, porém o problema do subscript error persistia, então dei uma olhada em uma rsub que também mexe na estrutura do grid e constatei que é ela que provoca o problema a linha que dá o problema está em destaque:
Private Sub Command2_Click(Index As Integer)
10000 Dim sTexto As String
10005 Select Case Index
Case 0
10010 frmProdutoSelecaoCotacao.Show 1
Case 1
10015 MsgBox [Ô]Linha Selecionada: [Ô] & grdDetalheCotacao.RowSel, vbOKOnly + vbExclamation, [Ô]Mensagem[Ô]
[ô]Conta quantas linhas tem a cotação
[ô]Se for igual a 1 linha, o pedido não tem linhas
[ô]Envia mensagem para o operador informando
10020 If grdDetalheCotacao.Rows = 1 Then
10025 MsgBox [Ô]Não existe itens a serem removidos[Ô], vbInformation + vbOKOnly, [Ô]Mensagem[Ô]
10030 Exit Sub
10035 End If
10040 sTexto = [Ô]Item a ser excluÃdo: [Ô] & Chr(13) & Chr(13) _
& [Ô]Codigo: [Ô] & grdDetalheCotacao.TextMatrix(grdDetalheCotacao.Row, 1) & Chr(13) _
& [Ô]QTD: [Ô] & grdDetalheCotacao.TextMatrix(grdDetalheCotacao.Row, 2) & Chr(13) _
& [Ô]UN: [Ô] & grdDetalheCotacao.TextMatrix(grdDetalheCotacao.Row, 3) & Chr(13) _
& [Ô]Nome: [Ô] & grdDetalheCotacao.TextMatrix(grdDetalheCotacao.Row, 4) & Chr(13) _
& [Ô]Preço: [Ô] & grdDetalheCotacao.TextMatrix(grdDetalheCotacao.Row, 5) & Chr(13) & Chr(13) _
& [Ô]Confirma a exclusão do produto ?[Ô]
10045 grdDetalheCotacao.TextMatrix(grdDetalheCotacao.Row, 7) = [Ô]D[Ô]
10050
10055 If MsgBox(sTexto, vbOKCancel + vbQuestion, [Ô]Exclusão[Ô]) = vbOK Then
[ô]Esta linha evita o erro de remover a ultima linha fixa do grid [Ô]muito importante[Ô]
10060 If grdDetalheCotacao.Rows = grdDetalheCotacao.FixedRows + 1 Then
10065 grdDetalheCotacao.Rows = grdDetalheCotacao.FixedRows
10070 Else
[ô]grdDetalheCotacao.RemoveItem grdDetalheCotacao.Row
[ô]grdDetalheCotacao.ColWidth(grdDetalheCotacao.Row) = 0
10075 grdDetalheCotacao.RowHeight(grdDetalheCotacao.Row) = 0
10080 End If
10085 MsgBox [Ô]Item excluÃdo[Ô], vbOKOnly + vbInformation, [Ô]Mensagem[Ô]
10090 Else
10095 MsgBox [Ô]Item não excluÃdo[Ô], vbOKOnly + vbInformation, [Ô]Mensagem[Ô]
10100 End If
grdDetalheCotacao.Refresh
10105 grdDetalheCotacao.SetFocus
10110 End Select
End Sub
Porém eu preciso dessa sub pois pelo que và ela evita que a linha do cabeçalho seja removida e marca apenas a linha do grid para ser removida do banco do grid.
esta linha realmente está estranha, tente esta modificação
10060 If grdDetalheCotacao.Rows > 1 Then
10065 grdDetalheCotacao.RemoveItem grdDetalheCotacao.Row
10080 End If
Citação::
esta linha realmente está estranha, tente esta modificação10060 If grdDetalheCotacao.Rows > 1 Then
10065 grdDetalheCotacao.RemoveItem grdDetalheCotacao.Row
10080 End If
Marcelo, eu tentei de todas as formas possÃveis e imagináveis que eu pude, mas o meu sistema não vai pra frente a partir deste ponto, já faz mais de uma semana que estou parado nesta rotina e não consigo resolver, sei que isso é por falta de experiência com o VB, mas eu tô tentando.
Eu gostaria de saber se é possÃvel e se não for pedir muito, eu disponibilizar o meu fonte completo com banco e tudo para você analisar, eu ficaria muito agradecido ?
E outra coisa que eu notei é que o meu vb6 tá caindo fora toda vez que tendo debugar esse módulo.
Grato.
Tópico encerrado , respostas não são mais permitidas