ENTRADA DE MSG
Pessoal, estou tendo dificuldades com o codigo abaixo referente a resposta do (MsgBox), na realidade o unico IF que funciona direito é o primeiro dentro Do While. Estou tratando 03 campos da tabela, sendo:
LM_Busca!Codigo
LM_Busca!FlagReq
LM_Busca!Dispositivo
Bom, conforme imagem1 da tabela, o código funciona beleza pegando o primeiro IF dentro Do While:

A Imagem2 abaixo, tambem funciona pegando o ultimo IF:

já para a imagem abaixo, esta pegando o segundo IF, deveria pegar o primeiro:
em que estou errando? O banco é access

Private Sub CmdBuscar_Click()
[ô]NR_Copia
LimpaTudo
Dim Procura As String
If AtivarBancoLMX = True Then
Procura = TxtBuscaLM.text
NR_Copia = TxtBuscaLM.text
Set LM_Busca = New ADODB.Recordset
LM_Busca.Open [Ô]SELECT LMnr.LM_1,Dados.Dispositivo,Dados.Codigo,Dados.LM_1,Dados.FlagReq FROM LMnr,Dados WHERE LMnr.LM_1 = Dados.LM_1 And Dados.LM_1 = [ô][Ô] & Procura & [Ô][ô][Ô], Banco2, adOpenKeyset, adLockPessimistic
If LM_Busca.RecordCount = 0 Then
MsgBox [Ô]Lista de Material não cadastrada![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Sub
Else
Do While Not LM_Busca.EOF
If (LM_Busca!Codigo <> Null Or LM_Busca!Codigo <> [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Gerado[Ô]) Then
CarregaCabecalho
CarregaDados
Exit Do
End If
If (LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Pendente[Ô]) Then
MsgBox [Ô]Exitem items pendentes para baixa nesta Lista de Material. é necessário efetuar a baixa para gerar a requisição![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
If LM_Busca!Dispositivo = [Ô][Ô] Or LM_Busca!Dispositivo = [Ô]103[Ô] Or LM_Busca!Dispositivo = [Ô]203[Ô] Or LM_Busca!Dispositivo = [Ô]000[Ô] Then
MsgBox [Ô]Não existe nesta Lista de Material item de estoque![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
If LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô] And LM_Busca!Dispositivo = [Ô]003[Ô] Then
MsgBox [Ô]Lista de Material ainda não foi baixada. é necessário efetuar a baixa dos itens para gerar a requisição![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
LM_Busca.MoveNext
Loop
End If
End If
End Sub
LM_Busca!Codigo
LM_Busca!FlagReq
LM_Busca!Dispositivo
Bom, conforme imagem1 da tabela, o código funciona beleza pegando o primeiro IF dentro Do While:

A Imagem2 abaixo, tambem funciona pegando o ultimo IF:

já para a imagem abaixo, esta pegando o segundo IF, deveria pegar o primeiro:
em que estou errando? O banco é access

Private Sub CmdBuscar_Click()
[ô]NR_Copia
LimpaTudo
Dim Procura As String
If AtivarBancoLMX = True Then
Procura = TxtBuscaLM.text
NR_Copia = TxtBuscaLM.text
Set LM_Busca = New ADODB.Recordset
LM_Busca.Open [Ô]SELECT LMnr.LM_1,Dados.Dispositivo,Dados.Codigo,Dados.LM_1,Dados.FlagReq FROM LMnr,Dados WHERE LMnr.LM_1 = Dados.LM_1 And Dados.LM_1 = [ô][Ô] & Procura & [Ô][ô][Ô], Banco2, adOpenKeyset, adLockPessimistic
If LM_Busca.RecordCount = 0 Then
MsgBox [Ô]Lista de Material não cadastrada![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Sub
Else
Do While Not LM_Busca.EOF
If (LM_Busca!Codigo <> Null Or LM_Busca!Codigo <> [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Gerado[Ô]) Then
CarregaCabecalho
CarregaDados
Exit Do
End If
If (LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Pendente[Ô]) Then
MsgBox [Ô]Exitem items pendentes para baixa nesta Lista de Material. é necessário efetuar a baixa para gerar a requisição![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
If LM_Busca!Dispositivo = [Ô][Ô] Or LM_Busca!Dispositivo = [Ô]103[Ô] Or LM_Busca!Dispositivo = [Ô]203[Ô] Or LM_Busca!Dispositivo = [Ô]000[Ô] Then
MsgBox [Ô]Não existe nesta Lista de Material item de estoque![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
If LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô] And LM_Busca!Dispositivo = [Ô]003[Ô] Then
MsgBox [Ô]Lista de Material ainda não foi baixada. é necessário efetuar a baixa dos itens para gerar a requisição![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
LM_Busca.MoveNext
Loop
End If
End If
End Sub
IRENKO o sistema esta certo em pegar o segundo if, pois quando ele pega a primeira linha, ela esta obecedendo o critério do segundo IF e não do primeiro IF, entendeu?
Minha opinião, vc poderia fazer um loop em todo o grid e depois avisa se existe ou não a pendencia
Acho que isso pode te ajudar
Abraço
Minha opinião, vc poderia fazer um loop em todo o grid e depois avisa se existe ou não a pendencia
Acho que isso pode te ajudar
Abraço
Alvaro, eu sempre apanho quando em fazer loop, teria jeito de dar um dica de como fazer esse loop? Eu entendi a sua resposta, mas o loop não deveria ser feito nos campos da tabela? As imagems q postei são da tabela e não de um Grad.
tentou tirar os exit do dos if pra ver o que acontece
IRENKO sendo ou não grid não importa, o que importa para ele é a condição que voce colocou e o que faz sair do Loop sem passar por todos os campos é justamente o seu - Exit Do -
Coloquei abaixo um exemplo do que voce^pode fazer
Dim RegistroFaltante as boolean
RegistroFaltante=false
If LM_Busca.RecordCount = 0 Then
MsgBox [Ô]Lista de Material não cadastrada![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Sub
Else
Do While Not LM_Busca.EOF
If (LM_Busca!Codigo <> Null Or LM_Busca!Codigo <> [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Gerado[Ô]) Then
CarregaCabecalho
CarregaDados
End If
If (LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Pendente[Ô]) Then
RegistroFaltante = True
End If
If LM_Busca!Dispositivo = [Ô][Ô] Or LM_Busca!Dispositivo = [Ô]103[Ô] Or LM_Busca!Dispositivo = [Ô]203[Ô] Or LM_Busca!Dispositivo = [Ô]000[Ô] Then
RegistroFaltante = True
End If
If LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô] And LM_Busca!Dispositivo = [Ô]003[Ô] Then
RegistroFaltante = true
End If
LM_Busca.MoveNext
Loop
if RegistroFaltante = True then
exibe o tratamento
endif
Aqui você vai passar por todos os campos e quando sair do loop naturalmente, você da a mensagem respectiva, pois assim ja foi tratado o que era para ser gerado e a pendencia será exibida
Acho que isso pode te ajudar
Coloquei abaixo um exemplo do que voce^pode fazer
Dim RegistroFaltante as boolean
RegistroFaltante=false
If LM_Busca.RecordCount = 0 Then
MsgBox [Ô]Lista de Material não cadastrada![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Sub
Else
Do While Not LM_Busca.EOF
If (LM_Busca!Codigo <> Null Or LM_Busca!Codigo <> [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Gerado[Ô]) Then
CarregaCabecalho
CarregaDados
End If
If (LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Pendente[Ô]) Then
RegistroFaltante = True
End If
If LM_Busca!Dispositivo = [Ô][Ô] Or LM_Busca!Dispositivo = [Ô]103[Ô] Or LM_Busca!Dispositivo = [Ô]203[Ô] Or LM_Busca!Dispositivo = [Ô]000[Ô] Then
RegistroFaltante = True
End If
If LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô] And LM_Busca!Dispositivo = [Ô]003[Ô] Then
RegistroFaltante = true
End If
LM_Busca.MoveNext
Loop
if RegistroFaltante = True then
exibe o tratamento
endif
Aqui você vai passar por todos os campos e quando sair do loop naturalmente, você da a mensagem respectiva, pois assim ja foi tratado o que era para ser gerado e a pendencia será exibida
Acho que isso pode te ajudar
Alvaro tentei sua sugestão porem o resultado foi praticamente o mesmo, ou seja, não busca a Msg correta. Marcelo tirei os Exit, tambem não deu certo. Estou anexando um exemplo, por favor ajude-me a solucionar esse enigma.
Os campos da tabela tratados são:
Codigo
Status
Dispositivo
Para o campo Status o texto é:
Gerado
ou
Pendente
Quando Pendente, o campo codigo deve estar vazio.
Quando Gerado, pode usar quaquer numero no campo Codigo.
Para busca deverar usar o codigo de documento 6132.
Os campos da tabela tratados são:
Codigo
Status
Dispositivo
Para o campo Status o texto é:
Gerado
ou
Pendente
Quando Pendente, o campo codigo deve estar vazio.
Quando Gerado, pode usar quaquer numero no campo Codigo.
Para busca deverar usar o codigo de documento 6132.
Irenko estou com o seu exemplo e esta acontecendo o que realmente eu te falei
O primeiro registro da tabela, está obedecendo o que a segunda cláusula, porque no seu banco existem 3 registros com o código 6132.
Teoricamente o sistema esta fazendo aquilo que vc mandou ele fazer, não estou entendendo o que não é para o sistema fazer .
A sugestão que dei, foi para criar uma variável simplismente para fazer o tratamento da rotina após o término da verificação no banco, o que o nosso amigo Marcelo-treze colocou, simplesmente faz a mesma coisa, só que exibe a mensagem durante o loop.
Más volto a falar, conforme os dados cadastrados no banco, o sistema está correto, esta exibindo exatamente o que vc mandou ele exibir e na tela esta trazendo o código 6132 que foi gerado
O que vc colocou já em cima na sua dúvida
[Ô]já para a imagem abaixo, esta pegando o segundo IF, deveria pegar o primeiro:
em que estou errando? O banco é access[Ô]
Ele esta correto em pegar o segundo IF, porque o primeiro registro do banco, atende o segundo IF e não ao primeiro.
O que vc deve fazer é criar um tratamento para esse primeiro registro
Será q pude ajudar, senão coloca ai o que deve ser feito, para a gente ajudar melhor
O primeiro registro da tabela, está obedecendo o que a segunda cláusula, porque no seu banco existem 3 registros com o código 6132.
Teoricamente o sistema esta fazendo aquilo que vc mandou ele fazer, não estou entendendo o que não é para o sistema fazer .
A sugestão que dei, foi para criar uma variável simplismente para fazer o tratamento da rotina após o término da verificação no banco, o que o nosso amigo Marcelo-treze colocou, simplesmente faz a mesma coisa, só que exibe a mensagem durante o loop.
Más volto a falar, conforme os dados cadastrados no banco, o sistema está correto, esta exibindo exatamente o que vc mandou ele exibir e na tela esta trazendo o código 6132 que foi gerado
O que vc colocou já em cima na sua dúvida
[Ô]já para a imagem abaixo, esta pegando o segundo IF, deveria pegar o primeiro:
em que estou errando? O banco é access[Ô]
Ele esta correto em pegar o segundo IF, porque o primeiro registro do banco, atende o segundo IF e não ao primeiro.
O que vc deve fazer é criar um tratamento para esse primeiro registro
Será q pude ajudar, senão coloca ai o que deve ser feito, para a gente ajudar melhor
Esse Msg tá dificil!!! Bom Alvaro vou tentar explicar. Realmente na tabela exitem 03 registros com o codigo 6132, vou dizer porque, imagine uma Nota fiscal com 03 items, o 6132 é o numero da nota fiscal. Na minha cabeça passa o seguinte no tratamento.
Se o campo FlagReq for igual a (Gerado) então ele carrega o Grid somente com aquele item, acontece que pode haver dois items com (Pendente) e um com (Gerado), neste caso tem que carregar o Grid tambem, é ai q tá pegando o IF:
If (LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Pendente[Ô]) Then
MsgBox [Ô]Exitem items pendentes para baixa nesta Lista de Material. é necessário efetuar a baixa para gerar a requisição![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
Esse só deve acontecer se o campo for igual a (Pendente) não existindo nenhuma linha com (Gerado)
Eu entendi a sua explicação quanto a lógica de tratamento usada. Simplificando, se é (Gerado) carrega, se é outra coisa da as Msg. Como contornar isso?
Se o campo FlagReq for igual a (Gerado) então ele carrega o Grid somente com aquele item, acontece que pode haver dois items com (Pendente) e um com (Gerado), neste caso tem que carregar o Grid tambem, é ai q tá pegando o IF:
If (LM_Busca!Codigo = Null Or LM_Busca!Codigo = [Ô][Ô]) And (LM_Busca!Dispositivo = [Ô]003[Ô] And LM_Busca!FlagReq = [Ô]Pendente[Ô]) Then
MsgBox [Ô]Exitem items pendentes para baixa nesta Lista de Material. é necessário efetuar a baixa para gerar a requisição![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
Exit Do
End If
Esse só deve acontecer se o campo for igual a (Pendente) não existindo nenhuma linha com (Gerado)
Eu entendi a sua explicação quanto a lógica de tratamento usada. Simplificando, se é (Gerado) carrega, se é outra coisa da as Msg. Como contornar isso?
Irenko, quando na situação que vc falow, 2 pendentes e 1 gerado, vc qr q carregue o gerado e os itens pendentes são necessários carregar? Ou somente vc manda exibir a mensagem?
Se existir (Gerado), só carrega o mesmo. (Pendente) e'só exibir a mensagem, isso caso não exista (Gerado) no meio deles.
é o que confunde é isso mesmo que o colega ALVARO falou, existem 03 com o código 6132, sendo que 02 estão como pendentes e o outro está como gerado.
os if estão corretos, ou seja se tirar o EXIT DO irá aparecer as mensagens referentes, porem se tiver 10 pendentes irá aparecer a mesma mensagem 10 vezes.
então eu pergunto, não seria melhor criar uma query que verifica-se quantos està o pendentes e exibir a mensagem, existem X pendentes
e depois exibir somente as geradas.
exemplo
teste o exmeplo abaixo
sei que não é o ideal mas é o caminho.
os if estão corretos, ou seja se tirar o EXIT DO irá aparecer as mensagens referentes, porem se tiver 10 pendentes irá aparecer a mesma mensagem 10 vezes.
então eu pergunto, não seria melhor criar uma query que verifica-se quantos està o pendentes e exibir a mensagem, existem X pendentes
e depois exibir somente as geradas.
exemplo
teste o exmeplo abaixo
Private Sub CmdBuscar_Click()
[ô]NR_Copia
LimpaTudo
Dim Conta As Integer
Dim Procura As String
Dim LM_BuscaGerados As Recordset
[ô]If AtivarBancoLMX = True Then
Procura = TxtBuscaLM.Text
NR_Copia = TxtBuscaLM.Text
Set LM_Busca = New ADODB.Recordset
LM_Busca.Open [Ô]SELECT LMnr.LM_1,Dados.Dispositivo,Dados.Codigo,Dados.LM_1,Dados.FlagReq FROM LMnr, Dados WHERE (LMnr.LM_1 = [ô][Ô] & Procura & [Ô][ô] And Dados.LM_1 = [ô][Ô] & Procura & [Ô][ô]) and Dados.Codigo = [ô][ô] and Dados.FlagReq = [ô]Pendente[ô][Ô], ConexaoLM, adOpenKeyset, adLockPessimistic
Conta = 0
Do While Not LM_Busca.EOF
Conta = Conta + 1
LM_Busca.MoveNext
Loop
If Conta >= 1 Then
MsgBox [Ô]Exitem [Ô] & Conta & [Ô] items pendentes para baixa nesta Lista de Material. é necessário efetuar a baixa para gerar a requisição![Ô], vbCritical, [Ô]Erro de pesquisa[Ô]
End If
Set LM_BuscaGerados = New ADODB.Recordset
LM_BuscaGerados.Open [Ô]SELECT LMnr.LM_1,Dados.Dispositivo,Dados.Codigo,Dados.LM_1,Dados.FlagReq FROM LMnr,Dados WHERE (LMnr.LM_1 = [ô][Ô] & Procura & [Ô][ô] And Dados.LM_1 = [ô][Ô] & Procura & [Ô][ô]) and Dados.Codigo <> null and Dados.FlagReq = [ô]Gerado[ô][Ô], ConexaoLM, adOpenKeyset, adLockPessimistic
Do While Not LM_BuscaGerados.EOF
CarregaCabecalho
CarregaDados
LM_BuscaGerados.MoveNext
Loop
End Sub
sei que não é o ideal mas é o caminho.
Tópico encerrado , respostas não são mais permitidas