ENTRADA DE MSG

IRENKO 19/10/2009 08:10:12
#325641
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
ALVAROVB2009 20/10/2009 09:56:30
#325765
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
IRENKO 20/10/2009 10:15:53
#325768
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.
MARCELO.TREZE 20/10/2009 10:22:35
#325770
tentou tirar os exit do dos if pra ver o que acontece
ALVAROVB2009 20/10/2009 10:45:38
#325774
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
IRENKO 20/10/2009 11:51:27
#325780
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.
ALVAROVB2009 20/10/2009 12:57:21
#325791
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
IRENKO 20/10/2009 15:29:42
#325810
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?
ALVAROVB2009 20/10/2009 15:37:49
#325812
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?

IRENKO 20/10/2009 15:41:44
#325814
Se existir (Gerado), só carrega o mesmo. (Pendente) e'só exibir a mensagem, isso caso não exista (Gerado) no meio deles.
MARCELO.TREZE 20/10/2009 16:21:23
#325827
Resposta escolhida
é 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

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.

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