Fórum DBGrid com campo calculado. #388256
11/10/2010
0
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
Curtir tópico
+ 0Posts
11/10/2010
Leonardo Xavier
Gostei + 0
11/10/2010
Domingos Neto
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
Gostei + 0
11/10/2010
Leonardo Xavier
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.
Gostei + 0
11/10/2010
Domingos Neto
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;
Gostei + 0
11/10/2010
Leonardo Xavier
Ex.:
TQuery.id_primaria.value
Gostei + 0
11/10/2010
Domingos Neto
Será que é viável essa alternativa?
Gostei + 0
11/10/2010
Domingos Neto
Domingos
Gostei + 0
11/10/2010
Leonardo Xavier
Gostei + 0
11/10/2010
Leonardo Xavier
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
Gostei + 0
11/10/2010
Domingos Neto
Domingos
Gostei + 0
11/10/2010
Leonardo Xavier
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
Gostei + 0
13/10/2010
Leonardo Xavier
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.
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;
Gostei + 0
13/10/2010
Leonardo Xavier
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)