GARANTIR DESCONTO

Fórum DBGrid com campo calculado. #388256

11/10/2010

0

Olá pessoal.

Tenho uma DBGrid que exibe um campo calculado (fkCalculated) da query ligada nele. Esse campo é chamado "sequência" e é incrementado no evento OnCalcFields da query.

Quando visualizo o grid pela primeira vez, e vou descendo até o final, tudo bem. Ele incrementa a sequencia certinho. Mas quando vou visualizar de baixo pra cima, ele continua incrementando.

O SELECT da query possui um distinct, o que dificulta um pouco o direcionamento da solução para a mudança na consulta.

Alguém sabe como posso resolver isso?


Domingos
Domingos Neto

Domingos Neto

Responder

Posts

11/10/2010

Leonardo Xavier

Você poderia postar parter de seu código para que o pessoal possa te ajudar melhor?
Responder

Gostei + 0

11/10/2010

Domingos Neto

Oi Leonardo, segue...

Antes de abrir a query, atribui o valor "um" ao sequencial...
procedure TfFormulario.QueryLocalBeforeOpen(DataSet: TDataSet);
begin
  inherited;
  FSeq := 1;
end;


No evento OnCalcFields, o campo calculado "SEQUENCIA" é incrementado.
procedure Tformulario.QueryLocalCalcFields(DataSet: TDataSet);
begin
  inherited;
                            
  QueryLocalSEQUENCIA.AsInteger := FSeq;
  Inc(FSeq);

end;



Grato.

Domingos
Responder

Gostei + 0

11/10/2010

Leonardo Xavier

Tente fazer assim e posta aqui se deu certo. Abraços

procedure Tformulario.QueryLocalCalcFields(DataSet: TDataSet);
var
a:integer;
begin
  inherited;
a:=QueryLocalSEQUENCIA.campo_id_da_tabela.value;
//if a>0 then begin                            
  QueryLocalSEQUENCIA.AsInteger := FSeq;
  Inc(FSeq);
 a:=(id_da tabela);
end eslse begin
 Fsec:=Fsec-QueryLocalSEQUENCIA.campo_id_da_tabela.value;
end; 



end;


Não testei para ver se funciona.
Responder

Gostei + 0

11/10/2010

Domingos Neto

Leonardo,

QueryLocal é o nome do TQuery. QueryLocalSEQUENCIA já é o campo (fkCalculated). Como vou pegar  o campo id da tabela através do campo calculado SEQUENCIA?
a:=QueryLocalSEQUENCIA.campo_id_da_tabela.value;



Responder

Gostei + 0

11/10/2010

Leonardo Xavier

Na verdade você não irá pegar o id do campo calculado mas sim do registro primario de sua tabela ( do cadastro que esta sendo calculado.
Ex.:
TQuery.id_primaria.value
Responder

Gostei + 0

11/10/2010

Domingos Neto

É um SELECT com 15 tabelas! 

Será que é viável essa alternativa?
Responder

Gostei + 0

11/10/2010

Domingos Neto

Como que eu consigo a posição da linha emque a query está no momento?

Domingos
Responder

Gostei + 0

11/10/2010

Leonardo Xavier

Teremos que criar um vetor dinamico para vc ter o registro atual de sua tabela. Pesno que esta seja a unica maneira de conseguir a posição atual de sua consulta. Neste momento estou pesquizando algo para ajudar vc. assim que eu tiver uma soluçao posto aqui.
Responder

Gostei + 0

11/10/2010

Leonardo Xavier

Variavel A
Dados de sua tabela
Variavel B
1
registro a
2
2
registro b
3
3
registro c
4
4
registro d
5
5
registro e
6
6
registro f
7

É o seguinte, pensando aqui por alguns minutos chegeui a seguinte conclusão:

Se você tiver duas variáveis fica facil você saber isso, declare duas variaveis, ua para ser o contador de registros e outra para funcionar como espécia de uma flag.

Variavel_A:=0;
Variavel_B=1;
 if Variavel_A < Variavel_B then
 begin { A variavel B estara sempre com 1 a mais que a variavel A o que 
podereá ser processado como quando a Variavel A for maior que B (a volta
 nos registros), o script fara o decremento em sua variavel}
.
.//seu código aqui!
.
Variavel_A=Variavel_A+1;//incrementa um na variavel A
Variavel_B=Variavel_B+1;//incrementa um na variavel B

end else begin
.
.//seu código aqui
.

Variavel_A=Variavel_A-1;//decrementa um na varialvel A

Variavel_B=Variavel_B-1;//decerementa um da variavel B
end;


Testa ai e posta aqui. Abraços
Responder

Gostei + 0

11/10/2010

Domingos Neto

Como faria quando chegasse no final e no início da query? Estou pensando aqui, mas de repente se você for mais rápido.

Domingos
Responder

Gostei + 0

11/10/2010

Leonardo Xavier

você implementou este exemplo?
Responder

Gostei + 0

13/10/2010

Domingos Neto

procedure TFormulario.QueryBeforeOpen(DataSet: TDataSet);
begin
  inherited;
  A := 1;
  B := 2;
end;



"CONTADOR" é o campo calculado. Implementei apenas a ida, a volta ainda não consegui...
procedure TFormulario.QueryCalcFields(DataSet: TDataSet);
begin
  if A < b then
  begin
    QueryCONTADOR.AsInteger := A;
    Inc(A);
    Inc(B);
  end
    else
    begin
      Dec(A);
      Dec(B);
      QueryCONTADOR.AsInteger := A;
    end;

  // chegou ao fim do dataset
  if DataSet.RecordCount = (A - 1) then
  begin
    QueryCONTADOR.AsInteger := A;
    temp := A;
    a := b;
    b := temp;
  end;

end;



[]´s

Domingos
Responder

Gostei + 0

13/10/2010

Leonardo Xavier

Vamos tentar de outra forma, pois esta ja esta dando muita dor de cabeça, é o seguinte no evento onmousemove de seu DBGrid você irá colocar o seguinte código:

var Coord:TGridCoord;
begin
Coord:=DBGrid3.MouseCoord(X,Y);
Label41.Caption:=IntToStr(Coord.Y);
end;
 


Deixe o código la no oncalcfields. Apenas acrescente este.
Responder

Gostei + 0

13/10/2010

Leonardo Xavier


Encontrei a soluçao para você: De uma olhada ve se serve pois eu nao estava testando os exemplos que postei aqui para você. Me desculpe por isso, mas agora criei um sisteminha aqui para implementar o exemplo bom foi mais simples do que pensei. no evendo "KeyDow" de seu DBgrid coloque o seguinte:

procedure Tcadcelesc.DBGrid_X_KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
LabelX.Caption:=IntToStr(Sua_query.RecNo);
//pegar diretamente o componente Query que você esta utilizando
//colocar o nome dele no local indicado como sua_query


end;

Responder

Gostei + 0

13/10/2010

Leonardo Xavier

Deu certo?
Responder

Gostei + 0

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

Aceitar