Olá APALOOSA!
Bom! Vc envio um exemplo do seu projeto para ser analisado, onde a gente para, senta e observa tudo para poder melhor ajudar no que for preciso.
Eu na ultima msg havia mandado um completo resumo de o porque foi alterado tais linhas do seu projeto que afetariam diretamente o campo data saída, que seria o x da questão.
Pois não bastaria verificar se o campo esta vazio somente na hora de sair se outros detalhes tbm influenciam.
Um exemplo é que, o código para deixar visível o campo datasaida está no evento após atualizar da cx de combinacao StatusBone correto?
Ai que fica a pergunta: se está no evento atualizar da cx de combinacao StatusBone, como irá aparecer esse campo datasaida se ao localizar um código e a cx de combinacao StatusBone estiver já como SAIDA e o campo datasaida já estiver preenchido?
Sendo que somente aparece o campo datasaida se dar o foco e atualizar a cx de combinacao StatusBone.
Por isso postei o código com anotações nas alterações na cx de combinação 99, e que talvez nem observar o motivo vc não observou.
Ficando mais claro ainda: preste atenção
Digamos que vc localizou um código, ai vc preencheu todos os campos necessários e entre eles a cx de combinacao StatusBone como saída e deu uma data de saída e salvou o registro.
Quando vc retorna a localizar esse mesmo código, o correto seria ele mostrar todos os dados preenchidos e inclusive o campo datasaida certo ?
No entanto, a cx de combinacao StatusBone estará como saída mas o campo datasaida não irá aparecer, pois ele só surge se atualizar a cx de combinacao StatusBone como saída.
E detalhe, o campo datasaida vai estar com valor.
Por isso eu criei uma condição nessa cx de combinação99 para verificar após vc localizar um código se a cx de combinacao StatusBone já estaria como saída e se estivesse ele deixaria visível o campo datasaida que com certeza estaria já preenchido.
(Isso estou dizendo ao localizar um código e encima do exemplo que vc mandou. E sem mencionar o fato de vc utilizar as setas de navegação de próximo e anterior, uma vez que nelas o procedimento funcionaria ok. Mas... se vc utiliza outra forma de localizar o registro após registrar a datasaida etc, esquece o que estou dizendo.
Quanto ao seu problema, vamos esclarecer uma coisa aqui:
Vc menciona em suas msgs que: o usuário ainda consegue após tudo isso salvar o registro...
Horas, se para nos que não conhecemos o seu projeto seria complicado entender isso se no exemplo que vc envio tem somente um botão escrito adicionar registro e não salvar registro.
E outro detalhe, o comando desse botão ele faz diversos procedimentos tais como se alterar ou não o registro etc, isso significa que não é só salvar.
Em problemas e dúvidas temos que ser claros e objetivos e usar toda a real informação que realmente estiver constando em nosso projeto para que o amigo que tenta ajudar saiba exatamente como e onde ajudar.
E deixando claro que adicionar registro significa adicionar registro novo, que não consta no bd. Já salvar pode ser após alterar etc.
Por isso quando abrimos novo cadastro num projeto a gente deixa um botão escrito novo, ou adicionar.
Já para alterar ou editar esse registro que já existe a gente deixa um botão, salvar alterações, etc.
Se seu objetivo era não deixar salvar o registro sem estar preenchido o campo datasaida, eu mandei o código na msg anterior na explicação 2 e aqui pra mim está funcionando muito bem.
Veja o que envie na msgs abaixo e agora com procedimentos comentados
' Alteramos no evento click botão adicionaReg o código descrito na mensagem anterior para:
Private Sub AdicionaReg_Click()
If Me.StatusBone.Value = "SAIDA" And Me.DataSaida.Visible = True Then ' Se a cx de combinação statusbone for igual a SAIDA e o campo datasaida estiver visivel, então abre outra condição:
If IsNull(DataSaida.Value) Or Me.DataSaida.Value = "" Then ' se o campo datasaida for null ou for igual a vazio então surge a msg de aviso para preencher o mesmo e depois passa o foco para o botao adicionar para enganar o sistema e depois para o campo datasaida para ser preeenchido.
MsgBox "Necessário inserir uma Data Saida!", vbCritical + vbOKOnly, "Atenção!"
Me.AdicionaReg.SetFocus
Me.DataSaida.SetFocus
ElseIf Me.Destino.Value = "GOODPICK" And IsNull(DataSaida.Value) Or Me.DataSaida.Value = "" Then ' aqui ele reforça a condição, verificando se a cx de combinação destino está como GOODPICK, se estiver ele obriga vc a preencher o campo datasaida novamente.
MsgBox "Necessário inserir uma Data Saida!", vbCritical + vbOKOnly, "Atenção!"
Me.AdicionaReg.SetFocus
Me.DataSaida.SetFocus
End If 'fechamos a condição de verificar o campo datasaida
Exit Sub
Else ' caso contrário, ele verifica se a cx de combinação statusbone esteja com valor diferente de saida ou Vazia ou cx de combinação destino vazia ou diferente de GOODPICK
e se campo datasaida está oculto então, mantém o campo datasaida oculto, passa o foco para o botao adicionaregistro e conforme já estava seu projeto ele abre novo registro.
If Me.StatusBone.Value <> "SAIDA" Or Me.StatusBone.Value = "" Or Me.Destino.Value = "" Or Me.Destino.Value <> "GOODPICK" Or Me.DataSaida.Visible = False Then
Me.DataSaida.Visible = False
Me.AdicionaReg.SetFocus
On Error GoTo Err_AdicionaReg_Click
DoCmd.GoToRecord , , acNewRec
Exit_AdicionaReg_Click:
Exit Sub
Err_AdicionaReg_Click:
MsgBox Err.Description
Resume Exit_AdicionaReg_Click
End If
End If
End Sub
No meu teste aqui ficou assim:
Se clicar no botão adicionar registro e estiver o campo statusbone como saida e o destino como goodpick e campo datasaida vazio ele executa a condição e mostra a msg.
E por ultimo, eu tinha feito outra alteração que também era relacionada ao campo datasaida, mas que pelo que notei vc também não prestou atenção do motivo.
Então se está tudo funcionando perfeitamente e somente o objetivo era ao clicar no botão adicionar registro não adicionar sem estar preenchido o campo data saida caso este estivesse visível, o código acima faz isso.
Abraços e aguardo retorno para saber se deu certo.