INSTRUCAO SQL PARA PROCESSAR CAMPOS NOUTRA TABELA

NAMON 24/12/2012 00:07:25
#416361
Colegas boa noite e Feliz Natal!
Inserir a instrução SQL abaixo para atualizar campos de outra tabela após Salvar o registro corrente em Um Sistema Escolar.
Ocorre que após clicar no botão Salvar, o sistema entra em looping e só com o Ctrl+Del consigo sair sem que se efetue os processos nas tabelas.

[txt-color=#e80000][ô]Retorna condição p/ processar campo ID_ALUNO, tabela TB_AVALIACOES
[txt-color=#0000f0]Private Function ExecutarAposSalvar_F9() As Integer
Dim ComandoSQL As String
If vgSituacao = ACAO_INCLUINDO Then
ComandoSQL = [Ô]INSERT INTO [Tb_notas_e_faltas] ( Nome_aluno, Cod_turma, cod_curso, cod_serie, Aluno_ano, Chamada, Cod_disc, Anoletivo, Referencia) [Ô] & _
[Ô]SELECT Tbclasse.Nome_aluno, Tbclasse.Cod_turma, Tbclasse.cod_curso, Tbclasse.cod_serie, Aluno.Aluno_ano, Tbclasse.Numerochamada_classe, [Ô] & Cod_disc & [Ô] AS CDis, [Ô] & Anoletivo & [Ô] As anl, [ô][Ô] & Referencia & [Ô][ô] As Ref [Ô] & _
[Ô]FROM Tbclasse LEFT JOIN Aluno ON Tbclasse.Cod_aluno = Aluno.Cod_aluno [Ô] & _
[Ô]WHERE (((Tbclasse.Cod_turma)=[Ô] & cod_turma & [Ô])and ((Aluno.situa) = true))[Ô]
vgDb(QualDb([Ô]BDESC[Ô])).Execute ComandoSQL
gridnotas.Top = 2055
Else
If inc_aluno.Value <> False Then
If logi_turma.Value = False And ct_aluno.Value <> [Ô][Ô] Then

[ô] os alunos serão inseridos a partir da tabela classe
ComandoSQL = [Ô]INSERT INTO [Tb_notas_e_faltas] ( Nome_aluno, Cod_turma, cod_curso, cod_serie, Aluno_ano, Chamada, Cod_disc, Anoletivo, Referencia) [Ô] & _
[Ô]SELECT Tbclasse.Nome_aluno, Tbclasse.Cod_turma, Tbclasse.cod_curso, Tbclasse.cod_serie, Aluno.Aluno_ano, Tbclasse.Numerochamada_classe, [Ô] & Cod_disc & [Ô] AS CDis, [Ô] & Anoletivo & [Ô] As anl, [ô][Ô] & Referencia & [Ô][ô] As Ref [Ô] & _
[Ô]FROM Tbclasse LEFT JOIN Aluno ON Tbclasse.Cod_aluno = Aluno.Cod_aluno [Ô] & _
[Ô]WHERE ((((Tbclasse.cod_aluno)=[Ô] & Na_aluno & [Ô])) and (((Tbclasse.Cod_turma)=[Ô] & cod_turma & [Ô])))[Ô]
vgDb(QualDb([Ô]BDESC[Ô])).Execute ComandoSQL
gridnotas.Top = 2055
Else

[ô] se o campo avaliado estiver true, serão inseridos alunos a partir da tabela temporaria
[ô] NOTAS E FALTAS
ComandoSQL = [Ô]INSERT INTO [Tb_notas_e_faltas] ( Nome_aluno, Cod_turma, conceito, R_APROVACAO, [Media final], cod_curso, cod_serie, Aluno_ano, Cod_disc, [Nota_1bi], [Falta_1bi], [Conceito_1bi], [Nota_2bi], [Falta_2bi], [Conceito_2bi], [Nota_3bi], [Falta_3bi], [Conceito_3bi],[Nota_4bi], [Falta_4bi], [Conceito_4bi], [Total anual], [Total de faltas], Anoletivo, Referencia) [Ô] & _
[Ô]SELECT tb_temporaria.Nome_aluno, Temporaria.Cod_turma, Temporaria.conceito, Temporaria.r_aprovacao, Temporaria.[Media final], Temporaria.cod_curso, Temporaria.cod_serie, Aluno.Aluno_ano, Temporaria.cod_disc, Temporaria.[Nota_1bi], Temporaria.[Falta_1bi], Temporaria.[Conceito_1bi], Temporaria.[Nota_2bi], Temporaria.[Falta_2bi], Temporaria.[Conceito_2bi], Temporaria.[Nota_3bi], Temporaria.[Falta_3bi], Temporaria.[Conceito_3bi], Temporaria.[Nota_4bi], Temporaria.[Falta_4bi], Temporaria.[Conceito_4bi], Temporaria.[Total anual], Temporaria.[Total de faltas], [Ô] & Anoletivo & [Ô] As anl, [ô][Ô] & Referencia & [Ô][ô] As Ref [Ô] & _
[Ô]FROM Temporaria LEFT JOIN Aluno ON Temporaria.cod_aluno = Aluno.cod_aluno [Ô] & _
[Ô]WHERE ((((Temporaria.cod_aluno)=[Ô] & aluno_nf & [Ô])) and (((Temporaria.Cod_turma)=[Ô] & cod_turma & [Ô])) and (((Temporaria.Cod_disc)=[Ô] & cod_disc & [Ô])))[Ô]
vgDb(QualDb([Ô]BDESC[Ô])).Execute ComandoSQL
gridnotas.Top = 2055
End If

End If
End If
ExecutarAposSalvar_F9 = False [ô]Deve retornar um valor lógico
End Function[/txt-color][/txt-color]

Alguém poderia, se possível, analisar a rotina acima em busca de erros por mim cometidos?

MARCELO.TREZE 26/12/2012 11:02:43
#416412
bom não existe nenhum laço que faça o programa travar, o que pode estar acontecendo é a query estar mal estruturada, e levando certo tempo para processar, principalmente se houverem vários registros..

outra coisa repare que você declarou a função como inteiro

Private Function ExecutarAposSalvar_F9() As Integer


porém no final da query você tenta inseiri um valor boolean

ExecutarAposSalvar_F9 = False [txt-color=#007100] [ô]Deve retornar um valor lógico[/txt-color]


neste caso ou você declara a função como boolean ou insere um valor numerico na mesma, exemplo

ExecutarAposSalvar_F9 = 0 [txt-color=#007100][ô] zero para false ou 1 para true[/txt-color]


NAMON 26/12/2012 18:08:24
#416436
Marcelo, boa tarde!

Quando ocorrem erros que não conseguimos interceptar, ficamos [Ô]à louca[Ô] sem ater aos pequenos detalhesda rotina. O erro [Ô]primário[Ô] a declaração do ExecutaAposSalvar_F9 só pode ocorrer que ainda não tem domínio da linguagem SQL, mas mesmo no VB é imperdoável.
Vamos acertar e retorno. Quaanto à quantidade de registros, na escola secretaria municipal de educação que faço os testes, somam (TODAS AS ESCOLAS) aproximadamente 2.500 registros que devem ser processados a cada bimestre.

Marcelo, de antemão, muito obrigado pela sua colaboração em me ajudar. Sou fã de percorrer seus post como também de outros colegas [Ô]experts[Ô] e que nos meus estudos da linguagem muito tem ajudado a progredir.

Fecharei o tópico após testar nocamente...
MARCELO.TREZE 26/12/2012 21:40:35
#416445
Outra pergunta o programa acessa servidores remotos?

NAMON 29/12/2012 09:13:30
#416535
Não Marcelo, só local mesmo.

Enéa
FILMAN 29/12/2012 12:26:52
#416537
Resposta escolhida
Caro colega não quero me leve a mal !!
Mas sugiro que organize seu código, pois assim ficara mais facil você identificar o erro

Segue abaixo o seu código verifique se todos os campos da tabela estão corretos, pois dei umas modificada!!
Teste todos os SELECT que esta sendo utilizado no INSERT assim você sabera que eles estão com problemas ou não
Nas linhas que eu modifiquei comentei na frente delas o que eu fiz!!

Segue o código
Private Function ExecutarAposSalvar_F9() As Integer
Dim ComandoSQL As String
Dim Bool As Integer

On Error Goto TrataErro

Bool = 1

If vgSituacao = ACAO_INCLUINDO Then
ComandoSQL = [Ô][Ô]
ComandoSQL = ComandoSQL & [Ô]INSERT INTO[Ô]
ComandoSQL = ComandoSQL & [Ô] Tb_notas_e_faltas ([Ô]
ComandoSQL = ComandoSQL & [Ô] Nome_aluno,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_turma,[Ô]
ComandoSQL = ComandoSQL & [Ô] cod_curso,[Ô]
ComandoSQL = ComandoSQL & [Ô] cod_serie,[Ô]
ComandoSQL = ComandoSQL & [Ô] Aluno_ano,[Ô]
ComandoSQL = ComandoSQL & [Ô] Chamada,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_disc,[Ô]
ComandoSQL = ComandoSQL & [Ô] Anoletivo,[Ô]
ComandoSQL = ComandoSQL & [Ô] Referencia [Ô]
ComandoSQL = ComandoSQL & [Ô]) SELECT[Ô]
ComandoSQL = ComandoSQL & [Ô] C.Nome_aluno,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.Cod_turma,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.cod_curso,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.cod_serie,[Ô]
ComandoSQL = ComandoSQL & [Ô] A.Aluno_ano,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.Numerochamada_classe,[Ô]
ComandoSQL = ComandoSQL & [Ô] ([Ô] & Cod_disc & [Ô]) AS CDis,[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] ([Ô] & Anoletivo & [Ô]) As anl,[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] ([ô][Ô] & Referencia & [Ô][ô]) As Ref[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] FROM[Ô]
ComandoSQL = ComandoSQL & [Ô] Tbclasse C LEFT JOIN Aluno A ON (C.Cod_aluno = A.Cod_aluno)[Ô]
ComandoSQL = ComandoSQL & [Ô] WHERE[Ô]
ComandoSQL = ComandoSQL & [Ô] C.Cod_turma = [Ô] & cod_turma & [Ô] And A.situa = True[Ô]
vgDb(QualDb([Ô]BDESC[Ô])).Execute ComandoSQL
gridnotas.Top = 2055
Else
If inc_aluno.Value <> False Then
If logi_turma.Value = False And ct_aluno.Value <> [Ô][Ô] Then
[ô] os alunos serão inseridos a partir da tabela classe
ComandoSQL = [Ô][Ô]
ComandoSQL = ComandoSQL & [Ô]INSERT INTO[Ô]
ComandoSQL = ComandoSQL & [Ô] Tb_notas_e_faltas ([Ô]
ComandoSQL = ComandoSQL & [Ô] Nome_aluno,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_turma,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_curso,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_serie,[Ô]
ComandoSQL = ComandoSQL & [Ô] Aluno_ano,[Ô]
ComandoSQL = ComandoSQL & [Ô] Chamada,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_disc,[Ô]
ComandoSQL = ComandoSQL & [Ô] Anoletivo,[Ô]
ComandoSQL = ComandoSQL & [Ô] Referencia [Ô]
ComandoSQL = ComandoSQL & [Ô]) SELECT[Ô]
ComandoSQL = ComandoSQL & [Ô] C.Nome_aluno,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.Cod_turma,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.cod_curso,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.cod_serie,[Ô]
ComandoSQL = ComandoSQL & [Ô] A.Aluno_ano,[Ô]
ComandoSQL = ComandoSQL & [Ô] C.Numerochamada_classe,[Ô]
ComandoSQL = ComandoSQL & [Ô] ([Ô] & Cod_disc & [Ô]) AS CDis,[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] ([Ô] & Anoletivo & [Ô]) As anl,[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] ([ô][Ô] & Referencia & [Ô][ô]) As Ref[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] FROM[Ô]
ComandoSQL = ComandoSQL & [Ô] Tbclasse C LEFT JOIN Aluno A ON (C.Cod_aluno = A.Cod_aluno)[Ô]
ComandoSQL = ComandoSQL & [Ô] WHERE[Ô]
ComandoSQL = ComandoSQL & [Ô] C.cod_aluno = [Ô] & Na_aluno & [Ô] And C.Cod_turma = [Ô] & cod_turma
vgDb(QualDb([Ô]BDESC[Ô])).Execute ComandoSQL
gridnotas.Top = 2055
Else
[ô] se o campo avaliado estiver true, serão inseridos alunos a partir da tabela temporaria
[ô] NOTAS E FALTAS

[ô]Retirei todos os couchetes
ComandoSQL = [Ô][Ô]
ComandoSQL = ComandoSQL & [Ô]INSERT INTO[Ô]
ComandoSQL = ComandoSQL & [Ô] Tb_notas_e_faltas ([Ô]
ComandoSQL = ComandoSQL & [Ô] Nome_aluno,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_turma,[Ô]
ComandoSQL = ComandoSQL & [Ô] conceito,[Ô]
ComandoSQL = ComandoSQL & [Ô] R_APROVACAO,[Ô]
ComandoSQL = ComandoSQL & [Ô] Media_final,[Ô] [ô]Aqui tinha couchetes e estava sem anderline
ComandoSQL = ComandoSQL & [Ô] cod_curso,[Ô]
ComandoSQL = ComandoSQL & [Ô] cod_serie,[Ô]
ComandoSQL = ComandoSQL & [Ô] Aluno_ano,[Ô]
ComandoSQL = ComandoSQL & [Ô] Cod_disc,[Ô]
ComandoSQL = ComandoSQL & [Ô] Nota_1bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Falta_1bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Conceito_1bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Nota_2bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Falta_2bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Conceito_2bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Nota_3bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Falta_3bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Conceito_3bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Nota_4bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Falta_4bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Conceito_4bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] Total_anual,[Ô] [ô]Aqui tambem estava se anderline
ComandoSQL = ComandoSQL & [Ô] Total_de_faltas,[Ô] [ô]Aqui tambem estava se anderline
ComandoSQL = ComandoSQL & [Ô] Anoletivo,[Ô]
ComandoSQL = ComandoSQL & [Ô] Referencia [Ô]
ComandoSQL = ComandoSQL & [Ô]) SELECT[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Nome_aluno,[Ô] [ô]Aqui estava escrito tb_Temporaria e a tabela chama (Temporaria)
ComandoSQL = ComandoSQL & [Ô] T.Cod_turma,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.conceito,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.r_aprovacao,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Media_final,[Ô] [ô]Aqui tambem estava se anderline
ComandoSQL = ComandoSQL & [Ô] T.cod_curso,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.cod_serie,[Ô]
ComandoSQL = ComandoSQL & [Ô] A.Aluno_ano,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.cod_disc,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Nota_1bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Falta_1bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Conceito_1bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Nota_2bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Falta_2bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Conceito_2bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Nota_3bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Falta_3bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Conceito_3bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Nota_4bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Falta_4bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Conceito_4bi,[Ô]
ComandoSQL = ComandoSQL & [Ô] T.Total_anual,[Ô] [ô]Aqui tambem estava se anderline
ComandoSQL = ComandoSQL & [Ô] T.Total_de_faltas,[Ô] [ô]Aqui tambem estava se anderline
ComandoSQL = ComandoSQL & [Ô] ([Ô] & Anoletivo & [Ô]) As anl,[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] ([ô][Ô] & Referencia & [Ô][ô]) As Ref[Ô] [ô]Aqui coloquei parenteses
ComandoSQL = ComandoSQL & [Ô] FROM[Ô]
ComandoSQL = ComandoSQL & [Ô] Temporaria T LEFT JOIN Aluno A ON (T.cod_aluno = A.cod_aluno)[Ô]
ComandoSQL = ComandoSQL & [Ô] WHERE[Ô]
ComandoSQL = ComandoSQL & [Ô] T.cod_aluno = [Ô] & aluno_nf
ComandoSQL = ComandoSQL & [Ô] And T.Cod_turma = [Ô] & cod_turma
ComandoSQL = ComandoSQL & [Ô] And T.Cod_disc = [Ô] & cod_disc
vgDb(QualDb([Ô]BDESC[Ô])).Execute ComandoSQL
gridnotas.Top = 2055
End If
End If
End If
ExecutarAposSalvar_F9 = Bool [ô]Deve retornar um valor lógico
Exit Function

TrataErro:
Bool = 0
ExecutarAposSalvar_F9 = Bool [ô]Deve retornar um valor lógico
Exit Function
End Function


Quando o sistema entrar em LOOP tente pressionar as Teclas ( Ctrl + Pause/Break) e verifique o libera o código pra você ai você vai debugando o sistema até achar o erro!!

Ou já vai debugando desde o inicio da estrutura! sugiro que teste os SELECT no banco e verifica se dá algum erro de expressão
NAMON 06/01/2013 16:13:54
#416821
Filman, boa tarde e obrigado pela adptação na rotina.
Alguns ajustes foram necessários e o LOOP não mais ocorre.
Ainda falta complementar alguns campos, mas no geral ficou ótimo.

Agradeço de coração a ajuda, mesmo porque a técnica empregada não havia visto ainda e nos serve de lição.

Fecho o post com a satisfação de ter sido atendido pelos colegas e principalmente por você Filman.

Enéa Monteiro
Tópico encerrado , respostas não são mais permitidas