Fórum Varias consultas no mesmo campo ao mesmo tempo #460964

13/11/2013

0

Bom dia amigos,
estou com o seguinte problema, estou gerando um relatório com report builder,
e para isso estou fazendo a seguinte consulta:
ClientDataSet1.Filter := 'REG = ' + QuotedStr(memo1.Lines.Strings[0]);
faço a consulta a partir da primeira linha de um mesmo, estou usando memo por que preciso de vários REGISTROS ao mesmo tempo, como por exemplo se eu tivesse várias cláusulas "or" no sql, tipo:
"select * from 'tabela' where REG = variavel1 or REG = variavel2 or REG = variavel3 ...." e assim por diante quantos o usuários quizer.
Mas ao inves do sql estou usando o filter do clientdataset.... Alguem ja passou por algo parecido?

Tudo de bom a todos ae....
Marcio Valadao

Marcio Valadao

Responder

Posts

13/11/2013

Gustavo Bretas

Bom dia Marcio,

Passar por isso acho que todos passamos, eu particularmente prefiro tratar no SQL, mas já houve casos que precisei usar o Filter do DataSet!

Mas o que eu não entendi foi qual o problema, que vc menciona no inicio do post?
Responder

Gostei + 0

13/11/2013

Marcio Valadao

vlw Bretas pela resposta,
então o problema é como vou fazer isso dinamicamente,
preciso de uma Consulta de vários dados em um unico campo,
um exemplo, o cliente digita em um listbox o registro ai consulta depois digita uma virgula e outro registro e assim por diante e vai consultando , entendeu?
exemplo: 123456,1234567,111,222,333 até quantos o usuario quizer ...
como eu poderia fazer isso?
vlw
Responder

Gostei + 0

13/11/2013

Marcio Valadao

consegui resolver aqui.... coloquei a clausula in do SQL, foi mais facilo meu mesmo.... tava pensando em tanta coisa completa e uma clusula acabou com meu problema.... Vlw mesmo...
o código ficou assim:

SQLDataSet1.Close;
ClientDataSet1.Close;
SQLDataSet1.CommandText := 'select REG, NOME_ACP, NOME_MED, PRONT, DATA_HORA_INCLUSAO from RECADATE WHERE REG in ('+edtConsulta.TEXT+')';
ClientDataSet1.Open;

ai digito em um edit que coloquei no form:
numeroDoRegistroDesejado,numeroDoRegistroDesejado,numeroDoRegistroDesejado,numeroDoRegistroDesejado
Responder

Gostei + 0

13/11/2013

Gustavo Bretas

Entendi! Você pode fazer o seguinte:

Declare no uses do formulário onde vc colocar a função, a unit StrUtils.

function TForm1.ListItemToStringComVirgula(AList: TStrings): String;
var
  i: Integer;
begin
  Result := EmptyStr;
  for i := 0 to Alist.Count - 1 do
  begin
    Result := Result + AList.Strings[i] + IfThen(i < Alist.Count - 1, ',');
  end;
  if Result <> EmptyStr then
    Result := '(' + Result + ')';
end;


Depois só chamar a função e colocar no filter!

  if ListBox1.Items.Count > 0 then
    ClientDataSet1.Filter := 'REG in ' + ListItemToStringComVirgula(ListBox1.Items);


Espero ter ajudado!
Responder

Gostei + 0

13/11/2013

Marcio Valadao

CERTISSIMO, OBRIGADÃO BRETAS
[RESOLVIDO]
Responder

Gostei + 0

13/11/2013

Marcio Valadao

Pessoal estou reabrindo meu post pelo seguinte...
Fiz a consulta com a clausula IN do sql e deu certinho o que eu precisava...

mas os dados no dbgrid sempre sai de ordem crescente, como eu faria para orem sair conforme minha consulta... exemplo:
100,1,5 e assim por diante conforme eu for consultando... tentei o seguinte mais nao deu certo...

SQLDataSet1.Close;
ClientDataSet1.Close;
SQLDataSet1.CommandText := 'select * from recadate where reg in ('+edtConsulta.TEXT+') order by '+?????+' ';
ClientDataSet1.Open;

teria como aparecer no dbgrid os registros na ordem de pesquisa?
Responder

Gostei + 0

13/11/2013

Gustavo Bretas

Cara, tenso sua consulta heim! rsrs

Do banco eu não sei te dizer, acredito que não!

Mas nem tudo esta perdido... rsrs! Crie um Field no seu ClientDataSet, InternalCalc, de o nome de ORDEM, tipo Integer, Copie o nome para a Propriedade IndexFieldNames.

Vc continua usando o TListBox? Ele vai te ajudar! hehe

Depois de abir o ClientDataSet, coloca esse código:
  try
    ClientDataSet1.DisableControls;
    ClientDataSet1.IndexFieldNames := EmptyStr;
    ClientDataSet1.First;
    while not ClientDataSet1.Eof do
    begin
      ClientDataSet1.Edit;
      ClientDataSet1ORDEM.AsInteger := ListBox1.Items.IndexOf(ClientDataSet1REG.AsString);
      ClientDataSet1.Post;
      ClientDataSet1.Next;
    end;
  finally
    ClientDataSet1.IndexFieldNames := 'ORDEM';
    ClientDataSet1.EnableControls;
  end;
Responder

Gostei + 0

13/11/2013

Marcio Valadao

Bretas vlw cara pela resposta, amanha irei fazer no serviço e posto aqui novamente blza amigo.
minha cabeça ferveu cara de tanto pensar no que fazer com essa consulta...rsrsrsr
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar