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] Master/Detail
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: Sex Ago 11, 2017 4:10 pm    Assunto: [resolvido] Master/Detail Responder com Citação

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
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: Sex Ago 11, 2017 5:17 pm    Assunto: Responder com Citação

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
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: Sex Ago 11, 2017 5:20 pm    Assunto: Responder com Citação

Boa tarde.

Enquanto você escrevia alterei a explicação acima.
Consigo add o cod_paciente neste filtro?
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: Sex Ago 11, 2017 5:27 pm    Assunto: Responder com Citação

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
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: Seg Ago 14, 2017 8:54 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Ago 14, 2017 9:41 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


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

MensagemEnviada: Seg Ago 14, 2017 10:02 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Ago 14, 2017 10:31 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


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

MensagemEnviada: Seg Ago 14, 2017 10:32 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Ago 14, 2017 10:37 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


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

MensagemEnviada: Seg Ago 14, 2017 11:03 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Ago 14, 2017 2:30 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


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

MensagemEnviada: Ter Ago 15, 2017 8:49 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Ter Ago 15, 2017 9:24 am    Assunto: Responder com Citação

Qual o erro que está aparecendo?

Onde você colocou a atribuição da variável fSQL?
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: Ter Ago 15, 2017 9:52 am    Assunto: Responder com Citação

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
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