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

VB-Rotina Processando PAI com dados de FILHO


namon

Pergunta

Em meu projeto (Formulário em GRID- PAI e FILHO). Inseri uma rotina para atualizar um campo do PAI a partir FILHO, segundo condições.

Importa um arquivo TXT para um MDB com mais de 18 mil registros.

Após isso, necessito atualizar alguns campos do PAI que vieram preenchidos no FILHO pela importação.

Nesse exemplo, 4 campos no PAI a serem atualizados:

a) Campo Ident (IDENTIFICADOR do Responsável) que está em UMA LINHA do Grid FILHO (somente um é o respsonsável)

B) Campo Receitas que é a soma de determinada coluna do Grid FILHO;

c) Campo Despesas que é a soma de determinada coluna do Grid FILHO;

e) Campo TotalPessoas que é a contagem das pessoas do Grid FILHO

Com a rotina abaixo esperava atualizar cada registro do PAI um a um e não consegui nem mesmo para o primeiro campo, pois ao rodar a rotina, apenas atuliza o primeiro Ident do PAI e os demais permanecem em branco.

Rotina: (fragmento)

BeginTrans
Set PAI = vgDb.OpenRecordSet("FILHO", dbOpenTable)
If PAI.RecordCount > 0 Then
  PAI.MoveFirst
Set FILHO = vgDb.OpenRecordSet("FILHO", dbOpenTable)
If FILHO.RecordCount > 0 Then
FILHO.MoveFirst
Do While Not FILHO.EOF
With PAI
  .Edit
  If PAI!Codigo = FILHO!Codigo Then 
   PAI!Ident = FILHO!Ident
   PAI!Nome = FILHO!Nome
   PAI!ReceitasTotais = FILHO!Receitas
   PAI!DespesasTotais = FILHO!Despesas
  End If 
  .Update
  .BookMark = .LastModified
End With
End If
FILHO.MoveNext
Loop
End If
End If
CommitTrans

End Sub

Executando a rotina, apenas o PRIMEIRO registro é atualizado dando a impressão que não percorre a TABELA Registro por Registro.

Onde está o meu erro e como corrigir?

namon

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

é o PAI q você ta editando, mas você nunca da MoveNext nele. então ele não sai da primera linha.

o primero registro esta sendo editado varias vezes (cada vez com os dados de um registro do FILHO), mas os demais registros não estao sendo editados.

Link para o comentário
Compartilhar em outros sites

  • 0
é o PAI q você ta editando, mas você nunca da MoveNext nele. então ele não sai da primera linha.

o primero registro esta sendo editado varias vezes (cada vez com os dados de um registro do FILHO), mas os demais registros não estao sendo editados.

Obrigado Kuroi!

Fiz algumas alterações mas continua atualizando somente o primeiro registro. Veja abaixo as alterações:

BeginTrans
Set PAI = vgDb.OpenRecordSet("PAI", dbOpenTable)
If PAI.RecordCount > 0 Then
 PAI.MoveFirst
Set FILHO = vgDb.OpenRecordSet("FILHO", dbOpenTable)
If FILHO.RecordCount > 0 Then
 FILHO.MoveFirst
Do While Not FILHO.EOF
 With PAI
  .Edit
  If PAI!Codigo = FILHO!Codigo And FILHO!Tppar = 1 Then
   PAI!Ident = FILHO!Ident
   PAI!Nome = FILHO!Nome
   PAI!TotalDespesas = FILHO!Despesas
   PAI!TotalReceitas = FILHO!Receitas
   PAI!TotalPessoas = FILHO!Qtpessoas
  End If
  .Update
  PAI.MoveNext
  FILHO.MoveNext
  .BookMark = .LastModified
 End With
Loop
End If
End If
CommitTrans

End Sub

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0

acho q o erro ta nessa linha aqui:

.BookMark = .LastModified

se não me engano, a propriedade bookmark serve pra mover pra um registro especifico, e ai no caso ele da o movenext e logo em seguida volta pro ultimo registro modificado, q acaba sendo alterado de novo e assim vai.

retire aquela linha e tente de novo.

Link para o comentário
Compartilhar em outros sites

  • 0
acho q o erro ta nessa linha aqui:

.BookMark = .LastModified

se não me engano, a propriedade bookmark serve pra mover pra um registro especifico, e ai no caso ele da o movenext e logo em seguida volta pro ultimo registro modificado, q acaba sendo alterado de novo e assim vai.

retire aquela linha e tente de novo.

Kuroi,

Eliminei a linha indicada, mas continua somente PROCESSANDO a alteração no PRIMEIRO registro!

A seqüência (ordem) dos comandos estariam errados?

namon

Link para o comentário
Compartilhar em outros sites

  • 0

namon, então acho q o negocio ta nessa linha agora:

