ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[resolvido] Select + select count
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Jul 19, 2017 4:18 pm    Assunto: [resolvido] Select + select count Responder com Citação

Estou com algum erro nesse select e não consigo achar;

Vejam a tela



Ao clicar na hora, devia me trazer tudo que tem gravado naquela hora e na data que selecionei no calendario, mas traz todos os dados da tabela.
Alguem sabe onde estou errando?

Código:
  with frmdm.qrAgenda do
   begin
     Close;
     SQL.Clear;
     SQL.Add('SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO,');
     SQL.Add('(SELECT COUNT(*) FROM AGENDA WHERE HORA = :HORA AND DATA = :DATA) AS QT_TOTAL');
     SQL.Add('FROM AGENDA');
     ParamByName('HORA').AsTime:= cdsHorariosHORA.AsDateTime;
     ParamByName('DATA').AsDate:= MonthCalendar1.Date;
     Open;
   end;


Se eu remover a parte do count funciona, mas necessito dela para obter o numero de registros no determinado horario.


Editado pela última vez por renanbg em Seg Jul 31, 2017 9:58 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qua Jul 19, 2017 4:34 pm    Assunto: Responder com Citação

Teste assim:

Código:
  with frmdm.qrAgenda do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO,');
    SQL.Add('(SELECT COUNT(*) FROM AGENDA) AS QT_TOTAL FROM AGENDA');
    SQL.Add('WHERE HORA = :HORA AND DATA = :DATA');
    ParamByName('HORA').AsTime := cdsHorariosHORA.AsDateTime;
    ParamByName('DATA').AsDate := MonthCalendar1.Date;
    Open;
  end;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Jul 19, 2017 4:36 pm    Assunto: Responder com Citação

Boa tarde,

Experimente adicionar a clausula Where depois do último From.
Da forma como está a sua query existe um Where apenas para a subquery do Count.

Espero que ajude

_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-venda-guarulhos!gopouva-residencial-casa
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Jul 19, 2017 4:40 pm    Assunto: Responder com Citação

natanbh1,

Agora o filtro por data e hora funciona, mas o count não.
Tenho apenas 2 registros na tabela.

18/07/2017 08:45
19/07/2019 09:30

O count devia me trazer o somatorio dos horarios iguais para a data selecionada, ou seja 1. No momento esta trazendo 2
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Jul 19, 2017 4:45 pm    Assunto: Responder com Citação

imex escreveu:
Boa tarde,

Experimente adicionar a clausula Where depois do último From.
Da forma como está a sua query existe um Where apenas para a subquery do Count.

Espero que ajude



Hum...tentei assim, mas daí da problema no QT_TOTAL

Código:
  with frmdm.qrAgenda do
   begin
     Close;
     SQL.Clear;
     SQL.Add('SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO,');
     SQL.Add('(SELECT COUNT(*) FROM AGENDA AS QT_TOTAL)');
     SQL.Add('FROM AGENDA');
     SQL.Add('WHERE HORA = :HORA AND DATA = :DATA');
     ParamByName('HORA').AsTime:= cdsHorariosHORA.AsDateTime;
     ParamByName('DATA').AsDate:= MonthCalendar1.Date;
     Open;
   end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Jul 19, 2017 4:52 pm    Assunto: Responder com Citação

No ibexpert esse codigo funciona, só não to conseguindo trazer ele pro delphi

Código:
SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO,
  (SELECT COUNT(*) FROM AGENDA B WHERE B.HORA = A.HORA AND B.DATA = A.DATA) AS QT_TOTAL
FROM AGENDA A
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qua Jul 19, 2017 4:56 pm    Assunto: Responder com Citação

renanbg escreveu:
No ibexpert esse codigo funciona, só não to conseguindo trazer ele pro delphi

Código:
SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO,
  (SELECT COUNT(*) FROM AGENDA B WHERE B.HORA = A.HORA AND B.DATA = A.DATA) AS QT_TOTAL
FROM AGENDA A


Aparece alguma mensagem de erro ao trazer pro Delphi? Qual?
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Jul 19, 2017 5:02 pm    Assunto: Responder com Citação

Antes não dava erro porque eu havia mudado um pouco.

