Fórum Varias consultas no mesmo campo ao mesmo tempo #460964
13/11/2013
0
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
Curtir tópico
+ 0Posts
13/11/2013
Gustavo Bretas
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?
Gostei + 0
13/11/2013
Marcio Valadao
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
Gostei + 0
13/11/2013
Marcio Valadao
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
Gostei + 0
13/11/2013
Gustavo Bretas
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!
Gostei + 0
13/11/2013
Marcio Valadao
[RESOLVIDO]
Gostei + 0
13/11/2013
Marcio Valadao
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?
Gostei + 0
13/11/2013
Gustavo Bretas
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;Gostei + 0
13/11/2013
Marcio Valadao
minha cabeça ferveu cara de tanto pensar no que fazer com essa consulta...rsrsrsr
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)