ROTINA DE BLOQUEIO EM DUPLICIDADE DE DADOS

MILTONSILVA94 02/08/2015 20:39:21
#449479
Estou com um formulário de agendamentos, no formulário de [ô]inserir agendamento[ô] e tem os campos [ô]data[ô] e [ô]horario[ô], e a rotina abaixo que criei funciona corretamente pois serve para não deixar gravar nada se já tiver a data e horário no BD:

Dim lsql As String
Dim lTBAgendamentos As Recordset

[ô]Ínicio da rotina para verificar se a [ô]Data, e Horário[ô] constam já no banco de dados
lsql = [Ô]SELECT * FROM Agendamentos [Ô]
[ô]If para verificar se os dados digitados já existem no banco de dados
If Trim(txtData.Text) <> [Ô][Ô] And (cboHorario.Text) <> [Ô][Ô] Then
lsql = lsql & [Ô] WHERE data like [ô][Ô] & Trim(txtData.Text & [Ô]*[ô][Ô]) & [Ô] and horario like [ô][Ô] & Trim(cboHorario.Text & [Ô]*[ô][Ô])
End If

Set lTBAgendamentos = gBDSalao.OpenRecordset(lsql, dbOpenSnapshot)

If lTBAgendamentos.EOF = True Then
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] não estão cadastrados![Ô], vbCritical
Else
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] já encontram-se cadastrados![Ô], vbCritical
frmMensagemDadosDuplicados.Show vbModal
cboHorario.ListIndex = 0
cboHorario.SetFocus
Exit Sub
End If
[ô]Fim da rotina para verificação se a [ô]Data, e Horário[ô] já constam no banco de dados

Porém no outro formulário de [ô]alterar agendamento[ô], se eu coloco também esta rotina notei que não dá certo, pois quando vai fazer a validação dos campos ele se baseia com o que já tem no BD e não vai salvar dae se eu chamar o formulário para fazer alterações em alguns dados mas não mudar o que têm nestes dois campos.
Estou tentando modificar a rotina acima, mas pelo visto não vai servir, preciso de alguma idéia para isso.
TUNUSAT 03/08/2015 08:13:40
#449486
MILTONSILVA94,

Quando você vai gravar registros novos (INSERT) precisa certificar-se que a Chave Primária (PK - Primary Key) já não exista no banco de dados. Quando você vai atualizar registros (UPDATE) precisa certificar-se exatamente o contrário, que exista registro na base de dados.
Você usou como chave primária da sua tabela o campo data (data + horário) então quando for atualizar NÃO pode deixar o usuário e nem o sistema alterar esta informação, desta forma você poderá achar o registro exato que está tentando atualizar.
é algo do tipo:
    If lTBAgendamentos.EOF = True Then
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] não estão cadastrados![Ô], vbCritical
Else
[ô]AQUI PODE COLOCAR A ROTINA PARA ATUALIZAR O REGISTRO
End If


[][ô]s,
Tunusat.
MILTONSILVA94 05/08/2015 12:52:15
#449600
Tipo a [ô]data[ô] e [ô]hora[ô] são dois campos, e não são chaves primárias. Apenas criei a rotina na inserção e deu certo. Porém agora para fazer a alteração do registro ela não me serve.
JABA 05/08/2015 13:41:19
#449612
MILTON, eu faria isso da seguinte forma: Colocaria os campos data e hora como chaves primárias e faria o tratamento via [Ô]On error goto erro:[Ô] na inserções e atualizações. Ou seja, quando alguém inserisse ou atualizasse com uma data e hora que já existem, geraria um erro e assim capturaríamos-o e exibiríamos uma mensagem dizendo que elas já foram cadastradas anteriormente. Com isso, não seria mais necessário utilizar aquela rotina que você usa pra buscar pelas datas, pois o tratamento seria via Banco de dados.
MILTONSILVA94 05/08/2015 14:46:45
#449630
Eu queria alguma forma para que eu usasse essa mesma rotina, e na hora dessa validação desconsiderasse esse registro atual que estou tentando alterar, talvez pelo [ô]id[ô] que daí a minha lógica estaria certa.
DAMASCENO.CESAR 05/08/2015 15:34:00
#449639
Resposta escolhida
nessa parte:
If lTBAgendamentos.EOF = True Then
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] não estão cadastrados![Ô], vbCritical
Else
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] já encontram-se cadastrados![Ô], vbCritical
frmMensagemDadosDuplicados.Show vbModal
cboHorario.ListIndex = 0
cboHorario.SetFocus
Exit Sub
End If

