Criar Paramentors em tempo de execução ou modificar Sql ....

Delphi

21/07/2005

eu sinceramente não sei se esta é a melhor estratégia.. Mas dei uma pesquisada e não encontrei Nada a respeito.

O problema é o seguinte...gostaria de apresentar o resultado de uma pesquisa de acordo com as datas selecionadas pelo usuário em um grid

No form tenho um grid com a propriedade DgMultiSelectd em True , onde o usuário escolhera os registros que interressa a ele..Cada Registro tem um Campo Data com Valores Distintos , Pois bem , apos selecionados esses Registros no Grid , Gostaria de efetuar Uma pesquisa em uma [size=18:00cfb3ed6f]Outra Tabela [/size:00cfb3ed6f]que retorna todos os Registros que tem a Mesma Data que fora selecionado previamente pelo usuário

[b:00cfb3ed6f]quero destacar que aqui se tem duas coisas distintas.... Varrer as datas Selecionadas pelo usuário no Grid... Esta etápa eu sei fazer [/b:00cfb3ed6f]

Vamos supor que foram cinco as Datas onde chamarei de Data0,Data1,Data2,Data3,Data4

A Outra coisa e Usar Estas Datas Como Restriçoes na Tabela a ser Consultada
Seria mais ou menos isto:

query1.Params[0].Value:=Data0;
query1.Params[1].Value:=Data1;
query1.Params[2].Value:=Data2;
query1.Params[3].Value:=Data3;
query1.Params[4].Value:=Data4;

Onde esses params Deveria ser Criados Em Tum Time Pois eu não sei quanto são os Registros previamente Selecionados pelo usuário... Tanto pode ser cinco , como pode ser um , dois , etc....

De Posse desse Parametros ai sim eu faria uma pesquisa

query1.close;
query1.sql.clear;
query1.sql.add(´select *From Nome Da Tabela´);
query1.sql.add(´where Data=:Params[0]´);
query1.sql.add(´and Data=:Params[1]´);
query1.sql.add(´and Data=:Params[2]´);
query1.sql.add(´and Data=:Params[3]´);
query1.sql.add(´and Data=:Params[4]´);
query1.prepare;
query1.open;

Enfim ,eu não sei se esta é uma melhor estratégia, outras poderão serem adicionadas para que surja alguma idéia... Talvez a melhor idéia nen seje a criação de parametros em RumTime , mas a modificação da Intrução sql em Rum Time...

[b:00cfb3ed6f]Mais uma vez deixo claro que o problema de determinar A Quantidade de Datas e os seus valores não representa problemas no atual estágio[/b:00cfb3ed6f]

Meu porblema é escrevar esta consulta , que poderia chamar assim : De Uma consulta Dinamica :lol: :lol: :lol:

Obrigado....


Marco Salles

Marco Salles

Curtidas 0

Respostas

Kapak

Kapak

21/07/2005

var i:Integer; rDt:array of TDate;
begin
// alimente rDt
  if High(rDt) < 0 then
    Exit;
  query1.sql.clear;
  query1.sql.add(´select * From Nome Da Tabela Where Data = :P0´);
  for i := 1 to High(rDt) do
    query1.sql.add(´ or Data = :P´ + IntToStr(i));
  for i := 0 to High(rDt) do
    query1.ParamByName(´P´+IntToStr(i)).AsDatetime := rDt[i];
  query1.Open;
end;



GOSTEI 0
Marco Salles

Marco Salles

21/07/2005

Amigo kapak , fiquei feliz que alguem tenha entendido a minha dúvida.
De fato ja Tinha resolvido o problema parcialmente , e a solução encontrada foi muito parecida com a sua sugestão..

bookMark:=Form1.QHorExt.Bookmark;
bookMarkList:=Form1.DBGrid3.SelectedRows;

Query1.close;
query1.sql.Clear;
query1.sql.add(´select *From TabEntradaSaida´);
query1.sql.add(´where Codigo_Funcionario=:CodigoFun and (´);
query1.ParamByName(´CodigoFun´).AsString:=Codigo;
i:=0;
query1.sql.add(´(Data=:´+inttoStr(i)+´)´);
Query1.ParamByName(inttostr(i)).AsDateTime:=Form1.QHorExt.FieldByName(´Data´).AsDateTime;
for i:=1 to BookMarkList.Count - 1 do
  begin
    Form1.QHorExt.bookMark:=BookMarkList[i];
    query1.sql.add(´or (Data=:´+inttoStr(i)+´)´);
    Query1.ParamByName(inttostr(i)).AsDateTime:=Form1.QHorExt.FieldByName(´Data´).AsDateTime;
(i))).AsDateTime:=Form1.QHorExt.FieldByName(´Data´).AsDateTime;
  end;
query1.sql.add(´)´);

query1.Prepare;
Query1.open;

Form1.QHorExt.Bookmark:=bookMark;


Agora to mais um pouquinho encrencado, Porque alem da Data , para complicar tenho que Pesquisar também para códigos...Esto é , quero como resultado da pesquisa , os registros que tenham o mesmo Codigo , selecionado do Grid e que tenha a mesma data :cry: :cry: :cry:

No caso acima , ta funcionando para registros selecionados na Grid com o mesmo Codigo.... Mas to precisando fazer uma consulta , onde o usuário irá salpicar a gosto , em vários registros da Grig , e a partir dos dados dos Regsitros Selecionados (Codigo_Funcionário e Data) Tenho que fazer uma esta consulta na tabela EntradaSaida :cry: :cry: :cry:

Mais alguma sugestão :oops: :oops: :oops: :oops:

Como eu disse anteriormente esses Registros são retornados pela Varivel
BookMarkList
bookMarkList:=Form1.DBGrid3.SelectedRows;
.....................
for i:=1 to BookMarkList.Count - 1 do
  begin
    Form1.QHorExt.bookMark:=BookMarkList[i];
...................


Obrigado :P :P :P :P


GOSTEI 0
Kapak

Kapak

21/07/2005

Colega, neste caso eu montaria um grupo de Where sempre c/ código e data:
Where ((Cod = :Cn) and (Data = :Dn))
   or ((Cod = :Cn) and (Data = :Dn))
   or ((Cod = :Cn) and (Data = :Dn))
   ... variando n



GOSTEI 0
Marco Salles

Marco Salles

21/07/2005

Acho que é mais ou menos isto aqui ... Não sei se tem Outras maneiras:::

bookMark:=Form1.QHorExt.Bookmark;
bookMarkList:=Form1.DBGrid3.SelectedRows;

Query1.close;
query1.sql.Clear;
query1.sql.add(´select *From TabEntradaSaida´);
query1.Sql.Add(´Where ´);
for i:=0 to BookMarkList.Count - 1 do
  begin
    if i > 0 Then
      query1.SQL.Add(´or (´);
    Form1.QHorExt.bookMark:=BookMarkList[i];
    query1.sql.add(´codigo_funcionario=:C´+inttoStr(i));
    query1.ParamByName(´C´+inttostr(i)).AsString:=
                       Form1.QHorExt.fieldByName(´Codigo_Funcionario´).AsString;
    query1.Sql.Add(´and Data=:D´+inttostr(i));
    Query1.ParamByName(´D´+inttostr(i)).AsDateTime:=
                      Form1.QHorExt.FieldByName(´Data´).AsDateTime;
    if i > 0 Then
      query1.SQL.Add(´)´);
end;
query1.Prepare;
Query1.open;
Form1.QHorExt.Bookmark:=bookMark;



GOSTEI 0
POSTAR