MSFLEXGRID DUVIDA TERRIVEL...

SPYDREX 19/07/2010 13:48:32
#347734
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.
JAMESBOND007 19/07/2010 14:04:45
#347737
tenta i=i -1
SPYDREX 19/07/2010 14:27:25
#347739
Citação:

:
tenta i=i -1



depois do loop ?,

lembrando que já faço rows.1 no while
JAMESBOND007 19/07/2010 15:15:33
#347746
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]
SPYDREX 19/07/2010 15:24:24
#347749
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.


MICROSCHEME 19/07/2010 17:04:54
#347775
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

SPYDREX 19/07/2010 17:26:44
#347784
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 ?
MARCELO.TREZE 19/07/2010 19:57:43
#347800
Resposta escolhida
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

SPYDREX 20/07/2010 10:04:09
#347882
Citação:

:
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



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.
MARCELO.TREZE 20/07/2010 17:30:33
#347974
esta linha realmente está estranha, tente esta modificação

10060     If grdDetalheCotacao.Rows > 1 Then
10065 grdDetalheCotacao.RemoveItem grdDetalheCotacao.Row
10080 End If

SPYDREX 21/07/2010 11:30:12
#348023
Citação:

:
esta linha realmente está estranha, tente esta modificação

10060     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.

Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas