Duvidas com campos agregados no CDS?
Pessoal é possivel colocar um distinct num campo de expressão agregate do CDS (ClientDataSet)?
Numa tabela normal poderia fazer assim
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
Mais assim
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
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
Curtidas 0
Respostas
Builder
03/01/2009
Veja se funciona assim:
select count(*) from (select distinct(SOMA) from SOMAS)
select count(*) from (select distinct(SOMA) from SOMAS)
GOSTEI 0
Adriano_servitec
03/01/2009
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.
GOSTEI 0
Builder
03/01/2009
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).
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).
GOSTEI 0
Adriano_servitec
03/01/2009
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.GOSTEI 0
Builder
03/01/2009
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.
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.
GOSTEI 0
Adriano_servitec
03/01/2009
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
GOSTEI 0
Builder
03/01/2009
É 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.
- 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.
GOSTEI 0
Adriano_servitec
03/01/2009
É 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
GOSTEI 0
Adriano_servitec
03/01/2009
[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.
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.
GOSTEI 0
Builder
03/01/2009
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.
GOSTEI 0
Adriano_servitec
03/01/2009
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.GOSTEI 0