Fórum Duvidas com campos agregados no CDS? #367489

03/01/2009

0

Pessoal é possivel colocar um distinct num campo de expressão agregate do CDS (ClientDataSet)?

Numa tabela normal poderia fazer assim
select count(distinct(soma)) from somas


Numa tabela temporaria com um campo agregate não achei um modo de fazer igual

posso usar até assim na expressão da propriedade do campo agregate
count(soma)


Mais assim
count(distinct(soma)) 

Não funciona.

E relamente preciso usar um distinct para contar nesta [b:905bb820be]tab temp[/b:905bb820be] ai

A tabela temp esta assim
[b:905bb820be]52
52
52
01
01
02
03[/b:905bb820be]

Se eu usar um count me retorna = 7

e com o distict que seria como preciso me retornaria = 4


Adriano_servitec

Adriano_servitec

Responder

Posts

03/01/2009

Builder

Veja se funciona assim:

select count(*) from (select distinct(SOMA) from SOMAS)


Responder

Gostei + 0

03/01/2009

Adriano_servitec

Veja se funciona assim: select count(*) from (select distinct(SOMA) from SOMAS)
Olá amigo, mais preciso fazer isso dentro do campo agregate de uma tabela Temporaria, esta tabela não tem nome Criei ela dentro do clientdataset, não é uma tabela de um banco de dados fisico, e assim não funcionou.

Obrigado pela ajuda amigo.


Responder

Gostei + 0

03/01/2009

Builder

Quais as possibilidades de você mudar a lógica da montagem da tabela temporária ???

Ao invés de montar e calcular/contar, já larga a tabela com tudo ok de uma tacada só (solução alternativa/possibilidade, pois alguns problemas podem ser resolvidos de várias formas).


Responder

Gostei + 0

03/01/2009

Adriano_servitec

Quais as possibilidades de você mudar a lógica da montagem da tabela temporária ??? Ao invés de montar e calcular/contar, já larga a tabela com tudo ok de uma tacada só (solução alternativa/possibilidade, pois alguns problemas podem ser resolvidos de várias formas).
É que eu preciso ir mostrando os resultados a cada post que dou na tabela temp. Isso antes de enviar para uma tabela fisica.


Responder

Gostei + 0

03/01/2009

Builder

Humm...

A cada inclusão/alteração, chama uma rotina que calcula e grava/regrava o campo, seja utilizando uma ação do usuário ou os eventos do cds.


Responder

Gostei + 0

03/01/2009

Adriano_servitec

Humm... A cada inclusão/alteração, chama uma rotina que calcula e grava/regrava o campo, seja utilizando uma ação do usuário ou os eventos do cds.
Isso mesmo, ai queria mostrar esta contagem antes de gravar pois é um controle que precisa ser feito antes de gravar no banco.

É pq tenho que controlar estas funções aqui
var
  Form3: TForm3;
  FirstWeekDay : Integer = 2;
  FirstWeekDate : Integer = 4;
  week,year:Word;

implementation

{$R *.dfm}
function WeekToDate(AWeek,AYear:Integer):TDateTime;
begin
  Result:=EncodeDate(AYear,1,FirstWeekDate);
  Result:=Result+(AWeek-1)*7-((DayOfWeek(Result)+(7-FirstWeekDay)) mod 7);
end;

procedure DateToWeek(ADate:TDateTime; var AWeek,AYear:Word);
var
  Month,Day : Word;
begin
  ADate:=ADate-((DayOfWeek(ADate)-FirstWeekDay+7) mod 7)+ 7-FirstWeekDate;
  DecodeDate(ADate,AYear,Month,Day);
  AWeek:=(Trunc(ADate-EncodeDate(AYear,1,1)) div 7)+1;
end;


procedure TForm3.Button1Click(Sender: TObject);
begin
  DateToWeek(now,week,year); {Aqui colocar o dia do calendario em vez do now}
  ShowMessage(´Semana:  ´+inttostr(week));
  ShowMessage(inttostr(year));
end;


Posso fazer isso numa tabela, mais como não vou utilizar depois vou ter que deletar toda hora, e pelo CDS temporario ficaria melhor, mais não achei uma forma de somar isso.

Grato pela ajuda amigo


Responder

Gostei + 0

03/01/2009

Builder

É um quebra-cabeça, mas vamos tentar montar ele. Criou a estrutura da tabela in memory ??

- TClientDataSet->Fields Editor->New Field e definiu todos os campos
- Após definir os campos, gerou a estrutura a tabela em memória (tempo de projeto) com a Ação Create DataSet sobre o TClientDataSet.

Se foi assim, a tabela esta in memory, com todos os campos definidos, e a medida que adiciona registros, poderia lançar mão da definição de alguns campos como ´Field Type Calculated´ e do evento OnCalcFields.


Responder

Gostei + 0

03/01/2009

Adriano_servitec

É um quebra-cabeça, mas vamos tentar montar ele. Criou a estrutura da tabela in memory ?? - TClientDataSet->Fields Editor->New Field e definiu todos os campos - Após definir os campos, gerou a estrutura a tabela em memória (tempo de projeto) com a Ação Create DataSet sobre o TClientDataSet. Se foi assim, a tabela esta in memory, com todos os campos definidos, e a medida que adiciona registros, poderia lançar mão da definição de alguns campos como ´Field Type Calculated´ e do evento OnCalcFields.
Exatamente assim como vc falou, só que criei um campo tipo Tdate outro tipo Integer e outro Agregate (Para somar)

A tabela memoria fica gravado assim...

26/11/2008----48
27/11/2008----48
01/12/2008----50
10/12/2008----52

Então neste caso qualquer que seja o campo tem que me trazer num Text o resultado do count sem duplicidade do campo Inteiro

48
48
50
52
Result-----> 03


Responder

Gostei + 0

04/01/2009

Adriano_servitec

[color=green:ad696e8f5d]{Ainda com porblemas}[/color:ad696e8f5d]
No TFields co campo Total na propriedade Expression estou tentando colocar a seguinte expressão:
count(distinct(soma))

Ativo certinho o campo agregate como faço normalmente com qualquer campo agregate, e na hora de ativar a Tabela Virtual o erro é este:
ClientDataSet Field ´distinct´ not found. Ou seja no que parece ele não reconheçe a função distinct como um comando e sim como um campo, e na mensagem ainda que ele ´distinct´ não foi criado ou localizado.

Como disse antes, seria tudo mais facil se viesse os valores de uma tabela fisica criada no banco, mais esta esta em memoria, não vai pro banco de dados, e eu preciso do resultado deste count sem que seja gravado no banco de dados.

Se tiver como somar isso eliminando os repetidos em memoria, não precisa ser exatamente um distinct, qualquer comando que possa mostrar o resultado corretamente esta valendo.


Responder

Gostei + 0

05/01/2009

Builder

Faz um teste usando o campo como ´Field Type Calculated´ e no evento OnCalcFields escreve a forma do cálculo. Se for o caso usa um objeto array para montar a lista no cálculo.


Responder

Gostei + 0

05/01/2009

Adriano_servitec

Faz um teste usando o campo como ´Field Type Calculated´ e no evento OnCalcFields escreve a forma do cálculo. Se for o caso usa um objeto array para montar a lista no cálculo.
Amigo, pelo que percebi campos agregates não fazem distinct mesmo, resolvi usar tabela fixa mesmo. Obrigado pela ajuda. Valeu.


Responder

Gostei + 0

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

Aceitar