voce diz que se houver o registro é para avisar que já tem cadastro manda o foco para o horário e encerra
então: SE já existe o registro da hora, é aí que voce vai fazer a alteração, como já disse nosso amigo JABA.
Nesse caso, voce precisa esquecer essa sua rotina e criar uma outra que transfira os dados do registro selecionado para o form de alteração, habilitar apenas os campos que podem ser alterados e, ao final das alterações, usar UPDATE

MILTONSILVA94 05/08/2015 16:06:46
#449644
Essa rotina que uso:

[ô]Rotina [ô]RotinaUmAlterarAgendamento[ô] deve ficar neste lugar, caso contrário não salva no banco de dados
Private Sub RotinaUmAlterarAgendamento()

Caption = [Ô]Alterar agendamento - Sistema Integrado :: Versão: [Ô] & App.Major & [Ô].[Ô] & App.Minor & [Ô].[Ô] & App.Revision

txtIdAgendamento.Text = frmAgendamentos.lvwLista.SelectedItem
txtDataSistema.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(1)
txtNome.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(2)
txtTelefone.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(3)
txtData.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(4)
cboHorario.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(5)
txtDescricao.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(6)
txtValorTotalRs.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(7)
cboStatusAgendamento.Text = frmAgendamentos.lvwLista.SelectedItem.SubItems(8)
lblAtualizadoPor.Caption = frmAgendamentos.lvwLista.SelectedItem.SubItems(9)
lblUltimaAtualizacao.Caption = frmAgendamentos.lvwLista.SelectedItem.SubItems(10)

End Sub

[ô]Rotina [ô]RotinaDoisAlterarAgendamento[ô] deve ficar neste lugar, caso contrário não salva no banco de dados
Private Sub RotinaDoisAlterarAgendamento()
[ô]Rotina que grava a alteração no banco de dados
Dim lsql As String

[ô]Rotina que ao salvar mostra o nome do usuário que atualizou o registro
lblAtualizadoPor.Caption = gsNomeUsuario
[ô]Rotina que ao salvar mostra data e hora da última atualização no registro
lblUltimaAtualizacao.Caption = Format(Date, [Ô]dd/mm/yyyy[Ô]) & [Ô] [Ô] & Format(Time, [Ô]Long Time[Ô])

lsql = [Ô] UPDATE Agendamentos [Ô]
lsql = lsql & [Ô] SET [Ô]
[ô]Rotina abaixo fica comentada, pois no parâmetro não será feito a alteração
[ô]lsql = lsql & [Ô] data_sistema = [ô][Ô] & Trim(txtDataSistema.Text) & [Ô][ô],[Ô]
lsql = lsql & [Ô] nome = [ô][Ô] & Trim(txtNome.Text) & [Ô][ô],[Ô]
lsql = lsql & [Ô] telefone = [ô][Ô] & txtTelefone.Text & [Ô][ô],[Ô]
lsql = lsql & [Ô] data = [ô][Ô] & txtData.Text & [Ô][ô],[Ô]
lsql = lsql & [Ô] horario = [ô][Ô] & cboHorario.Text & [Ô][ô],[Ô]
lsql = lsql & [Ô] descricao = [ô][Ô] & Trim(txtDescricao.Text) & [Ô][ô],[Ô]
lsql = lsql & [Ô] valor_total_rs = [ô][Ô] & txtValorTotalRs.Text & [Ô][ô],[Ô]
lsql = lsql & [Ô] status_agendamento = [ô][Ô] & cboStatusAgendamento.Text & [Ô][ô],[Ô]
lsql = lsql & [Ô] atualizado_por = [ô][Ô] & lblAtualizadoPor.Caption & [Ô][ô],[Ô]
lsql = lsql & [Ô] ultima_atualizacao = [ô][Ô] & lblUltimaAtualizacao.Caption & [Ô][ô][Ô]
lsql = lsql & [Ô] where id_agendamento = [Ô] & txtIdAgendamento.Text