Veja como fiz agora

Código:
  with frmdm.qrAgenda do
   begin
     Close;
     SQL.Clear;
     SQL.Add('SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO,');
     SQL.Add('(SELECT COUNT(*) FROM AGENDA B WHERE B.HORA = A.HORA AND B.DATA = A.DATA) AS QT_TOTAL');
     SQL.Add('FROM AGENDA A');
     ParamByName('HORA').AsTime:= cdsHorariosHORA.AsDateTime;
     ParamByName('DATA').AsDate:= MonthCalendar1.Date;
     Open;
   end;


O erro que dá é que não identifica o parametro HORA
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qua Jul 19, 2017 5:06 pm    Assunto: Responder com Citação

Note que você não criou nenhum parâmetro no seu SQL, por isso o erro.

Teste assim:

Código:
with frmdm.qrAgenda do
   begin
     Close;
     SQL.Clear;
     SQL.Add('SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO,');
     SQL.Add('(SELECT COUNT(*) FROM AGENDA B WHERE B.HORA = A.HORA AND B.DATA = A.DATA) AS QT_TOTAL');
     SQL.Add('FROM AGENDA A');
     SQL.Add('WHERE A.HORA = :HORA AND A.DATA = :DATA');  // Criei parametros
     ParamByName('HORA').AsTime:= cdsHorariosHORA.AsDateTime;
     ParamByName('DATA').AsDate:= MonthCalendar1.Date;
     Open;
   end;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Jul 19, 2017 5:14 pm    Assunto: Responder com Citação

Ahh, claro...

Tinha parâmetros somente na parte do count.

Só faltaria uma coisa... colorir o grid dos horarios, para mostrar ao usuario se tem vaga disponivel, sem que ele tenha que abrir horario por horario para checar.

O limitador seria 3 pacientes por horario. Então se o recordcount for > 2
fonte em vermelho, senão fonte em verde.

Código:
  if frmdm.qrAgenda.RecordCount > 2 then
     GridHorarios.Canvas.Font.Color:= clRed
  else
     GridHorarios.Canvas.Font.Color:= clGreen;

  if gdSelected in State then
     GridHorarios.Canvas.Font.Color:= clWhite;
     GridHorarios.DefaultDrawColumnCell(Rect, DataCol, Column, State);


o codigo acima funcionaria no dbgrid 2, mas não no gridhorarios.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qua Jul 19, 2017 5:35 pm    Assunto: Responder com Citação

Como está o SQL do grid de horários?

Sugiro criar um campo neste SQL para contagem de registros por horário para fazer esta comparação.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Jul 19, 2017 7:46 pm    Assunto: Responder com Citação

O grid de horarios é preenchido no evento de click do calendar, com essa rotina que você me passou.

Código:
var
  x: Integer;
  HoraIni: TTime;
begin
  // Abre e fecha o componente de memoria
  cdsHorarios.Close;
  cdsHorarios.IsEmpty;
  cdsHorarios.CreateDataSet;
  cdsHorarios.Open;

  // Procedimento de inicio de hora
  HoraIni := StrToTime('07:15');

  // For para ir das 08:00 as 11:45 e 13:30 as 20:15
  for x := 1 to 16 do
  begin
    HoraIni := IncMinute(HoraIni, 45);

    cdsHorarios.Append;
    cdsHorarios.FieldByName('HORA').AsDateTime := HoraIni;
    cdsHorarios.Post;

    if HoraIni = StrToTime('11:45') then
      HoraIni := IncMinute(HoraIni, 60);
  end;

  cdsHorarios.First;
end;


Eu tentei rodar a SQL que faz a busca de pacientes por horario junto com essa que carrega os horarios, mas não estou achando um meio de vincular o resultado do count com o horario.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Jul 20, 2017 10:27 am    Assunto: Responder com Citação

Normalmente, para colorir o grid, se faz a comparação com um campo do próprio Dataset do grid e no seu caso não tem esse campo.

Sugiro você tentar o seguinte:

- Crie um novo campo no cdsHorarios chamado Qtde.
- Crie uma nova Query chamada Query1 para fazer uma consulta da Qtde de cada horário.

