Verificar data e hora no banco
Estou fazendo uma aplicação de agenda, e queria saber como faço pra verificar se já existe alguma agenda marcada para o mesmo horário e data.
Grato.
Grato.
Vander Carlos
Curtidas 0
Respostas
Deivison Melo
03/12/2012
Se for fazer baseado no banco de dados, basta antes executar uma consulta passando as informações que está tentando entrar como cadastro e caso tenha informar que já existe o cadastro...
GOSTEI 0
Fabianoluizdb
03/12/2012
Não sei que banco de dados esta utilizando mas pode fazer uma consulta no banco para saber a data e hora atual do mesmo SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MM')DATAHORA FROM DUAL
GOSTEI 0
Vander Carlos
03/12/2012
Não entendi muito bem o que vocês disseram, vou tentar explicar mais detalhado.
Por exemplo, pra localizar se já existe um CPF cadastrado é só utilizar o Locate...
Quando vou cadastrar uma consulta eu escolho:
Nome: Teste
Data 04/12/2012
Hora: 07:00:00
Situação: Agendada
Como eu verifico se na data 04/12/2012 já tem uma consulta marcada para o horário de 07:00:00
Grato.
Por exemplo, pra localizar se já existe um CPF cadastrado é só utilizar o Locate...
Quando vou cadastrar uma consulta eu escolho:
Nome: Teste
Data 04/12/2012
Hora: 07:00:00
Situação: Agendada
Como eu verifico se na data 04/12/2012 já tem uma consulta marcada para o horário de 07:00:00
Grato.
GOSTEI 0
Fabianoluizdb
03/12/2012
Hum... bom a dica que eu dou é criar uma função para pesquisar se já existe consulta marcada para esse dia e hora para esse cpf, você pode utilizar um locate mesmo passando esses 3 parametros ou se preferir criar um query e passa um select para o banco de dados que se a query esiver vazia é sinal que não tem consulta e no evento exit do campo data você verifico com um bloco if se os dois campos data e hora estão diferentes de vazio se estiver você chama a função para pesquisar se existe consulta, faz o mesmo para o exit do campo hora também.
GOSTEI 0
Vander Carlos
03/12/2012
Não, o CPF foi só o exemplo, não entra não. rsrs
GOSTEI 0
Vander Carlos
03/12/2012
Tentei fazer desse jeito:
Eu tentei cadastrar uma consulta assim, mas não deu certo:
Data: 05/12/2012
Hora: 07:00
Não tinha nenhuma consulta marcada para este dia e horário, mas tinha uma para:
Data: 06/12/2012
Hora: 07:00
Só quando eu exclui a do dia 06 eu consegui cadastrar a do dia 05, ou seja, esse verificação ta sendo na tabela toda.
Alguém pode me ajudar ? :(
if (tbConsulta.Locate('dataconsulta', edtDataConsulta.Text,[]) and
tbConsulta.Locate('horaconsulta', cbxHoraConsulta.Text,[])) then begin
ShowMessage('Já existe uma consulta marcada para este horário, ');
end;Eu tentei cadastrar uma consulta assim, mas não deu certo:
Data: 05/12/2012
Hora: 07:00
Não tinha nenhuma consulta marcada para este dia e horário, mas tinha uma para:
Data: 06/12/2012
Hora: 07:00
Só quando eu exclui a do dia 06 eu consegui cadastrar a do dia 05, ou seja, esse verificação ta sendo na tabela toda.
Alguém pode me ajudar ? :(
GOSTEI 0
Bruno Leandro
03/12/2012
qual o tipo dos campos dataconsulta e horaconsulta no seu banco de dados, eu costumo utilizar assim
var
Data: TDateTime;
begin
Data := StrToDate(edtData.text);
Query.Locate( 'dataconsulta', Data, [] );
var
Data: TDateTime;
begin
Data := StrToDate(edtData.text);
Query.Locate( 'dataconsulta', Data, [] );
GOSTEI 0
Alan Souza
03/12/2012
tenta desse modo:
if (tbConsulta.Locate('dataconsulta;horaconsulta', VarArrayOf([edtDataConsulta.Text, cbxHoraConsulta.Text]),[]) then
begin
ShowMessage('Já existe uma consulta marcada para este horário, ');
end;
GOSTEI 0
Vander Carlos
03/12/2012
Tentei e deu esse erro:
EConvertError with message "0.2500000' is not a valid timestamp
GOSTEI 0
Claudia Nogueira
03/12/2012
Só uma curiosidade. Qual o Banco de Dados?
GOSTEI 0
Vander Carlos
03/12/2012
MySQL.
GOSTEI 0
Claudia Nogueira
03/12/2012
Você está usando Ado:
Tem dois campos, um pra data e um pra hora ou um campo tipo timestamp?
Se for dois, qual o tipo de cada um?
Tem dois campos, um pra data e um pra hora ou um campo tipo timestamp?
Se for dois, qual o tipo de cada um?
MySQL.
GOSTEI 0
Vander Carlos
03/12/2012
dataconsulta: date
horaconsulta: time
horaconsulta: time
GOSTEI 0
Vander Carlos
03/12/2012
Alguém ?
GOSTEI 0
William
03/12/2012
A função q o colega sugeriu funciona normalmente, verifique como está passando os parâmetros?
tenta desse modo:
if (tbConsulta.Locate('dataconsulta;horaconsulta', VarArrayOf([edtDataConsulta.Text, cbxHoraConsulta.Text]),[]) then
begin
ShowMessage('Já existe uma consulta marcada para este horário, ');
end;
GOSTEI 0
Vander Carlos
03/12/2012
É desse jeito mesmo que ta dando erro.
EConvertError with message "0.2500000' is not a valid timestamp
GOSTEI 0
Claudia Nogueira
03/12/2012
Coloca o componente AdoQuery e executa esse código antes de inserir o novo agendamento.
Liga o componente de conexão do AdoQuery.
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'SELECT 1 ' +
' FROM agenda ' +
' WHERE (data = '+QuotedStr(FormatDateTime('yyyy-mm-dd', Data))+') ' +
' AND (hora = '+QuotedStr(Hora)+')';
ADOQuery1.Open;
if not ADOQuery1.IsEmpty then
begin
Application.MessageBox('Já foi agendado um compromisso para essa data e hora!','Informa',MB_ICONINFORMATION+MB_OK);
Exit;
end;
Liga o componente de conexão do AdoQuery.
GOSTEI 0
William
03/12/2012
Só para testar criei uma tabela no MySQL com os campos:
data:date
hora:time
1 - Joguei no form 2 edits, um com a data e outro com a hora.
2 - Configurei o SQLConnection, SQLTable, DataSetProvider, ClientDataSet e DataSource.
3 - Colei o código em um botão e preenchi com valores iguais aos da tabela, funcionou normalmente
data:date
hora:time
1 - Joguei no form 2 edits, um com a data e outro com a hora.
2 - Configurei o SQLConnection, SQLTable, DataSetProvider, ClientDataSet e DataSource.
3 - Colei o código em um botão e preenchi com valores iguais aos da tabela, funcionou normalmente
GOSTEI 0
Vander Carlos
03/12/2012
Não ta dando certo aqui.
Claudiadnh, tentei fazer desse jeito sem o AdoQuery
E ta retornando esse erro:
Claudiadnh, tentei fazer desse jeito sem o AdoQuery
qryAgenda.Close;
qryAgenda.SQL.Clear;
qryAgenda.SQL.Add('SELECT * FROM cadagenda WHERE (dtagendamento = '+
QuotedStr(FormatDateTime('yyyy-mm-dd', StrToDate(edtDataAgendamento.Text)))+' ) ' +
' AND (hrservico = '+QuotedStr(cbHoraServico.Text)+')');
qryAgenda.Open;
if not qryAgenda.IsEmpty then
begin
Application.MessageBox('Já foi agendado um compromisso para essa data e hora!','Informa',MB_ICONINFORMATION+MB_OK);
// Exit;
end
qryAgenda.SQL.Clear;
qryAgenda.SQL.Add('SELECT * FROM cadagenda WHERE (dtagendamento = '+
QuotedStr(FormatDateTime('yyyy-mm-dd', StrToDate(edtDataAgendamento.Text)))+' ) ' +
' AND (hrservico = '+QuotedStr(cbHoraServico.Text)+')');
qryAgenda.Open;
if not qryAgenda.IsEmpty then
begin
Application.MessageBox('Já foi agendado um compromisso para essa data e hora!','Informa',MB_ICONINFORMATION+MB_OK);
// Exit;
end
E ta retornando esse erro:
EConvertError with message " is not a valid date and time'
GOSTEI 0
Claudia Nogueira
03/12/2012
Dá dá um ShowMessage nos campos só pra saber como ele estão entrando. Aí posta exatamente o que mostrou.
Isso é só um teste.
ShowMessage(edtDataAgendamento.Text); ShowMessage(cbHoraServico.Text);
Isso é só um teste.
GOSTEI 0
Vander Carlos
03/12/2012
Me retornou a Data e o horário certinho.
GOSTEI 0
Claudia Nogueira
03/12/2012
Ahan, mas como apareceu, assim: 13/12/2012 no primeiro e 16:21:45 no segundo?
Me retornou a Data e o horário certinho.
GOSTEI 0
Vander Carlos
03/12/2012
Peguei de um horário que tava marcado:
04/12/2012
09:00:00
04/12/2012
09:00:00
GOSTEI 0
Claudia Nogueira
03/12/2012
Faz um outro teste aí.
Coloca assim:
Vê se dá a mensagem.
Coloca assim:
qryAgenda.Close;
qryAgenda.SQL.Clear;
qryAgenda.SQL.Add('SELECT * FROM cadagenda WHERE (dtagendamento = ''2012-12-04'' ) ' +
' AND (hrservico = ''09:00:00'')');
qryAgenda.Open;
if not qryAgenda.IsEmpty then
begin
Application.MessageBox('Já foi agendado um compromisso para essa data e hora!','Informa',MB_ICONINFORMATION+MB_OK);
Exit;
end;
Vê se dá a mensagem.
Peguei de um horário que tava marcado:
04/12/2012
09:00:00
04/12/2012
09:00:00
GOSTEI 0
Vander Carlos
03/12/2012
Assim deu certo.
GOSTEI 0
Claudia Nogueira
03/12/2012
Faz um teste assim:
Var
dData : TDate;
tHora : TTime;
sSQL : String;
begin
sSQL := '';
try
dData := StrToDate(edtDataAgendamento.Text);
sSQL := ' WHERE (dtagendamento = '+QuotedStr(FormatDateTime('yyyy-mm-dd',dData))+')';
except
Application.MessageBox('Digite uma data válida!','Informa',MB_ICONINFORMATION+MB_OK);
edtDataAgendamento.SetFocus;
Exit;
end;
try
tHora := StrToTime(cbHoraServico.Text);
sSQL := sSQL + ' AND (hrservico = '+QuotedStr(FormatDateTime('hh:mm:ss',tHora))+')';
except
Application.MessageBox('Digite uma hora válida!','Informa',MB_ICONINFORMATION+MB_OK);
cbHoraServico.SetFocus;
Exit;
end;
qryAgenda.Close;
qryAgenda.SQL.Clear;
qryAgenda.SQL.Add('SELECT * FROM cadagenda ' + sSQL);
qryAgenda.Open;
if not qryAgenda.IsEmpty then
begin
Application.MessageBox('Já foi agendado um compromisso para essa data e hora!','Informa',MB_ICONINFORMATION+MB_OK);
Exit;
end;
end;
GOSTEI 0
Vander Carlos
03/12/2012
Claudiadnh,
Dessa maneira deu certo, muito obrigado.
Você pode me explicar o que estava acontecendo ?
Grato.
Dessa maneira deu certo, muito obrigado.
Você pode me explicar o que estava acontecendo ?
Grato.
GOSTEI 0
Alan Souza
03/12/2012
Provavelmente o locate não funcionava por algum erro de conversão de valores nos campos de data e hora na hora de executar o comando, o que pela consulta SQL você consegue tratar quando usa parâmetros para setar os valores no select.
GOSTEI 0
Vander Carlos
03/12/2012
Interessante =)
Obrigado a todos.
Obrigado a todos.
GOSTEI 0