If PAI!Codigo = FILHO!Codigo And FILHO!Tppar = 1 Then
imagino q o codigo do pai não bate com o codigo do filho a partir do segundo registro. você tem certeza q os dados tão vindos ordenados?? pra garantir você podia fazer assim na hora de abrir:
Set PAI = vgDb.OpenRecordSet("Select * From PAI Order By Codigo", dbOpenTable)
If PAI.RecordCount > 0 Then
PAI.MoveFirst
Set FILHO = vgDb.OpenRecordSet("Select * From FILHO Order By Codigo", dbOpenTable)
If FILHO.RecordCount > 0 Then
FILHO.MoveFirst[/code] assim, eles virao ordenados pelo codigo. agora, se por exemplo, um pai tiver mais de um filho, esse seu codigo não vai funcionar tb. porque por exemplo, se você ta no primero registro. codigo 1 no pai e codigo 1 no filho. ele faz o update td certinho. e ai você da o movenext no pai e no filho. o pai vai pro codigo 2. mas o filho tem outro codigo 1. os codigos não vao bater e não vai atualizar nd. então ele da outro movenext. o pai vai pro codigo 3 e o filho vai pro 2. não vai bater de novo e assim por diante. e uma coisa q você pode fazer em casos desse tipo é debugar o codigo. por exemplo, pare o cursor na linha onde diz Do While Not FILHO.EOF e aperte F9. a linha deve ficar vermelha. ai rode o programa com F5. quando chegar nessa parte do codigo, o programa deve pausar. ai se você ir apertando F8 ele vai avancando linha por linha, e você pode ver por exemplo, se ele ta entrando no if. e não é so isso, se você parar o mouse em cima das variaveis no codigo, ele deve mostrar o tooltiptext mostrando o valor dela no momento. e ainda, se você apertar Ctrl + G, você vai chamar a immediate window, onde você pode executar algum codigo q precisar. exemplo, se dentro dela, você digitar:
[code]? PAI!Codigo

e apertar Enter, ele vai te mostrar qual o Codigo do PAI no registro atual.

inclusive no Immediate, você consegue executar funcoes e metodos de objetos e etc.

veja ai o q q da, qualquer coisa poste.

Link para o comentário
Compartilhar em outros sites

  • 0
namon, então acho q o negocio ta nessa linha agora:

If PAI!Codigo = FILHO!Codigo And FILHO!Tppar = 1 Then
imagino q o codigo do pai não bate com o codigo do filho a partir do segundo registro. você tem certeza q os dados tão vindos ordenados?? pra garantir você podia fazer assim na hora de abrir:
Set PAI = vgDb.OpenRecordSet("Select * From PAI Order By Codigo", dbOpenTable)
If PAI.RecordCount > 0 Then
PAI.MoveFirst
Set FILHO = vgDb.OpenRecordSet("Select * From FILHO Order By Codigo", dbOpenTable)
If FILHO.RecordCount > 0 Then
FILHO.MoveFirst
assim, eles virao ordenados pelo codigo. agora, se por exemplo, um pai tiver mais de um filho, esse seu codigo não vai funcionar tb. porque por exemplo, se você ta no primero registro. codigo 1 no pai e codigo 1 no filho. ele faz o update td certinho. e ai você da o movenext no pai e no filho. o pai vai pro codigo 2. mas o filho tem outro codigo 1. os codigos não vao bater e não vai atualizar nd. então ele da outro movenext. o pai vai pro codigo 3 e o filho vai pro 2. não vai bater de novo e assim por diante. e uma coisa q você pode fazer em casos desse tipo é debugar o codigo. por exemplo, pare o cursor na linha onde diz Do While Not FILHO.EOF e aperte F9. a linha deve ficar vermelha. ai rode o programa com F5. quando chegar nessa parte do codigo, o programa deve pausar. ai se você ir apertando F8 ele vai avancando linha por linha, e você pode ver por exemplo, se ele ta entrando no if. e não é so isso, se você parar o mouse em cima das variaveis no codigo, ele deve mostrar o tooltiptext mostrando o valor dela no momento. e ainda, se você apertar Ctrl + G, você vai chamar a immediate window, onde você pode executar algum codigo q precisar. exemplo, se dentro dela, você digitar:
? PAI!Codigo
e apertar Enter, ele vai te mostrar qual o Codigo do PAI no registro atual. inclusive no Immediate, você consegue executar funcoes e metodos de objetos e etc. veja ai o q q da, qualquer coisa poste.
Kuroi, agora "pirei". Efetuei as alterações:
Set PAI = vgDb.OpenRecordSet("Select * From PAI Order By Codigo", dbOpenTable)
If PAI.RecordCount > 0 Then
PAI.MoveFirst
Set FILHO = vgDb.OpenRecordSet("Select * From FILHO Order By Codigo", dbOpenTable)
If FILHO.RecordCount > 0 Then
FILHO.MoveFirst

Apliquei F9 na linha Do While Not FILHO.EOF e executei.

Apertando F8 a rotina pula para RollBack e apresenta a mensagem de erro:

"Não foi possível atualizar o arquivo TXT

Motivo:

O mecanismo de banco de dados Microsoft Jet não pôde encontrar o objeto 'Select * FROM Familia Order By Codigo'. Certifique-se de que o objeto exista e de ter digitado seu nome e o caminho corretamernte.

Existe o Campo codigo nas duas tabelas; são chaves primárias e na rotina anterior ele atualizava o primeiro registro

Não entendi nada!!!

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
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...