Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qua Jul 19, 2017 4:18 pm Assunto: [resolvido] Select + select count |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Jul 19, 2017 4:34 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qua Jul 19, 2017 4:40 pm Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qua Jul 19, 2017 4:45 pm Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qua Jul 19, 2017 4:52 pm Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Jul 19, 2017 4:56 pm Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qua Jul 19, 2017 5:02 pm Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Jul 19, 2017 5:06 pm Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qua Jul 19, 2017 5:14 pm Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Jul 19, 2017 5:35 pm Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qua Jul 19, 2017 7:46 pm Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Jul 20, 2017 10:27 am Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Jul 20, 2017 11:20 am Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Jul 20, 2017 11:24 am Assunto: |
|
|
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 |
|
 |
|