O seu código que preenche o Grid de horários ficaria assim:

Código:
var
  X: Integer;
  HoraIni: TTime;
begin
  // Abre e fecha o componente de memoria
  cdsHorarios.Close;
  cdsHorarios.IsEmpty;
  cdsHorarios.CreateDataSet;
  cdsHorarios.Open;

  // Procedimento de inicio de hora
  HoraIni := StrToTime('07:15');

  // For para ir das 08:00 as 11:45 e 13:30 as 20:15
  for X := 1 to 16 do
  begin
    HoraIni := IncMinute(HoraIni, 45);

    with frmdm.Query1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO FROM AGENDA A');
      SQL.Add('WHERE A.HORA = :HORA AND A.DATA = :DATA'); // Criei parametros
      ParamByName('HORA').AsTime := HoraIni;
      ParamByName('DATA').AsDate := MonthCalendar1.Date;
      Open;
    end;

    cdsHorarios.Append;
    cdsHorarios.FieldByName('HORA').AsDateTime := HoraIni;
    cdsHorarios.FieldByName('QTDE').AsInteger := frmdm.Query1.RecordCount; // Criei este campo para pintar o grid
    cdsHorarios.Post;

    if HoraIni = StrToTime('11:45') then
      HoraIni := IncMinute(HoraIni, 60);
  end;

  cdsHorarios.First;
end;


E no seu código para pintar o grid faria a comparação com este novo campo criado no evento OnDrawColumnCell:

Código:
if cdsHorarios.FieldByName('QTDE').AsInteger > 2 then
     GridHorarios.Canvas.Font.Color:= clRed
  else
     GridHorarios.Canvas.Font.Color:= clGreen;

  if gdSelected in State then
     GridHorarios.Canvas.Font.Color:= clWhite;
GridHorarios.DefaultDrawColumnCell(Rect, DataCol, Column, State);

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Jul 20, 2017 11:20 am    Assunto: Responder com Citação

Bom dia natanbh1

Concordo plenamente. Normalmente se colore o grid que está ligado direto ao dataset, mas nesse caso acho que não nos resta muitas opções. hehehe

Adicionei a nova query e o campo, mas o contador não está funcionando. Veja na imagem que tenho 2 pacientes as 09:30 e o contador traz apenas 1




Outro detalhe curioso é que nesse dbgrid do delphi 10.2 a cor fica toda desconfigurada, você já viu isso?

Código:
procedure TFrmAgenda.CarregaHorarios(f_Data: TDate);
var
  X: Integer;
  HoraIni: TTime;
begin
  // Abre e fecha o componente de memoria
  cdsHorarios.Close;
  cdsHorarios.IsEmpty;
  cdsHorarios.CreateDataSet;
  cdsHorarios.Open;

  // Procedimento de inicio de hora
  HoraIni := StrToTime('07:15');

  // For para ir das 08:00 as 11:45 e 13:30 as 20:15
  for X := 1 to 16 do
  begin
    HoraIni := IncMinute(HoraIni, 45);

    with qrCont do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT DATA, HORA, COD_PACIENTE, COD_PROCEDIMENTO FROM AGENDA A');
      SQL.Add('WHERE A.HORA = :HORA AND A.DATA = :DATA'); // Criei parametros
      ParamByName('HORA').AsTime := HoraIni;
      ParamByName('DATA').AsDate := MonthCalendar1.Date;
      Open;
    end;

    cdsHorarios.Append;
    cdsHorarios.FieldByName('HORA').AsDateTime := HoraIni;
    cdsHorarios.FieldByName('QTDE').AsInteger := qrCont.RecordCount; // Criei este campo para pintar o grid
    cdsHorarios.Post;

    if HoraIni = StrToTime('11:45') then
      HoraIni := IncMinute(HoraIni, 60);
  end;

  cdsHorarios.First;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Jul 20, 2017 11:24 am    Assunto: Responder com Citação

Opa. corrigindo.

Faltou apenas um FetchAll após o open.
Ficou otimo.

Sobre a cor do grid, notei que indo na propriedade DrawningStyle que está como gdsThemed e mudando para gdsClassic resolve, porém o dbgrdid fica com aquela cara de delphi 7
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB