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


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Sex Ago 11, 2017 4:10 pm Assunto: [resolvido] Master/Detail |
|
|
Amigos, esse assunto é velho, mas sempre bate uma duvida.
Tenho um formulário onde faço um mestre detalhe por data. Usei esse codigo fixo na query do datamodule, pois trago o nome do paciente de outra tabela
| Código: | SELECT A.CODIGO, A.COD_PACIENTE, A.DATA, A.HORA, A.STATUS, A.COD_CONVENIO, P.NOME AS PACIENTE
FROM AGENDA A INNER JOIN PACIENTES P
ON A.COD_PACIENTE = P.CODIGO
WHERE A.DATA = :DT
|
Agora preciso fazer a mesma consulta, com um filtro um pouco maior. Vou por essa consulta no cadastro do paciente, então o where precisa ser entre duas datas e considerar o paciente que selecionei.
Como vocês fariam nesses casos?
Editado pela última vez por renanbg em Qua Ago 16, 2017 10:18 am, num total de 2 vezes |
|
| Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Sex Ago 11, 2017 5:17 pm Assunto: |
|
|
Teste seu código de filtro assim:
| Código: | if not frmdm.cdsAgenda.Active then
frmdm.cdsAgenda.open;
frmdm.cdsAgenda.Filter := 'DATA >= ' + QuotedStr(DateToStr(dtpInicio.Date)) + ' and DATA <= ' +
QuotedStr(DateToStr(dtpFim.Date));
frmdm.cdsAgenda.Filtered := True; |
_________________ ''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: Sex Ago 11, 2017 5:20 pm Assunto: |
|
|
Boa tarde.
Enquanto você escrevia alterei a explicação acima.
Consigo add o cod_paciente neste filtro? |
|
| Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Sex Ago 11, 2017 5:27 pm Assunto: |
|
|
Creio que sim, adapte o código abaixo:
| Código: | if not frmdm.cdsAgenda.Active then
frmdm.cdsAgenda.open;
frmdm.cdsAgenda.Filter := '(DATA >= ' + QuotedStr(DateToStr(dtpInicio.Date)) + ' and DATA <= ' +
QuotedStr(DateToStr(dtpFim.Date)) + ') and (COD_PACIENTE = ' + QuotedStr(Query1.FieldByName('Cod_Paciente').AsString)+ ')';
frmdm.cdsAgenda.Filtered := True; |
Substitua no código este trecho Query1.FieldByName('Cod_Paciente').AsString pelos nome da sua query correta. _________________ ''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: Seg Ago 14, 2017 8:54 am Assunto: |
|
|
Hum, não buscou.
Acredito que antes eu tenha que fazer o select na query, mas isso levanta uma questão.
Nessa query adicionei um select fixo, onde trago os dados da agenda mais o nome do paciente.
Se eu fizer um novo select, precisaria limpar esses campos. Isso provavelmente vai limpar o flags do paciente certo?
Nesses casos, como você costuma fazer? |
|
| Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Seg Ago 14, 2017 9:41 am Assunto: |
|
|
O seu código do paciente é integer ou varchar?
tenta assim:
| Código: | | frmdm.cdsAgenda.Filter := Format('(Data >= %s and Data <= %s) and (Cod_Paciente = %d)', [QuotedStr(DateToStr(dtpInicio.Date)), QuotedStr(DateToStr(dtpFim.Date)), Query1.FieldByName('Cod_Paciente').AsInteger]); |
Esse novo select que você quer fazer, seriam os mesmos campos? se sim, caso seu ClientDataSet esteja ligado à query, basta você fechar e abrir a query. |
|
| Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Seg Ago 14, 2017 10:02 am Assunto: |
|
|
opa.
Os dados serão os mesmos sim, porém lá no form de agendamento, eu rodo isso no create, para definir o parametro de busca da data.
| Código: | with frmdm.qragenda do
begin
close;
parambyname('DT').asdate:= Calendario.Date;
open; |
Aqui, imagino que eu deva fazer o mesmo, mas como aqui é um intervalo e lá é apenas um data, não sei como fazer sem mudar a estrutura.
Dando um close/open não funciona, pois tem o parametro where que preciso definir. |
|
| Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Seg Ago 14, 2017 10:31 am Assunto: |
|
|
são duas queries diferentes imagino, nesse caso, uma deve estar com o where em uma data fixa enquanto que a outra deve utilizar um BETWEEN para trazer as datas de um determinado período, ex:
| Código: | SELECT ...
FROM ...
WHERE DT_Agendamento BETWEEN :DTInicial AND :DTFinal |
Na hora de abrir a query fica assim:
| Código: | if Qry.Active then
Qry.Close;
Qry.ParamByName('DTInicial').AsDate := DataInicial;
Qry.ParamByName('DTFinal').AsDate := DataFinal;
Qry.Open; |
|
|
| Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Seg Ago 14, 2017 10:32 am Assunto: |
|
|
Na verdade uso a mesma query, pois tem a configuração do master/detail.
Vou tentar o parametro como você indicou e ver se consigo. |
|
| Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Seg Ago 14, 2017 10:37 am Assunto: |
|
|
se é a mesma query e dependendo da situação você precisa filtrar por uma data em específico ou por um período, existem algumas possibilidades, as que eu consigo pensar de imediato são:
- Criar o where em tempo de execução com um ou dois parâmetros dependendo da situação.
- Utilizar outra query
- Manter sempre os dois parâmetros de data na query, e caso queira filtrar por apenas uma data, passar a mesma data para os dois parâmetros |
|
| Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Seg Ago 14, 2017 11:03 am Assunto: |
|
|
Acho que criar o where em tempo de execução seria melhor, pois já o faço no form de agendamentos, como mostrei acima.
então. o codigo fixo seria esse
| Código: | SELECT A.CODIGO, A.COD_PACIENTE, A.DATA, A.HORA, A.STATUS, A.COD_CONVENIO, P.NOME AS PACIENTE
FROM AGENDA A INNER JOIN PACIENTES P
ON A.COD_PACIENTE = P.CODIGO
WHERE A.DATA = :DT |
Na tela dos agendamentos faço assim:
| Código: | with frmdm.qragenda do
begin
close;
parambyname('DT').asdate:= Calendario.Date;
open; |
Como fazer para incluir um novo parametro sem mudar o select fixo? |
|
| Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Seg Ago 14, 2017 2:30 pm Assunto: |
|
|
Na minha classe de cadastro, como eu altero o where de acordo com o que o usuário preenche, eu faço o seguinte:
- Deixo o select sem o where já na query.
- No OnCreate da tela onde está a query, eu crio uma variável que vai receber esse SQL para consultas futuras
- Sempre antes de abrir a query eu passo pelo método que vai preencher o where
ex:
| Código: | procedure TForm1.Form1Create(Sender: TObject);
begin
fSQL := Qry.SQL.Text; // fSQL é uma variável String;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Qry.Active then
Qry.Close;
Qry.SQL.Text := fSQL;
Qry.SQL.Add('WHERE A.DATA = :DT');
Qry.ParamByName('DT').AsDate := Calendario.Date
Qry.Open;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Qry.Active then
Qry.Close;
Qry.SQL.Text := fSQL;
Qry.SQL.Add('WHERE A.DATA BETWEEN :DTI AND :DTF');
Qry.ParamByName('DTI').AsDate := DataInicio;
Qry.ParamByName('DTF').AsDate := DataFim;
Qry.Open;
end; |
|
|
| Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Ago 15, 2017 8:49 am Assunto: |
|
|
Tentei fazer dessa forma.
Ao acessar o form, ocorre tudo bem.
Quando saio e volto ao form, da erro na sentença where.
Se tiver um tempo e puder dar uma olhada, posso te mandar a unit por e-mail. |
|
| Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Ter Ago 15, 2017 9:24 am Assunto: |
|
|
Qual o erro que está aparecendo?
Onde você colocou a atribuição da variável fSQL? |
|
| Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Ago 15, 2017 9:52 am Assunto: |
|
|
Opa.
erro: Token Unknow: WHERE
Declarei a variavel aqui:
| Código: | var
FrmAgenda: TFrmAgenda;
SQLAgenda: String;
implementation
{$R *.dfm} |
E no create do form
| Código: | | SQLAgenda:= FrmDm.qrAgenda.SQL.Text; |
Aí, na chamada
| Código: | with FrmDm.qrAgenda do
begin
Close;
SQL.Text:= SQLAgenda;
SQL.Add('WHERE A.DATA = :DT');
ParamByName('DT').AsDate := Calendario.Date;
Open;
end; |
|
|
| Voltar ao Topo |
|
 |
|