Verificar data e hora no banco

Delphi

03/12/2012

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.
Vander Carlos

Vander Carlos

Curtidas 0

Respostas

Deivison Melo

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

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

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.
GOSTEI 0
Fabianoluizdb

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

Vander Carlos

03/12/2012

Não, o CPF foi só o exemplo, não entra não. rsrs
GOSTEI 0
Vander Carlos

Vander Carlos

03/12/2012

Tentei fazer desse jeito:

 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

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, [] );
GOSTEI 0
Alan Souza

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

Vander Carlos

03/12/2012

Tentei e deu esse erro:

EConvertError with message "0.2500000' is not a valid timestamp
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

03/12/2012

Só uma curiosidade. Qual o Banco de Dados?
GOSTEI 0
Vander Carlos

Vander Carlos

03/12/2012

MySQL.
GOSTEI 0
Claudia Nogueira

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?
MySQL.
GOSTEI 0
Vander Carlos

Vander Carlos

03/12/2012

dataconsulta: date
horaconsulta: time
GOSTEI 0
Vander Carlos

Vander Carlos

03/12/2012

Alguém ?
GOSTEI 0
William

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

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

Claudia Nogueira

03/12/2012

Coloca o componente AdoQuery e executa esse código antes de inserir o novo agendamento.

  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

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
GOSTEI 0
Vander Carlos

Vander Carlos

03/12/2012

Não ta dando certo aqui.

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


E ta retornando esse erro:

EConvertError with message " is not a valid date and time'
GOSTEI 0
Claudia Nogueira

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.
ShowMessage(edtDataAgendamento.Text);
ShowMessage(cbHoraServico.Text);


Isso é só um teste.
GOSTEI 0
Vander Carlos

Vander Carlos

03/12/2012

Me retornou a Data e o horário certinho.
GOSTEI 0
Claudia Nogueira

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

Vander Carlos

03/12/2012

Peguei de um horário que tava marcado:

04/12/2012
09:00:00
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

03/12/2012

Faz um outro teste aí.
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
GOSTEI 0
Vander Carlos

Vander Carlos

03/12/2012

Assim deu certo.
GOSTEI 0
Claudia Nogueira

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

Vander Carlos

03/12/2012

Claudiadnh,

Dessa maneira deu certo, muito obrigado.

Você pode me explicar o que estava acontecendo ?


Grato.
GOSTEI 0
Alan Souza

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

Vander Carlos

03/12/2012

Interessante =)

Obrigado a todos.

GOSTEI 0
POSTAR