[ô]MsgBox lsql

gBDSalao.Execute lsql

frmMensagemSalvamentoProcessamento.Show vbModal
[ô]MsgBox [Ô]As alterações do agendamento foram salvas![Ô]

Unload Me

End Sub
MILTONSILVA94 10/08/2015 15:32:44
#449786
Como consigo colocar uma excessão para que esta rotina desconsidere as validação para o registro(id_agendamento) atual que estou fazendo a alteração.
JABA 10/08/2015 18:33:44
#449794
Coloque a parte que faz a busca pela data e horário somente dentro da função de inclusão, pois para a Alteração não vejo muito sentido. Vai ficar mais ou menos assim:

public function InserirAgendamento() as Boolean

Dim lsql As String
Dim lTBAgendamentos As Recordset

[ô]Ínicio da rotina para verificar se a [ô]Data, e Horário[ô] constam já no banco de dados
lsql = [Ô]SELECT * FROM Agendamentos [Ô]
[ô]If para verificar se os dados digitados já existem no banco de dados
If Trim(txtData.Text) <> [Ô][Ô] And (cboHorario.Text) <> [Ô][Ô] Then
lsql = lsql & [Ô] WHERE data like [ô][Ô] & Trim(txtData.Text & [Ô]*[ô][Ô]) & [Ô] and horario like [ô][Ô] & Trim(cboHorario.Text & [Ô]*[ô][Ô])
End If

Set lTBAgendamentos = gBDSalao.OpenRecordset(lsql, dbOpenSnapshot)

If lTBAgendamentos.EOF = True Then
[txt-color=#e80000] [ô]Insira aqui a rotina para a inclusão do registro
Return True[/txt-color]
Else
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] já encontram-se cadastrados![Ô], vbCritical
frmMensagemDadosDuplicados.Show vbModal
cboHorario.ListIndex = 0
cboHorario.SetFocus
[txt-color=#e80000] Return False[/txt-color]
End If
End function

MILTONSILVA94 25/08/2015 09:21:08
#450462
Não deu certo também JABA.
DAMASCENO.CESAR 26/08/2015 20:03:21
#450533
pelo que vi, parece que há problemas para chegar na rotina do update
1: onde voce inicia a rotina do update?
2: esse codigo abaixo vem antes do update?
If lTBAgendamentos.EOF = True Then
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] não estão cadastrados![Ô], vbCritical
Else
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] já encontram-se cadastrados![Ô], vbCritical
frmMensagemDadosDuplicados.Show vbModal
cboHorario.ListIndex = 0
cboHorario.SetFocus
Exit Sub
End If
o problema é que não vemos a rotina completa

se esse codigo estiver no mesmo botão e antes da rotina do update, vai parar mesmo

quando preciso alterar dados no mesmo formulario onde os insiro, sempre trabalho com habilitação e desabilitação de botoes pra salvar novo ou alterações
voce pode fazer mais ou menos desse jeito:

Else
[ô]MsgBox [Ô][ô]Data[ô] e [ô]Horário[ô] já encontram-se cadastrados![Ô], vbCritical
dim resp
resp= msgbox([Ô]Data e horário já cadastrados! deseja alterar?[Ô],vbyesno)
if resp = vbyes then
[ô]Aqui voce usa a rotina de alteração ou desbloqueia o botao para poder alterar
else
frmMensagemDadosDuplicados.Show vbModal
cboHorario.ListIndex = 0
cboHorario.SetFocus
Exit Sub
end if
End If
kkkkkkkkkkkkkkkkkkkkk
o jaba montou melhor ainda!
só faz a alteração que mencionei se voce usar o mesmo botão pra salvar
Página 1 de 2 [18 registro(s)]
Tópico encerrado , respostas não são mais permitidas